Improve navigation to use new dynamically allocated mul_mat_mat() result
authorNick Downing <nick@ndcode.org>
Tue, 19 Apr 2022 06:30:28 +0000 (16:30 +1000)
committerNick Downing <nick@ndcode.org>
Tue, 19 Apr 2022 06:30:28 +0000 (16:30 +1000)
render.c

index 260bec0..a7dbdf8 100644 (file)
--- a/render.c
+++ b/render.c
@@ -37,6 +37,7 @@ void print_mat(const char *prefix, struct array *array, const char *suffix) {
   printf("]%s", suffix);
 }
 
+
 // compute C = A B
 struct array *mul_mat_mat(const struct array *A, const struct array *B) {
   assert(A->n_dims == 3);
@@ -77,12 +78,9 @@ struct array *mul_mat_vec(const struct array *A, const struct array *b) {
   return c;
 }
 
-void rotate(const float (*v)[4], struct array *transform) {
-  struct array *t0 = array_new3_init(4, 4, sizeof(float), v);
-  struct array *t1 = mul_mat_mat(t0, transform);
-  array_set0(transform, array_index0(t1));
-  array_free(t1);
-  array_free(t0);
+void replace_array(struct array **p, struct array *q) {
+  array_free(*p);
+  *p = q;
 }
 
 int main(void) {
@@ -245,6 +243,74 @@ int main(void) {
   );
   print_mat("model_translate\n", model_translate, "\n");
 
+  // rotation matrices for navigation
+  struct array *rotate_xy_5deg = array_new3_init(
+    4,
+    4,
+    sizeof(float),
+    (float[4][4]){
+      {COS_5DEG, SIN_5DEG, 0.f, 0.f},
+      {-SIN_5DEG, COS_5DEG, 0.f, 0.f},
+      {0.f, 0.f, 1.f, 0.f},
+      {0.f, 0.f, 0.f, 1.f}
+    }
+  );
+  struct array *rotate_xy_m5deg = array_new3_init(
+    4,
+    4,
+    sizeof(float),
+    (float[4][4]){
+      {COS_5DEG, -SIN_5DEG, 0.f, 0.f},
+      {SIN_5DEG, COS_5DEG, 0.f, 0.f},
+      {0.f, 0.f, 1.f, 0.f},
+      {0.f, 0.f, 0.f, 1.f}
+    }
+  );
+  struct array *rotate_xz_5deg = array_new3_init(
+    4,
+    4,
+    sizeof(float),
+    (float[4][4]){
+      {COS_5DEG, 0.f, SIN_5DEG, 0.f},
+      {0.f, 1.f, 0.f, 0.f},
+      {-SIN_5DEG, 0.f, COS_5DEG, 0.f},
+      {0.f, 0.f, 0.f, 1.f}
+    }
+  );
+  struct array *rotate_xz_m5deg = array_new3_init(
+    4,
+    4,
+    sizeof(float),
+    (float[4][4]){
+      {COS_5DEG, 0.f, -SIN_5DEG, 0.f},
+      {0.f, 1.f, 0.f, 0.f},
+      {SIN_5DEG, 0.f, COS_5DEG, 0.f},
+      {0.f, 0.f, 0.f, 1.f}
+    }
+  );
+  struct array *rotate_yz_5deg = array_new3_init(
+    4,
+    4,
+    sizeof(float),
+    (float[4][4]){
+      {1.f, 0.f, 0.f, 0.f},
+      {0.f, COS_5DEG, -SIN_5DEG, 0.f},
+      {0.f, SIN_5DEG, COS_5DEG, 0.f},
+      {0.f, 0.f, 0.f, 1.f}
+    }
+  );
+  struct array *rotate_yz_m5deg = array_new3_init(
+    4,
+    4,
+    sizeof(float),
+    (float[4][4]){
+      {1.f, 0.f, 0.f, 0.f},
+      {0.f, COS_5DEG, SIN_5DEG, 0.f},
+      {0.f, -SIN_5DEG, COS_5DEG, 0.f},
+      {0.f, 0.f, 0.f, 1.f}
+    }
+  );
+
   // main loop
   while (true) {
     SDL_Event event;
@@ -257,70 +323,40 @@ int main(void) {
           SDL_KeyboardEvent *e = (SDL_KeyboardEvent *)&event;
           switch (e->keysym.sym) {
           case SDLK_u:
-            {
-              float v[4][4] = {
-                {COS_5DEG, 0.f, SIN_5DEG, 0.f},
-                {0.f, 1.f, 0.f, 0.f},
-                {-SIN_5DEG, 0.f, COS_5DEG, 0.f},
-                {0.f, 0.f, 0.f, 1.f}
-              };
-              rotate(v, model_rotate);
-            }
+            replace_array(
+              &model_rotate,
+              mul_mat_mat(rotate_xz_5deg, model_rotate)
+            );
             break;
           case SDLK_i:
-            {
-              float v[4][4] = {
-                {1.f, 0.f, 0.f, 0.f},
-                {0.f, COS_5DEG, -SIN_5DEG, 0.f},
-                {0.f, SIN_5DEG, COS_5DEG, 0.f},
-                {0.f, 0.f, 0.f, 1.f}
-              };
-              rotate(v, model_rotate);
-            }
+            replace_array(
+              &model_rotate,
+              mul_mat_mat(rotate_yz_5deg, model_rotate)
+            );
             break;
           case SDLK_o:
-            {
-              float v[4][4] = {
-                {COS_5DEG, 0.f, -SIN_5DEG, 0.f},
-                {0.f, 1.f, 0.f, 0.f},
-                {SIN_5DEG, 0.f, COS_5DEG, 0.f},
-                {0.f, 0.f, 0.f, 1.f}
-              };
-              rotate(v, model_rotate);
-            }
+            replace_array(
+              &model_rotate,
+              mul_mat_mat(rotate_xz_m5deg, model_rotate)
+            );
             break;
           case SDLK_j:
-            {
-              float v[4][4] = {
-                {COS_5DEG, SIN_5DEG, 0.f, 0.f},
-                {-SIN_5DEG, COS_5DEG, 0.f, 0.f},
-                {0.f, 0.f, 1.f, 0.f},
-                {0.f, 0.f, 0.f, 1.f}
-              };
-              rotate(v, model_rotate);
-            }
+            replace_array(
+              &model_rotate,
+              mul_mat_mat(rotate_xy_5deg, model_rotate)
+            );
             break;
           case SDLK_k:
-            {
-              float v[4][4] = {
-                {1.f, 0.f, 0.f, 0.f},
-                {0.f, COS_5DEG, SIN_5DEG, 0.f},
-                {0.f, -SIN_5DEG, COS_5DEG, 0.f},
-                {0.f, 0.f, 0.f, 1.f}
-              };
-              rotate(v, model_rotate);
-            }
+            replace_array(
+              &model_rotate,
+              mul_mat_mat(rotate_yz_m5deg, model_rotate)
+            );
             break;
           case SDLK_l:
-            {
-              float v[4][4] = {
-                {COS_5DEG, -SIN_5DEG, 0.f, 0.f},
-                {SIN_5DEG, COS_5DEG, 0.f, 0.f},
-                {0.f, 0.f, 1.f, 0.f},
-                {0.f, 0.f, 0.f, 1.f}
-              };
-              rotate(v, model_rotate);
-            }
+            replace_array(
+              &model_rotate,
+              mul_mat_mat(rotate_xy_m5deg, model_rotate)
+            );
             break;
           }
         }