diff --git a/Source/OpenTK/Math/Vector2.cs b/Source/OpenTK/Math/Vector2.cs
index 8cdf6c64..da775bae 100644
--- a/Source/OpenTK/Math/Vector2.cs
+++ b/Source/OpenTK/Math/Vector2.cs
@@ -17,16 +17,22 @@ namespace OpenTK.Math
[StructLayout(LayoutKind.Sequential)]
public struct Vector2
{
+ #region Fields
+
///
- /// The X coordinate of the Vector2.
+ /// The X component of the Vector2.
///
public float X;
///
- /// The Y coordinate of the Vector2.
+ /// The Y component of the Vector2.
///
public float Y;
+ #endregion
+
+ #region Constructors
+
///
/// Constructs a new Vector2.
///
@@ -38,6 +44,10 @@ namespace OpenTK.Math
Y = y;
}
+ #endregion
+
+ #region Add
+
///
/// Adds the given Vector2 to the current Vector2.
///
@@ -68,6 +78,10 @@ namespace OpenTK.Math
return new Vector4(X + right.X, Y + right.Y, right.Z, right.W);
}
+ #endregion
+
+ #region Sub
+
///
/// Subtracts the given Vector2 from the current Vector2.
///
@@ -98,8 +112,12 @@ namespace OpenTK.Math
return new Vector4(X - right.X, Y - right.Y, -right.Z, -right.W);
}
+ #endregion
+
+ #region Dot
+
///
- /// Computes the dot product between the curren Vector2 and the given Vector2.
+ /// Computes the dot product between the current Vector2 and the given Vector2.
///
/// The right operand of the dot product.
/// A float containing the result of the dot product.
@@ -109,7 +127,7 @@ namespace OpenTK.Math
}
///
- /// Computes the dot product between the curren Vector2 and the given Vector3.
+ /// Computes the dot product between the current Vector2 and the given Vector3.
///
/// The right operand of the dot product.
/// A float containing the result of the dot product.
@@ -119,7 +137,7 @@ namespace OpenTK.Math
}
///
- /// Computes the dot product between the curren Vector2 and the given Vector4.
+ /// Computes the dot product between the current Vector2 and the given Vector4.
///
/// The right operand of the dot product.
/// A float containing the result of the dot product.
@@ -128,6 +146,10 @@ namespace OpenTK.Math
return X * right.X + Y * right.Y;
}
+ #endregion
+
+ #region Operator overloads
+
public static Vector2 operator +(Vector2 left, Vector2 right)
{
return left.Add(right);
@@ -157,5 +179,13 @@ namespace OpenTK.Math
{
return left.Sub(right);
}
+
+ [CLSCompliant(false)]
+ unsafe public static implicit operator float*(Vector2 v)
+ {
+ return &v.X;
+ }
+
+ #endregion
}
}
diff --git a/Source/OpenTK/Math/Vector3.cs b/Source/OpenTK/Math/Vector3.cs
index 8483993f..e130058f 100644
--- a/Source/OpenTK/Math/Vector3.cs
+++ b/Source/OpenTK/Math/Vector3.cs
@@ -11,16 +11,238 @@ using System.Runtime.InteropServices;
namespace OpenTK.Math
{
+ ///
+ /// Represents a three-dimensional vector.
+ ///
[StructLayout(LayoutKind.Sequential)]
public struct Vector3
{
- public float X, Y, Z;
+ #region Fields
+ ///
+ /// The X component of the Vector3.
+ ///
+ public float X;
+
+ ///
+ /// The Y component of the Vector3.
+ ///
+ public float Y;
+
+ ///
+ /// The Z component of the Vector3.
+ ///
+ public float Z;
+
+ #endregion
+
+ #region Constructors
+
+ ///
+ /// Constructs a new Vector3.
+ ///
+ /// The x component of the Vector3.
+ /// The y component of the Vector3.
+ /// The z component of the Vector3.
public Vector3(float x, float y, float z)
{
X = x;
Y = y;
Z = z;
}
+
+ ///
+ /// Constructs a new Vector3 from the given Vector2.
+ ///
+ /// The Vector2 to copy components from.
+ public Vector3(Vector2 v)
+ {
+ X = v.X;
+ Y = v.Y;
+ Z = 0.0f;
+ }
+
+ ///
+ /// Constructs a new Vector3 from the given Vector3.
+ ///
+ /// The Vector3 to copy components from.
+ public Vector3(Vector3 v)
+ {
+ X = v.X;
+ Y = v.Y;
+ Z = v.Z;
+ }
+
+ ///
+ /// Constructs a new Vector3 from the given Vector4.
+ ///
+ /// The Vector4 to copy components from.
+ public Vector3(Vector4 v)
+ {
+ X = v.X;
+ Y = v.Y;
+ Z = v.Z;
+ }
+
+ #endregion
+
+ #region Add
+
+ ///
+ /// Adds the given Vector2 to the current Vector3. Z-coordinate remains unaffected.
+ ///
+ /// The right operand of the addition.
+ /// A new Vector3 containing the result of the addition.
+ public Vector3 Add(Vector2 right)
+ {
+ return new Vector3(X + right.X, Y + right.Y, Z);
+ }
+
+ ///
+ /// Adds the given Vector3 to the current Vector3.
+ ///
+ /// The right operand of the addition.
+ /// A new Vector3 containing the result of the addition.
+ public Vector3 Add(Vector3 right)
+ {
+ return new Vector3(X + right.X, Y + right.Y, Z + right.Z);
+ }
+
+ ///
+ /// Adds the given Vector4 to the current Vector3. W-coordinate remains unaffected.
+ ///
+ /// The right operand of the addition.
+ /// A new Vector4 containing the result of the addition.
+ public Vector4 Add(Vector4 right)
+ {
+ return new Vector4(X + right.X, Y + right.Y, Z + right.Z, right.W);
+ }
+
+ #endregion
+
+ #region Sub
+
+ ///
+ /// Subtracts the given Vector2 from the current Vector3. Z component remains unaffected.
+ ///
+ /// The right operand of the subtraction.
+ /// A new Vector3 containing the result of the subtraction.
+ public Vector3 Sub(Vector2 right)
+ {
+ return new Vector3(X - right.X, Y - right.Y, Z);
+ }
+
+ ///
+ /// Subtracts the given Vector3 from the current Vector3.
+ ///
+ /// The right operand of the subtraction.
+ /// A new Vector3 containing the result of the subtraction.
+ public Vector3 Sub(Vector3 right)
+ {
+ return new Vector3(X - right.X, Y - right.Y, Z - right.Z);
+ }
+
+ ///
+ /// Subtracts the given Vector4 from the current Vector3.
+ ///
+ /// The right operand of the subtraction.
+ /// A new Vector4 containing the result of the subtraction.
+ public Vector4 Sub(Vector4 right)
+ {
+ return new Vector4(X - right.X, Y - right.Y, Z - right.Z, -right.W);
+ }
+
+ #endregion
+
+ #region Dot
+
+ ///
+ /// Computes the dot product between the current Vector3 and the given Vector2.
+ ///
+ /// The right operand of the dot product.
+ /// A float containing the result of the dot product.
+ public float Dot(Vector2 right)
+ {
+ return X * right.X + Y * right.Y;
+ }
+
+ ///
+ /// Computes the dot product between the current Vector3 and the given Vector3.
+ ///
+ /// The right operand of the dot product.
+ /// A float containing the result of the dot product.
+ public float Dot(Vector3 right)
+ {
+ return X * right.X + Y * right.Y + Z * right.Z;
+ }
+
+ ///
+ /// Computes the dot product between the current Vector3 and the given Vector4.
+ ///
+ /// The right operand of the dot product.
+ /// A float containing the result of the dot product.
+ public float Dot(Vector4 right)
+ {
+ return X * right.X + Y * right.Y + Z * right.Z;
+ }
+
+ #endregion
+
+ #region Cross
+
+ ///
+ /// Computes the cross product between the current and the given Vector3.
+ ///
+ /// The right operand of the cross product
+ /// A new Vector3 containing the result of the computation.
+ public Vector3 Cross(Vector3 right)
+ {
+ return new Vector3(
+ Y * right.Z - Z * right.Y,
+ Z * right.X - X * right.Z,
+ X * right.Y - Y * right.X);
+ }
+
+ #endregion
+
+ #region Operator overloads
+
+ public static Vector3 operator +(Vector3 left, Vector2 right)
+ {
+ return left.Add(right);
+ }
+
+ public static Vector3 operator +(Vector3 left, Vector3 right)
+ {
+ return left.Add(right);
+ }
+
+ public static Vector4 operator +(Vector3 left, Vector4 right)
+ {
+ return left.Add(right);
+ }
+
+ public static Vector3 operator -(Vector3 left, Vector2 right)
+ {
+ return left.Sub(right);
+ }
+
+ public static Vector3 operator -(Vector3 left, Vector3 right)
+ {
+ return left.Sub(right);
+ }
+
+ public static Vector4 operator -(Vector3 left, Vector4 right)
+ {
+ return left.Sub(right);
+ }
+
+ [CLSCompliant(false)]
+ unsafe public static implicit operator float*(Vector3 v)
+ {
+ return &v.X;
+ }
+
+ #endregion
}
}