GLProgramming.com

home :: about :: development guides :: irc :: forums :: search :: paste :: links :: contribute :: code dump

-> Click here to learn how to get live help <-


New Paste :: Recent Pastes:: Add Line Numbers


A Paste by godecho
void Invert4x4(GLfloat *m)
{
     GLfloat mn[16];
     
     mn[ 0] = (m[ 6]*m[11]*m[13]) - (m[ 7]*m[10]*m[13]) + (m[ 7]*m[ 9]*m[14]) - (m[ 5]*m[11]*m[14]) - (m[ 6]*m[ 9]*m[15]) + (m[ 5]*m[10]*m[15]);
     mn[ 1] = (m[ 3]*m[10]*m[13]) - (m[ 2]*m[11]*m[13]) - (m[ 3]*m[ 9]*m[14]) + (m[ 1]*m[11]*m[14]) + (m[ 2]*m[ 9]*m[15]) - (m[ 1]*m[10]*m[15]);
     mn[ 2] = (m[ 2]*m[ 7]*m[13]) - (m[ 3]*m[ 6]*m[13]) + (m[ 3]*m[ 5]*m[14]) - (m[ 1]*m[ 7]*m[14]) - (m[ 2]*m[ 5]*m[15]) + (m[ 1]*m[ 6]*m[15]);
     mn[ 3] = (m[ 3]*m[ 6]*m[ 9]) - (m[ 2]*m[ 7]*m[ 9]) - (m[ 3]*m[ 5]*m[10]) + (m[ 1]*m[ 7]*m[10]) + (m[ 2]*m[ 5]*m[11]) - (m[ 1]*m[ 6]*m[11]);
     mn[ 4] = (m[ 7]*m[10]*m[12]) - (m[ 6]*m[11]*m[12]) - (m[ 7]*m[ 8]*m[14]) + (m[ 4]*m[11]*m[14]) + (m[ 6]*m[ 8]*m[15]) - (m[ 4]*m[10]*m[15]);
     mn[ 5] = (m[ 2]*m[11]*m[12]) - (m[ 3]*m[10]*m[12]) + (m[ 3]*m[ 8]*m[14]) - (m[ 0]*m[11]*m[14]) - (m[ 2]*m[ 8]*m[15]) + (m[ 0]*m[10]*m[15]);
     mn[ 6] = (m[ 3]*m[ 6]*m[12]) - (m[ 2]*m[ 7]*m[12]) - (m[ 3]*m[ 4]*m[14]) + (m[ 0]*m[ 7]*m[14]) + (m[ 2]*m[ 4]*m[15]) - (m[ 0]*m[ 6]*m[15]);
     mn[ 7] = (m[ 2]*m[ 7]*m[ 8]) - (m[ 3]*m[ 6]*m[ 8]) + (m[ 3]*m[ 4]*m[10]) - (m[ 0]*m[ 7]*m[10]) - (m[ 2]*m[ 4]*m[11]) + (m[ 0]*m[ 6]*m[11]);
     mn[ 8] = (m[ 5]*m[11]*m[12]) - (m[ 7]*m[ 9]*m[12]) + (m[ 7]*m[ 8]*m[13]) - (m[ 4]*m[11]*m[13]) - (m[ 5]*m[ 8]*m[15]) + (m[ 4]*m[ 9]*m[15]);
     mn[ 9] = (m[ 3]*m[ 9]*m[12]) - (m[ 1]*m[11]*m[12]) - (m[ 3]*m[ 8]*m[13]) + (m[ 0]*m[11]*m[13]) + (m[ 1]*m[ 8]*m[15]) - (m[ 0]*m[ 9]*m[15]);
     mn[10] = (m[ 1]*m[ 7]*m[12]) - (m[ 3]*m[ 5]*m[12]) + (m[ 3]*m[ 4]*m[13]) - (m[ 0]*m[ 7]*m[13]) - (m[ 1]*m[ 4]*m[15]) + (m[ 0]*m[ 5]*m[15]);
     mn[11] = (m[ 3]*m[ 5]*m[ 8]) - (m[ 1]*m[ 7]*m[ 8]) - (m[ 3]*m[ 4]*m[ 9]) + (m[ 0]*m[ 7]*m[ 9]) + (m[ 1]*m[ 4]*m[11]) - (m[ 0]*m[ 5]*m[11]);
     mn[12] = (m[ 6]*m[ 9]*m[12]) - (m[ 5]*m[10]*m[12]) - (m[ 6]*m[ 8]*m[13]) + (m[ 4]*m[10]*m[13]) + (m[ 5]*m[ 8]*m[14]) - (m[ 4]*m[ 9]*m[14]);
     mn[13] = (m[ 1]*m[10]*m[12]) - (m[ 2]*m[ 9]*m[12]) + (m[ 2]*m[ 8]*m[13]) - (m[ 0]*m[10]*m[13]) - (m[ 1]*m[ 8]*m[14]) + (m[ 0]*m[ 9]*m[14]);
     mn[14] = (m[ 2]*m[ 5]*m[12]) - (m[ 1]*m[ 6]*m[12]) - (m[ 2]*m[ 4]*m[13]) + (m[ 0]*m[ 6]*m[13]) + (m[ 1]*m[ 4]*m[14]) - (m[ 0]*m[ 5]*m[14]);
     mn[15] = (m[ 1]*m[ 6]*m[ 8]) - (m[ 2]*m[ 5]*m[ 8]) + (m[ 2]*m[ 4]*m[ 9]) - (m[ 0]*m[ 6]*m[ 9]) - (m[ 1]*m[ 4]*m[10]) + (m[ 0]*m[ 5]*m[10]);
     
     memcpy(m, mn, 16*sizeof(GLfloat));
     
     GLfloat d = 1.0f/Determinant4x4(m);
     
     m[ 0] *= d;
     m[ 1] *= d;
     m[ 2] *= d;
     m[ 3] *= d;
     m[ 4] *= d;
     m[ 5] *= d;
     m[ 6] *= d;
     m[ 7] *= d;
     m[ 8] *= d;
     m[ 9] *= d;
     m[10] *= d;
     m[11] *= d;
     m[12] *= d;
     m[13] *= d;
     m[14] *= d;
     m[15] *= d;
}

GLfloat Determinant4x4(GLfloat *m) 
{
    return    (m[ 3] * m[ 6] * m[ 9] * m[12]) - (m[ 2] * m[ 7] * m[ 9] * m[12]) - (m[ 3] * m[ 5] * m[10] * m[12]) + (m[ 1] * m[ 7] * m[10] * m[12]) +
            (m[ 2] * m[ 5] * m[11] * m[12]) - (m[ 1] * m[ 6] * m[11] * m[12]) - (m[ 3] * m[ 6] * m[ 8] * m[13]) + (m[ 2] * m[ 7] * m[ 8] * m[13]) +
            (m[ 3] * m[ 4] * m[10] * m[13]) - (m[ 0] * m[ 7] * m[10] * m[13]) - (m[ 2] * m[ 4] * m[11] * m[13]) + (m[ 0] * m[ 6] * m[11] * m[13]) +
            (m[ 3] * m[ 5] * m[ 8] * m[14]) - (m[ 1] * m[ 7] * m[ 8] * m[14]) - (m[ 3] * m[ 4] * m[ 9] * m[14]) + (m[ 0] * m[ 7] * m[ 9] * m[14]) +
            (m[ 1] * m[ 4] * m[11] * m[14]) - (m[ 0] * m[ 5] * m[11] * m[14]) - (m[ 2] * m[ 5] * m[ 8] * m[15]) + (m[ 1] * m[ 6] * m[ 8] * m[15]) +
            (m[ 2] * m[ 4] * m[ 9] * m[15]) - (m[ 0] * m[ 6] * m[ 9] * m[15]) - (m[ 1] * m[ 4] * m[10] * m[15]) + (m[ 0] * m[ 5] * m[10] * m[15]);
 }