106 lines
3.9 KiB
C
106 lines
3.9 KiB
C
/* ************************************************************************** */
|
|
/* */
|
|
/* ::: :::::::: */
|
|
/* keys.c :+: :+: :+: */
|
|
/* +:+ +:+ +:+ */
|
|
/* By: bszilas <bszilas@student.42vienna.com> +#+ +:+ +#+ */
|
|
/* +#+#+#+#+#+ +#+ */
|
|
/* Created: 2024/09/14 23:56:44 by victor #+# #+# */
|
|
/* Updated: 2025/05/31 15:20:17 by victor ### ########.fr */
|
|
/* */
|
|
/* ************************************************************************** */
|
|
|
|
#include "../../minirt.h"
|
|
|
|
bool key_move_light(int keycode, t_scene *scene)
|
|
{
|
|
uint i;
|
|
|
|
i = scene->light_focus;
|
|
if (keycode == KEY_H)
|
|
return (scene->light[i].position.x -= 0.1);
|
|
else if (keycode == KEY_L)
|
|
return (scene->light[i].position.x += 0.1);
|
|
else if (keycode == KEY_J)
|
|
return (scene->light[i].position.y += 0.1);
|
|
else if (keycode == KEY_K)
|
|
return (scene->light[i].position.y -= 0.1);
|
|
else if (keycode == KEY_I)
|
|
return (scene->light[i].position.z += .2);
|
|
else if (keycode == KEY_O)
|
|
return (scene->light[i].position.z -= .2);
|
|
else if (keycode == KEY_N)
|
|
scene->light_focus = (scene->light_focus + 1) % scene->light_count;
|
|
return (false);
|
|
}
|
|
|
|
int move_body(int keycode, t_body *body)
|
|
{
|
|
if (!body)
|
|
return (false);
|
|
if (body->type == BODY_PLANE)
|
|
return (move_plane(keycode, &body->plane));
|
|
else if (body->type == BODY_SPHERE)
|
|
return (key_move_focused(keycode, &body->sphere.center));
|
|
else if (body->type == BODY_CYLINDER)
|
|
return (move_cylinder(keycode, &body->cylinder));
|
|
else if (body->type == BODY_CONE)
|
|
return (move_cone(keycode, &body->cone));
|
|
else if (body->type == BODY_DISK)
|
|
return (move_disk(keycode, &body->disk));
|
|
return (false);
|
|
}
|
|
|
|
void rodrigues_rotation(t_vector *vector, t_vector rotation_axis, \
|
|
float angle)
|
|
{
|
|
*vector = add_vector(scale_vector(*vector, cos(angle)), \
|
|
add_vector(scale_vector(cross_product(rotation_axis, *vector), \
|
|
sin(angle)), scale_vector(rotation_axis, \
|
|
dot_product(rotation_axis, *vector) * (1 - cos(angle)))));
|
|
}
|
|
|
|
void rotate_camera(float rotation_angle, t_vector perpendicular_normal, \
|
|
t_camera *camera)
|
|
{
|
|
t_vector rotation_axis;
|
|
|
|
rotation_axis = cross_product(camera->normal, perpendicular_normal);
|
|
normalize_vector(&rotation_axis);
|
|
rodrigues_rotation(&camera->normal, rotation_axis, \
|
|
rotation_angle * M_PI / 180);
|
|
normalize_vector(&camera->normal);
|
|
calc_camera_tilt(camera);
|
|
calc_camera_space(camera);
|
|
}
|
|
|
|
bool calc_camera_rotation(int key, t_camera *camera)
|
|
{
|
|
float rotation_angle;
|
|
t_vector perpendicular_normal;
|
|
|
|
rotation_angle = 10;
|
|
if (key == KEY_UP)
|
|
{
|
|
perpendicular_normal = camera->up;
|
|
if (camera->tilt <= -80)
|
|
rotation_angle = 89 + camera->tilt;
|
|
camera->tilt -= rotation_angle;
|
|
}
|
|
else if (key == KEY_DOWN)
|
|
{
|
|
perpendicular_normal = scale_vector(camera->up, -1);
|
|
if (camera->tilt >= 80)
|
|
rotation_angle = 89 - camera->tilt;
|
|
camera->tilt += rotation_angle;
|
|
}
|
|
else if (key == KEY_RIGHT)
|
|
perpendicular_normal = scale_vector(camera->right, key - 1);
|
|
else if (key == KEY_LEFT)
|
|
perpendicular_normal = scale_vector(camera->right, key - KEY_LEFT - 1);
|
|
else
|
|
return (false);
|
|
rotate_camera(rotation_angle, perpendicular_normal, camera);
|
|
return (true);
|
|
}
|