diff --git a/src/sprites/sprite.h b/src/sprites/sprite.h index ddd7e91..ad2aece 100644 --- a/src/sprites/sprite.h +++ b/src/sprites/sprite.h @@ -6,7 +6,7 @@ /* By: tchampio +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* 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 diff --git a/src/sprites/sprite_caster.c b/src/sprites/sprite_caster.c index 68bea7e..24df5ef 100644 --- a/src/sprites/sprite_caster.c +++ b/src/sprites/sprite_caster.c @@ -6,7 +6,7 @@ /* By: tchampio +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* 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);