MCPcopy Create free account
hub / github.com/AcademySoftwareFoundation/OpenColorIO / GetM44Inverse

Function GetM44Inverse

src/OpenColorIO/MathUtils.cpp:198–261  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

196// virtual machines)
197
198bool 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);

Callers 2

GetMxbInverseFunction · 0.85
OCIO_ADD_TESTFunction · 0.85

Calls 1

IsScalarEqualToZeroFunction · 0.85

Tested by 1

OCIO_ADD_TESTFunction · 0.68