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 } }