All pastes #376035 Raw Edit

Anonymous

public text v1 · immutable
#376035 ·published 2007-02-28 20:16 UTC
rendered paste body
void 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();
    };
}