float det3x3sub(const float *m, int i0, int i1, int i2, int i3, int i4, int i5, int i6, int i7, int i8) { float det = 0.0f; det += m[i0] * det2x2sub(m, i4, i5, i7, i8); det -= m[i3] * det2x2sub(m, i1, i2, i7, i8); det += m[i6] * det2x2sub(m, i1, i2, i4, i5); return det; }
double det3x3sub(const double *m, int i0, int i1, int i2, int i3, int i4, int i5, int i6, int i7, int i8) { double det = 0.0; det += m[i0] * det2x2sub(m, i4, i5, i7, i8); det -= m[i3] * det2x2sub(m, i1, i2, i7, i8); det += m[i6] * det2x2sub(m, i1, i2, i4, i5); return det; }
mat3x3 inverse(const mat3x3 &Matrix) { const float *m = Matrix.M; float det = 0.0f; det += m[0] * det2x2sub(m, 4, 5, 7, 8); det -= m[3] * det2x2sub(m, 1, 2, 7, 8); det += m[6] * det2x2sub(m, 1, 2, 4, 5); mat3x3 Inverse; Inverse.M[0] = det2x2sub(m, 4, 5, 7, 8) / det; Inverse.M[1] = -det2x2sub(m, 1, 2, 7, 8) / det; Inverse.M[2] = det2x2sub(m, 1, 2, 4, 5) / det; Inverse.M[3] = -det2x2sub(m, 3, 5, 6, 8) / det; Inverse.M[4] = det2x2sub(m, 0, 2, 6, 8) / det; Inverse.M[5] = -det2x2sub(m, 0, 2, 3, 5) / det; Inverse.M[6] = det2x2sub(m, 3, 4, 6, 7) / det; Inverse.M[7] = -det2x2sub(m, 0, 1, 6, 7) / det; Inverse.M[8] = det2x2sub(m, 0, 1, 3, 4) / det; return Inverse; }