diff options
author | Lassi Pulkkinen <lassi@pulk.fi> | 2024-10-31 03:11:21 +0200 |
---|---|---|
committer | Lassi Pulkkinen <lassi@pulk.fi> | 2024-10-31 03:51:35 +0200 |
commit | ae44478b30d890fe0fb04022f44d474dcdcc3f9d (patch) | |
tree | 5f462459ae4b47d22114eed717d1382d08cf4dfe /glm/v3.ha |
Diffstat (limited to 'glm/v3.ha')
-rw-r--r-- | glm/v3.ha | 127 |
1 files changed, 127 insertions, 0 deletions
diff --git a/glm/v3.ha b/glm/v3.ha new file mode 100644 index 0000000..e7f1a8e --- /dev/null +++ b/glm/v3.ha @@ -0,0 +1,127 @@ +use fmt; +use math; + +export def V3_ZERO: v3 = [0.0, 0.0, 0.0]; +export def V3_ONE: v3 = [1.0, 1.0, 1.0]; + +export fn v3_new(x: f32, y: f32, z: f32) v3 = { + return [x, y, z]; +}; + +export fn v3_new_fill(x: f32) v3 = { + return [x, x, x]; +}; + +export fn v3_new_zero() v3 = { + return [0.0, 0.0, 0.0]; +}; + +export fn v3_copy(v: *v3) v3 = { + return [v[0], v[1], v[2]]; +}; + +export fn v3_copy_to(v: *v3, dest: *v3) void = { + dest[0] = v[0]; + dest[1] = v[1]; + dest[2] = v[2]; +}; + +export fn v3_valptr(v: *v3) *const f32 = { + return &v[0]; +}; + +export fn v3_print(v: *v3) void = { + fmt::printfln("[ {}, {}, {} ]", v[0], v[1], v[2])!; +}; + +export fn v3_negate(v: *v3) void = { + v[0] *= -1.0; + v[1] *= -1.0; + v[2] *= -1.0; +}; + +export fn v3_negate_to(v: *v3, dest: *v3) void = { + dest[0] = v[0] * -1.0; + dest[1] = v[1] * -1.0; + dest[2] = v[2] * -1.0; +}; + +export fn v3_add(a: *v3, b: *v3) v3 = { + return [ + a[0] + b[0], + a[1] + b[1], + a[2] + b[2], + ]; +}; + +export fn v3_sub(a: *v3, b: *v3) v3 = { + return [ + a[0] - b[0], + a[1] - b[1], + a[2] - b[2], + ]; +}; + +export fn v3_normalize(v: *v3) void = { + const norm = v3_norm(v); + + if (norm == 0.0) { + v[0] = 0.0; + v[1] = 0.0; + v[2] = 0.0; + return; + }; + + v3_scale(v, 1.0 / norm); +}; + +export fn v3_normalize_to(v: *v3, dest: *v3) void = { + const norm = v3_norm(v); + + if (norm == 0.0) { + dest[0] = 0.0; + dest[1] = 0.0; + dest[2] = 0.0; + return; + }; + + v3_scale_to(v, 1.0 / norm, dest); +}; + +export fn v3_dot(a: *v3, b: *v3) f32 = { + return a[0] * b[0] + a[1] * b[1] + a[2] * b[2]; +}; + +export fn v3_norm2(v: *v3) f32 = { + return v3_dot(v, v); +}; + +export fn v3_norm(v: *v3) f32 = { + return math::sqrtf64(v3_norm2(v)): f32; +}; + +export fn v3_scale(v: *v3, s: f32) void = { + v[0] = v[0] * s; + v[1] = v[1] * s; + v[2] = v[2] * s; +}; + +export fn v3_scale_to(v: *v3, s: f32, dest: *v3) void = { + dest[0] = v[0] * s; + dest[1] = v[1] * s; + dest[2] = v[2] * s; +}; + +export fn v3_cross(a: *v3, b: *v3) v3 = { + return [ + a[1] * b[2] - a[2] * b[1], + a[2] * b[0] - a[0] * b[2], + a[0] * b[1] - a[1] * b[0], + ]; +}; + +export fn v3_crossn(a: *v3, b: *v3) v3 = { + let res = v3_cross(a, b); + v3_normalize(&res); + return res; +}; |