diff --git a/src/sprites/sort_sprites.c b/src/sprites/sort_sprites.c index e4b75b7..5f3c789 100644 --- a/src/sprites/sort_sprites.c +++ b/src/sprites/sort_sprites.c @@ -6,7 +6,7 @@ /* By: tchampio +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2025/08/06 14:17:58 by tchampio #+# #+# */ -/* Updated: 2025/08/07 12:25:43 by tchampio ### ########.fr */ +/* Updated: 2025/08/07 13:44:33 by tchampio ### ########.fr */ /* */ /* ************************************************************************** */ @@ -45,7 +45,9 @@ static void bubble_sort(double *dist, int *order, int count) } // the sorting part is a readaptation of the std::sort function from c++ -// more info on here: https://stackoverflow.com/questions/23816797/how-does-stdsort-work-for-list-of-pairs +// more info on here: +// https://stackoverflow.com/questions/23816797/how-does-stdsort-work-for +// -list-of-pairs (url coupé en deux pour la norme >:( ) void sort_sprites(int *spriteorder, double *spritedist, t_cub3d_data *data) { int i; @@ -58,7 +60,10 @@ void sort_sprites(int *spriteorder, double *spritedist, t_cub3d_data *data) while (data->sprite_list[i] && i < MAX_SPRITES) { order[i] = i; - dist[i] = ((data->player.x - data->sprite_list[i]->x) * (data->player.x - data->sprite_list[i]->x) + (data->player.y - data->sprite_list[i]->y) * (data->player.y - data->sprite_list[i]->y)); + dist[i] = ((data->player.x - data->sprite_list[i]->x) + * (data->player.x - data->sprite_list[i]->x) + + (data->player.y - data->sprite_list[i]->y) + * (data->player.y - data->sprite_list[i]->y)); spritescount++; i++; } diff --git a/src/sprites/sprite_caster.c b/src/sprites/sprite_caster.c index 0db79fb..68b1f62 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 13:17:51 by tchampio ### ########.fr */ +/* Updated: 2025/08/07 13:28:07 by tchampio ### ########.fr */ /* */ /* ************************************************************************** */ @@ -18,29 +18,44 @@ #include #include -void sprite_calculate_pos_and_dist(t_cub3d_data *data, int i) +static void calculate_pos_and_transform(t_cub3d_data *data, t_sprite *sprite, + int 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)); +} + +static 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; + calculate_pos_and_transform(data, sprite, i); + sprite->sprite_height = (int)fabs((HEIGHT / sprite->transform_y)); + sprite->sprite_draw_start_y = -sprite->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; + 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; + 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; } @@ -55,9 +70,12 @@ static void render_sprite_col(t_cub3d_data *data, int i, int tex_x, int 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; + 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); + 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++; @@ -72,8 +90,13 @@ static void render_sprites(t_cub3d_data *data, int i) 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]) + 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++; }