diff --git a/src/sprites/sprite_caster.c b/src/sprites/sprite_caster.c index 24df5ef..0db79fb 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:58:45 by tchampio ### ########.fr */ +/* Updated: 2025/08/07 13:17:51 by tchampio ### ########.fr */ /* */ /* ************************************************************************** */ @@ -18,59 +18,77 @@ #include #include +void sprite_calculate_pos_and_dist(t_cub3d_data *data, int i) +{ + t_sprite *sprite; + + 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; + 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; - int stripe; - int texX; - int d; - int texY; - int color; - int j; + int i; 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]) - { - 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); - if (color != SPRITE_TRANPARENCY_COLOR) - matrix_set(data, stripe, j, color); - j++; - } - } - stripe++; - } + sprite_calculate_pos_and_dist(data, i); + render_sprites(data, i); i++; } }