aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--Makefile19
-rw-r--r--inc/cub3d.h29
-rw-r--r--inc/cub3d_structs.h16
-rw-r--r--libft/Makefile12
-rw-r--r--map/map_one.cub18
-rw-r--r--minilibx_linux/Makefile.gen4
-rw-r--r--minilibx_linux/Makefile.mk2
-rw-r--r--minilibx_linux/test/Makefile.gen2
-rw-r--r--src/ft_castray_loop.c87
-rw-r--r--src/ft_draw_ammo_back.c18
-rw-r--r--src/ft_draw_ammo_bar.c20
-rw-r--r--src/ft_draw_hud.c24
-rw-r--r--src/ft_draw_textures.c20
-rw-r--r--src/ft_floor_cast.c84
-rw-r--r--src/ft_floor_cast_inits.c38
-rw-r--r--src/ft_floor_threads.c111
-rw-r--r--src/ft_get_fps_count.c6
-rw-r--r--src/ft_hud_threads.c70
-rw-r--r--src/ft_hud_threads_next.c38
-rw-r--r--src/ft_raycasting.c137
-rw-r--r--src/ft_rgb_to_hex.c7
-rw-r--r--src/ft_wall_cast.c (renamed from src/ft_draw_verline.c)32
-rw-r--r--src/ft_wall_threads.c83
23 files changed, 670 insertions, 207 deletions
diff --git a/Makefile b/Makefile
index 4e51445..2692ab5 100644
--- a/Makefile
+++ b/Makefile
@@ -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);
+}