/* ************************************************************************** */ /* */ /* ::: :::::::: */ /* 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; if (!(dist_tab = ft_alloc_dist_tab())) ft_alloc_error(cl); while (++jt < FT_TOTAL_SPRT) { if (cl->mlist.sprite_nbr[jt] == 0) dist_tab[jt][0] = 0; else { 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; } } /* jt = -1; */ /* while (++jt < FT_TOTAL_SPRT) */ /* { */ /* it = -1; */ /* while (++it < cl->mlist.sprite_nbr[jt] - 1) */ /* ft_sort_sprites_norme(dist_tab[jt], &it, jt, cl); */ /* } */ ft_sort_s_t(cl, dist_tab); } 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_w * 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_w * 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_w * 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_w * sprite->tex_y] && cl->rlist.wall_dist_tab[sprite->x] > sprite->transformy) ft_put_sprite(sprite, cl); sprite->y++; } sprite->x++; } }