Jet  v1.3.3
bvh3.h
Go to the documentation of this file.
1 // Copyright (c) 2019 Doyub Kim
2 //
3 // I am making my contributions/submissions to this project solely in my
4 // personal capacity and am not conveying any rights to any intellectual
5 // property of any third parties.
6 
7 #ifndef INCLUDE_JET_BVH3_H_
8 #define INCLUDE_JET_BVH3_H_
9 
12 
13 #include <vector>
14 
15 namespace jet {
16 
25 template <typename T>
26 class Bvh3 final : public IntersectionQueryEngine3<T>,
27  public NearestNeighborQueryEngine3<T> {
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 intersects(const BoundingBox3D& box,
51  const BoxIntersectionTestFunc3<T>& testFunc) const override;
52 
54  bool intersects(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& boundingBox() const;
74 
77 
80 
83 
85  ConstIterator end() const;
86 
88  size_t numberOfItems() const;
89 
91  const T& item(size_t i) const;
92 
94  size_t numberOfNodes() const;
95 
97  std::pair<size_t, size_t> children(size_t i) const;
98 
100  bool isLeaf(size_t i) const;
101 
103  const BoundingBox3D& nodeBound(size_t i) const;
104 
106  Iterator itemOfNode(size_t i);
107 
109  ConstIterator itemOfNode(size_t i) const;
110 
111  private:
112  struct Node {
113  char flags;
114  union {
115  size_t child;
116  size_t item;
117  };
118  BoundingBox3D bound;
119 
120  Node();
121  void initLeaf(size_t it, const BoundingBox3D& b);
122  void initInternal(uint8_t axis, size_t c, const BoundingBox3D& b);
123  bool isLeaf() const;
124  };
125 
126  BoundingBox3D _bound;
127  ContainerType _items;
128  std::vector<BoundingBox3D> _itemBounds;
129  std::vector<Node> _nodes;
130 
131  size_t build(size_t nodeIndex, size_t* itemIndices, size_t nItems,
132  size_t currentDepth);
133 
134  size_t qsplit(size_t* itemIndices, size_t numItems, double pivot,
135  uint8_t axis);
136 };
137 } // namespace jet
138 
139 #include "detail/bvh3-inl.h"
140 
141 #endif // INCLUDE_JET_BVH3_H_
jet::GetRayIntersectionFunc3
std::function< double(const T &, const Ray3D &)> GetRayIntersectionFunc3
Ray-item closest intersection evaluation function.
Definition: intersection_query_engine3.h:40
jet::BoxIntersectionTestFunc3
std::function< bool(const T &, const BoundingBox3D &)> BoxIntersectionTestFunc3
Box-item intersection test function.
Definition: intersection_query_engine3.h:32
jet::IntersectionVisitorFunc3
std::function< void(const T &)> IntersectionVisitorFunc3
Visitor function which is invoked for each intersecting item.
Definition: intersection_query_engine3.h:44
jet::Bvh3::intersects
bool intersects(const Ray3D &ray, const RayIntersectionTestFunc3< T > &testFunc) const override
Returns true if given ray intersects with any of the stored items.
jet::Bvh3::clear
void clear()
Clears all the contents of this instance.
jet::Bvh3::numberOfNodes
size_t numberOfNodes() const
Returns the number of nodes.
jet::Bvh3< ImplicitSurface3Ptr >::ConstIterator
typename ContainerType::const_iterator ConstIterator
Definition: bvh3.h:31
jet::Bvh3::begin
ConstIterator begin() const
Returns the immutable begin iterator of the item.
jet::Bvh3::boundingBox
const BoundingBox3D & boundingBox() const
Returns bounding box of every items.
jet::Bvh3::isLeaf
bool isLeaf(size_t i) const
Returns true if i-th node is a leaf node.
jet::Bvh3::itemOfNode
Iterator itemOfNode(size_t i)
Returns item of i-th node.
jet::BoundingBox< T, 3 >
3-D axis-aligned bounding box class.
Definition: bounding_box3.h:41
jet::Bvh3::itemOfNode
ConstIterator itemOfNode(size_t i) const
Returns item of i-th node.
jet::Bvh3::Bvh3
Bvh3()
Default constructor.
jet::Bvh3::nodeBound
const BoundingBox3D & nodeBound(size_t i) const
Returns bounding box of i-th node.
intersection_query_engine3.h
jet::Bvh3::forEachIntersectingItem
void forEachIntersectingItem(const BoundingBox3D &box, const BoxIntersectionTestFunc3< T > &testFunc, const IntersectionVisitorFunc3< T > &visitorFunc) const override
Invokes visitorFunc for every intersecting items.
jet::Bvh3::children
std::pair< size_t, size_t > children(size_t i) const
Returns the children indices of i-th node.
jet::NearestNeighborQueryResult3
Nearest neighbor query result.
Definition: nearest_neighbor_query_engine3.h:19
jet::Bvh3::end
Iterator end()
Returns the end iterator of the item.
jet::Bvh3::forEachIntersectingItem
void forEachIntersectingItem(const Ray3D &ray, const RayIntersectionTestFunc3< T > &testFunc, const IntersectionVisitorFunc3< T > &visitorFunc) const override
Invokes visitorFunc for every intersecting items.
jet::Bvh3::end
ConstIterator end() const
Returns the immutable end iterator of the item.
jet
Definition: advection_solver2.h:18
jet::BoundingBox3D
BoundingBox3< double > BoundingBox3D
Double-type 3-D BoundingBox.
Definition: bounding_box3.h:127
jet::Bvh3< ImplicitSurface3Ptr >::Iterator
typename ContainerType::iterator Iterator
Definition: bvh3.h:30
jet::RayIntersectionTestFunc3
std::function< bool(const T &, const Ray3D &)> RayIntersectionTestFunc3
Ray-item intersection test function.
Definition: intersection_query_engine3.h:36
jet::Bvh3::numberOfItems
size_t numberOfItems() const
Returns the number of items.
jet::Bvh3
Bounding Volume Hierarchy (BVH) in 3D.
Definition: bvh3.h:27
jet::Bvh3::build
void build(const std::vector< T > &items, const std::vector< BoundingBox3D > &itemsBounds)
Builds bounding volume hierarchy.
nearest_neighbor_query_engine3.h
jet::Ray< T, 3 >
Class for 2-D ray.
Definition: ray3.h:21
jet::Bvh3::begin
Iterator begin()
Returns the begin iterator of the item.
jet::Bvh3::intersects
bool intersects(const BoundingBox3D &box, const BoxIntersectionTestFunc3< T > &testFunc) const override
Returns true if given box intersects with any of the stored items.
jet::Vector< T, 3 >
3-D vector class.
Definition: vector3.h:25
jet::Bvh3::item
const T & item(size_t i) const
Returns the item at i.
jet::Bvh3::nearest
NearestNeighborQueryResult3< T > nearest(const Vector3D &pt, const NearestNeighborDistanceFunc3< T > &distanceFunc) const override
jet::Bvh3::closestIntersection
ClosestIntersectionQueryResult3< T > closestIntersection(const Ray3D &ray, const GetRayIntersectionFunc3< T > &testFunc) const override
Returns the closest intersection for given ray.
jet::NearestNeighborDistanceFunc3
std::function< double(const T &, const Vector3D &)> NearestNeighborDistanceFunc3
Nearest neighbor distance measure function.
Definition: nearest_neighbor_query_engine3.h:27
jet::IntersectionQueryEngine3
Abstract base class for 3-D intersection test query engine.
Definition: intersection_query_engine3.h:48
jet::Bvh3< ImplicitSurface3Ptr >::ContainerType
std::vector< ImplicitSurface3Ptr > ContainerType
Definition: bvh3.h:29
jet::NearestNeighborQueryEngine3
Abstract base class for 3-D nearest neigbor query engine.
Definition: nearest_neighbor_query_engine3.h:31
jet::ClosestIntersectionQueryResult3
Closest intersection query result.
Definition: intersection_query_engine3.h:19