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/v4.ha |
Diffstat (limited to 'glm/v4.ha')
-rw-r--r-- | glm/v4.ha | 105 |
1 files changed, 105 insertions, 0 deletions
diff --git a/glm/v4.ha b/glm/v4.ha new file mode 100644 index 0000000..659be04 --- /dev/null +++ b/glm/v4.ha @@ -0,0 +1,105 @@ +use fmt; +use math; + +export fn v4_new(x: f32, y: f32, z: f32, w: f32) v4 = { + return [x, y, z, w]; +}; + +export fn v4_new_fill(x: f32) v4 = { + return [x, x, x, x]; +}; + +export fn v4_new_zero() v4 = { + return [0.0, 0.0, 0.0, 0.0]; +}; + +export fn v4_copy(v: *v4) v4 = { + return [v[0], v[1], v[2], v[3]]; +}; + +export fn v4_copy_to(v: *v4, dest: *v4) void = { + dest[0] = v[0]; + dest[1] = v[1]; + dest[2] = v[2]; + dest[3] = v[3]; +}; + +export fn v4_valptr(v: *v4) *const f32 = { + return &v[0]; +}; + +export fn v4_print(v: v4) void = { + fmt::printfln("[ {}, {}, {}, {} ]", v[0], v[1], v[2], v[3])!; +}; + +export fn v4_negate(v: *v4) void = { + v[0] *= -1.0; + v[1] *= -1.0; + v[2] *= -1.0; + v[3] *= -1.0; +}; + +export fn v4_negate_to(v: *v4, dest: *v4) void = { + dest[0] = v[0] * -1.0; + dest[1] = v[1] * -1.0; + dest[2] = v[2] * -1.0; + dest[3] = v[3] * -1.0; +}; + +export fn v4_add(a: *v4, b: *v4) v4 = { + return [ + a[0] + b[0], + a[1] + b[1], + a[2] + b[2], + a[3] + b[3], + ]; +}; + +export fn v4_sub(a: *v4, b: *v4) v4 = { + return [ + a[0] - b[0], + a[1] - b[1], + a[2] - b[2], + a[3] - b[3], + ]; +}; + +export fn v4_normalize(v: *v4) void = { + const norm = v4_norm(v); + + if (norm == 0.0) { + v[0] = 0.0; + v[1] = 0.0; + v[2] = 0.0; + v[3] = 0.0; + return; + }; + + v4_scale(v, 1.0 / norm); +}; + +export fn v4_dot(a: *v4, b: *v4) f32 = { + return a[0] * b[0] + a[1] * b[1] + a[2] * b[2] + a[3] * b[3]; +}; + +export fn v4_norm2(v: *v4) f32 = { + return v4_dot(v, v); +}; + +export fn v4_norm(v: *v4) f32 = { + return math::sqrtf64(v4_norm2(v)): f32; +}; + +export fn v4_scale(v: *v4, s: f32) void = { + v[0] = v[0] * s; + v[1] = v[1] * s; + v[2] = v[2] * s; + v[3] = v[3] * s; +}; + +export fn v4_scale_to(v: *v4, s: f32, dest: *v4) void = { + dest[0] = v[0] * s; + dest[1] = v[1] * s; + dest[2] = v[2] * s; + dest[3] = v[3] * s; +}; |