/* ************************************************************************** */ /* */ /* ::: :::::::: */ /* ft_raycasting.c :+: :+: :+: */ /* +:+ +:+ +:+ */ /* By: joelecle +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2020/02/14 17:22:57 by joelecle #+# #+# */ /* Updated: 2020/02/14 17:23:42 by joelecle ### ########lyon.fr */ /* */ /* ************************************************************************** */ #include #include #include #include #include #include static void ft_allocate_tabs(uint16_t y_s, uint16_t x_s, t_ray *rl, t_cub *cl) { 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*)ft_calloc(y_s, sizeof(float)))) ft_alloc_error(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_alloc_error(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_alloc_error(cl); } } static void ft_precalc_loops(t_cub *cl) { uint16_t i; i = 0; while (i < cl->wlist.x_size) { ft_castray_loop(i, &cl->wlist, cl); i++; } i = (cl->wlist.y_size / 2); while (i < cl->wlist.y_size) { ft_floor_loop(i, cl); i++; } } static void ft_del_tabs(t_cub *cl) { 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) { 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_select_bad_boy_action(cl); ft_calc_sprite(cl); if (cl->plist.handles_weapon > -1) ft_draw_handweap(cl); ft_del_tabs(cl); }