void Invert( GLfloat *m )
{
float d, 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 ) );
d = 1.0f/determinant( 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 determinant( 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];
}
|