diff options
| author | Charles <sircharlesaze@gmail.com> | 2020-01-11 10:38:41 +0100 |
|---|---|---|
| committer | Charles <sircharlesaze@gmail.com> | 2020-01-11 10:39:37 +0100 |
| commit | 0dcba6ff7e68ed13f8e6caadd80b77506b917050 (patch) | |
| tree | 16e1393115941b87ca50f04f1e37511f3f7bbdb5 | |
| parent | 988e058680280e25d345b17d840c3c6d40e30a76 (diff) | |
| download | cub3d-0dcba6ff7e68ed13f8e6caadd80b77506b917050.tar.gz cub3d-0dcba6ff7e68ed13f8e6caadd80b77506b917050.tar.bz2 cub3d-0dcba6ff7e68ed13f8e6caadd80b77506b917050.zip | |
Hardcore refactoring
| -rw-r--r-- | Makefile | 8 | ||||
| -rw-r--r-- | cub3d.h | 97 | ||||
| -rw-r--r-- | event.c | 4 | ||||
| -rw-r--r-- | helper.c (renamed from parse/parse_south_texture.c) | 21 | ||||
| m--------- | libft | 0 | ||||
| -rw-r--r-- | main.c | 39 | ||||
| -rw-r--r-- | minilibx_man/mlx.1 (renamed from miniLibX_man/mlx.1) | 0 | ||||
| -rw-r--r-- | minilibx_man/mlx_loop.1 (renamed from miniLibX_man/mlx_loop.1) | 0 | ||||
| -rw-r--r-- | minilibx_man/mlx_new_image.1 (renamed from miniLibX_man/mlx_new_image.1) | 0 | ||||
| -rw-r--r-- | minilibx_man/mlx_new_window.1 (renamed from miniLibX_man/mlx_new_window.1) | 0 | ||||
| -rw-r--r-- | minilibx_man/mlx_pixel_put.1 (renamed from miniLibX_man/mlx_pixel_put.1) | 0 | ||||
| -rw-r--r-- | parse/parse.c | 71 | ||||
| -rw-r--r-- | parse/parse_ceilling_color.c | 27 | ||||
| -rw-r--r-- | parse/parse_color.c | 55 | ||||
| -rw-r--r-- | parse/parse_east_texture.c | 19 | ||||
| -rw-r--r-- | parse/parse_floor_color.c | 27 | ||||
| -rw-r--r-- | parse/parse_north_texture.c | 19 | ||||
| -rw-r--r-- | parse/parse_resolution.c | 13 | ||||
| -rw-r--r-- | parse/parse_sprite_texture.c | 19 | ||||
| -rw-r--r-- | parse/parse_textures.c | 48 | ||||
| -rw-r--r-- | parse/parse_west_texture.c | 19 | ||||
| -rw-r--r-- | render.c | 30 | ||||
| -rw-r--r-- | state.c | 133 |
23 files changed, 328 insertions, 321 deletions
@@ -8,11 +8,9 @@ LDFLAGS = -L$(LIBFT_PATH) -lft \ -framework OpenGL -framework AppKit -lm NAME = cub3D -SRC = main.c event.c parse/parse.c parse/parse_east_texture.c \ - parse/parse_north_texture.c parse/parse_south_texture.c \ - parse/parse_west_texture.c parse/parse_ceilling_color.c \ - parse/parse_floor_color.c parse/parse_resolution.c \ - parse/parse_sprite_texture.c state.c vector.c render.c +SRC = main.c event.c parse/parse.c parse/parse_textures.c \ + parse/parse_color.c parse/parse_resolution.c \ + state.c vector.c render.c helper.c error.c OBJ = $(SRC:.c=.o) INCLUDE = cub3d.h @@ -6,7 +6,7 @@ /* By: cacharle <marvin@42.fr> +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2019/11/15 06:40:37 by cacharle #+# #+# */ -/* Updated: 2020/01/10 11:29:16 by cacharle ### ########.fr */ +/* Updated: 2020/01/11 10:24:44 by cacharle ### ########.fr */ /* */ /* ************************************************************************** */ #include <stdio.h> @@ -51,10 +51,10 @@ typedef union unsigned int hexcode; struct { - t_byte empty; t_byte r; t_byte g; t_byte b; + t_byte alpha; } rgb; } t_color; @@ -71,21 +71,16 @@ typedef enum typedef t_cell** t_map; -typedef struct +enum { - int resolution_height; - int resolution_width; - char *north_texture_path; - char *south_texture_path; - char *west_texture_path; - char *east_texture_path; - char *sprite_texture_path; - t_color floor_color; - t_color ceilling_color; - t_map map; - int map_width; - int map_height; -} t_parsing; + TEX_NORTH, + TEX_SOUTH, + TEX_WEST, + TEX_EAST, + TEX_SPRITE +}; + +# define TEXTURES_NUM (TEX_SPRITE - TEX_NORTH + 1) typedef struct { @@ -113,21 +108,19 @@ typedef struct s_state int map_height; t_color ceilling_color; t_color floor_color; - t_image window_img; - t_image *north_texture; - t_image *south_texture; - t_image *west_texture; - t_image *east_texture; + t_image window; + char *textures_path[TEXTURES_NUM]; + t_image textures[TEXTURES_NUM]; } t_state; +typedef t_bool (*t_option_parser_func)(t_state *state, char *line); + typedef struct s_option_parser { char *id; t_option_parser_func func; } t_option_parser; -typedef t_bool (*t_option_parser_func)(t_parsing *parsing, char *line); - typedef enum { SIDE_NORTH_SOUTH, @@ -135,42 +128,53 @@ typedef enum } t_side; /* -** parse.c +** parse/parse.c */ -t_parsing *parse(char *filename); +t_state *parse(char *filename); char **get_file_lines(char *filename); -t_bool parse_line(t_parsing *parsing, char *line); -t_parsing *parse_map(t_parsing *parsing, char **lines); +t_bool parse_line(t_state *state, char *line); +t_state *parse_map(t_state *state, char **lines); t_cell *create_map_row(char *line); /* -** parse_*.c +** parse/parse_resolution.c +*/ + +t_bool parse_resolution(t_state *state, char *line); + +/* +** parse/parse_textures.c */ -t_bool parse_resolution(t_parsing *parsing, char *line); -t_bool parse_north_texture(t_parsing *parsing, char *line); -t_bool parse_south_texture(t_parsing *parsing, char *line); -t_bool parse_west_texture(t_parsing *parsing, char *line); -t_bool parse_east_texture(t_parsing *parsing, char *line); -t_bool parse_sprite_texture(t_parsing *parsing, char *line); -t_bool parse_floor_color(t_parsing *parsing, char *line); -t_bool parse_ceilling_color(t_parsing *parsing, char *line); +t_bool parse_north_texture(t_state *state, char *line); +t_bool parse_south_texture(t_state *state, char *line); +t_bool parse_west_texture(t_state *state, char *line); +t_bool parse_east_texture(t_state *state, char *line); +t_bool parse_sprite_texture(t_state *state, char *line); + +/* +** parse/parse_color.c +*/ + +t_bool parse_floor_color(t_state *state, char *line); +t_bool parse_ceilling_color(t_state *state, char *line); /* ** event.c */ -int handle_keydown(int key, void *param); +int event_keydown(int key, void *param); /* -** graphics.c +** state.c */ -t_state *state_new(void *mlx_ptr, void *window_ptr, t_parsing *parsing); -void state_new_player(t_state *state, t_parsing *parsing); -void state_destroy(t_state *state); -t_image *load_texture(char *path); +t_state *state_new(t_state *state); +void state_init_player(t_state *state); +t_state *state_new_empty(void); +void *state_destroy(t_state *state); +void load_texture(void *mlx_ptr, t_image *image, char *path); /* ** render.c @@ -192,6 +196,13 @@ double vector_norm(t_vector v); ** error.c */ -void error_put_usage(void); +void error_put_usage_exit(char *name); + +/* +** helper.c +*/ + +t_bool helper_is_player_cell(t_cell cell); +void helper_free_splited(char **splited); #endif @@ -6,7 +6,7 @@ /* By: cacharle <marvin@42.fr> +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2019/11/15 06:39:37 by cacharle #+# #+# */ -/* Updated: 2020/01/10 11:27:56 by cacharle ### ########.fr */ +/* Updated: 2020/01/11 10:10:05 by cacharle ### ########.fr */ /* */ /* ************************************************************************** */ @@ -15,7 +15,7 @@ #define ROTATE_SIZE (M_PI / 20.0) #define MOVE_SPEED 0.25 -int handle_keydown(int key, void *param) +int event_keydown(int key, void *param) { t_state *state; diff --git a/parse/parse_south_texture.c b/helper.c index 10ee403..fb16406 100644 --- a/parse/parse_south_texture.c +++ b/helper.c @@ -1,19 +1,28 @@ /* ************************************************************************** */ /* */ /* ::: :::::::: */ -/* parse_south_texture.c :+: :+: :+: */ +/* helper.c :+: :+: :+: */ /* +:+ +:+ +:+ */ /* By: cacharle <marvin@42.fr> +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ -/* Created: 2019/11/15 09:29:55 by cacharle #+# #+# */ -/* Updated: 2019/11/15 09:30:46 by cacharle ### ########.fr */ +/* Created: 2020/01/11 07:32:20 by cacharle #+# #+# */ +/* Updated: 2020/01/11 10:37:54 by cacharle ### ########.fr */ /* */ /* ************************************************************************** */ #include "cub3d.h" -t_bool parse_south_texture(t_parsing *parsing, char *line) +t_bool helper_is_player_cell(t_cell cell) { - parsing->south_texture_path = ft_strdup(line + 1); - return (TRUE); + return (cell == CELL_LOOK_NORTH || cell == CELL_LOOK_SOUTH || + cell == CELL_LOOK_WEST || cell == CELL_LOOK_EAST); +} + +void helper_free_splited(char **splited) +{ + if (splited == NULL) + return ; + while (splited != NULL) + free(*splited++); + free(splited); } diff --git a/libft b/libft -Subproject 7fbd92d957e5d30d3478b94ec0abd07aacc054b +Subproject d0c146c2274198814e106b17ea1f9461a1b0b81 @@ -6,7 +6,7 @@ /* By: cacharle <marvin@42.fr> +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2019/11/15 06:39:39 by cacharle #+# #+# */ -/* Updated: 2020/01/10 10:59:09 by cacharle ### ########.fr */ +/* Updated: 2020/01/11 10:09:51 by cacharle ### ########.fr */ /* */ /* ************************************************************************** */ @@ -14,42 +14,21 @@ int main(int argc, char **argv) { - t_parsing *p; - void *mlx_ptr; - void *window_ptr; t_state *state; - if (argc == 3 && ft_strcmp(argv[2], "--save") == 0) - return (save_image()); - else if (argc != 2) + /* if (argc == 3 && ft_strcmp(argv[2], "--save") == 0) */ + /* return (save_image()); */ + /*else*/ + if (argc != 2) error_put_usage_exit(argv[0]); - if ((p = parse(argv[1])) == NULL) - { - ft_putendl_fd("Error: wrong file format", STDERR_FILENO); - return (1); - } - - if ((mlx_ptr = mlx_init()) == NULL) - { - ft_putendl_fd("Error: minilibx init", STDERR_FILENO); - return (1); - } - if ((window_ptr = mlx_new_window(mlx_ptr, p->resolution_width, - p->resolution_height, WINDOW_TITLE)) == NULL) - { - ft_putendl_fd("Error: minilibx window creation", STDERR_FILENO); - return (1); - } - if ((state = state_new(mlx_ptr, window_ptr, p)) == NULL) + if ((state = state_new(parse(argv[1]))) == NULL) { ft_putendl_fd("Error: state creation", STDERR_FILENO); return (1); } - - mlx_hook(window_ptr, 2, (1L<<1), handle_keydown, (void*)state); - mlx_loop_hook(mlx_ptr, graphics_update, (void*)state); - mlx_loop(mlx_ptr); - + mlx_hook(state->window_ptr, 2, (1L << 1), event_keydown, (void*)state); + mlx_loop_hook(state->mlx_ptr, render_update, (void*)state); + mlx_loop(state->mlx_ptr); return (0); } diff --git a/miniLibX_man/mlx.1 b/minilibx_man/mlx.1 index cfdac3d..cfdac3d 100644 --- a/miniLibX_man/mlx.1 +++ b/minilibx_man/mlx.1 diff --git a/miniLibX_man/mlx_loop.1 b/minilibx_man/mlx_loop.1 index fa2b835..fa2b835 100644 --- a/miniLibX_man/mlx_loop.1 +++ b/minilibx_man/mlx_loop.1 diff --git a/miniLibX_man/mlx_new_image.1 b/minilibx_man/mlx_new_image.1 index d46bf59..d46bf59 100644 --- a/miniLibX_man/mlx_new_image.1 +++ b/minilibx_man/mlx_new_image.1 diff --git a/miniLibX_man/mlx_new_window.1 b/minilibx_man/mlx_new_window.1 index 36176d7..36176d7 100644 --- a/miniLibX_man/mlx_new_window.1 +++ b/minilibx_man/mlx_new_window.1 diff --git a/miniLibX_man/mlx_pixel_put.1 b/minilibx_man/mlx_pixel_put.1 index caf89f2..caf89f2 100644 --- a/miniLibX_man/mlx_pixel_put.1 +++ b/minilibx_man/mlx_pixel_put.1 diff --git a/parse/parse.c b/parse/parse.c index 8f3124d..145d5ad 100644 --- a/parse/parse.c +++ b/parse/parse.c @@ -6,60 +6,65 @@ /* By: cacharle <marvin@42.fr> +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2019/11/15 09:29:21 by cacharle #+# #+# */ -/* Updated: 2019/11/18 17:21:38 by cacharle ### ########.fr */ +/* Updated: 2020/01/11 10:12:10 by cacharle ### ########.fr */ /* */ /* ************************************************************************** */ #include "cub3d.h" -t_parsing *parse(char *filename) +t_state *parse(char *filename) { - int i; - char **lines; - t_parsing *parsing; + int i; + char **lines; + t_state *state; - if ((lines = get_file_lines(filename)) == NULL) - return (NULL); - if ((parsing = (t_parsing*)malloc(sizeof(t_parsing))) == NULL) + if ((state = state_new_empty()) == NULL) return (NULL); - parsing->map = NULL; - parsing->ceilling_color.hexcode = 0; - parsing->floor_color.hexcode = 0; + if ((lines = get_file_lines(filename)) == NULL) + return (state_destroy(state)); i = -1; while (lines[++i] != NULL) { if (*lines[i] == '1') break ; - if (!parse_line(parsing, lines[i])) - return (NULL); + if (!parse_line(state, lines[i])) + { + helper_free_splited(lines); + return (state_destroy(state)); + } } - if ((parsing = parse_map(parsing, lines + i)) == NULL) - return (NULL); - free(lines); - return (parsing); + if ((state = parse_map(state, lines + i)) == NULL) + { + helper_free_splited(lines); + return (state_destroy(state)); + } + helper_free_splited(lines); + return (state); } char **get_file_lines(char *filename) { int fd; int ret; - char *line; + char buf[BUFFER_SIZE]; char *file; fd = open(filename, O_RDONLY); if ((file = ft_strdup("")) == NULL) return (NULL); - while ((ret = get_next_line(fd, &line)) == 1) - if ((file = ft_strjoin_free(file, ft_strjoin_free(line, ft_strdup("\n"), 2), 2)) == NULL) + while ((ret = read(fd, buf, BUFFER_SIZE)) > 0) + { + buf[ret] = '\0'; + if ((file = ft_strjoin_free(file, buf, 1)) == NULL) return (NULL); + } if (ret == -1) return (NULL); - free(line); close(fd); return (ft_split(file, '\n')); } -static t_option_parser option_parsers[] = +static t_option_parser g_option_parsers[] = { {"R", parse_resolution}, {"NO", parse_north_texture}, @@ -71,9 +76,9 @@ static t_option_parser option_parsers[] = {"C", parse_ceilling_color} }; -#define OPTIONS_PARSERS_SIZE (sizeof(option_parsers) / sizeof(t_option_parser)) +#define OPTIONS_PARSERS_SIZE (sizeof(g_option_parsers) / sizeof(t_option_parser)) -t_bool parse_line(t_parsing *parsing, char *line) +t_bool parse_line(t_state *state, char *line) { int i; @@ -81,12 +86,14 @@ t_bool parse_line(t_parsing *parsing, char *line) return (TRUE); i = -1; while (++i < (int)OPTIONS_PARSERS_SIZE) - if (ft_strncmp(option_parsers[i].id, line, ft_strlen(option_parsers[i].id)) == 0) - return (option_parsers[i].func(parsing, line + ft_strlen(option_parsers[i].id))); + if (ft_strncmp(g_option_parsers[i].id, line, + ft_strlen(g_option_parsers[i].id)) == 0) + return (g_option_parsers[i].func( + state, line + ft_strlen(g_option_parsers[i].id) + 1)); return (FALSE); } -t_parsing *parse_map(t_parsing *parsing, char **lines) +t_state *parse_map(t_state *state, char **lines) { int i; @@ -94,15 +101,15 @@ t_parsing *parse_map(t_parsing *parsing, char **lines) while (lines[++i] != NULL) if (*lines[i] != '1') return (NULL); - parsing->map_height = i; - if ((parsing->map = (t_map)malloc(sizeof(t_cell*) * i)) == NULL) + state->map_height = i; + if ((state->map = (t_map)malloc(sizeof(t_cell*) * i)) == NULL) return (NULL); - parsing->map_width = ft_strcount(*lines, '1'); + state->map_width = ft_strcount(*lines, '1'); i = -1; while (lines[++i] != NULL) - if ((parsing->map[i] = create_map_row(lines[i])) == NULL) + if ((state->map[i] = create_map_row(lines[i])) == NULL) return (NULL); - return (parsing); + return (state); } t_cell *create_map_row(char *line) diff --git a/parse/parse_ceilling_color.c b/parse/parse_ceilling_color.c deleted file mode 100644 index 3b6c334..0000000 --- a/parse/parse_ceilling_color.c +++ /dev/null @@ -1,27 +0,0 @@ -/* ************************************************************************** */ -/* */ -/* ::: :::::::: */ -/* parse_ceilling_color.c :+: :+: :+: */ -/* +:+ +:+ +:+ */ -/* By: cacharle <marvin@42.fr> +#+ +:+ +#+ */ -/* +#+#+#+#+#+ +#+ */ -/* Created: 2019/11/15 09:31:32 by cacharle #+# #+# */ -/* Updated: 2019/11/18 17:22:49 by cacharle ### ########.fr */ -/* */ -/* ************************************************************************** */ - -#include "cub3d.h" - -t_bool parse_ceilling_color(t_parsing *parsing, char *line) -{ - line++; - if ((parsing->ceilling_color.rgb.r = ft_atoi(line)) > 255) - return (FALSE); - line = ft_strchr(line, ',') + 1; - if ((parsing->ceilling_color.rgb.g = ft_atoi(line)) > 255) - return (FALSE); - line = ft_strchr(line, ',') + 1; - if ((parsing->ceilling_color.rgb.b = ft_atoi(line)) > 255) - return (FALSE); - return (TRUE); -} diff --git a/parse/parse_color.c b/parse/parse_color.c new file mode 100644 index 0000000..f602706 --- /dev/null +++ b/parse/parse_color.c @@ -0,0 +1,55 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* parse_color.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: cacharle <marvin@42.fr> +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2020/01/11 09:52:34 by cacharle #+# #+# */ +/* Updated: 2020/01/11 10:14:29 by cacharle ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "cub3d.h" + +t_bool parse_ceilling_color(t_state *state, char *line) +{ + int tmp; + + line++; + if ((tmp = ft_atoi(line)) > 255 || tmp < 0) + return (FALSE); + state->ceilling_color.rgb.r = (t_byte)tmp; + if ((line = ft_strchr(line, ',') + 1) == NULL) + return (FALSE); + if ((tmp = ft_atoi(line)) > 255 || tmp < 0) + return (FALSE); + state->ceilling_color.rgb.g = (t_byte)tmp; + if ((line = ft_strchr(line, ',') + 1) == NULL) + return (FALSE); + if ((tmp = ft_atoi(line)) > 255 || tmp < 0) + return (FALSE); + state->ceilling_color.rgb.b = (t_byte)tmp; + return (TRUE); +} + +t_bool parse_floor_color(t_state *state, char *line) +{ + int tmp; + + line++; + if ((tmp = ft_atoi(line)) > 255 || tmp < 0) + return (FALSE); + state->floor_color.rgb.r = (t_byte)tmp; + if ((line = ft_strchr(line, ',') + 1) == NULL) + return (FALSE); + if ((tmp = ft_atoi(line)) > 255 || tmp < 0) + return (FALSE); + state->floor_color.rgb.g = (t_byte)tmp; + if ((line = ft_strchr(line, ',') + 1) == NULL) + return (FALSE); + if ((tmp = ft_atoi(line)) > 255 || tmp < 0) + return (FALSE); + state->floor_color.rgb.b = (t_byte)tmp; + return (TRUE); +} diff --git a/parse/parse_east_texture.c b/parse/parse_east_texture.c deleted file mode 100644 index 846b36d..0000000 --- a/parse/parse_east_texture.c +++ /dev/null @@ -1,19 +0,0 @@ -/* ************************************************************************** */ -/* */ -/* ::: :::::::: */ -/* parse_east_texture.c :+: :+: :+: */ -/* +:+ +:+ +:+ */ -/* By: cacharle <marvin@42.fr> +#+ +:+ +#+ */ -/* +#+#+#+#+#+ +#+ */ -/* Created: 2019/11/15 09:29:37 by cacharle #+# #+# */ -/* Updated: 2019/11/15 09:31:02 by cacharle ### ########.fr */ -/* */ -/* ************************************************************************** */ - -#include "cub3d.h" - -t_bool parse_east_texture(t_parsing *parsing, char *line) -{ - parsing->east_texture_path = ft_strdup(line + 1); - return (TRUE); -} diff --git a/parse/parse_floor_color.c b/parse/parse_floor_color.c deleted file mode 100644 index ab16bd9..0000000 --- a/parse/parse_floor_color.c +++ /dev/null @@ -1,27 +0,0 @@ -/* ************************************************************************** */ -/* */ -/* ::: :::::::: */ -/* parse_floor_color.c :+: :+: :+: */ -/* +:+ +:+ +:+ */ -/* By: cacharle <marvin@42.fr> +#+ +:+ +#+ */ -/* +#+#+#+#+#+ +#+ */ -/* Created: 2019/11/15 09:29:32 by cacharle #+# #+# */ -/* Updated: 2019/11/18 17:23:26 by cacharle ### ########.fr */ -/* */ -/* ************************************************************************** */ - -#include "cub3d.h" - -t_bool parse_floor_color(t_parsing *parsing, char *line) -{ - line++; - if ((parsing->floor_color.rgb.r = ft_atoi(line)) > 255) - return (FALSE); - line = ft_strchr(line, ',') + 1; - if ((parsing->floor_color.rgb.g = ft_atoi(line)) > 255) - return (FALSE); - line = ft_strchr(line, ',') + 1; - if ((parsing->floor_color.rgb.b = ft_atoi(line)) > 255) - return (FALSE); - return (TRUE); -} diff --git a/parse/parse_north_texture.c b/parse/parse_north_texture.c deleted file mode 100644 index eb8cb3c..0000000 --- a/parse/parse_north_texture.c +++ /dev/null @@ -1,19 +0,0 @@ -/* ************************************************************************** */ -/* */ -/* ::: :::::::: */ -/* parse_north_texture.c :+: :+: :+: */ -/* +:+ +:+ +:+ */ -/* By: cacharle <marvin@42.fr> +#+ +:+ +#+ */ -/* +#+#+#+#+#+ +#+ */ -/* Created: 2019/11/15 09:29:47 by cacharle #+# #+# */ -/* Updated: 2019/11/15 09:30:52 by cacharle ### ########.fr */ -/* */ -/* ************************************************************************** */ - -#include "cub3d.h" - -t_bool parse_north_texture(t_parsing *parsing, char *line) -{ - parsing->north_texture_path = ft_strdup(line + 1); - return (TRUE); -} diff --git a/parse/parse_resolution.c b/parse/parse_resolution.c index e63317e..d6c5759 100644 --- a/parse/parse_resolution.c +++ b/parse/parse_resolution.c @@ -6,16 +6,19 @@ /* By: cacharle <marvin@42.fr> +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2019/11/15 09:29:27 by cacharle #+# #+# */ -/* Updated: 2019/11/15 09:31:47 by cacharle ### ########.fr */ +/* Updated: 2020/01/11 09:44:18 by cacharle ### ########.fr */ /* */ /* ************************************************************************** */ #include "cub3d.h" -t_bool parse_resolution(t_parsing *parsing, char *line) +t_bool parse_resolution(t_state *state, char *line) { - parsing->resolution_width = ft_atoi(line); - line = ft_strrchr(line, ' ') + 1; - parsing->resolution_height = ft_atoi(line); + if ((state->window.width = ft_atoi(line)) < 0) + return (FALSE); + if ((line = ft_strrchr(line, ' ') + 1) == NULL) + return (FALSE); + if ((state->window.height = ft_atoi(line)) < 0) + return (FALSE); return (TRUE); } diff --git a/parse/parse_sprite_texture.c b/parse/parse_sprite_texture.c deleted file mode 100644 index 8e3f40b..0000000 --- a/parse/parse_sprite_texture.c +++ /dev/null @@ -1,19 +0,0 @@ -/* ************************************************************************** */ -/* */ -/* ::: :::::::: */ -/* parse_sprite_texture.c :+: :+: :+: */ -/* +:+ +:+ +:+ */ -/* By: cacharle <marvin@42.fr> +#+ +:+ +#+ */ -/* +#+#+#+#+#+ +#+ */ -/* Created: 2019/11/15 09:30:05 by cacharle #+# #+# */ -/* Updated: 2019/11/15 09:31:56 by cacharle ### ########.fr */ -/* */ -/* ************************************************************************** */ - -#include "cub3d.h" - -t_bool parse_sprite_texture(t_parsing *parsing, char *line) -{ - parsing->sprite_texture_path = ft_strdup(line + 1); - return (TRUE); -} diff --git a/parse/parse_textures.c b/parse/parse_textures.c new file mode 100644 index 0000000..a0fb8f6 --- /dev/null +++ b/parse/parse_textures.c @@ -0,0 +1,48 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* parse_textures.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: cacharle <marvin@42.fr> +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2020/01/11 09:47:53 by cacharle #+# #+# */ +/* Updated: 2020/01/11 09:51:03 by cacharle ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "cub3d.h" + +t_bool parse_north_texture(t_state *state, char *line) +{ + if ((state->textures_path[TEX_NORTH] = ft_strdup(line)) == NULL) + return (FALSE); + return (TRUE); +} + +t_bool parse_south_texture(t_state *state, char *line) +{ + if ((state->textures_path[TEX_SOUTH] = ft_strdup(line)) == NULL) + return (FALSE); + return (TRUE); +} + +t_bool parse_west_texture(t_state *state, char *line) +{ + if ((state->textures_path[TEX_WEST] = ft_strdup(line)) == NULL) + return (FALSE); + return (TRUE); +} + +t_bool parse_east_texture(t_state *state, char *line) +{ + if ((state->textures_path[TEX_EAST] = ft_strdup(line)) == NULL) + return (FALSE); + return (TRUE); +} + +t_bool parse_sprite_texture(t_state *state, char *line) +{ + if ((state->textures_path[TEX_SPRITE] = ft_strdup(line)) == NULL) + return (FALSE); + return (TRUE); +} diff --git a/parse/parse_west_texture.c b/parse/parse_west_texture.c deleted file mode 100644 index dca1629..0000000 --- a/parse/parse_west_texture.c +++ /dev/null @@ -1,19 +0,0 @@ -/* ************************************************************************** */ -/* */ -/* ::: :::::::: */ -/* parse_west_texture.c :+: :+: :+: */ -/* +:+ +:+ +:+ */ -/* By: cacharle <marvin@42.fr> +#+ +:+ +#+ */ -/* +#+#+#+#+#+ +#+ */ -/* Created: 2019/11/15 09:29:42 by cacharle #+# #+# */ -/* Updated: 2019/11/15 09:30:40 by cacharle ### ########.fr */ -/* */ -/* ************************************************************************** */ - -#include "cub3d.h" - -t_bool parse_west_texture(t_parsing *parsing, char *line) -{ - parsing->west_texture_path = ft_strdup(line + 1); - return (TRUE); -} @@ -9,19 +9,13 @@ int render_update(void *param) if (!state->running) { state_destroy(state); - exit(0); + exit(EXIT_SUCCESS); } mlx_clear_window(state->mlx_ptr, state->window_ptr); x = -1; - while (++x < state->window_width) + while (++x < state->window.width) render_column(state, x); - - /* for (int i = 0; i < 200000; i++) */ - /* state->window_img.data[i] = 127; */ - mlx_put_image_to_window(state->mlx_ptr, state->window_ptr, state->window_img.id, 0, 0); - /* mlx_put_image_to_window(state->mlx_ptr, state->window_ptr, state->north_texture.id, 0, 0); */ - /* for (int i = 0; i < 200; i++) */ - /* printf("%d ", state->window_img.data[i]); */ + mlx_put_image_to_window(state->mlx_ptr, state->window_ptr, state->window.id, 0, 0); return (0); } @@ -38,7 +32,7 @@ void render_column(t_state *state, int x) * # | # * #################### */ - double camera_x = 2 * x / (double)state->window_width - 1; + double camera_x = 2 * x / (double)state->window.width - 1; /* camera plane length related to current column */ t_vector ray; @@ -99,15 +93,15 @@ void render_column(t_state *state, int x) /* if (perp_wall_dist <= 0) */ /* line_height = state->window_height; */ /* else */ - line_height = (int)(state->window_height / perp_wall_dist); + line_height = (int)(state->window.height / perp_wall_dist); /* printf("%f\n", perp_wall_dist); */ /* printf("%d\n", line_height); */ - int draw_start = state->window_height / 2 - line_height / 2; + int draw_start = state->window.height / 2 - line_height / 2; if (draw_start < 0) draw_start = 0; - int draw_end = state->window_height / 2 + line_height / 2; - if (draw_end >= state->window_height) - draw_end = state->window_height - 1; + int draw_end = state->window.height / 2 + line_height / 2; + if (draw_end >= state->window.height) + draw_end = state->window.height - 1; /* int tex_x; */ /* int wall_x = side == SIDE_WEST_EAST ? pos */ @@ -137,11 +131,11 @@ void render_column(t_state *state, int x) t_color white; white.hexcode = 0x00ffffff; while (i < draw_start) - ((t_color*)state->window_img.data)[i++ * state->window_img.width + x] = state->ceilling_color; + ((t_color*)state->window.data)[i++ * state->window.width + x] = state->ceilling_color; while (i < draw_end) - ((t_color*)state->window_img.data)[i++ * state->window_img.width + x] = white; + ((t_color*)state->window.data)[i++ * state->window.width + x] = white; while (i < state->window_height) - ((t_color*)state->window_img.data)[i++ * state->window_img.width + x] = state->floor_color; + ((t_color*)state->window.data)[i++ * state->window.width + x] = state->floor_color; } /* double map_range(double x, double src_lo, double src_hi, double dest_lo, double dest_hi) */ @@ -6,61 +6,53 @@ /* By: cacharle <marvin@42.fr> +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2019/11/19 16:39:57 by cacharle #+# #+# */ -/* Updated: 2020/01/10 11:44:24 by cacharle ### ########.fr */ +/* Updated: 2020/01/11 10:24:53 by cacharle ### ########.fr */ /* */ /* ************************************************************************** */ #include "cub3d.h" -t_state *state_new(void *mlx_ptr, void *window_ptr, t_parsing *parsing) -{ - t_state *state; - - if ((state = (t_state*)malloc(sizeof(t_state))) == NULL) - return (NULL); - if ((state->north_texture = load_texture(parsing->north_texture_path)) == NULL) - return (NULL); - if ((state->south_texture = load_texture(parsing->south_texture_path)) == NULL) - return (NULL); - if ((state->west_texture = load_texture(parsing->west_texture_path)) == NULL) - return (NULL); - if ((state->east_texture = load_texture(parsing->east_texture_path)) == NULL) - return (NULL); +/* +** Initialize the state attributes that weren't already filled by the parsing +*/ - state->window_img.id = mlx_new_image(mlx_ptr, parsing->resolution_width, parsing->resolution_height); - state->window_img.width = parsing->resolution_width; - state->window_img.height = parsing->resolution_height; - state->window_img.data = mlx_get_data_addr(state->window_img.id, - &state->window_img.depth, &state->window_img.size_line, &state->window_img.endian); +t_state *state_new(t_state *state) +{ + int i; state->running = TRUE; - state->mlx_ptr = mlx_ptr; - state->window_ptr = window_ptr; - state->window_width = parsing->resolution_width; - state->window_height = parsing->resolution_height; - state->map = parsing->map; - state->map_width = parsing->map_width; - state->map_height = parsing->map_height; - state->ceilling_color = parsing->ceilling_color; - state->floor_color = parsing->floor_color; - - state_new_player(state, parsing); - + if ((state->mlx_ptr = mlx_init()) == NULL) + return (state_destroy(state)); + if ((state->window_ptr = mlx_new_window(state->mlx_ptr, + state->window.width, state->window.height, WINDOW_TITLE)) == NULL) + return (state_destroy(state)); + i = -1; + while (++i < TEXTURES_NUM) + { + load_texture(state->mlx_ptr, &state->textures[i], state->textures_path[i]); + if (state->textures[i].id == NULL) + return (state_destroy(state)); + } + if ((state->window.id = mlx_new_image(state->mlx_ptr, + state->window.width, state->window.height)) == NULL) + return (state_destroy(state)); + state->window.data = mlx_get_data_addr(state->window.id, + &state->window.depth, &state->window.size_line, &state->window.endian); + state_init_player(state); return (state); } -void state_new_player(t_state *state, t_parsing *parsing) +void state_init_player(t_state *state) { int i; int j; i = -1; - while (++i < parsing->map_height) + while (++i < state->map_height) { j = -1; - while (++j < parsing->map_width) - if (parsing->map[i][j] & (CELL_LOOK_NORTH | CELL_LOOK_SOUTH - | CELL_LOOK_WEST | CELL_LOOK_EAST) + while (++j < state->map_width) + if (helper_is_player_cell(state->map[i][j])) { state->pos.x = (double)j + 0.5; state->pos.y = (double)i + 0.5; @@ -69,27 +61,68 @@ void state_new_player(t_state *state, t_parsing *parsing) } } /* need to be normalized */ - state->dir.x = 0.0; - state->dir.y = 0.0; - if (parsing->map[(int)state.y][(int)state.x] & CELL_LOOK_NORTH) + if (state->map[(int)state->pos.y][(int)state->pos.x] == CELL_LOOK_NORTH) state->dir.y = 1.0; - else if (parsing->map[(int)state.y][(int)state.x] & CELL_LOOK_SOUTH) + else if (state->map[(int)state->pos.y][(int)state->pos.x] == CELL_LOOK_SOUTH) state->dir.y = -1.0; - else if (parsing->map[(int)state.y][(int)state.x] & CELL_LOOK_WEST) + else if (state->map[(int)state->pos.y][(int)state->pos.x] == CELL_LOOK_WEST) state->dir.x = -1.0; - else if (parsing->map[(int)state.y][(int)state.x] & CELL_LOOK_EAST) + else if (state->map[(int)state->pos.y][(int)state->pos.x] == CELL_LOOK_EAST) state->dir.x = 1.0; - state->plane.x = 0.0; state->plane.y = 0.66; } -void state_destroy(t_state *state) +t_state *state_new_empty(void) { - mlx_destroy_window(state->mlx_ptr, state->window_ptr); - free(state->north_texture); - free(state->south_texture); - free(state->west_texture); - free(state->east_texture); + int i; + t_state *state; + + if ((state = (t_state*)malloc(sizeof(t_state))) == NULL) + return (NULL); + state->mlx_ptr = NULL; + state->window_ptr = NULL; + i = -1; + while (++i < TEXTURES_NUM) + { + state->textures_path[i] = NULL; + state->textures[i].id = NULL; + } + state->dir.x = 0.0; + state->dir.y = 0.0; + state->map = NULL; + state->ceilling_color.hexcode = 0x0; + state->floor_color.hexcode = 0x0; + return (state); +} + +void *state_destroy(t_state *state) +{ + int i; + + if (state == NULL) + return (NULL); + i = -1; + while (++i < TEXTURES_NUM) + { + free(state->textures_path[i]); + mlx_destroy_image(state->mlx_ptr, state->textures[i].id); + } + if (state->mlx_ptr && state->window_ptr) + mlx_destroy_window(state->mlx_ptr, state->window_ptr); + if (state->map != NULL) + while (state->map_height-- > 0 && state->map[state->map_height] != NULL) + free(state->map[state->map_height]); + free(state->map); free(state); + return (NULL); +} + +void load_texture(void *mlx_ptr, t_image *image, char *path) +{ + if ((image->id = mlx_xpm_file_to_image( + mlx_ptr, path, &image->width, &image->height)) == NULL) + return ; + image->data = mlx_get_data_addr(image->id, &image->depth, + &image->size_line, &image->endian); } |
