示例#1
0
void kdNode::split(const kdTree *tree, const u::vector<int> &tris, m::axis axis,
    u::vector<int> &frontList, u::vector<int> &backList, u::vector<int> &splitList, m::plane &plane) const
{
    const size_t triangleCount = tris.size();
    plane = findSplittingPlane(tree, tris, axis);
    for (size_t i = 0; i < triangleCount; i++) {
        switch (tree->testTriangle(tris[i], plane)) {
        case kPolyPlaneCoplanar:
        case kPolyPlaneSplit:
            splitList.push_back(tris[i]);
            break;
        case kPolyPlaneFront:
            frontList.push_back(tris[i]);
            break;
        case kPolyPlaneBack:
            backList.push_back(tris[i]);
            break;
        }
    }
}
示例#2
0
void MeshKDNode::build ( SplitAxis axis )
{
	std::cout << "." <<std::flush;
	if ( getSize() > 50 )
	{
		this->axis = axis;
		double costForSplit;
		//std::cout << "looking for splitting plane " << std::flush;
		double split = findSplittingPlane ( axis, costForSplit );
// 		std::cout << "I contain " << MeshKDTriangleVector.size() << "MeshKDTriangles costing " << cost() << " split costs " << costForSplit<< std::endl;
		if ( cost() < costForSplit+0.01 ){
	//	std::cout << "Not splitting node with " << MeshKDTriangleVector.size() << " MeshKDTriangles. Cost for keep is " << cost() <<
	//			" best split is " << costForSplit << std::endl;
			return;
		}
		else {
	//		std::cout <<"Split accepted"<< std::endl;
		}
		BBox boxLeft (
		    Vector3 (
		        bbox.lowerBound.x,
		        bbox.lowerBound.y,
		        bbox.lowerBound.z ),
		    Vector3 (
		        ( axis == AXIS_X ) ? split : bbox.upperBound.x,
		        ( axis == AXIS_Y ) ? split : bbox.upperBound.y,
		        ( axis == AXIS_Z ) ? split : bbox.upperBound.z ) );
		BBox boxRight (
		    Vector3 (
		        ( axis == AXIS_X ) ? split : bbox.lowerBound.x,
		        ( axis == AXIS_Y ) ? split : bbox.lowerBound.y,
		        ( axis == AXIS_Z ) ? split : bbox.lowerBound.z ),
		    Vector3 (
		        bbox.upperBound.x,
		        bbox.upperBound.y,
		        bbox.upperBound.z ) );
		right = new MeshKDNode ( boxRight );
		left = new MeshKDNode ( boxLeft );
		ResultPosition res;
		while ( MeshKDTriangleVector.size() )
		{
			MeshKDTriangle* t = MeshKDTriangleVector[MeshKDTriangleVector.size()-1];
			MeshKDTriangleVector.pop_back();
			res = findMeshKDTrianglePosition ( t, split, axis );
			if ( res == LEFT ) left->addMeshKDTriangle ( t );
			if ( res == RIGHT ) right->addMeshKDTriangle ( t );
			if ( res == BOTH ) {left->addMeshKDTriangle ( t ); right->addMeshKDTriangle ( t );}

		}
#pragma omp parallel sections num_threads(2)
		{
#pragma omp section
			{
				if ( left ) left->build ( getNextAxis ( axis ) );
			}
#pragma omp section
			{
				if ( right ) right->build ( getNextAxis ( axis ) );
			}
		}
	}
}