Untitled
By: a guest | Mar 16th, 2010 | Syntax:
C++ | Size: 1.73 KB | Hits: 29 | Expires: Never
Matrix4 Matrix4::GetInverse(float* det, float epsilon) const
{
// This explicit algorithm is 6 times faster than the adjoints' one
Matrix4 result;
float determinant = ((-m0*m6+m2*m4)*m9+(m1*m6-m2*m5)*m8+(-m4*m1+m0*m5)*m10)*m15+((-m1*m7+m3*m5)*m8+(-m0*m5+m4*m1)*m11+(m0*m7-m3*m4)*m9)*m14+((m3*m4-m0*m7)*m10+(-m2*m4+m0*m6)*m11+m8*(m2*m7-m3*m6))*m13+((m2*m5-m1*m6)*m11+(m1*m7-m3*m5)*m10+(-m2*m7+m3*m6)*m9)*m12;
if(fabs(determinant) < epsilon)
{
if(det) *det = 0;
return result.MakeNull();
}
result.m0 = m5*m10*m15-m5*m11*m14-m9*m6*m15+m9*m7*m14+m13*m6*m11-m13*m7*m10; result.m1 = -m1*m10*m15+m1*m11*m14+m9*m2*m15-m9*m3*m14-m13*m2*m11+m13*m3*m10; result.m2 = m1*m6*m15-m1*m7*m14-m5*m2*m15+m5*m3*m14+m13*m2*m7-m13*m3*m6; result.m3 = -m1*m6*m11+m1*m7*m10+m5*m2*m11-m5*m3*m10-m9*m2*m7+m9*m3*m6;
result.m4 = -m4*m10*m15+m4*m11*m14+m8*m6*m15-m8*m7*m14-m12*m6*m11+m12*m7*m10; result.m5 = m0*m10*m15-m0*m11*m14-m8*m2*m15+m8*m3*m14+m12*m2*m11-m12*m3*m10; result.m6 = -m0*m6*m15+m0*m7*m14+m4*m2*m15-m4*m3*m14-m12*m2*m7+m12*m3*m6; result.m7 = m0*m6*m11-m0*m7*m10-m4*m2*m11+m4*m3*m10+m8*m2*m7-m8*m3*m6;
result.m8 = m4*m9*m15-m4*m11*m13-m8*m5*m15+m8*m7*m13+m12*m5*m11-m12*m7*m9; result.m9 = -m0*m9*m15+m0*m11*m13+m8*m1*m15-m8*m3*m13-m12*m1*m11+m12*m3*m9; result.m10 = m0*m5*m15-m0*m7*m13-m4*m1*m15+m4*m3*m13+m12*m1*m7-m12*m3*m5; result.m11 = -m0*m5*m11+m0*m7*m9+m4*m1*m11-m4*m3*m9-m8*m1*m7+m8*m3*m5;
result.m12 = -m4*m9*m14+m4*m10*m13+m8*m5*m14-m8*m6*m13-m12*m5*m10+m12*m6*m9; result.m13 = m0*m9*m14-m0*m10*m13-m8*m1*m14+m8*m2*m13+m12*m1*m10-m12*m2*m9; result.m14 = -m0*m5*m14+m0*m6*m13+m4*m1*m14-m4*m2*m13-m12*m1*m6+m12*m2*m5;result.m15 = m0*m5*m10-m0*m6*m9-m4*m1*m10+m4*m2*m9+m8*m1*m6-m8*m2*m5;
if(det)
{
*det = determinant;
}
return result;
}