コード例 #1
0
ファイル: KDTree.cpp プロジェクト: neilsh/ShortHike
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);
        }
    }
}