Merge branch 'cpp-clamp-length' of https://github.com/PrecisionRender/FlaxEngine into PrecisionRender-cpp-clamp-length

This commit is contained in:
Wojtek Figat
2023-04-16 19:42:55 +02:00

View File

@@ -566,6 +566,58 @@ public:
result = Vector3Base(Math::Clamp(v.X, min.X, max.X), Math::Clamp(v.Y, min.Y, max.Y), Math::Clamp(v.Z, min.Z, max.Z));
}
/// <summary>
/// Makes sure that Length of the output vector is always below max and above 0.
/// </summary>
/// <param name="vector">Input Vector.</param>
/// <param name="max">Max Length</param>
static Vector3Base ClampLength(const Vector3Base& v, float max)
{
return ClampLength(v, 0, max);
}
/// <summary>
/// Makes sure that Length of the output vector is always below max and above min.
/// </summary>
/// <param name="vector">Input Vector.</param>
/// <param name="min">Min Length</param>
/// <param name="max">Max Length</param>
static Vector3Base ClampLength(const Vector3Base& v, float min, float max)
{
Vector3Base result;
ClampLength(v, min, max, result);
return result;
}
/// <summary>
/// Makes sure that Length of the output vector is always below max and above min.
/// </summary>
/// <param name="vector">Input Vector.</param>
/// <param name="min">Min Length</param>
/// <param name="max">Max Length</param>
/// <param name="result">The result vector.</param>
static void ClampLength(const Vector3Base& v, float min, float max, Vector3Base& result)
{
result.X = v.X;
result.Y = v.Y;
result.Z = v.Z;
auto lenSq = result.LengthSquared();
if (lenSq > max * max)
{
auto scaleFactor = max / (float)Math::Sqrt(lenSq);
result.X *= scaleFactor;
result.Y *= scaleFactor;
result.Z *= scaleFactor;
}
if (lenSq < min * min)
{
auto scaleFactor = min / (float)Math::Sqrt(lenSq);
result.X *= scaleFactor;
result.Y *= scaleFactor;
result.Z *= scaleFactor;
}
}
// Calculates the distance between two vectors
// @param a The first vector
// @param b The second vector