77class AabbTree:
public SplitHeuristics
81 typedef AabbTree<ObjectType, ObjectTraits, SplitHeuristics> TSelf;
83 typedef ObjectType TObject;
84 typedef ObjectTraits TObjectTraits;
85 typedef SplitHeuristics TSplitHeuristics;
87 typedef typename TObjectTraits::TObjectIterator TObjectIterator;
88 typedef typename TObjectTraits::TObjectReference TObjectReference;
89 typedef typename TObjectTraits::TAabb TAabb;
90 typedef typename TObjectTraits::TRay TRay;
91 typedef typename TObjectTraits::TPoint TPoint;
92 typedef typename TObjectTraits::TVector TVector;
93 typedef typename TObjectTraits::TValue TValue;
94 typedef typename TObjectTraits::TParam TParam;
95 typedef typename TObjectTraits::TReference TReference;
96 typedef typename TObjectTraits::TConstReference TConstReference;
97 typedef typename TObjectTraits::TInfo TInfo;
101 dimension = TObjectTraits::dimension,
102 defaultMaxObjectsPerLeaf = 1,
106 typedef std::vector<TObjectIterator> TObjectIterators;
112 Neighbour(TObjectIterator
object, TValue squaredDistance):
113 object_(
object), squaredDistance_(squaredDistance) {}
114 TObjectIterator object()
const {
return object_; }
115 TValue squaredDistance()
const {
return squaredDistance_; }
116 TObjectIterator operator->()
const {
return object_; }
117 TObjectReference operator*()
const {
return TObjectTraits::object(object_); }
118 bool operator<(
const Neighbour& other)
const {
return squaredDistance_ < other.squaredDistance_; }
120 TObjectIterator object_;
121 TValue squaredDistance_;
124 AabbTree(
const TSplitHeuristics& heuristics = TSplitHeuristics(defaultMaxObjectsPerLeaf, defaultMaxDepth));
125 AabbTree(TObjectIterator first, TObjectIterator last,
const TSplitHeuristics& heuristics = TSplitHeuristics(defaultMaxObjectsPerLeaf, defaultMaxDepth));
126 AabbTree(TSelf&& other)
noexcept;
128 TSelf & operator=(TSelf&& other)
noexcept;
131 void reset(TObjectIterator first, TObjectIterator last);
133 const TAabb aabb()
const;
135 bool contains(
const TPoint& point,
const TInfo* info = 0)
const;
137 template <
typename OutputIterator>
138 OutputIterator
find(
const TPoint& point, OutputIterator result,
const TInfo* info = 0)
const;
139 template <
typename OutputIterator>
140 OutputIterator
find(
const TAabb& box, OutputIterator result,
const TInfo* info = 0)
const;
141 template <
typename OutputIterator>
142 OutputIterator
find(
const TRay& ray, TParam tMin, TParam tMax, OutputIterator result,
const TInfo* info = 0)
const;
144 TObjectIterator intersect(
const TRay& ray, TReference t, TParam tMin = 0,
const TInfo* info = 0)
const;
145 bool intersects(
const TRay& ray, TParam tMin = 0,
146 TParam tMax = std::numeric_limits<TValue>::infinity(),
const TInfo* info = 0)
const;
147 const Neighbour nearestNeighbour(
const TPoint& point,
const TInfo* info = 0)
const;
148 template <
typename RandomIterator>
149 RandomIterator rangeSearch(
const TPoint& center, TParam maxRadius,
size_t maxCount,
150 RandomIterator first,
const TInfo* info = 0)
const;
152 bool isEmpty()
const;
153 const TObjectIterator end()
const;
154 void swap(TSelf& other);
158 typedef unsigned TIndex;
162 TObjectIterator object;
163 Input(
const TAabb& aabb, TObjectIterator
object): aabb(aabb), object(object) {}
165 typedef std::vector<Input> TInputs;
166 typedef typename TInputs::iterator TInputIterator;
171 static constexpr TIndex sentinelInternal = std::numeric_limits<TIndex>::max();
173 explicit Node(
const TAabb& aabb):
175 first_(sentinelInternal)
178 Node(
const TAabb& aabb, TIndex first, TIndex last):
182 LASS_ASSERT(first < sentinelInternal && last < sentinelInternal && last > first);
186 bool isInternal()
const {
return first_ == sentinelInternal; }
187 const TAabb& aabb()
const {
return aabb_; }
188 TIndex right()
const { LASS_ASSERT(isInternal());
return right_; }
189 void setRight(TIndex right) { LASS_ASSERT(isInternal()); right_ = right; }
191 bool isLeaf()
const {
return !isInternal(); }
192 TIndex first()
const { LASS_ASSERT(isLeaf());
return first_; }
193 TIndex last()
const { LASS_ASSERT(isLeaf());
return last_; }
203 typedef std::vector<Node> TNodes;
205 TIndex balance(TInputIterator first, TInputIterator last);
206 TIndex addLeafNode(
const TAabb& aabb, TInputIterator first, TInputIterator last);
207 TIndex addInternalNode(
const TAabb& aabb);
209 bool doContains(TIndex index,
const TPoint& point,
const TInfo* info)
const;
211 template <
typename OutputIterator>
212 OutputIterator doFind(TIndex index,
const TPoint& point, OutputIterator first,
const TInfo* info)
const;
213 template <
typename OutputIterator>
214 OutputIterator doFind(TIndex index,
const TAabb& aabb, OutputIterator first,
const TInfo* info)
const;
215 template <
typename OutputIterator>
216 OutputIterator doFind(TIndex index,
const TRay& ray,
const TVector& invDir, TParam tMin, TParam tMax, OutputIterator first,
const TInfo* info)
const;
218 TObjectIterator doIntersect(TIndex index,
const TRay& ray,
const TVector& invDir, TReference t, TParam tMin,
const TInfo* info)
const;
219 bool doIntersects(TIndex iIndex,
const TRay& ray,
const TVector& invDir, TParam tMin, TParam tMax,
const TInfo* info)
const;
220 void doNearestNeighbour(TIndex index,
const TPoint& point,
const TInfo* info, Neighbour& best)
const;
221 template <
typename RandomIterator>
222 RandomIterator doRangeSearch(TIndex index,
const TPoint& point, TReference squaredRadius,
223 size_t maxCount, RandomIterator first, RandomIterator last,
const TInfo* info)
const;
225 void getChildren(TIndex index,
const TPoint& target, TIndex indices[2], TValue squaredDistances[2])
const;
226 bool volumeIntersect(
const TAabb& box,
const TRay& ray,
const TVector& invDir, TReference t, TParam tMin)
const;
227 bool volumeIntersects(
const TAabb& box,
const TRay& ray,
const TVector& invDir, TParam tMin, TParam tMax)
const;
229 TObjectIterators objects_;
231 std::unique_ptr<TObjectIterator> end_;