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.
///