27 #ifdef TRI_COLLISION_PROFILING
31 float g_q_accum_tree_collision_time = 0;
32 int g_q_count_traversing = 0;
35 void bt_begin_gim02_q_tree_time()
37 g_q_tree_clock.
reset();
40 void bt_end_gim02_q_tree_time()
43 g_q_count_traversing++;
48 float btGImpactQuantizedBvh::getAverageTreeCollisionTime()
50 if(g_q_count_traversing == 0)
return 0;
52 float avgtime = g_q_accum_tree_collision_time;
53 avgtime /= (float)g_q_count_traversing;
55 g_q_accum_tree_collision_time = 0;
56 g_q_count_traversing = 0;
65 #endif //TRI_COLLISION_PROFILING
76 for (
int i=0;i<primitive_boxes.
size() ;i++ )
78 global_bound.
merge(primitive_boxes[i].m_bound);
96 int numIndices = endIndex-startIndex;
98 for (i=startIndex;i<endIndex;i++)
101 primitive_boxes[i].m_bound.m_min);
106 for (i=startIndex;i<endIndex;i++)
109 primitive_boxes[i].m_bound.m_min);
111 diff2 = diff2 * diff2;
122 int endIndex,
int splitAxis)
125 int splitIndex =startIndex;
126 int numIndices = endIndex - startIndex;
132 for (i=startIndex;i<endIndex;i++)
135 primitive_boxes[i].m_bound.m_min);
140 splitValue = means[splitAxis];
144 for (i=startIndex;i<endIndex;i++)
147 primitive_boxes[i].m_bound.m_min);
148 if (center[splitAxis] > splitValue)
151 primitive_boxes.
swap(i,splitIndex);
166 int rangeBalancedIndices = numIndices/3;
167 bool unbalanced = ((splitIndex<=(startIndex+rangeBalancedIndices)) || (splitIndex >=(endIndex-1-rangeBalancedIndices)));
171 splitIndex = startIndex+ (numIndices>>1);
174 btAssert(!((splitIndex==startIndex) || (splitIndex == (endIndex))));
188 if ((endIndex-startIndex)==1)
191 setNodeBound(curIndex,primitive_boxes[startIndex].m_bound);
192 m_node_array[curIndex].setDataIndex(primitive_boxes[startIndex].m_data);
202 primitive_boxes,startIndex,endIndex,
212 for (
int i=startIndex;i<endIndex;i++)
214 node_bound.
merge(primitive_boxes[i].m_bound);
271 bound.
merge(temp_box);
278 bound.
merge(temp_box);
293 for (
int i = 0;i<primitive_boxes.
size() ;i++ )
296 primitive_boxes[i].
m_data = i;
310 unsigned short quantizedMin[3];
311 unsigned short quantizedMax[3];
317 while (curIndex < numNodes)
325 if (isleafnode && aabbOverlap)
330 if (aabbOverlap || isleafnode)
341 if(collided_results.
size()>0)
return true;
355 while (curIndex < numNodes)
362 bool aabbOverlap = bound.
collide_ray(ray_origin,ray_dir);
365 if (isleafnode && aabbOverlap)
370 if (aabbOverlap || isleafnode)
381 if(collided_results.
size()>0)
return true;
389 int node0 ,
int node1,
bool complete_primitive_tests)
408 int node0,
int node1,
bool complete_primitive_tests)
414 boxset0,boxset1,trans_cache_1to0,
415 node0,node1,complete_primitive_tests) ==
false)
return;
433 collision_pairs,trans_cache_1to0,
439 collision_pairs,trans_cache_1to0,
453 collision_pairs,trans_cache_1to0,
461 collision_pairs,trans_cache_1to0,
474 collision_pairs,trans_cache_1to0,
481 collision_pairs,trans_cache_1to0,
489 collision_pairs,trans_cache_1to0,
496 collision_pairs,trans_cache_1to0,
515 #ifdef TRI_COLLISION_PROFILING
516 bt_begin_gim02_q_tree_time();
517 #endif //TRI_COLLISION_PROFILING
521 &collision_pairs,trans_cache_1to0,0,0,
true);
522 #ifdef TRI_COLLISION_PROFILING
523 bt_end_gim02_q_tree_time();
524 #endif //TRI_COLLISION_PROFILING