Added ref/out overloads to all static Vector*.Transform* methods.

This commit is contained in:
chrisbrandtner 2009-01-25 15:06:42 +00:00
parent 6c22e8522d
commit d7498d62b4
4 changed files with 164 additions and 24 deletions

View file

@ -785,8 +785,7 @@ namespace OpenTK.Math
#region Transform #region Transform
/// <summary> /// <summary>Transform a direction vector by the given Matrix
/// Transform a direction vector by the given Matrix
/// Assumes the matrix has a bottom row of (0,0,0,1), that is the translation part is ignored. /// Assumes the matrix has a bottom row of (0,0,0,1), that is the translation part is ignored.
/// </summary> /// </summary>
/// <param name="vec">The vector to transform</param> /// <param name="vec">The vector to transform</param>
@ -801,9 +800,28 @@ namespace OpenTK.Math
return v; return v;
} }
/// <summary> /// <summary>Transform a direction vector by the given Matrix
/// Transform a Normal by the given Matrix /// Assumes the matrix has a bottom row of (0,0,0,1), that is the translation part is ignored.
/// </summary> /// </summary>
/// <param name="vec">The vector to transform</param>
/// <param name="mat">The desired transformation</param>
/// <param name="result">The transformed vector</param>
public static void TransformVector( ref Vector3 vec, ref Matrix4 mat, out Vector3 result)
{
result.X = vec.X * mat.Row0.X +
vec.Y * mat.Row1.X +
vec.Z * mat.Row2.X;
result.Y = vec.X * mat.Row0.Y +
vec.Y * mat.Row1.Y +
vec.Z * mat.Row2.Y;
result.Z = vec.X * mat.Row0.Z +
vec.Y * mat.Row1.Z +
vec.Z * mat.Row2.Z;
}
/// <summary>Transform a Normal by the given Matrix</summary>
/// <remarks> /// <remarks>
/// This calculates the inverse of the given matrix, use TransformNormalInverse if you /// This calculates the inverse of the given matrix, use TransformNormalInverse if you
/// already have the inverse to avoid this extra calculation /// already have the inverse to avoid this extra calculation
@ -817,9 +835,21 @@ namespace OpenTK.Math
return TransformNormalInverse(norm, mat); return TransformNormalInverse(norm, mat);
} }
/// <summary> /// <summary>Transform a Normal by the given Matrix</summary>
/// Transform a Normal by the (transpose of the) given Matrix /// <remarks>
/// </summary> /// This calculates the inverse of the given matrix, use TransformNormalInverse if you
/// already have the inverse to avoid this extra calculation
/// </remarks>
/// <param name="norm">The normal to transform</param>
/// <param name="mat">The desired transformation</param>
/// <param name="result">The transformed normal</param>
public static void TransformNormal( ref Vector3 norm, ref Matrix4 mat, out Vector3 result)
{
Matrix4 Inverse = Matrix4.Invert( mat );
Vector3.TransformNormalInverse( ref norm, ref Inverse, out result );
}
/// <summary>Transform a Normal by the (transpose of the) given Matrix</summary>
/// <remarks> /// <remarks>
/// This version doesn't calculate the inverse matrix. /// This version doesn't calculate the inverse matrix.
/// Use this version if you already have the inverse of the desired transform to hand /// Use this version if you already have the inverse of the desired transform to hand
@ -836,9 +866,30 @@ namespace OpenTK.Math
return n; return n;
} }
/// <summary> /// <summary>Transform a Normal by the (transpose of the) given Matrix</summary>
/// Transform a Position by the given Matrix /// <remarks>
/// </summary> /// This version doesn't calculate the inverse matrix.
/// Use this version if you already have the inverse of the desired transform to hand
/// </remarks>
/// <param name="norm">The normal to transform</param>
/// <param name="mat">The inverse of the desired transformation</param>
/// <param name="result">The transformed normal</param>
public static void TransformNormalInverse( ref Vector3 norm, ref Matrix4 invMat, out Vector3 result )
{
result.X = norm.X * invMat.Row0.X +
norm.Y * invMat.Row0.Y +
norm.Z * invMat.Row0.Z;
result.Y = norm.X * invMat.Row1.X +
norm.Y * invMat.Row1.Y +
norm.Z * invMat.Row1.Z;
result.Z = norm.X * invMat.Row2.X +
norm.Y * invMat.Row2.Y +
norm.Z * invMat.Row2.Z;
}
/// <summary>Transform a Position by the given Matrix</summary>
/// <param name="pos">The position to transform</param> /// <param name="pos">The position to transform</param>
/// <param name="mat">The desired transformation</param> /// <param name="mat">The desired transformation</param>
/// <returns>The transformed position</returns> /// <returns>The transformed position</returns>
@ -851,9 +902,29 @@ namespace OpenTK.Math
return p; return p;
} }
/// <summary> /// <summary>Transform a Position by the given Matrix</summary>
/// Transform a Vector by the given Matrix /// <param name="pos">The position to transform</param>
/// </summary> /// <param name="mat">The desired transformation</param>
/// <param name="result">The transformed position</param>
public static void TransformPosition( ref Vector3 pos, ref Matrix4 mat, out Vector3 result )
{
result.X = pos.X * mat.Row0.X +
pos.Y * mat.Row1.X +
pos.Z * mat.Row2.X +
mat.Row3.X;
result.Y = pos.X * mat.Row0.Y +
pos.Y * mat.Row1.Y +
pos.Z * mat.Row2.Y +
mat.Row3.Y;
result.Z = pos.X * mat.Row0.Z +
pos.Y * mat.Row1.Z +
pos.Z * mat.Row2.Z +
mat.Row3.Z;
}
/// <summary>Transform a Vector by the given Matrix</summary>
/// <param name="pos">The vector to transform</param> /// <param name="pos">The vector to transform</param>
/// <param name="mat">The desired transformation</param> /// <param name="mat">The desired transformation</param>
/// <returns>The transformed vector</returns> /// <returns>The transformed vector</returns>
@ -868,9 +939,17 @@ namespace OpenTK.Math
return result; return result;
} }
/// <summary> /// <summary>Transform a Vector by the given Matrix</summary>
/// Transform a Vector3 by the given Matrix, and project the resulting Vector4 back to a Vector3 /// <param name="pos">The vector to transform</param>
/// </summary> /// <param name="mat">The desired transformation</param>
/// <param name="result">The transformed vector</param>
public static void Transform( ref Vector3 vec, ref Matrix4 mat, out Vector4 result )
{
Vector4 v4 = new Vector4( vec.X, vec.Y, vec.Z, 1.0f );
Vector4.Transform( ref v4, ref mat, out result );
}
/// <summary>Transform a Vector3 by the given Matrix, and project the resulting Vector4 back to a Vector3</summary>
/// <param name="pos">The vector to transform</param> /// <param name="pos">The vector to transform</param>
/// <param name="mat">The desired transformation</param> /// <param name="mat">The desired transformation</param>
/// <returns>The transformed vector</returns> /// <returns>The transformed vector</returns>
@ -880,6 +959,19 @@ namespace OpenTK.Math
return new Vector3(h.X / h.W, h.Y / h.W, h.Z / h.W); return new Vector3(h.X / h.W, h.Y / h.W, h.Z / h.W);
} }
/// <summary>Transform a Vector3 by the given Matrix, and project the resulting Vector4 back to a Vector3</summary>
/// <param name="pos">The vector to transform</param>
/// <param name="mat">The desired transformation</param>
/// <param name="result">The transformed vector</param>
public static void TransformPerspective( ref Vector3 vec, ref Matrix4 mat, out Vector3 result )
{
Vector4 h;
Vector3.Transform( ref vec, ref mat, out h );
result.X = h.X / h.W;
result.Y = h.Y / h.W;
result.Z = h.Z / h.W;
}
#endregion #endregion
#region CalculateAngle #region CalculateAngle

Binary file not shown.

View file

@ -688,8 +688,6 @@ namespace OpenTK.Math
result = left.X * right.X + left.Y * right.Y + left.Z * right.Z + left.W * right.W; result = left.X * right.X + left.Y * right.Y + left.Z * right.Z + left.W * right.W;
} }
#endregion #endregion
#region Lerp #region Lerp
@ -769,9 +767,7 @@ namespace OpenTK.Math
#region Transform #region Transform
/// <summary> /// <summary>Transform a Vector by the given Matrix</summary>
/// Transform a Vector by the given Matrix
/// </summary>
/// <param name="pos">The vector to transform</param> /// <param name="pos">The vector to transform</param>
/// <param name="mat">The desired transformation</param> /// <param name="mat">The desired transformation</param>
/// <returns>The transformed vector</returns> /// <returns>The transformed vector</returns>
@ -785,6 +781,33 @@ namespace OpenTK.Math
return result; return result;
} }
/// <summary>Transform a Vector by the given Matrix</summary>
/// <param name="pos">The vector to transform</param>
/// <param name="mat">The desired transformation</param>
/// <param name="result">The transformed vector</param>
public static void Transform( ref Vector4 vec, ref Matrix4 mat, out Vector4 result )
{
result.X = vec.X * mat.Row0.X +
vec.Y * mat.Row1.X +
vec.Z * mat.Row2.X +
vec.W * mat.Row3.X;
result.Y = vec.X * mat.Row0.Y +
vec.Y * mat.Row1.Y +
vec.Z * mat.Row2.Y +
vec.W * mat.Row3.Y;
result.Z = vec.X * mat.Row0.Z +
vec.Y * mat.Row1.Z +
vec.Z * mat.Row2.Z +
vec.W * mat.Row3.Z;
result.W = vec.X * mat.Row0.W +
vec.Y * mat.Row1.W +
vec.Z * mat.Row2.W +
vec.W * mat.Row3.W;
}
#endregion #endregion
#endregion #endregion

View file

@ -764,9 +764,7 @@ namespace OpenTK.Math
#region Transform #region Transform
/// <summary> /// <summary>Transform a Vector by the given Matrix</summary>
/// Transform a Vector by the given Matrix
/// </summary>
/// <param name="pos">The vector to transform</param> /// <param name="pos">The vector to transform</param>
/// <param name="mat">The desired transformation</param> /// <param name="mat">The desired transformation</param>
/// <returns>The transformed vector</returns> /// <returns>The transformed vector</returns>
@ -780,6 +778,33 @@ namespace OpenTK.Math
return result; return result;
} }
/// <summary>Transform a Vector by the given Matrix</summary>
/// <param name="pos">The vector to transform</param>
/// <param name="mat">The desired transformation</param>
/// <param name="result">The transformed vector</param>
public static void Transform( ref Vector4d vec, ref Matrix4d mat, out Vector4d result )
{
result.X = vec.X * mat.Row0.X +
vec.Y * mat.Row1.X +
vec.Z * mat.Row2.X +
vec.W * mat.Row3.X;
result.Y = vec.X * mat.Row0.Y +
vec.Y * mat.Row1.Y +
vec.Z * mat.Row2.Y +
vec.W * mat.Row3.Y;
result.Z = vec.X * mat.Row0.Z +
vec.Y * mat.Row1.Z +
vec.Z * mat.Row2.Z +
vec.W * mat.Row3.Z;
result.W = vec.X * mat.Row0.W +
vec.Y * mat.Row1.W +
vec.Z * mat.Row2.W +
vec.W * mat.Row3.W;
}
#endregion #endregion
#endregion #endregion