/* ************************************************************************** */ /* */ /* ::: :::::::: */ /* ft_draw_weapons.c :+: :+: :+: */ /* +:+ +:+ +:+ */ /* By: rbousset +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2020/02/24 20:22:45 by rbousset #+# #+# */ /* Updated: 2020/03/09 18:56:01 by rbousset ### ########lyon.fr */ /* */ /* ************************************************************************** */ #include #include static void ft_sort_weapons_norme(float *dist_tab, int16_t *i, uint16_t j, t_cub *cl) { uint32_t tmp; uint32_t it; it = *i; tmp = 0; if (dist_tab[it] < dist_tab[it + 1]) { tmp = dist_tab[it]; dist_tab[it] = dist_tab[it + 1]; dist_tab[it + 1] = tmp; tmp = cl->mlist.weaps_order[j][it]; cl->mlist.weaps_order[j][it] = cl->mlist.weaps_order[j][it + 1]; cl->mlist.weaps_order[j][it + 1] = tmp; *i = -1; } } void ft_sort_weapons(t_cub *cl, int16_t it, int16_t jt) { float dist_tab[2][1]; while (++jt <= cl->mlist.weapon_var) { while (++it <= cl->mlist.weaps_nbr[jt]) { dist_tab[jt][it] = ((cl->plist.pos_x - cl->weaps[jt][it].s_pos_x) * (cl->plist.pos_x - cl->weaps[jt][it].s_pos_x) + (cl->plist.pos_y - cl->weaps[jt][it].s_pos_y) * (cl->plist.pos_y - cl->weaps[jt][it].s_pos_y)); cl->mlist.weaps_order[jt][it] = it; } it = -1; } it = -1; jt = -1; while (++jt < cl->mlist.weapon_var) { while (++it < cl->mlist.weaps_nbr[jt] - 1) ft_sort_weapons_norme(dist_tab[jt], &it, jt, cl); it = -1; } } static void ft_put_weapon(t_sprite *sprite, t_cub *cl) { float dist; float calc; if ((dist = cl->rlist.wall_dist_tab[sprite->x]) <= 0) dist = 0.0001; calc = (dist * 0.1 * cl->mlist.darklvl); calc = (calc >= 255) ? (255) : (calc); calc = (calc < 1) ? (1) : (calc); cl->img.ptr[sprite->x * 4 + (sprite->y * cl->img.sizeline)] = (uint8_t)cl->tlist[sprite->current_sprite].ptr[sprite->tex_x * 4 + 4 * cl->tlist[sprite->current_sprite].img_h * sprite->tex_y] / calc; cl->img.ptr[sprite->x * 4 + (sprite->y * cl->img.sizeline) + 1] = (uint8_t)cl->tlist[sprite->current_sprite].ptr[sprite->tex_x * 4 + 4 * cl->tlist[sprite->current_sprite].img_h * sprite->tex_y + 1] / calc; cl->img.ptr[sprite->x * 4 + (sprite->y * cl->img.sizeline) + 2] = (uint8_t)cl->tlist[sprite->current_sprite].ptr[sprite->tex_x * 4 + 4 * cl->tlist[sprite->current_sprite].img_h * sprite->tex_y + 2] / calc; } void ft_draw_weapon(t_cub *cl, t_sprite *sprite) { int32_t d; sprite->x = sprite->drawstartx; while (sprite->x < sprite->drawendx) { sprite->tex_x = (int32_t)((sprite->x - (-sprite->spritewidth / 2 + sprite->spritescreenx)) * cl->tlist[sprite->current_sprite].img_w / sprite->spritewidth); sprite->y = sprite->drawstarty; while (sprite->y < sprite->drawendy) { d = sprite->y * 256 - cl->wlist.y_size * 128 + sprite->spriteheight * 128; sprite->tex_y = ((d * cl->tlist[sprite->current_sprite].img_h / 2) / sprite->spriteheight) / 128; if (sprite->transformy > 0 && cl->tlist[sprite->current_sprite].ptr[sprite->tex_x * 4 + 4 * cl->tlist[sprite->current_sprite].img_h * sprite->tex_y] && cl->rlist.wall_dist_tab[sprite->x] > sprite->transformy) ft_put_weapon(sprite, cl); sprite->y++; } sprite->x++; } }