26 #ifdef TRI_COLLISION_PROFILING
30 float g_accum_tree_collision_time = 0;
31 int g_count_traversing = 0;
34 void bt_begin_gim02_tree_time()
39 void bt_end_gim02_tree_time()
46 float btGImpactBvh::getAverageTreeCollisionTime()
48 if(g_count_traversing == 0)
return 0;
50 float avgtime = g_accum_tree_collision_time;
51 avgtime /= (float)g_count_traversing;
53 g_accum_tree_collision_time = 0;
54 g_count_traversing = 0;
63 #endif //TRI_COLLISION_PROFILING
75 int numIndices = endIndex-startIndex;
77 for (i=startIndex;i<endIndex;i++)
80 primitive_boxes[i].m_bound.m_min);
85 for (i=startIndex;i<endIndex;i++)
88 primitive_boxes[i].m_bound.m_min);
90 diff2 = diff2 * diff2;
101 int endIndex,
int splitAxis)
104 int splitIndex =startIndex;
105 int numIndices = endIndex - startIndex;
111 for (i=startIndex;i<endIndex;i++)
114 primitive_boxes[i].m_bound.m_min);
119 splitValue = means[splitAxis];
123 for (i=startIndex;i<endIndex;i++)
126 primitive_boxes[i].m_bound.m_min);
127 if (center[splitAxis] > splitValue)
130 primitive_boxes.
swap(i,splitIndex);
145 int rangeBalancedIndices = numIndices/3;
146 bool unbalanced = ((splitIndex<=(startIndex+rangeBalancedIndices)) || (splitIndex >=(endIndex-1-rangeBalancedIndices)));
150 splitIndex = startIndex+ (numIndices>>1);
153 btAssert(!((splitIndex==startIndex) || (splitIndex == (endIndex))));
167 if ((endIndex-startIndex)==1)
170 setNodeBound(curIndex,primitive_boxes[startIndex].m_bound);
171 m_node_array[curIndex].setDataIndex(primitive_boxes[startIndex].m_data);
181 primitive_boxes,startIndex,endIndex,
191 for (
int i=startIndex;i<endIndex;i++)
193 node_bound.
merge(primitive_boxes[i].m_bound);
249 bound.
merge(temp_box);
256 bound.
merge(temp_box);
271 for (
int i = 0;i<primitive_boxes.
size() ;i++ )
274 primitive_boxes[i].
m_data = i;
286 while (curIndex < numNodes)
296 if (isleafnode && aabbOverlap)
301 if (aabbOverlap || isleafnode)
312 if(collided_results.
size()>0)
return true;
326 while (curIndex < numNodes)
333 bool aabbOverlap = bound.
collide_ray(ray_origin,ray_dir);
336 if (isleafnode && aabbOverlap)
341 if (aabbOverlap || isleafnode)
352 if(collided_results.
size()>0)
return true;
360 int node0 ,
int node1,
bool complete_primitive_tests)
379 int node0,
int node1,
bool complete_primitive_tests)
385 boxset0,boxset1,trans_cache_1to0,
386 node0,node1,complete_primitive_tests) ==
false)
return;
404 collision_pairs,trans_cache_1to0,
410 collision_pairs,trans_cache_1to0,
424 collision_pairs,trans_cache_1to0,
432 collision_pairs,trans_cache_1to0,
445 collision_pairs,trans_cache_1to0,
452 collision_pairs,trans_cache_1to0,
460 collision_pairs,trans_cache_1to0,
467 collision_pairs,trans_cache_1to0,
486 #ifdef TRI_COLLISION_PROFILING
487 bt_begin_gim02_tree_time();
488 #endif //TRI_COLLISION_PROFILING
492 &collision_pairs,trans_cache_1to0,0,0,
true);
493 #ifdef TRI_COLLISION_PROFILING
494 bt_end_gim02_tree_time();
495 #endif //TRI_COLLISION_PROFILING