diff options
| author | Bazzagibbs <bazzagibbsdev@gmail.com> | 2024-12-02 11:58:36 +1100 |
|---|---|---|
| committer | Bazzagibbs <bazzagibbsdev@gmail.com> | 2024-12-02 11:58:36 +1100 |
| commit | 4b76568596236e3a03047c39ebfe216403ef3737 (patch) | |
| tree | 7ec2bf3632a6452bf452208e56fe60ec0ef334d2 /core/math | |
| parent | 03a53ccce2ada65c3179328ddcb00bb2b990d3db (diff) | |
Add `linalg.clamp_length(vector, max_length) -> clamped_vector`
Diffstat (limited to 'core/math')
| -rw-r--r-- | core/math/linalg/general.odin | 12 |
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 |