From ae44478b30d890fe0fb04022f44d474dcdcc3f9d Mon Sep 17 00:00:00 2001 From: Lassi Pulkkinen Date: Thu, 31 Oct 2024 03:11:21 +0200 Subject: Initial commit (import old repo) --- glm/v3.ha | 127 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 127 insertions(+) create mode 100644 glm/v3.ha (limited to 'glm/v3.ha') 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; +}; -- cgit v1.2.3