std::unique_ptr<BSPNode> BSPClean(std::unique_ptr<BSPNode> n) { // removes empty cells. if(n->convex.verts.size() == 0) { return NULL; } if(n->isleaf) { n->xyz() = float3(0,0,0); n->w=0; assert(n->over==NULL); assert(n->under==NULL); return n; } n->under = BSPClean(move(n->under)); n->over = BSPClean(move(n->over)); if(!n->over) return move(n->under); if(!n->under) return move(n->over); if(n->over->isleaf && n->over->isleaf==n->under->isleaf) { // prune when both children are leaf cells of the same type n->isleaf = n->over->isleaf; n->over.reset(); n->under.reset(); n->plane() = float4(0,0,0,0); } assert(n->convex.verts.size()); return n; }
BSPNode *BSPClean(BSPNode *n) { // removes empty cells. if(n->convex.verts.size() == 0) { delete n; return NULL; } if(n->isleaf) { n->xyz() = float3(0,0,0); n->w=0; assert(n->over==NULL); assert(n->under==NULL); return n; } n->under = BSPClean(n->under); n->over = BSPClean(n->over ); if(!n->over) { BSPNode *r= n->under; n->under=NULL; delete n; return r; } if(!n->under) { BSPNode *r= n->over; n->over=NULL; delete n; return r; } if(n->over->isleaf && n->over->isleaf==n->under->isleaf) { // prune when both children are leaf cells of the same type n->isleaf = n->over->isleaf; delete n->over; delete n->under; n->over=n->under=NULL; n->xyz() = float3(0, 0, 0); n->w =0; } assert(n->convex.verts.size()); return n; }