47 #ifndef TITANIC_MATRIX_INV_H 48 #define TITANIC_MATRIX_INV_H 55 bool matrix4Inverse(
const T m[16], T invOut[16])
62 temp_inv[0] = m[5] * m[10] * m[15] -
63 m[5] * m[11] * m[14] -
66 m[13] * m[6] * m[11] -
69 temp_inv[4] = -m[4] * m[10] * m[15] +
70 m[4] * m[11] * m[14] +
73 m[12] * m[6] * m[11] +
76 temp_inv[8] = m[4] * m[9] * m[15] -
77 m[4] * m[11] * m[13] -
80 m[12] * m[5] * m[11] -
83 temp_inv[12] = -m[4] * m[9] * m[14] +
84 m[4] * m[10] * m[13] +
87 m[12] * m[5] * m[10] +
90 temp_inv[1] = -m[1] * m[10] * m[15] +
91 m[1] * m[11] * m[14] +
94 m[13] * m[2] * m[11] +
97 temp_inv[5] = m[0] * m[10] * m[15] -
98 m[0] * m[11] * m[14] -
100 m[8] * m[3] * m[14] +
101 m[12] * m[2] * m[11] -
102 m[12] * m[3] * m[10];
104 temp_inv[9] = -m[0] * m[9] * m[15] +
105 m[0] * m[11] * m[13] +
106 m[8] * m[1] * m[15] -
107 m[8] * m[3] * m[13] -
108 m[12] * m[1] * m[11] +
111 temp_inv[13] = m[0] * m[9] * m[14] -
112 m[0] * m[10] * m[13] -
113 m[8] * m[1] * m[14] +
114 m[8] * m[2] * m[13] +
115 m[12] * m[1] * m[10] -
118 temp_inv[2] = m[1] * m[6] * m[15] -
119 m[1] * m[7] * m[14] -
120 m[5] * m[2] * m[15] +
121 m[5] * m[3] * m[14] +
122 m[13] * m[2] * m[7] -
125 temp_inv[6] = -m[0] * m[6] * m[15] +
126 m[0] * m[7] * m[14] +
127 m[4] * m[2] * m[15] -
128 m[4] * m[3] * m[14] -
129 m[12] * m[2] * m[7] +
132 temp_inv[10] = m[0] * m[5] * m[15] -
133 m[0] * m[7] * m[13] -
134 m[4] * m[1] * m[15] +
135 m[4] * m[3] * m[13] +
136 m[12] * m[1] * m[7] -
139 temp_inv[14] = -m[0] * m[5] * m[14] +
140 m[0] * m[6] * m[13] +
141 m[4] * m[1] * m[14] -
142 m[4] * m[2] * m[13] -
143 m[12] * m[1] * m[6] +
146 temp_inv[3] = -m[1] * m[6] * m[11] +
147 m[1] * m[7] * m[10] +
148 m[5] * m[2] * m[11] -
149 m[5] * m[3] * m[10] -
153 temp_inv[7] = m[0] * m[6] * m[11] -
154 m[0] * m[7] * m[10] -
155 m[4] * m[2] * m[11] +
156 m[4] * m[3] * m[10] +
160 temp_inv[11] = -m[0] * m[5] * m[11] +
162 m[4] * m[1] * m[11] -
167 temp_inv[15] = m[0] * m[5] * m[10] -
169 m[4] * m[1] * m[10] +
174 determinant = m[0] * temp_inv[0] + m[1] * temp_inv[4] + m[2] * temp_inv[8] + m[3] * temp_inv[12];
176 if (determinant == 0)
179 determinant_inv = 1.0 / determinant;
181 for (i = 0; i < 16; i++)
182 invOut[i] = temp_inv[i] * determinant_inv;