diff options
author | Aaron Franke <arnfranke@yahoo.com> | 2021-12-12 12:19:47 -0800 |
---|---|---|
committer | Aaron Franke <arnfranke@yahoo.com> | 2022-01-06 11:12:59 -0800 |
commit | 064036d7867a5ac180851aa60707478493182c5c (patch) | |
tree | c8e1f59b3c98703db707696040f978ecaf91ccda /core/math/vector2.h | |
parent | f5d281d55f1865945f573e9c11500ff1d73a0e27 (diff) | |
download | redot-engine-064036d7867a5ac180851aa60707478493182c5c.tar.gz |
Allow Vector2/3 slerp values to have any length
Diffstat (limited to 'core/math/vector2.h')
-rw-r--r-- | core/math/vector2.h | 15 |
1 files changed, 10 insertions, 5 deletions
diff --git a/core/math/vector2.h b/core/math/vector2.h index 493e0af27d..e45e011d64 100644 --- a/core/math/vector2.h +++ b/core/math/vector2.h @@ -261,11 +261,16 @@ Vector2 Vector2::lerp(const Vector2 &p_to, const real_t p_weight) const { } Vector2 Vector2::slerp(const Vector2 &p_to, const real_t p_weight) const { -#ifdef MATH_CHECKS - ERR_FAIL_COND_V_MSG(!is_normalized(), Vector2(), "The start Vector2 must be normalized."); -#endif - real_t theta = angle_to(p_to); - return rotated(theta * p_weight); + real_t start_length_sq = length_squared(); + real_t end_length_sq = p_to.length_squared(); + if (unlikely(start_length_sq == 0.0 || end_length_sq == 0.0)) { + // Zero length vectors have no angle, so the best we can do is either lerp or throw an error. + return lerp(p_to, p_weight); + } + real_t start_length = Math::sqrt(start_length_sq); + real_t result_length = Math::lerp(start_length, Math::sqrt(end_length_sq), p_weight); + real_t angle = angle_to(p_to); + return rotated(angle * p_weight) * (result_length / start_length); } Vector2 Vector2::direction_to(const Vector2 &p_to) const { |