From 801cc27679103b2507f2772f50a62d9dc0fc4b79 Mon Sep 17 00:00:00 2001 From: Arsenii Evstigneev Date: Wed, 28 May 2025 16:36:15 +0200 Subject: [PATCH 01/19] Add null checks --- src/exit.c | 6 +++++- src/init.c | 3 +++ src/window.c | 2 ++ 3 files changed, 10 insertions(+), 1 deletion(-) diff --git a/src/exit.c b/src/exit.c index 32351a0..0d4dd77 100644 --- a/src/exit.c +++ b/src/exit.c @@ -47,6 +47,10 @@ void free_data(t_data *data) ft_lstclear(&data->shapes, &free); if (data->scene) free(data->scene); - close(data->scenefd); + if (data->scenefd != -1) + { + close(data->scenefd); + data->scenefd = -1; + } free(data); } diff --git a/src/init.c b/src/init.c index 63d94b2..12bf5ac 100644 --- a/src/init.c +++ b/src/init.c @@ -54,6 +54,7 @@ int init_program(t_data *data, int argc, char **argv) if (argc != 2) { perror("You must provide a file name of scene"); + free_data(data); return (-1); } data->filename = argv[1]; @@ -62,7 +63,9 @@ int init_program(t_data *data, int argc, char **argv) check_file_empty(data); init_scene(data); data->scene_img[0] = malloc(sizeof(t_img)); + check_scene_alloc(data, data->scene_img[0]); data->scene_img[1] = malloc(sizeof(t_img)); + check_scene_alloc(data, data->scene_img[1]); init_objects(data); printf("INIT data->frame: %d\n", data->frame); return (0); diff --git a/src/window.c b/src/window.c index 327c146..0359220 100644 --- a/src/window.c +++ b/src/window.c @@ -18,6 +18,7 @@ int init_mlx_window(t_data *data) if (!data->mlx_ptr) { perror("Error mlx_init()\n"); + free_data(data); return (-1); } data->win_ptr = mlx_new_window(data->mlx_ptr, WIN_WIDTH, WIN_HEIGHT, @@ -25,6 +26,7 @@ int init_mlx_window(t_data *data) if (!data->win_ptr) { perror("Error mlx_new_window()\n"); + free_data(data); return (-1); } return (0); From fc6cc78d8225f6ab1d109fb21443abd371638751 Mon Sep 17 00:00:00 2001 From: Arsenii Evstigneev Date: Wed, 28 May 2025 17:36:38 +0200 Subject: [PATCH 02/19] fix: endless loop if new line in EOF --- src/parser.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/parser.c b/src/parser.c index 58bc342..c2212c1 100644 --- a/src/parser.c +++ b/src/parser.c @@ -73,9 +73,9 @@ void do_lines(t_data *data, char ***lines) while (true) { read_state = read_next_line(data->scenefd, line, &i); - if (read_state == 0) + if (read_state <= 0 && i == 0) break ; - else if (read_state == -1) + if (read_state == -1) cleanup_and_exit(data, current, *lines, "Couldn't read scene"); if (i == 0) continue ; From 127f34f2b05f50f0abe52a1487bd043df3062d1e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vojte=CC=8Cch=20Parka=CC=81n?= Date: Mon, 2 Jun 2025 11:31:11 +0200 Subject: [PATCH 03/19] fix center of cylindre, caps still empty --- cylindre.rt | 7 ++++--- include/minirt.h | 8 ++++++-- main.c | 6 +++--- multiobject.rt | 7 +++---- multiobject2.rt | 7 ++----- src/vec/cy_utils.c | 41 +++++++++++++++++++++++++++-------------- src/vec/ray.c | 22 ++++++++++++++++++---- 7 files changed, 63 insertions(+), 35 deletions(-) diff --git a/cylindre.rt b/cylindre.rt index 166cc9f..569f98d 100644 --- a/cylindre.rt +++ b/cylindre.rt @@ -1,4 +1,5 @@ A .5 125,125,125 -L 40,-75,100 .8 255,255,255 -C 1,-10,8 0,0.3,-1 60 -cy 0,-3,-1 0,1,0 4 8 140,118,206 +L 4,10,25 .8 255,255,255 +C 0,0,12 0,0,-1 60 +cy 0,0,0 0,0.1,-0.9 2 8 140,118,206 +# \ No newline at end of file diff --git a/include/minirt.h b/include/minirt.h index ad5e5e8..b682f60 100644 --- a/include/minirt.h +++ b/include/minirt.h @@ -171,6 +171,8 @@ typedef struct s_cybag float denom; float t_cap; float crb; + float sign; + float half_h; t_vec sub; t_vec oc; t_vec nor_cyl; @@ -190,6 +192,7 @@ typedef struct s_hit_record t_vec normal; t_shapes *object; bool hit; + bool is_cap; } t_hit_record; void do_j_bzero(t_obag *ob); @@ -252,19 +255,20 @@ void iter_pl(t_data *data, char *tmp, t_shapes *pl_shape); void iter_sp(t_data *data, char *tmp, t_shapes *sp_shape); void iter_cy(t_data *data, char *tmp, t_shapes *cy_shape); void move_cp_buf(char *tmp, t_obag *ob); -float process_cy_cap(t_cybag b, t_shapes *shp, t_ray ray); +float process_cy_cap(t_cybag b, t_shapes *shp, t_ray ray, t_hit_record *rec); float process_cy_body(t_cybag b, t_shapes *shp, t_ray ray); /*rays*/ t_ray shoot_ray(int x, int y, t_data *data); bool ray_inter_sp(t_ray ray, t_shapes *shp, float *t); bool ray_inter_pl(t_ray ray, t_shapes *shp, float *t); -bool ray_inter_cy(t_ray ray, t_shapes *shp, float *t); +bool ray_inter_cy(t_ray ray, t_shapes *shp, float *t, t_hit_record *rec); void cast_rays(t_data *data); /*hit*/ bool hit_objects(t_data *data, t_ray ray, t_hit_record *rec); bool is_in_shadow(t_data *data, t_vec point, t_vec light_pos, t_vec normal); +void resolve_hit(t_hit_record *rec, float t, t_ray ray, t_shapes *shp); /*colors*/ int make_color(t_rgb rgb); diff --git a/main.c b/main.c index 8d143bc..069a710 100644 --- a/main.c +++ b/main.c @@ -39,11 +39,11 @@ void do_hit(t_ray ray, t_hit_record *rec, float *closest_t, t_shapes *shp) rec->normal = normalize(shp->axis); } if ((ft_strncmp(shp->identifier, "cy", 2) == 0) - && (ray_inter_cy(ray, shp, &t) && t < *closest_t)) + && (ray_inter_cy(ray, shp, &t, rec) && t < *closest_t)) { *closest_t = t; - resolve_hit(rec, t, ray, shp); - rec->normal = normalize(vec_sub(rec->point, shp->cords)); + //resolve_hit(rec, t, ray, shp); + //rec->normal = normalize(vec_sub(rec->point, shp->cords)); } } diff --git a/multiobject.rt b/multiobject.rt index 11275d4..e33810f 100644 --- a/multiobject.rt +++ b/multiobject.rt @@ -1,10 +1,9 @@ A 0.5 255,255,255 -C 0.0,-2.0,8.0 0,0,1 70 +C 0.0,-2.0,8.0 0,0,-1 70 L 40,-75,100 0.8 255,255,255 sp 2,-1,0 1.8 216,56,136 sp 2,-0.2,0 1.8 140,118,206 sp 0,2,0 1.4 216,56,136 -sq -1,0,-0.5 1,0,0 4 0,176,240 -sq 2,0,-0.5 1,0,0 4 0,176,240 cy 0,-2,0 0,1,0 0.8 4 255,204,0 -cy -3,0.6,0 1,0,0 0.8 7 255,204,0 \ No newline at end of file +cy -3,0.6,0 1,0,0 0.8 7 255,204,0 +# \ No newline at end of file diff --git a/multiobject2.rt b/multiobject2.rt index 7439fe3..a6ae77c 100644 --- a/multiobject2.rt +++ b/multiobject2.rt @@ -8,8 +8,5 @@ sp 0,2,0 1.4 216,56,136 pl 0,-2,0 0,1,0 140,118,206 -sq -1,0,-0.5 1,0,0 4 0,176,240 -sq 2,0,-0.5 1,0,0 4 0,176,240 - -cy 0,-1,0 0,2,0 0.8 4 255,204,0 -cy 0,0.6,0 1,2,0 0.8 7 255,204,0 \ No newline at end of file +cy 0,-1,0 0,1,0 0.8 4 255,204,0 +cy 0,0.6,0 1,0,0 0.8 7 255,204,0 \ No newline at end of file diff --git a/src/vec/cy_utils.c b/src/vec/cy_utils.c index 41e5ba5..83478c4 100644 --- a/src/vec/cy_utils.c +++ b/src/vec/cy_utils.c @@ -1,41 +1,54 @@ /* ************************************************************************** */ /* */ /* ::: :::::::: */ -/* ray.c :+: :+: :+: */ +/* cy_utils.c :+: :+: :+: */ /* +:+ +:+ +:+ */ -/* By: aevstign +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ -/* Created: 2025/05/11 11:29:07 by aevstign #+# #+# */ -/* Updated: 2025/05/14 19:13:33 by aevstign ### ########.fr */ +/* Created: 2025/05/31 13:12:32 by voparkan #+# #+# */ +/* Updated: 2025/05/31 14:15:30 by voparkan ### ########.fr */ /* */ /* ************************************************************************** */ #include "../../include/vec.h" #include "../../include/minirt.h" -float process_cy_cap(t_cybag b, t_shapes *shp, t_ray ray) +float process_cy_cap(t_cybag b, t_shapes *shp, t_ray ray, t_hit_record *hit) { + b.half_h = shp->height / 2.0f; b.i = 0; while (b.i < 2) { - b.cap_center = add(shp->cords, scale(b.nor_cyl, b.i * shp->height)); + if (b.i == 0) + b.sign = -1.0f; + else + b.sign = 1.0f; + b.cap_center = add(shp->cords, scale(b.nor_cyl, b.sign * b.half_h)); b.denom = vec_dot(&ray.dir, &b.nor_cyl); - if (fabs(b.denom) < EPSILON) - { - b.i++; - continue ; - } b.sub = vec_sub(b.cap_center, ray.origin); b.t_cap = vec_dot(&b.sub, &b.nor_cyl) / b.denom; - if (b.t_cap < 0) + if (b.t_cap < 0 || fabs(b.denom) < EPSILON) { b.i++; continue ; } b.mul = scale(ray.dir, b.t_cap); b.lp = add(ray.origin, b.mul); - if (vec_length(vec_sub(b.lp, b.cap_center)) <= b.radius) + t_vec dist = vec_sub(b.lp, b.cap_center); + if (vec_dot(&dist, &dist) <= b.radius * b.radius) { + printf("Testing cap %d: t_cap=%.4f, lp=(%.2f,%.2f,%.2f), center=(%.2f,%.2f,%.2f), dist=%.4f\n", + b.i, b.t_cap, b.lp.x, b.lp.y, b.lp.z, b.cap_center.x, b.cap_center.y, b.cap_center.z, + vec_length(vec_sub(b.lp, b.cap_center))); + hit->t = b.t_cap; + hit->point = b.lp; + //hit->normal = scale(b.nor_cyl, b.sign); + t_vec cap_normal = scale(b.nor_cyl, b.sign); + if (vec_dot(&ray.dir, &cap_normal) > 0) + cap_normal = scale(cap_normal, -1); // flip if needed + hit->normal = cap_normal; + hit->is_cap = true; return (b.t_cap); + } b.i++; } return (-1.0f); @@ -55,7 +68,7 @@ float process_cy_body(t_cybag b, t_shapes *shp, t_ray ray) b.p = add(ray.origin, scale(ray.dir, b.ti)); b.p_b = vec_sub(b.p, shp->cords); b.height = vec_dot(&b.p_b, &b.nor_cyl); - if (b.height >= 0 && b.height <= shp->height) + if (b.height >= -shp->height / 2.0f && b.height <= shp->height / 2.0f) return (b.ti); ++b.i; } diff --git a/src/vec/ray.c b/src/vec/ray.c index 54c6118..baab5be 100644 --- a/src/vec/ray.c +++ b/src/vec/ray.c @@ -1,3 +1,15 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ray.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: voparkan +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2025/05/31 13:12:32 by voparkan #+# #+# */ +/* Updated: 2025/05/31 15:57:10 by voparkan ### ########.fr */ +/* */ +/* ************************************************************************** */ + /* ************************************************************************** */ /* */ /* ::: :::::::: */ @@ -75,9 +87,9 @@ bool ray_inter_pl(t_ray ray, t_shapes *shp, float *t) void calculate_cy_bag(t_cybag *b, t_shapes *shp, t_ray ray) { - b->radius = shp->diameter / 2; + b->radius = shp->diameter / 2.0f; + b->nor_cyl = normalize(shp->axis); b->oc = vec_sub(ray.origin, shp->cords); - b->nor_cyl = normalize(shp->cords); b->a = vec_sub(ray.dir, scale(b->nor_cyl, vec_dot(&ray.dir, &b->nor_cyl))); b->b = vec_sub(b->oc, scale(b->nor_cyl, vec_dot(&b->oc, &b->nor_cyl))); b->a_f = vec_dot(&b->a, &b->a); @@ -86,7 +98,7 @@ void calculate_cy_bag(t_cybag *b, t_shapes *shp, t_ray ray) b->discriminant = b->b_f * b->b_f - 4 * b->a_f * b->c_f; } -bool ray_inter_cy(t_ray ray, t_shapes *shp, float *t) +bool ray_inter_cy(t_ray ray, t_shapes *shp, float *t, t_hit_record *rec) { t_cybag b; @@ -102,9 +114,11 @@ bool ray_inter_cy(t_ray ray, t_shapes *shp, float *t) if (b.crb > 0) { *t = b.crb; + resolve_hit(rec, b.crb, ray, shp); + rec->normal = normalize(vec_sub(rec->point, shp->cords)); return (true); } - b.crb = process_cy_cap(b, shp, ray); + b.crb = process_cy_cap(b, shp, ray, rec); if (b.crb > 0) { *t = b.crb; From fea288df985a809e436f6235cff06c11c7e3e272 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vojte=CC=8Cch=20Parka=CC=81n?= Date: Mon, 2 Jun 2025 18:29:29 +0200 Subject: [PATCH 04/19] some light corrections try --- CMakeLists.txt | 5 ++++- cylindre.rt | 6 +++--- multiobject.rt | 2 +- src/colors.c | 4 ++-- src/shader.c | 11 +++++++---- src/vec/cy_utils.c | 4 ++-- test1.rt | 2 +- 7 files changed, 20 insertions(+), 14 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 0872c3b..692bf2f 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -6,7 +6,10 @@ set(CMAKE_C_STANDARD 99) add_executable(miniRT main.c include/minirt.h src/window.c src/parser.c src/init.c src/exit.c src/scene.c - src/object.c src/vec/t_vec_new.c src/vec/t_vec_ops.c src/vec/t_vec_products.c) + src/object.c src/vec/t_vec_new.c src/vec/t_vec_ops.c src/vec/t_vec_products.c + src/vec/ray.c + src/colors.c + src/shader.c) add_custom_target(makebuild COMMAND make -C ${mytest_SOURCE_DIR} CLION_EXE_DIR=${PROJECT_BINARY_DIR}) \ No newline at end of file diff --git a/cylindre.rt b/cylindre.rt index 569f98d..35daa03 100644 --- a/cylindre.rt +++ b/cylindre.rt @@ -1,5 +1,5 @@ -A .5 125,125,125 -L 4,10,25 .8 255,255,255 +A .9 125,125,125 +L -100,0,305 .9 255,255,255 C 0,0,12 0,0,-1 60 -cy 0,0,0 0,0.1,-0.9 2 8 140,118,206 +cy 0,0,0 1,0,0 2 8 140,118,206 # \ No newline at end of file diff --git a/multiobject.rt b/multiobject.rt index e33810f..1d5acd6 100644 --- a/multiobject.rt +++ b/multiobject.rt @@ -1,6 +1,6 @@ A 0.5 255,255,255 C 0.0,-2.0,8.0 0,0,-1 70 -L 40,-75,100 0.8 255,255,255 +L 40,-75,10 0.8 255,255,255 sp 2,-1,0 1.8 216,56,136 sp 2,-0.2,0 1.8 140,118,206 sp 0,2,0 1.4 216,56,136 diff --git a/src/colors.c b/src/colors.c index 9841060..9143b12 100644 --- a/src/colors.c +++ b/src/colors.c @@ -40,9 +40,9 @@ t_rgb calculate_diffuse(t_data *data, t_vec l_dir, t_rgb color, t_hit_record \ diffuse.r = (int)(data->scene->lght.bright * (float) \ data->scene->lght.rgb.r * (float) color.r * (float) factor / 255.0f); diffuse.g = (int)(data->scene->lght.bright * (float) \ - data->scene->lght.rgb.g * (float) color.g * (float) factor / 255.0f); + data->scene->lght.rgb.g * (float) color.g * (float) factor / 255.0f); // diffuse.b = (int)(data->scene->lght.bright * (float) \ - data->scene->lght.rgb.b * (float) color.b * (float) factor / 255.0f); + data->scene->lght.rgb.b * (float) color.b * (float) factor / 255.0f); // return (diffuse); } diff --git a/src/shader.c b/src/shader.c index b2da791..b06045e 100644 --- a/src/shader.c +++ b/src/shader.c @@ -30,13 +30,16 @@ t_rgb shader(t_rgb color, t_data *data, t_hit_record *rec) sb.mix_color = calculate_ambient(data, rec->object); if (is_in_shadow(data, rec->point, data->scene->lght.cords, rec->normal)) { - sb.softness = 0.2f + 0.5f * fmax(0.0, vec_dot(&rec->normal, &sb.l_dir)); + sb.softness = 0.2f;// + 0.5f * fmax(0.0, vec_dot(&rec->normal, &sb.l_dir)); sb.visibility = 0.2f; sb.factor *= sb.visibility; sb.diffuse = calculate_diffuse(data, sb.l_dir, color, rec); - sb.diffuse.r *= sb.softness; - sb.diffuse.g *= sb.softness; - sb.diffuse.b *= sb.softness; + //sb.diffuse.r *= sb.softness; + //sb.diffuse.g *= sb.softness; + //sb.diffuse.b *= sb.softness; + sb.diffuse.r = 0; + sb.diffuse.g = 0; + sb.diffuse.b = 0; } else sb.diffuse = calculate_diffuse(data, sb.l_dir, color, rec); diff --git a/src/vec/cy_utils.c b/src/vec/cy_utils.c index 83478c4..1fe8bea 100644 --- a/src/vec/cy_utils.c +++ b/src/vec/cy_utils.c @@ -36,9 +36,9 @@ float process_cy_cap(t_cybag b, t_shapes *shp, t_ray ray, t_hit_record *hit) b.lp = add(ray.origin, b.mul); t_vec dist = vec_sub(b.lp, b.cap_center); if (vec_dot(&dist, &dist) <= b.radius * b.radius) { - printf("Testing cap %d: t_cap=%.4f, lp=(%.2f,%.2f,%.2f), center=(%.2f,%.2f,%.2f), dist=%.4f\n", + /*printf("Testing cap %d: t_cap=%.4f, lp=(%.2f,%.2f,%.2f), center=(%.2f,%.2f,%.2f), dist=%.4f\n", b.i, b.t_cap, b.lp.x, b.lp.y, b.lp.z, b.cap_center.x, b.cap_center.y, b.cap_center.z, - vec_length(vec_sub(b.lp, b.cap_center))); + vec_length(vec_sub(b.lp, b.cap_center)));*/ hit->t = b.t_cap; hit->point = b.lp; //hit->normal = scale(b.nor_cyl, b.sign); diff --git a/test1.rt b/test1.rt index abbe99e..9a57250 100644 --- a/test1.rt +++ b/test1.rt @@ -1,4 +1,4 @@ A 0.5 255,255,255 L 0,4,4 0.1 255,255,255 C 0,0,8 0,0,-1 100 -sp 0,0,0 8 216,56,136 \ No newline at end of file +sp 0,0,0 4 216,56,136 \ No newline at end of file From 85dd370150bad2939d67ec32e31e6cb46fe7d62e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vojte=CC=8Cch=20Parka=CC=81n?= Date: Mon, 2 Jun 2025 18:36:13 +0200 Subject: [PATCH 05/19] back the softness --- cylindre.rt | 4 ++-- src/shader.c | 9 +++------ 2 files changed, 5 insertions(+), 8 deletions(-) diff --git a/cylindre.rt b/cylindre.rt index 35daa03..9d49313 100644 --- a/cylindre.rt +++ b/cylindre.rt @@ -1,5 +1,5 @@ -A .9 125,125,125 -L -100,0,305 .9 255,255,255 +A 1 125,125,125 +L 0,0,305 .3 255,255,255 C 0,0,12 0,0,-1 60 cy 0,0,0 1,0,0 2 8 140,118,206 # \ No newline at end of file diff --git a/src/shader.c b/src/shader.c index b06045e..98330d3 100644 --- a/src/shader.c +++ b/src/shader.c @@ -34,12 +34,9 @@ t_rgb shader(t_rgb color, t_data *data, t_hit_record *rec) sb.visibility = 0.2f; sb.factor *= sb.visibility; sb.diffuse = calculate_diffuse(data, sb.l_dir, color, rec); - //sb.diffuse.r *= sb.softness; - //sb.diffuse.g *= sb.softness; - //sb.diffuse.b *= sb.softness; - sb.diffuse.r = 0; - sb.diffuse.g = 0; - sb.diffuse.b = 0; + sb.diffuse.r *= sb.softness; + sb.diffuse.g *= sb.softness; + sb.diffuse.b *= sb.softness; } else sb.diffuse = calculate_diffuse(data, sb.l_dir, color, rec); From 830ec30a542c9a2553ee73cf40e60058a2796f64 Mon Sep 17 00:00:00 2001 From: Arsenii Evstigneev Date: Sat, 7 Jun 2025 11:54:52 +0200 Subject: [PATCH 06/19] add caps --- src/vec/cy_utils.c | 75 ++++++++++++++++++++++++++-------------------- src/vec/ray.c | 56 +++++++++++++++++++++------------- 2 files changed, 79 insertions(+), 52 deletions(-) diff --git a/src/vec/cy_utils.c b/src/vec/cy_utils.c index 1fe8bea..901ca4c 100644 --- a/src/vec/cy_utils.c +++ b/src/vec/cy_utils.c @@ -13,47 +13,58 @@ #include "../../include/vec.h" #include "../../include/minirt.h" -float process_cy_cap(t_cybag b, t_shapes *shp, t_ray ray, t_hit_record *hit) +float process_cy_cap(t_cybag b, t_shapes *shp, t_ray ray, t_hit_record *hit) { - b.half_h = shp->height / 2.0f; - b.i = 0; - while (b.i < 2) + t_vec cap_center, dist, lp, cap_normal, sub; + float t_cap, half_h, denom; + int i; + float r2 = (shp->diameter * 0.5f) * (shp->diameter * 0.5f); + const float bias = 0.0001f; // Жёстко заданное смещение + + half_h = shp->height * 0.5f; + b.nor_cyl = normalize(shp->axis); + + hit->t = FLT_MAX; + hit->hit = false; + + for (i = 0; i < 2; i++) { - if (b.i == 0) - b.sign = -1.0f; - else - b.sign = 1.0f; - b.cap_center = add(shp->cords, scale(b.nor_cyl, b.sign * b.half_h)); - b.denom = vec_dot(&ray.dir, &b.nor_cyl); - b.sub = vec_sub(b.cap_center, ray.origin); - b.t_cap = vec_dot(&b.sub, &b.nor_cyl) / b.denom; - if (b.t_cap < 0 || fabs(b.denom) < EPSILON) + float sign = (i == 0) ? -1.0f : 1.0f; + cap_center = add(shp->cords, scale(b.nor_cyl, sign * half_h)); + denom = vec_dot(&ray.dir, &b.nor_cyl); + + if (fabs(denom) < 0.00001f) + continue; + + sub = vec_sub(cap_center, ray.origin); + t_cap = vec_dot(&sub, &b.nor_cyl) / denom; + + if (t_cap < 0.0f) + continue; + + lp = add(ray.origin, scale(ray.dir, t_cap)); + dist = vec_sub(lp, cap_center); + + if (vec_dot(&dist, &dist) <= r2 && t_cap < hit->t) { - b.i++; - continue ; - } - b.mul = scale(ray.dir, b.t_cap); - b.lp = add(ray.origin, b.mul); - t_vec dist = vec_sub(b.lp, b.cap_center); - if (vec_dot(&dist, &dist) <= b.radius * b.radius) { - /*printf("Testing cap %d: t_cap=%.4f, lp=(%.2f,%.2f,%.2f), center=(%.2f,%.2f,%.2f), dist=%.4f\n", - b.i, b.t_cap, b.lp.x, b.lp.y, b.lp.z, b.cap_center.x, b.cap_center.y, b.cap_center.z, - vec_length(vec_sub(b.lp, b.cap_center)));*/ - hit->t = b.t_cap; - hit->point = b.lp; - //hit->normal = scale(b.nor_cyl, b.sign); - t_vec cap_normal = scale(b.nor_cyl, b.sign); - if (vec_dot(&ray.dir, &cap_normal) > 0) - cap_normal = scale(cap_normal, -1); // flip if needed + cap_normal = normalize(scale(b.nor_cyl, sign)); + + if (vec_dot(&ray.dir, &cap_normal) > 0.0f) + cap_normal = scale(cap_normal, -1.0f); + + hit->t = t_cap; hit->normal = cap_normal; + hit->point = add(lp, scale(cap_normal, bias)); // Смещение точки вдоль нормали hit->is_cap = true; - return (b.t_cap); + hit->object = shp; + hit->hit = true; } - b.i++; } - return (-1.0f); + + return (hit->hit ? hit->t : -1.0f); } + float process_cy_body(t_cybag b, t_shapes *shp, t_ray ray) { b.i = 0; diff --git a/src/vec/ray.c b/src/vec/ray.c index baab5be..37a3f09 100644 --- a/src/vec/ray.c +++ b/src/vec/ray.c @@ -98,31 +98,47 @@ void calculate_cy_bag(t_cybag *b, t_shapes *shp, t_ray ray) b->discriminant = b->b_f * b->b_f - 4 * b->a_f * b->c_f; } -bool ray_inter_cy(t_ray ray, t_shapes *shp, float *t, t_hit_record *rec) +bool ray_inter_cy(t_ray ray, t_shapes *shp, float *t, t_hit_record *rec) { - t_cybag b; + t_cybag b; + t_hit_record rec_body, rec_cap; + float t_body = -1.0f, t_cap = -1.0f; calculate_cy_bag(&b, shp, ray); - if (b.discriminant < 0) - return (false); - b.sqrt_disc = sqrtf(b.discriminant); - b.t1 = (-b.b_f - b.sqrt_disc) / (2 * b.a_f); - b.t2 = (-b.b_f + b.sqrt_disc) / (2 * b.a_f); - b.t_candidates[0] = b.t1; - b.t_candidates[1] = b.t2; - b.crb = process_cy_body(b, shp, ray); - if (b.crb > 0) + + if (b.discriminant >= 0.0f) { - *t = b.crb; - resolve_hit(rec, b.crb, ray, shp); - rec->normal = normalize(vec_sub(rec->point, shp->cords)); - return (true); + b.sqrt_disc = sqrtf(b.discriminant); + b.t1 = (-b.b_f - b.sqrt_disc) / (2.0f * b.a_f); + b.t2 = (-b.b_f + b.sqrt_disc) / (2.0f * b.a_f); + b.t_candidates[0] = b.t1; + b.t_candidates[1] = b.t2; + + t_body = process_cy_body(b, shp, ray); + if (t_body > 0.0f) + { + resolve_hit(&rec_body, t_body, ray, shp); + + t_vec to_point = vec_sub(rec_body.point, shp->cords); + t_vec projection = scale(b.nor_cyl, vec_dot(&to_point, &b.nor_cyl)); + rec_body.normal = normalize(vec_sub(to_point, projection)); + } + } + + t_cap = process_cy_cap(b, shp, ray, &rec_cap); + + if (t_body > 0.0f && (t_cap < 0.0f || t_body < t_cap)) + { + *rec = rec_body; + *t = t_body; + return true; } - b.crb = process_cy_cap(b, shp, ray, rec); - if (b.crb > 0) + else if (t_cap > 0.0f) { - *t = b.crb; - return (true); + *rec = rec_cap; + *t = t_cap; + return true; } - return (false); + return false; } + From 93ffa3db1030fa0f362386c95ce26032c7cddd17 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vojte=CC=8Cch=20Parka=CC=81n?= Date: Sat, 7 Jun 2025 14:09:42 +0200 Subject: [PATCH 07/19] merged shader into caps --- cylindre.rt | 6 +++--- src/shader.c | 25 ++++++++++++++----------- src/vec/ray.c | 12 ------------ 3 files changed, 17 insertions(+), 26 deletions(-) diff --git a/cylindre.rt b/cylindre.rt index 9d49313..65aec8b 100644 --- a/cylindre.rt +++ b/cylindre.rt @@ -1,5 +1,5 @@ -A 1 125,125,125 -L 0,0,305 .3 255,255,255 +A .5 125,125,125 +L 0,0,305 .5 255,255,255 C 0,0,12 0,0,-1 60 -cy 0,0,0 1,0,0 2 8 140,118,206 +cy 0,0,0 0,1,0 2 8 140,118,206 # \ No newline at end of file diff --git a/src/shader.c b/src/shader.c index 98330d3..0f6f64d 100644 --- a/src/shader.c +++ b/src/shader.c @@ -26,23 +26,26 @@ t_rgb shader(t_rgb color, t_data *data, t_hit_record *rec) t_sbag sb; sb.l_dir = normalize(vec_sub(data->scene->lght.cords, rec->point)); - sb.factor = fmax(0.0, vec_dot(&rec->normal, &sb.l_dir)); + if (ft_strncmp(rec->object->identifier, "cy", 2)) + sb.factor = fmin(0.5, vec_dot(&rec->normal, &sb.l_dir)); + else + sb.factor = 1.0f; sb.mix_color = calculate_ambient(data, rec->object); if (is_in_shadow(data, rec->point, data->scene->lght.cords, rec->normal)) { - sb.softness = 0.2f;// + 0.5f * fmax(0.0, vec_dot(&rec->normal, &sb.l_dir)); - sb.visibility = 0.2f; - sb.factor *= sb.visibility; - sb.diffuse = calculate_diffuse(data, sb.l_dir, color, rec); - sb.diffuse.r *= sb.softness; - sb.diffuse.g *= sb.softness; - sb.diffuse.b *= sb.softness; + sb.softness = 0.2f + 0.5f * fmin(0.2, vec_dot(&rec->normal, &sb.l_dir)); + sb.visibility = 0.9f; + sb.factor *= sb.visibility; + sb.diffuse = calculate_diffuse(data, sb.l_dir, color, rec); + sb.diffuse.r *= sb.softness; + sb.diffuse.g *= sb.softness; + sb.diffuse.b *= sb.softness; } else sb.diffuse = calculate_diffuse(data, sb.l_dir, color, rec); - sb.mix_color.r = min(sb.mix_color.r * 0.4f + sb.diffuse.r * sb.factor, 255); - sb.mix_color.g = min(sb.mix_color.g * 0.4f + sb.diffuse.g * sb.factor, 255); - sb.mix_color.b = min(sb.mix_color.b * 0.4f + sb.diffuse.b * sb.factor, 255); + sb.mix_color.r = min(sb.mix_color.r * data->scene->ambi.ratio + sb.diffuse.r * sb.factor, 255); + sb.mix_color.g = min(sb.mix_color.g * data->scene->ambi.ratio + sb.diffuse.g * sb.factor, 255); + sb.mix_color.b = min(sb.mix_color.b * data->scene->ambi.ratio + sb.diffuse.b * sb.factor, 255); return (sb.mix_color); } diff --git a/src/vec/ray.c b/src/vec/ray.c index 37a3f09..5c7180a 100644 --- a/src/vec/ray.c +++ b/src/vec/ray.c @@ -10,18 +10,6 @@ /* */ /* ************************************************************************** */ -/* ************************************************************************** */ -/* */ -/* ::: :::::::: */ -/* ray.c :+: :+: :+: */ -/* +:+ +:+ +:+ */ -/* By: aevstign From 31163427268edaddf42f9dd85dba8bcae0df93c4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vojte=CC=8Cch=20Parka=CC=81n?= Date: Sat, 7 Jun 2025 14:33:58 +0200 Subject: [PATCH 08/19] ambient 1 without shadow --- ados.rt | 2 +- basic.rt | 8 ++++---- box.rt | 4 +++- src/colors.c | 14 ++++++++++++++ 4 files changed, 22 insertions(+), 6 deletions(-) diff --git a/ados.rt b/ados.rt index 649ce90..b87d992 100644 --- a/ados.rt +++ b/ados.rt @@ -1,5 +1,5 @@ A 0.3 255,255,255 -C 0,0,40 0,0,1 85 +C 0,0,40 0,0,-1 85 L 0,0,20 0.8 255,255,255 pl 0,-10,0 0,1,0 0,0,150 diff --git a/basic.rt b/basic.rt index f085b1a..8ecbddc 100644 --- a/basic.rt +++ b/basic.rt @@ -1,5 +1,5 @@ -A .5 125,125,125 +A 1 255,255,225 C 0,0,1 0,0,1 70 -L -10,0,1 .5 255,255,255 -sp 0.0,0.0,20.6 12.6 10,0,255 -pl 0.0,0.0,-10.0 0.0,1.0,0.0 0,0,225 \ No newline at end of file +L -1,0,1 .8 255,255,255 +sp 0.0,0.0,20.6 12.6 10,0,255 +pl 0.0,0.0,53.0 0.0,0.0,-1.0 25,125,25 diff --git a/box.rt b/box.rt index 6bc7db5..ea4bcdd 100644 --- a/box.rt +++ b/box.rt @@ -1,4 +1,4 @@ -A 0.2 255,255,255 +A 0.5 255,255,255 C 0,0,5 0,0,-1 60 L -1,2.5,2 0.7 255,255,255 @@ -13,3 +13,5 @@ pl -3,0,0 1,0,0 255,0,0 pl 3,0,0 -1,0,0 0,0,255 sp 0,0,0 1.0 0,255,0 + +cy 0,0,0 0,0,1 .5 2 140,118,206 diff --git a/src/colors.c b/src/colors.c index 9143b12..7adcf19 100644 --- a/src/colors.c +++ b/src/colors.c @@ -1,3 +1,15 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* colors.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: voparkan +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2025/06/07 12:28:10 by voparkan #+# #+# */ +/* Updated: 2025/06/07 14:33:25 by voparkan ### ########.fr */ +/* */ +/* ************************************************************************** */ + /* ************************************************************************** */ /* */ /* ::: :::::::: */ @@ -54,6 +66,8 @@ bool is_in_shadow(t_data *data, t_vec point, t_vec light_pos, t_vec normal) t_hit_record tmp; double hit_dist; + if (data->scene->ambi.ratio == 1) + return (false); to_light = vec_sub(light_pos, point); light_dist = vec_length(to_light); shadow_ray.origin = add(point, scale(normal, 1e-3)); From 7f8e48d15eb071147b1c4797a3fa4c805de47891 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vojte=CC=8Cch=20Parka=CC=81n?= Date: Sat, 7 Jun 2025 18:38:27 +0200 Subject: [PATCH 09/19] normal switch for plane to light both sides --- main.c | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/main.c b/main.c index 069a710..7b0a066 100644 --- a/main.c +++ b/main.c @@ -37,14 +37,12 @@ void do_hit(t_ray ray, t_hit_record *rec, float *closest_t, t_shapes *shp) *closest_t = t; resolve_hit(rec, t, ray, shp); rec->normal = normalize(shp->axis); + if (vec_dot(&rec->normal, &ray.dir) > 0.0f) + rec->normal = scale(rec->normal, -1.0f); } if ((ft_strncmp(shp->identifier, "cy", 2) == 0) && (ray_inter_cy(ray, shp, &t, rec) && t < *closest_t)) - { *closest_t = t; - //resolve_hit(rec, t, ray, shp); - //rec->normal = normalize(vec_sub(rec->point, shp->cords)); - } } bool hit_objects(t_data *data, t_ray ray, t_hit_record *rec) From a01ca03a5b736ab2fa544498025f1c1d92b936a2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vojte=CC=8Cch=20Parka=CC=81n?= Date: Sat, 7 Jun 2025 18:46:27 +0200 Subject: [PATCH 10/19] add frame++ --- box.rt | 6 +++--- src/init.c | 2 +- src/window.c | 4 +++- 3 files changed, 7 insertions(+), 5 deletions(-) diff --git a/box.rt b/box.rt index ea4bcdd..121abe8 100644 --- a/box.rt +++ b/box.rt @@ -1,6 +1,6 @@ A 0.5 255,255,255 -C 0,0,5 0,0,-1 60 -L -1,2.5,2 0.7 255,255,255 +C 0,0,5 0,0,-1 100 +L -1,2.5,5 0.7 255,255,255 pl 0,-1,0 0,1,0 100,100,100 @@ -14,4 +14,4 @@ pl 3,0,0 -1,0,0 0,0,255 sp 0,0,0 1.0 0,255,0 -cy 0,0,0 0,0,1 .5 2 140,118,206 +cy 0,0,0 0,1,0 .5 2 140,118,206 diff --git a/src/init.c b/src/init.c index 12bf5ac..1426be6 100644 --- a/src/init.c +++ b/src/init.c @@ -58,7 +58,7 @@ int init_program(t_data *data, int argc, char **argv) return (-1); } data->filename = argv[1]; - data->frame = 1; + data->frame = 0; check_filename(data); check_file_empty(data); init_scene(data); diff --git a/src/window.c b/src/window.c index 0359220..84102a1 100644 --- a/src/window.c +++ b/src/window.c @@ -35,8 +35,10 @@ int init_mlx_window(t_data *data) void resolve_light_move(t_data *data, int key, bool *cast) { if (key == L_KEY_A_L || key == L_KEY_D_R || key == L_KEY_S_B - || key == L_KEY_W_U) + || key == L_KEY_W_U) { *cast = true; + data->frame++; + } if (key == L_KEY_A_L) data->scene->lght.cords.x -= 1; if (key == L_KEY_D_R) From 99a0a9dd2a109e417aa8d6b5a9992c922b205912 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vojte=CC=8Cch=20Parka=CC=81n?= Date: Sat, 7 Jun 2025 22:13:17 +0200 Subject: [PATCH 11/19] almost done the norm --- include/minirt.h | 68 ++++++++++++++++++++++++++++++---------------- src/colors.c | 4 +-- src/exit.c | 25 +++++++++++------ src/shader.c | 43 ++++++++++++----------------- src/vec/cy_utils.c | 67 ++++++++++++++++++++------------------------- src/vec/ray.c | 46 ++++++++++++++----------------- src/window.c | 3 +- 7 files changed, 132 insertions(+), 124 deletions(-) diff --git a/include/minirt.h b/include/minirt.h index b682f60..47a275d 100644 --- a/include/minirt.h +++ b/include/minirt.h @@ -6,7 +6,7 @@ /* By: aevstign +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2025/03/09 14:39:27 by voparkan #+# #+# */ -/* Updated: 2025/05/21 16:07:04 by aevstign ### ########.fr */ +/* Updated: 2025/06/07 22:02:51 by voparkan ### ########.fr */ /* */ /* ************************************************************************** */ @@ -154,6 +154,16 @@ typedef struct s_spbag t_vec oc; } t_spbag; +typedef struct s_hit_record +{ + float t; + t_vec point; + t_vec normal; + t_shapes *object; + bool hit; + bool is_cap; +} t_hit_record; + typedef struct s_cybag { int i; @@ -170,30 +180,40 @@ typedef struct s_cybag float ti; float denom; float t_cap; - float crb; - float sign; - float half_h; - t_vec sub; - t_vec oc; - t_vec nor_cyl; - t_vec a; - t_vec b; - t_vec p; - t_vec p_b; - t_vec cap_center; - t_vec mul; - t_vec lp; + float t_body; + float crb; + float sign; + float half_h; + t_vec sub; + t_vec oc; + t_vec nor_cyl; + t_vec a; + t_vec b; + t_vec p; + t_vec p_b; + t_vec cap_center; + t_vec mul; + t_vec lp; + t_hit_record rec_body; + t_hit_record rec_cap; + t_vec to_point; + t_vec projection; } t_cybag; -typedef struct s_hit_record -{ - float t; - t_vec point; - t_vec normal; - t_shapes *object; - bool hit; - bool is_cap; -} t_hit_record; +typedef struct s_cap_bag { + t_vec cap_center; + t_vec dist; + t_vec lp; + t_vec cap_normal; + t_vec sub; + float t_cap; + float half_h; + float denom; + int i; + float r2; + float bias; + float sign; +} t_cap_bag; void do_j_bzero(t_obag *ob); void init_tobag(t_obag *obag); @@ -277,6 +297,8 @@ t_rgb shader(t_rgb color, t_data *data, t_hit_record *rec); t_rgb calculate_diffuse(t_data *data, t_vec dir, t_rgb color, t_hit_record *rec); t_rgb calculate_ambient(t_data *data, t_shapes *shp); +t_sbag +colors_in_shadow(t_rgb *color, t_data *data, t_hit_record *rec, t_sbag *sb); /*validator*/ bool check_line(char *line, t_obag *bag); diff --git a/src/colors.c b/src/colors.c index 7adcf19..207bd62 100644 --- a/src/colors.c +++ b/src/colors.c @@ -52,9 +52,9 @@ t_rgb calculate_diffuse(t_data *data, t_vec l_dir, t_rgb color, t_hit_record \ diffuse.r = (int)(data->scene->lght.bright * (float) \ data->scene->lght.rgb.r * (float) color.r * (float) factor / 255.0f); diffuse.g = (int)(data->scene->lght.bright * (float) \ - data->scene->lght.rgb.g * (float) color.g * (float) factor / 255.0f); // + data->scene->lght.rgb.g * (float) color.g * (float) factor / 255.0f); diffuse.b = (int)(data->scene->lght.bright * (float) \ - data->scene->lght.rgb.b * (float) color.b * (float) factor / 255.0f); // + data->scene->lght.rgb.b * (float) color.b * (float) factor / 255.0f); return (diffuse); } diff --git a/src/exit.c b/src/exit.c index 0d4dd77..e0ae68a 100644 --- a/src/exit.c +++ b/src/exit.c @@ -12,15 +12,6 @@ #include "../include/minirt.h" -void free_imgs(void *shp) -{ - t_shapes *shape; - - shape = (t_shapes *)shp; - if (shape->img.mlx_ptr != NULL) - free(shape->img.ptr); -} - void free_lines(char **lines) { int i; @@ -54,3 +45,19 @@ void free_data(t_data *data) } free(data); } + +int min(int a, int b) +{ + if (a < b) + return (a); + else + return (b); +} + +int max(int a, int b) +{ + if (a > b) + return (a); + else + return (b); +} diff --git a/src/shader.c b/src/shader.c index 0f6f64d..781e0ac 100644 --- a/src/shader.c +++ b/src/shader.c @@ -32,37 +32,30 @@ t_rgb shader(t_rgb color, t_data *data, t_hit_record *rec) sb.factor = 1.0f; sb.mix_color = calculate_ambient(data, rec->object); if (is_in_shadow(data, rec->point, data->scene->lght.cords, rec->normal)) - { - sb.softness = 0.2f + 0.5f * fmin(0.2, vec_dot(&rec->normal, &sb.l_dir)); - sb.visibility = 0.9f; - sb.factor *= sb.visibility; - sb.diffuse = calculate_diffuse(data, sb.l_dir, color, rec); - sb.diffuse.r *= sb.softness; - sb.diffuse.g *= sb.softness; - sb.diffuse.b *= sb.softness; - } + sb = colors_in_shadow(&color, data, rec, &sb); else sb.diffuse = calculate_diffuse(data, sb.l_dir, color, rec); - sb.mix_color.r = min(sb.mix_color.r * data->scene->ambi.ratio + sb.diffuse.r * sb.factor, 255); - sb.mix_color.g = min(sb.mix_color.g * data->scene->ambi.ratio + sb.diffuse.g * sb.factor, 255); - sb.mix_color.b = min(sb.mix_color.b * data->scene->ambi.ratio + sb.diffuse.b * sb.factor, 255); + sb.mix_color.r = min(sb.mix_color.r * data->scene->ambi.ratio + + sb.diffuse.r * sb.factor, 255); + sb.mix_color.g = min(sb.mix_color.g * data->scene->ambi.ratio + + sb.diffuse.g * sb.factor, 255); + sb.mix_color.b = min(sb.mix_color.b * data->scene->ambi.ratio + + sb.diffuse.b * sb.factor, 255); return (sb.mix_color); } -int min(int a, int b) +t_sbag + colors_in_shadow(t_rgb *color, t_data *data, t_hit_record *rec, t_sbag *sb) { - if (a < b) - return (a); - else - return (b); -} - -int max(int a, int b) -{ - if (a > b) - return (a); - else - return (b); + (*sb).softness = 0.2f + 0.5f * fmin(0.2, + vec_dot(&rec->normal, &(*sb).l_dir)); + (*sb).visibility = 0.9f; + (*sb).factor *= (*sb).visibility; + (*sb).diffuse = calculate_diffuse(data, (*sb).l_dir, (*color), rec); + (*sb).diffuse.r *= (*sb).softness; + (*sb).diffuse.g *= (*sb).softness; + (*sb).diffuse.b *= (*sb).softness; + return (*sb); } void mrt_put_pixel(t_img *img, int x, int y, int color) diff --git a/src/vec/cy_utils.c b/src/vec/cy_utils.c index 901ca4c..e3336af 100644 --- a/src/vec/cy_utils.c +++ b/src/vec/cy_utils.c @@ -13,58 +13,49 @@ #include "../../include/vec.h" #include "../../include/minirt.h" -float process_cy_cap(t_cybag b, t_shapes *shp, t_ray ray, t_hit_record *hit) +float process_cy_cap(t_cybag b, t_shapes *shp, t_ray ray, t_hit_record *hit) { - t_vec cap_center, dist, lp, cap_normal, sub; - float t_cap, half_h, denom; - int i; - float r2 = (shp->diameter * 0.5f) * (shp->diameter * 0.5f); - const float bias = 0.0001f; // Жёстко заданное смещение + t_cap_bag cb; - half_h = shp->height * 0.5f; + cb.r2 = (shp->diameter * 0.5f) * (shp->diameter * 0.5f); + cb.bias = 0.0001f; + b.half_h = shp->height * 0.5f; b.nor_cyl = normalize(shp->axis); - hit->t = FLT_MAX; hit->hit = false; - - for (i = 0; i < 2; i++) + for (int i = 0; i < 2; i++) { - float sign = (i == 0) ? -1.0f : 1.0f; - cap_center = add(shp->cords, scale(b.nor_cyl, sign * half_h)); - denom = vec_dot(&ray.dir, &b.nor_cyl); - - if (fabs(denom) < 0.00001f) - continue; - - sub = vec_sub(cap_center, ray.origin); - t_cap = vec_dot(&sub, &b.nor_cyl) / denom; - - if (t_cap < 0.0f) - continue; - - lp = add(ray.origin, scale(ray.dir, t_cap)); - dist = vec_sub(lp, cap_center); - - if (vec_dot(&dist, &dist) <= r2 && t_cap < hit->t) + cb.sign = 1.0f; + if (i == 0) + cb.sign = -1.0f; + cb.cap_center = add(shp->cords, scale(b.nor_cyl, cb.sign * cb.half_h)); + cb.denom = vec_dot(&ray.dir, &b.nor_cyl); + if (fabs(cb.denom) < 0.00001f) + continue ; + cb.sub = vec_sub(cb.cap_center, ray.origin); + cb.t_cap = vec_dot(&cb.sub, &b.nor_cyl) / cb.denom; + if (cb.t_cap < 0.0f) + continue ; + cb.lp = add(ray.origin, scale(ray.dir, cb.t_cap)); + cb.dist = vec_sub(cb.lp, cb.cap_center); + if (vec_dot(&cb.dist, &cb.dist) <= cb.r2 && cb.t_cap < hit->t) { - cap_normal = normalize(scale(b.nor_cyl, sign)); - - if (vec_dot(&ray.dir, &cap_normal) > 0.0f) - cap_normal = scale(cap_normal, -1.0f); - - hit->t = t_cap; - hit->normal = cap_normal; - hit->point = add(lp, scale(cap_normal, bias)); // Смещение точки вдоль нормали + cb.cap_normal = normalize(scale(b.nor_cyl, cb.sign)); + if (vec_dot(&ray.dir, &cb.cap_normal) > 0.0f) + cb.cap_normal = scale(cb.cap_normal, -1.0f); + hit->t = cb.t_cap; + hit->normal = cb.cap_normal; + hit->point = add(cb.lp, scale(cb.cap_normal, cb.bias)); hit->is_cap = true; hit->object = shp; hit->hit = true; } } - - return (hit->hit ? hit->t : -1.0f); + if (hit->hit) + return (hit->t); + return (-1.0f); } - float process_cy_body(t_cybag b, t_shapes *shp, t_ray ray) { b.i = 0; diff --git a/src/vec/ray.c b/src/vec/ray.c index 5c7180a..d8961f7 100644 --- a/src/vec/ray.c +++ b/src/vec/ray.c @@ -75,6 +75,8 @@ bool ray_inter_pl(t_ray ray, t_shapes *shp, float *t) void calculate_cy_bag(t_cybag *b, t_shapes *shp, t_ray ray) { + b->t_body = -1.0f; + b->t_cap = -1.0f; b->radius = shp->diameter / 2.0f; b->nor_cyl = normalize(shp->axis); b->oc = vec_sub(ray.origin, shp->cords); @@ -86,14 +88,11 @@ void calculate_cy_bag(t_cybag *b, t_shapes *shp, t_ray ray) b->discriminant = b->b_f * b->b_f - 4 * b->a_f * b->c_f; } -bool ray_inter_cy(t_ray ray, t_shapes *shp, float *t, t_hit_record *rec) +bool ray_inter_cy(t_ray ray, t_shapes *shp, float *t, t_hit_record *rec) { - t_cybag b; - t_hit_record rec_body, rec_cap; - float t_body = -1.0f, t_cap = -1.0f; + t_cybag b; calculate_cy_bag(&b, shp, ray); - if (b.discriminant >= 0.0f) { b.sqrt_disc = sqrtf(b.discriminant); @@ -101,32 +100,27 @@ bool ray_inter_cy(t_ray ray, t_shapes *shp, float *t, t_hit_record *rec) b.t2 = (-b.b_f + b.sqrt_disc) / (2.0f * b.a_f); b.t_candidates[0] = b.t1; b.t_candidates[1] = b.t2; - - t_body = process_cy_body(b, shp, ray); - if (t_body > 0.0f) + b.t_body = process_cy_body(b, shp, ray); + if (b.t_body > 0.0f) { - resolve_hit(&rec_body, t_body, ray, shp); - - t_vec to_point = vec_sub(rec_body.point, shp->cords); - t_vec projection = scale(b.nor_cyl, vec_dot(&to_point, &b.nor_cyl)); - rec_body.normal = normalize(vec_sub(to_point, projection)); + resolve_hit(&b.rec_body, b.t_body, ray, shp); + b.to_point = vec_sub(b.rec_body.point, shp->cords); + b.projection = scale(b.nor_cyl, vec_dot(&b.to_point, &b.nor_cyl)); + b.rec_body.normal = normalize(vec_sub(b.to_point, b.projection)); } } - - t_cap = process_cy_cap(b, shp, ray, &rec_cap); - - if (t_body > 0.0f && (t_cap < 0.0f || t_body < t_cap)) + b.t_cap = process_cy_cap(b, shp, ray, &b.rec_cap); + if (b.t_body > 0.0f && (b.t_cap < 0.0f || b.t_body < b.t_cap)) { - *rec = rec_body; - *t = t_body; - return true; + *rec = b.rec_body; + *t = b.t_body; + return (true); } - else if (t_cap > 0.0f) + else if (b.t_cap > 0.0f) { - *rec = rec_cap; - *t = t_cap; - return true; + *rec = b.rec_cap; + *t = b.t_cap; + return (true); } - return false; + return (false); } - diff --git a/src/window.c b/src/window.c index 84102a1..145368a 100644 --- a/src/window.c +++ b/src/window.c @@ -35,7 +35,8 @@ int init_mlx_window(t_data *data) void resolve_light_move(t_data *data, int key, bool *cast) { if (key == L_KEY_A_L || key == L_KEY_D_R || key == L_KEY_S_B - || key == L_KEY_W_U) { + || key == L_KEY_W_U) + { *cast = true; data->frame++; } From 53c8d011b8c1407ee9bee9afe98d133b8e33352e Mon Sep 17 00:00:00 2001 From: Arsenii Evstigneev Date: Sun, 8 Jun 2025 11:28:43 +0200 Subject: [PATCH 12/19] fix leaks and norm --- include/minirt.h | 10 ++++++++ src/parser.c | 51 +++++++++++++++++------------------- src/vec/cy_utils.c | 64 +++++++++++++++++++++++++++------------------- 3 files changed, 72 insertions(+), 53 deletions(-) diff --git a/include/minirt.h b/include/minirt.h index 47a275d..61be439 100644 --- a/include/minirt.h +++ b/include/minirt.h @@ -215,6 +215,16 @@ typedef struct s_cap_bag { float sign; } t_cap_bag; +typedef struct s_cap_hit_ctx +{ + t_cap_bag *cb; + t_cybag *b; + t_shapes *shp; + t_ray ray; + t_hit_record *hit; +} t_cap_hit_ctx; + + void do_j_bzero(t_obag *ob); void init_tobag(t_obag *obag); diff --git a/src/parser.c b/src/parser.c index c2212c1..7b1edfd 100644 --- a/src/parser.c +++ b/src/parser.c @@ -12,7 +12,7 @@ #include "../include/minirt.h" -bool process_line(char *line, t_obag *bag, char ***lines) +bool process_line(char *line, t_obag *bag, char **lines, int *line_idx) { char *dup; @@ -21,8 +21,8 @@ bool process_line(char *line, t_obag *bag, char ***lines) dup = ft_strdup(line); if (!dup) return (false); - **lines = dup; - (*lines)++; + lines[*line_idx] = dup; + (*line_idx)++; return (true); } @@ -49,64 +49,61 @@ int read_next_line(int fd, char *line_buf, int *i) return (bytes_read); } -static void cleanup_and_exit(t_data *data, char **current, - char **start, char *error_message) +void cleanup_and_exit(t_data *data, char **lines, char *msg) { - *current = NULL; - free_lines(start); + free_lines(lines); free_data(data); - exit_error(error_message); + exit_error(msg); } // bag is used here to store camera, ambient and light counts -void do_lines(t_data *data, char ***lines) +void do_lines(t_data *data, char **lines) { char line[1024]; t_obag bag; int i; - char **current; + int line_idx; int read_state; i = 0; bag = (t_obag){0}; - current = *lines; + line_idx = 0; while (true) { read_state = read_next_line(data->scenefd, line, &i); - if (read_state <= 0 && i == 0) - break ; if (read_state == -1) - cleanup_and_exit(data, current, *lines, "Couldn't read scene"); + cleanup_and_exit(data, lines, "Couldn't read scene"); + if (read_state == 0 && i == 0) + break ; if (i == 0) continue ; - if (!process_line(line, &bag, ¤t)) - cleanup_and_exit(data, current, *lines, "Invalid scene line"); + if (!process_line(line, &bag, lines, &line_idx)) + cleanup_and_exit(data, lines, "Invalid scene line"); } + lines[line_idx] = NULL; if (!handle_identifiers(bag.i, bag.j, bag.k)) - cleanup_and_exit(data, current, *lines, "Invalid scene line"); - *current = NULL; + cleanup_and_exit(data, lines, "Invalid scene line"); } void init_scene(t_data *data) { char **lines; - char **tmp; int lc; lc = line_count(data->filename); - lines = malloc((lc + 1) * sizeof(char *)); - lines[lc] = NULL; + lines = malloc((lc + 2) * sizeof(char *)); + check_scene_alloc(data, lines); + lines[0] = NULL; data->scenefd = open(data->filename, O_RDONLY); if (data->scenefd == -1) { - free(data); + free(lines); + free_data(data); exit_error("Error opening file"); } - check_scene_alloc(data, lines); - tmp = lines; - do_lines(data, &lines); + do_lines(data, lines); close(data->scenefd); - data->lines = tmp; - print_lines(&tmp); + data->lines = lines; + print_lines(&lines); construct_scene(data); } diff --git a/src/vec/cy_utils.c b/src/vec/cy_utils.c index e3336af..6b4b78b 100644 --- a/src/vec/cy_utils.c +++ b/src/vec/cy_utils.c @@ -13,43 +13,55 @@ #include "../../include/vec.h" #include "../../include/minirt.h" +static void check_cy_cap_hit(t_cap_hit_ctx ctx) +{ + ctx.cb->cap_center = add(ctx.shp->cords, + scale(ctx.b->nor_cyl, ctx.cb->sign * ctx.cb->half_h)); + ctx.cb->denom = vec_dot(&ctx.ray.dir, &ctx.b->nor_cyl); + if (fabs(ctx.cb->denom) < 0.00001f) + return ; + ctx.cb->sub = vec_sub(ctx.cb->cap_center, ctx.ray.origin); + ctx.cb->t_cap = vec_dot(&ctx.cb->sub, &ctx.b->nor_cyl) / ctx.cb->denom; + if (ctx.cb->t_cap < 0.0f) + return ; + ctx.cb->lp = add(ctx.ray.origin, scale(ctx.ray.dir, ctx.cb->t_cap)); + ctx.cb->dist = vec_sub(ctx.cb->lp, ctx.cb->cap_center); + if (vec_dot(&ctx.cb->dist, &ctx.cb->dist) > ctx.cb->r2 + || ctx.cb->t_cap >= ctx.hit->t) + return ; + ctx.cb->cap_normal = normalize(scale(ctx.b->nor_cyl, ctx.cb->sign)); + if (vec_dot(&ctx.ray.dir, &ctx.cb->cap_normal) > 0.0f) + ctx.cb->cap_normal = scale(ctx.cb->cap_normal, -1.0f); + ctx.hit->t = ctx.cb->t_cap; + ctx.hit->normal = ctx.cb->cap_normal; + ctx.hit->point = add(ctx.cb->lp, scale(ctx.cb->cap_normal, ctx.cb->bias)); + ctx.hit->is_cap = true; + ctx.hit->object = ctx.shp; + ctx.hit->hit = true; +} + float process_cy_cap(t_cybag b, t_shapes *shp, t_ray ray, t_hit_record *hit) { - t_cap_bag cb; + t_cap_bag cb; + t_cap_hit_ctx ctx; + int i; cb.r2 = (shp->diameter * 0.5f) * (shp->diameter * 0.5f); cb.bias = 0.0001f; - b.half_h = shp->height * 0.5f; + cb.half_h = shp->height * 0.5f; b.nor_cyl = normalize(shp->axis); hit->t = FLT_MAX; hit->hit = false; - for (int i = 0; i < 2; i++) + ctx = (t_cap_hit_ctx){&cb, &b, shp, ray, hit}; + i = 0; + while (i < 2) { - cb.sign = 1.0f; if (i == 0) cb.sign = -1.0f; - cb.cap_center = add(shp->cords, scale(b.nor_cyl, cb.sign * cb.half_h)); - cb.denom = vec_dot(&ray.dir, &b.nor_cyl); - if (fabs(cb.denom) < 0.00001f) - continue ; - cb.sub = vec_sub(cb.cap_center, ray.origin); - cb.t_cap = vec_dot(&cb.sub, &b.nor_cyl) / cb.denom; - if (cb.t_cap < 0.0f) - continue ; - cb.lp = add(ray.origin, scale(ray.dir, cb.t_cap)); - cb.dist = vec_sub(cb.lp, cb.cap_center); - if (vec_dot(&cb.dist, &cb.dist) <= cb.r2 && cb.t_cap < hit->t) - { - cb.cap_normal = normalize(scale(b.nor_cyl, cb.sign)); - if (vec_dot(&ray.dir, &cb.cap_normal) > 0.0f) - cb.cap_normal = scale(cb.cap_normal, -1.0f); - hit->t = cb.t_cap; - hit->normal = cb.cap_normal; - hit->point = add(cb.lp, scale(cb.cap_normal, cb.bias)); - hit->is_cap = true; - hit->object = shp; - hit->hit = true; - } + else + cb.sign = 1.0f; + check_cy_cap_hit(ctx); + i++; } if (hit->hit) return (hit->t); From 954d86b5e56680a2eb8835473738af66b6c4bc14 Mon Sep 17 00:00:00 2001 From: Arsenii Evstigneev Date: Sun, 8 Jun 2025 12:22:55 +0200 Subject: [PATCH 13/19] norm fix --- include/minirt.h | 48 +++++++++++++++++++++++++--------------------- src/vec/cy_utils.c | 29 ++++++++++++++++++++++++++++ src/vec/ray.c | 43 +++++++++++++---------------------------- 3 files changed, 68 insertions(+), 52 deletions(-) diff --git a/include/minirt.h b/include/minirt.h index 61be439..3191687 100644 --- a/include/minirt.h +++ b/include/minirt.h @@ -166,20 +166,20 @@ typedef struct s_hit_record typedef struct s_cybag { - int i; - float t1; - float t2; - float radius; - float a_f; - float b_f; - float c_f; - float discriminant; - float sqrt_disc; - float t_candidates[2]; - float height; - float ti; - float denom; - float t_cap; + int i; + float t1; + float t2; + float radius; + float a_f; + float b_f; + float c_f; + float discriminant; + float sqrt_disc; + float t_candidates[2]; + float height; + float ti; + float denom; + float t_cap; float t_body; float crb; float sign; @@ -196,15 +196,16 @@ typedef struct s_cybag t_vec lp; t_hit_record rec_body; t_hit_record rec_cap; - t_vec to_point; + t_vec to_point; t_vec projection; } t_cybag; -typedef struct s_cap_bag { +typedef struct s_cap_bag +{ t_vec cap_center; t_vec dist; - t_vec lp; - t_vec cap_normal; + t_vec lp; + t_vec cap_normal; t_vec sub; float t_cap; float half_h; @@ -212,7 +213,7 @@ typedef struct s_cap_bag { int i; float r2; float bias; - float sign; + float sign; } t_cap_bag; typedef struct s_cap_hit_ctx @@ -224,7 +225,6 @@ typedef struct s_cap_hit_ctx t_hit_record *hit; } t_cap_hit_ctx; - void do_j_bzero(t_obag *ob); void init_tobag(t_obag *obag); @@ -307,8 +307,8 @@ t_rgb shader(t_rgb color, t_data *data, t_hit_record *rec); t_rgb calculate_diffuse(t_data *data, t_vec dir, t_rgb color, t_hit_record *rec); t_rgb calculate_ambient(t_data *data, t_shapes *shp); -t_sbag -colors_in_shadow(t_rgb *color, t_data *data, t_hit_record *rec, t_sbag *sb); +t_sbag colors_in_shadow(t_rgb *color, t_data *data, t_hit_record *rec, + t_sbag *sb); /*validator*/ bool check_line(char *line, t_obag *bag); @@ -325,4 +325,8 @@ bool validate_cylindr(char **tokens, const int count); bool validate_rgb(const char *token); bool validate_orientation(const char *tokens); +/*cy_utils*/ +void calculate_cy_bag(t_cybag *b, t_shapes *shp, t_ray ray); +void handle_cy_body(t_cybag *b, t_shapes *shp, t_ray ray); + #endif diff --git a/src/vec/cy_utils.c b/src/vec/cy_utils.c index 6b4b78b..c1aec63 100644 --- a/src/vec/cy_utils.c +++ b/src/vec/cy_utils.c @@ -88,3 +88,32 @@ float process_cy_body(t_cybag b, t_shapes *shp, t_ray ray) } return (-1.0f); } + +void calculate_cy_bag(t_cybag *b, t_shapes *shp, t_ray ray) +{ + b->t_body = -1.0f; + b->t_cap = -1.0f; + b->radius = shp->diameter / 2.0f; + b->nor_cyl = normalize(shp->axis); + b->oc = vec_sub(ray.origin, shp->cords); + b->a = vec_sub(ray.dir, scale(b->nor_cyl, vec_dot(&ray.dir, &b->nor_cyl))); + b->b = vec_sub(b->oc, scale(b->nor_cyl, vec_dot(&b->oc, &b->nor_cyl))); + b->a_f = vec_dot(&b->a, &b->a); + b->b_f = 2.0f * vec_dot(&b->a, &b->b); + b->c_f = vec_dot(&b->b, &b->b) - b->radius * b->radius; + b->discriminant = b->b_f * b->b_f - 4 * b->a_f * b->c_f; +} + +void handle_cy_body(t_cybag *b, t_shapes *shp, t_ray ray) +{ + t_vec to_point; + t_vec projection; + + b->t_body = process_cy_body(*b, shp, ray); + if (b->t_body <= 0.0f) + return ; + resolve_hit(&b->rec_body, b->t_body, ray, shp); + to_point = vec_sub(b->rec_body.point, shp->cords); + projection = scale(b->nor_cyl, vec_dot(&to_point, &b->nor_cyl)); + b->rec_body.normal = normalize(vec_sub(to_point, projection)); +} diff --git a/src/vec/ray.c b/src/vec/ray.c index d8961f7..337c91c 100644 --- a/src/vec/ray.c +++ b/src/vec/ray.c @@ -73,42 +73,25 @@ bool ray_inter_pl(t_ray ray, t_shapes *shp, float *t) return (*t > 0.001f); } -void calculate_cy_bag(t_cybag *b, t_shapes *shp, t_ray ray) +void prepare_cy_intersect(t_cybag *b, t_shapes *shp, t_ray ray) { - b->t_body = -1.0f; - b->t_cap = -1.0f; - b->radius = shp->diameter / 2.0f; - b->nor_cyl = normalize(shp->axis); - b->oc = vec_sub(ray.origin, shp->cords); - b->a = vec_sub(ray.dir, scale(b->nor_cyl, vec_dot(&ray.dir, &b->nor_cyl))); - b->b = vec_sub(b->oc, scale(b->nor_cyl, vec_dot(&b->oc, &b->nor_cyl))); - b->a_f = vec_dot(&b->a, &b->a); - b->b_f = 2.0f * vec_dot(&b->a, &b->b); - b->c_f = vec_dot(&b->b, &b->b) - b->radius * b->radius; - b->discriminant = b->b_f * b->b_f - 4 * b->a_f * b->c_f; + calculate_cy_bag(b, shp, ray); + if (b->discriminant < 0.0f) + return ; + b->sqrt_disc = sqrtf(b->discriminant); + b->t1 = (-b->b_f - b->sqrt_disc) / (2.0f * b->a_f); + b->t2 = (-b->b_f + b->sqrt_disc) / (2.0f * b->a_f); + b->t_candidates[0] = b->t1; + b->t_candidates[1] = b->t2; } bool ray_inter_cy(t_ray ray, t_shapes *shp, float *t, t_hit_record *rec) { - t_cybag b; + t_cybag b; - calculate_cy_bag(&b, shp, ray); + prepare_cy_intersect(&b, shp, ray); if (b.discriminant >= 0.0f) - { - b.sqrt_disc = sqrtf(b.discriminant); - b.t1 = (-b.b_f - b.sqrt_disc) / (2.0f * b.a_f); - b.t2 = (-b.b_f + b.sqrt_disc) / (2.0f * b.a_f); - b.t_candidates[0] = b.t1; - b.t_candidates[1] = b.t2; - b.t_body = process_cy_body(b, shp, ray); - if (b.t_body > 0.0f) - { - resolve_hit(&b.rec_body, b.t_body, ray, shp); - b.to_point = vec_sub(b.rec_body.point, shp->cords); - b.projection = scale(b.nor_cyl, vec_dot(&b.to_point, &b.nor_cyl)); - b.rec_body.normal = normalize(vec_sub(b.to_point, b.projection)); - } - } + handle_cy_body(&b, shp, ray); b.t_cap = process_cy_cap(b, shp, ray, &b.rec_cap); if (b.t_body > 0.0f && (b.t_cap < 0.0f || b.t_body < b.t_cap)) { @@ -116,7 +99,7 @@ bool ray_inter_cy(t_ray ray, t_shapes *shp, float *t, t_hit_record *rec) *t = b.t_body; return (true); } - else if (b.t_cap > 0.0f) + if (b.t_cap > 0.0f) { *rec = b.rec_cap; *t = b.t_cap; From 6400dbbbc3dd3f12349f670a78c3ef79cb626aaf Mon Sep 17 00:00:00 2001 From: Arsenii Evstigneev Date: Sun, 8 Jun 2025 14:31:12 +0200 Subject: [PATCH 14/19] fix: leaks in do_lines --- include/minirt.h | 2 ++ src/parser.c | 3 ++- src/validate.c | 3 +-- src/validate_params.c | 9 +++++++++ 4 files changed, 14 insertions(+), 3 deletions(-) diff --git a/include/minirt.h b/include/minirt.h index 3191687..f946d02 100644 --- a/include/minirt.h +++ b/include/minirt.h @@ -325,6 +325,8 @@ bool validate_cylindr(char **tokens, const int count); bool validate_rgb(const char *token); bool validate_orientation(const char *tokens); +void remove_comment(char *line); + /*cy_utils*/ void calculate_cy_bag(t_cybag *b, t_shapes *shp, t_ray ray); void handle_cy_body(t_cybag *b, t_shapes *shp, t_ray ray); diff --git a/src/parser.c b/src/parser.c index 7b1edfd..b40ecb3 100644 --- a/src/parser.c +++ b/src/parser.c @@ -75,7 +75,8 @@ void do_lines(t_data *data, char **lines) cleanup_and_exit(data, lines, "Couldn't read scene"); if (read_state == 0 && i == 0) break ; - if (i == 0) + remove_comment(line); + if (line[0] == '\0') continue ; if (!process_line(line, &bag, lines, &line_idx)) cleanup_and_exit(data, lines, "Invalid scene line"); diff --git a/src/validate.c b/src/validate.c index d377b15..8216b1f 100644 --- a/src/validate.c +++ b/src/validate.c @@ -51,8 +51,7 @@ bool handle_identifiers(int camera_count, int light_count, int ambient_count) bool is_valid_identifier(const char *id) { return (!strcmp(id, "A") || !strcmp(id, "C") || !strcmp(id, "L") - || !strcmp(id, "sp") || !strcmp(id, "pl") || !strcmp(id, "cy") - || !strcmp(id, "#")); + || !strcmp(id, "sp") || !strcmp(id, "pl") || !strcmp(id, "cy")); } bool validate_tokens(char **tokens) diff --git a/src/validate_params.c b/src/validate_params.c index 95ae7f7..e2c8023 100644 --- a/src/validate_params.c +++ b/src/validate_params.c @@ -91,3 +91,12 @@ bool validate_ambient(char **tokens, const int count) } return (true); } + +void remove_comment(char *line) +{ + char *hash; + + hash = strchr(line, '#'); + if (hash) + *hash = '\0'; +} From eb76555d79994575ba56edca7f294f153ba8871a Mon Sep 17 00:00:00 2001 From: czarte Date: Sun, 8 Jun 2025 19:24:45 +0200 Subject: [PATCH 15/19] added loophook for key binding with loop_end mlx function for ESC, continue wiht moving camera --- basic.rt | 2 +- cylindre.rt | 5 +++-- main.c | 2 +- src/window.c | 9 +-------- 4 files changed, 6 insertions(+), 12 deletions(-) diff --git a/basic.rt b/basic.rt index 8ecbddc..81422aa 100644 --- a/basic.rt +++ b/basic.rt @@ -1,4 +1,4 @@ -A 1 255,255,225 +A .8 255,255,225 C 0,0,1 0,0,1 70 L -1,0,1 .8 255,255,255 sp 0.0,0.0,20.6 12.6 10,0,255 diff --git a/cylindre.rt b/cylindre.rt index 65aec8b..c5e5e68 100644 --- a/cylindre.rt +++ b/cylindre.rt @@ -1,5 +1,6 @@ A .5 125,125,125 L 0,0,305 .5 255,255,255 C 0,0,12 0,0,-1 60 -cy 0,0,0 0,1,0 2 8 140,118,206 -# \ No newline at end of file +#cy 0,0,0 0,1,0 2 8 140,118,206 +# cy 0,0,0 0,1,0 2 8 140,118,206 +cy 0,0,0 0,1,0 2 8 140,118,206 \ No newline at end of file diff --git a/main.c b/main.c index 7b0a066..c84c9f5 100644 --- a/main.c +++ b/main.c @@ -102,7 +102,7 @@ int main(int argc, char *argv[]) if (init_mlx_window(data) == -1) exit(-1); cast_rays(data); - mlx_key_hook(data->win_ptr, &key_mapping, (void *)data); + mlx_hook(data->win_ptr, 3, 1L << 7, &key_mapping, (void *)data); mlx_hook(data->win_ptr, 33, 1L << 17, &mlx_loop_end, data->mlx_ptr); mlx_loop(data->mlx_ptr); mlx_destroy_window(data->mlx_ptr, data->win_ptr); diff --git a/src/window.c b/src/window.c index 145368a..7ac0348 100644 --- a/src/window.c +++ b/src/window.c @@ -60,14 +60,7 @@ int key_mapping(int key, void *params) data = (t_data *) params; frame_n = data->frame % 2; if (key == KEY_ESC || key == 17 || key == 53) - { - mlx_destroy_image(data->mlx_ptr, data->scene_img[frame_n]->ptr); - mlx_destroy_window(data->mlx_ptr, data->win_ptr); - mlx_destroy_display(data->mlx_ptr); - free(data->mlx_ptr); - free_data(data); - exit(0); - } + mlx_loop_end(data->mlx_ptr); resolve_light_move(data, key, &cast); if (cast) { From 834331612c0a413732f07e8d69915054504be439 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vojte=CC=8Cch=20Parka=CC=81n?= Date: Sun, 8 Jun 2025 20:43:53 +0200 Subject: [PATCH 16/19] moves uncomplete --- box.rt | 2 +- include/mlx_utils.h | 14 ++++++++++---- main.c | 2 +- src/window.c | 33 +++++++++++++++++++++++++++++++++ 4 files changed, 45 insertions(+), 6 deletions(-) diff --git a/box.rt b/box.rt index 121abe8..9d6676e 100644 --- a/box.rt +++ b/box.rt @@ -1,5 +1,5 @@ A 0.5 255,255,255 -C 0,0,5 0,0,-1 100 +C 0,0,5 0,0,-1 60 L -1,2.5,5 0.7 255,255,255 pl 0,-1,0 0,1,0 100,100,100 diff --git a/include/mlx_utils.h b/include/mlx_utils.h index c84ec17..2a6d66c 100644 --- a/include/mlx_utils.h +++ b/include/mlx_utils.h @@ -19,10 +19,16 @@ # define KEY_ESC 65307 # define A_KEY_UP 237 # define A_KEY_DWN 233 -# define L_KEY_A_L 97 -# define L_KEY_D_R 100 -# define L_KEY_S_B 115 -# define L_KEY_W_U 119 + +# define C_ORI_A_L 97 +# define C_ORI_D_R 100 +# define C_ORI_S_B 115 +# define C_ORI_W_U 119 + +# define L_KEY_A_L 106 +# define L_KEY_D_R 108 +# define L_KEY_S_B 107 +# define L_KEY_W_U 105 # define L_KEY_X_F 120 # define L_KEY_Y_B 121 # define C_KEY_UP 65362 diff --git a/main.c b/main.c index c84c9f5..7b60b1a 100644 --- a/main.c +++ b/main.c @@ -102,7 +102,7 @@ int main(int argc, char *argv[]) if (init_mlx_window(data) == -1) exit(-1); cast_rays(data); - mlx_hook(data->win_ptr, 3, 1L << 7, &key_mapping, (void *)data); + mlx_hook(data->win_ptr, 2, 1L << 0, &key_mapping, data); mlx_hook(data->win_ptr, 33, 1L << 17, &mlx_loop_end, data->mlx_ptr); mlx_loop(data->mlx_ptr); mlx_destroy_window(data->mlx_ptr, data->win_ptr); diff --git a/src/window.c b/src/window.c index 7ac0348..c5d2e40 100644 --- a/src/window.c +++ b/src/window.c @@ -50,6 +50,37 @@ void resolve_light_move(t_data *data, int key, bool *cast) data->scene->lght.cords.y += 1; } +void resolve_camera_move(t_data *data, int key, bool *cast) +{ + if (key == C_KEY_UP || key == C_KEY_DOWN || key == C_KEY_LEFT || + key == C_KEY_RIGHT || key == C_ORI_W_U || key == C_ORI_S_B || + key == C_ORI_A_L || key == C_ORI_D_R || key == 92 || key == 121) + { + *cast = true; + data->frame++; + } + if (key == C_ORI_W_U) + data->scene->cam.cords.z -= 0.1f; + if (key == C_ORI_S_B) + data->scene->cam.cords.z += 0.1f; + if (key == C_ORI_A_L) + data->scene->cam.cords.x += 0.1f; + if (key == C_ORI_D_R) + data->scene->cam.cords.x -= 0.1f; + if (key == C_KEY_UP) + data->scene->cam.orient.y += 0.1f; + if (key == C_KEY_DOWN) + data->scene->cam.orient.y -= 0.1f; + if (key == C_KEY_LEFT) + data->scene->cam.orient.x -= 0.1f; + if (key == C_KEY_RIGHT) + data->scene->cam.orient.x += 0.1f; + if (key == 92) + data->scene->cam.cords.z -= 0.1f; + if (key == 121) + data->scene->cam.cords.z += 0.1f; +} + int key_mapping(int key, void *params) { bool cast; @@ -62,6 +93,8 @@ int key_mapping(int key, void *params) if (key == KEY_ESC || key == 17 || key == 53) mlx_loop_end(data->mlx_ptr); resolve_light_move(data, key, &cast); + resolve_camera_move(data, key, &cast); + printf("key: %d\n", key); if (cast) { cast_rays(data); From b489e401b93ebc44db40aabefa716f88327660f9 Mon Sep 17 00:00:00 2001 From: Vojtech Parkan Date: Thu, 12 Jun 2025 11:05:37 +0200 Subject: [PATCH 17/19] free the memory --- main.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/main.c b/main.c index 7b60b1a..ce90a94 100644 --- a/main.c +++ b/main.c @@ -105,8 +105,10 @@ int main(int argc, char *argv[]) mlx_hook(data->win_ptr, 2, 1L << 0, &key_mapping, data); mlx_hook(data->win_ptr, 33, 1L << 17, &mlx_loop_end, data->mlx_ptr); mlx_loop(data->mlx_ptr); + mlx_destroy_image(data->mlx_ptr, data->scene_img[data->frame % 2]->ptr); mlx_destroy_window(data->mlx_ptr, data->win_ptr); mlx_destroy_display(data->mlx_ptr); + free(data->mlx_ptr); free_data(data); return (0); } From b150f232c7af5fd1edbe958f8478dd77ec3a4054 Mon Sep 17 00:00:00 2001 From: Vojtech Parkan Date: Thu, 12 Jun 2025 11:39:20 +0200 Subject: [PATCH 18/19] norm for movements --- src/window.c | 22 ++++++++++++++-------- 1 file changed, 14 insertions(+), 8 deletions(-) diff --git a/src/window.c b/src/window.c index c5d2e40..f2c05fa 100644 --- a/src/window.c +++ b/src/window.c @@ -50,15 +50,8 @@ void resolve_light_move(t_data *data, int key, bool *cast) data->scene->lght.cords.y += 1; } -void resolve_camera_move(t_data *data, int key, bool *cast) +static void make_cam_move(t_data *data, int key) { - if (key == C_KEY_UP || key == C_KEY_DOWN || key == C_KEY_LEFT || - key == C_KEY_RIGHT || key == C_ORI_W_U || key == C_ORI_S_B || - key == C_ORI_A_L || key == C_ORI_D_R || key == 92 || key == 121) - { - *cast = true; - data->frame++; - } if (key == C_ORI_W_U) data->scene->cam.cords.z -= 0.1f; if (key == C_ORI_S_B) @@ -81,6 +74,19 @@ void resolve_camera_move(t_data *data, int key, bool *cast) data->scene->cam.cords.z += 0.1f; } +void resolve_camera_move(t_data *data, int key, bool *cast) +{ + if (key == C_KEY_UP || key == C_KEY_DOWN || key == C_KEY_LEFT + || key == C_KEY_RIGHT || key == C_ORI_W_U || key == C_ORI_S_B + || key == C_ORI_A_L || key == C_ORI_D_R || key == 92 || key == 121) + { + *cast = true; + data->frame++; + } + make_cam_move(data, key); + data->scene->cam.orient = normalize(data->scene->cam.orient); +} + int key_mapping(int key, void *params) { bool cast; From 8304a9bf90be74b024aeb84c1660f4c62d2d8698 Mon Sep 17 00:00:00 2001 From: Vojtech Parkan Date: Thu, 12 Jun 2025 11:48:08 +0200 Subject: [PATCH 19/19] last bits on Makefile and movements --- Makefile | 2 ++ src/window.c | 4 ---- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/Makefile b/Makefile index 83608cf..bb350bd 100644 --- a/Makefile +++ b/Makefile @@ -17,6 +17,7 @@ NAME = miniRT all: $(NAME) $(NAME): $(OBJ) + @cd mlx && make @make bonus -C $(LIBFTDIR) @cp $(LIBFTDIR)/$(LIBFT) . $(CC) $(CPPFLAGS) $(OBJ) $(LIBFT) mlx/libmlx.a -lXext -lX11 -o $(NAME) -lm @@ -28,6 +29,7 @@ clean: fclean: clean $(RM) $(NAME) + @cd mlx && make clean re: fclean $(NAME) diff --git a/src/window.c b/src/window.c index f2c05fa..8dedb5d 100644 --- a/src/window.c +++ b/src/window.c @@ -68,10 +68,6 @@ static void make_cam_move(t_data *data, int key) data->scene->cam.orient.x -= 0.1f; if (key == C_KEY_RIGHT) data->scene->cam.orient.x += 0.1f; - if (key == 92) - data->scene->cam.cords.z -= 0.1f; - if (key == 121) - data->scene->cam.cords.z += 0.1f; } void resolve_camera_move(t_data *data, int key, bool *cast)