Esempio n. 1
0
void BVH::createLeafNode(int start, int end, AABoundingBox &bbox, BVHBuildNode *node, int *numTotalNodes)
{
	int firstTriOffset     = m_orderedTriangles.size();
	int firstInstanceOffset = m_orderedInstances.size();
    int numTris            = 0;
    int numInstances       = 0;
	for(int i=start; i<end;i++){
        if(m_buildData[i].m_type == 0){
            int triangleId = m_buildData[i].m_triangleId;
            m_orderedTriangles.push_back(m_triangles[triangleId]);
            numTris++;
        }
        else{
            int instanceId = m_buildData[i].m_triangleId;
            m_orderedInstances.push_back(m_instances[instanceId]);
            numInstances++;
        }
	}
    if(numInstances == 0)
        node->initLeaf(firstTriOffset, numTris, bbox, 0);
    else{
        BVHBuildNode *leftNode;
        BVHBuildNode *rightNode;
        rightNode = node;
        if(numTris > 0){
            rightNode = new BVHBuildNode();
            leftNode = new BVHBuildNode();
            (*numTotalNodes)+=2;
            leftNode->initLeaf(firstTriOffset, numTris, bbox, 0);
            node->initInterior(0, leftNode, rightNode);
        }
        rightNode->initLeaf(firstInstanceOffset, numInstances, bbox, 1);
    }
}