static const double TRANSLATION_STEP = 0.1;
static const double ROTATION_STEP = 0.1;
+static const t_vec3 X_VEC = {.x = 1, .y = 0, .z = 0};
+static const t_vec3 Y_VEC = {.x = 0, .y = 1, .z = 0};
+static const t_vec3 Z_VEC = {.x = 0, .y = 0, .z = 1};
+
int handle_key_press(int keycode, t_session *s)
{
t_element *element;
t_camera *camera;
+ t_vec3 forwards;
+ t_vec3 upwards;
+ t_vec3 sidewards;
if (s->scene.current_element)
element = s->scene.current_element;
else
element = ft_vec_access(&s->scene.cameras, s->scene.current_camera_ind);
camera = &(((t_element *)ft_vec_access(&s->scene.cameras, s->scene.current_camera_ind))->object.camera);
+ if (s->scene.relative_directions)
+ {
+ forwards = camera->orientation;
+ upwards = camera->up_direction;
+ sidewards = vec_vec_mul(forwards, upwards);
+ }
+ else
+ {
+ forwards = X_VEC;
+ upwards = Z_VEC;
+ sidewards = Y_VEC;
+ }
if (keycode == XK_Escape)
{
if (s->scene.current_element)
close_win(s);
}
else if (keycode == XK_Up)
- translate(element, camera->orientation, TRANSLATION_STEP);
+ translate(element, forwards, TRANSLATION_STEP);
else if (keycode == XK_Down)
- translate(element, camera->orientation, -TRANSLATION_STEP);
+ translate(element, forwards, -TRANSLATION_STEP);
else if (keycode == XK_Left)
- translate(element, vec_vec_mul(camera->orientation, camera->up_direction), TRANSLATION_STEP);
+ translate(element, sidewards, TRANSLATION_STEP);
else if (keycode == XK_Right)
- translate(element, vec_vec_mul(camera->orientation, camera->up_direction), -TRANSLATION_STEP);
+ translate(element, sidewards, -TRANSLATION_STEP);
else if (keycode == XK_space)
- translate(element, camera->up_direction, TRANSLATION_STEP);
+ translate(element, upwards, TRANSLATION_STEP);
else if (keycode == XK_Shift_L)
- translate(element, camera->up_direction, -TRANSLATION_STEP);
+ translate(element, upwards, -TRANSLATION_STEP);
else if (keycode == XK_w)
- rotate(element, vec_vec_mul(camera->orientation, camera->up_direction), -ROTATION_STEP);
+ rotate(element, sidewards, -ROTATION_STEP);
else if (keycode == XK_s)
- rotate(element, vec_vec_mul(camera->orientation, camera->up_direction), ROTATION_STEP);
+ rotate(element, sidewards, ROTATION_STEP);
else if (keycode == XK_a)
- rotate(element, camera->up_direction, -ROTATION_STEP);
+ rotate(element, upwards, -ROTATION_STEP);
else if (keycode == XK_d)
- rotate(element, camera->up_direction, ROTATION_STEP);
+ rotate(element, upwards, ROTATION_STEP);
else if (keycode == XK_e)
- rotate(element, camera->orientation, -ROTATION_STEP);
+ rotate(element, forwards, -ROTATION_STEP);
else if (keycode == XK_q)
- rotate(element, camera->orientation, ROTATION_STEP);
- /*
- else if (keycode == XK_KP_Add)
- else if (keycode == XK_KP_Subtract)
- */
- if (keycode != XK_Escape)
+ rotate(element, forwards, ROTATION_STEP);
+ else if (keycode == XK_o)
+ s->scene.relative_directions = !s->scene.relative_directions;
+ if (keycode != XK_Escape && keycode != XK_A)
draw(s);
return (0);
}