/* ************************************************************************** */ /* */ /* ::: :::::::: */ /* ft_draw_sprite.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 #include #include #include static void ft_sort_sprites_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.sprite_order[j][it]; cl->mlist.sprite_order[j][it] = cl->mlist.sprite_order[j][it + 1]; cl->mlist.sprite_order[j][it + 1] = tmp; *i = -1; } } void ft_sort_sprites(t_cub *cl, int16_t it, int16_t jt) { float dist_tab[8][4096]; while (++jt <= cl->mlist.sprite_var) { while (++it <= cl->mlist.sprite_nbr[jt]) { dist_tab[jt][it] = ((cl->plist.pos_x - cl->sprites[jt][it].s_pos_x) * (cl->plist.pos_x - cl->sprites[jt][it].s_pos_x) + (cl->plist.pos_y - cl->sprites[jt][it].s_pos_y) * (cl->plist.pos_y - cl->sprites[jt][it].s_pos_y)); cl->mlist.sprite_order[jt][it] = it; } it = -1; } it = -1; jt = -1; while (++jt < cl->mlist.sprite_var) { while (++it < cl->mlist.sprite_nbr[jt] - 1) ft_sort_sprites_norme(dist_tab[jt], &it, jt, cl); it = -1; } } static void ft_put_sprite(t_sprite *sprite, t_cub *cl) { float dist; t_rgb rgb; if ((dist = sqrtf(powf(cl->plist.pos_x - sprite->s_pos_x, 2) + powf(cl->plist.pos_y - sprite->s_pos_y, 2))) <= 0) dist = 0.0001; rgb.r = (uint8_t)cl->tlist[sprite->current_sprite].ptr[sprite->tex_x * 4 + 4 * cl->tlist[sprite->current_sprite].img_h * sprite->tex_y + 2]; rgb.g = (uint8_t)cl->tlist[sprite->current_sprite].ptr[sprite->tex_x * 4 + 4 * cl->tlist[sprite->current_sprite].img_h * sprite->tex_y + 1]; rgb.b = (uint8_t)cl->tlist[sprite->current_sprite].ptr[sprite->tex_x * 4 + 4 * cl->tlist[sprite->current_sprite].img_h * sprite->tex_y]; *(int*)(cl->img.ptr + ((uint16_t)sprite->x * 4 + (sprite->y * cl->img.sizeline))) = ft_rgb_to_hex(dist, rgb, cl); } void ft_draw_sprite(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_sprite(sprite, cl); sprite->y++; } sprite->x++; } }