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);
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) {
);
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;
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;
}
}