diff options
-rw-r--r-- | Makefile | 3 | ||||
-rw-r--r-- | inc/cub3d.h | 15 | ||||
-rw-r--r-- | inc/cub3d_structs.h | 2 | ||||
-rw-r--r-- | src/ft_castray_loop.c | 87 | ||||
-rw-r--r-- | src/ft_floor_cast.c | 99 | ||||
-rw-r--r-- | src/ft_floor_cast_inits.c | 38 | ||||
-rw-r--r-- | src/ft_floor_threads.c | 111 | ||||
-rw-r--r-- | src/ft_raycasting.c | 207 | ||||
-rw-r--r-- | src/ft_wall_cast.c | 70 | ||||
-rw-r--r-- | src/ft_wall_threads.c | 83 |
10 files changed, 397 insertions, 318 deletions
@@ -131,6 +131,9 @@ SRCS_NAME += ft_draw_ammo_bar.c SRCS_NAME += ft_shoot.c SRCS_NAME += ft_hud_threads.c SRCS_NAME += ft_hud_threads_next.c +SRCS_NAME += ft_wall_threads.c +SRCS_NAME += ft_floor_threads.c +SRCS_NAME += ft_castray_loop.c #--------------------------------------------------------------------------------------------------# SRCS = $(addprefix ${SRCS_DIR},${SRCS_NAME}) #--------------------------------------------------------------------------------------------------# diff --git a/inc/cub3d.h b/inc/cub3d.h index 80ea1e2..454dc46 100644 --- a/inc/cub3d.h +++ b/inc/cub3d.h @@ -85,6 +85,7 @@ void ft_draw_scene(t_cub *clist); void ft_draw_scene_bmp(t_cub *clist); void ft_draw_circle(float a, float b, int32_t color, t_cub *cl); +void ft_draw_verline(t_cub *cl, int32_t x, int32_t y, int32_t y2); void ft_sprite_h_w(t_cub *cl, t_sprite *sprite); void ft_sort_sprites(t_cub *cl, int16_t i, int16_t j); void ft_calc_sprite(t_cub *cl); @@ -106,6 +107,14 @@ void *ft_life_bar_thread(void *vargp); void *ft_ammo_bar_thread(void *vargp); void *ft_health_cap_thread(void *vargp); void *ft_ammo_cap_thread(void *vargp); +void *ft_wall_one(void *vargp); +void *ft_wall_two(void *vargp); +void *ft_wall_three(void *vargp); +void *ft_wall_four(void *vargp); +void *ft_floor_one(void *vargp); +void *ft_floor_two(void *vargp); +void *ft_floor_three(void *vargp); +void *ft_floor_four(void *vargp); /* ** ====== PARSING ====== @@ -172,6 +181,12 @@ void ft_detection_init_y(t_cub *cl); void *ft_wall_cast(void *vargp); void *ft_floor_cast(void *vargp); void ft_floor_cast_inits(uint16_t y, t_ray *rl, t_cub *cl); +void ft_calc_tex(t_cub *cl); +void ft_initray(uint16_t i, t_cub *cl); +void ft_castray_loop(uint16_t i, t_win *wl, t_cub *cl); +void ft_set_fc_tex_xy(uint8_t tid, uint16_t x, uint16_t y, t_cub *cl); +void ft_floor_loop(uint16_t y, t_cub *cl); +void ft_floor_cast_loop(uint16_t y, uint16_t x, t_cub *cl); /* ** ====== SFX ====== diff --git a/inc/cub3d_structs.h b/inc/cub3d_structs.h index 58caa73..3f3fb0e 100644 --- a/inc/cub3d_structs.h +++ b/inc/cub3d_structs.h @@ -173,10 +173,10 @@ typedef struct s_ray int32_t ***fc_tex_y_tab; float *row_dist_tab; int16_t *wall_t_tab; + int16_t *wall_b_tab; uint8_t *w_side_tab; uint16_t *line_h_tab; float *wall_dist_tab; - int16_t *wall_bz; } t_ray; typedef struct s_map diff --git a/src/ft_castray_loop.c b/src/ft_castray_loop.c new file mode 100644 index 0000000..28277a7 --- /dev/null +++ b/src/ft_castray_loop.c @@ -0,0 +1,87 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_raycasting.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: rbousset <marvin@42.fr> +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2020/02/14 17:22:57 by rbousset #+# #+# */ +/* Updated: 2020/02/14 17:23:42 by rbousset ### ########lyon.fr */ +/* */ +/* ************************************************************************** */ + +#include <libft.h> +#include <cub3d.h> +#include <stdint.h> +#include <stdlib.h> +#include <math.h> + +void + ft_calc_tex(t_cub *cl) +{ + if (cl->rlist.side == 0) + cl->rlist.wall_hit_x = (cl->plist.pos_x) + + cl->rlist.wall_dist * cl->rlist.y_ray_dir; + else + cl->rlist.wall_hit_x = (cl->plist.pos_y) + + cl->rlist.wall_dist * cl->rlist.x_ray_dir; + cl->rlist.wall_hit_x -= floor(cl->rlist.wall_hit_x); + cl->tlist[cl->w_side].tex_x = (int)(cl->rlist.wall_hit_x * + (double)cl->tlist[cl->w_side].img_w); + if (cl->rlist.side == 0 && cl->rlist.x_ray_dir > 0) + cl->tlist[cl->w_side].tex_x = cl->tlist[cl->w_side].img_w + - cl->tlist[cl->w_side].tex_x - 1; + else if (cl->rlist.side == 1 && cl->rlist.y_ray_dir < 0) + cl->tlist[cl->w_side].tex_x = cl->tlist[cl->w_side].img_w + - cl->tlist[cl->w_side].tex_x - 1; +} + +void + ft_initray(uint16_t i, t_cub *cl) +{ + t_win *wl; + t_player *pl; + + wl = &cl->wlist; + pl = &cl->plist; + pl->cam_x = 2 * i / (float)(wl->x_size) - 1; + cl->rlist.x_ray_pos = pl->pos_y; + cl->rlist.y_ray_pos = pl->pos_x; + cl->rlist.x_ray_dir = pl->dir_x + pl->plane_x * + pl->cam_x; + cl->rlist.y_ray_dir = pl->dir_y + pl->plane_y * + pl->cam_x; + cl->rlist.sqx = (int16_t)cl->rlist.x_ray_pos; + cl->rlist.sqy = (int16_t)cl->rlist.y_ray_pos; + ft_detect(cl); + if (cl->rlist.side == 0) + { + cl->rlist.wall_dist = (cl->rlist.sqx - cl->rlist.x_ray_pos + + (1 - cl->mlist.x_step) / 2) / cl->rlist.x_ray_dir; + } + else + { + cl->rlist.wall_dist = (cl->rlist.sqy - cl->rlist.y_ray_pos + + (1 - cl->mlist.y_step) / 2) / cl->rlist.y_ray_dir; + } +} + +void + ft_castray_loop(uint16_t i, t_win *wl, t_cub *cl) +{ + ft_initray(i, cl); + cl->rlist.line_h = (int16_t)(wl->y_size / cl->rlist.wall_dist); + cl->rlist.wall_t = -cl->rlist.line_h / 2 + wl->y_size / 2; + if (cl->rlist.wall_t < 0) + cl->rlist.wall_t = 0; + cl->rlist.wall_b = cl->rlist.line_h / 2 + wl->y_size / 2; + if (cl->rlist.wall_b >= (int16_t)wl->y_size) + cl->rlist.wall_b = wl->y_size - 1; + ft_choose_tex(i, cl); + ft_calc_tex(cl); + cl->rlist.tex_x_tab[i] = cl->tlist[cl->w_side].tex_x; + cl->rlist.line_h_tab[i] = cl->rlist.line_h; + cl->rlist.wall_t_tab[i] = cl->rlist.wall_t; + cl->rlist.wall_b_tab[i] = cl->rlist.wall_b; + cl->rlist.wall_dist_tab[i] = cl->rlist.wall_dist; +} diff --git a/src/ft_floor_cast.c b/src/ft_floor_cast.c index c9c44e5..3962431 100644 --- a/src/ft_floor_cast.c +++ b/src/ft_floor_cast.c @@ -43,7 +43,7 @@ static void (y * cl->img.sizeline))) = ft_rgb_to_hex(dist, rgb, cl); } -static void +void ft_floor_cast_loop(uint16_t y, uint16_t x, t_cub *cl) { if (cl->mlist.isftex) @@ -61,103 +61,6 @@ static void } void -*ft_floor_one(void *vargp) -{ - uint16_t x; - uint16_t y; - t_cub *cl; - - cl = (t_cub *)vargp; - y = (cl->wlist.y_size / 2); - while (y < (cl->wlist.y_size)) - { - x = 0; - while (x < cl->wlist.x_size / 4) - { - if (cl->rlist.wall_bz[x] <= y) - ft_floor_cast_loop(y, x, cl); - x++; - } - y++; - } - pthread_exit(0x0); - return (0x0); -} - -void -*ft_floor_two(void *vargp) -{ - uint16_t x; - uint16_t y; - t_cub *cl; - - cl = (t_cub *)vargp; - y = (cl->wlist.y_size / 2); - /* y += 1 * (cl->wlist.y_size / 2 / 4); */ - while (y < (cl->wlist.y_size)) - { - x = cl->wlist.x_size / 4; - while (x < 2 * (cl->wlist.x_size / 4)) - { - if (cl->rlist.wall_bz[x] <= y) - ft_floor_cast_loop(y, x, cl); - x++; - } - y++; - } - pthread_exit(0x0); - return (0x0); -} - -void -*ft_floor_three(void *vargp) -{ - uint16_t x; - uint16_t y; - t_cub *cl; - - cl = (t_cub *)vargp; - y = (cl->wlist.y_size / 2); - while (y < (cl->wlist.y_size)) - { - x = 2 * (cl->wlist.x_size / 4); - while (x < 3 * (cl->wlist.x_size / 4)) - { - if (cl->rlist.wall_bz[x] <= y) - ft_floor_cast_loop(y, x, cl); - x++; - } - y++; - } - pthread_exit(0x0); - return (0x0); -} - -void -*ft_floor_four(void *vargp) -{ - uint16_t x; - uint16_t y; - t_cub *cl; - - cl = (t_cub *)vargp; - y = (cl->wlist.y_size / 2); - while (y < (cl->wlist.y_size)) - { - x = 3 * (cl->wlist.x_size / 4); - while (x < 4 * (cl->wlist.x_size / 4)) - { - if (cl->rlist.wall_bz[x] <= y) - ft_floor_cast_loop(y, x, cl); - x++; - } - y++; - } - pthread_exit(0x0); - return (0x0); -} - -void *ft_floor_cast(void *vargp) { pthread_t tid[4]; diff --git a/src/ft_floor_cast_inits.c b/src/ft_floor_cast_inits.c index 591eb24..d1f2811 100644 --- a/src/ft_floor_cast_inits.c +++ b/src/ft_floor_cast_inits.c @@ -14,6 +14,20 @@ #include <stdint.h> void + ft_set_fc_tex_xy(uint8_t tid, uint16_t x, uint16_t y, t_cub *cl) +{ + const int32_t x_cell = (int32_t)(cl->rlist.x_floor); + const int32_t y_cell = (int32_t)(cl->rlist.y_floor); + + cl->tlist[tid].tex_x = (int32_t)(cl->tlist[tid].img_h + * (cl->rlist.y_floor - y_cell)); + cl->tlist[tid].tex_y = (int32_t)(cl->tlist[tid].img_w + * (cl->rlist.x_floor - x_cell)); + cl->rlist.fc_tex_x_tab[tid - 6][y][x] = cl->tlist[tid].tex_x; + cl->rlist.fc_tex_y_tab[tid - 6][y][x] = cl->tlist[tid].tex_y; +} + +void ft_floor_cast_inits(uint16_t y, t_ray *rl, t_cub *cl) { rl->x_f_ray_dir = cl->plist.dir_x - cl->plist.plane_x; @@ -30,3 +44,27 @@ void rl->x_floor = cl->plist.pos_y + rl->row_dist * rl->x_f_ray_dir; rl->y_floor = cl->plist.pos_x + rl->row_dist * rl->y_f_ray_dir; } + +void + ft_floor_loop(uint16_t y, t_cub *cl) +{ + uint16_t x; + + x = 0; + ft_floor_cast_inits(y, &cl->rlist, cl); + while (x < cl->wlist.x_size) + { + if (cl->rlist.wall_b_tab[x] <= y) + { + if (cl->mlist.isftex) + ft_set_fc_tex_xy(6, x, y, cl); + if (cl->mlist.isctex && !cl->mlist.isskybox) + ft_set_fc_tex_xy(7, x, cl->wlist.y_size - y - 1, cl); + } + cl->rlist.x_floor += cl->mlist.x_floor_step; + cl->rlist.y_floor += cl->mlist.y_floor_step; + x++; + } + cl->rlist.row_dist_tab[y] = cl->rlist.row_dist; + cl->rlist.row_dist_tab[cl->wlist.y_size - y] = cl->rlist.row_dist; +} diff --git a/src/ft_floor_threads.c b/src/ft_floor_threads.c new file mode 100644 index 0000000..476bd8e --- /dev/null +++ b/src/ft_floor_threads.c @@ -0,0 +1,111 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_wall_threads.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: rbousset <marvin@42.fr> +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2020/02/14 17:22:23 by rbousset #+# #+# */ +/* Updated: 2020/02/14 17:23:42 by rbousset ### ########lyon.fr */ +/* */ +/* ************************************************************************** */ + +#include <cub3d.h> +#include <stdint.h> +#include <pthread.h> + +void + *ft_floor_one(void *vargp) +{ + uint16_t x; + uint16_t y; + t_cub *cl; + + cl = (t_cub *)vargp; + y = (cl->wlist.y_size / 2); + while (y < (cl->wlist.y_size)) + { + x = 0; + while (x < cl->wlist.x_size / 4) + { + if (cl->rlist.wall_b_tab[x] <= y) + ft_floor_cast_loop(y, x, cl); + x++; + } + y++; + } + pthread_exit(0x0); + return (0x0); +} + +void + *ft_floor_two(void *vargp) +{ + uint16_t x; + uint16_t y; + t_cub *cl; + + cl = (t_cub *)vargp; + y = (cl->wlist.y_size / 2); + while (y < (cl->wlist.y_size)) + { + x = cl->wlist.x_size / 4; + while (x < 2 * (cl->wlist.x_size / 4)) + { + if (cl->rlist.wall_b_tab[x] <= y) + ft_floor_cast_loop(y, x, cl); + x++; + } + y++; + } + pthread_exit(0x0); + return (0x0); +} + +void + *ft_floor_three(void *vargp) +{ + uint16_t x; + uint16_t y; + t_cub *cl; + + cl = (t_cub *)vargp; + y = (cl->wlist.y_size / 2); + while (y < (cl->wlist.y_size)) + { + x = 2 * (cl->wlist.x_size / 4); + while (x < 3 * (cl->wlist.x_size / 4)) + { + if (cl->rlist.wall_b_tab[x] <= y) + ft_floor_cast_loop(y, x, cl); + x++; + } + y++; + } + pthread_exit(0x0); + return (0x0); +} + +void + *ft_floor_four(void *vargp) +{ + uint16_t x; + uint16_t y; + t_cub *cl; + + cl = (t_cub *)vargp; + y = (cl->wlist.y_size / 2); + while (y < (cl->wlist.y_size)) + { + x = 3 * (cl->wlist.x_size / 4); + while (x < 4 * (cl->wlist.x_size / 4)) + { + if (cl->rlist.wall_b_tab[x] <= y) + ft_floor_cast_loop(y, x, cl); + x++; + } + y++; + } + pthread_exit(0x0); + return (0x0); +} diff --git a/src/ft_raycasting.c b/src/ft_raycasting.c index 1804118..8a79154 100644 --- a/src/ft_raycasting.c +++ b/src/ft_raycasting.c @@ -18,192 +18,99 @@ #include <pthread.h> static void - ft_calc_tex(t_cub *cl) + ft_allocate_tabs(uint16_t y_s, uint16_t x_s, t_ray *rl, t_cub *cl) { - if (cl->rlist.side == 0) - cl->rlist.wall_hit_x = (cl->plist.pos_x) + - cl->rlist.wall_dist * cl->rlist.y_ray_dir; - else - cl->rlist.wall_hit_x = (cl->plist.pos_y) + - cl->rlist.wall_dist * cl->rlist.x_ray_dir; - cl->rlist.wall_hit_x -= floor(cl->rlist.wall_hit_x); - cl->tlist[cl->w_side].tex_x = (int)(cl->rlist.wall_hit_x * - (double)cl->tlist[cl->w_side].img_w); - if (cl->rlist.side == 0 && cl->rlist.x_ray_dir > 0) - cl->tlist[cl->w_side].tex_x = cl->tlist[cl->w_side].img_w - - cl->tlist[cl->w_side].tex_x - 1; - else if (cl->rlist.side == 1 && cl->rlist.y_ray_dir < 0) - cl->tlist[cl->w_side].tex_x = cl->tlist[cl->w_side].img_w - - cl->tlist[cl->w_side].tex_x - 1; + uint16_t y; + uint16_t x; + + if (!(rl->wall_dist_tab = (float*)malloc(x_s * sizeof(float))) || + !(rl->wall_b_tab = (int16_t*)malloc(x_s * sizeof(int16_t))) || + !(rl->w_side_tab = (uint8_t*)malloc(x_s * sizeof(uint8_t))) || + !(rl->line_h_tab = (uint16_t*)malloc(x_s * sizeof(uint16_t))) || + !(rl->wall_t_tab = (int16_t*)malloc(x_s * sizeof(int16_t))) || + !(rl->tex_x_tab = (int32_t*)malloc(x_s * sizeof(int32_t))) || + !(rl->fc_tex_x_tab = (int32_t***)malloc(2 * sizeof(int32_t**))) || + !(rl->fc_tex_y_tab = (int32_t***)malloc(2 * sizeof(int32_t**))) || + !(rl->row_dist_tab = (float*)malloc(y_s * sizeof(float)))) + ft_error(FT_RET_ALLOC_ERR, FT_ERR_ALLOCATE, cl); + x = -1; + while (++x < 2) + { + if (!(rl->fc_tex_x_tab[x] = (int**)malloc(y_s * sizeof(int*))) || + !(rl->fc_tex_y_tab[x] = (int**)malloc(y_s * sizeof(int*)))) + ft_error(FT_RET_ALLOC_ERR, FT_ERR_ALLOCATE, cl); + y = -1; + while (++y < y_s) + if (!(rl->fc_tex_x_tab[x][y] = (int*)malloc(x_s * sizeof(int))) || + !(rl->fc_tex_y_tab[x][y] = (int*)malloc(x_s * sizeof(int)))) + ft_error(FT_RET_ALLOC_ERR, FT_ERR_ALLOCATE, cl); + } } static void - ft_initray(uint16_t i, t_cub *cl) + ft_precalc_loops(t_cub *cl) { - t_win *wl; - t_player *pl; + uint16_t i; - wl = &cl->wlist; - pl = &cl->plist; - pl->cam_x = 2 * i / (float)(wl->x_size) - 1; - cl->rlist.x_ray_pos = pl->pos_y; - cl->rlist.y_ray_pos = pl->pos_x; - cl->rlist.x_ray_dir = pl->dir_x + pl->plane_x * - pl->cam_x; - cl->rlist.y_ray_dir = pl->dir_y + pl->plane_y * - pl->cam_x; - cl->rlist.sqx = (int16_t)cl->rlist.x_ray_pos; - cl->rlist.sqy = (int16_t)cl->rlist.y_ray_pos; - ft_detect(cl); - if (cl->rlist.side == 0) + i = 0; + while (i < cl->wlist.x_size) { - cl->rlist.wall_dist = (cl->rlist.sqx - cl->rlist.x_ray_pos + - (1 - cl->mlist.x_step) / 2) / cl->rlist.x_ray_dir; + ft_castray_loop(i, &cl->wlist, cl); + i++; } - else + i = (cl->wlist.y_size / 2); + while (i < cl->wlist.y_size) { - cl->rlist.wall_dist = (cl->rlist.sqy - cl->rlist.y_ray_pos + - (1 - cl->mlist.y_step) / 2) / cl->rlist.y_ray_dir; + ft_floor_loop(i, cl); + i++; } } static void - ft_castray_loop(uint16_t i, t_win *wl, t_cub *cl) -{ - ft_initray(i, cl); - cl->rlist.line_h = (int16_t)(wl->y_size / cl->rlist.wall_dist); - cl->rlist.wall_t = -cl->rlist.line_h / 2 + wl->y_size / 2; - if (cl->rlist.wall_t < 0) - cl->rlist.wall_t = 0; - cl->rlist.wall_b = cl->rlist.line_h / 2 + wl->y_size / 2; - if (cl->rlist.wall_b >= (int16_t)wl->y_size) - cl->rlist.wall_b = wl->y_size - 1; - ft_choose_tex(i, cl); - ft_calc_tex(cl); - cl->rlist.tex_x_tab[i] = cl->tlist[cl->w_side].tex_x; - cl->rlist.line_h_tab[i] = cl->rlist.line_h; - cl->rlist.wall_t_tab[i] = cl->rlist.wall_t; - cl->rlist.wall_bz[i] = cl->rlist.wall_b; - cl->rlist.wall_dist_tab[i] = cl->rlist.wall_dist; -} - -static void - ft_set_fc_tex_xy(uint8_t tid, uint16_t x, uint16_t y, t_cub *cl) + ft_del_tabs(t_cub *cl) { - const int32_t x_cell = (int32_t)(cl->rlist.x_floor); - const int32_t y_cell = (int32_t)(cl->rlist.y_floor); - - cl->tlist[tid].tex_x = (int32_t)(cl->tlist[tid].img_h - * (cl->rlist.y_floor - y_cell)); - cl->tlist[tid].tex_y = (int32_t)(cl->tlist[tid].img_w - * (cl->rlist.x_floor - x_cell)); - cl->rlist.fc_tex_x_tab[tid - 6][y][x] = cl->tlist[tid].tex_x; - cl->rlist.fc_tex_y_tab[tid - 6][y][x] = cl->tlist[tid].tex_y; -} - -void - ft_castray(t_cub *cl) -{ - pthread_t tid[2]; uint16_t y; uint16_t x; - if (!(cl->rlist.wall_dist_tab = (float*)malloc(cl->wlist.x_size * - sizeof(float))) || - !(cl->rlist.wall_bz = (int16_t*)malloc(cl->wlist.x_size * - sizeof(int16_t))) || - !(cl->rlist.w_side_tab = (uint8_t*)malloc(cl->wlist.x_size * - sizeof(uint8_t))) || - !(cl->rlist.line_h_tab = (uint16_t*)malloc(cl->wlist.x_size * - sizeof(uint16_t))) || - !(cl->rlist.wall_t_tab = (int16_t*)malloc(cl->wlist.x_size * - sizeof(int16_t))) || - !(cl->rlist.tex_x_tab = (int32_t*)malloc(cl->wlist.x_size * - sizeof(int32_t))) || - !(cl->rlist.fc_tex_x_tab = (int32_t***)malloc(2 * sizeof(int32_t**))) || - !(cl->rlist.fc_tex_y_tab = (int32_t***)malloc(2 * sizeof(int32_t**))) || - !(cl->rlist.row_dist_tab = (float*)malloc(cl->wlist.y_size * - sizeof(float)))) - ft_error(FT_RET_ALLOC_ERR, FT_ERR_ALLOCATE, cl); - x = 0; - while (x < 2) + x = -1; + while (++x < 2) { - if (!(cl->rlist.fc_tex_x_tab[x] = (int**)malloc(cl->wlist.y_size * - sizeof(int*))) || - !(cl->rlist.fc_tex_y_tab[x] = (int**)malloc(cl->wlist.y_size * - sizeof(int*)))) - ft_error(FT_RET_ALLOC_ERR, FT_ERR_ALLOCATE, cl); - y = 0; - while (y < cl->wlist.y_size) - { - if (!(cl->rlist.fc_tex_x_tab[x][y] = (int*)malloc(cl->wlist.x_size * - sizeof(int))) || - !(cl->rlist.fc_tex_y_tab[x][y] = (int*)malloc(cl->wlist.x_size * - sizeof(int)))) - ft_error(FT_RET_ALLOC_ERR, FT_ERR_ALLOCATE, cl); - y++; - } - x++; - } - x = 0; - while (x < cl->wlist.x_size) - { - ft_castray_loop(x, &cl->wlist, cl); - x++; - } - y = cl->wlist.y_size / 2; - while (y < cl->wlist.y_size) - { - x = 0; - ft_floor_cast_inits(y, &cl->rlist, cl); - while (x < cl->wlist.x_size) - { - if (cl->rlist.wall_bz[x] <= y) - { - if (cl->mlist.isftex) - ft_set_fc_tex_xy(6, x, y, cl); - if (cl->mlist.isctex && !cl->mlist.isskybox) - ft_set_fc_tex_xy(7, x, cl->wlist.y_size - y - 1, cl); - } - cl->rlist.x_floor += cl->mlist.x_floor_step; - cl->rlist.y_floor += cl->mlist.y_floor_step; - x++; - } - cl->rlist.row_dist_tab[y] = cl->rlist.row_dist; - cl->rlist.row_dist_tab[cl->wlist.y_size - y] = cl->rlist.row_dist; - y++; - } - pthread_create(&tid[0], 0x0, ft_wall_cast, (void*)cl); - pthread_create(&tid[1], 0x0, ft_floor_cast, (void*)cl); - pthread_join(tid[0], 0x0); - pthread_join(tid[1], 0x0); - x = 0; - while (x < 2) - { - y = 0; - while (y < cl->wlist.y_size) + y = -1; + while (++y < cl->wlist.y_size) { ft_memdel((void*)&cl->rlist.fc_tex_x_tab[x][y]); ft_memdel((void*)&cl->rlist.fc_tex_y_tab[x][y]); - y++; } ft_memdel((void*)&cl->rlist.fc_tex_x_tab[x]); ft_memdel((void*)&cl->rlist.fc_tex_y_tab[x]); - x++; } ft_memdel((void*)&cl->rlist.fc_tex_x_tab); ft_memdel((void*)&cl->rlist.fc_tex_y_tab); ft_memdel((void*)&cl->rlist.tex_x_tab); ft_memdel((void*)&cl->rlist.row_dist_tab); ft_memdel((void*)&cl->rlist.wall_t_tab); + ft_memdel((void*)&cl->rlist.wall_b_tab); ft_memdel((void*)&cl->rlist.w_side_tab); ft_memdel((void*)&cl->rlist.line_h_tab); - ft_memdel((void*)&cl->rlist.wall_bz); + ft_memdel((void*)&cl->rlist.wall_dist_tab); +} + +void + ft_castray(t_cub *cl) +{ + pthread_t tid[2]; + + ft_allocate_tabs(cl->wlist.y_size, cl->wlist.x_size, &cl->rlist, cl); + ft_precalc_loops(cl); + pthread_create(&tid[0], 0x0, ft_wall_cast, (void*)cl); + pthread_create(&tid[1], 0x0, ft_floor_cast, (void*)cl); + pthread_join(tid[0], 0x0); + pthread_join(tid[1], 0x0); ft_calc_sprite(cl); ft_calc_heal(cl); ft_calc_trap(cl); ft_calc_weaps(cl); if (cl->plist.handles_weapon > -1) ft_draw_handweap(cl); - ft_memdel((void*)&cl->rlist.wall_dist_tab); + ft_del_tabs(cl); } diff --git a/src/ft_wall_cast.c b/src/ft_wall_cast.c index 8e74434..7610df6 100644 --- a/src/ft_wall_cast.c +++ b/src/ft_wall_cast.c @@ -14,7 +14,7 @@ #include <stdint.h> #include <pthread.h> -static void +void ft_draw_verline(t_cub *cl, int32_t x, int32_t y, int32_t y2) { int32_t d; @@ -35,74 +35,6 @@ static void } } -static void -*ft_wall_one(void *vargp) -{ - t_cub *cl; - uint16_t i; - - cl = (t_cub *)vargp; - i = 0; - while (i < cl->wlist.x_size / 4) - { - ft_draw_verline(cl, i, cl->rlist.wall_t_tab[i], cl->rlist.wall_bz[i]); - i++; - } - pthread_exit(0x0); - return (0x0); -} - -static void -*ft_wall_two(void *vargp) -{ - t_cub *cl; - uint16_t i; - - cl = (t_cub *)vargp; - i = cl->wlist.x_size / 4; - while (i < 2 * (cl->wlist.x_size / 4)) - { - ft_draw_verline(cl, i, cl->rlist.wall_t_tab[i], cl->rlist.wall_bz[i]); - i++; - } - pthread_exit(0x0); - return (0x0); -} - -static void -*ft_wall_three(void *vargp) -{ - t_cub *cl; - uint16_t i; - - cl = (t_cub *)vargp; - i = 2 * (cl->wlist.x_size / 4); - while (i < 3 * (cl->wlist.x_size / 4)) - { - ft_draw_verline(cl, i, cl->rlist.wall_t_tab[i], cl->rlist.wall_bz[i]); - i++; - } - pthread_exit(0x0); - return (0x0); -} - -static void -*ft_wall_four(void *vargp) -{ - t_cub *cl; - uint16_t i; - - cl = (t_cub *)vargp; - i = 3 * (cl->wlist.x_size / 4); - while (i < 4 * (cl->wlist.x_size / 4)) - { - ft_draw_verline(cl, i, cl->rlist.wall_t_tab[i], cl->rlist.wall_bz[i]); - i++; - } - pthread_exit(0x0); - return (0x0); -} - void *ft_wall_cast(void *vargp) { diff --git a/src/ft_wall_threads.c b/src/ft_wall_threads.c new file mode 100644 index 0000000..30aa3b9 --- /dev/null +++ b/src/ft_wall_threads.c @@ -0,0 +1,83 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_wall_threads.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: rbousset <marvin@42.fr> +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2020/02/14 17:22:23 by rbousset #+# #+# */ +/* Updated: 2020/02/14 17:23:42 by rbousset ### ########lyon.fr */ +/* */ +/* ************************************************************************** */ + +#include <cub3d.h> +#include <stdint.h> +#include <pthread.h> + +void + *ft_wall_one(void *vargp) +{ + t_cub *cl; + uint16_t i; + + cl = (t_cub *)vargp; + i = 0; + while (i < cl->wlist.x_size / 4) + { + ft_draw_verline(cl, i, cl->rlist.wall_t_tab[i], cl->rlist.wall_b_tab[i]); + i++; + } + pthread_exit(0x0); + return (0x0); +} + +void + *ft_wall_two(void *vargp) +{ + t_cub *cl; + uint16_t i; + + cl = (t_cub *)vargp; + i = cl->wlist.x_size / 4; + while (i < 2 * (cl->wlist.x_size / 4)) + { + ft_draw_verline(cl, i, cl->rlist.wall_t_tab[i], cl->rlist.wall_b_tab[i]); + i++; + } + pthread_exit(0x0); + return (0x0); +} + +void + *ft_wall_three(void *vargp) +{ + t_cub *cl; + uint16_t i; + + cl = (t_cub *)vargp; + i = 2 * (cl->wlist.x_size / 4); + while (i < 3 * (cl->wlist.x_size / 4)) + { + ft_draw_verline(cl, i, cl->rlist.wall_t_tab[i], cl->rlist.wall_b_tab[i]); + i++; + } + pthread_exit(0x0); + return (0x0); +} + +void + *ft_wall_four(void *vargp) +{ + t_cub *cl; + uint16_t i; + + cl = (t_cub *)vargp; + i = 3 * (cl->wlist.x_size / 4); + while (i < 4 * (cl->wlist.x_size / 4)) + { + ft_draw_verline(cl, i, cl->rlist.wall_t_tab[i], cl->rlist.wall_b_tab[i]); + i++; + } + pthread_exit(0x0); + return (0x0); +} |