mirror of
https://codeberg.org/ACME-Corporation/cub3d.git
synced 2025-12-06 01:48:08 +01:00
fix: moved almost all variables to the sprite structure
This commit is contained in:
parent
10576f5751
commit
c8da6964d0
2 changed files with 61 additions and 42 deletions
|
|
@ -6,7 +6,7 @@
|
|||
/* By: tchampio <tchampio@student.42lehavre.fr> +#+ +:+ +#+ */
|
||||
/* +#+#+#+#+#+ +#+ */
|
||||
/* Created: 2025/08/05 12:59:44 by tchampio #+# #+# */
|
||||
/* Updated: 2025/08/06 12:13:12 by tchampio ### ########.fr */
|
||||
/* Updated: 2025/08/06 14:41:17 by tchampio ### ########.fr */
|
||||
/* */
|
||||
/* ************************************************************************** */
|
||||
|
||||
|
|
@ -15,6 +15,25 @@
|
|||
|
||||
# include "../draw/img_data.h"
|
||||
|
||||
/*
|
||||
* x - real position for the sprite
|
||||
* y - real position for the sprite
|
||||
* image - texture
|
||||
* img_width - width of texture
|
||||
* img_height - height of texture
|
||||
* sprite_pos_x - Position of the sprite relative to the player
|
||||
* sprite_pos_y - Position of the sprite relative to the player
|
||||
* inv_det - Inversion of the matrix (playerpos and spritepos)
|
||||
* transform_x - Result of the inversion
|
||||
* transform_y - Result of the inversion
|
||||
* sprite_screen_x - Position of the sprite on screen (horizontal)
|
||||
* sprite_height - height of the sprite on screen
|
||||
* sprite_draw_start_y - for the while loop when rendering (col)
|
||||
* sprite_draw_end_y - for the while loop when rendering (col)
|
||||
* sprite_width - width of the sprite on screen
|
||||
* sprite_draw_start_x - for the while loop when rendering (row)
|
||||
* sprite_draw_end_x - for the while loop when rendering (row)
|
||||
*/
|
||||
typedef struct s_sprite
|
||||
{
|
||||
double x;
|
||||
|
|
@ -22,6 +41,18 @@ typedef struct s_sprite
|
|||
t_img_data *image;
|
||||
int img_width;
|
||||
int img_height;
|
||||
double sprite_pos_x;
|
||||
double sprite_pos_y;
|
||||
double inv_det;
|
||||
double transform_x;
|
||||
double transform_y;
|
||||
int sprite_screen_x;
|
||||
int sprite_height;
|
||||
int sprite_draw_start_y;
|
||||
int sprite_draw_end_y;
|
||||
int sprite_width;
|
||||
int sprite_draw_start_x;
|
||||
int sprite_draw_end_x;
|
||||
} t_sprite;
|
||||
|
||||
#endif // SPRITE_H
|
||||
|
|
|
|||
|
|
@ -6,7 +6,7 @@
|
|||
/* 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 */
|
||||
/* Updated: 2025/08/07 12:58:45 by tchampio ### ########.fr */
|
||||
/* */
|
||||
/* ************************************************************************** */
|
||||
|
||||
|
|
@ -21,18 +21,6 @@
|
|||
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;
|
||||
|
|
@ -44,37 +32,37 @@ void sprite_caster(t_cub3d_data *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)
|
||||
data->sprite_list[i]->sprite_pos_x = data->sprite_list[data->sprite_order[i]]->x - data->player.x;
|
||||
data->sprite_list[i]->sprite_pos_y = data->sprite_list[data->sprite_order[i]]->y - data->player.y;
|
||||
data->sprite_list[i]->inv_det = 1.0 / (data->player.plane_x * data->player.dir_y - data->player.dir_x * data->player.plane_y);
|
||||
data->sprite_list[i]->transform_x = data->sprite_list[i]->inv_det * (data->player.dir_y * data->sprite_list[i]->sprite_pos_x - data->player.dir_x * data->sprite_list[i]->sprite_pos_y);
|
||||
data->sprite_list[i]->transform_y = data->sprite_list[i]->inv_det * (-data->player.plane_y * data->sprite_list[i]->sprite_pos_x + data->player.plane_x * data->sprite_list[i]->sprite_pos_y);
|
||||
data->sprite_list[i]->sprite_screen_x = (int)((WIDTH / 2) * (1 + data->sprite_list[i]->transform_x / data->sprite_list[i]->transform_y));
|
||||
data->sprite_list[i]->sprite_height = (int)fabs((HEIGHT / data->sprite_list[i]->transform_y));
|
||||
data->sprite_list[i]->sprite_draw_start_y = -data->sprite_list[i]->sprite_height / 2 + HEIGHT / 2;
|
||||
if (data->sprite_list[i]->sprite_draw_start_y < 0)
|
||||
data->sprite_list[i]->sprite_draw_start_y = 0;
|
||||
data->sprite_list[i]->sprite_draw_end_y = data->sprite_list[i]->sprite_height / 2 + HEIGHT / 2;
|
||||
if (data->sprite_list[i]->sprite_draw_end_y >= HEIGHT)
|
||||
data->sprite_list[i]->sprite_draw_end_y = HEIGHT - 1;
|
||||
data->sprite_list[i]->sprite_width = (int)fabs((HEIGHT / data->sprite_list[i]->transform_y));
|
||||
data->sprite_list[i]->sprite_draw_start_x = -data->sprite_list[i]->sprite_width / 2 + data->sprite_list[i]->sprite_screen_x;
|
||||
if (data->sprite_list[i]->sprite_draw_start_x < 0)
|
||||
data->sprite_list[i]->sprite_draw_start_x = 0;
|
||||
data->sprite_list[i]->sprite_draw_end_x = data->sprite_list[i]->sprite_width / 2 + data->sprite_list[i]->sprite_screen_x;
|
||||
if (data->sprite_list[i]->sprite_draw_end_x >= WIDTH)
|
||||
data->sprite_list[i]->sprite_draw_end_x = WIDTH - 1;
|
||||
stripe = data->sprite_list[i]->sprite_draw_start_x;
|
||||
while (stripe < data->sprite_list[i]->sprite_draw_end_x)
|
||||
{
|
||||
texX = (int)(256 * (stripe - (-spriteWidth / 2 + spriteScreenX)) * SIZE / spriteWidth) / 256;
|
||||
if (transformY > 0 && stripe > 0 && stripe < WIDTH && transformY < data->zbuffer[stripe])
|
||||
texX = (int)(256 * (stripe - (-data->sprite_list[i]->sprite_width / 2 + data->sprite_list[i]->sprite_screen_x)) * SIZE / data->sprite_list[i]->sprite_width) / 256;
|
||||
if (data->sprite_list[i]->transform_y > 0 && stripe > 0 && stripe < WIDTH && data->sprite_list[i]->transform_y < data->zbuffer[stripe])
|
||||
{
|
||||
j = spriteDrawStartY;
|
||||
while (j < spriteDrawEndY)
|
||||
j = data->sprite_list[i]->sprite_draw_start_y;
|
||||
while (j < data->sprite_list[i]->sprite_draw_end_y)
|
||||
{
|
||||
d = (j) * 256 - HEIGHT * 128 + spriteHeight * 128;
|
||||
texY = ((d * SIZE) / spriteHeight) / 256;
|
||||
d = (j) * 256 - HEIGHT * 128 + data->sprite_list[i]->sprite_height * 128;
|
||||
texY = ((d * SIZE) / data->sprite_list[i]->sprite_height) / 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);
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue