From: Lukas Jiriste Date: Fri, 17 Jan 2025 12:38:15 +0000 (+0100) Subject: Refactor to comply with the Norm completely X-Git-Url: https://git.ljiriste.work/?a=commitdiff_plain;h=d3a3e3d16196bdc0ded88583d10e36044258e818;p=42%2FminiRT.git Refactor to comply with the Norm completely --- diff --git a/Makefile b/Makefile index 8363fde..54a2d08 100644 --- a/Makefile +++ b/Makefile @@ -35,7 +35,12 @@ SOURCES := main.c \ 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)) diff --git a/inc/miniRT.h b/inc/miniRT.h index dc7241c..002cb79 100644 --- a/inc/miniRT.h +++ b/inc/miniRT.h @@ -6,7 +6,7 @@ /* By: ljiriste +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* 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 */ /* */ /* ************************************************************************** */ @@ -183,6 +183,8 @@ int add_sphere( 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); @@ -209,13 +211,32 @@ t_vec get_intersection_args(const t_ray *ray, const t_object *object); 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 diff --git a/src/color_conversion.c b/src/color_conversion.c new file mode 100644 index 0000000..4635aab --- /dev/null +++ b/src/color_conversion.c @@ -0,0 +1,58 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* color_conversion.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: ljiriste +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2025/01/17 12:32:29 by ljiriste #+# #+# */ +/* Updated: 2025/01/17 13:00:03 by ljiriste ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "miniRT.h" +#include + +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); +} diff --git a/src/event_handlers.c b/src/event_handlers.c new file mode 100644 index 0000000..58edd40 --- /dev/null +++ b/src/event_handlers.c @@ -0,0 +1,121 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* event_handlers.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: ljiriste +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2025/01/17 12:36:05 by ljiriste #+# #+# */ +/* Updated: 2025/01/17 13:41:40 by ljiriste ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "miniRT.h" +#include +#include + +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); +} diff --git a/src/event_transform.c b/src/event_transform.c new file mode 100644 index 0000000..0c9d12c --- /dev/null +++ b/src/event_transform.c @@ -0,0 +1,74 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* event_transform.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: ljiriste +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2025/01/17 13:31:08 by ljiriste #+# #+# */ +/* Updated: 2025/01/17 13:36:20 by ljiriste ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "miniRT.h" +#include + +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); +} diff --git a/src/main.c b/src/main.c index 66e5312..8273fd0 100644 --- a/src/main.c +++ b/src/main.c @@ -6,91 +6,16 @@ /* By: ljiriste +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* 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 -#include -#include #include #include #include - -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 +#include t_ray get_camera_ray(int x, int y, const t_session *s) { @@ -142,156 +67,7 @@ void draw(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); @@ -301,7 +77,7 @@ void cleanup(t_session *s) return ; } -void set_defaults(t_session *s) +static void set_defaults(t_session *s) { s->img.width = 1920; s->img.height = 1011; diff --git a/src/mlx_helpers.c b/src/mlx_helpers.c new file mode 100644 index 0000000..ff38ab4 --- /dev/null +++ b/src/mlx_helpers.c @@ -0,0 +1,68 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* mlx_helpers.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: ljiriste +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2025/01/17 13:23:32 by ljiriste #+# #+# */ +/* Updated: 2025/01/17 13:27:43 by ljiriste ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "miniRT.h" +#include +#include +#include + +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); +} diff --git a/src/parse_rt.c b/src/parse_rt.c index 5d46489..1548fb9 100644 --- a/src/parse_rt.c +++ b/src/parse_rt.c @@ -6,7 +6,7 @@ /* By: ljiriste +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* 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 */ /* */ /* ************************************************************************** */ @@ -65,7 +65,8 @@ static int add_element_to_scene( 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); diff --git a/src/vec3.c b/src/vec3.c index a0a54a3..c46b382 100644 --- a/src/vec3.c +++ b/src/vec3.c @@ -6,7 +6,7 @@ /* By: ljiriste +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* 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 */ /* */ /* ************************************************************************** */ @@ -33,41 +33,6 @@ t_vec3 vec_diff(t_vec3 v, t_vec3 u) 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))); diff --git a/src/vec3_mul.c b/src/vec3_mul.c new file mode 100644 index 0000000..9544a88 --- /dev/null +++ b/src/vec3_mul.c @@ -0,0 +1,48 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* vec3_mul.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: ljiriste +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* 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); +}