sprites always render at correct height
This commit is contained in:
parent
67670b63ea
commit
8eb0f6c5ea
4
Makefile
4
Makefile
@ -6,13 +6,13 @@
|
|||||||
# By: houtworm <codam@houtworm.net> +#+ #
|
# By: houtworm <codam@houtworm.net> +#+ #
|
||||||
# +#+ #
|
# +#+ #
|
||||||
# Created: 2023/10/26 10:46:29 by houtworm #+# #+# #
|
# Created: 2023/10/26 10:46:29 by houtworm #+# #+# #
|
||||||
# Updated: 2023/11/02 18:31:43 by houtworm ######## odam.nl #
|
# Updated: 2023/11/04 02:26:44 by houtworm ######## odam.nl #
|
||||||
# #
|
# #
|
||||||
# **************************************************************************** #
|
# **************************************************************************** #
|
||||||
|
|
||||||
NAME =cub3d
|
NAME =cub3d
|
||||||
CC =gcc
|
CC =gcc
|
||||||
FC =-Wall -Werror -Wextra -Wunreachable-code -flto -Ofast -march=native #-g #-fsanitize=address
|
FC =-Wall -Werror -Wextra -Wunreachable-code -flto -Ofast -march=native -g #-fsanitize=address
|
||||||
HEAD =-I ./include -I $(MLX)/include
|
HEAD =-I ./include -I $(MLX)/include
|
||||||
RM =rm -rf
|
RM =rm -rf
|
||||||
LIB =libft/libft.a getnextline/get_next_line.a mlx/build/libmlx42.a -ldl -lglfw -pthread -lm
|
LIB =libft/libft.a getnextline/get_next_line.a mlx/build/libmlx42.a -ldl -lglfw -pthread -lm
|
||||||
|
6
cub3d.h
6
cub3d.h
@ -6,7 +6,7 @@
|
|||||||
/* By: houtworm <codam@houtworm.net> +#+ */
|
/* By: houtworm <codam@houtworm.net> +#+ */
|
||||||
/* +#+ */
|
/* +#+ */
|
||||||
/* Created: 2023/10/26 10:46:35 by houtworm #+# #+# */
|
/* Created: 2023/10/26 10:46:35 by houtworm #+# #+# */
|
||||||
/* Updated: 2023/11/04 00:10:18 by houtworm ######## odam.nl */
|
/* Updated: 2023/11/04 01:53:08 by houtworm ######## odam.nl */
|
||||||
/* */
|
/* */
|
||||||
/* ************************************************************************** */
|
/* ************************************************************************** */
|
||||||
|
|
||||||
@ -41,7 +41,11 @@ typedef struct s_varlist
|
|||||||
mlx_texture_t *barreltext;
|
mlx_texture_t *barreltext;
|
||||||
mlx_texture_t *hlamptext;
|
mlx_texture_t *hlamptext;
|
||||||
mlx_texture_t *slamptext;
|
mlx_texture_t *slamptext;
|
||||||
|
mlx_texture_t *treasuretext;
|
||||||
|
mlx_texture_t *endtext;
|
||||||
|
mlx_texture_t *nazitext;
|
||||||
t_sprite *sprite;
|
t_sprite *sprite;
|
||||||
|
t_sprite *spriteorder;
|
||||||
int spritecount;
|
int spritecount;
|
||||||
int fpsrefresh;
|
int fpsrefresh;
|
||||||
int w;
|
int w;
|
||||||
|
@ -7,26 +7,26 @@ SO ./assets/redbrick.png
|
|||||||
WE ./assets/wood.png
|
WE ./assets/wood.png
|
||||||
|
|
||||||
1111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111
|
1111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111
|
||||||
1 B1 1 1 1 1 1
|
1G B1 1 1 1 1 1
|
||||||
1 K D K K 1 C D D K K X 1
|
1 KH H H H H H D KH K 1 C H D D KHK X 1
|
||||||
1 1 1 1 1 1 1
|
1 1 1 1 1 1 1
|
||||||
1 11111111111 11111111111 111111111111111111111 1 1111111111 1111111111
|
1 11111111111 11111111111 111111111111111111111 1 1111111111 1111111111
|
||||||
1 1B C B1 1 1 1 1 1 D K K 1 1
|
1 1B C B1 1 1 1 1 1 D KH K 1 1
|
||||||
1 1 K K 1 1 K K D 1 C 1 K K D 1 1 K K K K K K K K 1
|
1 1 KH HK 1 1 K H K D 1 C 1 K H K D H 1 1 K K K K K K K K 1
|
||||||
1 1 1 1 1 1 1 1 1111111111 K K K K K K 1
|
1 1 1 1 1 1 H 1 1 1111111111 K K K K K K 1
|
||||||
1 11111 11111 11111111111 D K K K 11111111111 1 1 K K K K 1
|
1 11111 11111 11111111111 D K K K 11111111111 1 1 K K K K 1
|
||||||
1 1 1 1 K K 1 1 D K K 1 K K 1
|
1 1 1 1 K K 1 1 D KH K 1 K K 1
|
||||||
1 1 K K D 1 1 K K D 1 1 1
|
1 1 K H K D 1 1 K H K D H 1 1 1
|
||||||
1 1 1 11111111111 1 1111111111 1
|
1 1 1 11111111111 1 1111111111 1
|
||||||
1 11111111111 1 11111111111 1 1 1
|
1 H H 11111111111 1 11111111111 1 1 1
|
||||||
1 1 1 D K K 1 1 D K K 1 1
|
1 1 1 D K H K 1 1 D KH K 1 1
|
||||||
1B 1 K K D 1 1 K K D 1 1 1
|
1B 1 K H K D 1 1 K H K D H 1 1 1
|
||||||
1BB 1 1 11111111111 1 1111111111 1
|
1BB 1 1 11111111111 1 1111111111 1
|
||||||
111111111 11111111111 1 11111111111 1 1 1
|
111111111 11111111111 1 11111111111 1 1 1
|
||||||
1B1 1 1 1 D K K 1 1 D C 1 1
|
1B1 1 1 1 D K H K 1 1 D HC 1 1
|
||||||
1 K K K 1 1 K K 1 1 1 K K D 1 1 1
|
1 K K K 1 1 K K 1 1 1 KHK D H 1 1 1
|
||||||
1 1 C 1 1 K K K D 11111111111 K K K 1 1111111111 1
|
1 1 H 1 H 1 K K K D 11111111111 K K K 1 1111111111 1
|
||||||
1 1 1 N 1 K K 1 1 1 K K 1 1 1
|
1 1 C 1 N 1 KHK 1 1 1 KHK 1 1 1
|
||||||
1 1111111 1 C 1 D K K 1 C 1B 1
|
1 1111111 1 C 1 D K H K 1 C 1BH H H 1
|
||||||
1 1 1BBB1 1 1BB B1 1
|
1 1 1BBB1 1 1BB B1 1
|
||||||
1111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111
|
1111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111
|
||||||
|
78
src/draw.c
78
src/draw.c
@ -6,7 +6,7 @@
|
|||||||
/* By: houtworm <codam@houtworm.net> +#+ */
|
/* By: houtworm <codam@houtworm.net> +#+ */
|
||||||
/* +#+ */
|
/* +#+ */
|
||||||
/* Created: 2023/10/26 16:54:20 by houtworm #+# #+# */
|
/* Created: 2023/10/26 16:54:20 by houtworm #+# #+# */
|
||||||
/* Updated: 2023/11/04 00:23:51 by houtworm ######## odam.nl */
|
/* Updated: 2023/11/04 02:29:31 by houtworm ######## odam.nl */
|
||||||
/* */
|
/* */
|
||||||
/* ************************************************************************** */
|
/* ************************************************************************** */
|
||||||
|
|
||||||
@ -22,11 +22,63 @@ mlx_texture_t *ft_selectsprite(t_varlist *vl, int type)
|
|||||||
sprite = vl->slamptext;
|
sprite = vl->slamptext;
|
||||||
else if (type == 3)
|
else if (type == 3)
|
||||||
sprite = vl->hlamptext;
|
sprite = vl->hlamptext;
|
||||||
|
else if (type == 4)
|
||||||
|
sprite = vl->treasuretext;
|
||||||
|
else if (type == 5)
|
||||||
|
sprite = vl->endtext;
|
||||||
|
else if (type == 6)
|
||||||
|
sprite = vl->nazitext;
|
||||||
else
|
else
|
||||||
ft_errorexit("what?", "what?", 1);
|
ft_errorexit("what?", "what?", 1);
|
||||||
return (sprite);
|
return (sprite);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
double ft_puthighestfirst(t_varlist *vl, double *spritedistance, double oldrecord, int j)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
double record;
|
||||||
|
int furthest;
|
||||||
|
|
||||||
|
i = 0;
|
||||||
|
record = 0;
|
||||||
|
furthest = 0;
|
||||||
|
while (vl->spritecount > i)
|
||||||
|
{
|
||||||
|
if (spritedistance[i] > record && spritedistance[i] < oldrecord)
|
||||||
|
{
|
||||||
|
record = spritedistance[i];
|
||||||
|
furthest = i;
|
||||||
|
}
|
||||||
|
i++;
|
||||||
|
}
|
||||||
|
oldrecord = record;
|
||||||
|
vl->spriteorder[j] = vl->sprite[furthest];
|
||||||
|
return (oldrecord);
|
||||||
|
}
|
||||||
|
|
||||||
|
void ft_sortsprites(t_varlist *vl)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
double *spritedistance;
|
||||||
|
double oldrecord;
|
||||||
|
|
||||||
|
i = 0;
|
||||||
|
spritedistance = ft_calloc(4096, 8);
|
||||||
|
vl->spriteorder = ft_calloc(4096, 8);
|
||||||
|
while (vl->spritecount > i)
|
||||||
|
{
|
||||||
|
spritedistance[i] = ((vl->posx - vl->sprite[i].x) * (vl->posx - vl->sprite[i].x) + (vl->posy - vl->sprite[i].y) * (vl->posy - vl->sprite[i].y));
|
||||||
|
i++;
|
||||||
|
}
|
||||||
|
i = 0;
|
||||||
|
oldrecord = 99999999999999.0;
|
||||||
|
while (vl->spritecount > i)
|
||||||
|
{
|
||||||
|
oldrecord = ft_puthighestfirst(vl, spritedistance, oldrecord, i);
|
||||||
|
i++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void ft_drawsprites(t_varlist *vl)
|
void ft_drawsprites(t_varlist *vl)
|
||||||
{
|
{
|
||||||
mlx_texture_t *sprite;
|
mlx_texture_t *sprite;
|
||||||
@ -49,31 +101,21 @@ void ft_drawsprites(t_varlist *vl)
|
|||||||
int texx;
|
int texx;
|
||||||
int texy;
|
int texy;
|
||||||
int d;
|
int d;
|
||||||
int *spriteorder;
|
|
||||||
double *spritedistance;
|
|
||||||
uint32_t color;
|
uint32_t color;
|
||||||
|
|
||||||
i = 0;
|
i = 0;
|
||||||
spritedistance = ft_calloc(4096, 8);
|
ft_sortsprites(vl);
|
||||||
spriteorder = ft_calloc(4096, 8);
|
|
||||||
while (vl->spritecount > i)
|
while (vl->spritecount > i)
|
||||||
{
|
{
|
||||||
spriteorder[i] = i;
|
spritex = vl->spriteorder[i].x - vl->posx;
|
||||||
spritedistance[i] = ((vl->posx - vl->sprite[i].x) * (vl->posx - vl->sprite[i].x) + (vl->posy - vl->sprite[i].y) * (vl->posy - vl->sprite[i].y));
|
spritey = vl->spriteorder[i].y - vl->posy;
|
||||||
i++;
|
sprite = ft_selectsprite(vl, vl->spriteorder[i].type);
|
||||||
}
|
|
||||||
i = 0;
|
|
||||||
while (vl->spritecount > i)
|
|
||||||
{
|
|
||||||
spritex = vl->sprite[i].x - vl->posx;
|
|
||||||
spritey = vl->sprite[i].y - vl->posy;
|
|
||||||
sprite = ft_selectsprite(vl, vl->sprite[i].type);
|
|
||||||
invdet = 1.0 / (vl->planex * vl->diry - vl->dirx * vl->planey);
|
invdet = 1.0 / (vl->planex * vl->diry - vl->dirx * vl->planey);
|
||||||
transformx = invdet * (vl->diry * spritex - vl->dirx * spritey);
|
transformx = invdet * (vl->diry * spritex - vl->dirx * spritey);
|
||||||
transformy = invdet * (-vl->planey * spritex + vl->planex * spritey);
|
transformy = invdet * (-vl->planey * spritex + vl->planex * spritey);
|
||||||
spritescreenx = (vl->w / 2) * (1 + transformx / transformy);
|
spritescreenx = (vl->w / 2) * (1 + transformx / transformy);
|
||||||
vmovescreen = (int)transformy + vl->hoffset + 0 / transformy;
|
vmovescreen = vl->hoffset + 0 / transformy;
|
||||||
spriteheight = abs((int)(vl->h / (transformy)));
|
spriteheight = fabs((vl->h / transformy));
|
||||||
drawstarty = -spriteheight / 2 + vl->h / 2 + vmovescreen;
|
drawstarty = -spriteheight / 2 + vl->h / 2 + vmovescreen;
|
||||||
if (drawstarty < 0)
|
if (drawstarty < 0)
|
||||||
drawstarty = 0;
|
drawstarty = 0;
|
||||||
@ -91,7 +133,7 @@ void ft_drawsprites(t_varlist *vl)
|
|||||||
while (x < drawendx)
|
while (x < drawendx)
|
||||||
{
|
{
|
||||||
texx = (int)(256 * (x - (-spritewidth / 2 + spritescreenx)) * 64 / spritewidth) / 256;
|
texx = (int)(256 * (x - (-spritewidth / 2 + spritescreenx)) * 64 / spritewidth) / 256;
|
||||||
if (transformy > 0 && x > 0 && x < vl->w)
|
if (transformy > 0 && x > 0 && x < vl->w && transformy < vl->zbuffer[x] + 0.5)
|
||||||
{
|
{
|
||||||
y = drawstarty;
|
y = drawstarty;
|
||||||
while (y < drawendy)
|
while (y < drawendy)
|
||||||
|
@ -6,7 +6,7 @@
|
|||||||
/* By: houtworm <codam@houtworm.net> +#+ */
|
/* By: houtworm <codam@houtworm.net> +#+ */
|
||||||
/* +#+ */
|
/* +#+ */
|
||||||
/* Created: 2023/10/26 16:49:12 by houtworm #+# #+# */
|
/* Created: 2023/10/26 16:49:12 by houtworm #+# #+# */
|
||||||
/* Updated: 2023/11/04 00:10:50 by houtworm ######## odam.nl */
|
/* Updated: 2023/11/04 01:52:30 by houtworm ######## odam.nl */
|
||||||
/* */
|
/* */
|
||||||
/* ************************************************************************** */
|
/* ************************************************************************** */
|
||||||
|
|
||||||
@ -31,6 +31,9 @@ t_varlist initvarlist(void)
|
|||||||
vl.barreltext = mlx_load_png("./assets/barrel.png");
|
vl.barreltext = mlx_load_png("./assets/barrel.png");
|
||||||
vl.hlamptext = mlx_load_png("./assets/hlamp.png");
|
vl.hlamptext = mlx_load_png("./assets/hlamp.png");
|
||||||
vl.slamptext = mlx_load_png("./assets/slamp.png");
|
vl.slamptext = mlx_load_png("./assets/slamp.png");
|
||||||
|
vl.treasuretext = mlx_load_png("./assets/treasure3.png");
|
||||||
|
vl.endtext = mlx_load_png("./assets/bkey.png");
|
||||||
|
vl.nazitext = mlx_load_png("./assets/guard1.png");
|
||||||
vl.mlx = mlx_init(vl.w, vl.h, "Cub3D", true);
|
vl.mlx = mlx_init(vl.w, vl.h, "Cub3D", true);
|
||||||
if (!vl.mlx)
|
if (!vl.mlx)
|
||||||
ft_errorexit("MLX failed to init", "initvarlist", 1);
|
ft_errorexit("MLX failed to init", "initvarlist", 1);
|
||||||
|
@ -6,7 +6,7 @@
|
|||||||
/* By: houtworm <codam@houtworm.net> +#+ */
|
/* By: houtworm <codam@houtworm.net> +#+ */
|
||||||
/* +#+ */
|
/* +#+ */
|
||||||
/* Created: 2023/10/26 14:13:07 by houtworm #+# #+# */
|
/* Created: 2023/10/26 14:13:07 by houtworm #+# #+# */
|
||||||
/* Updated: 2023/11/03 22:41:58 by houtworm ######## odam.nl */
|
/* Updated: 2023/11/04 02:31:20 by houtworm ######## odam.nl */
|
||||||
/* */
|
/* */
|
||||||
/* ************************************************************************** */
|
/* ************************************************************************** */
|
||||||
|
|
||||||
|
25
src/map.c
25
src/map.c
@ -6,7 +6,7 @@
|
|||||||
/* By: houtworm <codam@houtworm.net> +#+ */
|
/* By: houtworm <codam@houtworm.net> +#+ */
|
||||||
/* +#+ */
|
/* +#+ */
|
||||||
/* Created: 2023/10/26 17:33:50 by houtworm #+# #+# */
|
/* Created: 2023/10/26 17:33:50 by houtworm #+# #+# */
|
||||||
/* Updated: 2023/11/03 23:59:37 by houtworm ######## odam.nl */
|
/* Updated: 2023/11/04 02:34:10 by houtworm ######## odam.nl */
|
||||||
/* */
|
/* */
|
||||||
/* ************************************************************************** */
|
/* ************************************************************************** */
|
||||||
|
|
||||||
@ -48,7 +48,7 @@ char ft_setplayerpos(t_varlist *vl, char dir, int x, int y)
|
|||||||
return ('0');
|
return ('0');
|
||||||
}
|
}
|
||||||
|
|
||||||
char ft_addsprite(t_varlist *vl, int x, int y, int type)
|
char ft_addwalktroughsprite(t_varlist *vl, int x, int y, int type)
|
||||||
{
|
{
|
||||||
vl->sprite[vl->spritecount].x = x + 0.5;
|
vl->sprite[vl->spritecount].x = x + 0.5;
|
||||||
vl->sprite[vl->spritecount].y = y + 0.5;
|
vl->sprite[vl->spritecount].y = y + 0.5;
|
||||||
@ -57,6 +57,15 @@ char ft_addsprite(t_varlist *vl, int x, int y, int type)
|
|||||||
return ('0');
|
return ('0');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
char ft_addsolidsprite(t_varlist *vl, int x, int y, int type)
|
||||||
|
{
|
||||||
|
vl->sprite[vl->spritecount].x = x + 0.5;
|
||||||
|
vl->sprite[vl->spritecount].y = y + 0.5;
|
||||||
|
vl->sprite[vl->spritecount].type = type;
|
||||||
|
vl->spritecount++;
|
||||||
|
return ('2');
|
||||||
|
}
|
||||||
|
|
||||||
char **ft_getmap(t_varlist *vl, int fd)
|
char **ft_getmap(t_varlist *vl, int fd)
|
||||||
{
|
{
|
||||||
int y;
|
int y;
|
||||||
@ -100,17 +109,17 @@ char **ft_getmap(t_varlist *vl, int fd)
|
|||||||
else if (line[x] == 'D')
|
else if (line[x] == 'D')
|
||||||
map[y][x] = 'D';
|
map[y][x] = 'D';
|
||||||
else if (line[x] == 'B')
|
else if (line[x] == 'B')
|
||||||
map[y][x] = ft_addsprite(vl, y, x, 1);
|
map[y][x] = ft_addsolidsprite(vl, y, x, 1);
|
||||||
else if (line[x] == 'G')
|
else if (line[x] == 'G')
|
||||||
map[y][x] = ft_addsprite(vl, y, x, 2);
|
map[y][x] = ft_addsolidsprite(vl, y, x, 2);
|
||||||
else if (line[x] == 'H')
|
else if (line[x] == 'H')
|
||||||
map[y][x] = ft_addsprite(vl, y, x, 3);
|
map[y][x] = ft_addwalktroughsprite(vl, y, x, 3);
|
||||||
else if (line[x] == 'C')
|
else if (line[x] == 'C')
|
||||||
map[y][x] = ft_addsprite(vl, y, x, 1);
|
map[y][x] = ft_addsolidsprite(vl, y, x, 4);
|
||||||
else if (line[x] == 'X')
|
else if (line[x] == 'X')
|
||||||
map[y][x] = ft_addsprite(vl, y, x, 1);
|
map[y][x] = ft_addsolidsprite(vl, y, x, 5);
|
||||||
else if (line[x] == 'K')
|
else if (line[x] == 'K')
|
||||||
map[y][x] = ft_addsprite(vl, y, x, 1);
|
map[y][x] = ft_addsolidsprite(vl, y, x, 6);
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
ft_putstr("Invalid character on the map\n Valid options are\n");
|
ft_putstr("Invalid character on the map\n Valid options are\n");
|
||||||
|
Loading…
Reference in New Issue
Block a user