internal static Vec3 TransformDirection(Mat4 m, Vec3 d)
 {
     return(new Vec3(m[0][0] * d.X + m[0][1] * d.Y + m[0][2] * d.Z,
                     m[1][0] * d.X + m[1][1] * d.Y + m[1][2] * d.Z,
                     m[2][0] * d.X + m[2][1] * d.Y + m[2][2] * d.Z));
 }
 internal static Vec3 TransformPoint(Mat4 m, Vec3 p)
 {
     return(new Vec3(m[0][0] * p.X + m[0][1] * p.Y + m[0][2] * p.Z + m[0][3],
                     m[1][0] * p.X + m[1][1] * p.Y + m[1][2] * p.Z + m[1][3],
                     m[2][0] * p.X + m[2][1] * p.Y + m[2][2] * p.Z + m[2][3]));
 }