mirror of
https://codeberg.org/ACME-Corporation/cub3d.git
synced 2025-12-06 09:58:09 +01:00
88 lines
3.2 KiB
C
88 lines
3.2 KiB
C
/* ************************************************************************** */
|
|
/* */
|
|
/* ::: :::::::: */
|
|
/* sprite_caster.c :+: :+: :+: */
|
|
/* +:+ +:+ +:+ */
|
|
/* By: tchampio <tchampio@student.42lehavre.fr> +#+ +:+ +#+ */
|
|
/* +#+#+#+#+#+ +#+ */
|
|
/* Created: 2025/08/05 15:51:01 by tchampio #+# #+# */
|
|
/* Updated: 2025/08/07 12:07:36 by tchampio ### ########.fr */
|
|
/* */
|
|
/* ************************************************************************** */
|
|
|
|
#include "../cub3d_data.h"
|
|
#include "../draw/drawutils.h"
|
|
#include "../renderer/render.h"
|
|
#include "sort_sprites.h"
|
|
#include <math.h>
|
|
#include <stdio.h>
|
|
#include <stdlib.h>
|
|
|
|
void sprite_caster(t_cub3d_data *data)
|
|
{
|
|
int i;
|
|
double spriteX;
|
|
double spriteY;
|
|
double invDet;
|
|
double transformX;
|
|
double transformY;
|
|
int spriteScreenX;
|
|
int spriteHeight;
|
|
int spriteDrawStartY;
|
|
int spriteDrawEndY;
|
|
int spriteWidth;
|
|
int spriteDrawStartX;
|
|
int spriteDrawEndX;
|
|
int stripe;
|
|
int texX;
|
|
int d;
|
|
int texY;
|
|
int color;
|
|
int j;
|
|
|
|
sort_sprites(data->sprite_order, data->sprite_distances, data);
|
|
i = 0;
|
|
while (data->sprite_list[i] && i < MAX_SPRITES)
|
|
{
|
|
spriteX = data->sprite_list[data->sprite_order[i]]->x - data->player.x;
|
|
spriteY = data->sprite_list[data->sprite_order[i]]->y - data->player.y;
|
|
invDet = 1.0 / (data->player.plane_x * data->player.dir_y - data->player.dir_x * data->player.plane_y);
|
|
transformX = invDet * (data->player.dir_y * spriteX - data->player.dir_x * spriteY);
|
|
transformY = invDet * (-data->player.plane_y * spriteX + data->player.plane_x * spriteY);
|
|
spriteScreenX = (int)((WIDTH / 2) * (1 + transformX / transformY));
|
|
spriteHeight = (int)fabs((HEIGHT / transformY));
|
|
spriteDrawStartY = -spriteHeight / 2 + HEIGHT / 2;
|
|
if (spriteDrawStartY < 0)
|
|
spriteDrawStartY = 0;
|
|
spriteDrawEndY = spriteHeight / 2 + HEIGHT / 2;
|
|
if (spriteDrawEndY >= HEIGHT)
|
|
spriteDrawEndY = HEIGHT - 1;
|
|
spriteWidth = (int)fabs((HEIGHT / transformY));
|
|
spriteDrawStartX = -spriteWidth / 2 + spriteScreenX;
|
|
if (spriteDrawStartX < 0)
|
|
spriteDrawStartX = 0;
|
|
spriteDrawEndX = spriteWidth / 2 + spriteScreenX;
|
|
if (spriteDrawEndX >= WIDTH)
|
|
spriteDrawEndX = WIDTH - 1;
|
|
stripe = spriteDrawStartX;
|
|
while (stripe < spriteDrawEndX)
|
|
{
|
|
texX = (int)(256 * (stripe - (-spriteWidth / 2 + spriteScreenX)) * SIZE / spriteWidth) / 256;
|
|
if (transformY > 0 && stripe > 0 && stripe < WIDTH && transformY < data->zbuffer[stripe])
|
|
{
|
|
j = spriteDrawStartY;
|
|
while (j < spriteDrawEndY)
|
|
{
|
|
d = (j) * 256 - HEIGHT * 128 + spriteHeight * 128;
|
|
texY = ((d * SIZE) / spriteHeight) / 256;
|
|
color = my_mlx_pixel_get(data->sprite_list[data->sprite_order[i]]->image, texX, texY);
|
|
if (color != SPRITE_TRANPARENCY_COLOR)
|
|
matrix_set(data, stripe, j, color);
|
|
j++;
|
|
}
|
|
}
|
|
stripe++;
|
|
}
|
|
i++;
|
|
}
|
|
}
|