aboutsummaryrefslogtreecommitdiff
path: root/core/math
diff options
context:
space:
mode:
authorBazzagibbs <bazzagibbsdev@gmail.com>2024-12-02 11:58:36 +1100
committerBazzagibbs <bazzagibbsdev@gmail.com>2024-12-02 11:58:36 +1100
commit4b76568596236e3a03047c39ebfe216403ef3737 (patch)
tree7ec2bf3632a6452bf452208e56fe60ec0ef334d2 /core/math
parent03a53ccce2ada65c3179328ddcb00bb2b990d3db (diff)
Add `linalg.clamp_length(vector, max_length) -> clamped_vector`
Diffstat (limited to 'core/math')
-rw-r--r--core/math/linalg/general.odin12
1 files changed, 12 insertions, 0 deletions
diff --git a/core/math/linalg/general.odin b/core/math/linalg/general.odin
index f82d75bff..8c4f2954a 100644
--- a/core/math/linalg/general.odin
+++ b/core/math/linalg/general.odin
@@ -167,6 +167,18 @@ vector_triple_product :: proc "contextless" (a, b, c: $T/[$N]$E) -> T where IS_N
length :: proc{vector_length, quaternion_length}
length2 :: proc{vector_length2, quaternion_length2}
+
+@(require_results)
+clamp_length :: proc "contextless" (v: $T/[$N]$E, a: E) -> T where IS_FLOAT(E) {
+ if a <= 0 {
+ return 0
+ }
+
+ m2 := length2(v)
+ return v if (m2 <= a*a) else (v / sqrt(m2) * a) // returns original when m2 is 0
+}
+
+
@(require_results)
projection :: proc "contextless" (x, normal: $T/[$N]$E) -> T where IS_NUMERIC(E) {
return dot(x, normal) / dot(normal, normal) * normal