26 #ifdef TRI_COLLISION_PROFILING 30 float g_accum_tree_collision_time = 0;
31 int g_count_traversing = 0;
33 void bt_begin_gim02_tree_time()
38 void bt_end_gim02_tree_time()
45 float btGImpactBvh::getAverageTreeCollisionTime()
47 if (g_count_traversing == 0)
return 0;
49 float avgtime = g_accum_tree_collision_time;
50 avgtime /= (float)g_count_traversing;
52 g_accum_tree_collision_time = 0;
53 g_count_traversing = 0;
61 #endif //TRI_COLLISION_PROFILING 72 int numIndices = endIndex - startIndex;
74 for (i = startIndex; i < endIndex; i++)
77 primitive_boxes[i].m_bound.m_min);
82 for (i = startIndex; i < endIndex; i++)
85 primitive_boxes[i].m_bound.m_min);
87 diff2 = diff2 * diff2;
97 int endIndex,
int splitAxis)
100 int splitIndex = startIndex;
101 int numIndices = endIndex - startIndex;
107 for (i = startIndex; i < endIndex; i++)
110 primitive_boxes[i].m_bound.m_min);
115 splitValue = means[splitAxis];
118 for (i = startIndex; i < endIndex; i++)
121 primitive_boxes[i].m_bound.m_min);
122 if (center[splitAxis] > splitValue)
125 primitive_boxes.
swap(i, splitIndex);
140 int rangeBalancedIndices = numIndices / 3;
141 bool unbalanced = ((splitIndex <= (startIndex + rangeBalancedIndices)) || (splitIndex >= (endIndex - 1 - rangeBalancedIndices)));
145 splitIndex = startIndex + (numIndices >> 1);
148 btAssert(!((splitIndex == startIndex) || (splitIndex == (endIndex))));
158 btAssert((endIndex - startIndex) > 0);
160 if ((endIndex - startIndex) == 1)
163 setNodeBound(curIndex, primitive_boxes[startIndex].m_bound);
164 m_node_array[curIndex].setDataIndex(primitive_boxes[startIndex].m_data);
174 primitive_boxes, startIndex, endIndex,
183 for (
int i = startIndex; i < endIndex; i++)
185 node_bound.
merge(primitive_boxes[i].m_bound);
237 bound.
merge(temp_box);
244 bound.
merge(temp_box);
259 for (
int i = 0; i < primitive_boxes.
size(); i++)
262 primitive_boxes[i].m_data = i;
274 while (curIndex < numNodes)
284 if (isleafnode && aabbOverlap)
289 if (aabbOverlap || isleafnode)
300 if (collided_results.
size() > 0)
return true;
312 while (curIndex < numNodes)
319 bool aabbOverlap = bound.
collide_ray(ray_origin, ray_dir);
322 if (isleafnode && aabbOverlap)
327 if (aabbOverlap || isleafnode)
338 if (collided_results.
size() > 0)
return true;
345 int node0,
int node1,
bool complete_primitive_tests)
362 int node0,
int node1,
bool complete_primitive_tests)
365 boxset0, boxset1, trans_cache_1to0,
366 node0, node1, complete_primitive_tests) ==
false)
return;
383 collision_pairs, trans_cache_1to0,
389 collision_pairs, trans_cache_1to0,
400 collision_pairs, trans_cache_1to0,
407 collision_pairs, trans_cache_1to0,
416 collision_pairs, trans_cache_1to0,
423 collision_pairs, trans_cache_1to0,
430 collision_pairs, trans_cache_1to0,
437 collision_pairs, trans_cache_1to0,
454 #ifdef TRI_COLLISION_PROFILING 455 bt_begin_gim02_tree_time();
456 #endif //TRI_COLLISION_PROFILING 460 &collision_pairs, trans_cache_1to0, 0, 0,
true);
461 #ifdef TRI_COLLISION_PROFILING 462 bt_end_gim02_tree_time();
463 #endif //TRI_COLLISION_PROFILING
static void find_collision(btGImpactBvh *boxset1, const btTransform &trans1, btGImpactBvh *boxset2, const btTransform &trans2, btPairSet &collision_pairs)
void push_back(const T &_Val)
GIM_BVH_TREE_NODE_ARRAY m_node_array
void getNodeBound(int nodeindex, btAABB &bound) const
void setNodeBound(int nodeindex, const btAABB &bound)
virtual int get_primitive_count() const =0
bool boxQuery(const btAABB &box, btAlignedObjectArray< int > &collided_results) const
returns the indices of the primitives in the m_primitive_manager
bool overlapping_trans_cache(const btAABB &box, const BT_BOX_BOX_TRANSFORM_CACHE &transcache, bool fulltest) const
transcache is the transformation cache from box to this AABB
The btClock is a portable basic clock that measures accurate time in seconds, use for profiling...
#define SIMD_FORCE_INLINE
void build_tree(GIM_BVH_DATA_ARRAY &primitive_boxes)
prototype functions for box tree management
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
int getNodeData(int nodeindex) const
void reset()
Resets the initial reference time.
void merge(const btAABB &box)
Merges a Box.
bool _node_collision(btGImpactBvh *boxset0, btGImpactBvh *boxset1, const BT_BOX_BOX_TRANSFORM_CACHE &trans_cache_1to0, int node0, int node1, bool complete_primitive_tests)
void _build_sub_tree(GIM_BVH_DATA_ARRAY &primitive_boxes, int startIndex, int endIndex)
bool isLeafNode(int nodeindex) const
tells if the node is a leaf
void swap(int index0, int index1)
void push_pair(int index1, int index2)
int getLeftNode(int nodeindex) const
int _calc_splitting_axis(GIM_BVH_DATA_ARRAY &primitive_boxes, int startIndex, int endIndex)
bool has_collision(const btAABB &other) const
int _sort_and_calc_splitting_index(GIM_BVH_DATA_ARRAY &primitive_boxes, int startIndex, int endIndex, int splitAxis)
unsigned long long int getTimeMicroseconds()
Returns the time in us since the last call to reset or since the Clock was created.
virtual void get_primitive_box(int prim_index, btAABB &primbox) const =0
void setNodeBound(int nodeindex, const btAABB &bound)
void buildSet()
this rebuild the entire set
btVector3 can be used to represent 3D points and vectors.
bool collide_ray(const btVector3 &vorigin, const btVector3 &vdir) const
Finds the Ray intersection parameter.
int size() const
return the number of elements in the array
int getEscapeNodeIndex(int nodeindex) const
btPrimitiveManagerBase * m_primitive_manager
void resize(int newsize, const T &fillData=T())
Structure for containing Boxes.
int getRightNode(int nodeindex) const
int maxAxis() const
Return the axis with the largest value Note return values are 0,1,2 for x, y, or z.
static void _find_collision_pairs_recursive(btGImpactBvh *boxset0, btGImpactBvh *boxset1, btPairSet *collision_pairs, const BT_BOX_BOX_TRANSFORM_CACHE &trans_cache_1to0, int node0, int node1, bool complete_primitive_tests)
int getNodeCount() const
node count
float btScalar
The btScalar type abstracts floating point numbers, to easily switch between double and single floati...