summaryrefslogtreecommitdiff
path: root/glm/v3.ha
diff options
context:
space:
mode:
authorLassi Pulkkinen <lassi@pulk.fi>2024-10-31 03:11:21 +0200
committerLassi Pulkkinen <lassi@pulk.fi>2024-10-31 03:51:35 +0200
commitae44478b30d890fe0fb04022f44d474dcdcc3f9d (patch)
tree5f462459ae4b47d22114eed717d1382d08cf4dfe /glm/v3.ha
Initial commit (import old repo)HEADmain
Diffstat (limited to 'glm/v3.ha')
-rw-r--r--glm/v3.ha127
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;
+};