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