SOURCES := main.c \
scene.c \
+ manipulation.c \
parsing.c \
vec3.c \
t_color color_sRGB_to_lin(t_color_sRGB sRGB);
int parse_args(int argc, char **argv, t_session *s);
+int rotate(t_element *element, t_vec3 rot_axis, double angle);
+void translate(t_element *element, t_vec3 direction, double distance);
+
#endif // MINIRT_H
int handle_key_press(int keycode, t_session *s)
{
+ t_element *element;
+ t_camera *camera;
+
+ element = ft_vec_access(&s->scene.cameras, 0);
+ camera = &element->object.camera;
if (keycode == XK_Escape)
close_win(s);
+ else if (keycode == XK_Up)
+ translate(element, camera->orientation, 0.1);
+ else if (keycode == XK_Down)
+ translate(element, camera->orientation, -0.1);
+ else if (keycode == XK_Left)
+ translate(element, vec_vec_mul(camera->orientation, camera->up_direction), 0.1);
+ else if (keycode == XK_Right)
+ translate(element, vec_vec_mul(camera->orientation, camera->up_direction), -0.1);
+ else if (keycode == XK_space)
+ translate(element, camera->up_direction, 0.1);
+ else if (keycode == XK_Shift_L)
+ translate(element, camera->up_direction, -0.1);
+ else if (keycode == XK_w)
+ rotate(element, vec_vec_mul(camera->orientation, camera->up_direction), -0.1);
+ else if (keycode == XK_s)
+ rotate(element, vec_vec_mul(camera->orientation, camera->up_direction), 0.1);
+ else if (keycode == XK_a)
+ rotate(element, camera->up_direction, -0.1);
+ else if (keycode == XK_d)
+ rotate(element, camera->up_direction, 0.1);
+ else if (keycode == XK_e)
+ rotate(element, camera->orientation, -0.1);
+ else if (keycode == XK_q)
+ rotate(element, camera->orientation, 0.1);
/*
- else if (keycode == XK_Up || keycode == XK_w)
- else if (keycode == XK_Left || keycode == XK_a)
- else if (keycode == XK_Down || keycode == XK_s)
- else if (keycode == XK_Right || keycode == XK_d)
else if (keycode == XK_KP_Add)
else if (keycode == XK_KP_Subtract)
*/
--- /dev/null
+/* ************************************************************************** */
+/* */
+/* ::: :::::::: */
+/* manipulation.c :+: :+: :+: */
+/* +:+ +:+ +:+ */
+/* By: ljiriste <ljiriste@student.42prague.com> +#+ +:+ +#+ */
+/* +#+#+#+#+#+ +#+ */
+/* Created: 2024/12/06 09:48:43 by ljiriste #+# #+# */
+/* Updated: 2024/12/06 12:49:57 by ljiriste ### ########.fr */
+/* */
+/* ************************************************************************** */
+
+#include "vec3.h"
+#include "miniRT.h"
+#include "libft.h"
+#include <math.h>
+
+static void rotate_vec(t_vec3 *vec, t_vec3 rot_axis, double angle)
+{
+ *vec = vec_add(*vec, vec_add(
+ vec_real_mul(
+ vec_vec_mul(rot_axis, *vec),
+ sin(angle)),
+ vec_real_mul(
+ vec_vec_mul(rot_axis,
+ vec_vec_mul(rot_axis, *vec)),
+ 1 - cos(angle))));
+ return ;
+}
+
+int rotate(t_element *element, t_vec3 rot_axis, double angle)
+{
+ if (element->type == PLANE)
+ rotate_vec(&element->object.plane.normal, rot_axis, angle);
+ else if (element->type == CYLINDER)
+ rotate_vec(&element->object.cylinder.rot_axis, rot_axis, angle);
+ else if (element->type == CAMERA)
+ {
+ rotate_vec(&element->object.camera.orientation, rot_axis, angle);
+ rotate_vec(&element->object.camera.up_direction, rot_axis, angle);
+ }
+ else
+ return (0);
+ return (1);
+}
+
+void translate(t_element *element, t_vec3 direction, double distance)
+{
+ const t_vec3 change = vec_real_mul(vec_normalize(direction), distance);
+ t_vec3 *element_center;
+
+ element_center = NULL;
+ if (element->type == SPHERE)
+ element_center = &element->object.sphere.center;
+ else if (element->type == PLANE)
+ element_center = &element->object.plane.point;
+ else if (element->type == CYLINDER)
+ element_center = &element->object.cylinder.center;
+ else if (element->type == LIGHT)
+ element_center = &element->object.light.position;
+ else if (element->type == CAMERA)
+ element_center = &element->object.camera.position;
+ if (!element_center)
+ return ;
+ *element_center = vec_add(*element_center, change);
+ return ;
+}