/**
         *  @brief Transform a direction from world space to local space.
         **/
        public FPVector4 InverseTransformDirection(FPVector4 direction)
        {
            Debug.Assert(direction.w == FP.Zero);
            FPMatrix4x4 matrix = FPMatrix4x4.Translate(position) * FPMatrix4x4.Rotate(rotation);

            return(FPVector4.Transform(direction, FPMatrix4x4.Inverse(matrix)));
        }
        public static FPVector4 Transform(FPVector position, FPMatrix4x4 matrix)
        {
            FPVector4 result;

            FPVector4.Transform(ref position, ref matrix, out result);
            return(result);
        }
 /**
  *  @brief Transform a vector from world space to local space.
  **/
 public FPVector4 InverseTransformVector(FPVector4 vector)
 {
     Debug.Assert(vector.w == FP.Zero);
     return(FPVector4.Transform(vector, worldToLocalMatrix));
 }
 /**
  *  @brief Transform a vector from local space to world space.
  **/
 public FPVector4 TransformVector(FPVector4 vector)
 {
     Debug.Assert(vector.w == FP.Zero);
     return(FPVector4.Transform(vector, localToWorldMatrix));
 }
 public FPVector InverseTransformPoint(FPVector point)
 {
     return(FPVector4.Transform(point, worldToLocalMatrix).ToFPVector());
 }
 /**
  *  @brief Transform a point from world space to local space.
  **/
 public FPVector4 InverseTransformPoint(FPVector4 point)
 {
     Debug.Assert(point.w == FP.One);
     return(FPVector4.Transform(point, worldToLocalMatrix));
 }
 public FPVector TransformPoint(FPVector point)
 {
     return(FPVector4.Transform(point, localToWorldMatrix).ToFPVector());
 }
 /**
  *  @brief Transform a point from local space to world space.
  **/
 public FPVector4 TransformPoint(FPVector4 point)
 {
     Debug.Assert(point.w == FP.One);
     return(FPVector4.Transform(point, localToWorldMatrix));
 }