// Description: Ray-traversal algorithm for KdTree
// Documentation: kdtree.txt
#ifndef PASTELGEOMETRY_KDTREE_RAYTRAVERSAL_H
#define PASTELGEOMETRY_KDTREE_RAYTRAVERSAL_H
#include "pastel/geometry/kdtree/kdtree.h"
#include "pastel/geometry/shape/line.h"
namespace Pastel
{
    //! Intersects objects in a kdtree with a ray.
    /*!
   class Intersector
   {
   public:
       // If 'ray' intersects 'object',
       // fill 't' with the intersection parameter
       // and return true. Otherwise return false.
       bool operator()(
           const Object& object,
           const Line<Real, N>& ray, 
           Real& t) const;
   };
   */
    template <
        typename Real,
        integer N,
        typename ObjectPolicy,
        typename Intersector>
    typename KdTree<Real, N, ObjectPolicy>::ConstObjectIterator
        recursiveRayTraversal(
        const KdTree<Real, N, ObjectPolicy>& tree,
        const Line<Real, N>& ray,
        Intersector intersector);
}
#include "pastel/geometry/kdtree/kdtree_raytraversal.hpp"
#endif