From e581c72b028261b0025e7ff546923308e204f65d Mon Sep 17 00:00:00 2001 From: Raphael Date: Mon, 9 Dec 2024 14:33:53 +0100 Subject: [PATCH] feat: testing how to play with textures --- includes/cub3d.h | 3 +- mlx_layer/mlx_init.c | 4 +- mlx_layer/mlx_load_texture.c | 4 +- raycast/frame_update.c | 19 +- raycast/frame_update2.c | 19 +- test/Makefile | 15 +- test/Makefile.gen | 1 - test/flake.nix | 2 +- test/test.c | 403 ++++++++++++++----------------- test/test.h | 68 +++--- test/test2.c | 129 ++++++++-- test/textures/cobblestone_32.xpm | 154 ++++++++++++ test/textures/sandy_32.xpm | 45 ++++ test/textures/wasteland_32.xpm | 45 ++++ 14 files changed, 598 insertions(+), 313 deletions(-) delete mode 100644 test/Makefile.gen create mode 100644 test/textures/cobblestone_32.xpm create mode 100644 test/textures/sandy_32.xpm create mode 100644 test/textures/wasteland_32.xpm diff --git a/includes/cub3d.h b/includes/cub3d.h index 3cee389..9e74661 100644 --- a/includes/cub3d.h +++ b/includes/cub3d.h @@ -6,7 +6,7 @@ /* By: rparodi +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2024/10/30 16:30:26 by rparodi #+# #+# */ -/* Updated: 2024/12/01 17:59:19 by rparodi ### ########.fr */ +/* Updated: 2024/12/05 16:45:30 by rparodi ### ########.fr */ /* */ /* ************************************************************************** */ @@ -23,6 +23,7 @@ # include // utils +void draw_floor(t_info *data); void dump_info(t_info *info); int render_frame(t_info *data); void my_mlx_pixel_put(t_info *data, int x, int y, int color); diff --git a/mlx_layer/mlx_init.c b/mlx_layer/mlx_init.c index 94a6c49..f3bdab0 100644 --- a/mlx_layer/mlx_init.c +++ b/mlx_layer/mlx_init.c @@ -6,7 +6,7 @@ /* By: rparodi +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2024/11/11 19:53:42 by rparodi #+# #+# */ -/* Updated: 2024/12/02 00:20:25 by rparodi ### ########.fr */ +/* Updated: 2024/12/05 16:55:30 by rparodi ### ########.fr */ /* */ /* ************************************************************************** */ @@ -14,7 +14,7 @@ #include "cub3d_struct.h" #include "mlx_functions.h" #include "mlx_structs.h" - +#include "ft_string.h" #include "ft_math.h" #include diff --git a/mlx_layer/mlx_load_texture.c b/mlx_layer/mlx_load_texture.c index c67fea2..66e5ab3 100644 --- a/mlx_layer/mlx_load_texture.c +++ b/mlx_layer/mlx_load_texture.c @@ -6,7 +6,7 @@ /* By: rparodi +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2024/11/20 12:25:45 by rparodi #+# #+# */ -/* Updated: 2024/12/02 17:54:04 by rparodi ### ########.fr */ +/* Updated: 2024/12/05 17:01:12 by rparodi ### ########.fr */ /* */ /* ************************************************************************** */ @@ -30,7 +30,7 @@ bool mlx_load_all_textures(t_info *info) size_t i; i = 0; - info->map.texture[0] = mlx_load_image(info, "../textures/a.xpm"); + info->map.texture[0] = mlx_load_image(info, "../textures/wasteland_32.xpm"); info->map.texture[1] = mlx_load_image(info, "../textures/b.xpm"); info->map.texture[2] = mlx_load_image(info, "../textures/sandy_32.xpm"); info->map.texture[3] = mlx_load_image(info, "../textures/cobblestone_32.xpm"); diff --git a/raycast/frame_update.c b/raycast/frame_update.c index ee7f0fb..d80669f 100644 --- a/raycast/frame_update.c +++ b/raycast/frame_update.c @@ -6,7 +6,7 @@ /* By: bgoulard +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2024/11/12 06:02:54 by bgoulard #+# #+# */ -/* Updated: 2024/12/05 16:30:56 by rparodi ### ########.fr */ +/* Updated: 2024/12/05 16:44:04 by rparodi ### ########.fr */ /* */ /* ************************************************************************** */ @@ -91,23 +91,6 @@ void column_handler(t_ipoint pos_i, t_dpoint ray_dir, t_info *data, int x) draw_(side, perp_wall_dist, step, x, data); } -void draw_floor(t_info *data) -{ - t_ipoint temp; - - temp.y = data->screen_size.y / 2; - while (temp.y < data->screen_size.y) - { - temp.x = 0; - while (temp.x < data->screen_size.x) - { - my_mlx_pixel_put(data, temp.x, temp.y, 0xFFFFFF); - temp.x++; - } - temp.y++; - } -} - int render_frame(t_info *data) { double camera_x; diff --git a/raycast/frame_update2.c b/raycast/frame_update2.c index 73739b4..39a595c 100644 --- a/raycast/frame_update2.c +++ b/raycast/frame_update2.c @@ -6,7 +6,7 @@ /* By: rparodi +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2024/12/01 18:55:11 by rparodi #+# #+# */ -/* Updated: 2024/12/01 18:57:21 by rparodi ### ########.fr */ +/* Updated: 2024/12/05 16:43:53 by rparodi ### ########.fr */ /* */ /* ************************************************************************** */ @@ -20,6 +20,23 @@ #include #include +void draw_floor(t_info *data) +{ + t_ipoint temp; + + temp.y = data->screen_size.y / 2; + while (temp.y < data->screen_size.y) + { + temp.x = 0; + while (temp.x < data->screen_size.x) + { + my_mlx_pixel_put(data, temp.x, temp.y, 0xFFFFFF); + temp.x++; + } + temp.y++; + } +} + void set_step(t_ipoint *step, t_dpoint raydir) { if (raydir.x < 0) diff --git a/test/Makefile b/test/Makefile index 371ad54..708ca5a 100644 --- a/test/Makefile +++ b/test/Makefile @@ -6,7 +6,7 @@ # By: rparodi +#+ +:+ +#+ # # +#+#+#+#+#+ +#+ # # Created: 2023/11/12 11:05:05 by rparodi #+# #+# # -# Updated: 2024/12/02 17:42:23 by rparodi ### ########.fr # +# Updated: 2024/12/02 17:47:59 by rparodi ### ########.fr # # # # **************************************************************************** # @@ -27,14 +27,13 @@ CFLAGS += -g3 -MMD # CFLAGS += -fsanitize=thread # INCLUDES += -I /opt/X11/include -INCLUDES = -I /usr/include -I ../includes -I ../includes/include -I ../minilibx-linux -INCLUDES += -I ../ +INCLUDES = -I /usr/include -I ./includes -I ./includes/include -I ./minilibx-linux # Paths -MLX_DIR = ../minilibx-linux +MLX_DIR = ./minilibx-linux # Library flags -LDFLAGS = -L../build -lmlx -lm -lft +LDFLAGS = -L./build -lmlx -lm # MiniLibX flags for macOS with XQuartz MLXFLAGS = -L$(MLX_DIR) -lX11 -lXext @@ -83,13 +82,9 @@ fclean: clean # Restart (make re) re: header fclean all -# Compile external libraries -# -build/libmlx.a: -# @make --no-print-directory -C $(MLX_DIR) # Dependences for all -$(NAME): $(OBJ) build/libmlx.a +$(NAME): $(OBJ) @mkdir -p $(OBJDIRNAME) @printf '$(GREY) Creating $(END)$(GREEN)$(OBJDIRNAME)$(END)\n' @$(CC) $(CFLAGS) $(OBJ) $(LDFLAGS) -o $(NAME) diff --git a/test/Makefile.gen b/test/Makefile.gen deleted file mode 100644 index 60181d4..0000000 --- a/test/Makefile.gen +++ /dev/null @@ -1 +0,0 @@ -INC=/usr/X11/include diff --git a/test/flake.nix b/test/flake.nix index b62b26c..044c71e 100644 --- a/test/flake.nix +++ b/test/flake.nix @@ -18,7 +18,7 @@ in { devShell = pkgs.mkShell { packages = [ - pkgs.xorg.libX11 + pkgs.xorg.libX11 pkgs.xorg.libXext pkgs.clang pkgs.clang-tools diff --git a/test/test.c b/test/test.c index eb9b8d3..f5fa61b 100644 --- a/test/test.c +++ b/test/test.c @@ -6,258 +6,235 @@ /* By: rparodi +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2024/11/27 12:09:00 by rparodi #+# #+# */ -/* Updated: 2024/12/02 17:42:10 by rparodi ### ########.fr */ +/* Updated: 2024/11/27 15:59:53 by rparodi ### ########.fr */ /* */ /* ************************************************************************** */ -#include "ft_string.h" -#include "ft_math.h" -#include "minilibx-linux/mlx.h" -#include -#include +#include "test.h" -#include "./test.h" - -const int g_worldMap[MAP_WIDTH][MAP_HEIGHT] = { \ - {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}, \ - {1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1}, \ - {1, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1}, \ - {1, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1}, \ - {1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1}, \ - {1, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1}, \ - {1, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1}, \ - {1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1}, \ - {1, 1, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1}, \ - {1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1}, \ - {1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1}, \ - {1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1}, \ - {1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1}, \ - {1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1}, \ - {1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1}, \ - {1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1}, \ - {1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1}, \ - {1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1}, \ - {1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1}, \ - {1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1}, \ - {1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1}, \ - {1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1}, \ - {1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1}, \ - {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1} \ +int worldMap[MAP_WIDTH][MAP_HEIGHT] = {\ +{1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1}, \ +{1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1}, \ +{1,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1}, \ +{1,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1}, \ +{1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1}, \ +{1,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1}, \ +{1,0,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1}, \ +{1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1}, \ +{1,1,1,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1}, \ +{1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1}, \ +{1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1}, \ +{1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1}, \ +{1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1}, \ +{1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1}, \ +{1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1}, \ +{1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1}, \ +{1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1}, \ +{1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1}, \ +{1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1}, \ +{1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1}, \ +{1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1}, \ +{1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1}, \ +{1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1}, \ +{1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1} \ }; void my_mlx_pixel_put(t_data *data, int x, int y, int color) { - uint *dst; + char *dst; - x *= data->bits_per_pixel / 8; - dst = (uint *)(data->addr + (y * data->line_length + x)); - *dst = color; -} - -double deg2rad(int deg) -{ - return (deg * M_PI / 180); -} - -void rotate_plane(t_2dpoint *plane, double angle) -{ - double old_plane_x; - - old_plane_x = (*plane).x; - plane->x = plane->x * cos(angle) - plane->y * sin(angle); - plane->y = old_plane_x * sin(angle) + plane->y * cos(angle); + dst = data->addr + (y * data->line_length + x * (data->bits_per_pixel / 8)); + *(unsigned int *)dst = color; } void move_straight(t_data *data) { - if (!g_worldMap[\ - (int)(data->pos.x + data->dir.x * MOVE_SPEED)][(int)data->pos.y]) - data->pos.x += data->dir.x * MOVE_SPEED; - if (!g_worldMap[\ - (int)data->pos.x][(int)(data->pos.y + data->dir.y * MOVE_SPEED)]) - data->pos.y += data->dir.y * MOVE_SPEED; + if (!worldMap[\ + (int)(data->pos_x + data->dir_x * MOVE_SPEED)][(int)data->pos_y]) + data->pos_x += data->dir_x * MOVE_SPEED; + if (!worldMap[\ + (int)data->pos_x][(int)(data->pos_y + data->dir_y * MOVE_SPEED)]) + data->pos_y += data->dir_y * MOVE_SPEED; } void move_backward(t_data *data) { - if (!g_worldMap[\ - (int)(data->pos.x - data->dir.x * MOVE_SPEED)][(int)data->pos.y]) - data->pos.x -= data->dir.x * MOVE_SPEED; - if (!g_worldMap[\ - (int)data->pos.x][(int)(data->pos.y - data->dir.y * MOVE_SPEED)]) - data->pos.y -= data->dir.y * MOVE_SPEED; + if (!worldMap[\ + (int)(data->pos_x - data->dir_x * MOVE_SPEED)][(int)data->pos_y]) + data->pos_x -= data->dir_x * MOVE_SPEED; + if (!worldMap[\ + (int)data->pos_x][(int)(data->pos_y - data->dir_y * MOVE_SPEED)]) + data->pos_y -= data->dir_y * MOVE_SPEED; } void move_left(t_data *data) { - double pdir_x; - double pdir_y; + double perp_dir_x; + double perp_dir_y; - pdir_x = -data->dir.y; - pdir_y = data->dir.x; - if (!g_worldMap[(int)(data->pos.x + pdir_x * MOVE_SPEED)][(int)data->pos.y]) - data->pos.x -= pdir_x * MOVE_SPEED; - if (!g_worldMap[(int)data->pos.x][(int)(data->pos.y - pdir_y * MOVE_SPEED)]) - data->pos.y -= pdir_y * MOVE_SPEED; + perp_dir_x = -data->dir_y; + perp_dir_y = data->dir_x; + if (!worldMap[\ + (int)(data->pos_x + perp_dir_x * MOVE_SPEED)][(int)data->pos_y]) + data->pos_x -= perp_dir_x * MOVE_SPEED; + if (!worldMap[\ + (int)data->pos_x][(int)(data->pos_y - perp_dir_y * MOVE_SPEED)]) + data->pos_y -= perp_dir_y * MOVE_SPEED; } void move_right(t_data *data) { - double pdir_x; - double pdir_y; + double perp_dir_x; + double perp_dir_y; - pdir_x = -data->dir.y; - pdir_y = data->dir.x; - if (!g_worldMap[(int)(data->pos.x - pdir_x * MOVE_SPEED)][(int)data->pos.y]) - data->pos.x += pdir_x * MOVE_SPEED; - if (!g_worldMap[(int)data->pos.x][(int)(data->pos.y + pdir_y * MOVE_SPEED)]) - data->pos.y += pdir_y * MOVE_SPEED; + perp_dir_x = -data->dir_y; + perp_dir_y = data->dir_x; + if (!worldMap[\ + (int)(data->pos_x - perp_dir_x * MOVE_SPEED)][(int)data->pos_y]) + data->pos_x += perp_dir_x * MOVE_SPEED; + if (!worldMap[\ + (int)data->pos_x][(int)(data->pos_y + perp_dir_y * MOVE_SPEED)]) + data->pos_y += perp_dir_y * MOVE_SPEED; } void look_left(t_data *data) { - rotate_plane(&data->dir, ROT_SPEED); - rotate_plane(&data->plane, ROT_SPEED); + double old_dir_x; + double old_plane_x; + + old_dir_x = data->dir_x; + old_plane_x = data->plane_x; + data->dir_x = data->dir_x * cos(ROT_SPEED) - data->dir_y * sin(ROT_SPEED); + data->dir_y = old_dir_x * sin(ROT_SPEED) + data->dir_y * cos(ROT_SPEED); + data->plane_x = data->plane_x * cos(ROT_SPEED) \ + - data->plane_y * sin(ROT_SPEED); + data->plane_y = old_plane_x * sin(ROT_SPEED) \ + + data->plane_y * cos(ROT_SPEED); } void look_right(t_data *data) { - rotate_plane(&data->dir, -ROT_SPEED); - rotate_plane(&data->plane, -ROT_SPEED); + double old_dir_x; + double old_plane_x; + + old_dir_x = data->dir_x; + old_plane_x = data->plane_x; + data->dir_x = data->dir_x * cos(-ROT_SPEED) - data->dir_y * sin(-ROT_SPEED); + data->dir_y = old_dir_x * sin(-ROT_SPEED) + data->dir_y * cos(-ROT_SPEED); + data->plane_x = data->plane_x * cos(-ROT_SPEED) \ + - data->plane_y * sin(-ROT_SPEED); + data->plane_y = old_plane_x * sin(-ROT_SPEED) \ + + data->plane_y * cos(-ROT_SPEED); } - + int key_hook(int keycode, t_data *data) { - if (keycode == XK_Escape) + if (keycode == 65307) exit(0); - if (keycode == XK_w) + if (keycode == 119) move_straight(data); - if (keycode == XK_s) + if (keycode == 115) move_backward(data); - if (keycode == XK_a) + if (keycode == 97) move_right(data); - if (keycode == XK_d) + if (keycode == 100) move_left(data); - if (keycode == XK_Left) + if (keycode == 65361) look_left(data); - if (keycode == XK_Right) + if (keycode == 65363) look_right(data); return (0); } -int get_cl(int side, t_2ipoint step) -{ - int color; - - if (side == 0 && step.x > 0) - color = 0x00FF0000; - else if (side == 0 && step.x < 0) - color = 0x0000FF00; - else if (side == 1 && step.y > 0) - color = 0x000000FF; - else - color = 0x00FFFF00; - return (color); -} - -void draw_(int side, double perpWallDist, t_2ipoint step, int x, t_data *data) -{ - const int lineHeight = (int)(WINDOW_HEIGHT / perpWallDist) * cos(deg2rad(FOV/ 2)); - int drawStart; - int drawEnd; - int color; - - drawStart = -lineHeight / 2 + WINDOW_HEIGHT / 2; - drawEnd = lineHeight / 2 + WINDOW_HEIGHT / 2; - // normalize drawStart and drawEnd - drawStart = ft_clamp(drawStart, 0, WINDOW_HEIGHT - 1); - drawEnd = ft_clamp(drawEnd, 0, WINDOW_HEIGHT - 1); - color = get_cl(side, step); - while (drawStart < drawEnd) - my_mlx_pixel_put(data, x, drawStart++, color); -} - - -void search_hit(t_2dpoint *sideDist, t_2dpoint deltaDist, t_2ipoint *map, t_2ipoint step, int *side) -{ - while (true) { - if (sideDist->x < sideDist->y) { - sideDist->x += deltaDist.x; - map->x += step.x; - *side = 0; - } else { - sideDist->y += deltaDist.y; - map->y += step.y; - *side = 1; - } - - if (g_worldMap[map->x][map->y] > 0) - return ; - } -} - -void static set_step(t_2ipoint *step, t_2dpoint raydir) -{ - if (raydir.x < 0) - step->x = -1; - else - step->x = 1; - if (raydir.y < 0) - step->y = -1; - else - step->y = 1; -} - -void static set_side_dist(t_2dpoint *sideDist, t_2dpoint *tb, t_2ipoint map) -{ - t_2dpoint rayDir = tb[0]; - t_2dpoint pos = tb[1]; - t_2dpoint deltaDist = tb[2]; - - if (rayDir.x < 0) - sideDist->x = (pos.x - map.x) * deltaDist.x; - else - sideDist->x = (map.x + 1.0 - pos.x) * deltaDist.x; - if (rayDir.y < 0) - sideDist->y = (pos.y - map.y) * deltaDist.y; - else - sideDist->y = (map.y + 1.0 - pos.y) * deltaDist.y; -} - -void column_handler(t_2ipoint map, t_2dpoint rayDir, t_data *data, int x) -{ - t_2dpoint sideDist; - t_2dpoint deltaDist; - double perpWallDist; - t_2ipoint step; - int side; - - deltaDist = (t_2dpoint){fabs(1 / rayDir.x), fabs(1 / rayDir.y)}; - set_step(&step, rayDir); - set_side_dist(&sideDist, (t_2dpoint[]){rayDir, data->pos, deltaDist}, map); - search_hit(&sideDist, deltaDist, &map, step, &side); - if (side == 0) - perpWallDist = (map.x - data->pos.x + (double)(1 - step.x) / 2) - / rayDir.x; - else - perpWallDist = (map.y - data->pos.y + (double)(1 - step.y) / 2) - / rayDir.y; - draw_(side, perpWallDist, step, x, data); -} - int render_frame(t_data *data) { - double cameraX; - double coef; + int y; + int x; + + y = 0; + while (y < WINDOW_HEIGHT) + { + x = 0; + while (x < WINDOW_WIDTH) + { + my_mlx_pixel_put(data, x, y, 0x00000000); + x++; + } + y++; + } - coef = 2 * tan(deg2rad(FOV) / 2) / (double)WINDOW_WIDTH; - ft_bzero(data->addr, WINDOW_WIDTH * WINDOW_HEIGHT * data->bits_per_pixel / 8); for(int x = 0; x < WINDOW_WIDTH; x++) { - cameraX = x * coef - 1; - column_handler((t_2ipoint){(int)data->pos.x, (int)data->pos.y}, - (t_2dpoint){data->dir.x + data->plane.x * cameraX, data->dir.y + data->plane.y * cameraX}, - data, x); + double cameraX = 2 * x / (double)WINDOW_WIDTH - 1; + double rayDirX = data->dir_x + data->plane_x * cameraX; + double rayDirY = data->dir_y + data->plane_y * cameraX; + + int mapX = (int)data->pos_x; + int mapY = (int)data->pos_y; + + double sideDistX, sideDistY; + double deltaDistX = fabs(1 / rayDirX); + double deltaDistY = fabs(1 / rayDirY); + double perpWallDist; + + int stepX, stepY; + int hit = 0; + int side; + + if (rayDirX < 0) { + stepX = -1; + sideDistX = (data->pos_x - mapX) * deltaDistX; + } else { + stepX = 1; + sideDistX = (mapX + 1.0 - data->pos_x) * deltaDistX; + } + if (rayDirY < 0) { + stepY = -1; + sideDistY = (data->pos_y - mapY) * deltaDistY; + } else { + stepY = 1; + sideDistY = (mapY + 1.0 - data->pos_y) * deltaDistY; + } + + while (hit == 0) { + if (sideDistX < sideDistY) { + sideDistX += deltaDistX; + mapX += stepX; + side = 0; + } else { + sideDistY += deltaDistY; + mapY += stepY; + side = 1; + } + if (worldMap[mapX][mapY] > 0) + hit = 1; + } + + if (side == 0) + perpWallDist = (mapX - data->pos_x + (1 - stepX) / 2) / rayDirX; + else + perpWallDist = (mapY - data->pos_y + (1 - stepY) / 2) / rayDirY; + + int lineHeight = (int)(WINDOW_HEIGHT / perpWallDist); + int drawStart = -lineHeight / 2 + WINDOW_HEIGHT / 2; + if(drawStart < 0) drawStart = 0; + int drawEnd = lineHeight / 2 + WINDOW_HEIGHT / 2; + if(drawEnd >= WINDOW_HEIGHT) drawEnd = WINDOW_HEIGHT - 1; + + int color; + if (side == 0 && stepX > 0) + color = 0x00FF0000; + else if (side == 0 && stepX < 0) + color = 0x0000FF00; + else if (side == 1 && stepY > 0) + color = 0x000000FF; + else + color = 0x00FFFF00; + + if (side == 1) color = (color >> 1) & 8355711; // Make sides darker + + for(int y = drawStart; y < drawEnd; y++) + my_mlx_pixel_put(data, x, y, color); } mlx_put_image_to_window(data->mlx, data->win, data->img, 0, 0); return (0); @@ -272,26 +249,14 @@ int main(void) data.img = mlx_new_image(data.mlx, WINDOW_WIDTH, WINDOW_HEIGHT); data.addr = mlx_get_data_addr(data.img, &data.bits_per_pixel, &data.line_length, &data.endian); - // player position - // - // used to get player position in the map - data.pos.x = 22; - data.pos.y = 12; - // player look direction - // - // used to get player look direction vector - data.dir.x = -1; - data.dir.y = 0; - // plane perpendicular to look direction - // - // used to get player camera plane (aka projected screen in front of the - // player for ray intersection) - // the length of the camera plane is 2 * tan(fov / 2) * 1 - // where fov is the field of view of the camera - data.plane.x = 0; - data.plane.y = \ - 2 * tan(deg2rad(FOV) / 2); - mlx_hook(data.win, KeyPress, KeyPressMask, key_hook, &data); + data.pos_x = 22; + data.pos_y = 12; + data.dir_x = -1; + data.dir_y = 0; + data.plane_x = 0; + data.plane_y = 0.66; + + mlx_hook(data.win, 2, 1L<<0, key_hook, &data); mlx_loop_hook(data.mlx, render_frame, &data); mlx_loop(data.mlx); return (0); diff --git a/test/test.h b/test/test.h index 4d69854..c75495a 100644 --- a/test/test.h +++ b/test/test.h @@ -6,53 +6,55 @@ /* By: rparodi +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2024/11/27 12:07:20 by rparodi #+# #+# */ -/* Updated: 2024/11/28 11:56:24 by bgoulard ### ########.fr */ +/* Updated: 2024/11/27 12:08:19 by rparodi ### ########.fr */ /* */ /* ************************************************************************** */ #ifndef TEST_H # define TEST_H -// define keys -# define XK_LATIN_1 -# include +# include "minilibx-linux/mlx.h" +# include +# include +# include -# define WINDOW_WIDTH 1920 -# define WINDOW_HEIGHT 1080 +# define WINDOW_WIDTH 1024 +# define WINDOW_HEIGHT 768 # define MAP_WIDTH 24 # define MAP_HEIGHT 24 # define MOVE_SPEED 0.5 -# define ROT_SPEED 0.1 +# define ROT_SPEED 0.5 -# define FOV 70 - -typedef struct s_2dpoint -{ - double x; - double y; -} t_2dpoint; - -typedef struct s_2ipoint -{ - int x; - int y; -} t_2ipoint; +typedef struct s_texture { + void *img; + char *addr; + int width; + int height; + int bits_per_pixel; + int line_length; + int endian; +} t_texture; typedef struct s_data { - void *mlx; - void *win; - void *img; - char *addr; - int bits_per_pixel; - int line_length; - int endian; - t_2ipoint screen_size; - - t_2dpoint pos; - t_2ipoint pos_i; - t_2dpoint dir; - t_2dpoint plane; + void *mlx; + void *win; + void *img; + char *addr; + int bits_per_pixel; + int line_length; + int endian; + double pos_x; + double pos_y; + double dir_x; + double dir_y; + double plane_x; + double plane_y; + t_texture wall_so; + t_texture wall_no; + t_texture wall_we; + t_texture wall_ea; + t_texture floor; } t_data; #endif diff --git a/test/test2.c b/test/test2.c index 769f0c1..f657111 100644 --- a/test/test2.c +++ b/test/test2.c @@ -6,10 +6,10 @@ /* By: rparodi +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2024/11/27 12:09:00 by rparodi #+# #+# */ -/* Updated: 2024/12/01 17:25:59 by rparodi ### ########.fr */ +/* Updated: 2024/12/05 19:07:51 by rparodi ### ########.fr */ /* */ /* ************************************************************************** */ - +#include "minilibx-linux/mlx.h" #include "test.h" int worldMap[MAP_WIDTH][MAP_HEIGHT] = {\ @@ -146,26 +146,49 @@ int key_hook(int keycode, t_data *data) return (0); } -int render_frame(t_data *data) +void clear_window(t_data *data) { int y; - int x; + int x; y = 0; - while (y < data->screen_y) + while (y < WINDOW_HEIGHT / 2) { x = 0; - while (x < data->screen_x) + while (x < WINDOW_WIDTH) { - my_mlx_pixel_put(data, x, y, 0x00000000); + my_mlx_pixel_put(data, x, y, 0x000000); x++; } y++; } +} - for(int x = 0; x < data->screen_x; x++) +void draw_floor(t_data *data) +{ + int y; + int x; + + y = WINDOW_HEIGHT / 2; + while (y < WINDOW_HEIGHT) { - double cameraX = 2 * x / (double)data->screen_x - 1; + x = 0; + while (x < WINDOW_WIDTH) + { + my_mlx_pixel_put(data, x, y, 0xFFFFFF); + x++; + } + y++; + } +} + +int render_frame(t_data *data) +{ + clear_window(data); + draw_floor(data); + for(int x = 0; x < WINDOW_WIDTH; x++) + { + double cameraX = 2 * x / (double)WINDOW_WIDTH - 1; double rayDirX = data->dir_x + data->plane_x * cameraX; double rayDirY = data->dir_y + data->plane_y * cameraX; @@ -215,24 +238,48 @@ int render_frame(t_data *data) else perpWallDist = (mapY - data->pos_y + (1 - stepY) / 2) / rayDirY; - int lineHeight = (int)(data->screen_y / perpWallDist); - int drawStart = -lineHeight / 2 + data->screen_y / 2; + int lineHeight = (int)(WINDOW_HEIGHT / perpWallDist); + int drawStart = -lineHeight / 2 + WINDOW_HEIGHT / 2; if(drawStart < 0) drawStart = 0; - int drawEnd = lineHeight / 2 + data->screen_y / 2; - if(drawEnd >= data->screen_y) drawEnd = data->screen_y - 1; + int drawEnd = lineHeight / 2 + WINDOW_HEIGHT / 2; + if(drawEnd >= WINDOW_HEIGHT) drawEnd = WINDOW_HEIGHT - 1; - int color; - if (side == 0 && stepX > 0) - color = 0x00FF0000; - else if (side == 0 && stepX < 0) - color = 0x0000FF00; - else if (side == 1 && stepY > 0) - color = 0x000000FF; + // Get correct wall texture based on direction + t_texture *wall_tex; + if (side == 0) + { + if (stepX > 0) + wall_tex = &data->wall_so; + else + wall_tex = &data->wall_no; + } else - color = 0x00FFFF00; + { + if (stepY > 0) + wall_tex = &data->wall_ea; + else + wall_tex = &data->wall_we; + } + + // Wall texture calculations + double wallX; + if (side == 0) wallX = data->pos_y + perpWallDist * rayDirY; + else wallX = data->pos_x + perpWallDist * rayDirX; + wallX -= floor(wallX); + + int texX = (int)(wallX * (double)wall_tex->width); + + double step = 1.0 * wall_tex->height / lineHeight; + double texPos = (drawStart - WINDOW_HEIGHT / 2 + lineHeight / 2) * step; for(int y = drawStart; y < drawEnd; y++) - my_mlx_pixel_put(data, x, y, color); + { + int texY = (int)texPos & (wall_tex->height - 1); + texPos += step; + + char *tex_pixel = wall_tex->addr + (texY * wall_tex->line_length + texX * (wall_tex->bits_per_pixel / 8)); + my_mlx_pixel_put(data, x, y, *(unsigned int*)tex_pixel); + } } mlx_put_image_to_window(data->mlx, data->win, data->img, 0, 0); return (0); @@ -241,13 +288,45 @@ int render_frame(t_data *data) int main(void) { t_data data; + int width, height; data.mlx = mlx_init(); - mlx_get_screen_size(data.mlx, &data.screen_x, &data.screen_y); - data.win = mlx_new_window(data.mlx, data.screen_x, data.screen_y, "Raycaster"); - data.img = mlx_new_image(data.mlx, data.screen_x, data.screen_y); + data.win = mlx_new_window(data.mlx, WINDOW_WIDTH, WINDOW_HEIGHT, "Raycaster"); + data.img = mlx_new_image(data.mlx, WINDOW_WIDTH, WINDOW_HEIGHT); data.addr = mlx_get_data_addr(data.img, &data.bits_per_pixel, &data.line_length, &data.endian); + // Load wall textures + data.wall_no.img = mlx_xpm_file_to_image(data.mlx, "./textures/b.xpm", &width, &height); + data.wall_no.addr = mlx_get_data_addr(data.wall_no.img, &data.wall_no.bits_per_pixel, + &data.wall_no.line_length, &data.wall_no.endian); + data.wall_no.width = width; + data.wall_no.height = height; + + data.wall_so.img = mlx_xpm_file_to_image(data.mlx, "./textures/cobblestone_32.xpm", &width, &height); + data.wall_so.addr = mlx_get_data_addr(data.wall_so.img, &data.wall_so.bits_per_pixel, + &data.wall_so.line_length, &data.wall_so.endian); + data.wall_so.width = width; + data.wall_so.height = height; + + data.wall_we.img = mlx_xpm_file_to_image(data.mlx, "./textures/sandy_32.xpm", &width, &height); + data.wall_we.addr = mlx_get_data_addr(data.wall_we.img, &data.wall_we.bits_per_pixel, + &data.wall_we.line_length, &data.wall_we.endian); + data.wall_we.width = width; + data.wall_we.height = height; + + data.wall_ea.img = mlx_xpm_file_to_image(data.mlx, "./textures/wasteland_32.xpm", &width, &height); + data.wall_ea.addr = mlx_get_data_addr(data.wall_ea.img, &data.wall_ea.bits_per_pixel, + &data.wall_ea.line_length, &data.wall_ea.endian); + data.wall_ea.width = width; + data.wall_ea.height = height; + + // Load floor texture + data.floor.img = mlx_xpm_file_to_image(data.mlx, "./textures/b.xpm", &width, &height); + data.floor.addr = mlx_get_data_addr(data.floor.img, &data.floor.bits_per_pixel, + &data.floor.line_length, &data.floor.endian); + data.floor.width = width; + data.floor.height = height; + data.pos_x = 22; data.pos_y = 12; data.dir_x = -1; diff --git a/test/textures/cobblestone_32.xpm b/test/textures/cobblestone_32.xpm new file mode 100644 index 0000000..5d7ac8c --- /dev/null +++ b/test/textures/cobblestone_32.xpm @@ -0,0 +1,154 @@ +/* XPM */ +static char *_cb59dce4f574e3bd6a1e2f025c0312agi1mGDihwOOx8j7A[] = { +/* columns rows colors chars-per-pixel */ +"32 32 116 2 ", +" c #100F10", +". c #161515", +"X c #191717", +"o c #191718", +"O c #1E1C1C", +"+ c #211E1E", +"@ c #252222", +"# c #292626", +"$ c #2D2B2B", +"% c #322E2E", +"& c #3A2F2E", +"* c #36302F", +"= c #3C312E", +"- c #342F30", +"; c #353131", +": c #3A3434", +"> c #3D3836", +", c #3C3738", +"< c #3E3A3A", +"1 c #43332F", +"2 c #433534", +"3 c #4C3633", +"4 c #433A36", +"5 c #4C3937", +"6 c #433C3B", +"7 c #4B3D3B", +"8 c #503835", +"9 c #523D3C", +"0 c #46413E", +"q c #4B433D", +"w c #524433", +"e c #55443B", +"r c #453F41", +"t c #563D40", +"y c #474141", +"u c #4B4442", +"i c #4E4845", +"p c #4F4949", +"a c #544442", +"s c #584644", +"d c #534A42", +"f c #5A4A46", +"g c #554D4B", +"h c #5C4D4C", +"j c #545146", +"k c #56514C", +"l c #5B524D", +"z c #5D5552", +"x c #5F5A53", +"c c #614D46", +"v c #61534D", +"b c #625D4C", +"n c #625553", +"m c #635A53", +"M c #655B59", +"N c #695D5A", +"B c #636052", +"V c #696354", +"C c #6E6852", +"Z c #66615A", +"A c #6B625D", +"S c #6D695B", +"D c #70675F", +"F c #736A5D", +"G c #6C6360", +"H c #6B6463", +"J c #6F6563", +"K c #6D6865", +"L c #706763", +"P c #726766", +"I c #716A62", +"U c #726A63", +"Y c #756D63", +"T c #746A64", +"R c #786B66", +"E c #786D66", +"W c #716A68", +"Q c #746B69", +"! c #776E6C", +"~ c #7B6F69", +"^ c #796E6A", +"/ c #786E6C", +"( c #767161", +") c #7B7366", +"_ c #7C7367", +"` c #7E7A66", +"' c #767069", +"] c #79706B", +"[ c #7C716B", +"{ c #7F7868", +"} c #7F796C", +"| c #7E7572", +" . c #807D6D", +".. c #807776", +"X. c #837B70", +"o. c #847972", +"O. c #857C72", +"+. c #847B79", +"@. c #8A7F78", +"#. c #868172", +"$. c #898171", +"%. c #8C8673", +"&. c #8A8174", +"*. c #8D8870", +"=. c #8D867B", +"-. c #928B7C", +";. c #938C7D", +":. c #968F7F", +">. c #96907B", +",. c #98907F", +"<. c #8D8681", +"1. c #938C80", +"2. c #948C88", +"3. c #979081", +"4. c #999087", +"5. c #A29C81", +/* pixels */ +"V : H + Z m % - $ $ ' ! # -.$ k g x $ $ 2 &.$ % % 2 >.g ; z $ A ", +"&.d % $ 1 F 5.@ X.1 f [ % % % : z Y % ; O.L ] # @ N a T ; % , :.", +"A ; $ 6 = C $ , % , ; a $ I %.% 7 % o + 1 Z = 1 O % $ < @ & v L ", +"O ; T # 3 X @ 2 l z % % % g p % $ % A l $ ; : M t % = f G % # # ", +"e ; ; 6 > k $ & $ % @ % % : 4 % 0 % > T 4 $ % a % @ % $ 9 N $ -.", +"J % / z ~ 3.k , , f Z k e 3 # % O.d % % % } 6 : ; I | l $ , $ l ", +"N 8 2 2 3 O.m 6 , % E % = % 5 L E S % % 7 N J k = > u [ & D $ R ", +"= % + # ; % 2 % $ 7 l $ % : % : > $ $ $ , 2 q 4 % % % , , 4 % * ", +"$ h Z A $ % % 7 % : : $ A z q ; ; : ] I % ; $ ; D N 0 $ | Z z p ", +"M l g X.< 7 7 W u < % ; n { m , > > i > ; j % m q d g O 7 g g $ ", +"6 , n @ $ z : 2 % m .d % 9 % , l > ; ; m M @ : % , x @ $ % $ ; ", +"L 4 $ ; I <.u ; # A P A $ % # x 0 , % # z X.x < $ m P 9 = _ < g ", +"A 7 , + @.M & 9 % ; $ : % > % ; # ; % : n N n ; k % $ % G H % u ", +"$ % O.; $ $ . ` l % # $ # $ =.I 7 <.2.A ; % $ $ 6 x : , V Y > 6 ", +"2 ] [ s $ 9 @ E { m A O ] f A ; l s +.@ F I $ | / O.% % 2 0 $ : ", +"% % f a % $ ; A E = % # 3 i > $ $ , ..+ O g ; ~ N $ : : % $ 4 k ", +"$.j , < & #.% 6 : $ ;.a % 2 % g *.; g ; c v , $ : 6 T ~ % u ; ( ", +"g Z # : O.L ] # 6 N a T # % , D p d % % = F ` ; Z = f [ , % $ u ", +"v % @ # 1 Z = 1 $ % $ ; 6 % v l A @ @ ; & j $ ; # $ ; a . I S : ", +"# $ g l $ $ , M t % = f G , ; $ ; # z , 2 6 # 7 L ~ ; 7 % u 6 ; ", +") % 0 z e , # a % ; % # 9 N $ -.n , < 6 > k $ & $ % $ # % < 4 $ ", +": : ; $ % } b d , I | l $ $ # l W % / z ~ 3.S ; * f #.S e 3 ; * ", +"0 6 % p s N J k = > J [ & D @ R N 8 3 9 3 O.m ; # % E % 2 % 9 A ", +"v $ $ $ , : 4 : % * ; % 6 4 % % % % O < % % 2 % % > D @ ; q % z ", +"# 2 ] z % , % # l N 0 # | +.4.p % q O.A $ r # a ; w = , A g m o ", +"( i 0 c 7 j % ] l 6 , % 2 G N % > J A o.# 7 a W Q A + n k [ % ", +"k M 9 @ S M # 2 $ 6 ] , # % % % % % n # # Q * 2 % d .d < 9 % ; ", +"u u # $ Z 1.Z % % m P 9 = _ @ A x % $ ; I <.L $ $ g P ~ % % y [ ", +"p $ % : u g a $ D % $ % G H % A y : ; % @.M 2 9 $ % # 3 @ f ; $ ", +"7 K z y % # ; % 6 ] 7 , V ,.d 6 % % O.% $ ; % B ; % y ; ; $ =.I ", +"J 7 g < u I $ M x O.% # 7 Z ; 1 9 ] [ s $ 2 # 6 { i q O ] f A , ", +"u ; .., ; A u ~ N $ ; $ + $ 1 l % % f a , % # A z % % $ 3 n 9 % " +}; diff --git a/test/textures/sandy_32.xpm b/test/textures/sandy_32.xpm new file mode 100644 index 0000000..ca42b14 --- /dev/null +++ b/test/textures/sandy_32.xpm @@ -0,0 +1,45 @@ +/* XPM */ +static char *b2ffa1f3349541dfd85c9d78164cd8f5fwrUjFoX83Qd2gcH[] = { +/* columns rows colors chars-per-pixel */ +"32 32 7 1", +" c #747474", +". c gray50", +"X c gray56", +"o c #9D9D9D", +"O c gray64", +"+ c gray66", +"@ c gray69", +/* pixels */ +". .. . XX .XXX. ...XX. .XXXX.", +" @@@+@++++OOO+++OOOooOO++++++++X", +" +OOOO+OOO+++OO+@@+@@+ooOooO+OO.", +" +++O+++OOO+OO++O+OO+++OooO+OO+ ", +" +OOooooOOOOOoooooOOOOO++++++OOX", +".@+OOooOooO++OoOOOO+O+++OO+++++X", +"XOOO++OOO++++++@@@@@+++OO+OooOOX", +".+@@@@@@++@@+OO++@@+++@@@++OO++X", +"XOOO+@@OooOO++OO++@@@@@++@@OOO+ ", +"XO+++++OOO++OO+++@@++@@@++OO+++.", +".@@@@+OO++++++OO++OOOO+OooOooO@ ", +" +@@+++++++OOOO++OOooOoooOOOOOO ", +" OO+O+@@@@@+O+@@@@@OOOOO+++++++.", +"XOOOOOOO@@+OOO+@+OOOooO+++@@@OO ", +"XOOOoooooOooO++OOO+OO++OOOOO+++ ", +"X++OOoOoOOOOOOOO++++OOOOO++++++.", +"X+OO+++OO+OO+@@@@@@@+O++OO+OOOO.", +"X@@@@@++@@@+++@@@++OOOO+++++OO+.", +".++@@++OO+O+@@++@@++O+@@@++@@++X", +" +@@@@+++++OO+@@++++OOO++@@@OOOX", +" oO+++++OOOoooOoOO+OO+++OO+OOoOX", +".+++OOO++O++OooOO+++++@@@@@@+++X", +".++OO+++++@@@@@+@@++++++@@+OO+@X", +"X++++++++@@@@+++++OO+OOOO+++OOOX", +"X+OO+OOO++@+++OOooO+++OooooOooO.", +".++OooO+@@@@+++OO+++OO+OoOOOOooX", +".@@@@O+OOO++OO++OOO@@+++OO++O@@X", +" @@+++OOO+++++OOOO+++OOOO++OOO+.", +" +O+OO++@@@@@OOO++OO++++@@@@@@@ ", +".OooO+OO+@@+++OOO+++++++++@+@@@ ", +".++OOO+++O+OOooO+@@@@@+O+OOOOO+.", +" .XXXX. .XXXXXX. X.. . .X..." +}; diff --git a/test/textures/wasteland_32.xpm b/test/textures/wasteland_32.xpm new file mode 100644 index 0000000..2c8122d --- /dev/null +++ b/test/textures/wasteland_32.xpm @@ -0,0 +1,45 @@ +/* XPM */ +static char *f4be72bda4ec41cce3e231f3563262e6RzcICVlC9CbSzsPX[] = { +/* columns rows colors chars-per-pixel */ +"32 32 7 1 ", +" c #5A595A", +". c gray39", +"X c #6A6D6A", +"o c #787678", +"O c gray50", +"+ c #8B898B", +"@ c #9C999C", +/* pixels */ +"++@@@@@@@@@@@@@@@@@@@@@@@@@@+++ ", +"+oO+++++++++++++++OO++++OO+OOO+ ", +"+O++OO++O++O+++OOOO++OO++OooOo+ ", +"@OOOO+O+++OooO++OO++O+OOOOOooOO ", +"@O+ooO++OOoO++OOOOOOOOOo+OOOOOO ", +"@++OooO++OO++OOOOO+OoO++OOOOOOO ", +"@O+++OoOO+ooOOO+OOooO++OooOooOo ", +"@OoOOOOOOOOOoOOO++OO+OOOOoooOoo ", +"@OOoOoOOOoOOOOOOOOOOOOOOoOOOOOO ", +"@OoooOOooO++OO+OoO+oooOooOO+OOO ", +"@OoXooooOOO+++OOOoooOOoooooO++O ", +"+ooXOoOoOOOoOOOOOOOO++OOXooOOoO ", +"+oXXoOXooooOooooooO+oOXXoooooOO ", +"OoXXXXOOooooooooOoooOOOXXXOOooo ", +"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX.", +".. . ... .............", +"@@@@@@@@@@@@@++ +++@@@@@@@@@@@@@", +"ooOoOO+++++OOOO +OO+O+++O+++OOOO", +"OooOO++O+O++OOO @OOO+++OOOOOOOOO", +"O+O++O++OOOO+OO @OOOOOOO+OOoOO++", +"+OOOOOOOOOOOOOo @oOOO+++OOOOooO+", +"OOOO+OOOO+OOoOo @OoO+ooOoOOOOooO", +"O+OOO+O++OoOooX @oO++OooOOOO+OOO", +"OO+++++OooOoOXX @oOO++OOOoOo++OO", +"OOOO+OO+Oo+OoXX @oOOOOO++ooOOOOO", +"++OOOOOooOooXoX +ooOoO+OO++O+OOO", +"+OooOoOoO++oOoo +oooOOOoOO++OO++", +"OOOooOoOoOXOOoo +OOoOooOoOOOO+OO", +"OoXXoXooXXOOOoo +OooooooOOoOOOoo", +"oooXXooooXXXooo OoOOOoooooOOOOOo", +"XXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX", +"............ .............." +};