public Matrix4X4 Inverse2(Matrix4X4 dest)
{
// 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);
dest.Elements[0] = (a11 * b11 - a12 * b10 + a13 * b09) * invDet;
dest.Elements[1] = (-a01 * b11 + a02 * b10 - a03 * b09) * invDet;
dest.Elements[2] = (a31 * b05 - a32 * b04 + a33 * b03) * invDet;
dest.Elements[3] = (-a21 * b05 + a22 * b04 - a23 * b03) * invDet;
dest.Elements[4] = (-a10 * b11 + a12 * b08 - a13 * b07) * invDet;
dest.Elements[5] = (a00 * b11 - a02 * b08 + a03 * b07) * invDet;
dest.Elements[6] = (-a30 * b05 + a32 * b02 - a33 * b01) * invDet;
dest.Elements[7] = (a20 * b05 - a22 * b02 + a23 * b01) * invDet;
dest.Elements[8] = (a10 * b10 - a11 * b08 + a13 * b06) * invDet;
dest.Elements[9] = (-a00 * b10 + a01 * b08 - a03 * b06) * invDet;
dest.Elements[10] = (a30 * b04 - a31 * b02 + a33 * b00) * invDet;
dest.Elements[11] = (-a20 * b04 + a21 * b02 - a23 * b00) * invDet;
dest.Elements[12] = (-a10 * b09 + a11 * b07 - a12 * b06) * invDet;
dest.Elements[13] = (a00 * b09 - a01 * b07 + a02 * b06) * invDet;
dest.Elements[14] = (-a30 * b03 + a31 * b01 - a32 * b00) * invDet;
dest.Elements[15] = (a20 * b03 - a21 * b01 + a22 * b00) * invDet;
return this;
}