diff options
Diffstat (limited to '')
-rw-r--r-- | src/ft_raycasting.c | 137 |
1 files changed, 70 insertions, 67 deletions
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); } |