GLSharp.Util.Matrix4X4.Inverse C# (CSharp) Method

Inverse() public method

public Inverse ( ) : Matrix4X4
return Matrix4X4
        public Matrix4X4 Inverse()
        {
            // Cache the matrix values (makes for huge speed increases!)
            float a00 = Elements[0], a01 = Elements[1], a02 = Elements[2], a03 = Elements[3];
            float a10 = Elements[4], a11 = Elements[5], a12 = Elements[6], a13 = Elements[7];
            float a20 = Elements[8], a21 = Elements[9], a22 = Elements[10], a23 = Elements[11];
            float a30 = Elements[12], a31 = Elements[13], a32 = Elements[14], a33 = Elements[15];

            float b00 = a00 * a11 - a01 * a10;
            float b01 = a00 * a12 - a02 * a10;
            float b02 = a00 * a13 - a03 * a10;
            float b03 = a01 * a12 - a02 * a11;
            float b04 = a01 * a13 - a03 * a11;
            float b05 = a02 * a13 - a03 * a12;
            float b06 = a20 * a31 - a21 * a30;
            float b07 = a20 * a32 - a22 * a30;
            float b08 = a20 * a33 - a23 * a30;
            float b09 = a21 * a32 - a22 * a31;
            float b10 = a21 * a33 - a23 * a31;
            float b11 = a22 * a33 - a23 * a32;

            // Calculate the determinant (inlined to avoid double-caching)
            float invDet = 1 / (b00 * b11 - b01 * b10 + b02 * b09 + b03 * b08 - b04 * b07 + b05 * b06);

            Elements[0] = (a11 * b11 - a12 * b10 + a13 * b09) * invDet;
            Elements[1] = (-a01 * b11 + a02 * b10 - a03 * b09) * invDet;
            Elements[2] = (a31 * b05 - a32 * b04 + a33 * b03) * invDet;
            Elements[3] = (-a21 * b05 + a22 * b04 - a23 * b03) * invDet;
            Elements[4] = (-a10 * b11 + a12 * b08 - a13 * b07) * invDet;
            Elements[5] = (a00 * b11 - a02 * b08 + a03 * b07) * invDet;
            Elements[6] = (-a30 * b05 + a32 * b02 - a33 * b01) * invDet;
            Elements[7] = (a20 * b05 - a22 * b02 + a23 * b01) * invDet;
            Elements[8] = (a10 * b10 - a11 * b08 + a13 * b06) * invDet;
            Elements[9] = (-a00 * b10 + a01 * b08 - a03 * b06) * invDet;
            Elements[10] = (a30 * b04 - a31 * b02 + a33 * b00) * invDet;
            Elements[11] = (-a20 * b04 + a21 * b02 - a23 * b00) * invDet;
            Elements[12] = (-a10 * b09 + a11 * b07 - a12 * b06) * invDet;
            Elements[13] = (a00 * b09 - a01 * b07 + a02 * b06) * invDet;
            Elements[14] = (-a30 * b03 + a31 * b01 - a32 * b00) * invDet;
            Elements[15] = (a20 * b03 - a21 * b01 + a22 * b00) * invDet;

            return this;
        }