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