mirror of
https://codeberg.org/ACME-Corporation/cub3d.git
synced 2025-12-06 01:48:08 +01:00
norme: finished norme for the sprites except in main.c
This commit is contained in:
parent
cab1036359
commit
c796d44b56
2 changed files with 47 additions and 19 deletions
|
|
@ -6,7 +6,7 @@
|
||||||
/* By: tchampio <tchampio@student.42lehavre.fr> +#+ +:+ +#+ */
|
/* By: tchampio <tchampio@student.42lehavre.fr> +#+ +:+ +#+ */
|
||||||
/* +#+#+#+#+#+ +#+ */
|
/* +#+#+#+#+#+ +#+ */
|
||||||
/* Created: 2025/08/06 14:17:58 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++
|
// 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)
|
void sort_sprites(int *spriteorder, double *spritedist, t_cub3d_data *data)
|
||||||
{
|
{
|
||||||
int i;
|
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)
|
while (data->sprite_list[i] && i < MAX_SPRITES)
|
||||||
{
|
{
|
||||||
order[i] = i;
|
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++;
|
spritescount++;
|
||||||
i++;
|
i++;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -6,7 +6,7 @@
|
||||||
/* By: tchampio <tchampio@student.42lehavre.fr> +#+ +:+ +#+ */
|
/* By: tchampio <tchampio@student.42lehavre.fr> +#+ +:+ +#+ */
|
||||||
/* +#+#+#+#+#+ +#+ */
|
/* +#+#+#+#+#+ +#+ */
|
||||||
/* Created: 2025/08/05 15:51:01 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 <stdio.h>
|
#include <stdio.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
|
|
||||||
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;
|
t_sprite *sprite;
|
||||||
|
|
||||||
sprite = data->sprite_list[i];
|
sprite = data->sprite_list[i];
|
||||||
sprite->sprite_pos_x = data->sprite_list[data->sprite_order[i]]->x - data->player.x;
|
calculate_pos_and_transform(data, sprite, i);
|
||||||
sprite->sprite_pos_y = data->sprite_list[data->sprite_order[i]]->y - data->player.y;
|
sprite->sprite_height = (int)fabs((HEIGHT / sprite->transform_y));
|
||||||
sprite->inv_det = 1.0 / (data->player.plane_x * data->player.dir_y - data->player.dir_x * data->player.plane_y);
|
sprite->sprite_draw_start_y = -sprite->sprite_height / 2 + HEIGHT / 2;
|
||||||
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)
|
if (sprite->sprite_draw_start_y < 0)
|
||||||
sprite->sprite_draw_start_y = 0;
|
sprite->sprite_draw_start_y = 0;
|
||||||
sprite->sprite_draw_end_y = sprite->sprite_height / 2 + HEIGHT / 2;
|
sprite->sprite_draw_end_y = sprite->sprite_height / 2 + HEIGHT / 2;
|
||||||
if (sprite->sprite_draw_end_y >= HEIGHT)
|
if (sprite->sprite_draw_end_y >= HEIGHT)
|
||||||
sprite->sprite_draw_end_y = HEIGHT - 1;
|
sprite->sprite_draw_end_y = HEIGHT - 1;
|
||||||
sprite->sprite_width = (int)fabs((HEIGHT / sprite->transform_y));
|
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)
|
if (sprite->sprite_draw_start_x < 0)
|
||||||
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)
|
if (sprite->sprite_draw_end_x >= WIDTH)
|
||||||
sprite->sprite_draw_end_x = WIDTH - 1;
|
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;
|
j = data->sprite_list[i]->sprite_draw_start_y;
|
||||||
while (j < data->sprite_list[i]->sprite_draw_end_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;
|
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)
|
if (color != SPRITE_TRANPARENCY_COLOR)
|
||||||
matrix_set(data, stripe, j, color);
|
matrix_set(data, stripe, j, color);
|
||||||
j++;
|
j++;
|
||||||
|
|
@ -72,8 +90,13 @@ static void render_sprites(t_cub3d_data *data, int i)
|
||||||
stripe = data->sprite_list[i]->sprite_draw_start_x;
|
stripe = data->sprite_list[i]->sprite_draw_start_x;
|
||||||
while (stripe < data->sprite_list[i]->sprite_draw_end_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;
|
tex_x = (int)(256 * (stripe
|
||||||
if (data->sprite_list[i]->transform_y > 0 && stripe > 0 && stripe < WIDTH && data->sprite_list[i]->transform_y < data->zbuffer[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);
|
render_sprite_col(data, i, tex_x, stripe);
|
||||||
stripe++;
|
stripe++;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue