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