public Matrix4 Invert()
{
float determinant = 1 / Determinant();
var mat = new Matrix4
(
new Vector4
(
((Y.Y * Z.Z * W.W) + (Y.Z * Z.W * W.Y) + (Y.W * Z.Y * W.Z) - (Y.Y * Z.W * W.Z) - (Y.Z * Z.Y * W.W) - (Y.W * Z.Z * W.Y)) * determinant,
((X.Y * Z.W * W.Z) + (X.Z * Z.Y * W.W) + (X.W * Z.Z * W.Y) - (X.Y * Z.Z * W.W) - (X.Z * Z.W * W.Y) - (X.W * Z.Y * W.Z)) * determinant,
((X.Y * Y.Z * W.W) + (X.Z * Y.W * W.Y) + (X.W * Y.Y * W.Z) - (X.Y * Y.W * W.Z) - (X.Z * Y.Y * W.W) - (X.W * Y.Z * W.Y)) * determinant,
((X.Y * Y.W * Z.Z) + (X.Z * Y.Y * Z.W) + (X.W * Y.Z * Z.Y) - (X.Y * Y.Z * Z.W) - (X.Z * Y.W * Z.Y) - (X.W * Y.Y * Z.Z)) * determinant
),
new Vector4
(
((Y.X * Z.W * W.Z) + (Y.Z * Z.X * W.W) + (Y.W * Z.Z * W.X) - (Y.X * Z.Z * W.W) - (Y.Z * Z.W * W.X) - (Y.W * Z.X * W.Z)) * determinant,
((X.X * Z.Z * W.W) + (X.Z * Z.W * W.X) + (X.W * Z.X * W.Z) - (X.X * Z.W * W.Z) - (X.Z * Z.X * W.W) - (X.W * Z.Z * W.X)) * determinant,
((X.X * Y.W * W.Z) + (X.Z * Y.X * W.W) + (X.W * Y.Z * W.X) - (X.X * Y.Z * W.W) - (X.Z * Y.W * W.X) - (X.W * Y.X * W.Z)) * determinant,
((X.X * Y.Z * Z.W) + (X.Z * Y.W * Z.X) + (X.W * Y.X * Z.Z) - (X.X * Y.W * Z.Z) - (X.Z * Y.X * Z.W) - (X.W * Y.Z * Z.X)) * determinant
),
new Vector4
(
((Y.X * Z.Y * W.W) + (Y.Y * Z.W * W.X) + (Y.W * Z.X * W.Y) - (Y.X * Z.W * W.Y) - (Y.Y * Z.X * W.W) - (Y.W * Z.Y * W.X)) * determinant,
((X.X * Z.W * W.Y) + (X.Y * Z.X * W.W) + (X.W * Z.Y * W.X) - (X.X * Z.Y * W.W) - (X.Y * Z.W * W.X) - (X.W * Z.X * W.Y)) * determinant,
((X.X * Y.Y * W.W) + (X.Y * Y.W * W.X) + (X.W * Y.X * W.Y) - (X.X * Y.W * W.Y) - (X.Y * Y.X * W.W) - (X.W * Y.Y * W.X)) * determinant,
((X.X * Y.W * Z.Y) + (X.Y * Y.X * Z.W) + (X.W * Y.Y * Z.X) - (X.X * Y.Y * Z.W) - (X.Y * Y.W * Z.X) - (X.W * Y.X * Z.Y)) * determinant
),
new Vector4
(
((Y.X * Z.Z * W.Y) + (Y.Y * Z.X * W.Z) + (Y.Z * Z.Y * W.X) - (Y.X * Z.Y * W.Z) - (Y.Y * Z.Z * W.X) - (Y.Z * Z.X * W.Y)) * determinant,
((X.X * Z.Y * W.Z) + (X.Y * Z.Z * W.X) + (X.Z * Z.X * W.Y) - (X.X * Z.Z * W.Y) - (X.Y * Z.X * W.Z) - (X.Z * Z.Y * W.X)) * determinant,
((X.X * Y.Z * W.Y) + (X.Y * Y.X * W.Z) + (X.Z * Y.Y * W.X) - (X.X * Y.Y * W.Z) - (X.Y * Y.Z * W.X) - (X.Z * Y.X * W.Y)) * determinant,
((X.X * Y.Y * Z.Z) + (X.Y * Y.Z * Z.X) + (X.Z * Y.X * Z.Y) - (X.X * Y.Z * Z.Y) - (X.Y * Y.X * Z.Z) - (X.Z * Y.Y * Z.X)) * determinant
)
);
Transpose(mat, out mat);
return mat;
}