in packages/common/src/math/matrix.ts [232:303]
public invertToRef(other: Matrix): Matrix {
if (this._isIdentity === true) {
Matrix.IdentityToRef(other);
return this;
}
// the inverse of a Matrix is the transpose of cofactor matrix divided by the determinant
const m = this._m;
const m00 = m[0], m01 = m[1], m02 = m[2], m03 = m[3];
const m10 = m[4], m11 = m[5], m12 = m[6], m13 = m[7];
const m20 = m[8], m21 = m[9], m22 = m[10], m23 = m[11];
const m30 = m[12], m31 = m[13], m32 = m[14], m33 = m[15];
const det_22_33 = m22 * m33 - m32 * m23;
const det_21_33 = m21 * m33 - m31 * m23;
const det_21_32 = m21 * m32 - m31 * m22;
const det_20_33 = m20 * m33 - m30 * m23;
const det_20_32 = m20 * m32 - m22 * m30;
const det_20_31 = m20 * m31 - m30 * m21;
const cofact_00 = +(m11 * det_22_33 - m12 * det_21_33 + m13 * det_21_32);
const cofact_01 = -(m10 * det_22_33 - m12 * det_20_33 + m13 * det_20_32);
const cofact_02 = +(m10 * det_21_33 - m11 * det_20_33 + m13 * det_20_31);
const cofact_03 = -(m10 * det_21_32 - m11 * det_20_32 + m12 * det_20_31);
const det = m00 * cofact_00 + m01 * cofact_01 + m02 * cofact_02 + m03 * cofact_03;
if (det === 0) {
// not invertible
other.copyFrom(this);
return this;
}
const detInv = 1 / det;
const det_12_33 = m12 * m33 - m32 * m13;
const det_11_33 = m11 * m33 - m31 * m13;
const det_11_32 = m11 * m32 - m31 * m12;
const det_10_33 = m10 * m33 - m30 * m13;
const det_10_32 = m10 * m32 - m30 * m12;
const det_10_31 = m10 * m31 - m30 * m11;
const det_12_23 = m12 * m23 - m22 * m13;
const det_11_23 = m11 * m23 - m21 * m13;
const det_11_22 = m11 * m22 - m21 * m12;
const det_10_23 = m10 * m23 - m20 * m13;
const det_10_22 = m10 * m22 - m20 * m12;
const det_10_21 = m10 * m21 - m20 * m11;
const cofact_10 = -(m01 * det_22_33 - m02 * det_21_33 + m03 * det_21_32);
const cofact_11 = +(m00 * det_22_33 - m02 * det_20_33 + m03 * det_20_32);
const cofact_12 = -(m00 * det_21_33 - m01 * det_20_33 + m03 * det_20_31);
const cofact_13 = +(m00 * det_21_32 - m01 * det_20_32 + m02 * det_20_31);
const cofact_20 = +(m01 * det_12_33 - m02 * det_11_33 + m03 * det_11_32);
const cofact_21 = -(m00 * det_12_33 - m02 * det_10_33 + m03 * det_10_32);
const cofact_22 = +(m00 * det_11_33 - m01 * det_10_33 + m03 * det_10_31);
const cofact_23 = -(m00 * det_11_32 - m01 * det_10_32 + m02 * det_10_31);
const cofact_30 = -(m01 * det_12_23 - m02 * det_11_23 + m03 * det_11_22);
const cofact_31 = +(m00 * det_12_23 - m02 * det_10_23 + m03 * det_10_22);
const cofact_32 = -(m00 * det_11_23 - m01 * det_10_23 + m03 * det_10_21);
const cofact_33 = +(m00 * det_11_22 - m01 * det_10_22 + m02 * det_10_21);
Matrix.FromValuesToRef(
cofact_00 * detInv, cofact_10 * detInv, cofact_20 * detInv, cofact_30 * detInv,
cofact_01 * detInv, cofact_11 * detInv, cofact_21 * detInv, cofact_31 * detInv,
cofact_02 * detInv, cofact_12 * detInv, cofact_22 * detInv, cofact_32 * detInv,
cofact_03 * detInv, cofact_13 * detInv, cofact_23 * detInv, cofact_33 * detInv,
other
);
return this;
}