Esempio n. 1
0
BVHBuildNode *BVH::recursiveBuild(int start, int end, int *numTotalNodes)
{
	AABoundingBox bbox;
	for(int i=start; i<end; i++){
		bbox.join(m_buildData[i].m_bbox);
	}
	BVHBuildNode *node = new BVHBuildNode();
    (*numTotalNodes)++;

	int numTriangles = end - start;

	if(numTriangles == 1){
		createLeafNode(start,end,bbox,node, numTotalNodes);
	}
	else{
		AABoundingBox bboxCentroids;
		for(int i=start; i<end; i++){
			bboxCentroids.join(m_buildData[i].m_centroid);
		}
		int dim = bboxCentroids.getMaximumExtent();
		if(bboxCentroids.min(dim) == bboxCentroids.max(dim)){
			createLeafNode(start,end,bbox,node,numTotalNodes);
		}
        else{
            float splitCost;
            int splitBucket;
            findSAHSplit(dim,start,end,bboxCentroids,bbox, &splitCost, &splitBucket);
            if(numTriangles > 6 || splitCost < numTriangles){
                BVHTriangleInfo *midPtr = std::partition(&m_buildData[start], &m_buildData[end], CompareToBucket(dim, splitBucket, 12, bboxCentroids));
                int mid = midPtr - &m_buildData[0];
                if(mid == start || mid == end){
                    mid = start+1;
                }
                node->initInterior(dim, recursiveBuild(start,mid,numTotalNodes), recursiveBuild(mid,end,numTotalNodes));
            }
            else{
                createLeafNode(start,end,bbox,node,numTotalNodes);
            }
        }
	}
	
	return node;
}