summaryrefslogtreecommitdiffstats
path: root/core/math/vector2.h
diff options
context:
space:
mode:
authorAaron Franke <arnfranke@yahoo.com>2021-12-12 12:19:47 -0800
committerAaron Franke <arnfranke@yahoo.com>2022-01-06 11:12:59 -0800
commit064036d7867a5ac180851aa60707478493182c5c (patch)
treec8e1f59b3c98703db707696040f978ecaf91ccda /core/math/vector2.h
parentf5d281d55f1865945f573e9c11500ff1d73a0e27 (diff)
downloadredot-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.h15
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 {