static void subdivide(BVItem* items, int nitems, int imin, int imax, int& curNode, dtBVNode* nodes) { int inum = imax - imin; int icur = curNode; dtBVNode& node = nodes[curNode++]; if (inum == 1) { // Leaf node.bmin[0] = items[imin].bmin[0]; node.bmin[1] = items[imin].bmin[1]; node.bmin[2] = items[imin].bmin[2]; node.bmax[0] = items[imin].bmax[0]; node.bmax[1] = items[imin].bmax[1]; node.bmax[2] = items[imin].bmax[2]; node.i = items[imin].i; } else { // Split calcExtends(items, nitems, imin, imax, node.bmin, node.bmax); int axis = longestAxis(node.bmax[0] - node.bmin[0], node.bmax[1] - node.bmin[1], node.bmax[2] - node.bmin[2]); if (axis == 0) { // Sort along x-axis qsort(items+imin, inum, sizeof(BVItem), compareItemX); } else if (axis == 1) { // Sort along y-axis qsort(items+imin, inum, sizeof(BVItem), compareItemY); } else { // Sort along z-axis qsort(items+imin, inum, sizeof(BVItem), compareItemZ); } int isplit = imin+inum/2; // Left subdivide(items, nitems, imin, isplit, curNode, nodes); // Right subdivide(items, nitems, isplit, imax, curNode, nodes); int iescape = curNode - icur; // Negative index means escape. node.i = -iescape; } }
static void subdivide(BoundsItem* items, int nitems, int imin, int imax, int trisPerChunk, int& curNode, rcChunkyTriMeshNode* nodes, const int maxNodes, int& curTri, int* outTris, const int* inTris) { int inum = imax - imin; int icur = curNode; if (curNode > maxNodes) return; rcChunkyTriMeshNode& node = nodes[curNode++]; if (inum <= trisPerChunk) { // Leaf calcExtends(items, nitems, imin, imax, node.bmin, node.bmax); // Copy triangles. node.i = curTri; node.n = inum; for (int i = imin; i < imax; ++i) { const int* src = &inTris[items[i].i*3]; int* dst = &outTris[curTri*3]; curTri++; dst[0] = src[0]; dst[1] = src[1]; dst[2] = src[2]; } } else { // Split calcExtends(items, nitems, imin, imax, node.bmin, node.bmax); int axis = longestAxis(node.bmax[0] - node.bmin[0], node.bmax[1] - node.bmin[1]); if (axis == 0) { // Sort along x-axis qsort(items+imin, inum, sizeof(BoundsItem), compareItemX); } else if (axis == 1) { // Sort along y-axis qsort(items+imin, inum, sizeof(BoundsItem), compareItemY); } int isplit = imin+inum/2; // Left subdivide(items, nitems, imin, isplit, trisPerChunk, curNode, nodes, maxNodes, curTri, outTris, inTris); // Right subdivide(items, nitems, isplit, imax, trisPerChunk, curNode, nodes, maxNodes, curTri, outTris, inTris); int iescape = curNode - icur; // Negative index means escape. node.i = -iescape; } }