Beispiel #1
0
	void			_prim		(DWORD prim)
	{
		if (bClass3)	{
			sPoly		src,dst;
			src.resize	(3);
			src[0]		= verts[ tris[prim].verts[0] ];
			src[1]		= verts[ tris[prim].verts[1] ];
			src[2]		= verts[ tris[prim].verts[2] ];
			if (F->ClipPoly(src,dst))
			{
				RESULT& R	= dest->r_add();
				R.id		= prim;
				R.verts[0]	= verts[ tris[prim].verts[0] ];
				R.verts[1]	= verts[ tris[prim].verts[1] ];
				R.verts[2]	= verts[ tris[prim].verts[2] ];
				R.dummy		= tris[prim].dummy;
			}
		} else {
			RESULT& R	= dest->r_add();
			R.id		= prim;
			R.verts[0]	= verts[ tris[prim].verts[0] ];
			R.verts[1]	= verts[ tris[prim].verts[1] ];
			R.verts[2]	= verts[ tris[prim].verts[2] ];
			R.dummy		= tris[prim].dummy;
		}
	}
Beispiel #2
0
	void			_prim		(DWORD prim)
	{
		TRI&	T	= tris[prim];
		Fvector& v0	= verts[ T.verts[0] ];	mLeafVerts[0].x = v0.x;	mLeafVerts[0].y = v0.y;	mLeafVerts[0].z = v0.z;
		Fvector& v1	= verts[ T.verts[1] ];	mLeafVerts[1].x = v1.x;	mLeafVerts[1].y = v1.y;	mLeafVerts[1].z = v1.z;
		Fvector& v2	= verts[ T.verts[2] ];	mLeafVerts[2].x = v2.x;	mLeafVerts[2].y = v2.y;	mLeafVerts[2].z = v2.z;
		if (!_tri())			return;
		RESULT& R	= dest->r_add();
		R.id		= prim;
		R.verts[0]	= v0;
		R.verts[1]	= v1;
		R.verts[2]	= v2;
		R.dummy		= T.dummy;
	}
Beispiel #3
0
	void			_stab		(const AABBNoLeafNode* node)
	{
		// Actual box-box test
		if (!_box((Fvector&)node->mAABB.mCenter,(Fvector&)node->mAABB.mExtents))	return;
		
		// 1st chield
		if (node->HasLeaf())	_prim	(node->GetPrimitive());
		else					_stab	(node->GetPos());
		
		// Early exit for "only first"
		if (bFirst && dest->r_count())												return;
		
		// 2nd chield
		if (node->HasLeaf2())	_prim	(node->GetPrimitive2());
		else					_stab	(node->GetNeg());
	}
Beispiel #4
0
	void			_stab		(const AABBNoLeafNode* node, u32 mask)
	{
		// Actual frustum/aabb test
		EFC_Visible	result		= _box((Fvector&)node->mAABB.mCenter,(Fvector&)node->mAABB.mExtents,mask);
		if (fcvNone == result)	return;
		
		// 1st chield
		if (node->HasLeaf())	_prim	(node->GetPrimitive());
		else					_stab	(node->GetPos(),mask);
		
		// Early exit for "only first"
		if (bFirst && dest->r_count())												return;
		
		// 2nd chield
		if (node->HasLeaf2())	_prim	(node->GetPrimitive2());
		else					_stab	(node->GetNeg(),mask);
	}