void KDTree::splitNode(int nodeIndex, const KDTriList& sourceTri, int level) { AxisAlignedBox triBox; KDTriList myTriangles; for(KDTriList::const_iterator iTriangle = sourceTri.begin(); iTriangle != sourceTri.end(); ++iTriangle) { KDTriangle triangle = *iTriangle; triBox.clear(); triBox.addPoint(triangle.vert0); triBox.addPoint(triangle.vert0 + triangle.edge1); triBox.addPoint(triangle.vert0 + triangle.edge2); if(mNodes[nodeIndex].mBounds.intersect(triBox)) myTriangles.push_back(triangle); } // Split ends here if(myTriangles.size() < MIN_KDTREE_TRIANGLES || level == MAX_KDTREE_LEVEL) { for(int iChild = 0; iChild < KDTREE_CHILDREN; ++iChild) mNodes[nodeIndex].mChildren[iChild] = 0; mNodes[nodeIndex].mTriStart = mTriangles.size(); mNodes[nodeIndex].mTriNum = myTriangles.size(); mTriangles.resize(mTriangles.size() + myTriangles.size()); mTriangles.insert(mTriangles.begin() + mNodes[nodeIndex].mTriStart, myTriangles.begin(), myTriangles.end()); } // No triangles stored, split children instead else { for(int iChild = 0; iChild < KDTREE_CHILDREN; ++iChild) { AxisAlignedBox childBounds; int splitDimension = level % 3; for(int iDimension = 0; iDimension < 3; ++iDimension) { if(iDimension == splitDimension) { if(iChild & 0x1) { childBounds.minPoint[iDimension] = mNodes[nodeIndex].mBounds.minPoint[iDimension]; childBounds.maxPoint[iDimension] = (mNodes[nodeIndex].mBounds.minPoint[iDimension] + mNodes[nodeIndex].mBounds.maxPoint[iDimension]) * 0.5f; } else { childBounds.minPoint[iDimension] = (mNodes[nodeIndex].mBounds.minPoint[iDimension] + mNodes[nodeIndex].mBounds.maxPoint[iDimension]) * 0.5f; childBounds.maxPoint[iDimension] = mNodes[nodeIndex].mBounds.maxPoint[iDimension]; } } else { childBounds.minPoint[iDimension] = mNodes[nodeIndex].mBounds.minPoint[iDimension]; childBounds.maxPoint[iDimension] = mNodes[nodeIndex].mBounds.maxPoint[iDimension]; } } mNodes[nodeIndex].mChildren[iChild] = createNode(childBounds); splitNode(mNodes[nodeIndex].mChildren[iChild], myTriangles, level + 1); } } }