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/*
8This source file is part of GIMPACT Library.
9
10For the latest info, see http://gimpact.sourceforge.net/
11
12Copyright (c) 2007 Francisco Leon Najera. C.C. 80087371.
13email: projectileman@yahoo.com
14
15
16This software is provided 'as-is', without any express or implied warranty.
17In no event will the authors be held liable for any damages arising from the use of this software.
18Permission is granted to anyone to use this software for any purpose,
19including commercial applications, and to alter it and redistribute it freely,
20subject to the following restrictions:
21
221. 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.
232. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software.
243. 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
35class btPairSet: public btAlignedObjectArray<GIM_PAIR>
36{
37public:
39 {
40 reserve(32);
41 }
42 inline void push_pair(int index1,int index2)
43 {
45 }
46
47 inline void push_pair_inv(int index1,int index2)
48 {
50 }
51};
52
53class GIM_BVH_DATA_ARRAY:public btAlignedObjectArray<GIM_BVH_DATA>
54{
55};
56
57
58class GIM_BVH_TREE_NODE_ARRAY:public btAlignedObjectArray<GIM_BVH_TREE_NODE>
59{
60};
61
62
63
64
67{
68protected:
71protected:
74 int startIndex, int endIndex, int splitAxis);
75
77
79public:
81 {
82 m_num_nodes = 0;
83 }
84
88
90 {
92 m_num_nodes = 0;
93 }
94
97 {
98 return m_num_nodes;
99 }
100
103 {
104 return m_node_array[nodeindex].isLeafNode();
105 }
106
108 {
109 return m_node_array[nodeindex].getDataIndex();
110 }
111
113 {
114 bound = m_node_array[nodeindex].m_bound;
115 }
116
118 {
119 m_node_array[nodeindex].m_bound = bound;
120 }
121
123 {
124 return nodeindex+1;
125 }
126
128 {
129 if(m_node_array[nodeindex+1].isLeafNode()) return nodeindex+2;
130 return nodeindex+1 + m_node_array[nodeindex+1].getEscapeIndex();
131 }
132
134 {
135 return m_node_array[nodeindex].getEscapeIndex();
136 }
137
139 {
140 return &m_node_array[index];
141 }
142
144};
145
146
148
154{
155public:
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;
165};
166
167
169
174{
175protected:
178
179protected:
180 //stackless refit
181 void refit();
182public:
183
186 {
188 }
189
192 {
194 }
195
197 {
200 return totalbox;
201 }
202
204 {
206 }
207
209 {
210 return m_primitive_manager;
211 }
212
213
216
219 {
220 refit();
221 }
222
224 void buildSet();
225
228
231 const btTransform & transform, btAlignedObjectArray<int> & collided_results) const
232 {
234 transbox.appy_transform(transform);
236 }
237
239 bool rayQuery(
240 const btVector3 & ray_dir,const btVector3 & ray_origin ,
242
245 {
246 return true;
247 }
248
251 {
253 }
254
257 {
258 return m_box_tree.getNodeCount();
259 }
260
263 {
265 }
266
268 {
270 }
271
273 {
275 }
276
278 {
280 }
281
282
284 {
286 }
287
289 {
291 }
292
294 {
296 }
297
299 {
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
316};
317
318#endif // GIM_BOXPRUNING_H_INCLUDED
const T & btMax(const T &a, const T &b)
Definition btMinMax.h:29
#define SIMD_FORCE_INLINE
Definition btScalar.h:81
Node Structure for trees.
Axis aligned box.
void appy_transform(const btTransform &trans)
Apply a transform to an AABB.
The btAlignedObjectArray template class uses a subset of the stl::vector interface for its methods It...
void clear()
clear the array, deallocated memory. Generally it is better to use array.resize(0),...
void push_back(const GIM_PAIR &_Val)
Basic Box tree structure.
void _build_sub_tree(GIM_BVH_DATA_ARRAY &primitive_boxes, int startIndex, int endIndex)
int _calc_splitting_axis(GIM_BVH_DATA_ARRAY &primitive_boxes, int startIndex, int endIndex)
GIM_BVH_TREE_NODE_ARRAY m_node_array
int getRightNode(int nodeindex) const
void getNodeBound(int nodeindex, btAABB &bound) const
int m_num_nodes
void setNodeBound(int nodeindex, const btAABB &bound)
int getNodeCount() const
node count
void clearNodes()
const GIM_BVH_TREE_NODE * get_node_pointer(int index=0) const
int getNodeData(int nodeindex) const
int getLeftNode(int nodeindex) const
int _sort_and_calc_splitting_index(GIM_BVH_DATA_ARRAY &primitive_boxes, int startIndex, int endIndex, int splitAxis)
bool isLeafNode(int nodeindex) const
tells if the node is a leaf
void build_tree(GIM_BVH_DATA_ARRAY &primitive_boxes)
prototype functions for box tree management
int getEscapeNodeIndex(int nodeindex) const
Structure for containing Boxes.
void buildSet()
this rebuild the entire set
bool isTrimesh() const
tells if this set is a trimesh
int getRightNode(int nodeindex) const
int getNodeCount() const
node count
btAABB getGlobalBox() const
bool isLeafNode(int nodeindex) const
tells if the node is a leaf
int getLeftNode(int nodeindex) const
bool boxQueryTrans(const btAABB &box, const btTransform &transform, btAlignedObjectArray< int > &collided_results) const
returns the indices of the primitives in the m_primitive_manager
bool boxQuery(const btAABB &box, btAlignedObjectArray< int > &collided_results) const
returns the indices of the primitives in the m_primitive_manager
void setPrimitiveManager(btPrimitiveManagerBase *primitive_manager)
void getNodeBound(int nodeindex, btAABB &bound) const
int getEscapeNodeIndex(int nodeindex) const
void getNodeTriangle(int nodeindex, btPrimitiveTriangle &triangle) const
bool hasHierarchy() const
tells if this set has hierarcht
btPrimitiveManagerBase * getPrimitiveManager() const
const GIM_BVH_TREE_NODE * get_node_pointer(int index=0) const
btGImpactBvh()
this constructor doesn't build the tree. you must call buildSet
int getNodeData(int nodeindex) const
bool rayQuery(const btVector3 &ray_dir, const btVector3 &ray_origin, btAlignedObjectArray< int > &collided_results) const
returns the indices of the primitives in the m_primitive_manager
btBvhTree m_box_tree
btPrimitiveManagerBase * m_primitive_manager
void update()
node manager prototype functions
void setNodeBound(int nodeindex, const btAABB &bound)
static void find_collision(btGImpactBvh *boxset1, const btTransform &trans1, btGImpactBvh *boxset2, const btTransform &trans2, btPairSet &collision_pairs)
btGImpactBvh(btPrimitiveManagerBase *primitive_manager)
this constructor doesn't build the tree. you must call buildSet
A pairset array.
void push_pair(int index1, int index2)
void push_pair_inv(int index1, int index2)
Prototype Base class for primitive classification.
virtual void get_primitive_triangle(int prim_index, btPrimitiveTriangle &triangle) const =0
retrieves only the points of the triangle, and the collision margin
virtual ~btPrimitiveManagerBase()
virtual bool is_trimesh() const =0
determines if this manager consist on only triangles, which special case will be optimized
virtual int get_primitive_count() const =0
virtual void get_primitive_box(int prim_index, btAABB &primbox) const =0
The btTransform class supports rigid transforms with only translation and rotation and no scaling/she...
Definition btTransform.h:34
btVector3 can be used to represent 3D points and vectors.
Definition btVector3.h:84
Overlapping pair.