// accumulate triangle counts and track each box-parent index. // also checks that triangles are contained in boxes private void test_coverage(int[] tri_counts, int[] parent_indices, int iBox) { int idx = box_to_index[iBox]; debug_check_child_tris_in_box(iBox); if (idx < triangles_end) { // triange-list case, array is [N t1 t2 ... tN] int n = index_list[idx]; AxisAlignedBox3f box = get_box(iBox); for (int i = 1; i <= n; ++i) { int ti = index_list[idx + i]; tri_counts[ti]++; Index3i tv = mesh.GetTriangle(ti); for (int j = 0; j < 3; ++j) { Vector3f v = (Vector3f)mesh.GetVertex(tv[j]); if (!box.Contains(v)) { Util.gBreakToDebugger(); } } } } else { int i0 = index_list[idx]; if (i0 < 0) { // negative index means we only have one 'child' box to descend into i0 = (-i0) - 1; parent_indices[i0] = iBox; test_coverage(tri_counts, parent_indices, i0); } else { // positive index, two sequential child box indices to descend into i0 = i0 - 1; parent_indices[i0] = iBox; test_coverage(tri_counts, parent_indices, i0); int i1 = index_list[idx + 1]; i1 = i1 - 1; parent_indices[i1] = iBox; test_coverage(tri_counts, parent_indices, i1); } } }
// do full tree traversal below iBox to make sure that all child triangles are contained void debug_check_child_tris_in_box(int iBox) { AxisAlignedBox3f box = get_box(iBox); TreeTraversal t = new TreeTraversal() { NextTriangleF = (tID) => { Index3i tv = mesh.GetTriangle(tID); for (int j = 0; j < 3; ++j) { Vector3f v = (Vector3f)mesh.GetVertex(tv[j]); if (box.Contains(v) == false) { Util.gBreakToDebugger(); } } } }; tree_traversal(iBox, 0, t); }