| 196 | // virtual machines) |
| 197 | |
| 198 | bool GetM44Inverse(float* inverse_out, const float* m_) |
| 199 | { |
| 200 | double m[16]; |
| 201 | for(unsigned int i=0; i<16; ++i) m[i] = (double)m_[i]; |
| 202 | |
| 203 | double d10_21 = m[4]*m[9] - m[5]*m[8]; |
| 204 | double d10_22 = m[4]*m[10] - m[6]*m[8]; |
| 205 | double d10_23 = m[4]*m[11] - m[7]*m[8]; |
| 206 | double d11_22 = m[5]*m[10] - m[6]*m[9]; |
| 207 | double d11_23 = m[5]*m[11] - m[7]*m[9]; |
| 208 | double d12_23 = m[6]*m[11] - m[7]*m[10]; |
| 209 | |
| 210 | double a00 = m[13]*d12_23 - m[14]*d11_23 + m[15]*d11_22; |
| 211 | double a10 = m[14]*d10_23 - m[15]*d10_22 - m[12]*d12_23; |
| 212 | double a20 = m[12]*d11_23 - m[13]*d10_23 + m[15]*d10_21; |
| 213 | double a30 = m[13]*d10_22 - m[14]*d10_21 - m[12]*d11_22; |
| 214 | |
| 215 | double det = a00*m[0] + a10*m[1] + a20*m[2] + a30*m[3]; |
| 216 | |
| 217 | if(IsScalarEqualToZero((float)det)) return false; |
| 218 | |
| 219 | det = 1.0/det; |
| 220 | |
| 221 | double d00_31 = m[0]*m[13] - m[1]*m[12]; |
| 222 | double d00_32 = m[0]*m[14] - m[2]*m[12]; |
| 223 | double d00_33 = m[0]*m[15] - m[3]*m[12]; |
| 224 | double d01_32 = m[1]*m[14] - m[2]*m[13]; |
| 225 | double d01_33 = m[1]*m[15] - m[3]*m[13]; |
| 226 | double d02_33 = m[2]*m[15] - m[3]*m[14]; |
| 227 | |
| 228 | double a01 = m[9]*d02_33 - m[10]*d01_33 + m[11]*d01_32; |
| 229 | double a11 = m[10]*d00_33 - m[11]*d00_32 - m[8]*d02_33; |
| 230 | double a21 = m[8]*d01_33 - m[9]*d00_33 + m[11]*d00_31; |
| 231 | double a31 = m[9]*d00_32 - m[10]*d00_31 - m[8]*d01_32; |
| 232 | |
| 233 | double a02 = m[6]*d01_33 - m[7]*d01_32 - m[5]*d02_33; |
| 234 | double a12 = m[4]*d02_33 - m[6]*d00_33 + m[7]*d00_32; |
| 235 | double a22 = m[5]*d00_33 - m[7]*d00_31 - m[4]*d01_33; |
| 236 | double a32 = m[4]*d01_32 - m[5]*d00_32 + m[6]*d00_31; |
| 237 | |
| 238 | double a03 = m[2]*d11_23 - m[3]*d11_22 - m[1]*d12_23; |
| 239 | double a13 = m[0]*d12_23 - m[2]*d10_23 + m[3]*d10_22; |
| 240 | double a23 = m[1]*d10_23 - m[3]*d10_21 - m[0]*d11_23; |
| 241 | double a33 = m[0]*d11_22 - m[1]*d10_22 + m[2]*d10_21; |
| 242 | |
| 243 | inverse_out[0] = (float) (a00*det); |
| 244 | inverse_out[1] = (float) (a01*det); |
| 245 | inverse_out[2] = (float) (a02*det); |
| 246 | inverse_out[3] = (float) (a03*det); |
| 247 | inverse_out[4] = (float) (a10*det); |
| 248 | inverse_out[5] = (float) (a11*det); |
| 249 | inverse_out[6] = (float) (a12*det); |
| 250 | inverse_out[7] = (float) (a13*det); |
| 251 | inverse_out[8] = (float) (a20*det); |
| 252 | inverse_out[9] = (float) (a21*det); |
| 253 | inverse_out[10] = (float) (a22*det); |
| 254 | inverse_out[11] = (float) (a23*det); |
| 255 | inverse_out[12] = (float) (a30*det); |