From d4557ead6f8f52d01f7055b513c578bc21f6c6ae Mon Sep 17 00:00:00 2001 From: adjoly Date: Mon, 16 Sep 2024 18:50:24 +0200 Subject: [PATCH 01/24] =?UTF-8?q?=E3=80=8C=F0=9F=8F=97=EF=B8=8F=E3=80=8D?= =?UTF-8?q?=20wip:=20Player=20on=20minimap=20working?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 2 -- Makefile | 7 +----- includes/game.h | 30 ++++++++++++++++------ src/cub3d.c | 37 ++++++++++++++++++++++++++++ src/parsing/principal_pars.c | 34 ++++++++++++------------- src/{ => raycasting}/event_handler.c | 25 ++++++++++++++++--- src/raycasting/player_print.c | 33 +++++++++++++++++++++++++ 7 files changed, 132 insertions(+), 36 deletions(-) create mode 100644 src/cub3d.c rename src/{ => raycasting}/event_handler.c (62%) create mode 100644 src/raycasting/player_print.c diff --git a/.gitignore b/.gitignore index b9b324b..3324dc9 100644 --- a/.gitignore +++ b/.gitignore @@ -9,5 +9,3 @@ libft/**/*.o libft/**/*.a src/main.c vgcore.* -Makefile -src/cub3d.c diff --git a/Makefile b/Makefile index 5676f07..b6a727a 100644 --- a/Makefile +++ b/Makefile @@ -16,12 +16,7 @@ MACRO_DIR = MacroLibX/ INCLUDE = -I $(I_DIR) -I $(LIBFT_DIR)/$(I_DIR) -I $(MACRO_DIR)/$(I_DIR) -SRCS = src/utils/mess_error.c \ - src/utils/parse_utils.c \ - src/parsing/check_map.c \ - src/parsing/check_arg.c \ - src/parsing/principal_pars.c \ - src/cub3d.c +SRCS = $(shell find src -name *.c) OBJS = $(addprefix $(OBJSDIR), $(SRCS:.c=.o)) diff --git a/includes/game.h b/includes/game.h index 8d6fc5b..1aefb1e 100644 --- a/includes/game.h +++ b/includes/game.h @@ -6,27 +6,33 @@ /* By: adjoly +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2024/09/11 16:38:40 by adjoly #+# #+# */ -/* Updated: 2024/09/12 17:04:59 by adjoly ### ########.fr */ +/* Updated: 2024/09/16 13:36:04 by adjoly ### ########.fr */ /* */ /* ************************************************************************** */ #ifndef GAME_H # define GAME_H +# include "parsing.h" +# include + typedef struct s_cub { void *mlx; void *win; void *images; char **map; + t_coord p_coord; } t_cub; -#define ESCAPE_KEY 41 -#define W_KEY 26 -#define S_KEY 22 -#define A_KEY 4 -#define D_KEY 7 -#define WHITE 0xFFFFFFFF +# define ESCAPE_KEY 41 +# define W_KEY 26 +# define S_KEY 22 +# define A_KEY 4 +# define D_KEY 7 +# define WHITE 0xFFFFFFFF +# define WINDOW_Y 900 +# define WINDOW_X 1600 /** * @brief This function is used to handle keypress @@ -36,6 +42,14 @@ typedef struct s_cub * * @return Minilibx go brrrr(useless always 0) */ -int key_hook(int key, void *mlx); +int key_hook(int key, void *param); + +/** + * @brief This function is used to create an image with the player position + * + * @param cub The address of a t_cub struct filled with mlx data and other thing + * + */ +void *get_player_image(t_cub *cub, uint8_t key_pressed); #endif diff --git a/src/cub3d.c b/src/cub3d.c new file mode 100644 index 0000000..452b687 --- /dev/null +++ b/src/cub3d.c @@ -0,0 +1,37 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* cub3d.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: madumerg +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2024/09/04 16:58:27 by madumerg #+# #+# */ +/* Updated: 2024/09/16 18:39:38 by adjoly ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "cub3d.h" +#include "game.h" +#include "mlx.h" + +int main(int ac, char **av) +{ + t_cub cub; + + (void)ac; + (void)av; + cub.mlx = mlx_init(); + cub.win = mlx_new_window(cub.mlx, 400, 400, "WTF"); + cub.p_coord.x = 100; + cub.p_coord.y = 100; + + mlx_put_image_to_window(cub.mlx, cub.win, get_player_image(&cub, 0), 0, 0); + + mlx_on_event(cub.mlx, cub.win, MLX_KEYDOWN, key_hook, &cub); + + mlx_loop(cub.mlx); + + mlx_destroy_window(cub.mlx, cub.win); + mlx_destroy_display(cub.mlx); + return (0); +} diff --git a/src/parsing/principal_pars.c b/src/parsing/principal_pars.c index 52a38eb..4359e9f 100644 --- a/src/parsing/principal_pars.c +++ b/src/parsing/principal_pars.c @@ -6,29 +6,29 @@ /* By: madumerg +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2024/09/12 12:44:52 by madumerg #+# #+# */ -/* Updated: 2024/09/12 16:49:20 by madumerg ### ########.fr */ +/* Updated: 2024/09/13 10:43:50 by adjoly ### ########.fr */ /* */ /* ************************************************************************** */ #include "cub3d.h" -int check_info(char **l) -{ - -} +//int check_info(char **l) +//{ +// +//} -int verif_info_map(char *av) -{ - char **map; - char **f_part; - - map = parse_map(av); - f_part = info_map(map); - if (check_info(f_part) == 1) - return (1); - if (verif_all_map(map) == 1) - return (1); -} +//int verif_info_map(char *av) +//{ +// char **map; +// char **f_part; +// +// map = parse_map(av); +// f_part = info_map(map); +// if (check_info(f_part) == 1) +// return (1); +// if (verif_all_map(map) == 1) +// return (1); +//} int verif_all_map(char **map) { diff --git a/src/event_handler.c b/src/raycasting/event_handler.c similarity index 62% rename from src/event_handler.c rename to src/raycasting/event_handler.c index 5bb53a7..78533c1 100644 --- a/src/event_handler.c +++ b/src/raycasting/event_handler.c @@ -6,7 +6,7 @@ /* By: adjoly +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2024/09/11 16:37:56 by adjoly #+# #+# */ -/* Updated: 2024/09/12 14:40:22 by adjoly ### ########.fr */ +/* Updated: 2024/09/16 18:47:09 by adjoly ### ########.fr */ /* */ /* ************************************************************************** */ @@ -14,18 +14,37 @@ #include "mlx.h" #include "game.h" -int key_hook(int key, t_cub *cub) +int key_hook(int key, void *param) { - (void)mlx; + t_cub *cub; + + cub = (t_cub *)param; + (void)cub; if (key == ESCAPE_KEY) mlx_loop_end(cub->mlx); if (key == W_KEY) + { printf("UP\n"); + mlx_clear_window(cub->mlx, cub->win); + mlx_put_image_to_window(cub->mlx, cub->win, get_player_image(cub, key), 0, 0); + } if (key == S_KEY) + { printf("DOWN\n"); + mlx_clear_window(cub->mlx, cub->win); + mlx_put_image_to_window(cub->mlx, cub->win, get_player_image(cub, key), 0, 0); + } if (key == D_KEY) + { printf("RIGHT\n"); + mlx_clear_window(cub->mlx, cub->win); + mlx_put_image_to_window(cub->mlx, cub->win, get_player_image(cub, key), 0, 0); + } if (key == A_KEY) + { printf("LEFT\n"); + mlx_clear_window(cub->mlx, cub->win); + mlx_put_image_to_window(cub->mlx, cub->win, get_player_image(cub, key), 0, 0); + } return (0); } diff --git a/src/raycasting/player_print.c b/src/raycasting/player_print.c new file mode 100644 index 0000000..bcbe6e6 --- /dev/null +++ b/src/raycasting/player_print.c @@ -0,0 +1,33 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* player_print.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: adjoly +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2024/09/13 11:05:02 by adjoly #+# #+# */ +/* Updated: 2024/09/16 18:49:37 by adjoly ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "game.h" +#include +#include "mlx.h" + +void *get_player_image(t_cub *cub, uint8_t key_pressed) +{ + void *img; + + img = mlx_new_image(cub->mlx, WINDOW_X, WINDOW_Y); + + if (key_pressed == W_KEY) + cub->p_coord.y--; + else if (key_pressed == S_KEY) + cub->p_coord.y++; + else if (key_pressed == D_KEY) + cub->p_coord.x++; + else if (key_pressed == A_KEY) + cub->p_coord.x--; + mlx_set_image_pixel(cub->mlx, img, cub->p_coord.x, cub->p_coord.y, WHITE); + return (img); +} From 0a91d7f2c6628798782727730925de66f766729b Mon Sep 17 00:00:00 2001 From: adjoly Date: Tue, 17 Sep 2024 10:48:20 +0200 Subject: [PATCH 02/24] =?UTF-8?q?=E3=80=8C=E2=9C=8F=EF=B8=8F=E3=80=8D=20no?= =?UTF-8?q?rm:=20Cleand=20and=20normed=20player=20on=20minimap?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- includes/cub3d.h | 5 ++-- includes/game.h | 12 ++++---- src/cub3d.c | 9 ++---- .../{event_handler.c => key_hook.c} | 30 +++++-------------- src/raycasting/player_print.c | 3 +- 5 files changed, 21 insertions(+), 38 deletions(-) rename src/raycasting/{event_handler.c => key_hook.c} (58%) diff --git a/includes/cub3d.h b/includes/cub3d.h index 5b688b1..87c514a 100644 --- a/includes/cub3d.h +++ b/includes/cub3d.h @@ -6,14 +6,14 @@ /* By: madumerg +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2024/09/04 17:01:05 by madumerg #+# #+# */ -/* Updated: 2024/09/12 12:54:48 by madumerg ### ########.fr */ +/* Updated: 2024/09/17 10:40:27 by adjoly ### ########.fr */ /* */ /* ************************************************************************** */ #ifndef CUB3D_H # define CUB3D_H -# include "../libft/includes/libft.h" +# include "libft.h" # include "mess_err.h" # include # include @@ -22,5 +22,4 @@ # include # include "parsing.h" - #endif diff --git a/includes/game.h b/includes/game.h index 1aefb1e..7d7b86e 100644 --- a/includes/game.h +++ b/includes/game.h @@ -6,7 +6,7 @@ /* By: adjoly +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2024/09/11 16:38:40 by adjoly #+# #+# */ -/* Updated: 2024/09/16 13:36:04 by adjoly ### ########.fr */ +/* Updated: 2024/09/17 10:47:26 by adjoly ### ########.fr */ /* */ /* ************************************************************************** */ @@ -16,11 +16,12 @@ # include "parsing.h" # include -typedef struct s_cub +typedef struct s_cub { void *mlx; void *win; - void *images; + void *sprites; + void *img; char **map; t_coord p_coord; } t_cub; @@ -42,12 +43,13 @@ typedef struct s_cub * * @return Minilibx go brrrr(useless always 0) */ -int key_hook(int key, void *param); +int key_hook(int key, void *param); /** * @brief This function is used to create an image with the player position * - * @param cub The address of a t_cub struct filled with mlx data and other thing + * @param cub The address of a t_cub struct filled with mlx data and other + * thing * */ void *get_player_image(t_cub *cub, uint8_t key_pressed); diff --git a/src/cub3d.c b/src/cub3d.c index 452b687..8da2f09 100644 --- a/src/cub3d.c +++ b/src/cub3d.c @@ -6,7 +6,7 @@ /* By: madumerg +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2024/09/04 16:58:27 by madumerg #+# #+# */ -/* Updated: 2024/09/16 18:39:38 by adjoly ### ########.fr */ +/* Updated: 2024/09/17 10:36:01 by adjoly ### ########.fr */ /* */ /* ************************************************************************** */ @@ -24,13 +24,10 @@ int main(int ac, char **av) cub.win = mlx_new_window(cub.mlx, 400, 400, "WTF"); cub.p_coord.x = 100; cub.p_coord.y = 100; - - mlx_put_image_to_window(cub.mlx, cub.win, get_player_image(&cub, 0), 0, 0); - + cub.img = get_player_image(&cub, 0); + mlx_put_image_to_window(cub.mlx, cub.win, cub.img, 0, 0); mlx_on_event(cub.mlx, cub.win, MLX_KEYDOWN, key_hook, &cub); - mlx_loop(cub.mlx); - mlx_destroy_window(cub.mlx, cub.win); mlx_destroy_display(cub.mlx); return (0); diff --git a/src/raycasting/event_handler.c b/src/raycasting/key_hook.c similarity index 58% rename from src/raycasting/event_handler.c rename to src/raycasting/key_hook.c index 78533c1..e0a6976 100644 --- a/src/raycasting/event_handler.c +++ b/src/raycasting/key_hook.c @@ -1,12 +1,12 @@ /* ************************************************************************** */ /* */ /* ::: :::::::: */ -/* event_handler.c :+: :+: :+: */ +/* key_hook.c :+: :+: :+: */ /* +:+ +:+ +:+ */ /* By: adjoly +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2024/09/11 16:37:56 by adjoly #+# #+# */ -/* Updated: 2024/09/16 18:47:09 by adjoly ### ########.fr */ +/* Updated: 2024/09/17 10:33:35 by adjoly ### ########.fr */ /* */ /* ************************************************************************** */ @@ -21,30 +21,16 @@ int key_hook(int key, void *param) cub = (t_cub *)param; (void)cub; if (key == ESCAPE_KEY) + { mlx_loop_end(cub->mlx); - if (key == W_KEY) - { - printf("UP\n"); - mlx_clear_window(cub->mlx, cub->win); - mlx_put_image_to_window(cub->mlx, cub->win, get_player_image(cub, key), 0, 0); + mlx_destroy_image(cub->mlx, cub->img); } - if (key == S_KEY) + if (key == W_KEY || key == S_KEY || key == D_KEY || key == A_KEY) { - printf("DOWN\n"); mlx_clear_window(cub->mlx, cub->win); - mlx_put_image_to_window(cub->mlx, cub->win, get_player_image(cub, key), 0, 0); - } - if (key == D_KEY) - { - printf("RIGHT\n"); - mlx_clear_window(cub->mlx, cub->win); - mlx_put_image_to_window(cub->mlx, cub->win, get_player_image(cub, key), 0, 0); - } - if (key == A_KEY) - { - printf("LEFT\n"); - mlx_clear_window(cub->mlx, cub->win); - mlx_put_image_to_window(cub->mlx, cub->win, get_player_image(cub, key), 0, 0); + mlx_destroy_image(cub->mlx, cub->img); + cub->img = get_player_image(cub, key); + mlx_put_image_to_window(cub->mlx, cub->win, cub->img, 0, 0); } return (0); } diff --git a/src/raycasting/player_print.c b/src/raycasting/player_print.c index bcbe6e6..388b7aa 100644 --- a/src/raycasting/player_print.c +++ b/src/raycasting/player_print.c @@ -6,7 +6,7 @@ /* By: adjoly +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2024/09/13 11:05:02 by adjoly #+# #+# */ -/* Updated: 2024/09/16 18:49:37 by adjoly ### ########.fr */ +/* Updated: 2024/09/17 10:30:44 by adjoly ### ########.fr */ /* */ /* ************************************************************************** */ @@ -19,7 +19,6 @@ void *get_player_image(t_cub *cub, uint8_t key_pressed) void *img; img = mlx_new_image(cub->mlx, WINDOW_X, WINDOW_Y); - if (key_pressed == W_KEY) cub->p_coord.y--; else if (key_pressed == S_KEY) From 3e1e619497fb5f1051f00e1e93d87d979ff81105 Mon Sep 17 00:00:00 2001 From: adjoly Date: Tue, 24 Sep 2024 18:32:34 +0200 Subject: [PATCH 03/24] =?UTF-8?q?=E3=80=8C=F0=9F=8F=97=EF=B8=8F=E3=80=8D?= =?UTF-8?q?=20wip:=20Map=20is=20printing=20yayyy?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- MacroLibX | 2 +- Makefile | 14 ++--- asdf | 8 +++ includes/game.h | 58 ++++++++++++++++--- src/cub3d.c | 19 ++++-- src/raycasting/get_player_image.c | 49 ++++++++++++++++ .../draw_square.c} | 33 +++++------ src/raycasting/key_hook.c | 5 +- src/raycasting/print_map.c | 36 ++++++++++++ 9 files changed, 184 insertions(+), 40 deletions(-) create mode 100644 asdf create mode 100644 src/raycasting/get_player_image.c rename src/raycasting/{player_print.c => graphic_utils/draw_square.c} (54%) create mode 100644 src/raycasting/print_map.c diff --git a/MacroLibX b/MacroLibX index 5a09ebb..3dd68f9 160000 --- a/MacroLibX +++ b/MacroLibX @@ -1 +1 @@ -Subproject commit 5a09ebb179f8f20afa8405a6d1e29845f0952c46 +Subproject commit 3dd68f994248bfa6e6c634ca9c838dfe48b53520 diff --git a/Makefile b/Makefile index b6a727a..f6715d7 100644 --- a/Makefile +++ b/Makefile @@ -20,15 +20,15 @@ SRCS = $(shell find src -name *.c) OBJS = $(addprefix $(OBJSDIR), $(SRCS:.c=.o)) -FLAGS = -Wall -Werror -Wextra -g -lm -lSDL2 +FLAGS = -Wall -Werror -Wextra -g -lm -lSDL2 -MMD -MP LIB = libft/libft.a \ MacroLibX/libmlx.so $(NAME): $(OBJS) - @make -sj $(nproc) -C $(LIBFT_DIR) + @make -sj -C $(LIBFT_DIR) @echo "โœ… Libft compiled" - @make -sj $(nproc) -C $(MACRO_DIR) > /dev/null + @make -sj -C $(MACRO_DIR) @echo "โœ… MacroLibX compiled" @$(CC) $(FLAGS) $(OBJS) $(LIB) -o $(NAME) @echo "โœ… Compiled" @@ -40,14 +40,14 @@ $(OBJSDIR)%.o: %.c all: $(NAME) clean: - @make -s -C $(LIBFT_DIR) clean - @make -s -C $(MACRO_DIR) clean > /dev/null + @make -sC $(LIBFT_DIR) clean + @make -sC $(MACRO_DIR) clean > /dev/null @rm -f $(OBJS) fclean: clean - @make -s -C $(LIBFT_DIR) fclean + @make -sC $(LIBFT_DIR) fclean @echo "๐Ÿงน Libft Cleaned" - @make -s -C $(MACRO_DIR) fclean > /dev/null + @make -sC $(MACRO_DIR) fclean > /dev/null @echo "๐Ÿงน MacroLibX Cleaned" @rm -f $(NAME) @rm -Rf $(OBJSDIR) diff --git a/asdf b/asdf new file mode 100644 index 0000000..e7bebc5 --- /dev/null +++ b/asdf @@ -0,0 +1,8 @@ +# 1 "" +# 1 "" 1 +# 1 "" 3 +# 384 "" 3 +# 1 "" 1 +# 1 "" 2 +# 1 "" 2 + diff --git a/includes/game.h b/includes/game.h index 7d7b86e..38245d1 100644 --- a/includes/game.h +++ b/includes/game.h @@ -6,7 +6,7 @@ /* By: adjoly +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2024/09/11 16:38:40 by adjoly #+# #+# */ -/* Updated: 2024/09/17 10:47:26 by adjoly ### ########.fr */ +/* Updated: 2024/09/24 16:50:56 by adjoly ### ########.fr */ /* */ /* ************************************************************************** */ @@ -15,15 +15,24 @@ # include "parsing.h" # include +# include +# include +# include + +typedef struct s_player +{ + t_coord coords; + double direction; +} t_player; typedef struct s_cub { - void *mlx; - void *win; - void *sprites; - void *img; - char **map; - t_coord p_coord; + void *mlx; + void *win; + void *sprites; + void *img; + char **map; + t_player player; } t_cub; # define ESCAPE_KEY 41 @@ -34,6 +43,9 @@ typedef struct s_cub # define WHITE 0xFFFFFFFF # define WINDOW_Y 900 # define WINDOW_X 1600 +# define PLAYER_ROT_SPEED (2 * M_PI) / 8 +# define PLAYER_SPEED 3 +# define MAP_CHUNK_SIZE 64 /** * @brief This function is used to handle keypress @@ -52,6 +64,36 @@ int key_hook(int key, void *param); * thing * */ -void *get_player_image(t_cub *cub, uint8_t key_pressed); +void get_player_image(t_cub *cub, uint8_t key_pressed); +/** + * @brief This function is here to change the direction of the player + * by setting the t_player->direction and check overflow to be + * sure it stays between 0 and 2pi because it is expressed in + * radians + * + * @param speed The speed a which the player rotate + * @param clockwise The direction which the player rotate + * @param player A pointer to a t_player struct + * + */ +void change_direction(double speed, bool clockwise, t_player *player); + +/** + * @brief Function used to draw a square + * + * @param cub The adress of a t_cub struct + * @param coord The coordinate of the printed square + * @param size The size of the printed square + * @param color The color of the printed square + * + */ +void draw_square(t_cub *cub, t_coord coord, uint16_t size, int color); + +/** + * @brief Function used to draw the map + * + * @param cub The address of the t_cub struct + */ +void print_map(t_cub *cub); #endif diff --git a/src/cub3d.c b/src/cub3d.c index 8da2f09..bdd9239 100644 --- a/src/cub3d.c +++ b/src/cub3d.c @@ -6,7 +6,7 @@ /* By: madumerg +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2024/09/04 16:58:27 by madumerg #+# #+# */ -/* Updated: 2024/09/17 10:36:01 by adjoly ### ########.fr */ +/* Updated: 2024/09/24 18:31:05 by adjoly ### ########.fr */ /* */ /* ************************************************************************** */ @@ -18,13 +18,22 @@ int main(int ac, char **av) { t_cub cub; + cub.map = (char *[]){ + "1111111\0", + "1000101\0", + "1000101\0", + "1000001\0", + "1111111\0", + NULL + }; (void)ac; (void)av; cub.mlx = mlx_init(); - cub.win = mlx_new_window(cub.mlx, 400, 400, "WTF"); - cub.p_coord.x = 100; - cub.p_coord.y = 100; - cub.img = get_player_image(&cub, 0); + cub.win = mlx_new_window(cub.mlx, 600, 600, "WTF"); + cub.player.coords.x = 100; + cub.player.coords.y = 100; + cub.img = mlx_new_image(cub.mlx, 600, 600); + get_player_image(&cub, 0); mlx_put_image_to_window(cub.mlx, cub.win, cub.img, 0, 0); mlx_on_event(cub.mlx, cub.win, MLX_KEYDOWN, key_hook, &cub); mlx_loop(cub.mlx); diff --git a/src/raycasting/get_player_image.c b/src/raycasting/get_player_image.c new file mode 100644 index 0000000..0cc6fc4 --- /dev/null +++ b/src/raycasting/get_player_image.c @@ -0,0 +1,49 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* get_player_image.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: adjoly +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2024/09/13 11:05:02 by adjoly #+# #+# */ +/* Updated: 2024/09/24 14:40:23 by adjoly ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "game.h" +#include "mlx.h" +#include "stdio.h" + +void change_direction(double speed, bool clockwise, t_player *player) +{ + if (clockwise) + player->direction -= speed; + else + player->direction += speed; + if (player->direction >= 2 * M_PI) + player->direction -= 2 * M_PI; + else if (player->direction < 0) + player->direction += 2 * M_PI; + printf("%f\n", player->direction); +} + +void get_player_image(t_cub *cub, uint8_t key_pressed) +{ + if (key_pressed == W_KEY) + { + cub->player.coords.x += PLAYER_SPEED * cos(cub->player.direction); + cub->player.coords.y += PLAYER_SPEED * sin(cub->player.direction); + } + else if (key_pressed == S_KEY) + { + cub->player.coords.x -= PLAYER_SPEED * cos(cub->player.direction); + cub->player.coords.y -= PLAYER_SPEED * sin(cub->player.direction); + } + else if (key_pressed == D_KEY) + change_direction(PLAYER_ROT_SPEED, false, &cub->player); + else if (key_pressed == A_KEY) + change_direction(PLAYER_ROT_SPEED, true, &cub->player); + print_map(cub); + draw_square(cub, (t_coord){cub->player.coords.x - 2, cub->player.coords.y - 2}, \ + 5, WHITE); +} diff --git a/src/raycasting/player_print.c b/src/raycasting/graphic_utils/draw_square.c similarity index 54% rename from src/raycasting/player_print.c rename to src/raycasting/graphic_utils/draw_square.c index 388b7aa..b847ad0 100644 --- a/src/raycasting/player_print.c +++ b/src/raycasting/graphic_utils/draw_square.c @@ -1,32 +1,31 @@ /* ************************************************************************** */ /* */ /* ::: :::::::: */ -/* player_print.c :+: :+: :+: */ +/* draw_square.c :+: :+: :+: */ /* +:+ +:+ +:+ */ /* By: adjoly +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ -/* Created: 2024/09/13 11:05:02 by adjoly #+# #+# */ -/* Updated: 2024/09/17 10:30:44 by adjoly ### ########.fr */ +/* Created: 2024/09/17 11:09:52 by adjoly #+# #+# */ +/* Updated: 2024/09/23 14:05:54 by adjoly ### ########.fr */ /* */ /* ************************************************************************** */ #include "game.h" -#include #include "mlx.h" -void *get_player_image(t_cub *cub, uint8_t key_pressed) +void draw_square(t_cub *cub, t_coord coord, uint16_t size, int color) { - void *img; + t_coord start; - img = mlx_new_image(cub->mlx, WINDOW_X, WINDOW_Y); - if (key_pressed == W_KEY) - cub->p_coord.y--; - else if (key_pressed == S_KEY) - cub->p_coord.y++; - else if (key_pressed == D_KEY) - cub->p_coord.x++; - else if (key_pressed == A_KEY) - cub->p_coord.x--; - mlx_set_image_pixel(cub->mlx, img, cub->p_coord.x, cub->p_coord.y, WHITE); - return (img); + start = coord; + while (coord.x - start.x <= size) + { + coord.y = start.y; + while (coord.y - start.y <= size) + { + mlx_set_image_pixel(cub->mlx, cub->img, coord.x, coord.y, color); + coord.y++; + } + coord.x++; + } } diff --git a/src/raycasting/key_hook.c b/src/raycasting/key_hook.c index e0a6976..f49e924 100644 --- a/src/raycasting/key_hook.c +++ b/src/raycasting/key_hook.c @@ -6,7 +6,7 @@ /* By: adjoly +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2024/09/11 16:37:56 by adjoly #+# #+# */ -/* Updated: 2024/09/17 10:33:35 by adjoly ### ########.fr */ +/* Updated: 2024/09/23 14:41:31 by adjoly ### ########.fr */ /* */ /* ************************************************************************** */ @@ -29,7 +29,8 @@ int key_hook(int key, void *param) { mlx_clear_window(cub->mlx, cub->win); mlx_destroy_image(cub->mlx, cub->img); - cub->img = get_player_image(cub, key); + cub->img = mlx_new_image(cub->mlx, 600, 600); + get_player_image(cub, key); mlx_put_image_to_window(cub->mlx, cub->win, cub->img, 0, 0); } return (0); diff --git a/src/raycasting/print_map.c b/src/raycasting/print_map.c new file mode 100644 index 0000000..9c8e56a --- /dev/null +++ b/src/raycasting/print_map.c @@ -0,0 +1,36 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* print_map.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: adjoly +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2024/09/23 14:09:17 by adjoly #+# #+# */ +/* Updated: 2024/09/23 14:41:51 by adjoly ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "game.h" +#include "mlx.h" +#include + +void print_map(t_cub *cub) +{ + size_t i; + size_t j; + + i = 0; + while (cub->map[i]) + { + j = 0; + while (cub->map[i][j]) + { + if (cub->map[i][j] == '1') + { + draw_square(cub, (t_coord){j * MAP_CHUNK_SIZE, i * MAP_CHUNK_SIZE}, MAP_CHUNK_SIZE, WHITE); + } + j++; + } + i++; + } +} From d4106157df03a984a6068c5904d806f166912123 Mon Sep 17 00:00:00 2001 From: Adam Joly Date: Sat, 28 Sep 2024 17:39:12 +0200 Subject: [PATCH 04/24] =?UTF-8?q?=E3=80=8C=F0=9F=94=A8=E3=80=8D=20fix(Make?= =?UTF-8?q?file):=20compilation=20flag=20fixed?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Makefile b/Makefile index f6715d7..9d2457d 100644 --- a/Makefile +++ b/Makefile @@ -30,7 +30,7 @@ $(NAME): $(OBJS) @echo "โœ… Libft compiled" @make -sj -C $(MACRO_DIR) @echo "โœ… MacroLibX compiled" - @$(CC) $(FLAGS) $(OBJS) $(LIB) -o $(NAME) + @$(CC) $(OBJS) $(LIB) -o $(NAME) $(FLAGS) @echo "โœ… Compiled" $(OBJSDIR)%.o: %.c From e11c60b80835a3c33c5f460355160ac0f1f98c03 Mon Sep 17 00:00:00 2001 From: Adam Joly Date: Sun, 29 Sep 2024 16:57:10 +0200 Subject: [PATCH 05/24] =?UTF-8?q?=E3=80=8C=E2=9C=A8=E3=80=8D=20feat:=20Add?= =?UTF-8?q?ed=20get=5Fray=5Fangle=20function?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- asdf | 8 ------ includes/game.h | 43 +++++++++++++++++++------------ src/cub3d.c | 6 ++--- src/raycasting/get_player_image.c | 2 +- src/raycasting/get_ray_angle.c | 28 ++++++++++++++++++++ src/raycasting/key_hook.c | 4 +-- 6 files changed, 60 insertions(+), 31 deletions(-) delete mode 100644 asdf create mode 100644 src/raycasting/get_ray_angle.c diff --git a/asdf b/asdf deleted file mode 100644 index e7bebc5..0000000 --- a/asdf +++ /dev/null @@ -1,8 +0,0 @@ -# 1 "" -# 1 "" 1 -# 1 "" 3 -# 384 "" 3 -# 1 "" 1 -# 1 "" 2 -# 1 "" 2 - diff --git a/includes/game.h b/includes/game.h index 38245d1..02a5b4a 100644 --- a/includes/game.h +++ b/includes/game.h @@ -6,7 +6,7 @@ /* By: adjoly +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2024/09/11 16:38:40 by adjoly #+# #+# */ -/* Updated: 2024/09/24 16:50:56 by adjoly ### ########.fr */ +/* Updated: 2024/09/29 16:47:32 by adjoly ### ########.fr */ /* */ /* ************************************************************************** */ @@ -19,22 +19,6 @@ # include # include -typedef struct s_player -{ - t_coord coords; - double direction; -} t_player; - -typedef struct s_cub -{ - void *mlx; - void *win; - void *sprites; - void *img; - char **map; - t_player player; -} t_cub; - # define ESCAPE_KEY 41 # define W_KEY 26 # define S_KEY 22 @@ -46,6 +30,31 @@ typedef struct s_cub # define PLAYER_ROT_SPEED (2 * M_PI) / 8 # define PLAYER_SPEED 3 # define MAP_CHUNK_SIZE 64 +# define RAY_SIZE 2 +# define FOV 60 * (M_PI / 180) + +typedef struct s_ray_dir +{ + float x; + float y; +} t_ray_dir; + +typedef struct s_player +{ + t_coord coords; + double direction; + t_ray_dir ray_dir[WINDOW_X / RAY_SIZE]; +} t_player; + +typedef struct s_cub +{ + void *mlx; + void *win; + void *sprites; + void *img; + char **map; + t_player player; +} t_cub; /** * @brief This function is used to handle keypress diff --git a/src/cub3d.c b/src/cub3d.c index bdd9239..c61b2ad 100644 --- a/src/cub3d.c +++ b/src/cub3d.c @@ -6,7 +6,7 @@ /* By: madumerg +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2024/09/04 16:58:27 by madumerg #+# #+# */ -/* Updated: 2024/09/24 18:31:05 by adjoly ### ########.fr */ +/* Updated: 2024/09/29 14:44:07 by adjoly ### ########.fr */ /* */ /* ************************************************************************** */ @@ -29,10 +29,10 @@ int main(int ac, char **av) (void)ac; (void)av; cub.mlx = mlx_init(); - cub.win = mlx_new_window(cub.mlx, 600, 600, "WTF"); + cub.win = mlx_new_window(cub.mlx, WINDOW_X, WINDOW_Y, "WTF"); cub.player.coords.x = 100; cub.player.coords.y = 100; - cub.img = mlx_new_image(cub.mlx, 600, 600); + cub.img = mlx_new_image(cub.mlx, WINDOW_X, WINDOW_Y); get_player_image(&cub, 0); mlx_put_image_to_window(cub.mlx, cub.win, cub.img, 0, 0); mlx_on_event(cub.mlx, cub.win, MLX_KEYDOWN, key_hook, &cub); diff --git a/src/raycasting/get_player_image.c b/src/raycasting/get_player_image.c index 0cc6fc4..e20ffa7 100644 --- a/src/raycasting/get_player_image.c +++ b/src/raycasting/get_player_image.c @@ -6,7 +6,7 @@ /* By: adjoly +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2024/09/13 11:05:02 by adjoly #+# #+# */ -/* Updated: 2024/09/24 14:40:23 by adjoly ### ########.fr */ +/* Updated: 2024/09/29 14:44:28 by adjoly ### ########.fr */ /* */ /* ************************************************************************** */ diff --git a/src/raycasting/get_ray_angle.c b/src/raycasting/get_ray_angle.c new file mode 100644 index 0000000..0a05f02 --- /dev/null +++ b/src/raycasting/get_ray_angle.c @@ -0,0 +1,28 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* get_ray_angle.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: adjoly +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2024/09/29 15:26:29 by adjoly #+# #+# */ +/* Updated: 2024/09/29 16:46:44 by adjoly ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "game.h" + +void get_ray_angle(t_player *player) +{ + uint16_t x; + float ray_angle; + + x = 0; + while (x < WINDOW_X) + { + ray_angle = player->direction - (FOV / 2) + (x / WINDOW_X) * FOV; + player->ray_angle[x / RAY_SIZE].x = cos(ray_angle); + player->ray_angle[x / RAY_SIZE].y = sin(ray_angle); + x += RAY_SIZE; + } +} diff --git a/src/raycasting/key_hook.c b/src/raycasting/key_hook.c index f49e924..c0db844 100644 --- a/src/raycasting/key_hook.c +++ b/src/raycasting/key_hook.c @@ -6,7 +6,7 @@ /* By: adjoly +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2024/09/11 16:37:56 by adjoly #+# #+# */ -/* Updated: 2024/09/23 14:41:31 by adjoly ### ########.fr */ +/* Updated: 2024/09/29 14:45:02 by adjoly ### ########.fr */ /* */ /* ************************************************************************** */ @@ -29,7 +29,7 @@ int key_hook(int key, void *param) { mlx_clear_window(cub->mlx, cub->win); mlx_destroy_image(cub->mlx, cub->img); - cub->img = mlx_new_image(cub->mlx, 600, 600); + cub->img = mlx_new_image(cub->mlx, WINDOW_X, WINDOW_Y); get_player_image(cub, key); mlx_put_image_to_window(cub->mlx, cub->win, cub->img, 0, 0); } From c7fd02590a1d5b7113c77ee34359682c65fa93f2 Mon Sep 17 00:00:00 2001 From: Adam Joly Date: Mon, 7 Oct 2024 11:25:31 +0200 Subject: [PATCH 06/24] =?UTF-8?q?=E3=80=8C=F0=9F=8F=97=EF=B8=8F=E3=80=8D?= =?UTF-8?q?=20wip:=20DDA=20setup=20finished=20and=20loop=20started?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- MacroLibX | 2 +- includes/game/constant.h | 18 ++++++ includes/game/dda.h | 26 +++++++++ includes/{ => game}/game.h | 44 +++------------ includes/game/settings.h | 32 +++++++++++ includes/game/typedef.h | 64 ++++++++++++++++++++++ src/cub3d.c | 4 +- src/raycasting/dda_while.c | 35 ++++++++++++ src/raycasting/get_player_image.c | 8 +-- src/raycasting/get_ray_angle.c | 10 ++-- src/raycasting/graphic_utils/draw_square.c | 4 +- src/raycasting/key_hook.c | 5 +- src/raycasting/print_map.c | 4 +- src/raycasting/setup_dda.c | 58 ++++++++++++++++++++ 14 files changed, 258 insertions(+), 56 deletions(-) create mode 100644 includes/game/constant.h create mode 100644 includes/game/dda.h rename includes/{ => game}/game.h (78%) create mode 100644 includes/game/settings.h create mode 100644 includes/game/typedef.h create mode 100644 src/raycasting/dda_while.c create mode 100644 src/raycasting/setup_dda.c diff --git a/MacroLibX b/MacroLibX index 3dd68f9..4d640ed 160000 --- a/MacroLibX +++ b/MacroLibX @@ -1 +1 @@ -Subproject commit 3dd68f994248bfa6e6c634ca9c838dfe48b53520 +Subproject commit 4d640ed70cd392f3e3311fe2779905876b7f1b6f diff --git a/includes/game/constant.h b/includes/game/constant.h new file mode 100644 index 0000000..25bf300 --- /dev/null +++ b/includes/game/constant.h @@ -0,0 +1,18 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* constant.h :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: adjoly +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2024/10/04 16:39:48 by adjoly #+# #+# */ +/* Updated: 2024/10/04 16:40:10 by adjoly ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#ifndef CONSTANT_H +# define CONSTANT_H + +# define WHITE 0xFFFFFFFF + +#endif diff --git a/includes/game/dda.h b/includes/game/dda.h new file mode 100644 index 0000000..685e43f --- /dev/null +++ b/includes/game/dda.h @@ -0,0 +1,26 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* dda.h :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: adjoly +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2024/10/04 14:04:10 by adjoly #+# #+# */ +/* Updated: 2024/10/06 18:48:38 by adjoly ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#ifndef DDA_H +# define DDA_H + +# include "typedef.h" + +/** + * @brief Function used to get all the ray angle + * + * @param player The address of the t_player struct + * @param dda The address of the t_dda struct + */ +void get_ray_angle(t_player *player, t_dda (*dda)[800]); + +#endif diff --git a/includes/game.h b/includes/game/game.h similarity index 78% rename from includes/game.h rename to includes/game/game.h index 02a5b4a..b2b71df 100644 --- a/includes/game.h +++ b/includes/game/game.h @@ -6,55 +6,24 @@ /* By: adjoly +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2024/09/11 16:38:40 by adjoly #+# #+# */ -/* Updated: 2024/09/29 16:47:32 by adjoly ### ########.fr */ +/* Updated: 2024/10/06 18:48:33 by adjoly ### ########.fr */ /* */ /* ************************************************************************** */ #ifndef GAME_H # define GAME_H +# include "dda.h" +# include "settings.h" # include "parsing.h" +# include "typedef.h" + # include +# include # include # include # include -# define ESCAPE_KEY 41 -# define W_KEY 26 -# define S_KEY 22 -# define A_KEY 4 -# define D_KEY 7 -# define WHITE 0xFFFFFFFF -# define WINDOW_Y 900 -# define WINDOW_X 1600 -# define PLAYER_ROT_SPEED (2 * M_PI) / 8 -# define PLAYER_SPEED 3 -# define MAP_CHUNK_SIZE 64 -# define RAY_SIZE 2 -# define FOV 60 * (M_PI / 180) - -typedef struct s_ray_dir -{ - float x; - float y; -} t_ray_dir; - -typedef struct s_player -{ - t_coord coords; - double direction; - t_ray_dir ray_dir[WINDOW_X / RAY_SIZE]; -} t_player; - -typedef struct s_cub -{ - void *mlx; - void *win; - void *sprites; - void *img; - char **map; - t_player player; -} t_cub; /** * @brief This function is used to handle keypress @@ -105,4 +74,5 @@ void draw_square(t_cub *cub, t_coord coord, uint16_t size, int color); * @param cub The address of the t_cub struct */ void print_map(t_cub *cub); + #endif diff --git a/includes/game/settings.h b/includes/game/settings.h new file mode 100644 index 0000000..13294b9 --- /dev/null +++ b/includes/game/settings.h @@ -0,0 +1,32 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* settings.h :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: adjoly +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2024/10/04 14:06:39 by adjoly #+# #+# */ +/* Updated: 2024/10/04 16:38:10 by adjoly ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#ifndef SETTINGS_H +# define SETTINGS_H + +// Key code +# define ESCAPE_KEY 41 +# define W_KEY 26 +# define S_KEY 22 +# define A_KEY 4 +# define D_KEY 7 + +# define WHITE 0xFFFFFFFF +# define WINDOW_Y 900 +# define WINDOW_X 1600 +# define PLAYER_ROT_SPEED (2 * M_PI) / 8 +# define PLAYER_SPEED 3 +# define MAP_CHUNK_SIZE 64 +# define RAY_SIZE 2 +# define FOV 60 * (M_PI / 180) + +#endif diff --git a/includes/game/typedef.h b/includes/game/typedef.h new file mode 100644 index 0000000..b0e4435 --- /dev/null +++ b/includes/game/typedef.h @@ -0,0 +1,64 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* typedef.h :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: adjoly +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2024/10/04 14:28:24 by adjoly #+# #+# */ +/* Updated: 2024/10/06 19:03:26 by adjoly ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#ifndef STRUCT_H +# define STRUCT_H + +# include "parsing.h" +# include + +typedef struct s_coord_f +{ + float x; + float y; +} t_coord_f; + +typedef struct s_step +{ + char x; + char y; +} t_step; + +typedef struct s_player +{ + t_coord coords; + double direction; +} t_player; + +typedef struct s_cub +{ + void *mlx; + void *win; + void *sprites; + void *img; + char **map; + t_player player; +} t_cub; + +typedef enum s_wall_side +{ + HORIZONTAL, + VERTICAL +} t_wall_side; + +typedef struct s_dda +{ + t_coord_f ray_dir; + t_coord_f side_dist; + t_coord_f delta_dist; + t_step step; + t_wall_side wall_side; + bool wall_hit; + +} t_dda; + +#endif diff --git a/src/cub3d.c b/src/cub3d.c index c61b2ad..185ba1c 100644 --- a/src/cub3d.c +++ b/src/cub3d.c @@ -6,12 +6,12 @@ /* By: madumerg +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2024/09/04 16:58:27 by madumerg #+# #+# */ -/* Updated: 2024/09/29 14:44:07 by adjoly ### ########.fr */ +/* Updated: 2024/10/06 17:58:41 by adjoly ### ########.fr */ /* */ /* ************************************************************************** */ #include "cub3d.h" -#include "game.h" +#include "game/game.h" #include "mlx.h" int main(int ac, char **av) diff --git a/src/raycasting/dda_while.c b/src/raycasting/dda_while.c new file mode 100644 index 0000000..f417fda --- /dev/null +++ b/src/raycasting/dda_while.c @@ -0,0 +1,35 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* dda_while.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: adjoly +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2024/10/06 18:46:56 by adjoly #+# #+# */ +/* Updated: 2024/10/06 19:05:11 by adjoly ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "game/game.h" + +void dda_while(t_dda *dda, char **map, t_coord map_coord) +{ + dda->wall_hit = false; + while (!dda->wall_hit) + { + if (dda->side_dist.x < dda->side_dist.y) + { + dda->side_dist.x += dda->delta_dist.x; + map_coord.x += dda->step.x; + dda->wall_side = HORIZONTAL; + } + else + { + dda->side_dist.y += dda->delta_dist.y; + map_coord.y += dda->step.y; + dda->wall_side = VERTICAL; + } + if (map[map_coord.x][map_coord.y] == '1') + dda->wall_hit = true; + } +} diff --git a/src/raycasting/get_player_image.c b/src/raycasting/get_player_image.c index e20ffa7..2c0506b 100644 --- a/src/raycasting/get_player_image.c +++ b/src/raycasting/get_player_image.c @@ -6,13 +6,12 @@ /* By: adjoly +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2024/09/13 11:05:02 by adjoly #+# #+# */ -/* Updated: 2024/09/29 14:44:28 by adjoly ### ########.fr */ +/* Updated: 2024/10/05 14:30:08 by adjoly ### ########.fr */ /* */ /* ************************************************************************** */ -#include "game.h" -#include "mlx.h" -#include "stdio.h" +#include "game/game.h" +#include void change_direction(double speed, bool clockwise, t_player *player) { @@ -24,7 +23,6 @@ void change_direction(double speed, bool clockwise, t_player *player) player->direction -= 2 * M_PI; else if (player->direction < 0) player->direction += 2 * M_PI; - printf("%f\n", player->direction); } void get_player_image(t_cub *cub, uint8_t key_pressed) diff --git a/src/raycasting/get_ray_angle.c b/src/raycasting/get_ray_angle.c index 0a05f02..71d3626 100644 --- a/src/raycasting/get_ray_angle.c +++ b/src/raycasting/get_ray_angle.c @@ -6,13 +6,13 @@ /* By: adjoly +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2024/09/29 15:26:29 by adjoly #+# #+# */ -/* Updated: 2024/09/29 16:46:44 by adjoly ### ########.fr */ +/* Updated: 2024/10/06 17:58:04 by adjoly ### ########.fr */ /* */ /* ************************************************************************** */ -#include "game.h" +#include "game/game.h" -void get_ray_angle(t_player *player) +void get_ray_angle(t_player *player, t_dda (*dda)[800]) { uint16_t x; float ray_angle; @@ -21,8 +21,8 @@ void get_ray_angle(t_player *player) while (x < WINDOW_X) { ray_angle = player->direction - (FOV / 2) + (x / WINDOW_X) * FOV; - player->ray_angle[x / RAY_SIZE].x = cos(ray_angle); - player->ray_angle[x / RAY_SIZE].y = sin(ray_angle); + dda[x / RAY_SIZE]->ray_dir.x = cos(ray_angle); + dda[x / RAY_SIZE]->ray_dir.y = sin(ray_angle); x += RAY_SIZE; } } diff --git a/src/raycasting/graphic_utils/draw_square.c b/src/raycasting/graphic_utils/draw_square.c index b847ad0..3f82596 100644 --- a/src/raycasting/graphic_utils/draw_square.c +++ b/src/raycasting/graphic_utils/draw_square.c @@ -6,11 +6,11 @@ /* By: adjoly +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2024/09/17 11:09:52 by adjoly #+# #+# */ -/* Updated: 2024/09/23 14:05:54 by adjoly ### ########.fr */ +/* Updated: 2024/10/06 15:41:55 by adjoly ### ########.fr */ /* */ /* ************************************************************************** */ -#include "game.h" +#include "game/game.h" #include "mlx.h" void draw_square(t_cub *cub, t_coord coord, uint16_t size, int color) diff --git a/src/raycasting/key_hook.c b/src/raycasting/key_hook.c index c0db844..34ae44e 100644 --- a/src/raycasting/key_hook.c +++ b/src/raycasting/key_hook.c @@ -6,13 +6,14 @@ /* By: adjoly +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2024/09/11 16:37:56 by adjoly #+# #+# */ -/* Updated: 2024/09/29 14:45:02 by adjoly ### ########.fr */ +/* Updated: 2024/10/04 15:29:00 by adjoly ### ########.fr */ /* */ /* ************************************************************************** */ #include #include "mlx.h" -#include "game.h" +#include "parsing.h" +#include "game/game.h" int key_hook(int key, void *param) { diff --git a/src/raycasting/print_map.c b/src/raycasting/print_map.c index 9c8e56a..a129f79 100644 --- a/src/raycasting/print_map.c +++ b/src/raycasting/print_map.c @@ -6,11 +6,11 @@ /* By: adjoly +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2024/09/23 14:09:17 by adjoly #+# #+# */ -/* Updated: 2024/09/23 14:41:51 by adjoly ### ########.fr */ +/* Updated: 2024/10/06 17:58:25 by adjoly ### ########.fr */ /* */ /* ************************************************************************** */ -#include "game.h" +#include "game/game.h" #include "mlx.h" #include diff --git a/src/raycasting/setup_dda.c b/src/raycasting/setup_dda.c new file mode 100644 index 0000000..1801b12 --- /dev/null +++ b/src/raycasting/setup_dda.c @@ -0,0 +1,58 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* setup_dda.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: adjoly +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2024/09/30 23:47:14 by adjoly #+# #+# */ +/* Updated: 2024/10/06 19:02:43 by adjoly ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "game/game.h" +#include +#include + +void get_side_dist(t_dda *dda, t_coord incell_coords, t_player *player) +{ + if (dda->ray_dir.x < 0) + { + dda->side_dist.x = incell_coords.x * dda->delta_dist.x; + dda->step.x = -MAP_CHUNK_SIZE; + } + else + { + dda->side_dist.x = (((int)player->coords.x + MAP_CHUNK_SIZE) - player->coords.x) * dda->delta_dist.x; + dda->step.x = MAP_CHUNK_SIZE; + } + if (dda->ray_dir.y < 0) + { + dda->side_dist.y = incell_coords.y * dda->delta_dist.y; + dda->step.y = -MAP_CHUNK_SIZE; + } + else + { + dda->side_dist.y = (((int)player->coords.y + MAP_CHUNK_SIZE) - player->coords.y) * dda->delta_dist.y; + dda->step.y = MAP_CHUNK_SIZE; + } +} + +void setup_dda(t_player *player) +{ + t_dda dda[WINDOW_X / RAY_SIZE]; + size_t i; + t_coord incell_coords; + + i = 0; + get_ray_angle(player, &dda); + incell_coords.x = player->coords.x % MAP_CHUNK_SIZE; + incell_coords.y = player->coords.y % MAP_CHUNK_SIZE; + while (i < WINDOW_X / RAY_SIZE) + { + dda[i].delta_dist.x = abs((int)(MAP_CHUNK_SIZE / dda[i].ray_dir.x)); + dda[i].delta_dist.y = abs((int)(MAP_CHUNK_SIZE / dda[i].ray_dir.y)); + get_side_dist(&dda[i], incell_coords, player); + i++; + } +} From 1b5c1a4d019dcb15c9592ae812c67394f3fd3efd Mon Sep 17 00:00:00 2001 From: Adam Joly Date: Mon, 7 Oct 2024 19:07:28 +0200 Subject: [PATCH 07/24] =?UTF-8?q?=E3=80=8C=F0=9F=8F=97=EF=B8=8F=E3=80=8D?= =?UTF-8?q?=20wip(DDA):=20Started=20puting=20everything=20together?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Makefile | 22 ++++++++--- includes/game/dda.h | 21 ++++++++++- src/raycasting/dda/dda.c | 37 +++++++++++++++++++ src/raycasting/{ => dda}/get_ray_angle.c | 7 +++- src/raycasting/{ => dda}/setup_dda.c | 17 +++++---- .../{dda_while.c => dda/while_dda.c} | 8 ++-- 6 files changed, 92 insertions(+), 20 deletions(-) create mode 100644 src/raycasting/dda/dda.c rename src/raycasting/{ => dda}/get_ray_angle.c (88%) rename src/raycasting/{ => dda}/setup_dda.c (80%) rename src/raycasting/{dda_while.c => dda/while_dda.c} (84%) diff --git a/Makefile b/Makefile index 9d2457d..65a0860 100644 --- a/Makefile +++ b/Makefile @@ -1,3 +1,15 @@ +# **************************************************************************** # +# # +# ::: :::::::: # +# Makefile :+: :+: :+: # +# +:+ +:+ +:+ # +# By: adjoly +#+ +:+ +#+ # +# +#+#+#+#+#+ +#+ # +# Created: 2024/10/07 16:02:18 by adjoly #+# #+# # +# Updated: 2024/10/07 16:02:44 by adjoly ### ########.fr # +# # +# **************************************************************************** # + SHELL = bash NAME = cub3D @@ -28,8 +40,8 @@ LIB = libft/libft.a \ $(NAME): $(OBJS) @make -sj -C $(LIBFT_DIR) @echo "โœ… Libft compiled" - @make -sj -C $(MACRO_DIR) - @echo "โœ… MacroLibX compiled" + @#@make -sj -C $(MACRO_DIR) + @#@echo "โœ… MacroLibX compiled" @$(CC) $(OBJS) $(LIB) -o $(NAME) $(FLAGS) @echo "โœ… Compiled" @@ -41,14 +53,14 @@ all: $(NAME) clean: @make -sC $(LIBFT_DIR) clean - @make -sC $(MACRO_DIR) clean > /dev/null + @#@make -sC $(MACRO_DIR) clean > /dev/null @rm -f $(OBJS) fclean: clean @make -sC $(LIBFT_DIR) fclean @echo "๐Ÿงน Libft Cleaned" - @make -sC $(MACRO_DIR) fclean > /dev/null - @echo "๐Ÿงน MacroLibX Cleaned" + @#@make -sC $(MACRO_DIR) fclean > /dev/null + @#@echo "๐Ÿงน MacroLibX Cleaned" @rm -f $(NAME) @rm -Rf $(OBJSDIR) @echo "๐Ÿงน Cleaned" diff --git a/includes/game/dda.h b/includes/game/dda.h index 685e43f..0840146 100644 --- a/includes/game/dda.h +++ b/includes/game/dda.h @@ -6,7 +6,7 @@ /* By: adjoly +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2024/10/04 14:04:10 by adjoly #+# #+# */ -/* Updated: 2024/10/06 18:48:38 by adjoly ### ########.fr */ +/* Updated: 2024/10/07 17:42:00 by adjoly ### ########.fr */ /* */ /* ************************************************************************** */ @@ -23,4 +23,23 @@ */ void get_ray_angle(t_player *player, t_dda (*dda)[800]); +/** + * @brief Function used to setup all the dda variable prior to casting + * the rays + * + * @param player The address of the t_player struct + * @param dda The address of the t_dda struct + * + */ +void setup_dda(t_dda (*dda)[800], t_player *player); + +/** + * @brief Function used to cast all the rays + * + * @param dda The address of the t_dda struct + * @param map The map as a char ** + * @param map_coord The coordinate of the player on the map_grid + */ +void while_dda(t_dda (*dda)[800], char **map, t_coord map_coord); + #endif diff --git a/src/raycasting/dda/dda.c b/src/raycasting/dda/dda.c new file mode 100644 index 0000000..6683c9f --- /dev/null +++ b/src/raycasting/dda/dda.c @@ -0,0 +1,37 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* dda.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: adjoly +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2024/10/07 16:55:09 by adjoly #+# #+# */ +/* Updated: 2024/10/07 19:04:07 by adjoly ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "game/dda.h" +#include "game/settings.h" + +void dda(t_player *player, char **map) +{ + t_dda dda[800]; + t_coord map_coord; + + setup_dda(&dda, player); + map_coord.x = player->coords.x - player->coords.x % MAP_CHUNK_SIZE; + map_coord.y = player->coords.y - player->coords.y % MAP_CHUNK_SIZE; + while_dda(&dda, map, map_coord); + +} + +/** +* calculate distance from wall +* perp_wall_dist = (map_y - player_y + (1 - step_y) / 2) / ray_dir_y +* +* calculate size on screen +* screen_height / per_wall_dist +* +* print on screen +* +*/ diff --git a/src/raycasting/get_ray_angle.c b/src/raycasting/dda/get_ray_angle.c similarity index 88% rename from src/raycasting/get_ray_angle.c rename to src/raycasting/dda/get_ray_angle.c index 71d3626..491bcef 100644 --- a/src/raycasting/get_ray_angle.c +++ b/src/raycasting/dda/get_ray_angle.c @@ -6,11 +6,14 @@ /* By: adjoly +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2024/09/29 15:26:29 by adjoly #+# #+# */ -/* Updated: 2024/10/06 17:58:04 by adjoly ### ########.fr */ +/* Updated: 2024/10/07 19:06:47 by adjoly ### ########.fr */ /* */ /* ************************************************************************** */ -#include "game/game.h" +#include "game/dda.h" +#include "game/settings.h" +#include +#include void get_ray_angle(t_player *player, t_dda (*dda)[800]) { diff --git a/src/raycasting/setup_dda.c b/src/raycasting/dda/setup_dda.c similarity index 80% rename from src/raycasting/setup_dda.c rename to src/raycasting/dda/setup_dda.c index 1801b12..b9aef2f 100644 --- a/src/raycasting/setup_dda.c +++ b/src/raycasting/dda/setup_dda.c @@ -6,11 +6,13 @@ /* By: adjoly +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2024/09/30 23:47:14 by adjoly #+# #+# */ -/* Updated: 2024/10/06 19:02:43 by adjoly ### ########.fr */ +/* Updated: 2024/10/07 19:05:59 by adjoly ### ########.fr */ /* */ /* ************************************************************************** */ -#include "game/game.h" +#include "game/settings.h" +#include "game/dda.h" +#include #include #include @@ -38,21 +40,20 @@ void get_side_dist(t_dda *dda, t_coord incell_coords, t_player *player) } } -void setup_dda(t_player *player) +void setup_dda(t_dda (*dda)[800], t_player *player) { - t_dda dda[WINDOW_X / RAY_SIZE]; size_t i; t_coord incell_coords; i = 0; - get_ray_angle(player, &dda); + get_ray_angle(player, dda); incell_coords.x = player->coords.x % MAP_CHUNK_SIZE; incell_coords.y = player->coords.y % MAP_CHUNK_SIZE; while (i < WINDOW_X / RAY_SIZE) { - dda[i].delta_dist.x = abs((int)(MAP_CHUNK_SIZE / dda[i].ray_dir.x)); - dda[i].delta_dist.y = abs((int)(MAP_CHUNK_SIZE / dda[i].ray_dir.y)); - get_side_dist(&dda[i], incell_coords, player); + dda[i]->delta_dist.x = abs((int)(MAP_CHUNK_SIZE / dda[i]->ray_dir.x)); + dda[i]->delta_dist.y = abs((int)(MAP_CHUNK_SIZE / dda[i]->ray_dir.y)); + get_side_dist(dda[i], incell_coords, player); i++; } } diff --git a/src/raycasting/dda_while.c b/src/raycasting/dda/while_dda.c similarity index 84% rename from src/raycasting/dda_while.c rename to src/raycasting/dda/while_dda.c index f417fda..91896f2 100644 --- a/src/raycasting/dda_while.c +++ b/src/raycasting/dda/while_dda.c @@ -1,18 +1,18 @@ /* ************************************************************************** */ /* */ /* ::: :::::::: */ -/* dda_while.c :+: :+: :+: */ +/* while_dda.c :+: :+: :+: */ /* +:+ +:+ +:+ */ /* By: adjoly +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2024/10/06 18:46:56 by adjoly #+# #+# */ -/* Updated: 2024/10/06 19:05:11 by adjoly ### ########.fr */ +/* Updated: 2024/10/07 17:08:57 by adjoly ### ########.fr */ /* */ /* ************************************************************************** */ -#include "game/game.h" +#include "game/dda.h" -void dda_while(t_dda *dda, char **map, t_coord map_coord) +void while_dda(t_dda (*dda)[800], char **map, t_coord map_coord) { dda->wall_hit = false; while (!dda->wall_hit) From 02cf47a5fe4faaf0ffd3ea77020ca0256aaaa099 Mon Sep 17 00:00:00 2001 From: Adam Joly Date: Tue, 8 Oct 2024 13:59:37 +0200 Subject: [PATCH 08/24] =?UTF-8?q?=E3=80=8C=F0=9F=8F=97=EF=B8=8F=E3=80=8D?= =?UTF-8?q?=20wip(DDA):=20Wall=20distance=20got=20:ok=5Fhand:?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- includes/game/typedef.h | 17 ++++++++++------- src/raycasting/dda/dda.c | 10 ++++------ src/raycasting/dda/dist_dda.c | 34 ++++++++++++++++++++++++++++++++++ src/raycasting/dda/setup_dda.c | 4 ++-- src/raycasting/dda/while_dda.c | 4 ++-- 5 files changed, 52 insertions(+), 17 deletions(-) create mode 100644 src/raycasting/dda/dist_dda.c diff --git a/includes/game/typedef.h b/includes/game/typedef.h index b0e4435..ef15a02 100644 --- a/includes/game/typedef.h +++ b/includes/game/typedef.h @@ -6,7 +6,7 @@ /* By: adjoly +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2024/10/04 14:28:24 by adjoly #+# #+# */ -/* Updated: 2024/10/06 19:03:26 by adjoly ### ########.fr */ +/* Updated: 2024/10/08 13:43:59 by adjoly ### ########.fr */ /* */ /* ************************************************************************** */ @@ -16,6 +16,15 @@ # include "parsing.h" # include +/** + * @brief Enum for the wall side that has been hit + */ +typedef enum s_wall_side +{ + HORIZONTAL, + VERTICAL +} t_wall_side; + typedef struct s_coord_f { float x; @@ -44,11 +53,6 @@ typedef struct s_cub t_player player; } t_cub; -typedef enum s_wall_side -{ - HORIZONTAL, - VERTICAL -} t_wall_side; typedef struct s_dda { @@ -58,7 +62,6 @@ typedef struct s_dda t_step step; t_wall_side wall_side; bool wall_hit; - } t_dda; #endif diff --git a/src/raycasting/dda/dda.c b/src/raycasting/dda/dda.c index 6683c9f..d826ac4 100644 --- a/src/raycasting/dda/dda.c +++ b/src/raycasting/dda/dda.c @@ -6,7 +6,7 @@ /* By: adjoly +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2024/10/07 16:55:09 by adjoly #+# #+# */ -/* Updated: 2024/10/07 19:04:07 by adjoly ### ########.fr */ +/* Updated: 2024/10/08 13:59:15 by adjoly ### ########.fr */ /* */ /* ************************************************************************** */ @@ -15,20 +15,18 @@ void dda(t_player *player, char **map) { - t_dda dda[800]; + t_dda dda[WINDOW_X / RAY_SIZE]; t_coord map_coord; + float *wall_dist; setup_dda(&dda, player); map_coord.x = player->coords.x - player->coords.x % MAP_CHUNK_SIZE; map_coord.y = player->coords.y - player->coords.y % MAP_CHUNK_SIZE; while_dda(&dda, map, map_coord); - + wall_dist = dist_dda(dda); } /** -* calculate distance from wall -* perp_wall_dist = (map_y - player_y + (1 - step_y) / 2) / ray_dir_y -* * calculate size on screen * screen_height / per_wall_dist * diff --git a/src/raycasting/dda/dist_dda.c b/src/raycasting/dda/dist_dda.c new file mode 100644 index 0000000..9127d3e --- /dev/null +++ b/src/raycasting/dda/dist_dda.c @@ -0,0 +1,34 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* dist_dda.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: adjoly +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2024/10/08 13:26:19 by adjoly #+# #+# */ +/* Updated: 2024/10/08 13:53:27 by adjoly ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "game/dda.h" +#include +#include "game/settings.h" + +float *dist_dda(t_dda dda[WINDOW_X / RAY_SIZE]) +{ + size_t i; + float wall_dist; + + wall_dist = ft_calloc(WINDOW_X / RAY_SIZE, sizeof(float)); + if (!wall_dist) + return (NULL); + while (dda[i]) + { + if (dda[i].wall_side == HORIZONTAL) + wall_dist[i] = dda[i].side_dist.x - dda[i].delta_dist.x; + else + wall_dist[i] = dda[i].side_dist.y - dda[i].delta_dist.y; + i++; + } + return (wall_dist); +} diff --git a/src/raycasting/dda/setup_dda.c b/src/raycasting/dda/setup_dda.c index b9aef2f..458b987 100644 --- a/src/raycasting/dda/setup_dda.c +++ b/src/raycasting/dda/setup_dda.c @@ -6,7 +6,7 @@ /* By: adjoly +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2024/09/30 23:47:14 by adjoly #+# #+# */ -/* Updated: 2024/10/07 19:05:59 by adjoly ### ########.fr */ +/* Updated: 2024/10/08 13:28:24 by adjoly ### ########.fr */ /* */ /* ************************************************************************** */ @@ -40,7 +40,7 @@ void get_side_dist(t_dda *dda, t_coord incell_coords, t_player *player) } } -void setup_dda(t_dda (*dda)[800], t_player *player) +void setup_dda(t_dda (*dda)[WINDOW_X / RAY_SIZE], t_player *player) { size_t i; t_coord incell_coords; diff --git a/src/raycasting/dda/while_dda.c b/src/raycasting/dda/while_dda.c index 91896f2..c7bd25a 100644 --- a/src/raycasting/dda/while_dda.c +++ b/src/raycasting/dda/while_dda.c @@ -6,13 +6,13 @@ /* By: adjoly +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2024/10/06 18:46:56 by adjoly #+# #+# */ -/* Updated: 2024/10/07 17:08:57 by adjoly ### ########.fr */ +/* Updated: 2024/10/08 13:28:33 by adjoly ### ########.fr */ /* */ /* ************************************************************************** */ #include "game/dda.h" -void while_dda(t_dda (*dda)[800], char **map, t_coord map_coord) +void while_dda(t_dda (*dda)[WINDOW_X / RAY_SIZE], char **map, t_coord map_coord) { dda->wall_hit = false; while (!dda->wall_hit) From 24da8e8c27359f4f5cfe1e1c1c7f8214086ae122 Mon Sep 17 00:00:00 2001 From: adjoly Date: Tue, 8 Oct 2024 21:51:52 +0200 Subject: [PATCH 09/24] =?UTF-8?q?=E3=80=8C=F0=9F=8F=97=EF=B8=8F=E3=80=8D?= =?UTF-8?q?=20wip(DDA):=20distant=20calculated=20correctly=20:+1:?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- MacroLibX | 2 +- Makefile | 4 ++-- includes/game/game.h | 17 +++++++++-------- src/raycasting/dda/dist_dda.c | 3 ++- src/raycasting/ray_calc.c | 0 5 files changed, 14 insertions(+), 12 deletions(-) create mode 100644 src/raycasting/ray_calc.c diff --git a/MacroLibX b/MacroLibX index 4d640ed..3dd68f9 160000 --- a/MacroLibX +++ b/MacroLibX @@ -1 +1 @@ -Subproject commit 4d640ed70cd392f3e3311fe2779905876b7f1b6f +Subproject commit 3dd68f994248bfa6e6c634ca9c838dfe48b53520 diff --git a/Makefile b/Makefile index 65a0860..f03bf76 100644 --- a/Makefile +++ b/Makefile @@ -6,7 +6,7 @@ # By: adjoly +#+ +:+ +#+ # # +#+#+#+#+#+ +#+ # # Created: 2024/10/07 16:02:18 by adjoly #+# #+# # -# Updated: 2024/10/07 16:02:44 by adjoly ### ########.fr # +# Updated: 2024/10/08 21:44:52 by adjoly ### ########.fr # # # # **************************************************************************** # @@ -14,7 +14,7 @@ SHELL = bash NAME = cub3D -CC = gcc +CC = clang OBJSDIR = obj/ diff --git a/includes/game/game.h b/includes/game/game.h index b2b71df..65cb74a 100644 --- a/includes/game/game.h +++ b/includes/game/game.h @@ -6,25 +6,26 @@ /* By: adjoly +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2024/09/11 16:38:40 by adjoly #+# #+# */ -/* Updated: 2024/10/06 18:48:33 by adjoly ### ########.fr */ +/* Updated: 2024/10/08 21:42:52 by adjoly ### ########.fr */ /* */ /* ************************************************************************** */ #ifndef GAME_H # define GAME_H +# include +# include +# include +# include +# include +# include +# include + # include "dda.h" # include "settings.h" # include "parsing.h" # include "typedef.h" -# include -# include -# include -# include -# include - - /** * @brief This function is used to handle keypress * diff --git a/src/raycasting/dda/dist_dda.c b/src/raycasting/dda/dist_dda.c index 9127d3e..f7ae04d 100644 --- a/src/raycasting/dda/dist_dda.c +++ b/src/raycasting/dda/dist_dda.c @@ -6,11 +6,12 @@ /* By: adjoly +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2024/10/08 13:26:19 by adjoly #+# #+# */ -/* Updated: 2024/10/08 13:53:27 by adjoly ### ########.fr */ +/* Updated: 2024/10/08 21:40:08 by adjoly ### ########.fr */ /* */ /* ************************************************************************** */ #include "game/dda.h" +#include #include #include "game/settings.h" diff --git a/src/raycasting/ray_calc.c b/src/raycasting/ray_calc.c new file mode 100644 index 0000000..e69de29 From da17af41b1457eaf1c61bbe75e799893776ddd74 Mon Sep 17 00:00:00 2001 From: Adam Joly Date: Sun, 13 Oct 2024 17:49:01 +0200 Subject: [PATCH 10/24] =?UTF-8?q?=E3=80=8C=F0=9F=8F=97=EF=B8=8F=E3=80=8D?= =?UTF-8?q?=20wip:=20Added=20line=20size=20calculus?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- MacroLibX | 2 +- Makefile | 4 ++-- includes/game/dda.h | 23 +++++++++++++++++++---- src/raycasting/dda/dda.c | 8 ++++---- src/raycasting/dda/line_dda.c | 29 +++++++++++++++++++++++++++++ src/raycasting/ray_calc.c | 0 6 files changed, 55 insertions(+), 11 deletions(-) create mode 100644 src/raycasting/dda/line_dda.c delete mode 100644 src/raycasting/ray_calc.c diff --git a/MacroLibX b/MacroLibX index 3dd68f9..4d640ed 160000 --- a/MacroLibX +++ b/MacroLibX @@ -1 +1 @@ -Subproject commit 3dd68f994248bfa6e6c634ca9c838dfe48b53520 +Subproject commit 4d640ed70cd392f3e3311fe2779905876b7f1b6f diff --git a/Makefile b/Makefile index f03bf76..6e1935a 100644 --- a/Makefile +++ b/Makefile @@ -6,7 +6,7 @@ # By: adjoly +#+ +:+ +#+ # # +#+#+#+#+#+ +#+ # # Created: 2024/10/07 16:02:18 by adjoly #+# #+# # -# Updated: 2024/10/08 21:44:52 by adjoly ### ########.fr # +# Updated: 2024/10/08 22:06:26 by adjoly ### ########.fr # # # # **************************************************************************** # @@ -14,7 +14,7 @@ SHELL = bash NAME = cub3D -CC = clang +CC = gcc OBJSDIR = obj/ diff --git a/includes/game/dda.h b/includes/game/dda.h index 0840146..f0bc797 100644 --- a/includes/game/dda.h +++ b/includes/game/dda.h @@ -6,7 +6,7 @@ /* By: adjoly +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2024/10/04 14:04:10 by adjoly #+# #+# */ -/* Updated: 2024/10/07 17:42:00 by adjoly ### ########.fr */ +/* Updated: 2024/10/13 17:44:12 by adjoly ### ########.fr */ /* */ /* ************************************************************************** */ @@ -21,7 +21,7 @@ * @param player The address of the t_player struct * @param dda The address of the t_dda struct */ -void get_ray_angle(t_player *player, t_dda (*dda)[800]); +void get_ray_angle(t_player *player, t_dda (*dda)[800]); /** * @brief Function used to setup all the dda variable prior to casting @@ -31,7 +31,7 @@ void get_ray_angle(t_player *player, t_dda (*dda)[800]); * @param dda The address of the t_dda struct * */ -void setup_dda(t_dda (*dda)[800], t_player *player); +void setup_dda(t_dda (*dda)[800], t_player *player); /** * @brief Function used to cast all the rays @@ -40,6 +40,21 @@ void setup_dda(t_dda (*dda)[800], t_player *player); * @param map The map as a char ** * @param map_coord The coordinate of the player on the map_grid */ -void while_dda(t_dda (*dda)[800], char **map, t_coord map_coord); +void while_dda(t_dda (*dda)[800], char **map, t_coord map_coord); + + /// NEED TO COMBINE THOSE IF NOT USEFULL TO SEPARATE +/** + * @brief Function used to get the distance from the player of all rays + * + * @param dda The address of the t_dda struct + */ +float *dist_dda(t_dda dda[WINDOW_X / RAY_SIZE]); + +/** + * @brief Function used to get the size of the line to be printed on the screen + * + * @param dda The array of the all the distance to the wall of the rays + */ +uint16_t *line_dda(float *wall_dist); #endif diff --git a/src/raycasting/dda/dda.c b/src/raycasting/dda/dda.c index d826ac4..08485f2 100644 --- a/src/raycasting/dda/dda.c +++ b/src/raycasting/dda/dda.c @@ -6,7 +6,7 @@ /* By: adjoly +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2024/10/07 16:55:09 by adjoly #+# #+# */ -/* Updated: 2024/10/08 13:59:15 by adjoly ### ########.fr */ +/* Updated: 2024/10/13 17:27:17 by adjoly ### ########.fr */ /* */ /* ************************************************************************** */ @@ -18,18 +18,18 @@ void dda(t_player *player, char **map) t_dda dda[WINDOW_X / RAY_SIZE]; t_coord map_coord; float *wall_dist; + float *line_size; setup_dda(&dda, player); map_coord.x = player->coords.x - player->coords.x % MAP_CHUNK_SIZE; map_coord.y = player->coords.y - player->coords.y % MAP_CHUNK_SIZE; while_dda(&dda, map, map_coord); wall_dist = dist_dda(dda); + } /** * calculate size on screen * screen_height / per_wall_dist -* -* print on screen -* +* (and get orientation) */ diff --git a/src/raycasting/dda/line_dda.c b/src/raycasting/dda/line_dda.c new file mode 100644 index 0000000..cbc171c --- /dev/null +++ b/src/raycasting/dda/line_dda.c @@ -0,0 +1,29 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* line_dda.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: adjoly +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2024/10/13 17:27:44 by adjoly #+# #+# */ +/* Updated: 2024/10/13 17:36:05 by adjoly ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "game/settings.h" + +uint16_t *line_dda(t_dda (*dda)[WINDOW_X / RAY_SIZE], float *wall_dist) +{ + uint16_t i; + uint16_t *line_size; + + (void)dda; + i = 0; + line_size = malloc(WINDOW_X / RAY_SIZE * sizeof(uint16_t)); + while (wall_dist[i]) + { + line_size[i] = (WINDOW_Y / wall_dist[i]); + i++; + } + return (line_size); +} diff --git a/src/raycasting/ray_calc.c b/src/raycasting/ray_calc.c deleted file mode 100644 index e69de29..0000000 From 4b6365fd0476d73f876150352d13bec8633d73b5 Mon Sep 17 00:00:00 2001 From: Adam Joly Date: Mon, 14 Oct 2024 15:26:34 +0200 Subject: [PATCH 11/24] =?UTF-8?q?=E3=80=8C=F0=9F=8F=97=EF=B8=8F=E3=80=8D?= =?UTF-8?q?=20wip:=20Started=20printing=20raycasting=20(not=20working)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Makefile | 2 +- includes/game/dda.h | 5 ++- src/cub3d.c | 9 +++-- src/raycasting/dda/dda.c | 9 +++-- src/raycasting/dda/dist_dda.c | 9 +++-- src/raycasting/dda/get_ray_angle.c | 4 +- src/raycasting/dda/line_dda.c | 8 ++-- src/raycasting/dda/while_dda.c | 22 +++++------ src/raycasting/print_frame.c | 59 ++++++++++++++++++++++++++++++ 9 files changed, 100 insertions(+), 27 deletions(-) create mode 100644 src/raycasting/print_frame.c diff --git a/Makefile b/Makefile index 6e1935a..c3e1d8d 100644 --- a/Makefile +++ b/Makefile @@ -6,7 +6,7 @@ # By: adjoly +#+ +:+ +#+ # # +#+#+#+#+#+ +#+ # # Created: 2024/10/07 16:02:18 by adjoly #+# #+# # -# Updated: 2024/10/08 22:06:26 by adjoly ### ########.fr # +# Updated: 2024/10/13 21:23:17 by adjoly ### ########.fr # # # # **************************************************************************** # diff --git a/includes/game/dda.h b/includes/game/dda.h index f0bc797..57cb364 100644 --- a/includes/game/dda.h +++ b/includes/game/dda.h @@ -6,7 +6,7 @@ /* By: adjoly +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2024/10/04 14:04:10 by adjoly #+# #+# */ -/* Updated: 2024/10/13 17:44:12 by adjoly ### ########.fr */ +/* Updated: 2024/10/13 21:28:23 by adjoly ### ########.fr */ /* */ /* ************************************************************************** */ @@ -14,6 +14,8 @@ # define DDA_H # include "typedef.h" +# include "settings.h" +# include /** * @brief Function used to get all the ray angle @@ -57,4 +59,5 @@ float *dist_dda(t_dda dda[WINDOW_X / RAY_SIZE]); */ uint16_t *line_dda(float *wall_dist); +uint16_t *dda(t_player *player, char **map); #endif diff --git a/src/cub3d.c b/src/cub3d.c index 185ba1c..f23f72d 100644 --- a/src/cub3d.c +++ b/src/cub3d.c @@ -6,7 +6,7 @@ /* By: madumerg +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2024/09/04 16:58:27 by madumerg #+# #+# */ -/* Updated: 2024/10/06 17:58:41 by adjoly ### ########.fr */ +/* Updated: 2024/10/14 12:32:14 by adjoly ### ########.fr */ /* */ /* ************************************************************************** */ @@ -14,6 +14,8 @@ #include "game/game.h" #include "mlx.h" +void *print_frame(t_cub *cub); + int main(int ac, char **av) { t_cub cub; @@ -32,8 +34,9 @@ int main(int ac, char **av) cub.win = mlx_new_window(cub.mlx, WINDOW_X, WINDOW_Y, "WTF"); cub.player.coords.x = 100; cub.player.coords.y = 100; - cub.img = mlx_new_image(cub.mlx, WINDOW_X, WINDOW_Y); - get_player_image(&cub, 0); + cub.player.direction = 0; + cub.img = print_frame(&cub); + //get_player_image(&cub, 0); mlx_put_image_to_window(cub.mlx, cub.win, cub.img, 0, 0); mlx_on_event(cub.mlx, cub.win, MLX_KEYDOWN, key_hook, &cub); mlx_loop(cub.mlx); diff --git a/src/raycasting/dda/dda.c b/src/raycasting/dda/dda.c index 08485f2..3429678 100644 --- a/src/raycasting/dda/dda.c +++ b/src/raycasting/dda/dda.c @@ -6,26 +6,27 @@ /* By: adjoly +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2024/10/07 16:55:09 by adjoly #+# #+# */ -/* Updated: 2024/10/13 17:27:17 by adjoly ### ########.fr */ +/* Updated: 2024/10/13 21:27:59 by adjoly ### ########.fr */ /* */ /* ************************************************************************** */ #include "game/dda.h" #include "game/settings.h" -void dda(t_player *player, char **map) +uint16_t *dda(t_player *player, char **map) { t_dda dda[WINDOW_X / RAY_SIZE]; t_coord map_coord; float *wall_dist; - float *line_size; + uint16_t *line_size; setup_dda(&dda, player); map_coord.x = player->coords.x - player->coords.x % MAP_CHUNK_SIZE; map_coord.y = player->coords.y - player->coords.y % MAP_CHUNK_SIZE; while_dda(&dda, map, map_coord); wall_dist = dist_dda(dda); - + line_size = line_dda(wall_dist); + return (line_size); } /** diff --git a/src/raycasting/dda/dist_dda.c b/src/raycasting/dda/dist_dda.c index f7ae04d..cbab6e2 100644 --- a/src/raycasting/dda/dist_dda.c +++ b/src/raycasting/dda/dist_dda.c @@ -6,7 +6,7 @@ /* By: adjoly +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2024/10/08 13:26:19 by adjoly #+# #+# */ -/* Updated: 2024/10/08 21:40:08 by adjoly ### ########.fr */ +/* Updated: 2024/10/13 21:30:15 by adjoly ### ########.fr */ /* */ /* ************************************************************************** */ @@ -14,22 +14,25 @@ #include #include #include "game/settings.h" +#include "libft.h" float *dist_dda(t_dda dda[WINDOW_X / RAY_SIZE]) { size_t i; - float wall_dist; + float *wall_dist; + i = 0; wall_dist = ft_calloc(WINDOW_X / RAY_SIZE, sizeof(float)); if (!wall_dist) return (NULL); - while (dda[i]) + while (dda) { if (dda[i].wall_side == HORIZONTAL) wall_dist[i] = dda[i].side_dist.x - dda[i].delta_dist.x; else wall_dist[i] = dda[i].side_dist.y - dda[i].delta_dist.y; i++; + dda++; } return (wall_dist); } diff --git a/src/raycasting/dda/get_ray_angle.c b/src/raycasting/dda/get_ray_angle.c index 491bcef..e6f69c9 100644 --- a/src/raycasting/dda/get_ray_angle.c +++ b/src/raycasting/dda/get_ray_angle.c @@ -6,7 +6,7 @@ /* By: adjoly +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2024/09/29 15:26:29 by adjoly #+# #+# */ -/* Updated: 2024/10/07 19:06:47 by adjoly ### ########.fr */ +/* Updated: 2024/10/14 12:35:17 by adjoly ### ########.fr */ /* */ /* ************************************************************************** */ @@ -14,6 +14,7 @@ #include "game/settings.h" #include #include +#include void get_ray_angle(t_player *player, t_dda (*dda)[800]) { @@ -21,6 +22,7 @@ void get_ray_angle(t_player *player, t_dda (*dda)[800]) float ray_angle; x = 0; + printf("plyaer dir = %f", player->direction); while (x < WINDOW_X) { ray_angle = player->direction - (FOV / 2) + (x / WINDOW_X) * FOV; diff --git a/src/raycasting/dda/line_dda.c b/src/raycasting/dda/line_dda.c index cbc171c..d4b89ba 100644 --- a/src/raycasting/dda/line_dda.c +++ b/src/raycasting/dda/line_dda.c @@ -6,18 +6,20 @@ /* By: adjoly +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2024/10/13 17:27:44 by adjoly #+# #+# */ -/* Updated: 2024/10/13 17:36:05 by adjoly ### ########.fr */ +/* Updated: 2024/10/13 21:28:12 by adjoly ### ########.fr */ /* */ /* ************************************************************************** */ #include "game/settings.h" +#include "game/dda.h" +#include -uint16_t *line_dda(t_dda (*dda)[WINDOW_X / RAY_SIZE], float *wall_dist) +#include +uint16_t *line_dda(float *wall_dist) { uint16_t i; uint16_t *line_size; - (void)dda; i = 0; line_size = malloc(WINDOW_X / RAY_SIZE * sizeof(uint16_t)); while (wall_dist[i]) diff --git a/src/raycasting/dda/while_dda.c b/src/raycasting/dda/while_dda.c index c7bd25a..2f71620 100644 --- a/src/raycasting/dda/while_dda.c +++ b/src/raycasting/dda/while_dda.c @@ -6,7 +6,7 @@ /* By: adjoly +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2024/10/06 18:46:56 by adjoly #+# #+# */ -/* Updated: 2024/10/08 13:28:33 by adjoly ### ########.fr */ +/* Updated: 2024/10/13 21:34:01 by adjoly ### ########.fr */ /* */ /* ************************************************************************** */ @@ -14,22 +14,22 @@ void while_dda(t_dda (*dda)[WINDOW_X / RAY_SIZE], char **map, t_coord map_coord) { - dda->wall_hit = false; - while (!dda->wall_hit) + (*dda)->wall_hit = false; + while (!(*dda)->wall_hit) { - if (dda->side_dist.x < dda->side_dist.y) + if (( *dda )->side_dist.x < (*dda)->side_dist.y) { - dda->side_dist.x += dda->delta_dist.x; - map_coord.x += dda->step.x; - dda->wall_side = HORIZONTAL; + (*dda)->side_dist.x += (*dda)->delta_dist.x; + map_coord.x += (*dda)->step.x; + (*dda)->wall_side = HORIZONTAL; } else { - dda->side_dist.y += dda->delta_dist.y; - map_coord.y += dda->step.y; - dda->wall_side = VERTICAL; + (*dda)->side_dist.y += (*dda)->delta_dist.y; + map_coord.y += (*dda)->step.y; + (*dda)->wall_side = VERTICAL; } if (map[map_coord.x][map_coord.y] == '1') - dda->wall_hit = true; + (*dda)->wall_hit = true; } } diff --git a/src/raycasting/print_frame.c b/src/raycasting/print_frame.c new file mode 100644 index 0000000..18daed2 --- /dev/null +++ b/src/raycasting/print_frame.c @@ -0,0 +1,59 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* print_frame.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: adjoly +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2024/10/13 21:01:53 by adjoly #+# #+# */ +/* Updated: 2024/10/13 21:37:17 by adjoly ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "game/dda.h" +#include "mlx.h" +#include +#include "game/settings.h" + +void draw_rectangle(t_cub *cub, void *img, t_coord start, t_coord end) +{ + int x; + int y; + + x = start.x; + y = start.y; + while (x < end.x) + { + while (y < end.y) + { + mlx_set_image_pixel(cub->mlx, img, x, y, WHITE); + y++; + } + x++; + } +} + +void *print_frame(t_cub *cub) +{ + uint16_t *lines; + int start; + int stop; + size_t i; + void *img; + + lines = dda(&cub->player, cub->map); + img = mlx_new_image(cub->mlx, WINDOW_X, WINDOW_Y); + i = 0; + while (i < WINDOW_X / RAY_SIZE) + { + start = -lines[i] / 2 + WINDOW_Y / 2; + if (start < 0) + start = 0; + stop = lines[i] / 2 + WINDOW_Y / 2; + if (stop >= WINDOW_Y) + stop = WINDOW_Y - 1; + draw_rectangle(cub, img, (t_coord){i * RAY_SIZE, start}, (t_coord){i * RAY_SIZE + RAY_SIZE - 1, stop}); + i++; + } + return (img); +} From 4405cbca11193f6f78a725eeead6ee53fa430921 Mon Sep 17 00:00:00 2001 From: adjoly Date: Sat, 19 Oct 2024 12:13:45 +0200 Subject: [PATCH 12/24] =?UTF-8?q?=E3=80=8C=E2=9C=A8=E3=80=8D=20feat(Flake)?= =?UTF-8?q?:=20Added=20flake=20for=20easier=20developement?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .envrc | 1 + .gitignore | 2 -- flake.lock | 61 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ flake.nix | 36 ++++++++++++++++++++++++++++++++ 4 files changed, 98 insertions(+), 2 deletions(-) create mode 100644 .envrc create mode 100644 flake.lock create mode 100644 flake.nix diff --git a/.envrc b/.envrc new file mode 100644 index 0000000..3550a30 --- /dev/null +++ b/.envrc @@ -0,0 +1 @@ +use flake diff --git a/.gitignore b/.gitignore index 3324dc9..cbef9cb 100644 --- a/.gitignore +++ b/.gitignore @@ -1,8 +1,6 @@ obj/ cub3D .direnv -.envrc -flake.nix compile_commands.json .cache libft/**/*.o diff --git a/flake.lock b/flake.lock new file mode 100644 index 0000000..3614c3e --- /dev/null +++ b/flake.lock @@ -0,0 +1,61 @@ +{ + "nodes": { + "flake-utils": { + "inputs": { + "systems": "systems" + }, + "locked": { + "lastModified": 1726560853, + "narHash": "sha256-X6rJYSESBVr3hBoH0WbKE5KvhPU5bloyZ2L4K60/fPQ=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "c1dfcf08411b08f6b8615f7d8971a2bfa81d5e8a", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "nixpkgs": { + "locked": { + "lastModified": 1729181673, + "narHash": "sha256-LDiPhQ3l+fBjRATNtnuDZsBS7hqoBtPkKBkhpoBHv3I=", + "owner": "nixos", + "repo": "nixpkgs", + "rev": "4eb33fe664af7b41a4c446f87d20c9a0a6321fa3", + "type": "github" + }, + "original": { + "owner": "nixos", + "ref": "nixos-24.05", + "repo": "nixpkgs", + "type": "github" + } + }, + "root": { + "inputs": { + "flake-utils": "flake-utils", + "nixpkgs": "nixpkgs" + } + }, + "systems": { + "locked": { + "lastModified": 1681028828, + "narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=", + "owner": "nix-systems", + "repo": "default", + "rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e", + "type": "github" + }, + "original": { + "owner": "nix-systems", + "repo": "default", + "type": "github" + } + } + }, + "root": "root", + "version": 7 +} diff --git a/flake.nix b/flake.nix new file mode 100644 index 0000000..387d863 --- /dev/null +++ b/flake.nix @@ -0,0 +1,36 @@ +{ + description = "A Nix-flake-based C/C++ development environment"; + inputs = { + nixpkgs.url = "github:nixos/nixpkgs/nixos-24.05"; + flake-utils.url = "github:numtide/flake-utils"; + }; + + outputs = { nixpkgs, flake-utils, ... }: flake-utils.lib.eachDefaultSystem (system: + let + pkgs = nixpkgs.legacyPackages.${system}; + in + { + devShells = ({ + default = pkgs.mkShell.override + { + # For stdenv + } + { + buildInputs = with pkgs; [ + SDL2 + vulkan-loader + ]; + + LD_LIBRARY_PATH="${pkgs.vulkan-loader}/lib"; + + packages = with pkgs; [ + clang_12 + gcc11 + gdb + norminette + valgrind + ]; + }; + }); + }); +} From fa72a134a0447950c7b4a2f422e705fc6a0e3852 Mon Sep 17 00:00:00 2001 From: adjoly Date: Sat, 19 Oct 2024 12:14:12 +0200 Subject: [PATCH 13/24] =?UTF-8?q?=E3=80=8C=F0=9F=94=A8=E3=80=8D=20fix(Libf?= =?UTF-8?q?t):=20Modified=20a=20little=20libft=20for=20it=20to=20compile?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Makefile | 6 +++--- libft/Ft_Printf/ft_printf_utils.c | 6 +++--- libft/Makefile | 2 +- libft/includes/libft.h | 2 +- libft/put/ft_putchar_fd.c | 4 ++-- libft/put/ft_putendl_fd.c | 6 +++--- libft/put/ft_putstr_fd.c | 13 ++----------- 7 files changed, 15 insertions(+), 24 deletions(-) diff --git a/Makefile b/Makefile index c3e1d8d..f9ecccb 100644 --- a/Makefile +++ b/Makefile @@ -6,7 +6,7 @@ # By: adjoly +#+ +:+ +#+ # # +#+#+#+#+#+ +#+ # # Created: 2024/10/07 16:02:18 by adjoly #+# #+# # -# Updated: 2024/10/13 21:23:17 by adjoly ### ########.fr # +# Updated: 2024/10/17 01:22:00 by adjoly ### ########.fr # # # # **************************************************************************** # @@ -32,7 +32,7 @@ SRCS = $(shell find src -name *.c) OBJS = $(addprefix $(OBJSDIR), $(SRCS:.c=.o)) -FLAGS = -Wall -Werror -Wextra -g -lm -lSDL2 -MMD -MP +FLAGS = -Wall -Werror -Wextra -g -MMD -MP LIB = libft/libft.a \ MacroLibX/libmlx.so @@ -42,7 +42,7 @@ $(NAME): $(OBJS) @echo "โœ… Libft compiled" @#@make -sj -C $(MACRO_DIR) @#@echo "โœ… MacroLibX compiled" - @$(CC) $(OBJS) $(LIB) -o $(NAME) $(FLAGS) + @$(CC) $(OBJS) $(LIB) -o $(NAME) $(FLAGS) -lm -lSDL2 @echo "โœ… Compiled" $(OBJSDIR)%.o: %.c diff --git a/libft/Ft_Printf/ft_printf_utils.c b/libft/Ft_Printf/ft_printf_utils.c index fc73f4d..8445e5b 100644 --- a/libft/Ft_Printf/ft_printf_utils.c +++ b/libft/Ft_Printf/ft_printf_utils.c @@ -6,7 +6,7 @@ /* By: madumerg +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2023/10/31 13:02:45 by madumerg #+# #+# */ -/* Updated: 2024/09/04 16:24:48 by madumerg ### ########.fr */ +/* Updated: 2024/10/16 20:58:23 by adjoly ### ########.fr */ /* */ /* ************************************************************************** */ diff --git a/libft/put/ft_putchar_fd.c b/libft/put/ft_putchar_fd.c index cf6738b..15ee660 100644 --- a/libft/put/ft_putchar_fd.c +++ b/libft/put/ft_putchar_fd.c @@ -6,7 +6,7 @@ /* By: madumerg +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2023/11/03 14:32:56 by madumerg #+# #+# */ -/* Updated: 2023/11/03 14:52:19 by madumerg ### ########.fr */ +/* Updated: 2024/10/17 01:13:30 by adjoly ### ########.fr */ /* */ /* ************************************************************************** */ @@ -14,5 +14,5 @@ void ft_putchar_fd(char c, int fd) { - write(fd, &c, 1); + (void)write(fd, &c, 1); } diff --git a/libft/put/ft_putendl_fd.c b/libft/put/ft_putendl_fd.c index 54d1ea4..146e95d 100644 --- a/libft/put/ft_putendl_fd.c +++ b/libft/put/ft_putendl_fd.c @@ -6,7 +6,7 @@ /* By: madumerg +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2023/11/03 14:33:06 by madumerg #+# #+# */ -/* Updated: 2024/04/04 17:11:24 by madumerg ### ########.fr */ +/* Updated: 2024/10/17 01:28:14 by adjoly ### ########.fr */ /* */ /* ************************************************************************** */ @@ -21,8 +21,8 @@ void ft_putendl_fd(char *s, int fd) return ; while (s[i] != '\0') { - write(fd, &s[i], 1); + (void)write(fd, &s[i], 1); i++; } - write(fd, "\n", 1); + (void)write(fd, "\n", 1); } diff --git a/libft/put/ft_putstr_fd.c b/libft/put/ft_putstr_fd.c index a352e32..054d748 100644 --- a/libft/put/ft_putstr_fd.c +++ b/libft/put/ft_putstr_fd.c @@ -6,7 +6,7 @@ /* By: madumerg +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2023/11/03 14:33:15 by madumerg #+# #+# */ -/* Updated: 2023/11/09 16:26:33 by madumerg ### ########.fr */ +/* Updated: 2024/10/17 01:13:01 by adjoly ### ########.fr */ /* */ /* ************************************************************************** */ @@ -14,14 +14,5 @@ void ft_putstr_fd(char *s, int fd) { - int i; - - i = 0; - if (!s) - return ; - while (s[i] != '\0') - { - write(fd, &s[i], 1); - i++; - } + (void)write(fd, s, ft_strlen(s)); } From 1697dfa7a38f2645beb52c624b608aa1f302c00f Mon Sep 17 00:00:00 2001 From: adjoly Date: Sat, 19 Oct 2024 13:18:12 +0200 Subject: [PATCH 14/24] =?UTF-8?q?=E3=80=8C=F0=9F=94=A8=E3=80=8D=20fix(Flak?= =?UTF-8?q?e):=20Now=20working=20:+1:?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- MacroLibX | 2 +- Makefile | 2 +- flake.lock | 8 ++++---- flake.nix | 9 +++++---- 4 files changed, 11 insertions(+), 10 deletions(-) diff --git a/MacroLibX b/MacroLibX index 4d640ed..226430f 160000 --- a/MacroLibX +++ b/MacroLibX @@ -1 +1 @@ -Subproject commit 4d640ed70cd392f3e3311fe2779905876b7f1b6f +Subproject commit 226430f01e8a51ef0aff2e11e3791557edfea0e3 diff --git a/Makefile b/Makefile index f9ecccb..44a6bc1 100644 --- a/Makefile +++ b/Makefile @@ -6,7 +6,7 @@ # By: adjoly +#+ +:+ +#+ # # +#+#+#+#+#+ +#+ # # Created: 2024/10/07 16:02:18 by adjoly #+# #+# # -# Updated: 2024/10/17 01:22:00 by adjoly ### ########.fr # +# Updated: 2024/10/19 12:19:00 by adjoly ### ########.fr # # # # **************************************************************************** # diff --git a/flake.lock b/flake.lock index 3614c3e..c24abf7 100644 --- a/flake.lock +++ b/flake.lock @@ -20,16 +20,16 @@ }, "nixpkgs": { "locked": { - "lastModified": 1729181673, - "narHash": "sha256-LDiPhQ3l+fBjRATNtnuDZsBS7hqoBtPkKBkhpoBHv3I=", + "lastModified": 1729256560, + "narHash": "sha256-/uilDXvCIEs3C9l73JTACm4quuHUsIHcns1c+cHUJwA=", "owner": "nixos", "repo": "nixpkgs", - "rev": "4eb33fe664af7b41a4c446f87d20c9a0a6321fa3", + "rev": "4c2fcb090b1f3e5b47eaa7bd33913b574a11e0a0", "type": "github" }, "original": { "owner": "nixos", - "ref": "nixos-24.05", + "ref": "nixos-unstable", "repo": "nixpkgs", "type": "github" } diff --git a/flake.nix b/flake.nix index 387d863..d791dcb 100644 --- a/flake.nix +++ b/flake.nix @@ -1,7 +1,7 @@ { description = "A Nix-flake-based C/C++ development environment"; inputs = { - nixpkgs.url = "github:nixos/nixpkgs/nixos-24.05"; + nixpkgs.url = "github:nixos/nixpkgs/nixos-unstable"; flake-utils.url = "github:numtide/flake-utils"; }; @@ -13,10 +13,11 @@ devShells = ({ default = pkgs.mkShell.override { - # For stdenv } { buildInputs = with pkgs; [ + gcc + clang SDL2 vulkan-loader ]; @@ -24,8 +25,8 @@ LD_LIBRARY_PATH="${pkgs.vulkan-loader}/lib"; packages = with pkgs; [ - clang_12 - gcc11 + clang + gcc gdb norminette valgrind From fc702d8becf3921c74919f6d284bce0f6b7f9806 Mon Sep 17 00:00:00 2001 From: Adam Joly Date: Fri, 25 Oct 2024 16:14:06 +0200 Subject: [PATCH 15/24] =?UTF-8?q?=E3=80=8C=F0=9F=94=A8=E3=80=8D=20fix(Flak?= =?UTF-8?q?e):=20Added=20hardeningDisable?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- flake.nix | 2 ++ 1 file changed, 2 insertions(+) diff --git a/flake.nix b/flake.nix index d791dcb..07d756a 100644 --- a/flake.nix +++ b/flake.nix @@ -23,8 +23,10 @@ ]; LD_LIBRARY_PATH="${pkgs.vulkan-loader}/lib"; + hardeningDisable = [ "all" ]; packages = with pkgs; [ + bear clang gcc gdb From bce9da0440c85e97c9246c707cd260c84763e887 Mon Sep 17 00:00:00 2001 From: Adam JOLY Date: Sat, 26 Oct 2024 09:42:15 +0200 Subject: [PATCH 16/24] =?UTF-8?q?=E3=80=8C=F0=9F=8F=97=EF=B8=8F=E3=80=8D?= =?UTF-8?q?=20wip(Raycasting):=20Seems=20working=20but=20not?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .envrc | 1 - Makefile | 4 +-- includes/game/dda.h | 4 +-- includes/game/game.h | 7 ++--- includes/game/settings.h | 6 ++-- includes/game/typedef.h | 9 +++--- includes/parsing.h | 2 +- src/cub3d.c | 26 ++++++++++-------- src/raycasting/dda/dda.c | 12 ++++---- src/raycasting/dda/dist_dda.c | 8 ++---- src/raycasting/dda/get_ray_angle.c | 11 ++++---- src/raycasting/dda/line_dda.c | 7 ++--- src/raycasting/dda/setup_dda.c | 26 ++++++++++-------- src/raycasting/dda/while_dda.c | 44 +++++++++++++++++++----------- src/raycasting/get_player_image.c | 24 ++++------------ src/raycasting/key_hook.c | 30 +++++++++++++------- src/raycasting/print_frame.c | 14 +++++----- 17 files changed, 122 insertions(+), 113 deletions(-) delete mode 100644 .envrc diff --git a/.envrc b/.envrc deleted file mode 100644 index 3550a30..0000000 --- a/.envrc +++ /dev/null @@ -1 +0,0 @@ -use flake diff --git a/Makefile b/Makefile index 44a6bc1..b74af95 100644 --- a/Makefile +++ b/Makefile @@ -6,7 +6,7 @@ # By: adjoly +#+ +:+ +#+ # # +#+#+#+#+#+ +#+ # # Created: 2024/10/07 16:02:18 by adjoly #+# #+# # -# Updated: 2024/10/19 12:19:00 by adjoly ### ########.fr # +# Updated: 2024/10/19 15:15:37 by adjoly ### ########.fr # # # # **************************************************************************** # @@ -14,7 +14,7 @@ SHELL = bash NAME = cub3D -CC = gcc +CC = cc OBJSDIR = obj/ diff --git a/includes/game/dda.h b/includes/game/dda.h index 57cb364..3ff30be 100644 --- a/includes/game/dda.h +++ b/includes/game/dda.h @@ -6,7 +6,7 @@ /* By: adjoly +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2024/10/04 14:04:10 by adjoly #+# #+# */ -/* Updated: 2024/10/13 21:28:23 by adjoly ### ########.fr */ +/* Updated: 2024/10/23 15:00:05 by adjoly ### ########.fr */ /* */ /* ************************************************************************** */ @@ -42,7 +42,7 @@ void setup_dda(t_dda (*dda)[800], t_player *player); * @param map The map as a char ** * @param map_coord The coordinate of the player on the map_grid */ -void while_dda(t_dda (*dda)[800], char **map, t_coord map_coord); +void while_dda(t_dda (*dda)[800], char **map, t_player *player); /// NEED TO COMBINE THOSE IF NOT USEFULL TO SEPARATE /** diff --git a/includes/game/game.h b/includes/game/game.h index 65cb74a..afee3a5 100644 --- a/includes/game/game.h +++ b/includes/game/game.h @@ -6,7 +6,7 @@ /* By: adjoly +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2024/09/11 16:38:40 by adjoly #+# #+# */ -/* Updated: 2024/10/08 21:42:52 by adjoly ### ########.fr */ +/* Updated: 2024/10/24 11:38:56 by adjoly ### ########.fr */ /* */ /* ************************************************************************** */ @@ -41,9 +41,8 @@ int key_hook(int key, void *param); * * @param cub The address of a t_cub struct filled with mlx data and other * thing - * */ -void get_player_image(t_cub *cub, uint8_t key_pressed); +void get_player_image(t_cub *cub); /** * @brief This function is here to change the direction of the player @@ -54,7 +53,6 @@ void get_player_image(t_cub *cub, uint8_t key_pressed); * @param speed The speed a which the player rotate * @param clockwise The direction which the player rotate * @param player A pointer to a t_player struct - * */ void change_direction(double speed, bool clockwise, t_player *player); @@ -65,7 +63,6 @@ void change_direction(double speed, bool clockwise, t_player *player); * @param coord The coordinate of the printed square * @param size The size of the printed square * @param color The color of the printed square - * */ void draw_square(t_cub *cub, t_coord coord, uint16_t size, int color); diff --git a/includes/game/settings.h b/includes/game/settings.h index 13294b9..fe2fd5b 100644 --- a/includes/game/settings.h +++ b/includes/game/settings.h @@ -6,7 +6,7 @@ /* By: adjoly +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2024/10/04 14:06:39 by adjoly #+# #+# */ -/* Updated: 2024/10/04 16:38:10 by adjoly ### ########.fr */ +/* Updated: 2024/10/23 11:18:38 by adjoly ### ########.fr */ /* */ /* ************************************************************************** */ @@ -23,10 +23,10 @@ # define WHITE 0xFFFFFFFF # define WINDOW_Y 900 # define WINDOW_X 1600 -# define PLAYER_ROT_SPEED (2 * M_PI) / 8 +# define PLAYER_ROT_SPEED (2 * M_PI) / 128 # define PLAYER_SPEED 3 # define MAP_CHUNK_SIZE 64 # define RAY_SIZE 2 -# define FOV 60 * (M_PI / 180) +# define FOV ( 60 * (M_PI / 180) ) #endif diff --git a/includes/game/typedef.h b/includes/game/typedef.h index ef15a02..4e56264 100644 --- a/includes/game/typedef.h +++ b/includes/game/typedef.h @@ -6,15 +6,15 @@ /* By: adjoly +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2024/10/04 14:28:24 by adjoly #+# #+# */ -/* Updated: 2024/10/08 13:43:59 by adjoly ### ########.fr */ +/* Updated: 2024/10/23 14:33:33 by adjoly ### ########.fr */ /* */ /* ************************************************************************** */ #ifndef STRUCT_H # define STRUCT_H -# include "parsing.h" # include +# include "parsing.h" /** * @brief Enum for the wall side that has been hit @@ -39,8 +39,9 @@ typedef struct s_step typedef struct s_player { - t_coord coords; - double direction; + t_coord coords; + t_coord map_coords; + double direction; } t_player; typedef struct s_cub diff --git a/includes/parsing.h b/includes/parsing.h index 490f354..4671c29 100644 --- a/includes/parsing.h +++ b/includes/parsing.h @@ -6,7 +6,7 @@ /* By: madumerg +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2024/09/12 12:49:16 by madumerg #+# #+# */ -/* Updated: 2024/09/12 16:58:29 by madumerg ### ########.fr */ +/* Updated: 2024/10/19 15:37:50 by adjoly ### ########.fr */ /* */ /* ************************************************************************** */ diff --git a/src/cub3d.c b/src/cub3d.c index f23f72d..0ab9ec3 100644 --- a/src/cub3d.c +++ b/src/cub3d.c @@ -6,13 +6,16 @@ /* By: madumerg +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2024/09/04 16:58:27 by madumerg #+# #+# */ -/* Updated: 2024/10/14 12:32:14 by adjoly ### ########.fr */ +/* Updated: 2024/10/24 12:51:06 by adjoly ### ########.fr */ /* */ /* ************************************************************************** */ #include "cub3d.h" #include "game/game.h" +#include "game/settings.h" +#include "libft.h" #include "mlx.h" +#include void *print_frame(t_cub *cub); @@ -20,26 +23,25 @@ int main(int ac, char **av) { t_cub cub; - cub.map = (char *[]){ - "1111111\0", - "1000101\0", - "1000101\0", - "1000001\0", - "1111111\0", - NULL - }; + cub.map = ft_calloc(6, sizeof(char *)); + cub.map[0] = ft_strdup("111111"); + cub.map[1] = ft_strdup("101001"); + cub.map[2] = ft_strdup("100001"); + cub.map[3] = ft_strdup("100001"); + cub.map[4] = ft_strdup("111111"); + cub.map[5] = NULL; (void)ac; (void)av; cub.mlx = mlx_init(); cub.win = mlx_new_window(cub.mlx, WINDOW_X, WINDOW_Y, "WTF"); - cub.player.coords.x = 100; - cub.player.coords.y = 100; + cub.player.coords.x = 128; + cub.player.coords.y = 128; cub.player.direction = 0; cub.img = print_frame(&cub); - //get_player_image(&cub, 0); mlx_put_image_to_window(cub.mlx, cub.win, cub.img, 0, 0); mlx_on_event(cub.mlx, cub.win, MLX_KEYDOWN, key_hook, &cub); mlx_loop(cub.mlx); + mlx_destroy_image(cub.mlx, cub.img); mlx_destroy_window(cub.mlx, cub.win); mlx_destroy_display(cub.mlx); return (0); diff --git a/src/raycasting/dda/dda.c b/src/raycasting/dda/dda.c index 3429678..0667d8a 100644 --- a/src/raycasting/dda/dda.c +++ b/src/raycasting/dda/dda.c @@ -6,24 +6,26 @@ /* By: adjoly +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2024/10/07 16:55:09 by adjoly #+# #+# */ -/* Updated: 2024/10/13 21:27:59 by adjoly ### ########.fr */ +/* Updated: 2024/10/23 15:04:45 by adjoly ### ########.fr */ /* */ /* ************************************************************************** */ #include "game/dda.h" #include "game/settings.h" +#include "sys/types.h" +#include +#include uint16_t *dda(t_player *player, char **map) { t_dda dda[WINDOW_X / RAY_SIZE]; - t_coord map_coord; float *wall_dist; uint16_t *line_size; setup_dda(&dda, player); - map_coord.x = player->coords.x - player->coords.x % MAP_CHUNK_SIZE; - map_coord.y = player->coords.y - player->coords.y % MAP_CHUNK_SIZE; - while_dda(&dda, map, map_coord); + player->map_coords.x = player->coords.x - player->coords.x % MAP_CHUNK_SIZE; + player->map_coords.y = player->coords.y - player->coords.y % MAP_CHUNK_SIZE; + while_dda(&dda, map, player); wall_dist = dist_dda(dda); line_size = line_dda(wall_dist); return (line_size); diff --git a/src/raycasting/dda/dist_dda.c b/src/raycasting/dda/dist_dda.c index cbab6e2..0abfa19 100644 --- a/src/raycasting/dda/dist_dda.c +++ b/src/raycasting/dda/dist_dda.c @@ -6,12 +6,11 @@ /* By: adjoly +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2024/10/08 13:26:19 by adjoly #+# #+# */ -/* Updated: 2024/10/13 21:30:15 by adjoly ### ########.fr */ +/* Updated: 2024/10/23 14:10:52 by adjoly ### ########.fr */ /* */ /* ************************************************************************** */ #include "game/dda.h" -#include #include #include "game/settings.h" #include "libft.h" @@ -22,17 +21,16 @@ float *dist_dda(t_dda dda[WINDOW_X / RAY_SIZE]) float *wall_dist; i = 0; - wall_dist = ft_calloc(WINDOW_X / RAY_SIZE, sizeof(float)); + wall_dist = ft_calloc(WINDOW_X / RAY_SIZE + 1, sizeof(float)); if (!wall_dist) return (NULL); - while (dda) + while (i < WINDOW_X / RAY_SIZE) { if (dda[i].wall_side == HORIZONTAL) wall_dist[i] = dda[i].side_dist.x - dda[i].delta_dist.x; else wall_dist[i] = dda[i].side_dist.y - dda[i].delta_dist.y; i++; - dda++; } return (wall_dist); } diff --git a/src/raycasting/dda/get_ray_angle.c b/src/raycasting/dda/get_ray_angle.c index e6f69c9..f2d7509 100644 --- a/src/raycasting/dda/get_ray_angle.c +++ b/src/raycasting/dda/get_ray_angle.c @@ -6,7 +6,7 @@ /* By: adjoly +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2024/09/29 15:26:29 by adjoly #+# #+# */ -/* Updated: 2024/10/14 12:35:17 by adjoly ### ########.fr */ +/* Updated: 2024/10/23 14:19:21 by adjoly ### ########.fr */ /* */ /* ************************************************************************** */ @@ -16,18 +16,17 @@ #include #include -void get_ray_angle(t_player *player, t_dda (*dda)[800]) +void get_ray_angle(t_player *player, t_dda (*dda)[WINDOW_X / RAY_SIZE]) { uint16_t x; float ray_angle; x = 0; - printf("plyaer dir = %f", player->direction); while (x < WINDOW_X) { - ray_angle = player->direction - (FOV / 2) + (x / WINDOW_X) * FOV; - dda[x / RAY_SIZE]->ray_dir.x = cos(ray_angle); - dda[x / RAY_SIZE]->ray_dir.y = sin(ray_angle); + ray_angle = (float)(player->direction - (FOV / 2) + ((float)x / WINDOW_X) * FOV); + (*dda)[x / RAY_SIZE].ray_dir.x = cos(ray_angle); + (*dda)[x / RAY_SIZE].ray_dir.y = sin(ray_angle); x += RAY_SIZE; } } diff --git a/src/raycasting/dda/line_dda.c b/src/raycasting/dda/line_dda.c index d4b89ba..76afae6 100644 --- a/src/raycasting/dda/line_dda.c +++ b/src/raycasting/dda/line_dda.c @@ -6,7 +6,7 @@ /* By: adjoly +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2024/10/13 17:27:44 by adjoly #+# #+# */ -/* Updated: 2024/10/13 21:28:12 by adjoly ### ########.fr */ +/* Updated: 2024/10/22 13:03:40 by adjoly ### ########.fr */ /* */ /* ************************************************************************** */ @@ -14,7 +14,6 @@ #include "game/dda.h" #include -#include uint16_t *line_dda(float *wall_dist) { uint16_t i; @@ -22,9 +21,9 @@ uint16_t *line_dda(float *wall_dist) i = 0; line_size = malloc(WINDOW_X / RAY_SIZE * sizeof(uint16_t)); - while (wall_dist[i]) + while (i < WINDOW_X / RAY_SIZE) { - line_size[i] = (WINDOW_Y / wall_dist[i]); + line_size[i] = WINDOW_Y * MAP_CHUNK_SIZE / wall_dist[i]; i++; } return (line_size); diff --git a/src/raycasting/dda/setup_dda.c b/src/raycasting/dda/setup_dda.c index 458b987..5c6467e 100644 --- a/src/raycasting/dda/setup_dda.c +++ b/src/raycasting/dda/setup_dda.c @@ -6,7 +6,7 @@ /* By: adjoly +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2024/09/30 23:47:14 by adjoly #+# #+# */ -/* Updated: 2024/10/08 13:28:24 by adjoly ### ########.fr */ +/* Updated: 2024/10/24 12:40:00 by adjoly ### ########.fr */ /* */ /* ************************************************************************** */ @@ -15,27 +15,28 @@ #include #include #include +#include -void get_side_dist(t_dda *dda, t_coord incell_coords, t_player *player) +void get_side_dist(t_dda *dda, t_player *player) { if (dda->ray_dir.x < 0) { - dda->side_dist.x = incell_coords.x * dda->delta_dist.x; + dda->side_dist.x = (player->coords.x - player->map_coords.x) * dda->delta_dist.x; dda->step.x = -MAP_CHUNK_SIZE; } else { - dda->side_dist.x = (((int)player->coords.x + MAP_CHUNK_SIZE) - player->coords.x) * dda->delta_dist.x; + dda->side_dist.x = ((player->map_coords.x + MAP_CHUNK_SIZE) - player->coords.x) * dda->delta_dist.x; dda->step.x = MAP_CHUNK_SIZE; } if (dda->ray_dir.y < 0) { - dda->side_dist.y = incell_coords.y * dda->delta_dist.y; + dda->side_dist.y = (player->coords.y - player->map_coords.y) * dda->delta_dist.y; dda->step.y = -MAP_CHUNK_SIZE; } else { - dda->side_dist.y = (((int)player->coords.y + MAP_CHUNK_SIZE) - player->coords.y) * dda->delta_dist.y; + dda->side_dist.y = (player->map_coords.y + MAP_CHUNK_SIZE - player->coords.y) * dda->delta_dist.y; dda->step.y = MAP_CHUNK_SIZE; } } @@ -43,17 +44,18 @@ void get_side_dist(t_dda *dda, t_coord incell_coords, t_player *player) void setup_dda(t_dda (*dda)[WINDOW_X / RAY_SIZE], t_player *player) { size_t i; - t_coord incell_coords; i = 0; get_ray_angle(player, dda); - incell_coords.x = player->coords.x % MAP_CHUNK_SIZE; - incell_coords.y = player->coords.y % MAP_CHUNK_SIZE; while (i < WINDOW_X / RAY_SIZE) { - dda[i]->delta_dist.x = abs((int)(MAP_CHUNK_SIZE / dda[i]->ray_dir.x)); - dda[i]->delta_dist.y = abs((int)(MAP_CHUNK_SIZE / dda[i]->ray_dir.y)); - get_side_dist(dda[i], incell_coords, player); + (*dda)[i].delta_dist.x = fabsf(MAP_CHUNK_SIZE / (*dda)[i].ray_dir.x); + (*dda)[i].delta_dist.y = fabsf(MAP_CHUNK_SIZE / (*dda)[i].ray_dir.y); + printf("%f \n", (*dda)[i].delta_dist.x); + printf("%f \n", (*dda)[i].delta_dist.y); + get_side_dist(&(*dda)[i], player); + printf("side %f \n", (*dda)[i].side_dist.x); + printf("side %f \n", (*dda)[i].side_dist.y); i++; } } diff --git a/src/raycasting/dda/while_dda.c b/src/raycasting/dda/while_dda.c index 2f71620..381d60e 100644 --- a/src/raycasting/dda/while_dda.c +++ b/src/raycasting/dda/while_dda.c @@ -6,30 +6,42 @@ /* By: adjoly +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2024/10/06 18:46:56 by adjoly #+# #+# */ -/* Updated: 2024/10/13 21:34:01 by adjoly ### ########.fr */ +/* Updated: 2024/10/23 15:03:03 by adjoly ### ########.fr */ /* */ /* ************************************************************************** */ #include "game/dda.h" +#include "game/settings.h" +#include -void while_dda(t_dda (*dda)[WINDOW_X / RAY_SIZE], char **map, t_coord map_coord) +void while_dda(t_dda (*dda)[WINDOW_X / RAY_SIZE], char **map, t_player *player) { - (*dda)->wall_hit = false; - while (!(*dda)->wall_hit) + uint16_t i; + t_coord map_coord; + + i = 0; + while (i < WINDOW_X / RAY_SIZE) { - if (( *dda )->side_dist.x < (*dda)->side_dist.y) + (*dda)[i].wall_hit = false; + map_coord.x = player->map_coords.x; + map_coord.y = player->map_coords.y; + while (!(*dda)[i].wall_hit) { - (*dda)->side_dist.x += (*dda)->delta_dist.x; - map_coord.x += (*dda)->step.x; - (*dda)->wall_side = HORIZONTAL; + if ((*dda)[i].side_dist.x < (*dda)[i].side_dist.y) + { + (*dda)[i].side_dist.x += (*dda)[i].delta_dist.x; + map_coord.x += (*dda)[i].step.x; + (*dda)[i].wall_side = HORIZONTAL; + } + else + { + (*dda)[i].side_dist.y += (*dda)[i].delta_dist.y; + map_coord.y += (*dda)[i].step.y; + (*dda)[i].wall_side = VERTICAL; + } + if (map_coord.x < 0 || map_coord.y < 0 || map[map_coord.x / MAP_CHUNK_SIZE][map_coord.y / MAP_CHUNK_SIZE] == '1') + (*dda)[i].wall_hit = true; } - else - { - (*dda)->side_dist.y += (*dda)->delta_dist.y; - map_coord.y += (*dda)->step.y; - (*dda)->wall_side = VERTICAL; - } - if (map[map_coord.x][map_coord.y] == '1') - (*dda)->wall_hit = true; + i++; } } diff --git a/src/raycasting/get_player_image.c b/src/raycasting/get_player_image.c index 2c0506b..08c7fa1 100644 --- a/src/raycasting/get_player_image.c +++ b/src/raycasting/get_player_image.c @@ -6,11 +6,13 @@ /* By: adjoly +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2024/09/13 11:05:02 by adjoly #+# #+# */ -/* Updated: 2024/10/05 14:30:08 by adjoly ### ########.fr */ +/* Updated: 2024/10/24 11:17:06 by adjoly ### ########.fr */ /* */ /* ************************************************************************** */ #include "game/game.h" +#include "game/settings.h" +#include "math.h" #include void change_direction(double speed, bool clockwise, t_player *player) @@ -20,27 +22,13 @@ void change_direction(double speed, bool clockwise, t_player *player) else player->direction += speed; if (player->direction >= 2 * M_PI) - player->direction -= 2 * M_PI; + player->direction = 0; else if (player->direction < 0) - player->direction += 2 * M_PI; + player->direction = 2 * M_PI; } -void get_player_image(t_cub *cub, uint8_t key_pressed) +void get_player_image(t_cub *cub) { - if (key_pressed == W_KEY) - { - cub->player.coords.x += PLAYER_SPEED * cos(cub->player.direction); - cub->player.coords.y += PLAYER_SPEED * sin(cub->player.direction); - } - else if (key_pressed == S_KEY) - { - cub->player.coords.x -= PLAYER_SPEED * cos(cub->player.direction); - cub->player.coords.y -= PLAYER_SPEED * sin(cub->player.direction); - } - else if (key_pressed == D_KEY) - change_direction(PLAYER_ROT_SPEED, false, &cub->player); - else if (key_pressed == A_KEY) - change_direction(PLAYER_ROT_SPEED, true, &cub->player); print_map(cub); draw_square(cub, (t_coord){cub->player.coords.x - 2, cub->player.coords.y - 2}, \ 5, WHITE); diff --git a/src/raycasting/key_hook.c b/src/raycasting/key_hook.c index 34ae44e..153cf85 100644 --- a/src/raycasting/key_hook.c +++ b/src/raycasting/key_hook.c @@ -6,15 +6,15 @@ /* By: adjoly +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2024/09/11 16:37:56 by adjoly #+# #+# */ -/* Updated: 2024/10/04 15:29:00 by adjoly ### ########.fr */ +/* Updated: 2024/10/24 11:41:30 by adjoly ### ########.fr */ /* */ /* ************************************************************************** */ -#include #include "mlx.h" -#include "parsing.h" #include "game/game.h" +void *print_frame(t_cub *cub); + int key_hook(int key, void *param) { t_cub *cub; @@ -24,15 +24,25 @@ int key_hook(int key, void *param) if (key == ESCAPE_KEY) { mlx_loop_end(cub->mlx); - mlx_destroy_image(cub->mlx, cub->img); + return (0); } - if (key == W_KEY || key == S_KEY || key == D_KEY || key == A_KEY) + if (key == W_KEY) { - mlx_clear_window(cub->mlx, cub->win); - mlx_destroy_image(cub->mlx, cub->img); - cub->img = mlx_new_image(cub->mlx, WINDOW_X, WINDOW_Y); - get_player_image(cub, key); - mlx_put_image_to_window(cub->mlx, cub->win, cub->img, 0, 0); + cub->player.coords.x += PLAYER_SPEED * cos(cub->player.direction); + cub->player.coords.y += PLAYER_SPEED * sin(cub->player.direction); } + else if (key == S_KEY) + { + cub->player.coords.x -= PLAYER_SPEED * cos(cub->player.direction); + cub->player.coords.y -= PLAYER_SPEED * sin(cub->player.direction); + } + else if (key == D_KEY) + change_direction(PLAYER_ROT_SPEED, false, &cub->player); + else if (key == A_KEY) + change_direction(PLAYER_ROT_SPEED, true, &cub->player); + mlx_destroy_image(cub->mlx, cub->img); + cub->img = print_frame(cub); + //get_player_image(cub); + mlx_put_image_to_window(cub->mlx, cub->win, cub->img, 0, 0); return (0); } diff --git a/src/raycasting/print_frame.c b/src/raycasting/print_frame.c index 18daed2..5a562d0 100644 --- a/src/raycasting/print_frame.c +++ b/src/raycasting/print_frame.c @@ -6,7 +6,7 @@ /* By: adjoly +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2024/10/13 21:01:53 by adjoly #+# #+# */ -/* Updated: 2024/10/13 21:37:17 by adjoly ### ########.fr */ +/* Updated: 2024/10/23 11:19:58 by adjoly ### ########.fr */ /* */ /* ************************************************************************** */ @@ -36,12 +36,12 @@ void draw_rectangle(t_cub *cub, void *img, t_coord start, t_coord end) void *print_frame(t_cub *cub) { uint16_t *lines; - int start; - int stop; - size_t i; - void *img; + int start; + int stop; + size_t i; + void *img; - lines = dda(&cub->player, cub->map); + lines = dda(&(cub->player), cub->map); img = mlx_new_image(cub->mlx, WINDOW_X, WINDOW_Y); i = 0; while (i < WINDOW_X / RAY_SIZE) @@ -52,7 +52,7 @@ void *print_frame(t_cub *cub) stop = lines[i] / 2 + WINDOW_Y / 2; if (stop >= WINDOW_Y) stop = WINDOW_Y - 1; - draw_rectangle(cub, img, (t_coord){i * RAY_SIZE, start}, (t_coord){i * RAY_SIZE + RAY_SIZE - 1, stop}); + draw_rectangle(cub, img, (t_coord){i * RAY_SIZE, start}, (t_coord){i * RAY_SIZE + RAY_SIZE + 1, stop}); i++; } return (img); From efa0d6fbbd2fd4759df0294ec5121596aeb5636c Mon Sep 17 00:00:00 2001 From: Adam JOLY Date: Mon, 28 Oct 2024 14:41:48 +0100 Subject: [PATCH 17/24] =?UTF-8?q?=E3=80=8C=F0=9F=8F=97=EF=B8=8F=E3=80=8D?= =?UTF-8?q?=20wip(DDA):=20Fuck=20that=20was=20hard=20(thx=20@kbz-8)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- includes/game/dda.h | 69 +++++--------- includes/game/game.h | 56 +++++------ includes/game/settings.h | 6 +- includes/game/typedef.h | 68 ------------- includes/game/{constant.h => vectwo.h} | 32 +++++-- src/raycasting/dda.c | 105 +++++++++++++++++++++ src/raycasting/dda/dda.c | 38 -------- src/raycasting/dda/dist_dda.c | 36 ------- src/raycasting/dda/get_ray_angle.c | 32 ------- src/raycasting/dda/setup_dda.c | 61 ------------ src/raycasting/dda/while_dda.c | 47 --------- src/raycasting/{dda/line_dda.c => maths.c} | 37 ++++---- 12 files changed, 206 insertions(+), 381 deletions(-) delete mode 100644 includes/game/typedef.h rename includes/game/{constant.h => vectwo.h} (53%) create mode 100644 src/raycasting/dda.c delete mode 100644 src/raycasting/dda/dda.c delete mode 100644 src/raycasting/dda/dist_dda.c delete mode 100644 src/raycasting/dda/get_ray_angle.c delete mode 100644 src/raycasting/dda/setup_dda.c delete mode 100644 src/raycasting/dda/while_dda.c rename src/raycasting/{dda/line_dda.c => maths.c} (56%) diff --git a/includes/game/dda.h b/includes/game/dda.h index 3ff30be..cf5473b 100644 --- a/includes/game/dda.h +++ b/includes/game/dda.h @@ -5,59 +5,38 @@ /* +:+ +:+ +:+ */ /* By: adjoly +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ -/* Created: 2024/10/04 14:04:10 by adjoly #+# #+# */ -/* Updated: 2024/10/23 15:00:05 by adjoly ### ########.fr */ +/* Created: 2024/10/28 13:04:36 by adjoly #+# #+# */ +/* Updated: 2024/10/28 14:37:10 by adjoly ### ########.fr */ /* */ /* ************************************************************************** */ -#ifndef DDA_H +# ifndef DDA_H # define DDA_H -# include "typedef.h" -# include "settings.h" -# include +# include -/** - * @brief Function used to get all the ray angle - * - * @param player The address of the t_player struct - * @param dda The address of the t_dda struct - */ -void get_ray_angle(t_player *player, t_dda (*dda)[800]); +# include "game.h" +#include "game/vectwo.h" -/** - * @brief Function used to setup all the dda variable prior to casting - * the rays - * - * @param player The address of the t_player struct - * @param dda The address of the t_dda struct - * - */ -void setup_dda(t_dda (*dda)[800], t_player *player); +typedef struct s_dda +{ + bool h; + int i; + t_vec2 map; + t_vec2 vert; + t_vec2 hori; + t_vec2 distance; +} t_dda; -/** - * @brief Function used to cast all the rays - * - * @param dda The address of the t_dda struct - * @param map The map as a char ** - * @param map_coord The coordinate of the player on the map_grid - */ -void while_dda(t_dda (*dda)[800], char **map, t_player *player); +typedef struct s_ray +{ + t_vec2 pos; + float tan; + float angle; + t_vec2 offset; + float distance; +} t_ray; - /// NEED TO COMBINE THOSE IF NOT USEFULL TO SEPARATE -/** - * @brief Function used to get the distance from the player of all rays - * - * @param dda The address of the t_dda struct - */ -float *dist_dda(t_dda dda[WINDOW_X / RAY_SIZE]); +void dda_algo(t_player *play, t_render *render); -/** - * @brief Function used to get the size of the line to be printed on the screen - * - * @param dda The array of the all the distance to the wall of the rays - */ -uint16_t *line_dda(float *wall_dist); - -uint16_t *dda(t_player *player, char **map); #endif diff --git a/includes/game/game.h b/includes/game/game.h index afee3a5..07cf4e8 100644 --- a/includes/game/game.h +++ b/includes/game/game.h @@ -6,7 +6,7 @@ /* By: adjoly +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2024/09/11 16:38:40 by adjoly #+# #+# */ -/* Updated: 2024/10/24 11:38:56 by adjoly ### ########.fr */ +/* Updated: 2024/10/28 14:08:09 by adjoly ### ########.fr */ /* */ /* ************************************************************************** */ @@ -21,10 +21,34 @@ # include # include -# include "dda.h" # include "settings.h" -# include "parsing.h" -# include "typedef.h" + +# include "vectwo.h" + +# include "../parsing.h" + +typedef struct s_map +{ + char **arr; + char p_side; + t_coord p_spawnpoint; + t_coord size; +} t_map; + +typedef struct s_render +{ + t_map *world; + void *mlx; + void *win; + void *texture[4]; +} t_render; + +typedef struct s_player +{ + t_vec2 coord; + t_coord map_coords; + double direction; +} t_player; /** * @brief This function is used to handle keypress @@ -36,13 +60,6 @@ */ int key_hook(int key, void *param); -/** - * @brief This function is used to create an image with the player position - * - * @param cub The address of a t_cub struct filled with mlx data and other - * thing - */ -void get_player_image(t_cub *cub); /** * @brief This function is here to change the direction of the player @@ -56,21 +73,4 @@ void get_player_image(t_cub *cub); */ void change_direction(double speed, bool clockwise, t_player *player); -/** - * @brief Function used to draw a square - * - * @param cub The adress of a t_cub struct - * @param coord The coordinate of the printed square - * @param size The size of the printed square - * @param color The color of the printed square - */ -void draw_square(t_cub *cub, t_coord coord, uint16_t size, int color); - -/** - * @brief Function used to draw the map - * - * @param cub The address of the t_cub struct - */ -void print_map(t_cub *cub); - #endif diff --git a/includes/game/settings.h b/includes/game/settings.h index fe2fd5b..c8e9169 100644 --- a/includes/game/settings.h +++ b/includes/game/settings.h @@ -6,7 +6,7 @@ /* By: adjoly +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2024/10/04 14:06:39 by adjoly #+# #+# */ -/* Updated: 2024/10/23 11:18:38 by adjoly ### ########.fr */ +/* Updated: 2024/10/28 14:04:25 by adjoly ### ########.fr */ /* */ /* ************************************************************************** */ @@ -21,11 +21,13 @@ # define D_KEY 7 # define WHITE 0xFFFFFFFF +# define DEG_TO_RAD 0.0174533 + # define WINDOW_Y 900 # define WINDOW_X 1600 # define PLAYER_ROT_SPEED (2 * M_PI) / 128 # define PLAYER_SPEED 3 -# define MAP_CHUNK_SIZE 64 +# define CHUNK_SIZE 64 # define RAY_SIZE 2 # define FOV ( 60 * (M_PI / 180) ) diff --git a/includes/game/typedef.h b/includes/game/typedef.h deleted file mode 100644 index 4e56264..0000000 --- a/includes/game/typedef.h +++ /dev/null @@ -1,68 +0,0 @@ -/* ************************************************************************** */ -/* */ -/* ::: :::::::: */ -/* typedef.h :+: :+: :+: */ -/* +:+ +:+ +:+ */ -/* By: adjoly +#+ +:+ +#+ */ -/* +#+#+#+#+#+ +#+ */ -/* Created: 2024/10/04 14:28:24 by adjoly #+# #+# */ -/* Updated: 2024/10/23 14:33:33 by adjoly ### ########.fr */ -/* */ -/* ************************************************************************** */ - -#ifndef STRUCT_H -# define STRUCT_H - -# include -# include "parsing.h" - -/** - * @brief Enum for the wall side that has been hit - */ -typedef enum s_wall_side -{ - HORIZONTAL, - VERTICAL -} t_wall_side; - -typedef struct s_coord_f -{ - float x; - float y; -} t_coord_f; - -typedef struct s_step -{ - char x; - char y; -} t_step; - -typedef struct s_player -{ - t_coord coords; - t_coord map_coords; - double direction; -} t_player; - -typedef struct s_cub -{ - void *mlx; - void *win; - void *sprites; - void *img; - char **map; - t_player player; -} t_cub; - - -typedef struct s_dda -{ - t_coord_f ray_dir; - t_coord_f side_dist; - t_coord_f delta_dist; - t_step step; - t_wall_side wall_side; - bool wall_hit; -} t_dda; - -#endif diff --git a/includes/game/constant.h b/includes/game/vectwo.h similarity index 53% rename from includes/game/constant.h rename to includes/game/vectwo.h index 25bf300..1fd0715 100644 --- a/includes/game/constant.h +++ b/includes/game/vectwo.h @@ -1,18 +1,38 @@ /* ************************************************************************** */ /* */ /* ::: :::::::: */ -/* constant.h :+: :+: :+: */ +/* vectwo.h :+: :+: :+: */ /* +:+ +:+ +:+ */ /* By: adjoly +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ -/* Created: 2024/10/04 16:39:48 by adjoly #+# #+# */ -/* Updated: 2024/10/04 16:40:10 by adjoly ### ########.fr */ +/* Created: 2024/10/28 13:32:14 by adjoly #+# #+# */ +/* Updated: 2024/10/28 14:24:56 by adjoly ### ########.fr */ /* */ /* ************************************************************************** */ -#ifndef CONSTANT_H -# define CONSTANT_H +#ifndef VECTWO_H +# define VECTWO_H -# define WHITE 0xFFFFFFFF +typedef struct s_vec2 +{ + float x; + float y; +} t_vec2; +/* ------------------ Vec2 Utils ------------------ */ + +/** + * @brief Gives you the distance between two point + */ +float vec2_dist(t_vec2 first, t_vec2 second); + +/** + * @brief Just add second to first + */ +void vec2_add(t_vec2 *first, t_vec2 second); + +/** + * @brief Just substract second to first + */ +void vec2_sub(t_vec2 *first, t_vec2 second); #endif diff --git a/src/raycasting/dda.c b/src/raycasting/dda.c new file mode 100644 index 0000000..1d13f69 --- /dev/null +++ b/src/raycasting/dda.c @@ -0,0 +1,105 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* dda.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: adjoly +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2024/10/07 16:55:09 by adjoly #+# #+# */ +/* Updated: 2024/10/28 14:40:14 by adjoly ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "game/vectwo.h" +#include +#include +#include + +void setup_dda_hor(t_player *play, t_ray *ray, t_dda *dda) +{ + dda->h = true; + ray->tan = tan(ray->angle); + if (cos(ray->angle) < -0.001) + { + ray->pos.x = (((int)play->coord.x >> 6) << 6) - 0.001; + ray->pos.y -= (play->coord.x - ray->pos.x) * ray->tan + play->coord.y; + ray->offset.x = -CHUNK_SIZE; + ray->offset.y = -ray->offset.x * ray->tan; + } + else if(cos(ray->angle) > 0.001) + { + ray->pos.x = (((int)play->coord.x >> 6) << 6) + CHUNK_SIZE; + ray->pos.y -= (play->coord.x - ray->pos.x) * ray->tan + play->coord.y; + ray->offset.x = CHUNK_SIZE; + ray->offset.y = -ray->offset.x * ray->tan; + } +} + +void setup_dda_ver(t_player *play, t_ray *ray, t_dda *dda) +{ + dda->h = false; + ray->tan = 1 / tan(ray->angle); + if (sin(ray->angle) < -0.001) + { + ray->pos.y = (((int)play->coord.y >> 6) << 6) - 0.001; + ray->pos.x = (play->coord.y - ray->pos.y) * ray->tan + play->coord.x; + ray->offset.y = -CHUNK_SIZE; + ray->offset.x = -ray->offset.y * ray->tan; + } + else if(sin(ray->angle) > 0.001) + { + ray->pos.y = (((int)play->coord.y >> 6) << 6) + CHUNK_SIZE; + ray->pos.x -= (play->coord.y - ray->pos.y) * ray->tan + play->coord.x; + ray->offset.y = CHUNK_SIZE; + ray->offset.x = -ray->offset.y * ray->tan; + } +} + +void dda_loop(t_dda *dda, t_ray *ray, t_map *map, t_player *play) +{ + uint16_t w; + uint16_t h; + + w = map->size.x; + h = map->size.y; + while (dda->i) + { + dda->map.x = ((int)ray->pos.x >> 6); + dda->map.y = ((int)ray->pos.x >> 6); + if (dda->map.x >= 0 && dda->map.x < w && dda->map.y >= 0 && dda->map.y < h && \ + map->arr[(int)dda->map.y][(int)dda->map.x] == '1') + { + dda->i = 0; + if (dda->h) + dda->distance.x = vec2_dist(play->coord, ray->pos); + } + else + { + vec2_add(&ray->pos, ray->offset); + dda->i--; + } + } +} + +void dda(t_player *player, t_render *render) +{ + t_dda dda; + t_ray ray; + + setup_dda_hor(player, &ray, &dda); + dda_loop(&dda, &ray, render->world, player); + setup_dda_ver(player, &ray, &dda); + dda_loop(&dda, &ray, render->world, player); + if (dda.distance.x < dda.distance.y) + { + ray.pos.x = fabsf(dda.hori.x); + ray.pos.y = fabsf(dda.hori.y); + ray.distance = dda.distance.x; + } + else + { + ray.pos.x = fabsf(dda.vert.x); + ray.pos.y = fabsf(dda.vert.y); + ray.distance = dda.distance.y; + } +} diff --git a/src/raycasting/dda/dda.c b/src/raycasting/dda/dda.c deleted file mode 100644 index 0667d8a..0000000 --- a/src/raycasting/dda/dda.c +++ /dev/null @@ -1,38 +0,0 @@ -/* ************************************************************************** */ -/* */ -/* ::: :::::::: */ -/* dda.c :+: :+: :+: */ -/* +:+ +:+ +:+ */ -/* By: adjoly +#+ +:+ +#+ */ -/* +#+#+#+#+#+ +#+ */ -/* Created: 2024/10/07 16:55:09 by adjoly #+# #+# */ -/* Updated: 2024/10/23 15:04:45 by adjoly ### ########.fr */ -/* */ -/* ************************************************************************** */ - -#include "game/dda.h" -#include "game/settings.h" -#include "sys/types.h" -#include -#include - -uint16_t *dda(t_player *player, char **map) -{ - t_dda dda[WINDOW_X / RAY_SIZE]; - float *wall_dist; - uint16_t *line_size; - - setup_dda(&dda, player); - player->map_coords.x = player->coords.x - player->coords.x % MAP_CHUNK_SIZE; - player->map_coords.y = player->coords.y - player->coords.y % MAP_CHUNK_SIZE; - while_dda(&dda, map, player); - wall_dist = dist_dda(dda); - line_size = line_dda(wall_dist); - return (line_size); -} - -/** -* calculate size on screen -* screen_height / per_wall_dist -* (and get orientation) -*/ diff --git a/src/raycasting/dda/dist_dda.c b/src/raycasting/dda/dist_dda.c deleted file mode 100644 index 0abfa19..0000000 --- a/src/raycasting/dda/dist_dda.c +++ /dev/null @@ -1,36 +0,0 @@ -/* ************************************************************************** */ -/* */ -/* ::: :::::::: */ -/* dist_dda.c :+: :+: :+: */ -/* +:+ +:+ +:+ */ -/* By: adjoly +#+ +:+ +#+ */ -/* +#+#+#+#+#+ +#+ */ -/* Created: 2024/10/08 13:26:19 by adjoly #+# #+# */ -/* Updated: 2024/10/23 14:10:52 by adjoly ### ########.fr */ -/* */ -/* ************************************************************************** */ - -#include "game/dda.h" -#include -#include "game/settings.h" -#include "libft.h" - -float *dist_dda(t_dda dda[WINDOW_X / RAY_SIZE]) -{ - size_t i; - float *wall_dist; - - i = 0; - wall_dist = ft_calloc(WINDOW_X / RAY_SIZE + 1, sizeof(float)); - if (!wall_dist) - return (NULL); - while (i < WINDOW_X / RAY_SIZE) - { - if (dda[i].wall_side == HORIZONTAL) - wall_dist[i] = dda[i].side_dist.x - dda[i].delta_dist.x; - else - wall_dist[i] = dda[i].side_dist.y - dda[i].delta_dist.y; - i++; - } - return (wall_dist); -} diff --git a/src/raycasting/dda/get_ray_angle.c b/src/raycasting/dda/get_ray_angle.c deleted file mode 100644 index f2d7509..0000000 --- a/src/raycasting/dda/get_ray_angle.c +++ /dev/null @@ -1,32 +0,0 @@ -/* ************************************************************************** */ -/* */ -/* ::: :::::::: */ -/* get_ray_angle.c :+: :+: :+: */ -/* +:+ +:+ +:+ */ -/* By: adjoly +#+ +:+ +#+ */ -/* +#+#+#+#+#+ +#+ */ -/* Created: 2024/09/29 15:26:29 by adjoly #+# #+# */ -/* Updated: 2024/10/23 14:19:21 by adjoly ### ########.fr */ -/* */ -/* ************************************************************************** */ - -#include "game/dda.h" -#include "game/settings.h" -#include -#include -#include - -void get_ray_angle(t_player *player, t_dda (*dda)[WINDOW_X / RAY_SIZE]) -{ - uint16_t x; - float ray_angle; - - x = 0; - while (x < WINDOW_X) - { - ray_angle = (float)(player->direction - (FOV / 2) + ((float)x / WINDOW_X) * FOV); - (*dda)[x / RAY_SIZE].ray_dir.x = cos(ray_angle); - (*dda)[x / RAY_SIZE].ray_dir.y = sin(ray_angle); - x += RAY_SIZE; - } -} diff --git a/src/raycasting/dda/setup_dda.c b/src/raycasting/dda/setup_dda.c deleted file mode 100644 index 5c6467e..0000000 --- a/src/raycasting/dda/setup_dda.c +++ /dev/null @@ -1,61 +0,0 @@ -/* ************************************************************************** */ -/* */ -/* ::: :::::::: */ -/* setup_dda.c :+: :+: :+: */ -/* +:+ +:+ +:+ */ -/* By: adjoly +#+ +:+ +#+ */ -/* +#+#+#+#+#+ +#+ */ -/* Created: 2024/09/30 23:47:14 by adjoly #+# #+# */ -/* Updated: 2024/10/24 12:40:00 by adjoly ### ########.fr */ -/* */ -/* ************************************************************************** */ - -#include "game/settings.h" -#include "game/dda.h" -#include -#include -#include -#include - -void get_side_dist(t_dda *dda, t_player *player) -{ - if (dda->ray_dir.x < 0) - { - dda->side_dist.x = (player->coords.x - player->map_coords.x) * dda->delta_dist.x; - dda->step.x = -MAP_CHUNK_SIZE; - } - else - { - dda->side_dist.x = ((player->map_coords.x + MAP_CHUNK_SIZE) - player->coords.x) * dda->delta_dist.x; - dda->step.x = MAP_CHUNK_SIZE; - } - if (dda->ray_dir.y < 0) - { - dda->side_dist.y = (player->coords.y - player->map_coords.y) * dda->delta_dist.y; - dda->step.y = -MAP_CHUNK_SIZE; - } - else - { - dda->side_dist.y = (player->map_coords.y + MAP_CHUNK_SIZE - player->coords.y) * dda->delta_dist.y; - dda->step.y = MAP_CHUNK_SIZE; - } -} - -void setup_dda(t_dda (*dda)[WINDOW_X / RAY_SIZE], t_player *player) -{ - size_t i; - - i = 0; - get_ray_angle(player, dda); - while (i < WINDOW_X / RAY_SIZE) - { - (*dda)[i].delta_dist.x = fabsf(MAP_CHUNK_SIZE / (*dda)[i].ray_dir.x); - (*dda)[i].delta_dist.y = fabsf(MAP_CHUNK_SIZE / (*dda)[i].ray_dir.y); - printf("%f \n", (*dda)[i].delta_dist.x); - printf("%f \n", (*dda)[i].delta_dist.y); - get_side_dist(&(*dda)[i], player); - printf("side %f \n", (*dda)[i].side_dist.x); - printf("side %f \n", (*dda)[i].side_dist.y); - i++; - } -} diff --git a/src/raycasting/dda/while_dda.c b/src/raycasting/dda/while_dda.c deleted file mode 100644 index 381d60e..0000000 --- a/src/raycasting/dda/while_dda.c +++ /dev/null @@ -1,47 +0,0 @@ -/* ************************************************************************** */ -/* */ -/* ::: :::::::: */ -/* while_dda.c :+: :+: :+: */ -/* +:+ +:+ +:+ */ -/* By: adjoly +#+ +:+ +#+ */ -/* +#+#+#+#+#+ +#+ */ -/* Created: 2024/10/06 18:46:56 by adjoly #+# #+# */ -/* Updated: 2024/10/23 15:03:03 by adjoly ### ########.fr */ -/* */ -/* ************************************************************************** */ - -#include "game/dda.h" -#include "game/settings.h" -#include - -void while_dda(t_dda (*dda)[WINDOW_X / RAY_SIZE], char **map, t_player *player) -{ - uint16_t i; - t_coord map_coord; - - i = 0; - while (i < WINDOW_X / RAY_SIZE) - { - (*dda)[i].wall_hit = false; - map_coord.x = player->map_coords.x; - map_coord.y = player->map_coords.y; - while (!(*dda)[i].wall_hit) - { - if ((*dda)[i].side_dist.x < (*dda)[i].side_dist.y) - { - (*dda)[i].side_dist.x += (*dda)[i].delta_dist.x; - map_coord.x += (*dda)[i].step.x; - (*dda)[i].wall_side = HORIZONTAL; - } - else - { - (*dda)[i].side_dist.y += (*dda)[i].delta_dist.y; - map_coord.y += (*dda)[i].step.y; - (*dda)[i].wall_side = VERTICAL; - } - if (map_coord.x < 0 || map_coord.y < 0 || map[map_coord.x / MAP_CHUNK_SIZE][map_coord.y / MAP_CHUNK_SIZE] == '1') - (*dda)[i].wall_hit = true; - } - i++; - } -} diff --git a/src/raycasting/dda/line_dda.c b/src/raycasting/maths.c similarity index 56% rename from src/raycasting/dda/line_dda.c rename to src/raycasting/maths.c index 76afae6..3d5917c 100644 --- a/src/raycasting/dda/line_dda.c +++ b/src/raycasting/maths.c @@ -1,30 +1,31 @@ /* ************************************************************************** */ /* */ /* ::: :::::::: */ -/* line_dda.c :+: :+: :+: */ +/* maths.c :+: :+: :+: */ /* +:+ +:+ +:+ */ /* By: adjoly +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ -/* Created: 2024/10/13 17:27:44 by adjoly #+# #+# */ -/* Updated: 2024/10/22 13:03:40 by adjoly ### ########.fr */ +/* Created: 2024/10/26 15:47:29 by adjoly #+# #+# */ +/* Updated: 2024/10/28 14:00:34 by adjoly ### ########.fr */ /* */ /* ************************************************************************** */ -#include "game/settings.h" -#include "game/dda.h" -#include +#include +#include -uint16_t *line_dda(float *wall_dist) +float vec2_dist(t_vec2 first, t_vec2 second) { - uint16_t i; - uint16_t *line_size; - - i = 0; - line_size = malloc(WINDOW_X / RAY_SIZE * sizeof(uint16_t)); - while (i < WINDOW_X / RAY_SIZE) - { - line_size[i] = WINDOW_Y * MAP_CHUNK_SIZE / wall_dist[i]; - i++; - } - return (line_size); + return (sqrt(powf(second.x - first.x, 2) + powf(second.y - first.y, 2))); +} + +void vec2_add(t_vec2 *first, t_vec2 second) +{ + first->x += second.x; + first->y += second.y; +} + +void vec2_sub(t_vec2 *first, t_vec2 second) +{ + first->x -= second.x; + first->y -= second.y; } From 90c84c7b37c89edff4a512adf4e528175e9b18e0 Mon Sep 17 00:00:00 2001 From: Adam JOLY Date: Wed, 30 Oct 2024 16:33:14 +0100 Subject: [PATCH 18/24] =?UTF-8?q?=E3=80=8C=F0=9F=8F=97=EF=B8=8F=E3=80=8D?= =?UTF-8?q?=20wip(Raycasting):=20Should=20be=20working=20but=20not?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- includes/game/dda.h | 5 +- includes/game/game.h | 37 ++++--- includes/game/math.h | 14 +++ includes/game/settings.h | 13 +-- .../print_map.c => includes/game/utils_math.h | 34 ++----- src/cub3d.c | 47 ++++----- src/raycasting/dda.c | 78 +++++++++------ src/raycasting/get_player_image.c | 35 ------- src/raycasting/key_hook.c | 46 +++++---- src/raycasting/maths.c | 24 ++--- src/raycasting/print_frame.c | 59 ----------- src/raycasting/renderer.c | 97 +++++++++++++++++++ .../{graphic_utils/draw_square.c => vectwo.c} | 39 ++++---- 13 files changed, 281 insertions(+), 247 deletions(-) create mode 100644 includes/game/math.h rename src/raycasting/print_map.c => includes/game/utils_math.h (56%) delete mode 100644 src/raycasting/get_player_image.c delete mode 100644 src/raycasting/print_frame.c create mode 100644 src/raycasting/renderer.c rename src/raycasting/{graphic_utils/draw_square.c => vectwo.c} (56%) diff --git a/includes/game/dda.h b/includes/game/dda.h index cf5473b..eab5af4 100644 --- a/includes/game/dda.h +++ b/includes/game/dda.h @@ -6,7 +6,7 @@ /* By: adjoly +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2024/10/28 13:04:36 by adjoly #+# #+# */ -/* Updated: 2024/10/28 14:37:10 by adjoly ### ########.fr */ +/* Updated: 2024/10/29 14:15:59 by adjoly ### ########.fr */ /* */ /* ************************************************************************** */ @@ -22,6 +22,7 @@ typedef struct s_dda { bool h; int i; + bool s; t_vec2 map; t_vec2 vert; t_vec2 hori; @@ -37,6 +38,6 @@ typedef struct s_ray float distance; } t_ray; -void dda_algo(t_player *play, t_render *render); +void dda_algo(t_render *render, t_dda *dda, t_ray *ray); #endif diff --git a/includes/game/game.h b/includes/game/game.h index 07cf4e8..1f4a5f8 100644 --- a/includes/game/game.h +++ b/includes/game/game.h @@ -6,7 +6,7 @@ /* By: adjoly +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2024/09/11 16:38:40 by adjoly #+# #+# */ -/* Updated: 2024/10/28 14:08:09 by adjoly ### ########.fr */ +/* Updated: 2024/10/29 13:56:32 by adjoly ### ########.fr */ /* */ /* ************************************************************************** */ @@ -30,26 +30,30 @@ typedef struct s_map { char **arr; + int floor; + int celling; char p_side; t_coord p_spawnpoint; t_coord size; } t_map; -typedef struct s_render -{ - t_map *world; - void *mlx; - void *win; - void *texture[4]; -} t_render; - typedef struct s_player { t_vec2 coord; - t_coord map_coords; - double direction; + float direction; } t_player; +typedef struct s_render +{ + t_map *world; + void *mlx; + void *win; + void *img; + t_player *player; + void *texture[4]; +} t_render; + + /** * @brief This function is used to handle keypress * @@ -71,6 +75,15 @@ int key_hook(int key, void *param); * @param clockwise The direction which the player rotate * @param player A pointer to a t_player struct */ -void change_direction(double speed, bool clockwise, t_player *player); +void change_direction(float speed, bool clockwise, t_player *player); + + +/** + * @brief Render a cub3d frame by executing a dda on every ray and + * putting the pixel on the window + * + * @param render The render struct with everything i need + */ +void render_frame(t_render *render); #endif diff --git a/includes/game/math.h b/includes/game/math.h new file mode 100644 index 0000000..e7956f9 --- /dev/null +++ b/includes/game/math.h @@ -0,0 +1,14 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* math.h :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: adjoly +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2024/10/29 10:07:24 by adjoly #+# #+# */ +/* Updated: 2024/10/29 10:08:53 by adjoly ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#ifndef +void fix_ang(float *ang); diff --git a/includes/game/settings.h b/includes/game/settings.h index c8e9169..0a36884 100644 --- a/includes/game/settings.h +++ b/includes/game/settings.h @@ -6,7 +6,7 @@ /* By: adjoly +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2024/10/04 14:06:39 by adjoly #+# #+# */ -/* Updated: 2024/10/28 14:04:25 by adjoly ### ########.fr */ +/* Updated: 2024/10/29 14:55:59 by adjoly ### ########.fr */ /* */ /* ************************************************************************** */ @@ -23,12 +23,13 @@ # define WHITE 0xFFFFFFFF # define DEG_TO_RAD 0.0174533 -# define WINDOW_Y 900 -# define WINDOW_X 1600 +# define WINDOW_H 900 +# define WINDOW_W 1600 # define PLAYER_ROT_SPEED (2 * M_PI) / 128 -# define PLAYER_SPEED 3 -# define CHUNK_SIZE 64 -# define RAY_SIZE 2 +# define PLAYER_SPEED 0.01 +# define RAY_SIZE 1 # define FOV ( 60 * (M_PI / 180) ) +# define CHUNK_SIZE 64 + #endif diff --git a/src/raycasting/print_map.c b/includes/game/utils_math.h similarity index 56% rename from src/raycasting/print_map.c rename to includes/game/utils_math.h index a129f79..1a36bc3 100644 --- a/src/raycasting/print_map.c +++ b/includes/game/utils_math.h @@ -1,36 +1,20 @@ /* ************************************************************************** */ /* */ /* ::: :::::::: */ -/* print_map.c :+: :+: :+: */ +/* utils_math.h :+: :+: :+: */ /* +:+ +:+ +:+ */ /* By: adjoly +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ -/* Created: 2024/09/23 14:09:17 by adjoly #+# #+# */ -/* Updated: 2024/10/06 17:58:25 by adjoly ### ########.fr */ +/* Created: 2024/10/29 10:07:24 by adjoly #+# #+# */ +/* Updated: 2024/10/29 10:08:04 by adjoly ### ########.fr */ /* */ /* ************************************************************************** */ -#include "game/game.h" -#include "mlx.h" -#include +#ifndef UTILS_MATH_H +# define UTILS_MATH_H -void print_map(t_cub *cub) -{ - size_t i; - size_t j; +#include - i = 0; - while (cub->map[i]) - { - j = 0; - while (cub->map[i][j]) - { - if (cub->map[i][j] == '1') - { - draw_square(cub, (t_coord){j * MAP_CHUNK_SIZE, i * MAP_CHUNK_SIZE}, MAP_CHUNK_SIZE, WHITE); - } - j++; - } - i++; - } -} +void fix_ang(float *ang); + +#endif diff --git a/src/cub3d.c b/src/cub3d.c index 0ab9ec3..fede1d3 100644 --- a/src/cub3d.c +++ b/src/cub3d.c @@ -6,7 +6,7 @@ /* By: madumerg +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2024/09/04 16:58:27 by madumerg #+# #+# */ -/* Updated: 2024/10/24 12:51:06 by adjoly ### ########.fr */ +/* Updated: 2024/10/30 10:02:56 by adjoly ### ########.fr */ /* */ /* ************************************************************************** */ @@ -17,32 +17,33 @@ #include "mlx.h" #include -void *print_frame(t_cub *cub); - int main(int ac, char **av) { - t_cub cub; + t_render render; + t_map world; + t_player player; - cub.map = ft_calloc(6, sizeof(char *)); - cub.map[0] = ft_strdup("111111"); - cub.map[1] = ft_strdup("101001"); - cub.map[2] = ft_strdup("100001"); - cub.map[3] = ft_strdup("100001"); - cub.map[4] = ft_strdup("111111"); - cub.map[5] = NULL; + render.player = &player; + render.world = &world; + world.celling = 0xffffa07a; + world.floor = 0xffadd8e6; + world.arr = ft_split("11111 10001 10001 10001 11111", ' '); + world.size.x = 5; + world.size.y = 5; + player.coord.x = 1; + player.coord.y = 1; + player.direction = 0; + render.mlx = mlx_init(); + render.win = mlx_new_window(render.mlx, WINDOW_W, WINDOW_H, "WTF"); + render.img = mlx_new_image(render.mlx, WINDOW_W, WINDOW_H); + render_frame(&render); + mlx_put_image_to_window(render.mlx, render.win, render.img, 0, 0); (void)ac; (void)av; - cub.mlx = mlx_init(); - cub.win = mlx_new_window(cub.mlx, WINDOW_X, WINDOW_Y, "WTF"); - cub.player.coords.x = 128; - cub.player.coords.y = 128; - cub.player.direction = 0; - cub.img = print_frame(&cub); - mlx_put_image_to_window(cub.mlx, cub.win, cub.img, 0, 0); - mlx_on_event(cub.mlx, cub.win, MLX_KEYDOWN, key_hook, &cub); - mlx_loop(cub.mlx); - mlx_destroy_image(cub.mlx, cub.img); - mlx_destroy_window(cub.mlx, cub.win); - mlx_destroy_display(cub.mlx); + mlx_on_event(render.mlx, render.win, MLX_KEYDOWN, key_hook, &render); + mlx_loop(render.mlx); + mlx_destroy_image(render.mlx, render.img); + mlx_destroy_window(render.mlx, render.win); + mlx_destroy_display(render.mlx); return (0); } diff --git a/src/raycasting/dda.c b/src/raycasting/dda.c index 1d13f69..23db3ec 100644 --- a/src/raycasting/dda.c +++ b/src/raycasting/dda.c @@ -6,7 +6,7 @@ /* By: adjoly +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2024/10/07 16:55:09 by adjoly #+# #+# */ -/* Updated: 2024/10/28 14:40:14 by adjoly ### ########.fr */ +/* Updated: 2024/10/30 14:42:06 by adjoly ### ########.fr */ /* */ /* ************************************************************************** */ @@ -18,40 +18,54 @@ void setup_dda_hor(t_player *play, t_ray *ray, t_dda *dda) { dda->h = true; + dda->s = true; ray->tan = tan(ray->angle); if (cos(ray->angle) < -0.001) { + ray->offset.x = -CHUNK_SIZE; + ray->offset.y = CHUNK_SIZE * ray->tan; ray->pos.x = (((int)play->coord.x >> 6) << 6) - 0.001; ray->pos.y -= (play->coord.x - ray->pos.x) * ray->tan + play->coord.y; - ray->offset.x = -CHUNK_SIZE; - ray->offset.y = -ray->offset.x * ray->tan; } else if(cos(ray->angle) > 0.001) { + ray->offset.x = CHUNK_SIZE; + ray->offset.y = -CHUNK_SIZE * ray->tan; ray->pos.x = (((int)play->coord.x >> 6) << 6) + CHUNK_SIZE; ray->pos.y -= (play->coord.x - ray->pos.x) * ray->tan + play->coord.y; - ray->offset.x = CHUNK_SIZE; - ray->offset.y = -ray->offset.x * ray->tan; + } + else + { + dda->s = false; + ray->pos.x = play->coord.x; + ray->pos.y = play->coord.y; } } void setup_dda_ver(t_player *play, t_ray *ray, t_dda *dda) { + dda->s = true; dda->h = false; ray->tan = 1 / tan(ray->angle); if (sin(ray->angle) < -0.001) { - ray->pos.y = (((int)play->coord.y >> 6) << 6) - 0.001; + ray->offset.y = CHUNK_SIZE; + ray->offset.x = -CHUNK_SIZE * ray->tan; + ray->pos.y = (((int)play->coord.y >> 6) << 6) - CHUNK_SIZE; ray->pos.x = (play->coord.y - ray->pos.y) * ray->tan + play->coord.x; - ray->offset.y = -CHUNK_SIZE; - ray->offset.x = -ray->offset.y * ray->tan; } else if(sin(ray->angle) > 0.001) { - ray->pos.y = (((int)play->coord.y >> 6) << 6) + CHUNK_SIZE; + ray->offset.y = -CHUNK_SIZE; + ray->offset.x = CHUNK_SIZE * ray->tan; + ray->pos.y = (((int)play->coord.y >> 6) << 6) + 0.001; ray->pos.x -= (play->coord.y - ray->pos.y) * ray->tan + play->coord.x; - ray->offset.y = CHUNK_SIZE; - ray->offset.x = -ray->offset.y * ray->tan; + } + else + { + dda->s = false; + ray->pos.x = play->coord.x; + ray->pos.y = play->coord.y; } } @@ -62,15 +76,18 @@ void dda_loop(t_dda *dda, t_ray *ray, t_map *map, t_player *play) w = map->size.x; h = map->size.y; - while (dda->i) + while (dda->s && dda->i) { - dda->map.x = ((int)ray->pos.x >> 6); - dda->map.y = ((int)ray->pos.x >> 6); + dda->map.x = (int)(ray->pos.x / 64); + dda->map.y = (int)(ray->pos.y / 64); + printf("%f, %f\n", ray->pos.x, ray->pos.y); if (dda->map.x >= 0 && dda->map.x < w && dda->map.y >= 0 && dda->map.y < h && \ map->arr[(int)dda->map.y][(int)dda->map.x] == '1') { dda->i = 0; if (dda->h) + dda->distance.y = vec2_dist(play->coord, ray->pos); + else dda->distance.x = vec2_dist(play->coord, ray->pos); } else @@ -81,25 +98,28 @@ void dda_loop(t_dda *dda, t_ray *ray, t_map *map, t_player *play) } } -void dda(t_player *player, t_render *render) +void dda_algo(t_render *render, t_dda *dda, t_ray *ray) { - t_dda dda; - t_ray ray; - - setup_dda_hor(player, &ray, &dda); - dda_loop(&dda, &ray, render->world, player); - setup_dda_ver(player, &ray, &dda); - dda_loop(&dda, &ray, render->world, player); - if (dda.distance.x < dda.distance.y) + setup_dda_hor(render->player, ray, dda); + dda->i = render->world->size.y; + dda_loop(dda, ray, render->world, render->player); + dda->hori.x = ray->pos.x; + dda->hori.y = ray->pos.y; + setup_dda_ver(render->player, ray, dda); + dda->i = render->world->size.x; + dda_loop(dda, ray, render->world, render->player); + dda->vert.x = ray->pos.x; + dda->vert.y = ray->pos.y; + if (dda->distance.y < dda->distance.x) { - ray.pos.x = fabsf(dda.hori.x); - ray.pos.y = fabsf(dda.hori.y); - ray.distance = dda.distance.x; + ray->pos.x = fabsf(dda->hori.x); + ray->pos.y = fabsf(dda->hori.y); + ray->distance = dda->distance.x; } else { - ray.pos.x = fabsf(dda.vert.x); - ray.pos.y = fabsf(dda.vert.y); - ray.distance = dda.distance.y; + ray->pos.x = fabsf(dda->vert.x); + ray->pos.y = fabsf(dda->vert.y); + ray->distance = dda->distance.y; } } diff --git a/src/raycasting/get_player_image.c b/src/raycasting/get_player_image.c deleted file mode 100644 index 08c7fa1..0000000 --- a/src/raycasting/get_player_image.c +++ /dev/null @@ -1,35 +0,0 @@ -/* ************************************************************************** */ -/* */ -/* ::: :::::::: */ -/* get_player_image.c :+: :+: :+: */ -/* +:+ +:+ +:+ */ -/* By: adjoly +#+ +:+ +#+ */ -/* +#+#+#+#+#+ +#+ */ -/* Created: 2024/09/13 11:05:02 by adjoly #+# #+# */ -/* Updated: 2024/10/24 11:17:06 by adjoly ### ########.fr */ -/* */ -/* ************************************************************************** */ - -#include "game/game.h" -#include "game/settings.h" -#include "math.h" -#include - -void change_direction(double speed, bool clockwise, t_player *player) -{ - if (clockwise) - player->direction -= speed; - else - player->direction += speed; - if (player->direction >= 2 * M_PI) - player->direction = 0; - else if (player->direction < 0) - player->direction = 2 * M_PI; -} - -void get_player_image(t_cub *cub) -{ - print_map(cub); - draw_square(cub, (t_coord){cub->player.coords.x - 2, cub->player.coords.y - 2}, \ - 5, WHITE); -} diff --git a/src/raycasting/key_hook.c b/src/raycasting/key_hook.c index 153cf85..accc010 100644 --- a/src/raycasting/key_hook.c +++ b/src/raycasting/key_hook.c @@ -6,43 +6,49 @@ /* By: adjoly +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2024/09/11 16:37:56 by adjoly #+# #+# */ -/* Updated: 2024/10/24 11:41:30 by adjoly ### ########.fr */ +/* Updated: 2024/10/29 14:57:10 by adjoly ### ########.fr */ /* */ /* ************************************************************************** */ +#include "game/settings.h" #include "mlx.h" -#include "game/game.h" +#include +#include -void *print_frame(t_cub *cub); +void change_direction(float speed, bool clockwise, t_player *player) +{ + if (clockwise) + player->direction += speed; + else + player->direction -= speed; + fix_ang(&player->direction); +} int key_hook(int key, void *param) { - t_cub *cub; + t_render *render; - cub = (t_cub *)param; - (void)cub; + render = (t_render *)param; if (key == ESCAPE_KEY) - { - mlx_loop_end(cub->mlx); - return (0); - } + return (mlx_loop_end(render->mlx)); if (key == W_KEY) { - cub->player.coords.x += PLAYER_SPEED * cos(cub->player.direction); - cub->player.coords.y += PLAYER_SPEED * sin(cub->player.direction); + render->player->coord.x += PLAYER_SPEED * cos(render->player->direction); + render->player->coord.y += PLAYER_SPEED * sin(render->player->direction); } else if (key == S_KEY) { - cub->player.coords.x -= PLAYER_SPEED * cos(cub->player.direction); - cub->player.coords.y -= PLAYER_SPEED * sin(cub->player.direction); + render->player->coord.x -= PLAYER_SPEED * cos(render->player->direction); + render->player->coord.y -= PLAYER_SPEED * sin(render->player->direction); } else if (key == D_KEY) - change_direction(PLAYER_ROT_SPEED, false, &cub->player); + change_direction(PLAYER_ROT_SPEED, false, render->player); else if (key == A_KEY) - change_direction(PLAYER_ROT_SPEED, true, &cub->player); - mlx_destroy_image(cub->mlx, cub->img); - cub->img = print_frame(cub); - //get_player_image(cub); - mlx_put_image_to_window(cub->mlx, cub->win, cub->img, 0, 0); + change_direction(PLAYER_ROT_SPEED, true, render->player); + printf("player coord x = %f, y = %f\n", render->player->coord.x, render->player->coord.y); + mlx_destroy_image(render->mlx, render->img); + render->img = mlx_new_image(render->mlx, WINDOW_W, WINDOW_H); + render_frame(render); + mlx_put_image_to_window(render->mlx, render->win, render->img, 0, 0); return (0); } diff --git a/src/raycasting/maths.c b/src/raycasting/maths.c index 3d5917c..4eaa3c2 100644 --- a/src/raycasting/maths.c +++ b/src/raycasting/maths.c @@ -5,27 +5,17 @@ /* +:+ +:+ +:+ */ /* By: adjoly +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ -/* Created: 2024/10/26 15:47:29 by adjoly #+# #+# */ -/* Updated: 2024/10/28 14:00:34 by adjoly ### ########.fr */ +/* Created: 2024/10/29 10:05:15 by adjoly #+# #+# */ +/* Updated: 2024/10/29 10:05:29 by adjoly ### ########.fr */ /* */ /* ************************************************************************** */ -#include #include -float vec2_dist(t_vec2 first, t_vec2 second) +void fix_ang(float *ang) { - return (sqrt(powf(second.x - first.x, 2) + powf(second.y - first.y, 2))); -} - -void vec2_add(t_vec2 *first, t_vec2 second) -{ - first->x += second.x; - first->y += second.y; -} - -void vec2_sub(t_vec2 *first, t_vec2 second) -{ - first->x -= second.x; - first->y -= second.y; + if (*ang < 0) + *ang += 2 * M_PI; + if (*ang > 2 * M_PI) + *ang -= 2 * M_PI; } diff --git a/src/raycasting/print_frame.c b/src/raycasting/print_frame.c deleted file mode 100644 index 5a562d0..0000000 --- a/src/raycasting/print_frame.c +++ /dev/null @@ -1,59 +0,0 @@ -/* ************************************************************************** */ -/* */ -/* ::: :::::::: */ -/* print_frame.c :+: :+: :+: */ -/* +:+ +:+ +:+ */ -/* By: adjoly +#+ +:+ +#+ */ -/* +#+#+#+#+#+ +#+ */ -/* Created: 2024/10/13 21:01:53 by adjoly #+# #+# */ -/* Updated: 2024/10/23 11:19:58 by adjoly ### ########.fr */ -/* */ -/* ************************************************************************** */ - -#include "game/dda.h" -#include "mlx.h" -#include -#include "game/settings.h" - -void draw_rectangle(t_cub *cub, void *img, t_coord start, t_coord end) -{ - int x; - int y; - - x = start.x; - y = start.y; - while (x < end.x) - { - while (y < end.y) - { - mlx_set_image_pixel(cub->mlx, img, x, y, WHITE); - y++; - } - x++; - } -} - -void *print_frame(t_cub *cub) -{ - uint16_t *lines; - int start; - int stop; - size_t i; - void *img; - - lines = dda(&(cub->player), cub->map); - img = mlx_new_image(cub->mlx, WINDOW_X, WINDOW_Y); - i = 0; - while (i < WINDOW_X / RAY_SIZE) - { - start = -lines[i] / 2 + WINDOW_Y / 2; - if (start < 0) - start = 0; - stop = lines[i] / 2 + WINDOW_Y / 2; - if (stop >= WINDOW_Y) - stop = WINDOW_Y - 1; - draw_rectangle(cub, img, (t_coord){i * RAY_SIZE, start}, (t_coord){i * RAY_SIZE + RAY_SIZE + 1, stop}); - i++; - } - return (img); -} diff --git a/src/raycasting/renderer.c b/src/raycasting/renderer.c new file mode 100644 index 0000000..03691a6 --- /dev/null +++ b/src/raycasting/renderer.c @@ -0,0 +1,97 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* renderer.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: adjoly +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2024/10/28 15:48:39 by adjoly #+# #+# */ +/* Updated: 2024/10/29 14:22:37 by adjoly ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "game/utils_math.h" +#include "mlx.h" +#include +#include +#include + +void draw_floor(t_render *render) +{ + size_t x; + size_t y; + + y = WINDOW_H / 2; + while(y < WINDOW_H - 1) + { + x = 0; + while (x < WINDOW_W) + { + mlx_set_image_pixel(render->mlx, render->img, x, y, render->world->floor); + x++; + } + y++; + } +} + +void draw_celling(t_render *render) +{ + size_t x; + size_t y; + + y = 0; + while(y < WINDOW_H / 2) + { + x = 0; + while (x < WINDOW_W) + { + mlx_set_image_pixel(render->mlx, render->img, x, y, render->world->celling); + x++; + } + y++; + } +} + +void print_line(t_render *render, t_ray *ray, int x) +{ + int line; + int line_start; + int y; + int j; + + line = (CHUNK_SIZE * WINDOW_H) / ray->distance; + line_start = -line / 2 + WINDOW_H / 2; + y = 0; + while (y < line) + { + j = -1; + while (++j <= RAY_SIZE) + mlx_set_image_pixel(render->mlx, render->img, x + j, line_start + y, WHITE); + y++; + } +} + +void render_frame(t_render *render) +{ + size_t i; + t_dda dda; + t_ray ray; + float ang; + + i = WINDOW_W; + ray.angle = render->player->direction - (M_PI / 180) / (FOV / 2); + fix_ang(&ray.angle); + draw_celling(render); + draw_floor(render); + while(i > 0) + { + dda_algo(render, &dda, &ray); + ang = render->player->direction - ray.angle; + fix_ang(&ang); + ray.distance *= cos(ang); + print_line(render, &ray, i); + ray.angle += (M_PI / 180) / (WINDOW_W / FOV); + fix_ang(&ray.angle); + i -= RAY_SIZE; + } +} diff --git a/src/raycasting/graphic_utils/draw_square.c b/src/raycasting/vectwo.c similarity index 56% rename from src/raycasting/graphic_utils/draw_square.c rename to src/raycasting/vectwo.c index 3f82596..5795d1a 100644 --- a/src/raycasting/graphic_utils/draw_square.c +++ b/src/raycasting/vectwo.c @@ -1,31 +1,32 @@ /* ************************************************************************** */ /* */ /* ::: :::::::: */ -/* draw_square.c :+: :+: :+: */ +/* vectwo.c :+: :+: :+: */ /* +:+ +:+ +:+ */ /* By: adjoly +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ -/* Created: 2024/09/17 11:09:52 by adjoly #+# #+# */ -/* Updated: 2024/10/06 15:41:55 by adjoly ### ########.fr */ +/* Created: 2024/10/26 15:47:29 by adjoly #+# #+# */ +/* Updated: 2024/10/28 15:20:24 by adjoly ### ########.fr */ /* */ /* ************************************************************************** */ -#include "game/game.h" -#include "mlx.h" +#include "game/vectwo.h" +#include -void draw_square(t_cub *cub, t_coord coord, uint16_t size, int color) + +float vec2_dist(t_vec2 first, t_vec2 second) { - t_coord start; - - start = coord; - while (coord.x - start.x <= size) - { - coord.y = start.y; - while (coord.y - start.y <= size) - { - mlx_set_image_pixel(cub->mlx, cub->img, coord.x, coord.y, color); - coord.y++; - } - coord.x++; - } + return (sqrt(powf(second.x - first.x, 2) + powf(second.y - first.y, 2))); +} + +void vec2_add(t_vec2 *first, t_vec2 second) +{ + first->x += second.x; + first->y += second.y; +} + +void vec2_sub(t_vec2 *first, t_vec2 second) +{ + first->x -= second.x; + first->y -= second.y; } From 0d54c93764ccd8ea70338334e29cc5b59fae00e1 Mon Sep 17 00:00:00 2001 From: Maelys Date: Fri, 1 Nov 2024 16:34:54 +0100 Subject: [PATCH 19/24] =?UTF-8?q?=E3=80=8C=F0=9F=8F=97=EF=B8=8F=E3=80=8D?= =?UTF-8?q?=20wip(ft=5Fpassagepietion):=20passage=20pieton=20working=20:+1?= =?UTF-8?q?:?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- MacroLibX | 2 +- includes/game/settings.h | 4 ++-- src/cub3d.c | 8 ++++---- src/raycasting/dda.c | 22 ++++++++++++---------- src/raycasting/key_hook.c | 2 +- src/raycasting/renderer.c | 12 ++++++++---- src/raycasting/vectwo.c | 3 +-- 7 files changed, 29 insertions(+), 24 deletions(-) diff --git a/MacroLibX b/MacroLibX index 226430f..4d640ed 160000 --- a/MacroLibX +++ b/MacroLibX @@ -1 +1 @@ -Subproject commit 226430f01e8a51ef0aff2e11e3791557edfea0e3 +Subproject commit 4d640ed70cd392f3e3311fe2779905876b7f1b6f diff --git a/includes/game/settings.h b/includes/game/settings.h index 0a36884..d183784 100644 --- a/includes/game/settings.h +++ b/includes/game/settings.h @@ -6,7 +6,7 @@ /* By: adjoly +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2024/10/04 14:06:39 by adjoly #+# #+# */ -/* Updated: 2024/10/29 14:55:59 by adjoly ### ########.fr */ +/* Updated: 2024/11/01 15:53:20 by madumerg ### ########.fr */ /* */ /* ************************************************************************** */ @@ -27,7 +27,7 @@ # define WINDOW_W 1600 # define PLAYER_ROT_SPEED (2 * M_PI) / 128 # define PLAYER_SPEED 0.01 -# define RAY_SIZE 1 +# define RAY_SIZE 50 # define FOV ( 60 * (M_PI / 180) ) # define CHUNK_SIZE 64 diff --git a/src/cub3d.c b/src/cub3d.c index fede1d3..0f59a86 100644 --- a/src/cub3d.c +++ b/src/cub3d.c @@ -6,7 +6,7 @@ /* By: madumerg +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2024/09/04 16:58:27 by madumerg #+# #+# */ -/* Updated: 2024/10/30 10:02:56 by adjoly ### ########.fr */ +/* Updated: 2024/11/01 16:16:52 by madumerg ### ########.fr */ /* */ /* ************************************************************************** */ @@ -30,9 +30,9 @@ int main(int ac, char **av) world.arr = ft_split("11111 10001 10001 10001 11111", ' '); world.size.x = 5; world.size.y = 5; - player.coord.x = 1; - player.coord.y = 1; - player.direction = 0; + player.coord.x = 2.5; + player.coord.y = 3.5; + player.direction = 2 * M_PI - 0.001; render.mlx = mlx_init(); render.win = mlx_new_window(render.mlx, WINDOW_W, WINDOW_H, "WTF"); render.img = mlx_new_image(render.mlx, WINDOW_W, WINDOW_H); diff --git a/src/raycasting/dda.c b/src/raycasting/dda.c index 23db3ec..71752d0 100644 --- a/src/raycasting/dda.c +++ b/src/raycasting/dda.c @@ -6,7 +6,7 @@ /* By: adjoly +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2024/10/07 16:55:09 by adjoly #+# #+# */ -/* Updated: 2024/10/30 14:42:06 by adjoly ### ########.fr */ +/* Updated: 2024/11/01 16:13:57 by madumerg ### ########.fr */ /* */ /* ************************************************************************** */ @@ -14,10 +14,12 @@ #include #include #include +#include -void setup_dda_hor(t_player *play, t_ray *ray, t_dda *dda) +void setup_dda_ver(t_player *play, t_ray *ray, t_dda *dda) { - dda->h = true; + dda->distance.x = 1000000; + dda->h = false; dda->s = true; ray->tan = tan(ray->angle); if (cos(ray->angle) < -0.001) @@ -36,36 +38,37 @@ void setup_dda_hor(t_player *play, t_ray *ray, t_dda *dda) } else { - dda->s = false; ray->pos.x = play->coord.x; ray->pos.y = play->coord.y; + dda->s = false; } } -void setup_dda_ver(t_player *play, t_ray *ray, t_dda *dda) +void setup_dda_hor(t_player *play, t_ray *ray, t_dda *dda) { + dda->distance.y = 1000000; dda->s = true; - dda->h = false; + dda->h = true; ray->tan = 1 / tan(ray->angle); if (sin(ray->angle) < -0.001) { ray->offset.y = CHUNK_SIZE; ray->offset.x = -CHUNK_SIZE * ray->tan; - ray->pos.y = (((int)play->coord.y >> 6) << 6) - CHUNK_SIZE; + ray->pos.y = (((int)play->coord.y >> 6) << 6) + CHUNK_SIZE; ray->pos.x = (play->coord.y - ray->pos.y) * ray->tan + play->coord.x; } else if(sin(ray->angle) > 0.001) { ray->offset.y = -CHUNK_SIZE; ray->offset.x = CHUNK_SIZE * ray->tan; - ray->pos.y = (((int)play->coord.y >> 6) << 6) + 0.001; + ray->pos.y = (((int)play->coord.y >> 6) << 6) - 0.001; ray->pos.x -= (play->coord.y - ray->pos.y) * ray->tan + play->coord.x; } else { - dda->s = false; ray->pos.x = play->coord.x; ray->pos.y = play->coord.y; + dda->s = false; } } @@ -80,7 +83,6 @@ void dda_loop(t_dda *dda, t_ray *ray, t_map *map, t_player *play) { dda->map.x = (int)(ray->pos.x / 64); dda->map.y = (int)(ray->pos.y / 64); - printf("%f, %f\n", ray->pos.x, ray->pos.y); if (dda->map.x >= 0 && dda->map.x < w && dda->map.y >= 0 && dda->map.y < h && \ map->arr[(int)dda->map.y][(int)dda->map.x] == '1') { diff --git a/src/raycasting/key_hook.c b/src/raycasting/key_hook.c index accc010..fecdc03 100644 --- a/src/raycasting/key_hook.c +++ b/src/raycasting/key_hook.c @@ -6,7 +6,7 @@ /* By: adjoly +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2024/09/11 16:37:56 by adjoly #+# #+# */ -/* Updated: 2024/10/29 14:57:10 by adjoly ### ########.fr */ +/* Updated: 2024/11/01 16:05:37 by madumerg ### ########.fr */ /* */ /* ************************************************************************** */ diff --git a/src/raycasting/renderer.c b/src/raycasting/renderer.c index 03691a6..468c981 100644 --- a/src/raycasting/renderer.c +++ b/src/raycasting/renderer.c @@ -6,7 +6,7 @@ /* By: adjoly +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2024/10/28 15:48:39 by adjoly #+# #+# */ -/* Updated: 2024/10/29 14:22:37 by adjoly ### ########.fr */ +/* Updated: 2024/11/01 16:30:17 by madumerg ### ########.fr */ /* */ /* ************************************************************************** */ @@ -64,9 +64,12 @@ void print_line(t_render *render, t_ray *ray, int x) y = 0; while (y < line) { - j = -1; - while (++j <= RAY_SIZE) + j = 0; + while (j < RAY_SIZE) + { mlx_set_image_pixel(render->mlx, render->img, x + j, line_start + y, WHITE); + j++; + } y++; } } @@ -89,8 +92,9 @@ void render_frame(t_render *render) ang = render->player->direction - ray.angle; fix_ang(&ang); ray.distance *= cos(ang); + printf("distance = %f\n", ray.distance); print_line(render, &ray, i); - ray.angle += (M_PI / 180) / (WINDOW_W / FOV); + ray.angle += (M_PI / 180) / ((WINDOW_W * RAY_SIZE) / FOV); fix_ang(&ray.angle); i -= RAY_SIZE; } diff --git a/src/raycasting/vectwo.c b/src/raycasting/vectwo.c index 5795d1a..1e942f7 100644 --- a/src/raycasting/vectwo.c +++ b/src/raycasting/vectwo.c @@ -6,14 +6,13 @@ /* By: adjoly +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2024/10/26 15:47:29 by adjoly #+# #+# */ -/* Updated: 2024/10/28 15:20:24 by adjoly ### ########.fr */ +/* Updated: 2024/11/01 16:07:33 by madumerg ### ########.fr */ /* */ /* ************************************************************************** */ #include "game/vectwo.h" #include - float vec2_dist(t_vec2 first, t_vec2 second) { return (sqrt(powf(second.x - first.x, 2) + powf(second.y - first.y, 2))); From 6e88f4960a3c471bdd6f35b7ac0bc49cdb4a83b1 Mon Sep 17 00:00:00 2001 From: Maelys Date: Fri, 1 Nov 2024 18:38:58 +0100 Subject: [PATCH 20/24] =?UTF-8?q?=E3=80=8C=F0=9F=9A=A7=E3=80=8D=20test(ft?= =?UTF-8?q?=5Fpipi):=20pipi=20popo=20not=20working?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- includes/game/settings.h | 6 ++---- src/cub3d.c | 8 ++++---- src/raycasting/dda.c | 20 ++++++++++++-------- src/raycasting/maths.c | 2 +- src/raycasting/renderer.c | 21 +++++++-------------- 5 files changed, 26 insertions(+), 31 deletions(-) diff --git a/includes/game/settings.h b/includes/game/settings.h index d183784..5573d4c 100644 --- a/includes/game/settings.h +++ b/includes/game/settings.h @@ -6,7 +6,7 @@ /* By: adjoly +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2024/10/04 14:06:39 by adjoly #+# #+# */ -/* Updated: 2024/11/01 15:53:20 by madumerg ### ########.fr */ +/* Updated: 2024/11/01 18:15:03 by madumerg ### ########.fr */ /* */ /* ************************************************************************** */ @@ -21,14 +21,12 @@ # define D_KEY 7 # define WHITE 0xFFFFFFFF -# define DEG_TO_RAD 0.0174533 # define WINDOW_H 900 # define WINDOW_W 1600 # define PLAYER_ROT_SPEED (2 * M_PI) / 128 # define PLAYER_SPEED 0.01 -# define RAY_SIZE 50 -# define FOV ( 60 * (M_PI / 180) ) +# define FOV 70 # define CHUNK_SIZE 64 diff --git a/src/cub3d.c b/src/cub3d.c index 0f59a86..a5e1d35 100644 --- a/src/cub3d.c +++ b/src/cub3d.c @@ -6,7 +6,7 @@ /* By: madumerg +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2024/09/04 16:58:27 by madumerg #+# #+# */ -/* Updated: 2024/11/01 16:16:52 by madumerg ### ########.fr */ +/* Updated: 2024/11/01 18:09:53 by madumerg ### ########.fr */ /* */ /* ************************************************************************** */ @@ -30,9 +30,9 @@ int main(int ac, char **av) world.arr = ft_split("11111 10001 10001 10001 11111", ' '); world.size.x = 5; world.size.y = 5; - player.coord.x = 2.5; - player.coord.y = 3.5; - player.direction = 2 * M_PI - 0.001; + player.coord.x = 2 * CHUNK_SIZE; + player.coord.y = 3 * CHUNK_SIZE; + player.direction = 0; render.mlx = mlx_init(); render.win = mlx_new_window(render.mlx, WINDOW_W, WINDOW_H, "WTF"); render.img = mlx_new_image(render.mlx, WINDOW_W, WINDOW_H); diff --git a/src/raycasting/dda.c b/src/raycasting/dda.c index 71752d0..04bf9c6 100644 --- a/src/raycasting/dda.c +++ b/src/raycasting/dda.c @@ -6,7 +6,7 @@ /* By: adjoly +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2024/10/07 16:55:09 by adjoly #+# #+# */ -/* Updated: 2024/11/01 16:13:57 by madumerg ### ########.fr */ +/* Updated: 2024/11/01 18:33:52 by madumerg ### ########.fr */ /* */ /* ************************************************************************** */ @@ -18,7 +18,7 @@ void setup_dda_ver(t_player *play, t_ray *ray, t_dda *dda) { - dda->distance.x = 1000000; + dda->distance.x = 100000; dda->h = false; dda->s = true; ray->tan = tan(ray->angle); @@ -27,14 +27,14 @@ void setup_dda_ver(t_player *play, t_ray *ray, t_dda *dda) ray->offset.x = -CHUNK_SIZE; ray->offset.y = CHUNK_SIZE * ray->tan; ray->pos.x = (((int)play->coord.x >> 6) << 6) - 0.001; - ray->pos.y -= (play->coord.x - ray->pos.x) * ray->tan + play->coord.y; + ray->pos.y = (play->coord.x - ray->pos.x) * ray->tan + play->coord.y; } else if(cos(ray->angle) > 0.001) { ray->offset.x = CHUNK_SIZE; ray->offset.y = -CHUNK_SIZE * ray->tan; ray->pos.x = (((int)play->coord.x >> 6) << 6) + CHUNK_SIZE; - ray->pos.y -= (play->coord.x - ray->pos.x) * ray->tan + play->coord.y; + ray->pos.y = (play->coord.x - ray->pos.x) * ray->tan + play->coord.y; } else { @@ -46,7 +46,7 @@ void setup_dda_ver(t_player *play, t_ray *ray, t_dda *dda) void setup_dda_hor(t_player *play, t_ray *ray, t_dda *dda) { - dda->distance.y = 1000000; + dda->distance.y = 100000; dda->s = true; dda->h = true; ray->tan = 1 / tan(ray->angle); @@ -62,7 +62,7 @@ void setup_dda_hor(t_player *play, t_ray *ray, t_dda *dda) ray->offset.y = -CHUNK_SIZE; ray->offset.x = CHUNK_SIZE * ray->tan; ray->pos.y = (((int)play->coord.y >> 6) << 6) - 0.001; - ray->pos.x -= (play->coord.y - ray->pos.y) * ray->tan + play->coord.x; + ray->pos.x = (play->coord.y - ray->pos.y) * ray->tan + play->coord.x; } else { @@ -81,8 +81,8 @@ void dda_loop(t_dda *dda, t_ray *ray, t_map *map, t_player *play) h = map->size.y; while (dda->s && dda->i) { - dda->map.x = (int)(ray->pos.x / 64); - dda->map.y = (int)(ray->pos.y / 64); + dda->map.x = (int)((int)ray->pos.x / 64); + dda->map.y = (int)((int)ray->pos.y / 64); if (dda->map.x >= 0 && dda->map.x < w && dda->map.y >= 0 && dda->map.y < h && \ map->arr[(int)dda->map.y][(int)dda->map.x] == '1') { @@ -104,12 +104,16 @@ void dda_algo(t_render *render, t_dda *dda, t_ray *ray) { setup_dda_hor(render->player, ray, dda); dda->i = render->world->size.y; + printf("caca pos = %f, %f\n", ray->pos.x, ray->pos.y); dda_loop(dda, ray, render->world, render->player); + printf("pipi pos = %f, %f\n", ray->pos.x, ray->pos.y); dda->hori.x = ray->pos.x; dda->hori.y = ray->pos.y; setup_dda_ver(render->player, ray, dda); dda->i = render->world->size.x; + printf("caca pos = %f, %f\n", ray->pos.x, ray->pos.y); dda_loop(dda, ray, render->world, render->player); + printf("pipi pos = %f, %f\n", ray->pos.x, ray->pos.y); dda->vert.x = ray->pos.x; dda->vert.y = ray->pos.y; if (dda->distance.y < dda->distance.x) diff --git a/src/raycasting/maths.c b/src/raycasting/maths.c index 4eaa3c2..7b1374e 100644 --- a/src/raycasting/maths.c +++ b/src/raycasting/maths.c @@ -6,7 +6,7 @@ /* By: adjoly +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2024/10/29 10:05:15 by adjoly #+# #+# */ -/* Updated: 2024/10/29 10:05:29 by adjoly ### ########.fr */ +/* Updated: 2024/11/01 17:25:32 by madumerg ### ########.fr */ /* */ /* ************************************************************************** */ diff --git a/src/raycasting/renderer.c b/src/raycasting/renderer.c index 468c981..746617c 100644 --- a/src/raycasting/renderer.c +++ b/src/raycasting/renderer.c @@ -6,7 +6,7 @@ /* By: adjoly +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2024/10/28 15:48:39 by adjoly #+# #+# */ -/* Updated: 2024/11/01 16:30:17 by madumerg ### ########.fr */ +/* Updated: 2024/11/01 18:32:01 by madumerg ### ########.fr */ /* */ /* ************************************************************************** */ @@ -57,45 +57,38 @@ void print_line(t_render *render, t_ray *ray, int x) int line; int line_start; int y; - int j; line = (CHUNK_SIZE * WINDOW_H) / ray->distance; line_start = -line / 2 + WINDOW_H / 2; y = 0; while (y < line) { - j = 0; - while (j < RAY_SIZE) - { - mlx_set_image_pixel(render->mlx, render->img, x + j, line_start + y, WHITE); - j++; - } + mlx_set_image_pixel(render->mlx, render->img, x, line_start + y, WHITE); y++; } } void render_frame(t_render *render) { - size_t i; + int i; t_dda dda; t_ray ray; float ang; i = WINDOW_W; - ray.angle = render->player->direction - (M_PI / 180) / (FOV / 2); + ray.angle = render->player->direction - (M_PI / 180) / ((float)FOV / 2); fix_ang(&ray.angle); draw_celling(render); draw_floor(render); - while(i > 0) + while(i > -1) { dda_algo(render, &dda, &ray); ang = render->player->direction - ray.angle; fix_ang(&ang); ray.distance *= cos(ang); - printf("distance = %f\n", ray.distance); print_line(render, &ray, i); - ray.angle += (M_PI / 180) / ((WINDOW_W * RAY_SIZE) / FOV); + ray.angle += (M_PI / 180) / ((float)WINDOW_W / FOV); fix_ang(&ray.angle); - i -= RAY_SIZE; + i--; } } From cec486ad816fd41e59aa950b832864b1bcfa373a Mon Sep 17 00:00:00 2001 From: Adam JOLY Date: Sat, 2 Nov 2024 14:44:04 +0100 Subject: [PATCH 21/24] =?UTF-8?q?=E3=80=8C=F0=9F=8F=97=EF=B8=8F=E3=80=8D?= =?UTF-8?q?=20wip(Raycasting):=20Seems=20better=20now?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- MacroLibX | 2 +- includes/game/settings.h | 6 +++--- src/cub3d.c | 15 ++++++++++++++- src/raycasting/dda.c | 21 ++++++++------------- src/raycasting/key_hook.c | 7 +------ src/raycasting/renderer.c | 28 ++++++++++++++-------------- src/raycasting/vectwo.c | 12 +++++++++++- 7 files changed, 52 insertions(+), 39 deletions(-) diff --git a/MacroLibX b/MacroLibX index 4d640ed..fc6aeab 160000 --- a/MacroLibX +++ b/MacroLibX @@ -1 +1 @@ -Subproject commit 4d640ed70cd392f3e3311fe2779905876b7f1b6f +Subproject commit fc6aeab67867219a6976b5e6a3eceb04c6ce2d0f diff --git a/includes/game/settings.h b/includes/game/settings.h index 5573d4c..d4709a3 100644 --- a/includes/game/settings.h +++ b/includes/game/settings.h @@ -6,7 +6,7 @@ /* By: adjoly +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2024/10/04 14:06:39 by adjoly #+# #+# */ -/* Updated: 2024/11/01 18:15:03 by madumerg ### ########.fr */ +/* Updated: 2024/11/02 14:15:03 by adjoly ### ########.fr */ /* */ /* ************************************************************************** */ @@ -22,10 +22,10 @@ # define WHITE 0xFFFFFFFF -# define WINDOW_H 900 # define WINDOW_W 1600 +# define WINDOW_H 900 # define PLAYER_ROT_SPEED (2 * M_PI) / 128 -# define PLAYER_SPEED 0.01 +# define PLAYER_SPEED 0.5 # define FOV 70 # define CHUNK_SIZE 64 diff --git a/src/cub3d.c b/src/cub3d.c index a5e1d35..9bc8e64 100644 --- a/src/cub3d.c +++ b/src/cub3d.c @@ -6,7 +6,7 @@ /* By: madumerg +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2024/09/04 16:58:27 by madumerg #+# #+# */ -/* Updated: 2024/11/01 18:09:53 by madumerg ### ########.fr */ +/* Updated: 2024/11/02 14:21:07 by adjoly ### ########.fr */ /* */ /* ************************************************************************** */ @@ -17,6 +17,18 @@ #include "mlx.h" #include +int loop(void *param) +{ + t_render *render; + + render = (t_render *)param; + mlx_destroy_image(render->mlx, render->img); + render->img = mlx_new_image(render->mlx, WINDOW_W, WINDOW_H); + render_frame(render); + mlx_put_image_to_window(render->mlx, render->win, render->img, 0, 0); + return (0); +} + int main(int ac, char **av) { t_render render; @@ -41,6 +53,7 @@ int main(int ac, char **av) (void)ac; (void)av; mlx_on_event(render.mlx, render.win, MLX_KEYDOWN, key_hook, &render); + mlx_loop_hook(render.mlx, loop, &render); mlx_loop(render.mlx); mlx_destroy_image(render.mlx, render.img); mlx_destroy_window(render.mlx, render.win); diff --git a/src/raycasting/dda.c b/src/raycasting/dda.c index 04bf9c6..b46508b 100644 --- a/src/raycasting/dda.c +++ b/src/raycasting/dda.c @@ -6,7 +6,7 @@ /* By: adjoly +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2024/10/07 16:55:09 by adjoly #+# #+# */ -/* Updated: 2024/11/01 18:33:52 by madumerg ### ########.fr */ +/* Updated: 2024/11/02 13:59:41 by adjoly ### ########.fr */ /* */ /* ************************************************************************** */ @@ -74,16 +74,11 @@ void setup_dda_hor(t_player *play, t_ray *ray, t_dda *dda) void dda_loop(t_dda *dda, t_ray *ray, t_map *map, t_player *play) { - uint16_t w; - uint16_t h; - - w = map->size.x; - h = map->size.y; while (dda->s && dda->i) { dda->map.x = (int)((int)ray->pos.x / 64); dda->map.y = (int)((int)ray->pos.y / 64); - if (dda->map.x >= 0 && dda->map.x < w && dda->map.y >= 0 && dda->map.y < h && \ + if (dda->map.x >= 0 && dda->map.x < map->size.x && dda->map.y >= 0 && dda->map.y < map->size.y && \ map->arr[(int)dda->map.y][(int)dda->map.x] == '1') { dda->i = 0; @@ -104,28 +99,28 @@ void dda_algo(t_render *render, t_dda *dda, t_ray *ray) { setup_dda_hor(render->player, ray, dda); dda->i = render->world->size.y; - printf("caca pos = %f, %f\n", ray->pos.x, ray->pos.y); + //printf("caca pos = %f, %f\n", ray->pos.x, ray->pos.y); dda_loop(dda, ray, render->world, render->player); - printf("pipi pos = %f, %f\n", ray->pos.x, ray->pos.y); + //printf("pipi pos = %f, %f\n", ray->pos.x, ray->pos.y); dda->hori.x = ray->pos.x; dda->hori.y = ray->pos.y; setup_dda_ver(render->player, ray, dda); dda->i = render->world->size.x; - printf("caca pos = %f, %f\n", ray->pos.x, ray->pos.y); + //printf("caca pos = %f, %f\n", ray->pos.x, ray->pos.y); dda_loop(dda, ray, render->world, render->player); - printf("pipi pos = %f, %f\n", ray->pos.x, ray->pos.y); + //printf("pipi pos = %f, %f\n", ray->pos.x, ray->pos.y); dda->vert.x = ray->pos.x; dda->vert.y = ray->pos.y; if (dda->distance.y < dda->distance.x) { ray->pos.x = fabsf(dda->hori.x); ray->pos.y = fabsf(dda->hori.y); - ray->distance = dda->distance.x; + ray->distance = dda->distance.y; } else { ray->pos.x = fabsf(dda->vert.x); ray->pos.y = fabsf(dda->vert.y); - ray->distance = dda->distance.y; + ray->distance = dda->distance.x; } } diff --git a/src/raycasting/key_hook.c b/src/raycasting/key_hook.c index fecdc03..f64ffe7 100644 --- a/src/raycasting/key_hook.c +++ b/src/raycasting/key_hook.c @@ -6,7 +6,7 @@ /* By: adjoly +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2024/09/11 16:37:56 by adjoly #+# #+# */ -/* Updated: 2024/11/01 16:05:37 by madumerg ### ########.fr */ +/* Updated: 2024/11/02 14:21:14 by adjoly ### ########.fr */ /* */ /* ************************************************************************** */ @@ -45,10 +45,5 @@ int key_hook(int key, void *param) change_direction(PLAYER_ROT_SPEED, false, render->player); else if (key == A_KEY) change_direction(PLAYER_ROT_SPEED, true, render->player); - printf("player coord x = %f, y = %f\n", render->player->coord.x, render->player->coord.y); - mlx_destroy_image(render->mlx, render->img); - render->img = mlx_new_image(render->mlx, WINDOW_W, WINDOW_H); - render_frame(render); - mlx_put_image_to_window(render->mlx, render->win, render->img, 0, 0); return (0); } diff --git a/src/raycasting/renderer.c b/src/raycasting/renderer.c index 746617c..19a42c3 100644 --- a/src/raycasting/renderer.c +++ b/src/raycasting/renderer.c @@ -6,7 +6,7 @@ /* By: adjoly +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2024/10/28 15:48:39 by adjoly #+# #+# */ -/* Updated: 2024/11/01 18:32:01 by madumerg ### ########.fr */ +/* Updated: 2024/11/02 14:14:45 by adjoly ### ########.fr */ /* */ /* ************************************************************************** */ @@ -54,26 +54,29 @@ void draw_celling(t_render *render) void print_line(t_render *render, t_ray *ray, int x) { - int line; + int line_size; + int line_stop; int line_start; - int y; - line = (CHUNK_SIZE * WINDOW_H) / ray->distance; - line_start = -line / 2 + WINDOW_H / 2; - y = 0; - while (y < line) + line_size = (CHUNK_SIZE * WINDOW_H) / ray->distance; + line_start = -line_size / 2 + WINDOW_H / 2; + line_stop = line_size / 2 + WINDOW_H / 2; + if (line_start < 0) + line_start = 0; + if (line_stop > WINDOW_H) + line_stop = WINDOW_H - 1; + while (line_start < line_stop) { - mlx_set_image_pixel(render->mlx, render->img, x, line_start + y, WHITE); - y++; + mlx_set_image_pixel(render->mlx, render->img, x, line_start, WHITE); + line_start++; } } void render_frame(t_render *render) { - int i; + int i; t_dda dda; t_ray ray; - float ang; i = WINDOW_W; ray.angle = render->player->direction - (M_PI / 180) / ((float)FOV / 2); @@ -83,9 +86,6 @@ void render_frame(t_render *render) while(i > -1) { dda_algo(render, &dda, &ray); - ang = render->player->direction - ray.angle; - fix_ang(&ang); - ray.distance *= cos(ang); print_line(render, &ray, i); ray.angle += (M_PI / 180) / ((float)WINDOW_W / FOV); fix_ang(&ray.angle); diff --git a/src/raycasting/vectwo.c b/src/raycasting/vectwo.c index 1e942f7..a993ad1 100644 --- a/src/raycasting/vectwo.c +++ b/src/raycasting/vectwo.c @@ -6,12 +6,13 @@ /* By: adjoly +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2024/10/26 15:47:29 by adjoly #+# #+# */ -/* Updated: 2024/11/01 16:07:33 by madumerg ### ########.fr */ +/* Updated: 2024/11/02 14:25:24 by adjoly ### ########.fr */ /* */ /* ************************************************************************** */ #include "game/vectwo.h" #include +#include float vec2_dist(t_vec2 first, t_vec2 second) { @@ -29,3 +30,12 @@ void vec2_sub(t_vec2 *first, t_vec2 second) first->x -= second.x; first->y -= second.y; } + +t_vec2 vec2_mul_ret(t_vec2 vec, uint16_t n) +{ + t_vec2 ret; + + ret.x = vec.x * n; + ret.y = vec.y * n; + return (ret); +} From 2df57b2f1515dcb6edb9401a8bfe2161e10683fd Mon Sep 17 00:00:00 2001 From: Adam JOLY Date: Sat, 2 Nov 2024 16:08:39 +0100 Subject: [PATCH 22/24] =?UTF-8?q?=E3=80=8C=E2=9C=A8=E3=80=8D=20feat(Raycas?= =?UTF-8?q?ting):=20Now=20working=20:tada:?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- includes/game/dda.h | 7 +++---- includes/game/game.h | 5 +---- includes/game/settings.h | 8 ++++---- includes/game/utils_math.h | 4 ++-- includes/game/vectwo.h | 9 ++++++++- src/raycasting/dda.c | 37 +++++++++---------------------------- src/raycasting/key_hook.c | 14 +++++++++----- src/raycasting/renderer.c | 19 ++++++++++++------- src/raycasting/vectwo.c | 6 +++--- 9 files changed, 51 insertions(+), 58 deletions(-) diff --git a/includes/game/dda.h b/includes/game/dda.h index eab5af4..2388aac 100644 --- a/includes/game/dda.h +++ b/includes/game/dda.h @@ -6,23 +6,22 @@ /* By: adjoly +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2024/10/28 13:04:36 by adjoly #+# #+# */ -/* Updated: 2024/10/29 14:15:59 by adjoly ### ########.fr */ +/* Updated: 2024/11/02 15:57:19 by adjoly ### ########.fr */ /* */ /* ************************************************************************** */ -# ifndef DDA_H +#ifndef DDA_H # define DDA_H # include # include "game.h" -#include "game/vectwo.h" +# include "game/vectwo.h" typedef struct s_dda { bool h; int i; - bool s; t_vec2 map; t_vec2 vert; t_vec2 hori; diff --git a/includes/game/game.h b/includes/game/game.h index 1f4a5f8..bf063bb 100644 --- a/includes/game/game.h +++ b/includes/game/game.h @@ -6,7 +6,7 @@ /* By: adjoly +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2024/09/11 16:38:40 by adjoly #+# #+# */ -/* Updated: 2024/10/29 13:56:32 by adjoly ### ########.fr */ +/* Updated: 2024/11/02 15:55:39 by adjoly ### ########.fr */ /* */ /* ************************************************************************** */ @@ -53,7 +53,6 @@ typedef struct s_render void *texture[4]; } t_render; - /** * @brief This function is used to handle keypress * @@ -64,7 +63,6 @@ typedef struct s_render */ int key_hook(int key, void *param); - /** * @brief This function is here to change the direction of the player * by setting the t_player->direction and check overflow to be @@ -77,7 +75,6 @@ int key_hook(int key, void *param); */ void change_direction(float speed, bool clockwise, t_player *player); - /** * @brief Render a cub3d frame by executing a dda on every ray and * putting the pixel on the window diff --git a/includes/game/settings.h b/includes/game/settings.h index d4709a3..bbf58cc 100644 --- a/includes/game/settings.h +++ b/includes/game/settings.h @@ -6,11 +6,11 @@ /* By: adjoly +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2024/10/04 14:06:39 by adjoly #+# #+# */ -/* Updated: 2024/11/02 14:15:03 by adjoly ### ########.fr */ +/* Updated: 2024/11/02 15:55:02 by adjoly ### ########.fr */ /* */ /* ************************************************************************** */ -#ifndef SETTINGS_H +#ifndef SETTINGS_H # define SETTINGS_H // Key code @@ -24,8 +24,8 @@ # define WINDOW_W 1600 # define WINDOW_H 900 -# define PLAYER_ROT_SPEED (2 * M_PI) / 128 -# define PLAYER_SPEED 0.5 +# define PLAYER_ROT_SPEED 0.034906585039887 +# define PLAYER_SPEED 1.5 # define FOV 70 # define CHUNK_SIZE 64 diff --git a/includes/game/utils_math.h b/includes/game/utils_math.h index 1a36bc3..6c102d3 100644 --- a/includes/game/utils_math.h +++ b/includes/game/utils_math.h @@ -6,14 +6,14 @@ /* By: adjoly +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2024/10/29 10:07:24 by adjoly #+# #+# */ -/* Updated: 2024/10/29 10:08:04 by adjoly ### ########.fr */ +/* Updated: 2024/11/02 15:54:32 by adjoly ### ########.fr */ /* */ /* ************************************************************************** */ #ifndef UTILS_MATH_H # define UTILS_MATH_H -#include +# include void fix_ang(float *ang); diff --git a/includes/game/vectwo.h b/includes/game/vectwo.h index 1fd0715..e75508e 100644 --- a/includes/game/vectwo.h +++ b/includes/game/vectwo.h @@ -6,13 +6,15 @@ /* By: adjoly +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2024/10/28 13:32:14 by adjoly #+# #+# */ -/* Updated: 2024/10/28 14:24:56 by adjoly ### ########.fr */ +/* Updated: 2024/11/02 15:51:49 by adjoly ### ########.fr */ /* */ /* ************************************************************************** */ #ifndef VECTWO_H # define VECTWO_H +# include + typedef struct s_vec2 { float x; @@ -35,4 +37,9 @@ void vec2_add(t_vec2 *first, t_vec2 second); * @brief Just substract second to first */ void vec2_sub(t_vec2 *first, t_vec2 second); + +/** + * @brief Multiply a vec2 by a number n and returns it + */ +t_vec2 vec2_mul_ret(t_vec2 vec, float n); #endif diff --git a/src/raycasting/dda.c b/src/raycasting/dda.c index b46508b..fc0eb1a 100644 --- a/src/raycasting/dda.c +++ b/src/raycasting/dda.c @@ -6,7 +6,7 @@ /* By: adjoly +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2024/10/07 16:55:09 by adjoly #+# #+# */ -/* Updated: 2024/11/02 13:59:41 by adjoly ### ########.fr */ +/* Updated: 2024/11/02 15:58:33 by adjoly ### ########.fr */ /* */ /* ************************************************************************** */ @@ -20,7 +20,6 @@ void setup_dda_ver(t_player *play, t_ray *ray, t_dda *dda) { dda->distance.x = 100000; dda->h = false; - dda->s = true; ray->tan = tan(ray->angle); if (cos(ray->angle) < -0.001) { @@ -29,25 +28,18 @@ void setup_dda_ver(t_player *play, t_ray *ray, t_dda *dda) ray->pos.x = (((int)play->coord.x >> 6) << 6) - 0.001; ray->pos.y = (play->coord.x - ray->pos.x) * ray->tan + play->coord.y; } - else if(cos(ray->angle) > 0.001) + else if (cos(ray->angle) > 0.001) { ray->offset.x = CHUNK_SIZE; ray->offset.y = -CHUNK_SIZE * ray->tan; ray->pos.x = (((int)play->coord.x >> 6) << 6) + CHUNK_SIZE; ray->pos.y = (play->coord.x - ray->pos.x) * ray->tan + play->coord.y; } - else - { - ray->pos.x = play->coord.x; - ray->pos.y = play->coord.y; - dda->s = false; - } } void setup_dda_hor(t_player *play, t_ray *ray, t_dda *dda) { dda->distance.y = 100000; - dda->s = true; dda->h = true; ray->tan = 1 / tan(ray->angle); if (sin(ray->angle) < -0.001) @@ -57,29 +49,24 @@ void setup_dda_hor(t_player *play, t_ray *ray, t_dda *dda) ray->pos.y = (((int)play->coord.y >> 6) << 6) + CHUNK_SIZE; ray->pos.x = (play->coord.y - ray->pos.y) * ray->tan + play->coord.x; } - else if(sin(ray->angle) > 0.001) + else if (sin(ray->angle) > 0.001) { ray->offset.y = -CHUNK_SIZE; ray->offset.x = CHUNK_SIZE * ray->tan; ray->pos.y = (((int)play->coord.y >> 6) << 6) - 0.001; ray->pos.x = (play->coord.y - ray->pos.y) * ray->tan + play->coord.x; } - else - { - ray->pos.x = play->coord.x; - ray->pos.y = play->coord.y; - dda->s = false; - } } void dda_loop(t_dda *dda, t_ray *ray, t_map *map, t_player *play) { - while (dda->s && dda->i) + while (dda->i) { dda->map.x = (int)((int)ray->pos.x / 64); dda->map.y = (int)((int)ray->pos.y / 64); - if (dda->map.x >= 0 && dda->map.x < map->size.x && dda->map.y >= 0 && dda->map.y < map->size.y && \ - map->arr[(int)dda->map.y][(int)dda->map.x] == '1') + if (dda->map.x >= 0 && dda->map.x < map->size.x && dda->map.y >= 0 && \ + dda->map.y < map->size.y && \ + map->arr[(int)dda->map.y][(int)dda->map.x] == '1') { dda->i = 0; if (dda->h) @@ -99,18 +86,12 @@ void dda_algo(t_render *render, t_dda *dda, t_ray *ray) { setup_dda_hor(render->player, ray, dda); dda->i = render->world->size.y; - //printf("caca pos = %f, %f\n", ray->pos.x, ray->pos.y); dda_loop(dda, ray, render->world, render->player); - //printf("pipi pos = %f, %f\n", ray->pos.x, ray->pos.y); - dda->hori.x = ray->pos.x; - dda->hori.y = ray->pos.y; + dda->hori = ray->pos; setup_dda_ver(render->player, ray, dda); dda->i = render->world->size.x; - //printf("caca pos = %f, %f\n", ray->pos.x, ray->pos.y); dda_loop(dda, ray, render->world, render->player); - //printf("pipi pos = %f, %f\n", ray->pos.x, ray->pos.y); - dda->vert.x = ray->pos.x; - dda->vert.y = ray->pos.y; + dda->vert = ray->pos; if (dda->distance.y < dda->distance.x) { ray->pos.x = fabsf(dda->hori.x); diff --git a/src/raycasting/key_hook.c b/src/raycasting/key_hook.c index f64ffe7..faa3a56 100644 --- a/src/raycasting/key_hook.c +++ b/src/raycasting/key_hook.c @@ -6,7 +6,7 @@ /* By: adjoly +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2024/09/11 16:37:56 by adjoly #+# #+# */ -/* Updated: 2024/11/02 14:21:14 by adjoly ### ########.fr */ +/* Updated: 2024/11/02 15:50:23 by adjoly ### ########.fr */ /* */ /* ************************************************************************** */ @@ -33,13 +33,17 @@ int key_hook(int key, void *param) return (mlx_loop_end(render->mlx)); if (key == W_KEY) { - render->player->coord.x += PLAYER_SPEED * cos(render->player->direction); - render->player->coord.y += PLAYER_SPEED * sin(render->player->direction); + render->player->coord.x += PLAYER_SPEED * \ + cos(render->player->direction); + render->player->coord.y += PLAYER_SPEED * \ + -sin(render->player->direction); } else if (key == S_KEY) { - render->player->coord.x -= PLAYER_SPEED * cos(render->player->direction); - render->player->coord.y -= PLAYER_SPEED * sin(render->player->direction); + render->player->coord.x -= PLAYER_SPEED * \ + cos(render->player->direction); + render->player->coord.y -= PLAYER_SPEED * \ + -sin(render->player->direction); } else if (key == D_KEY) change_direction(PLAYER_ROT_SPEED, false, render->player); diff --git a/src/raycasting/renderer.c b/src/raycasting/renderer.c index 19a42c3..85a33f2 100644 --- a/src/raycasting/renderer.c +++ b/src/raycasting/renderer.c @@ -6,7 +6,7 @@ /* By: adjoly +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2024/10/28 15:48:39 by adjoly #+# #+# */ -/* Updated: 2024/11/02 14:14:45 by adjoly ### ########.fr */ +/* Updated: 2024/11/02 16:00:11 by adjoly ### ########.fr */ /* */ /* ************************************************************************** */ @@ -22,12 +22,13 @@ void draw_floor(t_render *render) size_t y; y = WINDOW_H / 2; - while(y < WINDOW_H - 1) + while (y < WINDOW_H - 1) { x = 0; while (x < WINDOW_W) { - mlx_set_image_pixel(render->mlx, render->img, x, y, render->world->floor); + mlx_set_image_pixel(render->mlx, render->img, x, y, \ + render->world->floor); x++; } y++; @@ -40,12 +41,13 @@ void draw_celling(t_render *render) size_t y; y = 0; - while(y < WINDOW_H / 2) + while (y < WINDOW_H / 2) { x = 0; while (x < WINDOW_W) { - mlx_set_image_pixel(render->mlx, render->img, x, y, render->world->celling); + mlx_set_image_pixel(render->mlx, render->img, x, y, \ + render->world->celling); x++; } y++; @@ -77,15 +79,18 @@ void render_frame(t_render *render) int i; t_dda dda; t_ray ray; + float ang; i = WINDOW_W; - ray.angle = render->player->direction - (M_PI / 180) / ((float)FOV / 2); + ray.angle = render->player->direction - ((M_PI / 180) * ((float)FOV / 2)); fix_ang(&ray.angle); draw_celling(render); draw_floor(render); - while(i > -1) + while (i > -1) { dda_algo(render, &dda, &ray); + ang = cos(render->player->direction - ray.angle); + ray.distance *= ang; print_line(render, &ray, i); ray.angle += (M_PI / 180) / ((float)WINDOW_W / FOV); fix_ang(&ray.angle); diff --git a/src/raycasting/vectwo.c b/src/raycasting/vectwo.c index a993ad1..c41dfce 100644 --- a/src/raycasting/vectwo.c +++ b/src/raycasting/vectwo.c @@ -6,7 +6,7 @@ /* By: adjoly +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2024/10/26 15:47:29 by adjoly #+# #+# */ -/* Updated: 2024/11/02 14:25:24 by adjoly ### ########.fr */ +/* Updated: 2024/11/02 15:42:28 by adjoly ### ########.fr */ /* */ /* ************************************************************************** */ @@ -24,14 +24,14 @@ void vec2_add(t_vec2 *first, t_vec2 second) first->x += second.x; first->y += second.y; } - + // to be removed void vec2_sub(t_vec2 *first, t_vec2 second) { first->x -= second.x; first->y -= second.y; } -t_vec2 vec2_mul_ret(t_vec2 vec, uint16_t n) +t_vec2 vec2_mul_ret(t_vec2 vec, float n) { t_vec2 ret; From 5cb45ebb8a6905a8dafc971681017ac7cd5a7e34 Mon Sep 17 00:00:00 2001 From: Maelys Date: Wed, 6 Nov 2024 12:02:23 +0100 Subject: [PATCH 23/24] fix_color --- src/raycasting/renderer.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/raycasting/renderer.c b/src/raycasting/renderer.c index 85a33f2..856cb55 100644 --- a/src/raycasting/renderer.c +++ b/src/raycasting/renderer.c @@ -6,7 +6,7 @@ /* By: adjoly +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2024/10/28 15:48:39 by adjoly #+# #+# */ -/* Updated: 2024/11/02 16:00:11 by adjoly ### ########.fr */ +/* Updated: 2024/11/06 11:59:23 by madumerg ### ########.fr */ /* */ /* ************************************************************************** */ @@ -22,7 +22,7 @@ void draw_floor(t_render *render) size_t y; y = WINDOW_H / 2; - while (y < WINDOW_H - 1) + while (y < WINDOW_H) { x = 0; while (x < WINDOW_W) From e32e720545327bc9357835e39f32e9a41d271359 Mon Sep 17 00:00:00 2001 From: Adam JOLY Date: Wed, 6 Nov 2024 12:35:35 +0100 Subject: [PATCH 24/24] =?UTF-8?q?=E3=80=8C=F0=9F=94=A8=E3=80=8D=20fix(DDA)?= =?UTF-8?q?:=20fixed=20when=20some=20wall=20where=20not=20visible?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- includes/game/dda.h | 3 ++- src/cub3d.c | 4 +--- src/raycasting/dda.c | 21 ++++++++++++++------- 3 files changed, 17 insertions(+), 11 deletions(-) diff --git a/includes/game/dda.h b/includes/game/dda.h index 2388aac..25e48cc 100644 --- a/includes/game/dda.h +++ b/includes/game/dda.h @@ -6,7 +6,7 @@ /* By: adjoly +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2024/10/28 13:04:36 by adjoly #+# #+# */ -/* Updated: 2024/11/02 15:57:19 by adjoly ### ########.fr */ +/* Updated: 2024/11/06 12:30:52 by adjoly ### ########.fr */ /* */ /* ************************************************************************** */ @@ -21,6 +21,7 @@ typedef struct s_dda { bool h; + bool s; int i; t_vec2 map; t_vec2 vert; diff --git a/src/cub3d.c b/src/cub3d.c index 9bc8e64..c210ae7 100644 --- a/src/cub3d.c +++ b/src/cub3d.c @@ -6,7 +6,7 @@ /* By: madumerg +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2024/09/04 16:58:27 by madumerg #+# #+# */ -/* Updated: 2024/11/02 14:21:07 by adjoly ### ########.fr */ +/* Updated: 2024/11/06 11:50:38 by adjoly ### ########.fr */ /* */ /* ************************************************************************** */ @@ -48,8 +48,6 @@ int main(int ac, char **av) render.mlx = mlx_init(); render.win = mlx_new_window(render.mlx, WINDOW_W, WINDOW_H, "WTF"); render.img = mlx_new_image(render.mlx, WINDOW_W, WINDOW_H); - render_frame(&render); - mlx_put_image_to_window(render.mlx, render.win, render.img, 0, 0); (void)ac; (void)av; mlx_on_event(render.mlx, render.win, MLX_KEYDOWN, key_hook, &render); diff --git a/src/raycasting/dda.c b/src/raycasting/dda.c index fc0eb1a..a070334 100644 --- a/src/raycasting/dda.c +++ b/src/raycasting/dda.c @@ -6,7 +6,7 @@ /* By: adjoly +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2024/10/07 16:55:09 by adjoly #+# #+# */ -/* Updated: 2024/11/02 15:58:33 by adjoly ### ########.fr */ +/* Updated: 2024/11/06 12:34:58 by adjoly ### ########.fr */ /* */ /* ************************************************************************** */ @@ -18,8 +18,9 @@ void setup_dda_ver(t_player *play, t_ray *ray, t_dda *dda) { - dda->distance.x = 100000; + dda->s = true; dda->h = false; + dda->distance.x = 100000; ray->tan = tan(ray->angle); if (cos(ray->angle) < -0.001) { @@ -39,8 +40,9 @@ void setup_dda_ver(t_player *play, t_ray *ray, t_dda *dda) void setup_dda_hor(t_player *play, t_ray *ray, t_dda *dda) { - dda->distance.y = 100000; dda->h = true; + dda->s = true; + dda->distance.y = 100000; ray->tan = 1 / tan(ray->angle); if (sin(ray->angle) < -0.001) { @@ -56,14 +58,19 @@ void setup_dda_hor(t_player *play, t_ray *ray, t_dda *dda) ray->pos.y = (((int)play->coord.y >> 6) << 6) - 0.001; ray->pos.x = (play->coord.y - ray->pos.y) * ray->tan + play->coord.x; } + else + { + dda->s = false; + ray->pos.x = play->coord.x; + ray->pos.y = play->coord.y; + } } void dda_loop(t_dda *dda, t_ray *ray, t_map *map, t_player *play) { - while (dda->i) - { - dda->map.x = (int)((int)ray->pos.x / 64); - dda->map.y = (int)((int)ray->pos.y / 64); + while (dda->s && dda->i) { + dda->map.x = (ray->pos.x / 64); + dda->map.y = (ray->pos.y / 64); if (dda->map.x >= 0 && dda->map.x < map->size.x && dda->map.y >= 0 && \ dda->map.y < map->size.y && \ map->arr[(int)dda->map.y][(int)dda->map.x] == '1')