Im suffering from complete mind failure at the moment and am trying to figure out what is going wrong with my 3D clipping system of quads. I am clipping against a frustum completely in world space. I work out my view frustum by multiplying the view and projection matrices together and extracting the planes as follows.
void BuildViewFrustum( const Matrix44& view, const Matrix44& proj, Vector* pFrustum )
{
Matrix44 combMat;
Matrix44::Multiply( &combMat, view, proj );
// Right clipping plane (+x)
pFrustum[0] = Vector( (combMat._03 - combMat._00),
(combMat._13 - combMat._10),
(combMat._23 - combMat._20),
(combMat._33 - combMat._30) );
//Left Clipping Plane (-x)
pFrustum[1] = Vector( (combMat._03 + combMat._00),
(combMat._13 + combMat._10),
(combMat._23 + combMat._20),
(combMat._33 + combMat._30) );
// Top clipping plane (+y)
pFrustum[2] = Vector( (combMat._03 - combMat._01),
(combMat._13 - combMat._11),
(combMat._23 - combMat._21),
(combMat._33 - combMat._31) );
// Bottom clipping plane (-y)
pFrustum[3] = Vector( (combMat._03 + combMat._01),
(combMat._13 + combMat._11),
(combMat._23 + combMat._21),
(combMat._33 + combMat._31) );
// Far clipping plane (+z)
pFrustum[4] = Vector( (combMat._03 - combMat._02),
(combMat._13 - combMat._12),
(combMat._23 - combMat._22),
(combMat._33 - combMat._32) );
// Near clipping plane (-z)
pFrustum[5] = Vector( (combMat._03 + combMat._02),
(combMat._13 + combMat._12),
(combMat._23 + combMat._22),
(combMat._33 + combMat._32) );
}
I call the clipping as follows ...
vStack[0] = *pVert0; vStack[1] = *pVert1; vStack[2] = *pVert2; vStack[3] = *pVert3; vStack[0] = *pVert0; uNumVerts = ClipToPlane( vStack, vFrustum[5], uNumVerts ); uNumVerts = ClipToPlane( vStack, vFrustum[4], uNumVerts ); uNumVerts = ClipToPlane( vStack, vFrustum[3], uNumVerts ); uNumVerts = ClipToPlane( vStack, vFrustum[2], uNumVerts ); uNumVerts = ClipToPlane( vStack, vFrustum[1], uNumVerts ); uNumVerts = ClipToPlane( vStack, vFrustum[0], uNumVerts );
At which point my stack should contain a tri-fan that is ready for rendering. My clip function is
u32 ClipToPlane( Vector* pVecStack, const Vector& plane, u32 uNumVerts )
{
Vector vStack[12];
u32 uOutputVerts = 0;
u32 uCount = 0;
u32 uMax = uNumVerts;
while( uCount < uMax )
{
Vector v0 = pVecStack[uCount + 0];
Vector v1 = pVecStack[uCount + 1];
Vector vDiff = v1 - v0;
f32 fDir = Vector::dot3( vDiff, plane );
f32 fDot0 = Vector::dot3( v0, plane );
f32 t = (-plane.w - fDot0) / fDir;
if ( t > 1.0f || t < 0.0f )
{
// Line does not cross the plane.
// Is it inside or outside the plane?
if ( (fDot0 - plane.w) > 0 )
{
vStack[uOutputVerts + 0] = v0;
uOutputVerts++;
}
}
else
{
Vector vNew = v0 + (t * vDiff);
if ( fDir > 0 )
{
vStack[uOutputVerts + 0] = v0;
vStack[uOutputVerts + 1] = vNew;
uOutputVerts += 2;
}
else
{
vStack[uOutputVerts + 0] = vNew;
uOutputVerts++;
}
}
uCount++;
}
// Rebuild stack for return.
uCount = 0;
uMax = uOutputVerts;
while( uCount < uMax )
{
pVecStack[uCount] = vStack[uCount];
uCount++;
}
pVecStack[uCount] = vStack[0];
return uOutputVerts;
}
Im convinced the mistake im making is simple but i just cannot spot what i am doing wrong. Anyone got any ideas?
PS: I know its a bit crap posting up my code but my mind is really not working very well on this. Any ideas will be much appreciated!












