sphere.c \
plane.c \
object_color.c \
+ color_conversion.c \
+ event_transform.c \
+ event_handlers.c \
+ mlx_helpers.c \
vec3.c \
+ vec3_mul.c \
SOURCES := $(addprefix $(SRCDIR)/, $(SOURCES))
/* By: ljiriste <ljiriste@student.42prague.com> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2025/01/13 19:51:09 by ljiriste #+# #+# */
-/* Updated: 2025/01/17 12:23:18 by ljiriste ### ########.fr */
+/* Updated: 2025/01/17 13:37:18 by ljiriste ### ########.fr */
/* */
/* ************************************************************************** */
int add_cylinder(
const t_parse_tree_node *cylinder_node, t_vec *objects);
+t_ray get_camera_ray(int x, int y, const t_session *s);
+
double dist_point_from_line(const t_ray *ray, t_vec3 point);
double dist_point_from_plane(const t_plane *plane, t_vec3 point);
int is_behind_ray(const t_ray *ray, t_vec3 point);
double get_intersection_arg_min(
const t_ray *ray, const t_object *object);
+t_color color_srgb_to_lin(t_color_srgb srgb);
+t_color_srgb color_lin_to_srgb(t_color c);
t_color get_object_color(const t_ray *ray, const t_object *object,
t_scene *scene);
+void ft_putpx_img(t_img *img, int x, int y, t_color c);
+void draw(t_session *s);
+
int rotate(t_element *element, t_vec3 rot_axis, double angle);
void translate(
t_element *element, t_vec3 direction, double distance);
void change_radius(t_element *element, double change);
void change_height(t_element *element, double change);
+int translate_keycode(
+ int keycode, t_element *element, t_vec3 axes[3]);
+int rotate_keycode(
+ int keycode, t_element *element, t_vec3 axes[3]);
+int change_keycode(
+ int keycode, t_element *element, t_scene *scene);
+int handle_key_press(int keycode, t_session *s);
+int handle_mouse_press(int button, int x, int y, t_session *s);
+int no_event_handle(__attribute__((unused)) t_session *s);
+
+void init_session(t_session *s);
+void free_session(t_session *s);
+int close_win(t_session *s);
+
#endif // MINIRT_H
--- /dev/null
+/* ************************************************************************** */
+/* */
+/* ::: :::::::: */
+/* color_conversion.c :+: :+: :+: */
+/* +:+ +:+ +:+ */
+/* By: ljiriste <ljiriste@student.42prague.com> +#+ +:+ +#+ */
+/* +#+#+#+#+#+ +#+ */
+/* Created: 2025/01/17 12:32:29 by ljiriste #+# #+# */
+/* Updated: 2025/01/17 13:00:03 by ljiriste ### ########.fr */
+/* */
+/* ************************************************************************** */
+
+#include "miniRT.h"
+#include <math.h>
+
+static double channel_srgb_to_lin(unsigned char srgb_channel)
+{
+ double normalized;
+
+ normalized = srgb_channel / 255.;
+ if (normalized < 0.04045)
+ return (normalized / 12.92);
+ else
+ return (pow((normalized + 0.055) / 1.055, 2.4));
+}
+
+t_color color_srgb_to_lin(t_color_srgb srgb)
+{
+ t_color res;
+
+ res.x = channel_srgb_to_lin(srgb.r);
+ res.y = channel_srgb_to_lin(srgb.g);
+ res.z = channel_srgb_to_lin(srgb.b);
+ return (res);
+}
+
+static unsigned char channel_lin_to_srgb(double lin_channel)
+{
+ if (lin_channel < 0)
+ lin_channel = 0;
+ else if (lin_channel > 1)
+ lin_channel = 1;
+ if (lin_channel < 0.0031308)
+ return (255 * lin_channel * 12.92);
+ else
+ return (255 * (1.055 * pow(lin_channel, 1 / 2.4) - 0.055));
+}
+
+t_color_srgb color_lin_to_srgb(t_color c)
+{
+ t_color_srgb res;
+
+ res.a = 255;
+ res.r = channel_lin_to_srgb(c.x);
+ res.g = channel_lin_to_srgb(c.y);
+ res.b = channel_lin_to_srgb(c.z);
+ return (res);
+}
--- /dev/null
+/* ************************************************************************** */
+/* */
+/* ::: :::::::: */
+/* event_handlers.c :+: :+: :+: */
+/* +:+ +:+ +:+ */
+/* By: ljiriste <ljiriste@student.42prague.com> +#+ +:+ +#+ */
+/* +#+#+#+#+#+ +#+ */
+/* Created: 2025/01/17 12:36:05 by ljiriste #+# #+# */
+/* Updated: 2025/01/17 13:41:40 by ljiriste ### ########.fr */
+/* */
+/* ************************************************************************** */
+
+#include "miniRT.h"
+#include <X11/X.h>
+#include <X11/keysym.h>
+
+static const t_vec3 g_x_vec = {.x = 1, .y = 0, .z = 0};
+static const t_vec3 g_y_vec = {.x = 0, .y = 1, .z = 0};
+static const t_vec3 g_z_vec = {.x = 0, .y = 0, .z = 1};
+
+static void cycle_keycode(int keycode, t_scene *scene)
+{
+ if (keycode == XK_l && scene->lights.size > 0)
+ {
+ if (scene->current_element && scene->current_element->type == LIGHT)
+ scene->current_light_ind
+ = (scene->current_light_ind + 1) % scene->lights.size;
+ scene->current_element
+ = ft_vec_access(&scene->lights, scene->current_light_ind);
+ }
+ else if (keycode == XK_k && scene->lights.size > 0)
+ {
+ if (scene->current_element && scene->current_element->type == LIGHT)
+ scene->current_light_ind
+ = (scene->current_light_ind + scene->lights.size - 1)
+ % scene->lights.size;
+ scene->current_element
+ = ft_vec_access(&scene->lights, scene->current_light_ind);
+ }
+ else if (keycode == XK_c)
+ scene->current_camera_ind
+ = (scene->current_camera_ind + 1) % scene->cameras.size;
+ else if (keycode == XK_x)
+ scene->current_camera_ind
+ = (scene->current_camera_ind + scene->cameras.size - 1)
+ % scene->cameras.size;
+ return ;
+}
+
+static void setup_for_keypress_handle(t_session *s, t_element **element,
+ t_camera **camera, t_vec3 (*axes)[3])
+{
+ 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)
+ {
+ (*axes)[0] = (*camera)->orientation;
+ (*axes)[1] = (*camera)->up_direction;
+ (*axes)[2] = vec_vec_mul((*axes)[1], (*axes)[0]);
+ }
+ else
+ {
+ (*axes)[0] = g_x_vec;
+ (*axes)[1] = g_z_vec;
+ (*axes)[2] = g_y_vec;
+ }
+ return ;
+}
+
+int handle_key_press(int keycode, t_session *s)
+{
+ t_element *element;
+ t_camera *camera;
+ t_vec3 axes[3];
+
+ if (keycode == XK_Escape)
+ {
+ if (s->scene.current_element)
+ s->scene.current_element = NULL;
+ else
+ close_win(s);
+ }
+ else
+ {
+ setup_for_keypress_handle(s, &element, &camera, &axes);
+ if (!translate_keycode(keycode, element, axes)
+ && !rotate_keycode(keycode, element, axes)
+ && !change_keycode(keycode, element, &s->scene))
+ cycle_keycode(keycode, &s->scene);
+ }
+ if (keycode != XK_Escape && keycode != XK_o
+ && keycode != XK_l && keycode != XK_k)
+ draw(s);
+ return (0);
+}
+
+int handle_mouse_press(int button, int x, int y, t_session *s)
+{
+ t_ray ray;
+
+ if (button == Button1)
+ {
+ ray = get_camera_ray(x, y, s);
+ s->scene.current_element
+ = find_nearest_obstruction(&ray, &s->scene.objects, NULL).object;
+ }
+ else if (button == Button3)
+ s->scene.current_element = NULL;
+ return (0);
+}
+
+int no_event_handle(__attribute__((unused)) t_session *s)
+{
+ return (0);
+}
--- /dev/null
+/* ************************************************************************** */
+/* */
+/* ::: :::::::: */
+/* event_transform.c :+: :+: :+: */
+/* +:+ +:+ +:+ */
+/* By: ljiriste <ljiriste@student.42prague.com> +#+ +:+ +#+ */
+/* +#+#+#+#+#+ +#+ */
+/* Created: 2025/01/17 13:31:08 by ljiriste #+# #+# */
+/* Updated: 2025/01/17 13:36:20 by ljiriste ### ########.fr */
+/* */
+/* ************************************************************************** */
+
+#include "miniRT.h"
+#include <X11/keysym.h>
+
+static const double g_translation_step = 0.1;
+static const double g_rotation_step = 0.1;
+
+static const double g_resize_step = 0.1;
+
+int translate_keycode(int keycode, t_element *element, t_vec3 axes[3])
+{
+ if (keycode == XK_Up)
+ translate(element, axes[0], g_translation_step);
+ else if (keycode == XK_Down)
+ translate(element, axes[0], -g_translation_step);
+ else if (keycode == XK_Left)
+ translate(element, axes[2], -g_translation_step);
+ else if (keycode == XK_Right)
+ translate(element, axes[2], g_translation_step);
+ else if (keycode == XK_space)
+ translate(element, axes[1], g_translation_step);
+ else if (keycode == XK_Shift_L)
+ translate(element, axes[1], -g_translation_step);
+ else
+ return (0);
+ return (1);
+}
+
+int rotate_keycode(int keycode, t_element *element, t_vec3 axes[3])
+{
+ if (keycode == XK_w)
+ rotate(element, axes[2], g_rotation_step);
+ else if (keycode == XK_s)
+ rotate(element, axes[2], -g_rotation_step);
+ else if (keycode == XK_a)
+ rotate(element, axes[1], -g_rotation_step);
+ else if (keycode == XK_d)
+ rotate(element, axes[1], g_rotation_step);
+ else if (keycode == XK_e)
+ rotate(element, axes[0], -g_rotation_step);
+ else if (keycode == XK_q)
+ rotate(element, axes[0], g_rotation_step);
+ else
+ return (0);
+ return (1);
+}
+
+int change_keycode(int keycode, t_element *element, t_scene *scene)
+{
+ if (keycode == XK_r)
+ change_radius(element, g_resize_step);
+ else if (keycode == XK_t)
+ change_radius(element, -g_resize_step);
+ else if (keycode == XK_f)
+ change_height(element, g_resize_step);
+ else if (keycode == XK_g)
+ change_height(element, -g_resize_step);
+ else if (keycode == XK_o)
+ scene->relative_directions = !scene->relative_directions;
+ else
+ return (0);
+ return (1);
+}
/* By: ljiriste <ljiriste@student.42prague.com> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2025/01/13 17:16:00 by ljiriste #+# #+# */
-/* Updated: 2025/01/17 11:57:23 by ljiriste ### ########.fr */
+/* Updated: 2025/01/17 13:28:58 by ljiriste ### ########.fr */
/* */
/* ************************************************************************** */
-#include "vec3.h"
#include "miniRT.h"
-#include <mlx.h>
-#include <X11/X.h>
-#include <X11/keysym.h>
#include <math.h>
#include <limits.h>
#include <stdlib.h>
-
-void *get_pixel(t_img *img, int x, int y)
-{
- return (img->addr + y * img->bpl + x * img->bpp / CHAR_BIT);
-}
-
-double channel_srgb_to_lin(unsigned char srgb_channel)
-{
- double normalized;
-
- normalized = srgb_channel / 255.;
- if (normalized < 0.04045)
- return (normalized / 12.92);
- else
- return (pow((normalized + 0.055) / 1.055, 2.4));
-}
-
-t_color color_srgb_to_lin(t_color_srgb srgb)
-{
- t_color res;
-
- res.x = channel_srgb_to_lin(srgb.r);
- res.y = channel_srgb_to_lin(srgb.g);
- res.z = channel_srgb_to_lin(srgb.b);
- return (res);
-}
-
-unsigned char channel_lin_to_srgb(double lin_channel)
-{
- if (lin_channel < 0)
- lin_channel = 0;
- else if (lin_channel > 1)
- lin_channel = 1;
- if (lin_channel < 0.0031308)
- return (255 * lin_channel * 12.92);
- else
- return (255 * (1.055 * pow(lin_channel, 1 / 2.4) - 0.055));
-}
-
-t_color_srgb color_lin_to_srgb(t_color c)
-{
- t_color_srgb res;
-
- res.a = 255;
- res.r = channel_lin_to_srgb(c.x);
- res.g = channel_lin_to_srgb(c.y);
- res.b = channel_lin_to_srgb(c.z);
- return (res);
-}
-
-void ft_putpx_img(t_img *img, int x, int y, t_color c)
-{
- char *px_addr;
- t_color_srgb srgb_c;
-
- srgb_c = color_lin_to_srgb(c);
- px_addr = get_pixel(img, x, y);
- if (img->endian)
- {
- px_addr[0] = srgb_c.a;
- px_addr[1] = srgb_c.r;
- px_addr[2] = srgb_c.g;
- px_addr[3] = srgb_c.b;
- }
- else
- {
- px_addr[3] = srgb_c.a;
- px_addr[2] = srgb_c.r;
- px_addr[1] = srgb_c.g;
- px_addr[0] = srgb_c.b;
- }
- return ;
-}
+#include <mlx.h>
+#include <X11/X.h>
t_ray get_camera_ray(int x, int y, const t_session *s)
{
return ;
}
-int close_win(t_session *s)
-{
- mlx_destroy_window(s->mlx, s->win);
- s->win = NULL;
- return (0);
-}
-
-static const double g_translation_step = 0.1;
-static const double g_rotation_step = 0.1;
-static const double g_resize_step = 0.1;
-
-static const t_vec3 g_x_vec = {.x = 1, .y = 0, .z = 0};
-static const t_vec3 g_y_vec = {.x = 0, .y = 1, .z = 0};
-static const t_vec3 g_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(upwards, forwards);
- }
- else
- {
- forwards = g_x_vec;
- upwards = g_z_vec;
- sidewards = g_y_vec;
- }
- if (keycode == XK_Escape)
- {
- if (s->scene.current_element)
- s->scene.current_element = NULL;
- else
- close_win(s);
- }
- else if (keycode == XK_Up)
- translate(element, forwards, g_translation_step);
- else if (keycode == XK_Down)
- translate(element, forwards, -g_translation_step);
- else if (keycode == XK_Left)
- translate(element, sidewards, -g_translation_step);
- else if (keycode == XK_Right)
- translate(element, sidewards, g_translation_step);
- else if (keycode == XK_space)
- translate(element, upwards, g_translation_step);
- else if (keycode == XK_Shift_L)
- translate(element, upwards, -g_translation_step);
- else if (keycode == XK_w)
- rotate(element, sidewards, g_rotation_step);
- else if (keycode == XK_s)
- rotate(element, sidewards, -g_rotation_step);
- else if (keycode == XK_a)
- rotate(element, upwards, -g_rotation_step);
- else if (keycode == XK_d)
- rotate(element, upwards, g_rotation_step);
- else if (keycode == XK_e)
- rotate(element, forwards, -g_rotation_step);
- else if (keycode == XK_q)
- rotate(element, forwards, g_rotation_step);
- else if (keycode == XK_r)
- change_radius(element, g_resize_step);
- else if (keycode == XK_t)
- change_radius(element, -g_resize_step);
- else if (keycode == XK_f)
- change_height(element, g_resize_step);
- else if (keycode == XK_g)
- change_height(element, -g_resize_step);
- else if (keycode == XK_o)
- s->scene.relative_directions = !s->scene.relative_directions;
- else if (keycode == XK_l && s->scene.lights.size > 0)
- {
- if (s->scene.current_element && s->scene.current_element->type == LIGHT)
- s->scene.current_light_ind
- = (s->scene.current_light_ind + 1) % s->scene.lights.size;
- s->scene.current_element
- = ft_vec_access(&s->scene.lights, s->scene.current_light_ind);
- }
- else if (keycode == XK_k && s->scene.lights.size > 0)
- {
- if (s->scene.current_element && s->scene.current_element->type == LIGHT)
- s->scene.current_light_ind
- = (s->scene.current_light_ind + s->scene.lights.size - 1)
- % s->scene.lights.size;
- s->scene.current_element
- = ft_vec_access(&s->scene.lights, s->scene.current_light_ind);
- }
- else if (keycode == XK_c)
- s->scene.current_camera_ind
- = (s->scene.current_camera_ind + 1) % s->scene.cameras.size;
- else if (keycode == XK_x)
- s->scene.current_camera_ind
- = (s->scene.current_camera_ind + s->scene.cameras.size - 1)
- % s->scene.cameras.size;
- if (keycode != XK_Escape && keycode != XK_o
- && keycode != XK_l && keycode != XK_k)
- draw(s);
- return (0);
-}
-
-int handle_mouse_press(int button, int x, int y, t_session *s)
-{
- t_ray ray;
-
- if (button == Button1)
- {
- ray = get_camera_ray(x, y, s);
- s->scene.current_element
- = find_nearest_obstruction(&ray, &s->scene.objects, NULL).object;
- }
- else if (button == Button3)
- s->scene.current_element = NULL;
- return (0);
-}
-
-int no_event_handle(__attribute__((unused)) t_session *s)
-{
- return (0);
-}
-
-void init_session(t_session *s)
-{
- s->mlx = mlx_init();
- s->win = mlx_new_window(s->mlx, s->img.width, s->img.height, "miniRT");
- s->img.img = mlx_new_image(s->mlx, s->img.width, s->img.height);
- s->img.addr = mlx_get_data_addr(s->img.img,
- &s->img.bpp, &s->img.bpl, &s->img.endian);
-}
-
-static void free_session(t_session *s)
-{
- mlx_destroy_display(s->mlx);
- free(s->mlx);
- return ;
-}
-
-void cleanup(t_session *s)
+static void cleanup(t_session *s)
{
mlx_destroy_image(s->mlx, s->img.img);
free_session(s);
return ;
}
-void set_defaults(t_session *s)
+static void set_defaults(t_session *s)
{
s->img.width = 1920;
s->img.height = 1011;
--- /dev/null
+/* ************************************************************************** */
+/* */
+/* ::: :::::::: */
+/* mlx_helpers.c :+: :+: :+: */
+/* +:+ +:+ +:+ */
+/* By: ljiriste <ljiriste@student.42prague.com> +#+ +:+ +#+ */
+/* +#+#+#+#+#+ +#+ */
+/* Created: 2025/01/17 13:23:32 by ljiriste #+# #+# */
+/* Updated: 2025/01/17 13:27:43 by ljiriste ### ########.fr */
+/* */
+/* ************************************************************************** */
+
+#include "miniRT.h"
+#include <stdlib.h>
+#include <limits.h>
+#include <mlx.h>
+
+static void *get_pixel(t_img *img, int x, int y)
+{
+ return (img->addr + y * img->bpl + x * img->bpp / CHAR_BIT);
+}
+
+void ft_putpx_img(t_img *img, int x, int y, t_color c)
+{
+ char *px_addr;
+ t_color_srgb srgb_c;
+
+ srgb_c = color_lin_to_srgb(c);
+ px_addr = get_pixel(img, x, y);
+ if (img->endian)
+ {
+ px_addr[0] = srgb_c.a;
+ px_addr[1] = srgb_c.r;
+ px_addr[2] = srgb_c.g;
+ px_addr[3] = srgb_c.b;
+ }
+ else
+ {
+ px_addr[3] = srgb_c.a;
+ px_addr[2] = srgb_c.r;
+ px_addr[1] = srgb_c.g;
+ px_addr[0] = srgb_c.b;
+ }
+ return ;
+}
+
+void init_session(t_session *s)
+{
+ s->mlx = mlx_init();
+ s->win = mlx_new_window(s->mlx, s->img.width, s->img.height, "miniRT");
+ s->img.img = mlx_new_image(s->mlx, s->img.width, s->img.height);
+ s->img.addr = mlx_get_data_addr(s->img.img,
+ &s->img.bpp, &s->img.bpl, &s->img.endian);
+}
+
+void free_session(t_session *s)
+{
+ mlx_destroy_display(s->mlx);
+ free(s->mlx);
+ return ;
+}
+
+int close_win(t_session *s)
+{
+ mlx_destroy_window(s->mlx, s->win);
+ s->win = NULL;
+ return (0);
+}
/* By: ljiriste <ljiriste@student.42prague.com> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2025/01/14 15:09:41 by ljiriste #+# #+# */
-/* Updated: 2025/01/17 12:04:15 by ljiriste ### ########.fr */
+/* Updated: 2025/01/17 12:28:38 by ljiriste ### ########.fr */
/* */
/* ************************************************************************** */
return (0);
}
-static t_res parse_tree_to_scene(const t_parse_tree_node *tree, t_scene *scene)
+static t_res parse_tree_to_scene(
+ const t_parse_tree_node *tree, t_scene *scene)
{
if (!tree)
return (PARSING_ERROR);
/* By: ljiriste <ljiriste@student.42prague.com> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2025/01/13 19:44:03 by ljiriste #+# #+# */
-/* Updated: 2025/01/13 19:44:28 by ljiriste ### ########.fr */
+/* Updated: 2025/01/17 12:30:27 by ljiriste ### ########.fr */
/* */
/* ************************************************************************** */
return (res);
}
-t_vec3 vec_real_mul(t_vec3 vec, double real)
-{
- t_vec3 res;
-
- res.x = real * vec.x;
- res.y = real * vec.y;
- res.z = real * vec.z;
- return (res);
-}
-
-double vec_scalar_mul(t_vec3 v, t_vec3 u)
-{
- return (v.x * u.x + v.y * u.y + v.z * u.z);
-}
-
-t_vec3 vec_elwise_mul(t_vec3 v, t_vec3 u)
-{
- t_vec3 res;
-
- res.x = v.x * u.x;
- res.y = v.y * u.y;
- res.z = v.z * u.z;
- return (res);
-}
-
-t_vec3 vec_vec_mul(t_vec3 v, t_vec3 u)
-{
- t_vec3 res;
-
- res.x = v.y * u.z - v.z * u.y;
- res.y = v.z * u.x - v.x * u.z;
- res.z = v.x * u.y - v.y * u.x;
- return (res);
-}
-
double vec_norm(t_vec3 vec)
{
return (sqrt(vec_scalar_mul(vec, vec)));
--- /dev/null
+/* ************************************************************************** */
+/* */
+/* ::: :::::::: */
+/* vec3_mul.c :+: :+: :+: */
+/* +:+ +:+ +:+ */
+/* By: ljiriste <ljiriste@student.42prague.com> +#+ +:+ +#+ */
+/* +#+#+#+#+#+ +#+ */
+/* Created: 2025/01/17 12:29:10 by ljiriste #+# #+# */
+/* Updated: 2025/01/17 12:30:55 by ljiriste ### ########.fr */
+/* */
+/* ************************************************************************** */
+
+#include "vec3.h"
+
+t_vec3 vec_real_mul(t_vec3 vec, double real)
+{
+ t_vec3 res;
+
+ res.x = real * vec.x;
+ res.y = real * vec.y;
+ res.z = real * vec.z;
+ return (res);
+}
+
+double vec_scalar_mul(t_vec3 v, t_vec3 u)
+{
+ return (v.x * u.x + v.y * u.y + v.z * u.z);
+}
+
+t_vec3 vec_elwise_mul(t_vec3 v, t_vec3 u)
+{
+ t_vec3 res;
+
+ res.x = v.x * u.x;
+ res.y = v.y * u.y;
+ res.z = v.z * u.z;
+ return (res);
+}
+
+t_vec3 vec_vec_mul(t_vec3 v, t_vec3 u)
+{
+ t_vec3 res;
+
+ res.x = v.y * u.z - v.z * u.y;
+ res.y = v.z * u.x - v.x * u.z;
+ res.z = v.x * u.y - v.y * u.x;
+ return (res);
+}