From 8c683956ee5e0766f440249ce12b563a90f1bf71 Mon Sep 17 00:00:00 2001 From: H3XploR Date: Tue, 18 Feb 2025 17:48:52 +0100 Subject: [PATCH] update norme --- ft_atof.c | 4 +- main.c | 14 +------ miniRT | Bin 352984 -> 348608 bytes miniRT.h | 4 +- parsing_cylinder.c | 85 +-------------------------------------- parsing_cylinder_utils.c | 30 ++++++++++---- shadows.c | 55 +++++++++++++------------ tags | 10 ++--- trace.c | 4 +- 9 files changed, 64 insertions(+), 142 deletions(-) diff --git a/ft_atof.c b/ft_atof.c index 98b5ef1..1855b8a 100644 --- a/ft_atof.c +++ b/ft_atof.c @@ -6,13 +6,13 @@ /* By: yantoine +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2025/02/17 21:19:17 by yantoine #+# #+# */ -/* Updated: 2025/02/18 17:14:00 by yantoine ### ########.fr */ +/* Updated: 2025/02/18 17:22:12 by yantoine ### ########.fr */ /* */ /* ************************************************************************** */ #include "miniRT.h" -inline static char *check_sign(char *str, int *sign) +inline static char *check_sign(char *str, int *sign) { if (*str == '-') { diff --git a/main.c b/main.c index da52a16..ca7f091 100644 --- a/main.c +++ b/main.c @@ -6,7 +6,7 @@ /* By: yantoine +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2025/02/17 19:54:03 by yantoine #+# #+# */ -/* Updated: 2025/02/17 23:35:02 by yantoine ### ########.fr */ +/* Updated: 2025/02/18 17:23:15 by yantoine ### ########.fr */ /* */ /* ************************************************************************** */ @@ -28,30 +28,18 @@ static int init_mlx_and_image(t_app *app) { app->mlx = mlx_init(); if (!app->mlx) - { - ft_putstr_fd("Erreur mlx_init\n", 2); return (1); - } app->win = mlx_new_window(app->mlx, app->win_width, app->win_height, "Raytracer interactif"); if (!app->win) - { - ft_putstr_fd("Erreur mlx_new_window\n", 2); return (1); - } app->img = mlx_new_image(app->mlx, app->win_width, app->win_height); if (!app->img) - { - ft_putstr_fd("Erreur mlx_new_image\n", 2); return (1); - } app->pixels = (int *)mlx_get_data_addr(app->img, &app->bpp, &app->size_line, &app->endian); if (!app->pixels) - { - ft_putstr_fd("Erreur mlx_get_data_addr\n", 2); return (1); - } return (0); } diff --git a/miniRT b/miniRT index 4a728e7a0c4e8ea9f772c96afd5db0ba634b1b95..315364e5c770e5121885045b1c3ff176539c51c6 100755 GIT binary patch delta 45702 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 Gtp5dLyXukv diff --git a/miniRT.h b/miniRT.h index 1798085..bdd499e 100644 --- a/miniRT.h +++ b/miniRT.h @@ -6,7 +6,7 @@ /* By: yantoine +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2025/02/13 20:02:36 by yantoine #+# #+# */ -/* Updated: 2025/02/17 23:42:16 by yantoine ### ########.fr */ +/* Updated: 2025/02/18 17:39:45 by yantoine ### ########.fr */ /* */ /* ************************************************************************** */ @@ -220,7 +220,7 @@ void check_if_max(t_scene scene, const int to_test, const int max); float intersectCylinder(t_ray ray, t_cylinder cy, t_vec3 *hitNormal); float intersectPlane(t_ray ray, t_plane p, t_vec3 *hitNormal); float intersectSphere(t_ray ray, t_sphere s, t_vec3 *hitNormal); -bool isInShadow(t_vec3 hitPoint, t_vec3 lightPos, t_scene scene); +bool is_in_shadow(t_vec3 hitPoint, t_vec3 lightPos, t_scene scene); bool intersectObjects(t_ray ray, float *tMin, t_vec3 *hitNormal, t_vec3 *objColor, t_scene scene); t_vec3 calcLighting(t_vec3 hitPoint, t_vec3 hitNormal, t_vec3 objColor, diff --git a/parsing_cylinder.c b/parsing_cylinder.c index 2d28754..757d697 100644 --- a/parsing_cylinder.c +++ b/parsing_cylinder.c @@ -6,95 +6,12 @@ /* By: yantoine +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2025/02/15 19:54:13 by yantoine #+# #+# */ -/* Updated: 2025/02/18 17:14:45 by yantoine ### ########.fr */ +/* Updated: 2025/02/18 17:24:08 by yantoine ### ########.fr */ /* */ /* ************************************************************************** */ #include "miniRT.h" -/* -float intersectCylinder(Ray ray, Cylinder cy, t_vec3 *hitNormal) -{ - t_calc calc; - char **tokens; - - calc.d = ray.dir; - calc.oc = vec3_sub(ray.origin, cy.center); - calc.v = cy.axis; - calc.d_dot_v = vec3_dot(calc.d, calc.v); - calc.oc_dot_v = vec3_dot(calc.oc, calc.v); - calc.d_perp = vec3_sub(calc.calc.d, vec3_scale(calc.v, calc.d_dot_v)); - oc_perp = vec3_sub(calc.oc, vec3_scale(calc.v, calc.oc_dot_v)); - calc.a = vec3_dot(calc.d_perp, calc.d_perp); - calc.b = 2 * vec3_dot(calc.d_perp, oc_perp); - calc.c = vec3_dot(oc_perp, oc_perp) - cy.radius * cy.radius; - calc.disc = calc.b * calc.b - 4 * calc.a * calc.c; - if (calc.disc < 0) - return (-1); - calc.sqrtDisc = sqrtf(calc.disc); - calc.t0 = (-calc.b - calc.sqrtDisc) / (2 * calc.a); - calc.t1 = (-calc.b + calc.sqrtDisc) / (2 * calc.a); - calc.t_side = -1; - if (calc.t0 > 1e-3f) - { - calc.y = calc.oc_dot_v + calc.t0 * calc.d_dot_v; - if (fabs(calc.y) <= cy.height / 2.0f) - calc.t_side = calc.t0; - } - if (calc.t_side < 0 && calc.t1 > 1e-3f) - { - calc.y = calc.oc_dot_v + calc.t1 * calc.d_dot_v; - if (fabs(calc.y) <= cy.height / 2.0f) - calc.t_side = calc.t1; - } - calc.t_cap = -1; - if (fabs(calc.d_dot_v) > 1e-6f) - { - calc.t_bot = ((-cy.height / 2.0f) - calc.oc_dot_v) / calc.d_dot_v; - if (calc.t_bot > 1e-3f) - { - p = vec3_add(ray.origin, vec3_scale(calc.d, calc.t_bot)); - cp = vec3_sub(p, cy.center); - calc.dist = vec3_length(vec3_sub(cp, vec3_scale(calc.v, vec3_dot(cp, - calc.v)))); - if (calc.dist <= cy.radius) - calc.t_cap = calc.t_bot; - } - t_top = ((cy.height / 2.0f) - calc.oc_dot_v) / calc.d_dot_v; - if (t_top > 1e-3f) - { - p = vec3_add(ray.origin, vec3_scale(calc.d, t_top)); - cp = vec3_sub(p, cy.center); - calc.dist = vec3_length(vec3_sub(cp, vec3_scale(calc.v, vec3_dot(cp, - calc.v)))); - if (calc.dist <= cy.radius && (calc.t_cap < 0 - || t_top < calc.t_cap)) - calc.t_cap = t_top; - } - } - calc.t_final = -1; - if (calc.t_side > 1e-3f && calc.t_cap > 1e-3f) - calc.t_final = (calc.t_side < calc.t_cap) ? calc.t_side : calc.t_cap; - else if (calc.t_side > 1e-3f) - calc.t_final = calc.t_side; - else - calc.t_final = calc.t_cap; - if (calc.t_final < 1e-3f) - return (-1); - calc.hitPoint = vec3_add(ray.origin, vec3_scale(calc.d, calc.t_final)); - cp = vec3_sub(calc.hitPoint, cy.center); - calc.proj = vec3_dot(cp, calc.v); - if (fabs(calc.proj) < cy.height / 2.0f - 1e-3f) - { - calc.n = vec3_sub(cp, vec3_scale(calc.v, calc.proj)); - *hitNormal = vec3_normalize(calc.n); - } - else - { - *hitNormal = (calc.proj > 0) ? calc.v : vec3_scale(calc.v, -1); - } - return (calc.t_final); -}*/ t_scene parsing_cylindre(t_scene scene) { char **tokens; diff --git a/parsing_cylinder_utils.c b/parsing_cylinder_utils.c index 5a6246d..a8f3a45 100644 --- a/parsing_cylinder_utils.c +++ b/parsing_cylinder_utils.c @@ -6,13 +6,14 @@ /* By: yantoine +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2025/02/17 18:54:45 by yantoine #+# #+# */ -/* Updated: 2025/02/17 21:28:56 by yantoine ### ########.fr */ +/* Updated: 2025/02/18 17:38:56 by yantoine ### ########.fr */ /* */ /* ************************************************************************** */ #include "miniRT.h" -// Initialise les variables de calcul et les coefficients du polynôme d'intersection +// Initialise les variables de calcul et les +// coefficients du polynôme d'intersection static int init_intersection(t_ray ray, t_cylinder cy, t_calc *calc) { calc->d = ray.dir; @@ -34,7 +35,8 @@ static int init_intersection(t_ray ray, t_cylinder cy, t_calc *calc) return (0); } -// Calcule l'intersection sur la surface latérale du cylindre +// Calcule l'intersection sur la surface +//latérale du cylindre static void compute_side_intersection(t_cylinder cy, t_calc *calc) { calc->t_side = -1; @@ -52,7 +54,8 @@ static void compute_side_intersection(t_cylinder cy, t_calc *calc) } } -// Calcule l'intersection sur les capuchons supérieur et inférieur +// Calcule l'intersection sur les +// capuchons supérieur et inférieur static void compute_cap_intersection(t_ray ray, t_cylinder cy, t_calc *calc) { calc->t_cap = -1; @@ -82,16 +85,24 @@ static void compute_cap_intersection(t_ray ray, t_cylinder cy, t_calc *calc) } } -// Sélectionne l'intersection la plus proche entre la surface latérale et les capuchons +// Sélectionne l'intersection la plus +//proche entre la surface latérale et les capuchons static float select_final_intersection(t_calc *calc) { if (calc->t_side > 1e-3f && calc->t_cap > 1e-3f) - calc->t_final = (calc->t_side < calc->t_cap) ? calc->t_side : calc->t_cap; + { + if (calc->t_side < calc->t_cap) + calc->t_final = calc->t_side; + else + calc->t_final = calc->t_cap; + } else if (calc->t_side > 1e-3f) calc->t_final = calc->t_side; else calc->t_final = calc->t_cap; - return ((calc->t_final > 1e-3f) ? calc->t_final : -1); + if (calc->t_final > 1e-3f) + return (calc->t_final); + return (-1); } // Calcule la normale au point d'intersection @@ -108,7 +119,10 @@ static void compute_hit_normal(t_ray ray, t_cylinder cy, t_calc *calc, } else { - *hitNormal = (calc->proj > 0) ? calc->v : vec3_scale(calc->v, -1); + if (calc->proj > 0) + *hitNormal = calc->v; + else + *hitNormal = vec3_scale(calc->v, -1); } } diff --git a/shadows.c b/shadows.c index 32c1bff..51751f6 100644 --- a/shadows.c +++ b/shadows.c @@ -6,16 +6,17 @@ /* By: yantoine +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2025/02/17 18:58:42 by yantoine #+# #+# */ -/* Updated: 2025/02/17 21:44:07 by yantoine ### ########.fr */ +/* Updated: 2025/02/18 17:48:22 by yantoine ### ########.fr */ /* */ /* ************************************************************************** */ #include "miniRT.h" // Vérifie les intersections avec les sphères -static bool checkShadowSphere(const t_ray shadowRay, float maxT, float epsilon, - t_scene scene) +static bool check_shadow_sphere(const t_ray shadow_ray, \ + float max_t, t_scene scene) { + const float epsilon = 1e-3f; int i; t_vec3 dummy; float t; @@ -23,8 +24,8 @@ static bool checkShadowSphere(const t_ray shadowRay, float maxT, float epsilon, i = 0; while (i < scene.numSpheres) { - t = intersectSphere(shadowRay, scene.spheres[i], &dummy); - if (t > epsilon && t < maxT) + t = intersectSphere(shadow_ray, scene.spheres[i], &dummy); + if (t > epsilon && t < max_t) return (true); i++; } @@ -32,9 +33,10 @@ static bool checkShadowSphere(const t_ray shadowRay, float maxT, float epsilon, } // Vérifie les intersections avec les plans -static bool checkShadowPlane(const t_ray shadowRay, float maxT, float epsilon, - t_scene scene) +static bool check_shadow_plane(const t_ray shadow_ray, \ + float max_t, t_scene scene) { + const float epsilon = 1e-3f; int i; t_vec3 dummy; float t; @@ -42,8 +44,8 @@ static bool checkShadowPlane(const t_ray shadowRay, float maxT, float epsilon, i = 0; while (i < scene.numPlanes) { - t = intersectPlane(shadowRay, scene.planes[i], &dummy); - if (t > epsilon && t < maxT) + t = intersectPlane(shadow_ray, scene.planes[i], &dummy); + if (t > epsilon && t < max_t) return (true); i++; } @@ -51,9 +53,10 @@ static bool checkShadowPlane(const t_ray shadowRay, float maxT, float epsilon, } // Vérifie les intersections avec les cylindres -static bool checkShadowCylinder(const t_ray shadowRay, float maxT, - float epsilon, t_scene scene) +static bool check_shadow_cylinder(const t_ray shadow_ray, \ + float max_t, t_scene scene) { + const float epsilon = 1e-3f; int i; t_vec3 dummy; float t; @@ -61,8 +64,8 @@ static bool checkShadowCylinder(const t_ray shadowRay, float maxT, i = 0; while (i < scene.numCylinders) { - t = intersectCylinder(shadowRay, scene.cylinders[i], &dummy); - if (t > epsilon && t < maxT) + t = intersectCylinder(shadow_ray, scene.cylinders[i], &dummy); + if (t > epsilon && t < max_t) return (true); i++; } @@ -70,24 +73,24 @@ static bool checkShadowCylinder(const t_ray shadowRay, float maxT, } // Fonction principale qui détermine si le point est dans l'ombre -bool isInShadow(t_vec3 hitPoint, t_vec3 lightPos, t_scene scene) +bool is_in_shadow(t_vec3 hitPoint, t_vec3 lightPos, t_scene scene) { const float epsilon = 1e-3f; - t_vec3 toLight; - float maxT; - t_vec3 L; - t_ray shadowRay; + t_vec3 to_light; + float max_t; + t_vec3 l; + t_ray shadow_ray; - toLight = vec3_sub(lightPos, hitPoint); - maxT = vec3_length(toLight); - L = vec3_normalize(toLight); - shadowRay.origin = vec3_add(hitPoint, vec3_scale(L, epsilon)); - shadowRay.dir = L; - if (checkShadowSphere(shadowRay, maxT, epsilon, scene)) + to_light = vec3_sub(lightPos, hitPoint); + max_t = vec3_length(to_light); + l = vec3_normalize(to_light); + shadow_ray.origin = vec3_add(hitPoint, vec3_scale(l, epsilon)); + shadow_ray.dir = l; + if (check_shadow_sphere(shadow_ray, max_t, scene)) return (true); - if (checkShadowPlane(shadowRay, maxT, epsilon, scene)) + if (check_shadow_plane(shadow_ray, max_t, scene)) return (true); - if (checkShadowCylinder(shadowRay, maxT, epsilon, scene)) + if (check_shadow_cylinder(shadow_ray, max_t, scene)) return (true); return (false); } diff --git a/tags b/tags index 3c0bb97..89f06b8 100644 --- a/tags +++ b/tags @@ -291,11 +291,11 @@ camera miniRT.h /^ t_camera camera;$/;" m struct:s_scene typeref:typename:t_came center miniRT.h /^ t_vec3 center;$/;" m struct:s_cylinder typeref:typename:t_vec3 center miniRT.h /^ t_vec3 center;$/;" m struct:s_sphere typeref:typename:t_vec3 check minilibx-linux/Makefile.mk /^check: all$/;" t -checkShadowCylinder shadows.c /^static bool checkShadowCylinder(const t_ray shadowRay, float maxT,$/;" f typeref:typename:bool file: -checkShadowPlane shadows.c /^static bool checkShadowPlane(const t_ray shadowRay, float maxT, float epsilon,$/;" f typeref:typename:bool file: -checkShadowSphere shadows.c /^static bool checkShadowSphere(const t_ray shadowRay, float maxT, float epsilon,$/;" f typeref:typename:bool file: check_if_max check.c /^void check_if_max(t_scene scene, const int to_test, const int max)$/;" f typeref:typename:void -check_sign ft_atof.c /^inline static char *check_sign(char *str, int *sign)$/;" f typeref:typename:char * file: +check_shadow_cylinder shadows.c /^static bool check_shadow_cylinder(const t_ray shadow_ray, \\$/;" f typeref:typename:bool file: +check_shadow_plane shadows.c /^static bool check_shadow_plane(const t_ray shadow_ray, \\$/;" f typeref:typename:bool file: +check_shadow_sphere shadows.c /^static bool check_shadow_sphere(const t_ray shadow_ray, \\$/;" f typeref:typename:bool file: +check_sign ft_atof.c /^inline static char *check_sign(char *str, int *sign)$/;" f typeref:typename:char * file: check_tokens check.c /^int check_tokens(char **tokens, int expected)$/;" f typeref:typename:int clean libft/Makefile /^clean:$/;" t clean makefile /^clean:$/;" t @@ -438,7 +438,7 @@ intersectCylinder parsing_cylinder_utils.c /^float intersectCylinder(t_ray ray, intersectObjects trace.c /^bool intersectObjects(t_ray ray, float *tMin, t_vec3 *hitNormal,$/;" f typeref:typename:bool intersectPlane parsing_plane.c /^float intersectPlane(t_ray ray, t_plane p, t_vec3 *hitNormal)$/;" f typeref:typename:float intersectSphere parsing_sphere.c /^float intersectSphere(t_ray ray, t_sphere s, t_vec3 *hitNormal)$/;" f typeref:typename:float -isInShadow shadows.c /^bool isInShadow(t_vec3 hitPoint, t_vec3 lightPos, t_scene scene)$/;" f typeref:typename:bool +is_in_shadow shadows.c /^bool is_in_shadow(t_vec3 hitPoint, t_vec3 lightPos, t_scene scene)$/;" f typeref:typename:bool key_a miniRT.h /^ int key_a;$/;" m struct:s_app typeref:typename:int key_d miniRT.h /^ int key_d;$/;" m struct:s_app typeref:typename:int key_down miniRT.h /^ int key_down;$/;" m struct:s_app typeref:typename:int diff --git a/trace.c b/trace.c index b62e03e..02e9753 100644 --- a/trace.c +++ b/trace.c @@ -6,7 +6,7 @@ /* By: yantoine +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2025/02/17 19:07:07 by yantoine #+# #+# */ -/* Updated: 2025/02/18 17:15:32 by yantoine ### ########.fr */ +/* Updated: 2025/02/18 17:40:17 by yantoine ### ########.fr */ /* */ /* ************************************************************************** */ @@ -84,7 +84,7 @@ t_vec3 calcLighting(t_vec3 hitPoint, t_vec3 hitNormal, t_vec3 objColor, { light = scene.lights[i]; L = vec3_normalize(vec3_sub(light.pos, hitPoint)); - if (!isInShadow(hitPoint, light.pos, scene)) + if (!is_in_shadow(hitPoint, light.pos, scene)) { diff = fmaxf(0.0f, vec3_dot(hitNormal, L)); viewDir = vec3_normalize(vec3_sub(scene.camera.camPos, hitPoint));