update norme

This commit is contained in:
H3XploR
2025-02-19 16:30:41 +01:00
parent 1ecd5c5658
commit a8f9e1724a
5 changed files with 169 additions and 88 deletions
+112
View File
@@ -0,0 +1,112 @@
/* ************************************************************************** */
/* */
/* ::: :::::::: */
/* intersect_objects.c :+: :+: :+: */
/* +:+ +:+ +:+ */
/* By: yantoine <yantoine@student.42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2025/02/19 16:07:55 by yantoine #+# #+# */
/* Updated: 2025/02/19 16:16:52 by yantoine ### ########.fr */
/* */
/* ************************************************************************** */
#include "miniRT.h"
static bool intersect_spheres(const t_ray ray, t_hit *hit, t_sphere *spheres,
int numSpheres)
{
int i;
bool hitAny;
t_vec3 n;
float t;
i = 0;
hitAny = false;
while (i < numSpheres)
{
t = intersect_sphere(ray, spheres[i], &n);
if (t > 1e-3f && t < hit->t)
{
hit->t = t;
hit->normal = n;
hit->color = spheres[i].color;
hitAny = true;
}
i++;
}
return (hitAny);
}
static bool intersect_planes(const t_ray ray, t_hit *hit, t_plane *planes,
int numPlanes)
{
int i;
bool hitAny;
t_vec3 n;
float t;
i = 0;
hitAny = false;
while (i < numPlanes)
{
t = intersect_plane(ray, planes[i], &n);
if (t > 1e-3f && t < hit->t)
{
hit->t = t;
hit->normal = n;
hit->color = planes[i].color;
hitAny = true;
}
i++;
}
return (hitAny);
}
static bool intersect_cylinders(const t_ray ray, t_hit *hit,
t_cylinder *cylinders, int numCylinders)
{
int i;
bool hitAny;
t_vec3 n;
float t;
i = 0;
hitAny = false;
while (i < numCylinders)
{
t = intersect_cylinder(ray, cylinders[i], &n);
if (t > 1e-3f && t < hit->t)
{
hit->t = t;
hit->normal = n;
hit->color = cylinders[i].color;
hitAny = true;
}
i++;
}
return (hitAny);
}
bool intersect_objects(float *tMin, t_vec3 *hitNormal, t_vec3 *objColor,
t_scene scene)
{
t_hit hit;
bool hitFound;
hitFound = false;
hit.t = *tMin;
if (intersect_spheres(scene.ray, &hit, scene.spheres, scene.numSpheres))
hitFound = true;
if (intersect_planes(scene.ray, &hit, scene.planes, scene.numPlanes))
hitFound = true;
if (intersect_cylinders(scene.ray, &hit, scene.cylinders,
scene.numCylinders))
hitFound = true;
if (hitFound)
{
*tMin = hit.t;
*hitNormal = hit.normal;
*objColor = hit.color;
}
return (hitFound);
}
Executable
BIN
View File
Binary file not shown.
+16 -2
View File
@@ -6,7 +6,7 @@
/* By: yantoine <yantoine@student.42.fr> +#+ +:+ +#+ */ /* By: yantoine <yantoine@student.42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */ /* +#+#+#+#+#+ +#+ */
/* Created: 2025/02/13 20:02:36 by yantoine #+# #+# */ /* Created: 2025/02/13 20:02:36 by yantoine #+# #+# */
/* Updated: 2025/02/18 20:43:16 by yantoine ### ########.fr */ /* Updated: 2025/02/19 16:27:24 by yantoine ### ########.fr */
/* */ /* */
/* ************************************************************************** */ /* ************************************************************************** */
@@ -88,6 +88,13 @@ typedef struct s_ambient
t_vec3 color; t_vec3 color;
} t_ambient; } t_ambient;
typedef struct s_hit
{
float t;
t_vec3 normal;
t_vec3 color;
} t_hit;
typedef struct s_camera typedef struct s_camera
{ {
t_vec3 camPos; t_vec3 camPos;
@@ -184,6 +191,13 @@ typedef struct s_calc
t_ray ray; t_ray ray;
t_vec3 ray_dir; t_vec3 ray_dir;
t_vec3 color; t_vec3 color;
t_light light;
t_vec3 l;
float diff;
t_vec3 view_dir;
t_vec3 half_dir;
float spec;
} t_calc; } t_calc;
// Calcul de vecteur // Calcul de vecteur
@@ -224,7 +238,7 @@ float intersect_sphere(t_ray ray, t_sphere s, t_vec3 *hitNormal);
bool is_in_shadow(t_vec3 hitPoint, t_vec3 lightPos, t_scene scene); bool is_in_shadow(t_vec3 hitPoint, t_vec3 lightPos, t_scene scene);
bool intersect_objects(float *tMin, t_vec3 *hitNormal, bool intersect_objects(float *tMin, t_vec3 *hitNormal,
t_vec3 *objColor, t_scene scene); t_vec3 *objColor, t_scene scene);
t_vec3 calcLighting(t_vec3 hitPoint, t_vec3 hitNormal, t_vec3 objColor, t_vec3 calc_lighting(t_vec3 hitPoint, t_vec3 hitNormal, t_vec3 objColor,
t_scene scene); t_scene scene);
t_vec3 trace(t_ray ray, t_scene scene); t_vec3 trace(t_ray ray, t_scene scene);
+16 -2
View File
@@ -284,7 +284,7 @@ bpp3 minilibx-linux/test/main.c /^int bpp3;$/;" v typeref:typename:int
bpp4 minilibx-linux/test/main.c /^int bpp4;$/;" v typeref:typename:int bpp4 minilibx-linux/test/main.c /^int bpp4;$/;" v typeref:typename:int
brightness miniRT.h /^ float brightness;$/;" m struct:s_light typeref:typename:float brightness miniRT.h /^ float brightness;$/;" m struct:s_light typeref:typename:float
c miniRT.h /^ float c;$/;" m struct:s_calc typeref:typename:float c miniRT.h /^ float c;$/;" m struct:s_calc typeref:typename:float
calcLighting trace.c /^t_vec3 calcLighting(t_vec3 hitPoint, t_vec3 hitNormal, t_vec3 objColor,$/;" f typeref:typename:t_vec3 calc_lighting trace.c /^t_vec3 calc_lighting(t_vec3 hitPoint, t_vec3 hitNormal, t_vec3 objColor,$/;" f typeref:typename:t_vec3
camDir miniRT.h /^ t_vec3 camDir;$/;" m struct:s_camera typeref:typename:t_vec3 camDir miniRT.h /^ t_vec3 camDir;$/;" m struct:s_camera typeref:typename:t_vec3
camPos miniRT.h /^ t_vec3 camPos;$/;" m struct:s_camera typeref:typename:t_vec3 camPos miniRT.h /^ t_vec3 camPos;$/;" m struct:s_camera typeref:typename:t_vec3
camera miniRT.h /^ t_camera camera;$/;" m struct:s_scene typeref:typename:t_camera camera miniRT.h /^ t_camera camera;$/;" m struct:s_scene typeref:typename:t_camera
@@ -311,6 +311,7 @@ color miniRT.h /^ t_vec3 color;$/;" m struct:s_cylinder typeref:typename:t_vec3
color miniRT.h /^ t_vec3 color;$/;" m struct:s_light typeref:typename:t_vec3 color miniRT.h /^ t_vec3 color;$/;" m struct:s_light typeref:typename:t_vec3
color miniRT.h /^ t_vec3 color;$/;" m struct:s_plane typeref:typename:t_vec3 color miniRT.h /^ t_vec3 color;$/;" m struct:s_plane typeref:typename:t_vec3
color miniRT.h /^ t_vec3 color;$/;" m struct:s_sphere typeref:typename:t_vec3 color miniRT.h /^ t_vec3 color;$/;" m struct:s_sphere typeref:typename:t_vec3
color miniRT.h /^ t_vec3 color;$/;" m struct:s_hit typeref:typename:t_vec3
color minilibx-linux/mlx_int.h /^ int color;$/;" m struct:s_col_name typeref:typename:int color minilibx-linux/mlx_int.h /^ int color;$/;" m struct:s_col_name typeref:typename:int
color_map_1 minilibx-linux/test/main.c /^int color_map_1(void *win,int w,int h)$/;" f typeref:typename:int color_map_1 minilibx-linux/test/main.c /^int color_map_1(void *win,int w,int h)$/;" f typeref:typename:int
color_map_2 minilibx-linux/test/main.c /^int color_map_2(unsigned char *data,int bpp,int sl,int w,int h,int endian, int type)$/;" f typeref:typename:int color_map_2 minilibx-linux/test/main.c /^int color_map_2(unsigned char *data,int bpp,int sl,int w,int h,int endian, int type)$/;" f typeref:typename:int
@@ -332,6 +333,7 @@ data3 minilibx-linux/test/main.c /^char *data3;$/;" v typeref:typename:char *
data4 minilibx-linux/test/main.c /^char *data4;$/;" v typeref:typename:char * data4 minilibx-linux/test/main.c /^char *data4;$/;" v typeref:typename:char *
decrgb minilibx-linux/mlx_int.h /^ int decrgb[6];$/;" m struct:s_xvar typeref:typename:int[6] decrgb minilibx-linux/mlx_int.h /^ int decrgb[6];$/;" m struct:s_xvar typeref:typename:int[6]
depth minilibx-linux/mlx_int.h /^ int depth;$/;" m struct:s_xvar typeref:typename:int depth minilibx-linux/mlx_int.h /^ int depth;$/;" m struct:s_xvar typeref:typename:int
diff miniRT.h /^ float diff;$/;" m struct:s_calc typeref:typename:float
dir miniRT.h /^ t_vec3 dir;$/;" m struct:s_ray typeref:typename:t_vec3 dir miniRT.h /^ t_vec3 dir;$/;" m struct:s_ray typeref:typename:t_vec3
disc miniRT.h /^ float disc;$/;" m struct:s_calc typeref:typename:float disc miniRT.h /^ float disc;$/;" m struct:s_calc typeref:typename:float
display minilibx-linux/mlx_int.h /^ Display *display;$/;" m struct:s_xvar typeref:typename:Display * display minilibx-linux/mlx_int.h /^ Display *display;$/;" m struct:s_xvar typeref:typename:Display *
@@ -419,6 +421,7 @@ gnl_ft_strchr libft/gnl_utils.c /^char *gnl_ft_strchr(char *s, int c)$/;" f type
gnl_ft_strjoin libft/gnl_utils.c /^char *gnl_ft_strjoin(char *s1, char *s2)$/;" f typeref:typename:char * gnl_ft_strjoin libft/gnl_utils.c /^char *gnl_ft_strjoin(char *s1, char *s2)$/;" f typeref:typename:char *
gnl_ft_strlen libft/gnl_utils.c /^size_t gnl_ft_strlen(char *s)$/;" f typeref:typename:size_t gnl_ft_strlen libft/gnl_utils.c /^size_t gnl_ft_strlen(char *s)$/;" f typeref:typename:size_t
gnl_read_fd libft/gnl.c /^char *gnl_read_fd(int fd, char *str)$/;" f typeref:typename:char * gnl_read_fd libft/gnl.c /^char *gnl_read_fd(int fd, char *str)$/;" f typeref:typename:char *
half_dir miniRT.h /^ t_vec3 half_dir;$/;" m struct:s_calc typeref:typename:t_vec3
height miniRT.h /^ float height;$/;" m struct:s_cylinder typeref:typename:float height miniRT.h /^ float height;$/;" m struct:s_cylinder typeref:typename:float
height minilibx-linux/mlx_int.h /^ int height;$/;" m struct:s_img typeref:typename:int height minilibx-linux/mlx_int.h /^ int height;$/;" m struct:s_img typeref:typename:int
hitPoint miniRT.h /^ t_vec3 hitPoint;$/;" m struct:s_calc typeref:typename:t_vec3 hitPoint miniRT.h /^ t_vec3 hitPoint;$/;" m struct:s_calc typeref:typename:t_vec3
@@ -434,10 +437,13 @@ img miniRT.h /^ void *img;$/;" m struct:s_app typeref:typename:void *
init_app_config main.c /^static int init_app_config(t_app *app, int argc, char **argv)$/;" f typeref:typename:int file: init_app_config main.c /^static int init_app_config(t_app *app, int argc, char **argv)$/;" f typeref:typename:int file:
init_intersection parsing_cylinder_utils.c /^int init_intersection(t_ray ray, t_cylinder cy, t_calc *calc)$/;" f typeref:typename:int init_intersection parsing_cylinder_utils.c /^int init_intersection(t_ray ray, t_cylinder cy, t_calc *calc)$/;" f typeref:typename:int
init_mlx_and_image main.c /^static int init_mlx_and_image(t_app *app)$/;" f typeref:typename:int file: init_mlx_and_image main.c /^static int init_mlx_and_image(t_app *app)$/;" f typeref:typename:int file:
interesct_objects trace.c /^bool interesct_objects(float *tMin, t_vec3 *hitNormal,$/;" f typeref:typename:bool
intersect_cylinder parsing_cylinder_utils2.c /^float intersect_cylinder(t_ray ray, t_cylinder cy, t_vec3 *hitNormal)$/;" f typeref:typename:float intersect_cylinder parsing_cylinder_utils2.c /^float intersect_cylinder(t_ray ray, t_cylinder cy, t_vec3 *hitNormal)$/;" f typeref:typename:float
intersect_cylinders intersect_objects.c /^static bool intersect_cylinders(const t_ray ray, t_hit *hit,$/;" f typeref:typename:bool file:
intersect_objects intersect_objects.c /^bool intersect_objects(float *tMin, t_vec3 *hitNormal, t_vec3 *objColor,$/;" f typeref:typename:bool
intersect_plane parsing_plane.c /^float intersect_plane(t_ray ray, t_plane p, t_vec3 *hitNormal)$/;" f typeref:typename:float intersect_plane parsing_plane.c /^float intersect_plane(t_ray ray, t_plane p, t_vec3 *hitNormal)$/;" f typeref:typename:float
intersect_planes intersect_objects.c /^static bool intersect_planes(const t_ray ray, t_hit *hit, t_plane *planes,$/;" f typeref:typename:bool file:
intersect_sphere parsing_sphere.c /^float intersect_sphere(t_ray ray, t_sphere s, t_vec3 *hitNormal)$/;" f typeref:typename:float intersect_sphere parsing_sphere.c /^float intersect_sphere(t_ray ray, t_sphere s, t_vec3 *hitNormal)$/;" f typeref:typename:float
intersect_spheres intersect_objects.c /^static bool intersect_spheres(const t_ray ray, t_hit *hit, t_sphere *spheres,$/;" f typeref:typename:bool file:
is_in_shadow shadows.c /^bool is_in_shadow(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_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_d miniRT.h /^ int key_d;$/;" m struct:s_app typeref:typename:int
@@ -454,7 +460,9 @@ key_w miniRT.h /^ int key_w;$/;" m struct:s_app typeref:typename:int
key_win1 minilibx-linux/test/main.c /^int key_win1(int key,void *p)$/;" f typeref:typename:int key_win1 minilibx-linux/test/main.c /^int key_win1(int key,void *p)$/;" f typeref:typename:int
key_win2 minilibx-linux/test/main.c /^int key_win2(int key,void *p)$/;" f typeref:typename:int key_win2 minilibx-linux/test/main.c /^int key_win2(int key,void *p)$/;" f typeref:typename:int
key_win3 minilibx-linux/test/main.c /^int key_win3(int key,void *p)$/;" f typeref:typename:int key_win3 minilibx-linux/test/main.c /^int key_win3(int key,void *p)$/;" f typeref:typename:int
l miniRT.h /^ t_vec3 l;$/;" m struct:s_calc typeref:typename:t_vec3
len_word libft/ft_split.c /^static size_t len_word(char *s, char c, size_t start)$/;" f typeref:typename:size_t file: len_word libft/ft_split.c /^static size_t len_word(char *s, char c, size_t start)$/;" f typeref:typename:size_t file:
light miniRT.h /^ t_light light;$/;" m struct:s_calc typeref:typename:t_light
lights miniRT.h /^ t_light lights[MAX_LIGHTS];$/;" m struct:s_scene typeref:typename:t_light[] lights miniRT.h /^ t_light lights[MAX_LIGHTS];$/;" m struct:s_scene typeref:typename:t_light[]
line_if_exit miniRT.h /^ char *line_if_exit;$/;" m struct:s_scene typeref:typename:char * line_if_exit miniRT.h /^ char *line_if_exit;$/;" m struct:s_scene typeref:typename:char *
load_config config.c /^t_scene load_config(const char *filename)$/;" f typeref:typename:t_scene load_config config.c /^t_scene load_config(const char *filename)$/;" f typeref:typename:t_scene
@@ -559,6 +567,7 @@ ndc_x miniRT.h /^ float ndc_x;$/;" m struct:s_calc typeref:typename:float
ndc_y miniRT.h /^ float ndc_y;$/;" m struct:s_calc typeref:typename:float ndc_y miniRT.h /^ float ndc_y;$/;" m struct:s_calc typeref:typename:float
next minilibx-linux/mlx_int.h /^ struct s_win_list *next;$/;" m struct:s_win_list typeref:struct:s_win_list * next minilibx-linux/mlx_int.h /^ struct s_win_list *next;$/;" m struct:s_win_list typeref:struct:s_win_list *
normal miniRT.h /^ t_vec3 normal;$/;" m struct:s_plane typeref:typename:t_vec3 normal miniRT.h /^ t_vec3 normal;$/;" m struct:s_plane typeref:typename:t_vec3
normal miniRT.h /^ t_vec3 normal;$/;" m struct:s_hit typeref:typename:t_vec3
numAmbient miniRT.h /^ int numAmbient;$/;" m struct:s_scene typeref:typename:int numAmbient miniRT.h /^ int numAmbient;$/;" m struct:s_scene typeref:typename:int
numCamera miniRT.h /^ int numCamera;$/;" m struct:s_scene typeref:typename:int numCamera miniRT.h /^ int numCamera;$/;" m struct:s_scene typeref:typename:int
numCylinders miniRT.h /^ int numCylinders;$/;" m struct:s_scene typeref:typename:int numCylinders miniRT.h /^ int numCylinders;$/;" m struct:s_scene typeref:typename:int
@@ -624,6 +633,7 @@ s_camera miniRT.h /^typedef struct s_camera$/;" s
s_col_name minilibx-linux/mlx_int.h /^struct s_col_name$/;" s s_col_name minilibx-linux/mlx_int.h /^struct s_col_name$/;" s
s_cylinder miniRT.h /^typedef struct s_cylinder$/;" s s_cylinder miniRT.h /^typedef struct s_cylinder$/;" s
s_event_list minilibx-linux/mlx_int.h /^typedef struct s_event_list$/;" s s_event_list minilibx-linux/mlx_int.h /^typedef struct s_event_list$/;" s
s_hit miniRT.h /^typedef struct s_hit$/;" s
s_img minilibx-linux/mlx_int.h /^typedef struct s_img$/;" s s_img minilibx-linux/mlx_int.h /^typedef struct s_img$/;" s
s_info libft/libft.h /^struct s_info$/;" s s_info libft/libft.h /^struct s_info$/;" s
s_light miniRT.h /^typedef struct s_light$/;" s s_light miniRT.h /^typedef struct s_light$/;" s
@@ -655,10 +665,12 @@ sl1 minilibx-linux/test/main.c /^int sl1;$/;" v typeref:typename:int
sl2 minilibx-linux/test/main.c /^int sl2;$/;" v typeref:typename:int sl2 minilibx-linux/test/main.c /^int sl2;$/;" v typeref:typename:int
sl3 minilibx-linux/test/main.c /^int sl3;$/;" v typeref:typename:int sl3 minilibx-linux/test/main.c /^int sl3;$/;" v typeref:typename:int
sl4 minilibx-linux/test/main.c /^int sl4;$/;" v typeref:typename:int sl4 minilibx-linux/test/main.c /^int sl4;$/;" v typeref:typename:int
spec miniRT.h /^ float spec;$/;" m struct:s_calc typeref:typename:float
spheres miniRT.h /^ t_sphere spheres[MAX_SPHERES];$/;" m struct:s_scene typeref:typename:t_sphere[] spheres miniRT.h /^ t_sphere spheres[MAX_SPHERES];$/;" m struct:s_scene typeref:typename:t_sphere[]
sqrtDisc miniRT.h /^ float sqrtDisc;$/;" m struct:s_calc typeref:typename:float sqrtDisc miniRT.h /^ float sqrtDisc;$/;" m struct:s_calc typeref:typename:float
strlcpy_is_not_posix minilibx-linux/mlx_xpm.c /^unsigned int strlcpy_is_not_posix(char *dest, char *src, unsigned int size)$/;" f typeref:typename:unsigned int strlcpy_is_not_posix minilibx-linux/mlx_xpm.c /^unsigned int strlcpy_is_not_posix(char *dest, char *src, unsigned int size)$/;" f typeref:typename:unsigned int
t miniRT.h /^ float t;$/;" m struct:s_calc typeref:typename:float t miniRT.h /^ float t;$/;" m struct:s_calc typeref:typename:float
t miniRT.h /^ float t;$/;" m struct:s_hit typeref:typename:float
t0 miniRT.h /^ float t0;$/;" m struct:s_calc typeref:typename:float t0 miniRT.h /^ float t0;$/;" m struct:s_calc typeref:typename:float
t1 miniRT.h /^ float t1;$/;" m struct:s_calc typeref:typename:float t1 miniRT.h /^ float t1;$/;" m struct:s_calc typeref:typename:float
t_ambient miniRT.h /^} t_ambient;$/;" t typeref:struct:s_ambient t_ambient miniRT.h /^} t_ambient;$/;" t typeref:struct:s_ambient
@@ -670,6 +682,7 @@ t_cap miniRT.h /^ float t_cap;$/;" m struct:s_calc typeref:typename:float
t_cylinder miniRT.h /^} t_cylinder;$/;" t typeref:struct:s_cylinder t_cylinder miniRT.h /^} t_cylinder;$/;" t typeref:struct:s_cylinder
t_event_list minilibx-linux/mlx_int.h /^} t_event_list;$/;" t typeref:struct:s_event_list t_event_list minilibx-linux/mlx_int.h /^} t_event_list;$/;" t typeref:struct:s_event_list
t_final miniRT.h /^ float t_final;$/;" m struct:s_calc typeref:typename:float t_final miniRT.h /^ float t_final;$/;" m struct:s_calc typeref:typename:float
t_hit miniRT.h /^} t_hit;$/;" t typeref:struct:s_hit
t_img minilibx-linux/mlx_int.h /^} t_img;$/;" t typeref:struct:s_img t_img minilibx-linux/mlx_int.h /^} t_img;$/;" t typeref:struct:s_img
t_info libft/libft.h /^typedef struct s_info t_info;$/;" t typeref:struct:s_info t_info libft/libft.h /^typedef struct s_info t_info;$/;" t typeref:struct:s_info
t_light miniRT.h /^} t_light;$/;" t typeref:struct:s_light t_light miniRT.h /^} t_light;$/;" t typeref:struct:s_light
@@ -705,6 +718,7 @@ vec3_mul calcul_de_vecteur2.c /^t_vec3 vec3_mul(t_vec3 a, t_vec3 b)$/;" f typere
vec3_normalize calcul_de_vecteur2.c /^t_vec3 vec3_normalize(t_vec3 a)$/;" f typeref:typename:t_vec3 vec3_normalize calcul_de_vecteur2.c /^t_vec3 vec3_normalize(t_vec3 a)$/;" f typeref:typename:t_vec3
vec3_scale calcul_de_vecteur.c /^t_vec3 vec3_scale(t_vec3 a, float s)$/;" f typeref:typename:t_vec3 vec3_scale calcul_de_vecteur.c /^t_vec3 vec3_scale(t_vec3 a, float s)$/;" f typeref:typename:t_vec3
vec3_sub calcul_de_vecteur.c /^t_vec3 vec3_sub(t_vec3 a, t_vec3 b)$/;" f typeref:typename:t_vec3 vec3_sub calcul_de_vecteur.c /^t_vec3 vec3_sub(t_vec3 a, t_vec3 b)$/;" f typeref:typename:t_vec3
view_dir miniRT.h /^ t_vec3 view_dir;$/;" m struct:s_calc typeref:typename:t_vec3
visual minilibx-linux/mlx_int.h /^ Visual *visual;$/;" m struct:s_xvar typeref:typename:Visual * visual minilibx-linux/mlx_int.h /^ Visual *visual;$/;" m struct:s_xvar typeref:typename:Visual *
width minilibx-linux/mlx_int.h /^ int width;$/;" m struct:s_img typeref:typename:int width minilibx-linux/mlx_int.h /^ int width;$/;" m struct:s_img typeref:typename:int
win miniRT.h /^ void *win;$/;" m struct:s_app typeref:typename:void * win miniRT.h /^ void *win;$/;" m struct:s_app typeref:typename:void *
+25 -84
View File
@@ -6,104 +6,45 @@
/* By: yantoine <yantoine@student.42.fr> +#+ +:+ +#+ */ /* By: yantoine <yantoine@student.42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */ /* +#+#+#+#+#+ +#+ */
/* Created: 2025/02/17 19:07:07 by yantoine #+# #+# */ /* Created: 2025/02/17 19:07:07 by yantoine #+# #+# */
/* Updated: 2025/02/18 20:34:28 by yantoine ### ########.fr */ /* Updated: 2025/02/19 16:30:27 by yantoine ### ########.fr */
/* */ /* */
/* ************************************************************************** */ /* ************************************************************************** */
#include "miniRT.h" #include "miniRT.h"
// Renvoie true si le rayon intersecte un objet, et met à jour tMin,
//hitNormal et objColor
bool interesct_objects(float *tMin, t_vec3 *hitNormal,
t_vec3 *objColor, t_scene scene)
{
bool hit;
float t;
t_vec3 n;
int i;
hit = false;
i = 0;
while (i < scene.numSpheres)
{
t = intersect_sphere(scene.ray, scene.spheres[i], &n);
if (t > 1e-3f && t < *tMin)
{
*tMin = t;
*hitNormal = n;
*objColor = scene.spheres[i].color;
hit = true;
}
i++;
}
i = 0;
while (i < scene.numPlanes)
{
t = intersect_plane(scene.ray, scene.planes[i], &n);
if (t > 1e-3f && t < *tMin)
{
*tMin = t;
*hitNormal = n;
*objColor = scene.planes[i].color;
hit = true;
}
i++;
}
i = 0;
while (i < scene.numCylinders)
{
t = intersect_cylinder(scene.ray, scene.cylinders[i], &n);
if (t > 1e-3f && t < *tMin)
{
*tMin = t;
*hitNormal = n;
*objColor = scene.cylinders[i].color;
hit = true;
}
i++;
}
return (hit);
}
// Calcule l'éclairage (ambiant, diffus et spéculaire) sur un point d'impact // Calcule l'éclairage (ambiant, diffus et spéculaire) sur un point d'impact
t_vec3 calcLighting(t_vec3 hitPoint, t_vec3 hitNormal, t_vec3 objColor, t_vec3 calc_lighting(t_vec3 hitPoint, t_vec3 hitNormal, t_vec3 objColor,
t_scene scene) t_scene scene)
{ {
t_vec3 color;
int i; int i;
t_light light; t_calc calc;
t_vec3 L;
float diff;
t_vec3 viewDir;
t_vec3 halfDir;
float spec;
color = vec3_scale(objColor, scene.ambient.ratio); calc.color = vec3_scale(objColor, scene.ambient.ratio);
i = 0; i = 0;
while (i < scene.numLights) while (i < scene.numLights)
{ {
light = scene.lights[i]; calc.light = scene.lights[i];
L = vec3_normalize(vec3_sub(light.pos, hitPoint)); calc.l = vec3_normalize(vec3_sub(calc.light.pos, hitPoint));
if (!is_in_shadow(hitPoint, light.pos, scene)) if (!is_in_shadow(hitPoint, calc.light.pos, scene))
{ {
diff = fmaxf(0.0f, vec3_dot(hitNormal, L)); calc.diff = fmaxf(0.0f, vec3_dot(hitNormal, calc.l));
viewDir = vec3_normalize(vec3_sub(scene.camera.camPos, hitPoint)); calc.view_dir = vec3_normalize(vec3_sub(scene.camera.camPos, hitPoint));
halfDir = vec3_normalize(vec3_add(L, viewDir)); calc.half_dir = vec3_normalize(vec3_add(calc.l, calc.view_dir));
spec = powf(fmaxf(0.0f, vec3_dot(hitNormal, halfDir)), 32.0f); calc.spec = powf(fmaxf(0.0f, vec3_dot(hitNormal, calc.half_dir)), 32.0f);
color = vec3_add(color, vec3_scale(vec3_mul(objColor, light.color), calc.color = vec3_add(calc.color, vec3_scale(vec3_mul(objColor, calc.light.color),
diff * light.brightness)); calc.diff * calc.light.brightness));
color = vec3_add(color, vec3_scale((t_vec3){1, 1, 1}, spec calc.color = vec3_add(calc.color, vec3_scale((t_vec3){1, 1, 1}, calc.spec
* light.brightness)); * calc.light.brightness));
} }
i++; i++;
} }
if (color.x > 1.0f) if (calc.color.x > 1.0f)
color.x = 1.0f; calc.color.x = 1.0f;
if (color.y > 1.0f) if (calc.color.y > 1.0f)
color.y = 1.0f; calc.color.y = 1.0f;
if (color.z > 1.0f) if (calc.color.z > 1.0f)
color.z = 1.0f; calc.color.z = 1.0f;
return (color); return (calc.color);
} }
// Fonction principale de lancer de rayon (trace) // Fonction principale de lancer de rayon (trace)
@@ -118,10 +59,10 @@ t_vec3 trace(t_ray ray, t_scene scene)
hitNormal = (t_vec3){0, 0, 0}; hitNormal = (t_vec3){0, 0, 0};
objColor = (t_vec3){0, 0, 0}; objColor = (t_vec3){0, 0, 0};
scene.ray = ray; scene.ray = ray;
if (interesct_objects(&tMin, &hitNormal, &objColor, scene)) if (intersect_objects(&tMin, &hitNormal, &objColor, scene))
{ {
hitPoint = vec3_add(scene.ray.origin, vec3_scale(scene.ray.dir, tMin)); hitPoint = vec3_add(scene.ray.origin, vec3_scale(scene.ray.dir, tMin));
return (calcLighting(hitPoint, hitNormal, objColor, scene)); return (calc_lighting(hitPoint, hitNormal, objColor, scene));
} }
return ((t_vec3){0.2f, 0.7f, 1.0f}); // Couleur de fond (ciel) return ((t_vec3){0, 0, 0}); // Couleur de fond (ciel)
} }