Bullet Collision Detection & Physics Library
btGImpactBvh.h
Go to the documentation of this file.
1 #ifndef GIM_BOX_SET_H_INCLUDED
2 #define GIM_BOX_SET_H_INCLUDED
3 
7 /*
8 This source file is part of GIMPACT Library.
9 
10 For the latest info, see http://gimpact.sourceforge.net/
11 
12 Copyright (c) 2007 Francisco Leon Najera. C.C. 80087371.
13 email: projectileman@yahoo.com
14 
15 
16 This software is provided 'as-is', without any express or implied warranty.
17 In no event will the authors be held liable for any damages arising from the use of this software.
18 Permission is granted to anyone to use this software for any purpose,
19 including commercial applications, and to alter it and redistribute it freely,
20 subject to the following restrictions:
21 
22 1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required.
23 2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software.
24 3. This notice may not be removed or altered from any source distribution.
25 */
26 
27 
29 
30 #include "btBoxCollision.h"
31 #include "btTriangleShapeEx.h"
32 #include "btGImpactBvhStructs.h"
33 
35 class btPairSet: public btAlignedObjectArray<GIM_PAIR>
36 {
37 public:
39  {
40  reserve(32);
41  }
42  inline void push_pair(int index1,int index2)
43  {
44  push_back(GIM_PAIR(index1,index2));
45  }
46 
47  inline void push_pair_inv(int index1,int index2)
48  {
49  push_back(GIM_PAIR(index2,index1));
50  }
51 };
52 
53 class GIM_BVH_DATA_ARRAY:public btAlignedObjectArray<GIM_BVH_DATA>
54 {
55 };
56 
57 
58 class GIM_BVH_TREE_NODE_ARRAY:public btAlignedObjectArray<GIM_BVH_TREE_NODE>
59 {
60 };
61 
62 
63 
64 
66 class btBvhTree
67 {
68 protected:
71 protected:
72  int _sort_and_calc_splitting_index(
73  GIM_BVH_DATA_ARRAY & primitive_boxes,
74  int startIndex, int endIndex, int splitAxis);
75 
76  int _calc_splitting_axis(GIM_BVH_DATA_ARRAY & primitive_boxes, int startIndex, int endIndex);
77 
78  void _build_sub_tree(GIM_BVH_DATA_ARRAY & primitive_boxes, int startIndex, int endIndex);
79 public:
81  {
82  m_num_nodes = 0;
83  }
84 
87  void build_tree(GIM_BVH_DATA_ARRAY & primitive_boxes);
88 
90  {
91  m_node_array.clear();
92  m_num_nodes = 0;
93  }
94 
97  {
98  return m_num_nodes;
99  }
100 
102  SIMD_FORCE_INLINE bool isLeafNode(int nodeindex) const
103  {
104  return m_node_array[nodeindex].isLeafNode();
105  }
106 
107  SIMD_FORCE_INLINE int getNodeData(int nodeindex) const
108  {
109  return m_node_array[nodeindex].getDataIndex();
110  }
111 
112  SIMD_FORCE_INLINE void getNodeBound(int nodeindex, btAABB & bound) const
113  {
114  bound = m_node_array[nodeindex].m_bound;
115  }
116 
117  SIMD_FORCE_INLINE void setNodeBound(int nodeindex, const btAABB & bound)
118  {
119  m_node_array[nodeindex].m_bound = bound;
120  }
121 
122  SIMD_FORCE_INLINE int getLeftNode(int nodeindex) const
123  {
124  return nodeindex+1;
125  }
126 
127  SIMD_FORCE_INLINE int getRightNode(int nodeindex) const
128  {
129  if(m_node_array[nodeindex+1].isLeafNode()) return nodeindex+2;
130  return nodeindex+1 + m_node_array[nodeindex+1].getEscapeIndex();
131  }
132 
133  SIMD_FORCE_INLINE int getEscapeNodeIndex(int nodeindex) const
134  {
135  return m_node_array[nodeindex].getEscapeIndex();
136  }
137 
139  {
140  return &m_node_array[index];
141  }
142 
144 };
145 
146 
148 
154 {
155 public:
156 
158 
160  virtual bool is_trimesh() const = 0;
161  virtual int get_primitive_count() const = 0;
162  virtual void get_primitive_box(int prim_index ,btAABB & primbox) const = 0;
164  virtual void get_primitive_triangle(int prim_index,btPrimitiveTriangle & triangle) const= 0;
165 };
166 
167 
169 
174 {
175 protected:
178 
179 protected:
180  //stackless refit
181  void refit();
182 public:
183 
186  {
187  m_primitive_manager = NULL;
188  }
189 
192  {
193  m_primitive_manager = primitive_manager;
194  }
195 
197  {
198  btAABB totalbox;
199  getNodeBound(0, totalbox);
200  return totalbox;
201  }
202 
204  {
205  m_primitive_manager = primitive_manager;
206  }
207 
209  {
210  return m_primitive_manager;
211  }
212 
213 
216 
219  {
220  refit();
221  }
222 
224  void buildSet();
225 
227  bool boxQuery(const btAABB & box, btAlignedObjectArray<int> & collided_results) const;
228 
231  const btTransform & transform, btAlignedObjectArray<int> & collided_results) const
232  {
233  btAABB transbox=box;
234  transbox.appy_transform(transform);
235  return boxQuery(transbox,collided_results);
236  }
237 
239  bool rayQuery(
240  const btVector3 & ray_dir,const btVector3 & ray_origin ,
241  btAlignedObjectArray<int> & collided_results) const;
242 
245  {
246  return true;
247  }
248 
251  {
252  return m_primitive_manager->is_trimesh();
253  }
254 
257  {
258  return m_box_tree.getNodeCount();
259  }
260 
262  SIMD_FORCE_INLINE bool isLeafNode(int nodeindex) const
263  {
264  return m_box_tree.isLeafNode(nodeindex);
265  }
266 
267  SIMD_FORCE_INLINE int getNodeData(int nodeindex) const
268  {
269  return m_box_tree.getNodeData(nodeindex);
270  }
271 
272  SIMD_FORCE_INLINE void getNodeBound(int nodeindex, btAABB & bound) const
273  {
274  m_box_tree.getNodeBound(nodeindex, bound);
275  }
276 
277  SIMD_FORCE_INLINE void setNodeBound(int nodeindex, const btAABB & bound)
278  {
279  m_box_tree.setNodeBound(nodeindex, bound);
280  }
281 
282 
283  SIMD_FORCE_INLINE int getLeftNode(int nodeindex) const
284  {
285  return m_box_tree.getLeftNode(nodeindex);
286  }
287 
288  SIMD_FORCE_INLINE int getRightNode(int nodeindex) const
289  {
290  return m_box_tree.getRightNode(nodeindex);
291  }
292 
293  SIMD_FORCE_INLINE int getEscapeNodeIndex(int nodeindex) const
294  {
295  return m_box_tree.getEscapeNodeIndex(nodeindex);
296  }
297 
298  SIMD_FORCE_INLINE void getNodeTriangle(int nodeindex,btPrimitiveTriangle & triangle) const
299  {
300  m_primitive_manager->get_primitive_triangle(getNodeData(nodeindex),triangle);
301  }
302 
303 
305  {
306  return m_box_tree.get_node_pointer(index);
307  }
308 
309 #ifdef TRI_COLLISION_PROFILING
310  static float getAverageTreeCollisionTime();
311 #endif //TRI_COLLISION_PROFILING
312 
313  static void find_collision(btGImpactBvh * boxset1, const btTransform & trans1,
314  btGImpactBvh * boxset2, const btTransform & trans2,
315  btPairSet & collision_pairs);
316 };
317 
318 #endif // GIM_BOXPRUNING_H_INCLUDED
void update()
node manager prototype functions
Definition: btGImpactBvh.h:218
void push_back(const GIM_PAIR &_Val)
GIM_BVH_TREE_NODE_ARRAY m_node_array
Definition: btGImpactBvh.h:70
The btAlignedObjectArray template class uses a subset of the stl::vector interface for its methods It...
void getNodeBound(int nodeindex, btAABB &bound) const
Definition: btGImpactBvh.h:272
void setNodeBound(int nodeindex, const btAABB &bound)
Definition: btGImpactBvh.h:117
virtual ~btPrimitiveManagerBase()
Definition: btGImpactBvh.h:157
void push_pair_inv(int index1, int index2)
Definition: btGImpactBvh.h:47
#define SIMD_FORCE_INLINE
Definition: btScalar.h:81
int getNodeData(int nodeindex) const
Definition: btGImpactBvh.h:107
void getNodeBound(int nodeindex, btAABB &bound) const
Definition: btGImpactBvh.h:112
int getNodeData(int nodeindex) const
Definition: btGImpactBvh.h:267
int m_num_nodes
Definition: btGImpactBvh.h:69
Prototype Base class for primitive classification.
Definition: btGImpactBvh.h:153
bool isLeafNode(int nodeindex) const
tells if the node is a leaf
Definition: btGImpactBvh.h:262
A pairset array.
Definition: btGImpactBvh.h:35
void push_pair(int index1, int index2)
Definition: btGImpactBvh.h:42
int getLeftNode(int nodeindex) const
Definition: btGImpactBvh.h:283
void clear()
clear the array, deallocated memory. Generally it is better to use array.resize(0), to reduce performance overhead of run-time memory (de)allocations.
bool boxQueryTrans(const btAABB &box, const btTransform &transform, btAlignedObjectArray< int > &collided_results) const
returns the indices of the primitives in the m_primitive_manager
Definition: btGImpactBvh.h:230
const GIM_BVH_TREE_NODE * get_node_pointer(int index=0) const
Definition: btGImpactBvh.h:138
Axis aligned box.
btGImpactBvh()
this constructor doesn&#39;t build the tree. you must call buildSet
Definition: btGImpactBvh.h:185
Basic Box tree structure.
Definition: btGImpactBvh.h:66
void appy_transform(const btTransform &trans)
Apply a transform to an AABB.
virtual bool is_trimesh() const =0
determines if this manager consist on only triangles, which special case will be optimized ...
void setNodeBound(int nodeindex, const btAABB &bound)
Definition: btGImpactBvh.h:277
btBvhTree m_box_tree
Definition: btGImpactBvh.h:176
btPrimitiveManagerBase * getPrimitiveManager() const
Definition: btGImpactBvh.h:208
btVector3 can be used to represent 3D points and vectors.
Definition: btVector3.h:83
virtual void get_primitive_triangle(int prim_index, btPrimitiveTriangle &triangle) const =0
retrieves only the points of the triangle, and the collision margin
bool isTrimesh() const
tells if this set is a trimesh
Definition: btGImpactBvh.h:250
The btTransform class supports rigid transforms with only translation and rotation and no scaling/she...
Definition: btTransform.h:34
int getLeftNode(int nodeindex) const
Definition: btGImpactBvh.h:122
void setPrimitiveManager(btPrimitiveManagerBase *primitive_manager)
Definition: btGImpactBvh.h:203
int getEscapeNodeIndex(int nodeindex) const
Definition: btGImpactBvh.h:293
btPrimitiveManagerBase * m_primitive_manager
Definition: btGImpactBvh.h:177
bool isLeafNode(int nodeindex) const
tells if the node is a leaf
Definition: btGImpactBvh.h:102
void clearNodes()
Definition: btGImpactBvh.h:89
bool hasHierarchy() const
tells if this set has hierarcht
Definition: btGImpactBvh.h:244
Node Structure for trees.
int getNodeCount() const
node count
Definition: btGImpactBvh.h:96
Structure for containing Boxes.
Definition: btGImpactBvh.h:173
Overlapping pair.
btGImpactBvh(btPrimitiveManagerBase *primitive_manager)
this constructor doesn&#39;t build the tree. you must call buildSet
Definition: btGImpactBvh.h:191
int getRightNode(int nodeindex) const
Definition: btGImpactBvh.h:288
const GIM_BVH_TREE_NODE * get_node_pointer(int index=0) const
Definition: btGImpactBvh.h:304
int getEscapeNodeIndex(int nodeindex) const
Definition: btGImpactBvh.h:133
void getNodeTriangle(int nodeindex, btPrimitiveTriangle &triangle) const
Definition: btGImpactBvh.h:298
int getNodeCount() const
node count
Definition: btGImpactBvh.h:256
btAABB getGlobalBox() const
Definition: btGImpactBvh.h:196
int getRightNode(int nodeindex) const
Definition: btGImpactBvh.h:127