diff --git a/Source/OpenTK/Math/Vector3.cs b/Source/OpenTK/Math/Vector3.cs index bd0ee0cb..f20bc7c7 100644 --- a/Source/OpenTK/Math/Vector3.cs +++ b/Source/OpenTK/Math/Vector3.cs @@ -1114,6 +1114,29 @@ namespace OpenTK mat.Row3.Z; } + /// Transform a Vector by the given Matrix + /// The vector to transform + /// The desired transformation + /// The transformed vector + public static Vector3 Transform(Vector3 vec, Matrix3 mat) + { + Vector3 result; + Transform(ref vec, ref mat, out result); + return result; + } + + /// Transform a Vector by the given Matrix + /// The vector to transform + /// The desired transformation + /// The transformed vector + public static void Transform(ref Vector3 vec, ref Matrix3 mat, out Vector3 result) + { + result = new Vector3( + vec.X * mat.Row0.X + vec.Y * mat.Row1.X + vec.Z * mat.Row2.X, + vec.X * mat.Row0.Y + vec.Y * mat.Row1.Y + vec.Z * mat.Row2.Y, + vec.X * mat.Row0.Z + vec.Y * mat.Row1.Z + vec.Z * mat.Row2.Z); + } + /// Transform a Vector by the given Matrix /// The vector to transform /// The desired transformation @@ -1168,6 +1191,50 @@ namespace OpenTK Vector3.Add(ref vec, ref temp, out result); } + /// Transform a Vector by the given Matrix using right-handed notation + /// The vector to transform + /// The desired transformation + public static Vector3 RightHandedTransform(Vector3 vec, Matrix3 mat) + { + Vector3 result; + RightHandedTransform(ref vec, ref mat, out result); + return result; + } + + /// Transform a Vector by the given Matrix using right-handed notation + /// The vector to transform + /// The desired transformation + /// The transformed vector + public static void RightHandedTransform(ref Vector3 vec, ref Matrix3 mat, out Vector3 result) + { + result = new Vector3( + mat.Row0.X * vec.X + mat.Row0.Y * vec.Y + mat.Row0.Z * vec.Z, + mat.Row1.X * vec.X + mat.Row1.Y * vec.Y + mat.Row1.Z * vec.Z, + mat.Row2.X * vec.X + mat.Row2.Y * vec.Y + mat.Row2.Z * vec.Z); + } + + /// Transform a Vector by the given Matrix using right-handed notation + /// The vector to transform + /// The desired transformation + public static Vector3 RightHandedTransform(Vector3 vec, Matrix4 mat) + { + Vector3 result; + RightHandedTransform(ref vec, ref mat, out result); + return result; + } + + /// Transform a Vector by the given Matrix using right-handed notation + /// The vector to transform + /// The desired transformation + /// The transformed vector + public static void RightHandedTransform(ref Vector3 vec, ref Matrix4 mat, out Vector3 result) + { + result = new Vector3( + mat.Row0.X * vec.X + mat.Row0.Y * vec.Y + mat.Row0.Z * vec.Z + mat.Row0.W, + mat.Row1.X * vec.X + mat.Row1.Y * vec.Y + mat.Row1.Z * vec.Z + mat.Row1.W, + mat.Row2.X * vec.X + mat.Row2.Y * vec.Y + mat.Row2.Z * vec.Z + mat.Row2.W); + } + /// Transform a Vector3 by the given Matrix, and project the resulting Vector4 back to a Vector3 /// The vector to transform /// The desired transformation @@ -1502,7 +1569,72 @@ namespace OpenTK vec.Z *= scale.Z; return vec; } - + + /// + /// Transform a Vector by the given Matrix. + /// + /// The vector to transform + /// The desired transformation + /// The transformed vector + public static Vector3 operator *(Vector3 vec, Matrix3 mat) + { + Vector3 result; + Vector3.Transform(ref vec, ref mat, out result); + return result; + } + + /// + /// Transform a Vector by the given Matrix. + /// + /// The vector to transform + /// The desired transformation + /// The transformed vector + public static Vector3 operator *(Vector3 vec, Matrix4 mat) + { + Vector3 result; + Vector3.Transform(ref vec, ref mat, out result); + return result; + } + + /// + /// Transform a Vector by the given Matrix using right-handed notation + /// + /// The vector to transform + /// The desired transformation + /// The transformed vector + public static Vector3 operator *(Matrix3 mat, Vector3 vec) + { + Vector3 result; + Vector3.RightHandedTransform(ref vec, ref mat, out result); + return result; + } + + /// + /// Transform a Vector by the given Matrix using right-handed notation + /// + /// The vector to transform + /// The desired transformation + /// The transformed vector + public static Vector3 operator *(Matrix4 mat, Vector3 vec) + { + Vector3 result; + Vector3.RightHandedTransform(ref vec, ref mat, out result); + return result; + } + + /// + /// Transforms a vector by a quaternion rotation. + /// + /// The vector to transform. + /// The quaternion to rotate the vector by. + /// + public static Vector3 operator *(Quaternion quat, Vector3 vec) + { + Vector3 result; + Vector3.Transform(ref vec, ref quat, out result); + return result; + } + /// /// Divides an instance by a scalar. /// diff --git a/Source/OpenTK/Math/Vector4.cs b/Source/OpenTK/Math/Vector4.cs index 98f374fc..ae8373c7 100644 --- a/Source/OpenTK/Math/Vector4.cs +++ b/Source/OpenTK/Math/Vector4.cs @@ -1017,6 +1017,29 @@ namespace OpenTK result = new Vector4(v.X, v.Y, v.Z, v.W); } + /// Transform a Vector by the given Matrix using right-handed notation + /// The vector to transform + /// The desired transformation + public static Vector4 RightHandedTransform(Vector4 vec, Matrix4 mat) + { + Vector4 result; + RightHandedTransform(ref vec, ref mat, out result); + return result; + } + + /// Transform a Vector by the given Matrix using right-handed notation + /// The vector to transform + /// The desired transformation + /// The transformed vector + public static void RightHandedTransform(ref Vector4 vec, ref Matrix4 mat, out Vector4 result) + { + result = new OpenTK.Vector4( + mat.Row0.X * vec.X + mat.Row0.Y * vec.Y + mat.Row0.Z * vec.Z + mat.Row0.W * vec.W, + mat.Row1.X * vec.X + mat.Row1.Y * vec.Y + mat.Row1.Z * vec.Z + mat.Row1.W * vec.W, + mat.Row2.X * vec.X + mat.Row2.Y * vec.Y + mat.Row2.Z * vec.Z + mat.Row2.W * vec.W, + mat.Row3.X * vec.X + mat.Row3.Y * vec.Y + mat.Row3.Z * vec.Z + mat.Row3.W * vec.W); + } + #endregion #endregion @@ -1505,7 +1528,46 @@ namespace OpenTK vec.W *= scale.W; return vec; } - + + /// + /// Transform a Vector by the given Matrix. + /// + /// The vector to transform + /// The desired transformation + /// The transformed vector + public static Vector4 operator *(Vector4 vec, Matrix4 mat) + { + Vector4 result; + Vector4.Transform(ref vec, ref mat, out result); + return result; + } + + /// + /// Transform a Vector by the given Matrix using right-handed notation + /// + /// The vector to transform + /// The desired transformation + /// The transformed vector + public static Vector4 operator *(Matrix4 mat, Vector4 vec) + { + Vector4 result; + Vector4.RightHandedTransform(ref vec, ref mat, out result); + return result; + } + + /// + /// Transforms a vector by a quaternion rotation. + /// + /// The vector to transform. + /// The quaternion to rotate the vector by. + /// The transformed vector + public static Vector4 operator *(Quaternion quat, Vector4 vec) + { + Vector4 result; + Vector4.Transform(ref vec, ref quat, out result); + return result; + } + /// /// Divides an instance by a scalar. ///