diff options
Diffstat (limited to '')
-rw-r--r-- | Makefile | 19 | ||||
-rw-r--r-- | inc/cub3d.h | 29 | ||||
-rw-r--r-- | inc/cub3d_structs.h | 16 | ||||
-rw-r--r-- | libft/Makefile | 12 | ||||
-rw-r--r-- | map/map_one.cub | 18 | ||||
-rw-r--r-- | minilibx_linux/Makefile.gen | 4 | ||||
-rw-r--r-- | minilibx_linux/Makefile.mk | 2 | ||||
-rw-r--r-- | minilibx_linux/test/Makefile.gen | 2 | ||||
-rw-r--r-- | src/ft_castray_loop.c | 87 | ||||
-rw-r--r-- | src/ft_draw_ammo_back.c | 18 | ||||
-rw-r--r-- | src/ft_draw_ammo_bar.c | 20 | ||||
-rw-r--r-- | src/ft_draw_hud.c | 24 | ||||
-rw-r--r-- | src/ft_draw_textures.c | 20 | ||||
-rw-r--r-- | src/ft_floor_cast.c | 84 | ||||
-rw-r--r-- | src/ft_floor_cast_inits.c | 38 | ||||
-rw-r--r-- | src/ft_floor_threads.c | 111 | ||||
-rw-r--r-- | src/ft_get_fps_count.c | 6 | ||||
-rw-r--r-- | src/ft_hud_threads.c | 70 | ||||
-rw-r--r-- | src/ft_hud_threads_next.c | 38 | ||||
-rw-r--r-- | src/ft_raycasting.c | 137 | ||||
-rw-r--r-- | src/ft_rgb_to_hex.c | 7 | ||||
-rw-r--r-- | src/ft_wall_cast.c (renamed from src/ft_draw_verline.c) | 32 | ||||
-rw-r--r-- | src/ft_wall_threads.c | 83 |
23 files changed, 670 insertions, 207 deletions
@@ -60,7 +60,7 @@ SRCS_NAME += ft_draw_scene.c SRCS_NAME += ft_draw_skybox.c SRCS_NAME += ft_basic_keys.c SRCS_NAME += ft_extra_keys.c -SRCS_NAME += ft_draw_verline.c +SRCS_NAME += ft_wall_cast.c SRCS_NAME += ft_rgb_to_hex.c SRCS_NAME += ft_hex_to_rgb.c SRCS_NAME += ft_raycasting.c @@ -129,6 +129,11 @@ SRCS_NAME += ft_draw_map_back.c SRCS_NAME += ft_draw_ammo_back.c 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_NAME += ft_sort_s_t.c #--------------------------------------------------------------------------------------------------# SRCS = $(addprefix ${SRCS_DIR},${SRCS_NAME}) @@ -152,18 +157,10 @@ endif #==================================================================================================# #------------------------------------------ Compiler ----------------------------------------------# #==================================================================================================# -ifeq (${OS}, Darwin) - DBG = -glldb -else - DBG = -ggdb -endif +DBG = -glldb FSANITIZE = -fsanitize=address #--------------------------------------------------------------------------------------------------# -ifeq (${OS}, Darwin) - CC = clang -else - CC = gcc -endif +CC = clang #--------------------------------------------------------------------------------------------------# CFLAGS = -std=c89 CFLAGS += -Wall diff --git a/inc/cub3d.h b/inc/cub3d.h index 2042297..38d4e3f 100644 --- a/inc/cub3d.h +++ b/inc/cub3d.h @@ -85,8 +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); -int8_t ft_draw_verline(t_cub *cl, int32_t x, - int32_t y1, int32_t y2); +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_sort_s_t(t_cub *cl, float dist_tab[8][4096]); @@ -102,6 +101,21 @@ void ft_draw_skybox(t_cub *cl); void ft_draw_handweap(t_cub *cl); void ft_macos_suffer_animation(t_cub *cl); void ft_linux_suffer_animation(t_cub *cl); +void *ft_ammo_back_thread(void *vargp); +void *ft_minimap_back_thread(void *vargp); +void *ft_map_thread(void *vargp); +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 ====== @@ -161,12 +175,19 @@ uint8_t ft_use_args(int argc, const char *argv[], t_cub *clist); */ void ft_castray(t_cub *cl); -void ft_choose_tex(t_cub *clist); +void ft_choose_tex(uint16_t x, t_cub *clist); void ft_detect(t_cub *cl); void ft_detection_init_x(t_cub *cl); void ft_detection_init_y(t_cub *cl); -void ft_floor_cast(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 bab7241..1b46312 100644 --- a/inc/cub3d_structs.h +++ b/inc/cub3d_structs.h @@ -85,6 +85,8 @@ typedef struct s_img int img_h; int tex_x; int tex_y; + int tex_x_alt; + int tex_y_alt; } t_img; typedef struct s_rgb @@ -142,7 +144,6 @@ typedef struct s_ray { uint16_t line_h; float wall_dist; - float *wall_dist_tab; float x_ray_pos; float y_ray_pos; float x_ray_dir; @@ -153,7 +154,6 @@ typedef struct s_ray float y_delta_dist; int16_t wall_t; int16_t wall_b; - int16_t *wall_bz; uint8_t side; size_t sqx; size_t sqy; @@ -168,8 +168,15 @@ typedef struct s_ray float row_dist; float x_floor; float y_floor; - int32_t x_cell; - int32_t y_cell; + int32_t *tex_x_tab; + int32_t ***fc_tex_x_tab; + 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; } t_ray; typedef struct s_map @@ -234,6 +241,7 @@ typedef struct s_cub uint8_t doicast; uint16_t currlvl; uint16_t i; + uint16_t y; char errmsg[64]; int32_t key_input[5]; char fps_count[9]; diff --git a/libft/Makefile b/libft/Makefile index 3073304..8ad24a7 100644 --- a/libft/Makefile +++ b/libft/Makefile @@ -118,18 +118,10 @@ OS = $(shell uname) #==============================================================================# #-------------------------------- Compiler ------------------------------------# #==============================================================================# -ifeq (${OS}, Darwin) - DBG = -glldb -else - DBG = -ggdb -endif +DBG = -glldb FSANITIZE = -fsanitize=address #------------------------------------------------------------------------------# -ifeq (${OS}, Darwin) - CC = clang -else - CC = gcc -endif +CC = clang #------------------------------------------------------------------------------# CFLAGS = -std=c89 CFLAGS += -Wall diff --git a/map/map_one.cub b/map/map_one.cub index af41f86..a627cf2 100644 --- a/map/map_one.cub +++ b/map/map_one.cub @@ -1,14 +1,14 @@ -R 800 800 +R 1280 1024 NO ./media/img/tex/wood_wall_1.xpm SO ./media/img/tex/wood_wall_1.xpm EA ./media/img/tex/wood_wall_1.xpm WE ./media/img/tex/wood_wall_1.xpm -S ./media/img/sprites/pillar.xpm C ./media/img/tex/wood_ceil.xpm F ./media/img/tex/parquet.xpm +S ./media/img/sprites/pillar.xpm S3 ./media/img/sprites/pylon.xpm S4 ./media/img/sprites/hey.xpm @@ -16,13 +16,13 @@ T ./media/img/sprites/spikes.xpm SH 2 - 1111111 -111111111111000001 -100000000002340001 -10000E000002340001 -100000000002340001 -100100000000000001 -101100000111000001 + 11111111111111111111 +1111111111110000000000000000001 +1000000000000000000000000000001 +10000E0000000203040506070809001 +1000000000000000000000000000001 +1001000000000000000000000000001 +1011000001110000011111111111111 111111111111110011 1000001 100001 1001001 100001 diff --git a/minilibx_linux/Makefile.gen b/minilibx_linux/Makefile.gen index 798f98c..5e2b3c1 100644 --- a/minilibx_linux/Makefile.gen +++ b/minilibx_linux/Makefile.gen @@ -1,5 +1,5 @@ INC=/usr/include -HT=Linux +HT=x86_64 DOCP=do_cp ## ## Makefile for MiniLibX in /home/boulon/work/c/raytraceur/minilibx @@ -15,7 +15,7 @@ DOCP=do_cp -CC = gcc +CC = clang NAME = libmlx.a diff --git a/minilibx_linux/Makefile.mk b/minilibx_linux/Makefile.mk index 4f919ac..189d072 100644 --- a/minilibx_linux/Makefile.mk +++ b/minilibx_linux/Makefile.mk @@ -15,7 +15,7 @@ INC = %%%% HT = %%%% DOCP = %%%% -CC = gcc +CC = clang NAME = libmlx.a diff --git a/minilibx_linux/test/Makefile.gen b/minilibx_linux/test/Makefile.gen index 7c67f50..c13f70c 100644 --- a/minilibx_linux/test/Makefile.gen +++ b/minilibx_linux/test/Makefile.gen @@ -1,5 +1,5 @@ INC=/usr/include -HT=Linux +HT=x86_64 DOCP=do_cp 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_draw_ammo_back.c b/src/ft_draw_ammo_back.c index b9bb408..767127d 100644 --- a/src/ft_draw_ammo_back.c +++ b/src/ft_draw_ammo_back.c @@ -19,20 +19,20 @@ static void const uint16_t scl = cl->mlist.scale; cl->img.ptr[x * 4 + - (cl->img.sizeline * (y + cl->wlist.y_size - + (cl->img.sizeline * (y + cl->wlist.y_size - (2 * ((cl->mlist.map_h * scl)) + 20)))] = - (uint8_t)cl->tlist[16].ptr[cl->tlist[16].tex_x * 4 + 4 * - cl->tlist[16].img_w * cl->tlist[16].tex_y]; + (uint8_t)cl->tlist[16].ptr[cl->tlist[16].tex_x_alt * 4 + 4 * + cl->tlist[16].img_w * cl->tlist[16].tex_y_alt]; cl->img.ptr[x * 4 + (cl->img.sizeline * (y + cl->wlist.y_size - (2 * ((cl->mlist.map_h * scl)) + 20))) + 1] = - (uint8_t)cl->tlist[16].ptr[cl->tlist[16].tex_x * 4 + 4 * - cl->tlist[16].img_w * cl->tlist[16].tex_y + 1]; + (uint8_t)cl->tlist[16].ptr[cl->tlist[16].tex_x_alt * 4 + 4 * + cl->tlist[16].img_w * cl->tlist[16].tex_y_alt + 1]; cl->img.ptr[x * 4 + (cl->img.sizeline * (y + cl->wlist.y_size - (2 * ((cl->mlist.map_h * scl)) + 20))) + 2] = - (uint8_t)cl->tlist[16].ptr[cl->tlist[16].tex_x * 4 + 4 * - cl->tlist[16].img_w * cl->tlist[16].tex_y + 2]; + (uint8_t)cl->tlist[16].ptr[cl->tlist[16].tex_x_alt * 4 + 4 * + cl->tlist[16].img_w * cl->tlist[16].tex_y_alt + 2]; } static void @@ -48,11 +48,11 @@ static void y = 0; while (y < cl->amm_back_h) { - cl->tlist[16].tex_y = ((y * y_ratio) >> 16); + cl->tlist[16].tex_y_alt = ((y * y_ratio) >> 16); x = 0; while (x < cl->amm_back_w) { - cl->tlist[16].tex_x = ((x * x_ratio) >> 16); + cl->tlist[16].tex_x_alt = ((x * x_ratio) >> 16); ft_draw_back(y, x, cl); x++; } diff --git a/src/ft_draw_ammo_bar.c b/src/ft_draw_ammo_bar.c index bf8dbda..febeb55 100644 --- a/src/ft_draw_ammo_bar.c +++ b/src/ft_draw_ammo_bar.c @@ -22,18 +22,18 @@ static void cl->img.ptr[(x + 10) * 4 + (cl->img.sizeline * (int)(y + ((cl->wlist.y_size - 10) - (2 * ((cl->mlist.map_h * scl) / 1.3)) - 40)))] = - (uint8_t)cl->tnum[id].ptr[cl->tnum[id].tex_x * 4 + 4 * - cl->tnum[id].img_w * cl->tnum[id].tex_y]; + (uint8_t)cl->tnum[id].ptr[cl->tnum[id].tex_x_alt * 4 + 4 * + cl->tnum[id].img_w * cl->tnum[id].tex_y_alt]; cl->img.ptr[(x + 10) * 4 + (cl->img.sizeline * (int)(y + ((cl->wlist.y_size - 10) - (2 * ((cl->mlist.map_h * scl) / 1.3)) - 40))) + 1] = - (uint8_t)cl->tnum[id].ptr[cl->tnum[id].tex_x * 4 + 4 * - cl->tnum[id].img_w * cl->tnum[id].tex_y + 1]; + (uint8_t)cl->tnum[id].ptr[cl->tnum[id].tex_x_alt * 4 + 4 * + cl->tnum[id].img_w * cl->tnum[id].tex_y_alt + 1]; cl->img.ptr[(x + 10) * 4 + (cl->img.sizeline * (int)(y + ((cl->wlist.y_size - 10) - (2 * ((cl->mlist.map_h * scl) / 1.3)) - 40))) + 2] = - (uint8_t)cl->tnum[id].ptr[cl->tnum[id].tex_x * 4 + 4 * - cl->tnum[id].img_w * cl->tnum[id].tex_y + 2]; + (uint8_t)cl->tnum[id].ptr[cl->tnum[id].tex_x_alt * 4 + 4 * + cl->tnum[id].img_w * cl->tnum[id].tex_y_alt + 2]; } static void @@ -49,13 +49,13 @@ static void y = 0; while (y < cl->ammo_num_h) { - cl->tnum[n - 48].tex_y = ((y * y_ratio) >> 16); + cl->tnum[n - 48].tex_y_alt = ((y * y_ratio) >> 16); x = 0; while (x < cl->ammo_num_w) { - cl->tnum[n - 48].tex_x = ((x * x_ratio) >> 16); - if (cl->tnum[n - 48].ptr[cl->tnum[n - 48].tex_x * 4 + 4 * - cl->tnum[n - 48].img_h * cl->tnum[n - 48].tex_y]) + cl->tnum[n - 48].tex_x_alt = ((x * x_ratio) >> 16); + if (cl->tnum[n - 48].ptr[cl->tnum[n - 48].tex_x_alt * 4 + 4 * + cl->tnum[n - 48].img_h * cl->tnum[n - 48].tex_y_alt]) ft_draw_tnum(n - 48, y, x + x_offset, cl); x++; } diff --git a/src/ft_draw_hud.c b/src/ft_draw_hud.c index a10b2f3..ca553f0 100644 --- a/src/ft_draw_hud.c +++ b/src/ft_draw_hud.c @@ -12,6 +12,7 @@ #include <cub3d.h> #include <stdint.h> +#include <pthread.h> static void ft_draw_stage_back(t_cub *clist) @@ -44,13 +45,22 @@ static void int8_t ft_draw_hud(t_cub *clist) { - ft_draw_ammo_back(clist); - ft_draw_minimap_back(clist); - ft_draw_map(clist->mlist.map, clist); - ft_draw_life_bar(clist); - ft_draw_ammo_bar(clist); - ft_draw_health_caption(clist); - ft_draw_ammo_caption(clist); + pthread_t tid[7]; + + pthread_create(&tid[0], 0x0, ft_ammo_back_thread, (void*)clist); + pthread_create(&tid[1], 0x0, ft_minimap_back_thread, (void*)clist); + pthread_join(tid[0], 0x0); + pthread_join(tid[1], 0x0); + pthread_create(&tid[2], 0x0, ft_map_thread, (void*)clist); + pthread_create(&tid[3], 0x0, ft_life_bar_thread, (void*)clist); + pthread_create(&tid[4], 0x0, ft_ammo_bar_thread, (void*)clist); + pthread_create(&tid[5], 0x0, ft_health_cap_thread, (void*)clist); + pthread_create(&tid[6], 0x0, ft_ammo_cap_thread, (void*)clist); + pthread_join(tid[2], 0x0); + pthread_join(tid[3], 0x0); + pthread_join(tid[4], 0x0); + pthread_join(tid[5], 0x0); + pthread_join(tid[6], 0x0); if (clist->mlist.isnlvl) { ft_draw_stage_back(clist); diff --git a/src/ft_draw_textures.c b/src/ft_draw_textures.c index 0724a6d..5bf0854 100644 --- a/src/ft_draw_textures.c +++ b/src/ft_draw_textures.c @@ -28,20 +28,23 @@ void float dist; t_rgb rgb; - if ((dist = cl->rlist.wall_dist) <= 0) + if ((dist = cl->rlist.wall_dist_tab[x]) <= 0) dist = 0.0001; - rgb.b = (uint8_t)cl->tlist[cl->w_side].ptr[cl->tlist[cl->w_side].tex_x - * 4 + 4 * cl->tlist[cl->w_side].img_h * tex_y]; - rgb.g = (uint8_t)cl->tlist[cl->w_side].ptr[cl->tlist[cl->w_side].tex_x - * 4 + 4 * cl->tlist[cl->w_side].img_h * tex_y + 1]; - rgb.r = (uint8_t)cl->tlist[cl->w_side].ptr[cl->tlist[cl->w_side].tex_x - * 4 + 4 * cl->tlist[cl->w_side].img_h * tex_y + 2]; + rgb.r = + (uint8_t)cl->tlist[cl->rlist.w_side_tab[x]].ptr[cl->rlist.tex_x_tab[x] + * 4 + 4 * cl->tlist[cl->rlist.w_side_tab[x]].img_h * tex_y + 2]; + rgb.g = + (uint8_t)cl->tlist[cl->rlist.w_side_tab[x]].ptr[cl->rlist.tex_x_tab[x] + * 4 + 4 * cl->tlist[cl->rlist.w_side_tab[x]].img_h * tex_y + 1]; + rgb.b = + (uint8_t)cl->tlist[cl->rlist.w_side_tab[x]].ptr[cl->rlist.tex_x_tab[x] + * 4 + 4 * cl->tlist[cl->rlist.w_side_tab[x]].img_h * tex_y]; *(int*)(cl->img.ptr + ((uint16_t)x * 4 + (y * cl->img.sizeline))) = ft_rgb_to_hex(dist, rgb, cl); } void - ft_choose_tex(t_cub *clist) + ft_choose_tex(uint16_t x, t_cub *clist) { if (clist->rlist.sqy == clist->mlist.nlx && clist->rlist.sqx == clist->mlist.nly) @@ -59,4 +62,5 @@ void else clist->w_side = 2; } + clist->rlist.w_side_tab[x] = clist->w_side; } diff --git a/src/ft_floor_cast.c b/src/ft_floor_cast.c index e9315ed..3962431 100644 --- a/src/ft_floor_cast.c +++ b/src/ft_floor_cast.c @@ -12,13 +12,15 @@ #include <cub3d.h> #include <stdint.h> +#include <pthread.h> static void ft_draw_plain_horizontal(t_rgb rgb, t_cub *cl, int32_t y, int32_t x) { float dist; - dist = (cl->rlist.row_dist > 0) ? (cl->rlist.row_dist) : (0.0001); + if ((dist = cl->rlist.row_dist_tab[y]) <= 0) + dist = 0.0001; *(int*)(cl->img.ptr + (x * 4 + (y * cl->img.sizeline))) = ft_rgb_to_hex(dist, rgb, cl); } @@ -29,76 +31,50 @@ static void float dist; t_rgb rgb; - dist = (cl->rlist.row_dist > 0) ? (cl->rlist.row_dist) : (0.0001); - rgb.b = (uint8_t)cl->tlist[tid].ptr[cl->tlist[tid].tex_x - * 4 + 4 * cl->tlist[tid].img_h * cl->tlist[tid].tex_y]; - rgb.g = (uint8_t)cl->tlist[tid].ptr[cl->tlist[tid].tex_x - * 4 + 4 * cl->tlist[tid].img_h * cl->tlist[tid].tex_y + 1]; - rgb.r = (uint8_t)cl->tlist[tid].ptr[cl->tlist[tid].tex_x - * 4 + 4 * cl->tlist[tid].img_h * cl->tlist[tid].tex_y + 2]; + if ((dist = cl->rlist.row_dist_tab[y]) <= 0) + dist = 0.0001; + rgb.b = (uint8_t)cl->tlist[tid].ptr[cl->rlist.fc_tex_x_tab[tid - 6][y][x] + * 4 + 4 * cl->tlist[tid].img_h * cl->rlist.fc_tex_y_tab[tid - 6][y][x]]; + rgb.g = (uint8_t)cl->tlist[tid].ptr[cl->rlist.fc_tex_x_tab[tid - 6][y][x] + * 4 + 4 * cl->tlist[tid].img_h * cl->rlist.fc_tex_y_tab[tid - 6][y][x] + 1]; + rgb.r = (uint8_t)cl->tlist[tid].ptr[cl->rlist.fc_tex_x_tab[tid - 6][y][x] + * 4 + 4 * cl->tlist[tid].img_h * cl->rlist.fc_tex_y_tab[tid - 6][y][x] + 2]; *(int*)(cl->img.ptr + ((uint16_t)x * 4 + (y * cl->img.sizeline))) = ft_rgb_to_hex(dist, rgb, cl); } -static void - ft_set_tex_xy(uint8_t tid, t_ray *rl, t_cub *cl) -{ - cl->tlist[tid].tex_y = (int32_t)(cl->tlist[tid].img_w - * (rl->x_floor - rl->x_cell)); - cl->tlist[tid].tex_x = (int32_t)(cl->tlist[tid].img_h - * (rl->y_floor - rl->y_cell)); - cl->tlist[tid].tex_x = (cl->tlist[tid].tex_x > 0) - ? (cl->tlist[tid].tex_x) : (-cl->tlist[tid].tex_x); - cl->tlist[tid].tex_y = (cl->tlist[tid].tex_y > 0) - ? (cl->tlist[tid].tex_y) : (-cl->tlist[tid].tex_y); -} - -static void - ft_floor_cast_loop(uint16_t y, uint16_t x, t_ray *rl, t_cub *cl) +void + ft_floor_cast_loop(uint16_t y, uint16_t x, t_cub *cl) { - rl->x_cell = (int32_t)(rl->x_floor); - rl->y_cell = (int32_t)(rl->y_floor); if (cl->mlist.isftex) { - ft_set_tex_xy(6, rl, cl); - } - if (cl->mlist.isctex) - { - ft_set_tex_xy(7, rl, cl); - } - if (cl->mlist.isftex) ft_draw_extra_tex(6, y, x, cl); + } else ft_draw_plain_horizontal(cl->f_rgb, cl, y, x); if (cl->mlist.isctex && !cl->mlist.isskybox) + { ft_draw_extra_tex(7, cl->wlist.y_size - y - 1, x, cl); + } else if (!cl->mlist.isctex && !cl->mlist.isskybox) ft_draw_plain_horizontal(cl->c_rgb, cl, cl->wlist.y_size - y - 1, x); } void - ft_floor_cast(t_cub *cl) + *ft_floor_cast(void *vargp) { - t_ray *rl; - uint16_t x; - uint16_t y; + pthread_t tid[4]; + t_cub *cl; - rl = &cl->rlist; - y = (cl->wlist.y_size / 2); - while (y < cl->wlist.y_size) - { - ft_floor_cast_inits(y, rl, cl); - x = 0; - while (x < cl->wlist.x_size) - { - if (cl->rlist.wall_bz[x] <= y) - { - ft_floor_cast_loop(y, x, rl, cl); - } - rl->x_floor += cl->mlist.x_floor_step; - rl->y_floor += cl->mlist.y_floor_step; - x++; - } - y++; - } + cl = (t_cub *)vargp; + pthread_create(&tid[0], 0x0, ft_floor_one, (void*)cl); + pthread_create(&tid[1], 0x0, ft_floor_two, (void*)cl); + pthread_create(&tid[2], 0x0, ft_floor_three, (void*)cl); + pthread_create(&tid[3], 0x0, ft_floor_four, (void*)cl); + pthread_join(tid[0], 0x0); + pthread_join(tid[1], 0x0); + pthread_join(tid[2], 0x0); + pthread_join(tid[3], 0x0); + pthread_exit(0x0); + return (0x0); } 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_get_fps_count.c b/src/ft_get_fps_count.c index 63bf08e..f7f0177 100644 --- a/src/ft_get_fps_count.c +++ b/src/ft_get_fps_count.c @@ -22,7 +22,6 @@ static float return ((ticks / (float)CLOCKS_PER_SEC) * 1000.0); } - static void ft_handle_firing(clock_t dt, t_cub *cl) { @@ -40,13 +39,16 @@ void ft_get_fps_count(clock_t dt, t_cub *cl) { static clock_t curr_time = 0; + static uint16_t ticks = 0; curr_time += dt; + ticks += 1; if (cl->plist.fire == 1) ft_handle_firing(dt, cl); if (dt > 0 && ft_clock_to_ms(curr_time) > 1000.0) { - ft_sprintf(cl->fps_count, "fps: %ld", (uint32_t)CLOCKS_PER_SEC / dt); + ft_sprintf(cl->fps_count, "fps: %hu", ticks); + ticks = 0; curr_time -= CLOCKS_PER_SEC; } } diff --git a/src/ft_hud_threads.c b/src/ft_hud_threads.c new file mode 100644 index 0000000..c120dc9 --- /dev/null +++ b/src/ft_hud_threads.c @@ -0,0 +1,70 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_hud_threads.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: rbousset <marvin@42.fr> +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2020/02/22 20:02:47 by rbousset #+# #+# */ +/* Updated: 2020/02/22 20:02:48 by rbousset ### ########lyon.fr */ +/* */ +/* ************************************************************************** */ + +#include <cub3d.h> +#include <stdint.h> +#include <pthread.h> + +void + *ft_ammo_back_thread(void *vargp) +{ + t_cub *clist; + + clist = (t_cub *)vargp; + ft_draw_ammo_back(clist); + pthread_exit(0x0); + return (0x0); +} + +void + *ft_minimap_back_thread(void *vargp) +{ + t_cub *clist; + + clist = (t_cub *)vargp; + ft_draw_minimap_back(clist); + pthread_exit(0x0); + return (0x0); +} + +void + *ft_map_thread(void *vargp) +{ + t_cub *clist; + + clist = (t_cub *)vargp; + ft_draw_map(clist->mlist.map, clist); + pthread_exit(0x0); + return (0x0); +} + +void + *ft_life_bar_thread(void *vargp) +{ + t_cub *clist; + + clist = (t_cub *)vargp; + ft_draw_life_bar(clist); + pthread_exit(0x0); + return (0x0); +} + +void + *ft_ammo_bar_thread(void *vargp) +{ + t_cub *clist; + + clist = (t_cub *)vargp; + ft_draw_ammo_bar(clist); + pthread_exit(0x0); + return (0x0); +} diff --git a/src/ft_hud_threads_next.c b/src/ft_hud_threads_next.c new file mode 100644 index 0000000..e390050 --- /dev/null +++ b/src/ft_hud_threads_next.c @@ -0,0 +1,38 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_hud_threads.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: rbousset <marvin@42.fr> +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2020/02/22 20:02:47 by rbousset #+# #+# */ +/* Updated: 2020/02/22 20:02:48 by rbousset ### ########lyon.fr */ +/* */ +/* ************************************************************************** */ + +#include <cub3d.h> +#include <stdint.h> +#include <pthread.h> + +void + *ft_health_cap_thread(void *vargp) +{ + t_cub *clist; + + clist = (t_cub *)vargp; + ft_draw_health_caption(clist); + pthread_exit(0x0); + return (0x0); +} + +void + *ft_ammo_cap_thread(void *vargp) +{ + t_cub *clist; + + clist = (t_cub *)vargp; + ft_draw_ammo_caption(clist); + pthread_exit(0x0); + return (0x0); +} + diff --git a/src/ft_raycasting.c b/src/ft_raycasting.c index 1a12c46..8a79154 100644 --- a/src/ft_raycasting.c +++ b/src/ft_raycasting.c @@ -15,99 +15,102 @@ #include <stdint.h> #include <stdlib.h> #include <math.h> +#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_del_tabs(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(cl); - ft_calc_tex(cl); - cl->rlist.wall_bz[i] = cl->rlist.wall_b; - cl->rlist.wall_dist_tab[i] = cl->rlist.wall_dist; + uint16_t y; + uint16_t x; + + x = -1; + while (++x < 2) + { + 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]); + } + ft_memdel((void*)&cl->rlist.fc_tex_x_tab[x]); + ft_memdel((void*)&cl->rlist.fc_tex_y_tab[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_dist_tab); } void ft_castray(t_cub *cl) { - uint16_t i; + pthread_t tid[2]; - if (!(cl->rlist.wall_dist_tab = - (float*)malloc(sizeof(float) * cl->wlist.x_size))) - return ; - if (!(cl->rlist.wall_bz = - (int16_t*)malloc(cl->wlist.x_size * sizeof(int16_t)))) - return ; - i = 0; - while (i < cl->wlist.x_size) - { - ft_castray_loop(i, &cl->wlist, cl); - ft_draw_verline(cl, i, cl->rlist.wall_t, cl->rlist.wall_b); - i++; - } - ft_floor_cast(cl); + 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_memdel((void*)&cl->rlist.wall_bz); + ft_del_tabs(cl); } diff --git a/src/ft_rgb_to_hex.c b/src/ft_rgb_to_hex.c index 2b72287..2ef1862 100644 --- a/src/ft_rgb_to_hex.c +++ b/src/ft_rgb_to_hex.c @@ -29,7 +29,10 @@ uint32_t rgb.g = (rgb.g < 0) ? (0) : (rgb.g); rgb.b = (rgb.b < 0) ? (0) : (rgb.b); res = 0; - res += (((uint8_t)(rgb.r / calc) << 16) + ((uint8_t)(rgb.g / calc) << 8) - + (uint8_t)(rgb.b / calc)); + if (calc <= 1) + res += ((rgb.r << 16) + (rgb.g << 8) + rgb.b); + else + res += (((uint8_t)(rgb.r / calc) << 16) + ((uint8_t)(rgb.g / calc) << 8) + + (uint8_t)(rgb.b / calc)); return (res); } diff --git a/src/ft_draw_verline.c b/src/ft_wall_cast.c index 7bfba8d..7610df6 100644 --- a/src/ft_draw_verline.c +++ b/src/ft_wall_cast.c @@ -1,7 +1,7 @@ /* ************************************************************************** */ /* */ /* ::: :::::::: */ -/* ft_draw_verline.c :+: :+: :+: */ +/* ft_wall_cast.c :+: :+: :+: */ /* +:+ +:+ +:+ */ /* By: rbousset <marvin@42.fr> +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ @@ -12,8 +12,9 @@ #include <cub3d.h> #include <stdint.h> +#include <pthread.h> -int8_t +void ft_draw_verline(t_cub *cl, int32_t x, int32_t y, int32_t y2) { int32_t d; @@ -21,15 +22,34 @@ int8_t (y < 0) ? (y = 0) : 0; (y2 < 0) ? (y2 = 0) : 0; - (cl->rlist.line_h <= 0) ? (cl->rlist.line_h = 1) : 0; + (cl->rlist.line_h_tab[x] <= 0) ? (cl->rlist.line_h_tab[x] = 1) : 0; while (y < y2) { - d = y * 256 - cl->wlist.y_size * 128 + cl->rlist.line_h * 128; + d = y * 256 - cl->wlist.y_size * 128 + cl->rlist.line_h_tab[x] * 128; d = (d <= 0) ? (-d) : (d); - tex_y = ((d * cl->tlist[cl->w_side].img_h) / cl->rlist.line_h) / 256; + tex_y = ((d * cl->tlist[cl->rlist.w_side_tab[x]].img_h) + / cl->rlist.line_h_tab[x]) / 256; (tex_y <= 0) ? (tex_y = 1) : 0; ft_draw_texture(cl, x, y, tex_y); y++; } - return (0); +} + +void + *ft_wall_cast(void *vargp) +{ + pthread_t tid[8]; + t_cub *cl; + + cl = (t_cub *)vargp; + pthread_create(&tid[0], 0x0, ft_wall_one, (void*)cl); + pthread_create(&tid[1], 0x0, ft_wall_two, (void*)cl); + pthread_create(&tid[2], 0x0, ft_wall_three, (void*)cl); + pthread_create(&tid[3], 0x0, ft_wall_four, (void*)cl); + pthread_join(tid[0], 0x0); + pthread_join(tid[1], 0x0); + pthread_join(tid[2], 0x0); + pthread_join(tid[3], 0x0); + pthread_exit(0x0); + return (0x0); } 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); +} |