From b133539c40968def153125f7d27e0789b110b8ba Mon Sep 17 00:00:00 2001 From: Nejcraft Date: Sat, 20 Feb 2021 16:24:48 +0100 Subject: [PATCH 1/3] Add Vector3 Clamp --- Source/Engine/Core/Math/Vector3.cs | 36 +++++++++++++++++++++++++++++- 1 file changed, 35 insertions(+), 1 deletion(-) diff --git a/Source/Engine/Core/Math/Vector3.cs b/Source/Engine/Core/Math/Vector3.cs index a57fcb224..22dc1c84f 100644 --- a/Source/Engine/Core/Math/Vector3.cs +++ b/Source/Engine/Core/Math/Vector3.cs @@ -983,7 +983,41 @@ namespace FlaxEngine value.Normalize(); return value; } - + + /// + /// Makes sure that Length of the output vector is always below max and above 0. + /// + /// Input Vector. + /// Max Length + public static Vector3 ClampLength(Vector3 vector, float max) + { + return ClampLength(vector, 0, max); + } + /// + /// Makes sure that Length of the output vector is always below max and above min. + /// + /// Input Vector. + /// Min Length + /// Max Length + public static Vector3 ClampLength(Vector3 vector, float min, float max) + { + Vector3 retVect = new Vector3(vector.X, vector.Y, vector.Z); + if (retVect.LengthSquared > max * max) + { + float scaleFactor = max / (float)Math.Sqrt(retVect.LengthSquared); + retVect.X = retVect.X * scaleFactor; + retVect.Y = retVect.Y * scaleFactor; + retVect.Z = retVect.Z * scaleFactor; + } + if (retVect.LengthSquared < min * min) + { + float scaleFactor = min / (float)Math.Sqrt(retVect.LengthSquared); + retVect.X = retVect.X * scaleFactor; + retVect.Y = retVect.Y * scaleFactor; + retVect.Z = retVect.Z * scaleFactor; + } + return retVect; + } /// /// Performs a linear interpolation between two vectors. /// From 5d7940f784b98d8f6c156d979d9165af9727c80f Mon Sep 17 00:00:00 2001 From: Nejcraft Date: Wed, 24 Feb 2021 14:25:49 +0100 Subject: [PATCH 2/3] Unified --- Source/Engine/Core/Math/Vector3.cs | 34 ++++++++++++++++++++---------- 1 file changed, 23 insertions(+), 11 deletions(-) diff --git a/Source/Engine/Core/Math/Vector3.cs b/Source/Engine/Core/Math/Vector3.cs index 22dc1c84f..be885590a 100644 --- a/Source/Engine/Core/Math/Vector3.cs +++ b/Source/Engine/Core/Math/Vector3.cs @@ -1001,20 +1001,32 @@ namespace FlaxEngine /// Max Length public static Vector3 ClampLength(Vector3 vector, float min, float max) { - Vector3 retVect = new Vector3(vector.X, vector.Y, vector.Z); - if (retVect.LengthSquared > max * max) + ClampLength(vector, min, max, out Vector3 retVect); + return retVect; + } + /// + /// Makes sure that Length of the output vector is always below max and above min. + /// + /// Input Vector. + /// Min Length + /// Max Length + /// The Return Vector + public static void ClampLength(Vector3 vector, float min, float max, out Vector3 retVect) + { + float lenSq = vector.LengthSquared; + if (lenSq > max * max) { - float scaleFactor = max / (float)Math.Sqrt(retVect.LengthSquared); - retVect.X = retVect.X * scaleFactor; - retVect.Y = retVect.Y * scaleFactor; - retVect.Z = retVect.Z * scaleFactor; + float scaleFactor = max / (float)Math.Sqrt(lenSq); + retVect.X = vector.X * scaleFactor; + retVect.Y = vector.Y * scaleFactor; + retVect.Z = vector.Z * scaleFactor; } - if (retVect.LengthSquared < min * min) + if (lenSq < min * min) { - float scaleFactor = min / (float)Math.Sqrt(retVect.LengthSquared); - retVect.X = retVect.X * scaleFactor; - retVect.Y = retVect.Y * scaleFactor; - retVect.Z = retVect.Z * scaleFactor; + float scaleFactor = min / (float)Math.Sqrt(lenSq); + retVect.X = vector.X * scaleFactor; + retVect.Y = vector.Y * scaleFactor; + retVect.Z = vector.Z * scaleFactor; } return retVect; } From 84015f78fced14436c09a3c70b5abb50b394e477 Mon Sep 17 00:00:00 2001 From: Nejcraft Date: Wed, 24 Feb 2021 14:28:46 +0100 Subject: [PATCH 3/3] Ported Vecctor3 ClampLength to others and remade it using refs --- Source/Engine/Core/Math/Vector2.cs | 48 ++++++++++++++++++++++++++- Source/Engine/Core/Math/Vector3.cs | 23 +++++++------ Source/Engine/Core/Math/Vector4.cs | 52 ++++++++++++++++++++++++++++++ 3 files changed, 112 insertions(+), 11 deletions(-) diff --git a/Source/Engine/Core/Math/Vector2.cs b/Source/Engine/Core/Math/Vector2.cs index 768007180..e34ccc2cf 100644 --- a/Source/Engine/Core/Math/Vector2.cs +++ b/Source/Engine/Core/Math/Vector2.cs @@ -834,7 +834,53 @@ namespace FlaxEngine value.Normalize(); return value; } - + + /// + /// Makes sure that Length of the output vector is always below max and above 0. + /// + /// Input Vector. + /// Max Length + public static Vector2 ClampLength(Vector2 vector, float max) + { + return ClampLength(vector, 0, max); + } + /// + /// Makes sure that Length of the output vector is always below max and above min. + /// + /// Input Vector. + /// Min Length + /// Max Length + public static Vector2 ClampLength(Vector2 vector, float min, float max) + { + ClampLength(ref vector, min, max, out Vector2 retVect); + return retVect; + } + /// + /// Makes sure that Length of the output vector is always below max and above min. + /// + /// Input Vector. + /// Min Length + /// Max Length + /// The Return Vector + public static void ClampLength(ref Vector2 vector, float min, float max, out Vector2 retVect) + { + retVect.X = vector.X; + retVect.Y = vector.Y; + + float lenSq = retVect.LengthSquared; + if (lenSq > max * max) + { + float scaleFactor = max / (float)Math.Sqrt(lenSq); + retVect.X = retVect.X * scaleFactor; + retVect.Y = retVect.Y * scaleFactor; + } + if (lenSq < min * min) + { + float scaleFactor = min / (float)Math.Sqrt(lenSq); + retVect.X = retVect.X * scaleFactor; + retVect.Y = retVect.Y * scaleFactor; + } + } /// /// Returns the vector with components rounded to the nearest integer. /// diff --git a/Source/Engine/Core/Math/Vector3.cs b/Source/Engine/Core/Math/Vector3.cs index be885590a..bbd644f98 100644 --- a/Source/Engine/Core/Math/Vector3.cs +++ b/Source/Engine/Core/Math/Vector3.cs @@ -1001,7 +1001,7 @@ namespace FlaxEngine /// Max Length public static Vector3 ClampLength(Vector3 vector, float min, float max) { - ClampLength(vector, min, max, out Vector3 retVect); + ClampLength(ref vector, min, max, out Vector3 retVect); return retVect; } /// @@ -1011,24 +1011,27 @@ namespace FlaxEngine /// Min Length /// Max Length /// The Return Vector - public static void ClampLength(Vector3 vector, float min, float max, out Vector3 retVect) + public static void ClampLength(ref Vector3 vector, float min, float max, out Vector3 retVect) { - float lenSq = vector.LengthSquared; + retVect.X = vector.X; + retVect.Y = vector.Y; + retVect.Z = vector.Z; + + float lenSq = retVect.LengthSquared; if (lenSq > max * max) { float scaleFactor = max / (float)Math.Sqrt(lenSq); - retVect.X = vector.X * scaleFactor; - retVect.Y = vector.Y * scaleFactor; - retVect.Z = vector.Z * scaleFactor; + retVect.X = retVect.X * scaleFactor; + retVect.Y = retVect.Y * scaleFactor; + retVect.Z = retVect.Z * scaleFactor; } if (lenSq < min * min) { float scaleFactor = min / (float)Math.Sqrt(lenSq); - retVect.X = vector.X * scaleFactor; - retVect.Y = vector.Y * scaleFactor; - retVect.Z = vector.Z * scaleFactor; + retVect.X = retVect.X * scaleFactor; + retVect.Y = retVect.Y * scaleFactor; + retVect.Z = retVect.Z * scaleFactor; } - return retVect; } /// /// Performs a linear interpolation between two vectors. diff --git a/Source/Engine/Core/Math/Vector4.cs b/Source/Engine/Core/Math/Vector4.cs index 8fc7ca298..cc86164c4 100644 --- a/Source/Engine/Core/Math/Vector4.cs +++ b/Source/Engine/Core/Math/Vector4.cs @@ -794,6 +794,58 @@ namespace FlaxEngine return value; } + /// + /// Makes sure that Length of the output vector is always below max and above 0. + /// + /// Input Vector. + /// Max Length + public static Vector4 ClampLength(Vector4 vector, float max) + { + return ClampLength(vector, 0, max); + } + /// + /// Makes sure that Length of the output vector is always below max and above min. + /// + /// Input Vector. + /// Min Length + /// Max Length + public static Vector4 ClampLength(Vector4 vector, float min, float max) + { + ClampLength(ref vector, min, max, out Vector4 retVect); + return retVect; + } + /// + /// Makes sure that Length of the output vector is always below max and above min. + /// + /// Input Vector. + /// Min Length + /// Max Length + /// The Return Vector + public static void ClampLength(ref Vector4 vector, float min, float max, out Vector4 retVect) + { + retVect.X = vector.X; + retVect.Y = vector.Y; + retVect.Z = vector.Z; + retVect.W = vector.W; + + float lenSq = retVect.LengthSquared; + if (lenSq > max * max) + { + float scaleFactor = max / (float)Math.Sqrt(lenSq); + retVect.X = retVect.X * scaleFactor; + retVect.Y = retVect.Y * scaleFactor; + retVect.Z = retVect.Z * scaleFactor; + retVect.W = retVect.W * scaleFactor; + } + if (lenSq < min * min) + { + float scaleFactor = min / (float)Math.Sqrt(lenSq); + retVect.X = retVect.X * scaleFactor; + retVect.Y = retVect.Y * scaleFactor; + retVect.Z = retVect.Z * scaleFactor; + retVect.W = retVect.W * scaleFactor; + } + } /// /// Performs a linear interpolation between two vectors. ///