rendered paste bodyvoid CTerrain::CalcFrustum()
{
bool normalize = true;
CMatrix4 proj;
CMatrix4 modl;
CMatrix4 clip;
/* Get the current PROJECTION matrix from OpenGL */
glGetFloatv( GL_PROJECTION_MATRIX, proj.m );
/* Get the current MODELVIEW matrix from OpenGL */
glGetFloatv( GL_MODELVIEW_MATRIX, modl.m );
/* Combine the two matrices (multiply projection by modelview) */
clip.m[ 0] = modl.m[ 0] * proj.m[ 0] + modl.m[ 1] * proj.m[ 4] + modl.m[ 2] * proj.m[ 8] + modl.m[ 3] * proj.m[12];
clip.m[ 1] = modl.m[ 0] * proj.m[ 1] + modl.m[ 1] * proj.m[ 5] + modl.m[ 2] * proj.m[ 9] + modl.m[ 3] * proj.m[13];
clip.m[ 2] = modl.m[ 0] * proj.m[ 2] + modl.m[ 1] * proj.m[ 6] + modl.m[ 2] * proj.m[10] + modl.m[ 3] * proj.m[14];
clip.m[ 3] = modl.m[ 0] * proj.m[ 3] + modl.m[ 1] * proj.m[ 7] + modl.m[ 2] * proj.m[11] + modl.m[ 3] * proj.m[15];
clip.m[ 4] = modl.m[ 4] * proj.m[ 0] + modl.m[ 5] * proj.m[ 4] + modl.m[ 6] * proj.m[ 8] + modl.m[ 7] * proj.m[12];
clip.m[ 5] = modl.m[ 4] * proj.m[ 1] + modl.m[ 5] * proj.m[ 5] + modl.m[ 6] * proj.m[ 9] + modl.m[ 7] * proj.m[13];
clip.m[ 6] = modl.m[ 4] * proj.m[ 2] + modl.m[ 5] * proj.m[ 6] + modl.m[ 6] * proj.m[10] + modl.m[ 7] * proj.m[14];
clip.m[ 7] = modl.m[ 4] * proj.m[ 3] + modl.m[ 5] * proj.m[ 7] + modl.m[ 6] * proj.m[11] + modl.m[ 7] * proj.m[15];
clip.m[ 8] = modl.m[ 8] * proj.m[ 0] + modl.m[ 9] * proj.m[ 4] + modl.m[10] * proj.m[ 8] + modl.m[11] * proj.m[12];
clip.m[ 9] = modl.m[ 8] * proj.m[ 1] + modl.m[ 9] * proj.m[ 5] + modl.m[10] * proj.m[ 9] + modl.m[11] * proj.m[13];
clip.m[10] = modl.m[ 8] * proj.m[ 2] + modl.m[ 9] * proj.m[ 6] + modl.m[10] * proj.m[10] + modl.m[11] * proj.m[14];
clip.m[11] = modl.m[ 8] * proj.m[ 3] + modl.m[ 9] * proj.m[ 7] + modl.m[10] * proj.m[11] + modl.m[11] * proj.m[15];
clip.m[12] = modl.m[12] * proj.m[ 0] + modl.m[13] * proj.m[ 4] + modl.m[14] * proj.m[ 8] + modl.m[15] * proj.m[12];
clip.m[13] = modl.m[12] * proj.m[ 1] + modl.m[13] * proj.m[ 5] + modl.m[14] * proj.m[ 9] + modl.m[15] * proj.m[13];
clip.m[14] = modl.m[12] * proj.m[ 2] + modl.m[13] * proj.m[ 6] + modl.m[14] * proj.m[10] + modl.m[15] * proj.m[14];
clip.m[15] = modl.m[12] * proj.m[ 3] + modl.m[13] * proj.m[ 7] + modl.m[14] * proj.m[11] + modl.m[15] * proj.m[15];
/* Extract the numbers for the RIGHT plane */
frustum[0].a = clip.m[ 3] - clip.m[ 0];
frustum[0].b = clip.m[ 7] - clip.m[ 4];
frustum[0].c = clip.m[11] - clip.m[ 8];
frustum[0].d = clip.m[15] - clip.m[12];
/* Extract the numbers for the LEFT plane */
frustum[1].a = clip.m[ 3] + clip.m[ 0];
frustum[1].b = clip.m[ 7] + clip.m[ 4];
frustum[1].c = clip.m[11] + clip.m[ 8];
frustum[1].d = clip.m[15] + clip.m[12];
/* Extract the BOTTOM plane */
frustum[2].a = clip.m[ 3] + clip.m[ 1];
frustum[2].b = clip.m[ 7] + clip.m[ 5];
frustum[2].c = clip.m[11] + clip.m[ 9];
frustum[2].d = clip.m[15] + clip.m[13];
/* Extract the TOP plane */
frustum[3].a = clip.m[ 3] - clip.m[ 1];
frustum[3].b = clip.m[ 7] - clip.m[ 5];
frustum[3].c = clip.m[11] - clip.m[ 9];
frustum[3].d = clip.m[15] - clip.m[13];
/* Extract the FAR plane */
frustum[4].a = clip.m[ 3] - clip.m[ 2];
frustum[4].b = clip.m[ 7] - clip.m[ 6];
frustum[4].c = clip.m[11] - clip.m[10];
frustum[4].d = clip.m[15] - clip.m[14];
/* Extract the NEAR plane */
frustum[5].a = clip.m[ 3] + clip.m[ 2];
frustum[5].b = clip.m[ 7] + clip.m[ 6];
frustum[5].c = clip.m[11] + clip.m[10];
frustum[5].d = clip.m[15] + clip.m[14];
if (normalize == true)
{
for (int i=0;i<6;i++)
frustum[i].normalize();
};
}