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; } } }
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 ) ); } } } }