summaryrefslogtreecommitdiff
path: root/glm/m4.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/m4.ha
Initial commit (import old repo)HEADmain
Diffstat (limited to 'glm/m4.ha')
-rw-r--r--glm/m4.ha105
1 files changed, 105 insertions, 0 deletions
diff --git a/glm/m4.ha b/glm/m4.ha
new file mode 100644
index 0000000..6b283e2
--- /dev/null
+++ b/glm/m4.ha
@@ -0,0 +1,105 @@
+use fmt;
+use rt;
+
+export def M4_IDENT: m4 = [
+ [1.0, 0.0, 0.0, 0.0],
+ [0.0, 1.0, 0.0, 0.0],
+ [0.0, 0.0, 1.0, 0.0],
+ [0.0, 0.0, 0.0, 1.0],
+];
+
+export def M4_ZERO: m4 = [
+ [0.0, 0.0, 0.0, 0.0],
+ [0.0, 0.0, 0.0, 0.0],
+ [0.0, 0.0, 0.0, 0.0],
+ [0.0, 0.0, 0.0, 0.0],
+];
+
+export fn m4_new(diag: f32) m4 = {
+ return [
+ [diag, 0.0, 0.0, 0.0],
+ [0.0, diag, 0.0, 0.0],
+ [0.0, 0.0, diag, 0.0],
+ [0.0, 0.0, 0.0, diag],
+ ];
+};
+
+export fn m4_new_ident() m4 = {
+ return m4_new(1.0);
+};
+
+export fn m4_new_zero() m4 = {
+ return m4_new(0.0);
+};
+
+export fn m4_valptr(m: *m4) *const f32 = {
+ return &m[0][0];
+};
+
+export fn m4_print(m: *m4) void = {
+ fmt::printfln("[ {}, {}, {}, {}, ", m[0][0], m[1][0], m[2][0], m[3][0])!;
+ fmt::printfln(" {}, {}, {}, {}, ", m[0][1], m[1][1], m[2][1], m[3][1])!;
+ fmt::printfln(" {}, {}, {}, {}, ", m[0][2], m[1][2], m[2][2], m[3][2])!;
+ fmt::printfln(" {}, {}, {}, {} ]", m[0][3], m[1][3], m[2][3], m[3][3])!;
+};
+
+export fn m4_set_ident(m: *m4) *m4 = {
+ m4_set_zero(m);
+ m[0][0] = 1.0;
+ m[1][1] = 1.0;
+ m[2][2] = 1.0;
+ m[3][3] = 1.0;
+ return m;
+};
+
+export fn m4_set_zero(m: *m4) *m4 = {
+ rt::memset(m, 0, 4 * 4 * 4);
+ return m;
+};
+
+export fn m4_col(m: *m4, col: int) *v4 = {
+ return (&m[col]: *[4]f32): *v4;
+};
+
+export fn m4_mul_to(a: *m4, b: *m4, dest: *m4) void = {
+ const a = *a;
+ const b = *b;
+ dest[0][0] = a[0][0] * b[0][0] + a[1][0] * b[0][1] +
+ a[2][0] * b[0][2] + a[3][0] * b[0][3];
+ dest[0][1] = a[0][1] * b[0][0] + a[1][1] * b[0][1] +
+ a[2][1] * b[0][2] + a[3][1] * b[0][3];
+ dest[0][2] = a[0][2] * b[0][0] + a[1][2] * b[0][1] +
+ a[2][2] * b[0][2] + a[3][2] * b[0][3];
+ dest[0][3] = a[0][3] * b[0][0] + a[1][3] * b[0][1] +
+ a[2][3] * b[0][2] + a[3][3] * b[0][3];
+ dest[1][0] = a[0][0] * b[1][0] + a[1][0] * b[1][1] +
+ a[2][0] * b[1][2] + a[3][0] * b[1][3];
+ dest[1][1] = a[0][1] * b[1][0] + a[1][1] * b[1][1] +
+ a[2][1] * b[1][2] + a[3][1] * b[1][3];
+ dest[1][2] = a[0][2] * b[1][0] + a[1][2] * b[1][1] +
+ a[2][2] * b[1][2] + a[3][2] * b[1][3];
+ dest[1][3] = a[0][3] * b[1][0] + a[1][3] * b[1][1] +
+ a[2][3] * b[1][2] + a[3][3] * b[1][3];
+ dest[2][0] = a[0][0] * b[2][0] + a[1][0] * b[2][1] +
+ a[2][0] * b[2][2] + a[3][0] * b[2][3];
+ dest[2][1] = a[0][1] * b[2][0] + a[1][1] * b[2][1] +
+ a[2][1] * b[2][2] + a[3][1] * b[2][3];
+ dest[2][2] = a[0][2] * b[2][0] + a[1][2] * b[2][1] +
+ a[2][2] * b[2][2] + a[3][2] * b[2][3];
+ dest[2][3] = a[0][3] * b[2][0] + a[1][3] * b[2][1] +
+ a[2][3] * b[2][2] + a[3][3] * b[2][3];
+ dest[3][0] = a[0][0] * b[3][0] + a[1][0] * b[3][1] +
+ a[2][0] * b[3][2] + a[3][0] * b[3][3];
+ dest[3][1] = a[0][1] * b[3][0] + a[1][1] * b[3][1] +
+ a[2][1] * b[3][2] + a[3][1] * b[3][3];
+ dest[3][2] = a[0][2] * b[3][0] + a[1][2] * b[3][1] +
+ a[2][2] * b[3][2] + a[3][2] * b[3][3];
+ dest[3][3] = a[0][3] * b[3][0] + a[1][3] * b[3][1] +
+ a[2][3] * b[3][2] + a[3][3] * b[3][3];
+};
+
+export fn m4_mul(a: *m4, b: *m4) m4 = {
+ let res = m4_new_zero();
+ m4_mul_to(a, b, &res);
+ return res;
+};