diff options
author | Rudy Bousset <rbousset@z2r4p3.le-101.fr> | 2020-03-09 18:53:35 +0100 |
---|---|---|
committer | Rudy Bousset <rbousset@z2r4p3.le-101.fr> | 2020-03-09 18:53:35 +0100 |
commit | 00f719e87a853f1c0b5dfc7085f605b452e75314 (patch) | |
tree | 1af5b195d41e26a284bec552aa9f07e4cc217db8 /src | |
parent | Norme (diff) | |
parent | gang (diff) | |
download | 42-cub3d-00f719e87a853f1c0b5dfc7085f605b452e75314.tar.gz 42-cub3d-00f719e87a853f1c0b5dfc7085f605b452e75314.tar.bz2 42-cub3d-00f719e87a853f1c0b5dfc7085f605b452e75314.tar.xz 42-cub3d-00f719e87a853f1c0b5dfc7085f605b452e75314.tar.zst 42-cub3d-00f719e87a853f1c0b5dfc7085f605b452e75314.zip |
Merge branch 'shpritz'
Diffstat (limited to 'src')
-rw-r--r-- | src/ft_draw_scene.c | 2 | ||||
-rw-r--r-- | src/ft_draw_sprite.c | 128 | ||||
-rw-r--r-- | src/ft_draw_verline.c | 1 | ||||
-rw-r--r-- | src/ft_get_player_spawn.c | 1 | ||||
-rw-r--r-- | src/ft_get_sprite.c | 9 | ||||
-rw-r--r-- | src/ft_key_loop.c | 2 | ||||
-rw-r--r-- | src/ft_raycasting.c | 8 |
7 files changed, 123 insertions, 28 deletions
diff --git a/src/ft_draw_scene.c b/src/ft_draw_scene.c index 087457d..68a72e9 100644 --- a/src/ft_draw_scene.c +++ b/src/ft_draw_scene.c @@ -50,6 +50,7 @@ void { ft_draw_hud(clist); } + ft_calc_sprite(clist); mlx_put_image_to_window(clist->wlist.wlx, clist->wlist.winptr, clist->img.img, 0, 0); if (clist->ishud && clist->mlist.isnlvl) @@ -70,6 +71,7 @@ void clist->img.ptr = mlx_get_data_addr(clist->img.img, &clist->img.bpp, &clist->img.sizeline, &clist->img.endian); ft_castray(clist); + ft_calc_sprite(clist); if (ft_save_to_bmp(clist) < 0) ft_error(FT_RET_BMP_ERR, FT_ERR_WR_BMP, clist); mlx_destroy_image(clist->wlist.wlx, clist->img.img); diff --git a/src/ft_draw_sprite.c b/src/ft_draw_sprite.c index 9dc1b63..1393d38 100644 --- a/src/ft_draw_sprite.c +++ b/src/ft_draw_sprite.c @@ -18,36 +18,114 @@ #include <math.h> void - ft_draw_verline_sprite(t_cub *cl, int x, int y, int tex_y) + ft_sort_sprites(t_cub *cl) { - if (cl->tlist[4].tex_x) - cl->img.ptr[x * 4 + (cl->img.sizeline * y)] = - (char)cl->tlist[4].ptr[cl->tlist[4].tex_x * 4 + 4 * - cl->tlist[4].img_h * tex_y]; - cl->img.ptr[x * 4 + (cl->img.sizeline * y) + 1] = - (char)cl->tlist[4].ptr[cl->tlist[4].tex_x * 4 + 4 * - cl->tlist[4].img_h * tex_y + 1]; - cl->img.ptr[x * 4 + (cl->img.sizeline * y) + 2] = - (char)cl->tlist[4].ptr[cl->tlist[4].tex_x * 4 + 4 * - cl->tlist[4].img_h * tex_y + 2]; - cl->img.ptr[x * 4 + cl->wlist.x_size * y + 3] = (char)0; + float dist_tab[4096]; + uint32_t tmp; + int32_t it; + + it = 0; + while (it < cl->mlist.sprite_nbr) + { + dist_tab[it] = ((cl->plist.pos_x - cl->sprites[it].s_pos_x) * + (cl->plist.pos_x - cl->sprites[it].s_pos_x) + + (cl->plist.pos_y - cl->sprites[it].s_pos_y) * + (cl->plist.pos_y - cl->sprites[it].s_pos_y)); + cl->mlist.sprite_order[it] = it; + it++; + } + it = 0; + while (it < cl->mlist.sprite_nbr) + { + if (dist_tab[it] > dist_tab[it + 1]) + { + tmp = dist_tab[it]; + dist_tab[it] = dist_tab[it + 1]; + dist_tab[it + 1] = tmp; + tmp = cl->mlist.sprite_order[it]; + cl->mlist.sprite_order[it] = cl->mlist.sprite_order[it + 1]; + cl->mlist.sprite_order[it + 1] = tmp; + it = 0; + } + } +} + +void + ft_sprite_height(t_cub *cl, t_sprite *sprite) +{ + sprite->spriteheight = abs((int)(cl->wlist.y_size / (sprite->transformy))); + sprite->drawstarty = -sprite->spriteheight / 2 + cl->wlist.y_size / 2; + if(sprite->drawstarty < 0) + sprite->drawstarty = 0; + sprite->drawendy = sprite->spriteheight / 2 + cl->wlist.y_size / 2; + if(sprite->drawendy >= (int)cl->wlist.y_size) + sprite->drawendy = cl->wlist.y_size - 1; +} + +void + ft_sprite_width(t_cub *cl, t_sprite *sprite) +{ + sprite->spritewidth = abs((int)(cl->wlist.x_size / (sprite->transformy))); + sprite->drawstartx = -sprite->spritewidth / 2 + sprite->spritescreenx; + if(sprite->drawstartx < 0) + sprite->drawstartx = 0; + sprite->drawendx = sprite->spritewidth / 2 + sprite->spritescreenx; + if(sprite->drawendx >= (int)cl->wlist.x_size) sprite->drawendx = cl->wlist.x_size - 1; +} + +void + ft_calc_sprite(t_cub *cl) +{ + t_sprite sprite; + int i = 0; + + while (i < cl->mlist.sprite_nbr) + { + sprite = cl->sprites[i]; + sprite.spritey = sprite.s_pos_x - (cl->plist.pos_x - 0.5); + sprite.spritex = sprite.s_pos_y - (cl->plist.pos_y - 0.5); + sprite.invdet = 1.0 / (cl->plist.plane_x * cl->plist.dir_y - cl->plist.dir_x * cl->plist.plane_y); + sprite.transformx = sprite.invdet * (cl->plist.dir_y * sprite.spritex- cl->plist.dir_x* sprite.spritey); + sprite.transformy = sprite.invdet * (-cl->plist.plane_y* sprite.spritex + cl->plist.plane_x * sprite.spritey); + sprite.spritescreenx = (int)(cl->wlist.x_size / 2) * (1 + sprite.transformx / sprite.transformy); + ft_sprite_height(cl, &sprite); + ft_sprite_width(cl, &sprite); + ft_draw_sprite(cl, &sprite); + i++; + } } void - ft_draw_sprite(t_cub *cl, int x) + ft_draw_sprite(t_cub *cl, t_sprite *sprite) { - int hor_it; - int d; - int tex_y; + int32_t d; - hor_it = cl->sp_list.s_start_y; - while (hor_it < cl->sp_list.s_end_y) + sprite->x = sprite->drawstartx; + while (sprite->x < sprite->drawendx) { - d = hor_it * 256 - cl->wlist.y_size * 128 + cl->rlist.line_h * 128; - d = (d <= 0) ? (-d) : (d); - tex_y = ((d * cl->tlist[4].img_h) / cl->rlist.line_h) / 256; - (tex_y < 0) ? (tex_y = 0) : 0; - ft_draw_verline_sprite(cl, x, hor_it, tex_y); - hor_it++; - } + sprite->tex_x = (int32_t)((sprite->x - (-sprite->spritewidth / 2 + + sprite->spritescreenx)) * cl->tlist[4].img_w / sprite->spritewidth); + sprite->y = sprite->drawstarty; + while (sprite->y < sprite->drawendy) + { + d = sprite->y * 256 - cl->wlist.y_size * 128 + + sprite->spriteheight * 128; + sprite->tex_y = ((d * cl->tlist[4].img_h / 2) / + sprite->spriteheight) / 128; + if (cl->tlist[4].ptr[sprite->tex_x * 4 + 4 * cl->tlist[4].img_h * sprite->tex_y] + && cl->rlist.wall_dist_tab[sprite->x] > sprite->transformy) + { + cl->img.ptr[sprite->x * 4 + (sprite->y * cl->img.sizeline)] = + cl->tlist[4].ptr[sprite->tex_x * 4 + 4 * cl->tlist[4].img_h * sprite->tex_y]; + cl->img.ptr[sprite->x * 4 + (sprite->y * + cl->img.sizeline) + 1] = + cl->tlist[4].ptr[sprite->tex_x * 4 + 4 * cl->tlist[4].img_h * sprite->tex_y + 1]; + cl->img.ptr[sprite->x * 4 + (sprite->y * + cl->img.sizeline) + 2] = + cl->tlist[4].ptr[sprite->tex_x * 4 + 4 * cl->tlist[4].img_h * sprite->tex_y + 2]; + } + sprite->y++; + } + sprite->x++; + } } diff --git a/src/ft_draw_verline.c b/src/ft_draw_verline.c index 7bfba8d..16dc63c 100644 --- a/src/ft_draw_verline.c +++ b/src/ft_draw_verline.c @@ -10,6 +10,7 @@ /* */ /* ************************************************************************** */ +#include <stdio.h> #include <cub3d.h> #include <stdint.h> diff --git a/src/ft_get_player_spawn.c b/src/ft_get_player_spawn.c index c506775..6853313 100644 --- a/src/ft_get_player_spawn.c +++ b/src/ft_get_player_spawn.c @@ -82,6 +82,7 @@ void plist->start_x = plist->pos_x; plist->start_y = plist->pos_y; ft_get_start_side(clist->mlist.map[y][x], plist); + ft_get_sprite_spawn(clist); return ; } x++; diff --git a/src/ft_get_sprite.c b/src/ft_get_sprite.c index 4580681..10c6bdd 100644 --- a/src/ft_get_sprite.c +++ b/src/ft_get_sprite.c @@ -19,18 +19,21 @@ void { size_t x; size_t y; + uint8_t i; x = 1; y = 1; + i = 0; while (clist->mlist.map[y]) { while (clist->mlist.map[y][x]) { if (ft_ischarset("2", clist->mlist.map[y][x])) { - clist->sp_list.s_pos_x = x + 0.5; - clist->sp_list.s_pos_y = y + 0.5; - return ; + clist->mlist.sprite_nbr++; + clist->sprites[i].s_pos_x = x; + clist->sprites[i].s_pos_y = y; + i++; } x++; } diff --git a/src/ft_key_loop.c b/src/ft_key_loop.c index 1d463bc..d40de34 100644 --- a/src/ft_key_loop.c +++ b/src/ft_key_loop.c @@ -81,6 +81,8 @@ int i++; } if (cl->key_input[0] != -1) + { ft_draw_scene(cl); + } return (0); } diff --git a/src/ft_raycasting.c b/src/ft_raycasting.c index bf84b9e..9657b18 100644 --- a/src/ft_raycasting.c +++ b/src/ft_raycasting.c @@ -13,6 +13,7 @@ #include <libft.h> #include <cub3d.h> #include <stdint.h> +#include <stdio.h> #include <stdlib.h> #include <math.h> @@ -71,11 +72,16 @@ void { uint16_t i; t_win *wl; + float *dist_tab; wl = &cl->wlist; i = (wl->y_size / 2) + 1; while (++i < wl->y_size) ft_floor_cast(i, cl); + if (!(dist_tab = malloc(sizeof(float) * cl->wlist.x_size))) + return ; + if (!(cl->rlist.wall_dist_tab = malloc(sizeof(float) * cl->wlist.x_size))) + return ; i = 0; while (i < wl->x_size) { @@ -90,6 +96,8 @@ void ft_choose_tex(cl); ft_calc_tex(cl); ft_draw_verline(cl, i, cl->rlist.wall_t, cl->rlist.wall_b); + dist_tab[i] = cl->rlist.wall_dist; + cl->rlist.wall_dist_tab = dist_tab; i++; } } |