Goz
11-15-2006, 03:23 AM
Hi all!
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!
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!