Esempio n. 1
0
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;
}
Esempio n. 2
0
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;
}