BVH3.h
Go to the documentation of this file.
1 /*************************************************************************
2 > File Name: BVH3.h
3 > Project Name: CubbyFlow
4 > Author: Chan-Ho Chris Ohk
5 > Purpose: Bounding Volume Hierarchy (BVH) in 3D.
6 > Created Time: 2017/10/17
7 > Copyright (c) 2018, Chan-Ho Chris Ohk
8 *************************************************************************/
9 #ifndef CUBBYFLOW_BVH3_H
10 #define CUBBYFLOW_BVH3_H
11 
14 
15 namespace CubbyFlow
16 {
25  template <typename T>
26  class BVH3 final : public IntersectionQueryEngine3<T>, public NearestNeighborQueryEngine3<T>
27  {
28  public:
29  using ContainerType = std::vector<T>;
30  using Iterator = typename ContainerType::iterator;
31  using ConstIterator = typename ContainerType::const_iterator;
32 
34  BVH3();
35 
37  void Build(const std::vector<T>& items,
38  const std::vector<BoundingBox3D>& itemsBounds);
39 
41  void Clear();
42 
46  const Vector3D& pt,
47  const NearestNeighborDistanceFunc3<T>& distanceFunc) const override;
48 
50  bool IsIntersects(const BoundingBox3D& box,
51  const BoxIntersectionTestFunc3<T>& testFunc) const override;
52 
54  bool IsIntersects(const Ray3D& ray,
55  const RayIntersectionTestFunc3<T>& testFunc) const override;
56 
59  const BoundingBox3D& box, const BoxIntersectionTestFunc3<T>& testFunc,
60  const IntersectionVisitorFunc3<T>& visitorFunc) const override;
61 
64  const Ray3D& ray, const RayIntersectionTestFunc3<T>& testFunc,
65  const IntersectionVisitorFunc3<T>& visitorFunc) const override;
66 
69  const Ray3D& ray,
70  const GetRayIntersectionFunc3<T>& testFunc) const override;
71 
73  const BoundingBox3D& GetBoundingBox() const;
74 
76  Iterator begin();
77 
79  Iterator end();
80 
82  ConstIterator begin() const;
83 
85  ConstIterator end() const;
86 
88  size_t GetNumberOfItems() const;
89 
91  const T& GetItem(size_t i) const;
92 
93  private:
94  struct Node
95  {
96  char flags;
97  union
98  {
99  size_t child;
100  size_t item;
101  };
102  BoundingBox3D bound;
103 
104  Node();
105  void InitLeaf(size_t it, const BoundingBox3D& b);
106  void InitInternal(uint8_t axis, size_t c, const BoundingBox3D& b);
107  bool IsLeaf() const;
108  };
109 
110  BoundingBox3D m_bound;
111  ContainerType m_items;
112  std::vector<BoundingBox3D> m_itemBounds;
113  std::vector<Node> m_nodes;
114 
115  size_t Build(size_t nodeIndex, size_t* itemIndices, size_t nItems, size_t currentDepth);
116 
117  size_t QSplit(size_t* itemIndices, size_t numItems, double pivot, uint8_t axis);
118  };
119 }
120 
121 #include <Core/Geometry/BVH3-Impl.h>
122 
123 #endif
3-D vector class.
Definition: Vector3.h:26
Abstract base class for 3-D nearest neighbor query engine.
Definition: NearestNeighborQueryEngine3.h:30
void ForEachIntersectingItem(const BoundingBox3D &box, const BoxIntersectionTestFunc3< T > &testFunc, const IntersectionVisitorFunc3< T > &visitorFunc) const override
Invokes visitorFunc for every intersecting items.
Definition: BVH3-Impl.h:335
Bounding Volume Hierarchy (BVH) in 3D.
Definition: BVH3.h:26
typename ContainerType::iterator Iterator
Definition: BVH3.h:30
size_t GetNumberOfItems() const
Returns the number of items.
Definition: BVH3-Impl.h:589
Iterator begin()
Returns the begin iterator of the item.
Definition: BVH3-Impl.h:565
std::function< bool(const T &, const BoundingBox3D &)> BoxIntersectionTestFunc3
Box-item intersection test function.
Definition: IntersectionQueryEngine3.h:31
ClosestIntersectionQueryResult3< T > GetClosestIntersection(const Ray3D &ray, const GetRayIntersectionFunc3< T > &testFunc) const override
Returns the closest intersection for given ray.
Definition: BVH3-Impl.h:476
BoundingBox3< double > BoundingBox3D
Double-type 3-D BoundingBox.
Definition: BoundingBox3.h:129
std::function< double(const T &, const Ray3D &)> GetRayIntersectionFunc3
Ray-item closest intersection evaluation function.
Definition: IntersectionQueryEngine3.h:39
Definition: pybind11Utils.h:24
3-D axis-aligned bounding box class.
Definition: BoundingBox3.h:44
Closest intersection query result.
Definition: IntersectionQueryEngine3.h:19
Iterator end()
Returns the end iterator of the item.
Definition: BVH3-Impl.h:571
std::vector< ImplicitSurface3Ptr > ContainerType
Definition: BVH3.h:29
bool IsIntersects(const BoundingBox3D &box, const BoxIntersectionTestFunc3< T > &testFunc) const override
Returns true if given box intersects with any of the stored items.
Definition: BVH3-Impl.h:192
void Clear()
Clears all the contents of this instance.
Definition: BVH3-Impl.h:76
const T & GetItem(size_t i) const
Returns the item at i.
Definition: BVH3-Impl.h:595
std::function< void(const T &)> IntersectionVisitorFunc3
Visitor function which is invoked for each intersecting item.
Definition: IntersectionQueryEngine3.h:43
std::function< bool(const T &, const Ray3D &)> RayIntersectionTestFunc3
Ray-item intersection test function.
Definition: IntersectionQueryEngine3.h:35
void Build(const std::vector< T > &items, const std::vector< BoundingBox3D > &itemsBounds)
Builds bounding volume hierarchy.
Definition: BVH3-Impl.h:51
typename ContainerType::const_iterator ConstIterator
Definition: BVH3.h:31
Nearest neighbor query result.
Definition: NearestNeighborQueryEngine3.h:18
const BoundingBox3D & GetBoundingBox() const
Returns bounding box of every items.
Definition: BVH3-Impl.h:559
Class for 3-D ray.
Definition: Ray3.h:23
BVH3()
Default constructor.
Definition: BVH3-Impl.h:45
NearestNeighborQueryResult3< T > GetNearestNeighbor(const Vector3D &pt, const NearestNeighborDistanceFunc3< T > &distanceFunc) const override
Definition: BVH3-Impl.h:85
Abstract base class for 3-D intersection test query engine.
Definition: IntersectionQueryEngine3.h:47
std::function< double(const T &, const Vector3D &)> NearestNeighborDistanceFunc3
Nearest neighbor distance measure function.
Definition: NearestNeighborQueryEngine3.h:26