dev: made a 'macro' for sprite to write less and more efficiently

This commit is contained in:
Theo Champion 2025-08-07 13:19:17 +02:00
parent c8da6964d0
commit cab1036359

View file

@ -6,7 +6,7 @@
/* By: tchampio <tchampio@student.42lehavre.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2025/08/05 15:51:01 by tchampio #+# #+# */
/* Updated: 2025/08/07 12:58:45 by tchampio ### ########.fr */
/* Updated: 2025/08/07 13:17:51 by tchampio ### ########.fr */
/* */
/* ************************************************************************** */
@ -18,59 +18,77 @@
#include <stdio.h>
#include <stdlib.h>
void sprite_caster(t_cub3d_data *data)
void sprite_calculate_pos_and_dist(t_cub3d_data *data, int i)
{
int i;
int stripe;
int texX;
int d;
int texY;
int color;
int j;
t_sprite *sprite;
sort_sprites(data->sprite_order, data->sprite_distances, data);
i = 0;
while (data->sprite_list[i] && i < MAX_SPRITES)
{
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 - (-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])
sprite = data->sprite_list[i];
sprite->sprite_pos_x = data->sprite_list[data->sprite_order[i]]->x - data->player.x;
sprite->sprite_pos_y = data->sprite_list[data->sprite_order[i]]->y - data->player.y;
sprite->inv_det = 1.0 / (data->player.plane_x * data->player.dir_y - data->player.dir_x * data->player.plane_y);
sprite->transform_x = sprite->inv_det * (data->player.dir_y * sprite->sprite_pos_x - data->player.dir_x * sprite->sprite_pos_y);
sprite->transform_y = sprite->inv_det * (-data->player.plane_y * sprite->sprite_pos_x + data->player.plane_x * sprite->sprite_pos_y);
sprite->sprite_screen_x = (int)((WIDTH / 2) * (1 + sprite->transform_x / sprite->transform_y));
sprite->sprite_height = (int)fabs((HEIGHT / data->sprite_list[i]->transform_y));
sprite->sprite_draw_start_y = -data->sprite_list[i]->sprite_height / 2 + HEIGHT / 2;
if (sprite->sprite_draw_start_y < 0)
sprite->sprite_draw_start_y = 0;
sprite->sprite_draw_end_y = sprite->sprite_height / 2 + HEIGHT / 2;
if (sprite->sprite_draw_end_y >= HEIGHT)
sprite->sprite_draw_end_y = HEIGHT - 1;
sprite->sprite_width = (int)fabs((HEIGHT / sprite->transform_y));
sprite->sprite_draw_start_x = -sprite->sprite_width / 2 + sprite->sprite_screen_x;
if (sprite->sprite_draw_start_x < 0)
sprite->sprite_draw_start_x = 0;
sprite->sprite_draw_end_x = sprite->sprite_width / 2 + sprite->sprite_screen_x;
if (sprite->sprite_draw_end_x >= WIDTH)
sprite->sprite_draw_end_x = WIDTH - 1;
}
static void render_sprite_col(t_cub3d_data *data, int i, int tex_x, int stripe)
{
int j;
int color;
int tex_y;
int d;
j = data->sprite_list[i]->sprite_draw_start_y;
while (j < data->sprite_list[i]->sprite_draw_end_y)
{
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);
tex_y = ((d * SIZE) / data->sprite_list[i]->sprite_height) / 256;
color = my_mlx_pixel_get(data->sprite_list[data->sprite_order[i]]->image, tex_x, tex_y);
if (color != SPRITE_TRANPARENCY_COLOR)
matrix_set(data, stripe, j, color);
j++;
}
}
static void render_sprites(t_cub3d_data *data, int i)
{
int stripe;
int tex_x;
stripe = data->sprite_list[i]->sprite_draw_start_x;
while (stripe < data->sprite_list[i]->sprite_draw_end_x)
{
tex_x = (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])
render_sprite_col(data, i, tex_x, stripe);
stripe++;
}
}
void sprite_caster(t_cub3d_data *data)
{
int i;
sort_sprites(data->sprite_order, data->sprite_distances, data);
i = 0;
while (data->sprite_list[i] && i < MAX_SPRITES)
{
sprite_calculate_pos_and_dist(data, i);
render_sprites(data, i);
i++;
}
}