feat: testing how to play with textures

This commit is contained in:
Raphael 2024-12-09 14:33:53 +01:00
parent badd6534f4
commit e581c72b02
14 changed files with 598 additions and 313 deletions

View file

@ -6,7 +6,7 @@
/* By: rparodi <rparodi@student.42.fr> +#+ +:+ +#+ */ /* By: rparodi <rparodi@student.42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */ /* +#+#+#+#+#+ +#+ */
/* Created: 2024/10/30 16:30:26 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 <stdbool.h> # include <stdbool.h>
// utils // utils
void draw_floor(t_info *data);
void dump_info(t_info *info); void dump_info(t_info *info);
int render_frame(t_info *data); int render_frame(t_info *data);
void my_mlx_pixel_put(t_info *data, int x, int y, int color); void my_mlx_pixel_put(t_info *data, int x, int y, int color);

View file

@ -6,7 +6,7 @@
/* By: rparodi <rparodi@student.42.fr> +#+ +:+ +#+ */ /* By: rparodi <rparodi@student.42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */ /* +#+#+#+#+#+ +#+ */
/* Created: 2024/11/11 19:53:42 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 "cub3d_struct.h"
#include "mlx_functions.h" #include "mlx_functions.h"
#include "mlx_structs.h" #include "mlx_structs.h"
#include "ft_string.h"
#include "ft_math.h" #include "ft_math.h"
#include <stdlib.h> #include <stdlib.h>

View file

@ -6,7 +6,7 @@
/* By: rparodi <rparodi@student.42.fr> +#+ +:+ +#+ */ /* By: rparodi <rparodi@student.42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */ /* +#+#+#+#+#+ +#+ */
/* Created: 2024/11/20 12:25:45 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; size_t i;
i = 0; 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[1] = mlx_load_image(info, "../textures/b.xpm");
info->map.texture[2] = mlx_load_image(info, "../textures/sandy_32.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"); info->map.texture[3] = mlx_load_image(info, "../textures/cobblestone_32.xpm");

View file

@ -6,7 +6,7 @@
/* By: bgoulard <bgoulard@student.42.fr> +#+ +:+ +#+ */ /* By: bgoulard <bgoulard@student.42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */ /* +#+#+#+#+#+ +#+ */
/* Created: 2024/11/12 06:02:54 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); 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) int render_frame(t_info *data)
{ {
double camera_x; double camera_x;

View file

@ -6,7 +6,7 @@
/* By: rparodi <rparodi@student.42.fr> +#+ +:+ +#+ */ /* By: rparodi <rparodi@student.42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */ /* +#+#+#+#+#+ +#+ */
/* Created: 2024/12/01 18:55:11 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 <math.h> #include <math.h>
#include <unistd.h> #include <unistd.h>
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) void set_step(t_ipoint *step, t_dpoint raydir)
{ {
if (raydir.x < 0) if (raydir.x < 0)

View file

@ -6,7 +6,7 @@
# By: rparodi <rparodi@student.42.fr> +#+ +:+ +#+ # # By: rparodi <rparodi@student.42.fr> +#+ +:+ +#+ #
# +#+#+#+#+#+ +#+ # # +#+#+#+#+#+ +#+ #
# Created: 2023/11/12 11:05:05 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 # CFLAGS += -fsanitize=thread
# INCLUDES += -I /opt/X11/include # INCLUDES += -I /opt/X11/include
INCLUDES = -I /usr/include -I ../includes -I ../includes/include -I ../minilibx-linux INCLUDES = -I /usr/include -I ./includes -I ./includes/include -I ./minilibx-linux
INCLUDES += -I ../
# Paths # Paths
MLX_DIR = ../minilibx-linux MLX_DIR = ./minilibx-linux
# Library flags # Library flags
LDFLAGS = -L../build -lmlx -lm -lft LDFLAGS = -L./build -lmlx -lm
# MiniLibX flags for macOS with XQuartz # MiniLibX flags for macOS with XQuartz
MLXFLAGS = -L$(MLX_DIR) -lX11 -lXext MLXFLAGS = -L$(MLX_DIR) -lX11 -lXext
@ -83,13 +82,9 @@ fclean: clean
# Restart (make re) # Restart (make re)
re: header fclean all re: header fclean all
# Compile external libraries
#
build/libmlx.a:
# @make --no-print-directory -C $(MLX_DIR)
# Dependences for all # Dependences for all
$(NAME): $(OBJ) build/libmlx.a $(NAME): $(OBJ)
@mkdir -p $(OBJDIRNAME) @mkdir -p $(OBJDIRNAME)
@printf '$(GREY) Creating $(END)$(GREEN)$(OBJDIRNAME)$(END)\n' @printf '$(GREY) Creating $(END)$(GREEN)$(OBJDIRNAME)$(END)\n'
@$(CC) $(CFLAGS) $(OBJ) $(LDFLAGS) -o $(NAME) @$(CC) $(CFLAGS) $(OBJ) $(LDFLAGS) -o $(NAME)

View file

@ -1 +0,0 @@
INC=/usr/X11/include

View file

@ -18,7 +18,7 @@
in { in {
devShell = pkgs.mkShell { devShell = pkgs.mkShell {
packages = [ packages = [
pkgs.xorg.libX11 pkgs.xorg.libX11
pkgs.xorg.libXext pkgs.xorg.libXext
pkgs.clang pkgs.clang
pkgs.clang-tools pkgs.clang-tools

View file

@ -6,258 +6,235 @@
/* By: rparodi <rparodi@student.42.fr> +#+ +:+ +#+ */ /* By: rparodi <rparodi@student.42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */ /* +#+#+#+#+#+ +#+ */
/* Created: 2024/11/27 12:09:00 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 "test.h"
#include "ft_math.h"
#include "minilibx-linux/mlx.h"
#include <math.h>
#include <X11/X.h>
#include "./test.h" 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}, \
const int g_worldMap[MAP_WIDTH][MAP_HEIGHT] = { \ {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}, \ {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, 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,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,1,1,1,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,0,0,0,0,0,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,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, 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, 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,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, 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, 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} \
{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) 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 = data->addr + (y * data->line_length + x * (data->bits_per_pixel / 8));
dst = (uint *)(data->addr + (y * data->line_length + x)); *(unsigned int *)dst = color;
*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);
} }
void move_straight(t_data *data) void move_straight(t_data *data)
{ {
if (!g_worldMap[\ if (!worldMap[\
(int)(data->pos.x + data->dir.x * MOVE_SPEED)][(int)data->pos.y]) (int)(data->pos_x + data->dir_x * MOVE_SPEED)][(int)data->pos_y])
data->pos.x += data->dir.x * MOVE_SPEED; data->pos_x += data->dir_x * MOVE_SPEED;
if (!g_worldMap[\ if (!worldMap[\
(int)data->pos.x][(int)(data->pos.y + data->dir.y * MOVE_SPEED)]) (int)data->pos_x][(int)(data->pos_y + data->dir_y * MOVE_SPEED)])
data->pos.y += data->dir.y * MOVE_SPEED; data->pos_y += data->dir_y * MOVE_SPEED;
} }
void move_backward(t_data *data) void move_backward(t_data *data)
{ {
if (!g_worldMap[\ if (!worldMap[\
(int)(data->pos.x - data->dir.x * MOVE_SPEED)][(int)data->pos.y]) (int)(data->pos_x - data->dir_x * MOVE_SPEED)][(int)data->pos_y])
data->pos.x -= data->dir.x * MOVE_SPEED; data->pos_x -= data->dir_x * MOVE_SPEED;
if (!g_worldMap[\ if (!worldMap[\
(int)data->pos.x][(int)(data->pos.y - data->dir.y * MOVE_SPEED)]) (int)data->pos_x][(int)(data->pos_y - data->dir_y * MOVE_SPEED)])
data->pos.y -= data->dir.y * MOVE_SPEED; data->pos_y -= data->dir_y * MOVE_SPEED;
} }
void move_left(t_data *data) void move_left(t_data *data)
{ {
double pdir_x; double perp_dir_x;
double pdir_y; double perp_dir_y;
pdir_x = -data->dir.y; perp_dir_x = -data->dir_y;
pdir_y = data->dir.x; perp_dir_y = data->dir_x;
if (!g_worldMap[(int)(data->pos.x + pdir_x * MOVE_SPEED)][(int)data->pos.y]) if (!worldMap[\
data->pos.x -= pdir_x * MOVE_SPEED; (int)(data->pos_x + perp_dir_x * MOVE_SPEED)][(int)data->pos_y])
if (!g_worldMap[(int)data->pos.x][(int)(data->pos.y - pdir_y * MOVE_SPEED)]) data->pos_x -= perp_dir_x * MOVE_SPEED;
data->pos.y -= pdir_y * 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) void move_right(t_data *data)
{ {
double pdir_x; double perp_dir_x;
double pdir_y; double perp_dir_y;
pdir_x = -data->dir.y; perp_dir_x = -data->dir_y;
pdir_y = data->dir.x; perp_dir_y = data->dir_x;
if (!g_worldMap[(int)(data->pos.x - pdir_x * MOVE_SPEED)][(int)data->pos.y]) if (!worldMap[\
data->pos.x += pdir_x * MOVE_SPEED; (int)(data->pos_x - perp_dir_x * MOVE_SPEED)][(int)data->pos_y])
if (!g_worldMap[(int)data->pos.x][(int)(data->pos.y + pdir_y * MOVE_SPEED)]) data->pos_x += perp_dir_x * MOVE_SPEED;
data->pos.y += pdir_y * 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) void look_left(t_data *data)
{ {
rotate_plane(&data->dir, ROT_SPEED); double old_dir_x;
rotate_plane(&data->plane, ROT_SPEED); 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) void look_right(t_data *data)
{ {
rotate_plane(&data->dir, -ROT_SPEED); double old_dir_x;
rotate_plane(&data->plane, -ROT_SPEED); 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) int key_hook(int keycode, t_data *data)
{ {
if (keycode == XK_Escape) if (keycode == 65307)
exit(0); exit(0);
if (keycode == XK_w) if (keycode == 119)
move_straight(data); move_straight(data);
if (keycode == XK_s) if (keycode == 115)
move_backward(data); move_backward(data);
if (keycode == XK_a) if (keycode == 97)
move_right(data); move_right(data);
if (keycode == XK_d) if (keycode == 100)
move_left(data); move_left(data);
if (keycode == XK_Left) if (keycode == 65361)
look_left(data); look_left(data);
if (keycode == XK_Right) if (keycode == 65363)
look_right(data); look_right(data);
return (0); 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) int render_frame(t_data *data)
{ {
double cameraX; int y;
double coef; 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++) for(int x = 0; x < WINDOW_WIDTH; x++)
{ {
cameraX = x * coef - 1; double cameraX = 2 * x / (double)WINDOW_WIDTH - 1;
column_handler((t_2ipoint){(int)data->pos.x, (int)data->pos.y}, double rayDirX = data->dir_x + data->plane_x * cameraX;
(t_2dpoint){data->dir.x + data->plane.x * cameraX, data->dir.y + data->plane.y * cameraX}, double rayDirY = data->dir_y + data->plane_y * cameraX;
data, x);
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); mlx_put_image_to_window(data->mlx, data->win, data->img, 0, 0);
return (0); return (0);
@ -272,26 +249,14 @@ int main(void)
data.img = mlx_new_image(data.mlx, WINDOW_WIDTH, WINDOW_HEIGHT); 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); data.addr = mlx_get_data_addr(data.img, &data.bits_per_pixel, &data.line_length, &data.endian);
// player position data.pos_x = 22;
// data.pos_y = 12;
// used to get player position in the map data.dir_x = -1;
data.pos.x = 22; data.dir_y = 0;
data.pos.y = 12; data.plane_x = 0;
// player look direction data.plane_y = 0.66;
//
// used to get player look direction vector mlx_hook(data.win, 2, 1L<<0, key_hook, &data);
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);
mlx_loop_hook(data.mlx, render_frame, &data); mlx_loop_hook(data.mlx, render_frame, &data);
mlx_loop(data.mlx); mlx_loop(data.mlx);
return (0); return (0);

View file

@ -6,53 +6,55 @@
/* By: rparodi <rparodi@student.42.fr> +#+ +:+ +#+ */ /* By: rparodi <rparodi@student.42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */ /* +#+#+#+#+#+ +#+ */
/* Created: 2024/11/27 12:07:20 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 #ifndef TEST_H
# define TEST_H # define TEST_H
// define keys # include "minilibx-linux/mlx.h"
# define XK_LATIN_1 # include <math.h>
# include <X11/keysym.h> # include <stdio.h>
# include <stdlib.h>
# define WINDOW_WIDTH 1920 # define WINDOW_WIDTH 1024
# define WINDOW_HEIGHT 1080 # define WINDOW_HEIGHT 768
# define MAP_WIDTH 24 # define MAP_WIDTH 24
# define MAP_HEIGHT 24 # define MAP_HEIGHT 24
# define MOVE_SPEED 0.5 # define MOVE_SPEED 0.5
# define ROT_SPEED 0.1 # define ROT_SPEED 0.5
# define FOV 70 typedef struct s_texture {
void *img;
typedef struct s_2dpoint char *addr;
{ int width;
double x; int height;
double y; int bits_per_pixel;
} t_2dpoint; int line_length;
int endian;
typedef struct s_2ipoint } t_texture;
{
int x;
int y;
} t_2ipoint;
typedef struct s_data typedef struct s_data
{ {
void *mlx; void *mlx;
void *win; void *win;
void *img; void *img;
char *addr; char *addr;
int bits_per_pixel; int bits_per_pixel;
int line_length; int line_length;
int endian; int endian;
t_2ipoint screen_size; double pos_x;
double pos_y;
t_2dpoint pos; double dir_x;
t_2ipoint pos_i; double dir_y;
t_2dpoint dir; double plane_x;
t_2dpoint plane; double plane_y;
t_texture wall_so;
t_texture wall_no;
t_texture wall_we;
t_texture wall_ea;
t_texture floor;
} t_data; } t_data;
#endif #endif

View file

@ -6,10 +6,10 @@
/* By: rparodi <rparodi@student.42.fr> +#+ +:+ +#+ */ /* By: rparodi <rparodi@student.42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */ /* +#+#+#+#+#+ +#+ */
/* Created: 2024/11/27 12:09:00 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" #include "test.h"
int worldMap[MAP_WIDTH][MAP_HEIGHT] = {\ int worldMap[MAP_WIDTH][MAP_HEIGHT] = {\
@ -146,26 +146,49 @@ int key_hook(int keycode, t_data *data)
return (0); return (0);
} }
int render_frame(t_data *data) void clear_window(t_data *data)
{ {
int y; int y;
int x; int x;
y = 0; y = 0;
while (y < data->screen_y) while (y < WINDOW_HEIGHT / 2)
{ {
x = 0; 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++; x++;
} }
y++; 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 rayDirX = data->dir_x + data->plane_x * cameraX;
double rayDirY = data->dir_y + data->plane_y * cameraX; double rayDirY = data->dir_y + data->plane_y * cameraX;
@ -215,24 +238,48 @@ int render_frame(t_data *data)
else else
perpWallDist = (mapY - data->pos_y + (1 - stepY) / 2) / rayDirY; perpWallDist = (mapY - data->pos_y + (1 - stepY) / 2) / rayDirY;
int lineHeight = (int)(data->screen_y / perpWallDist); int lineHeight = (int)(WINDOW_HEIGHT / perpWallDist);
int drawStart = -lineHeight / 2 + data->screen_y / 2; int drawStart = -lineHeight / 2 + WINDOW_HEIGHT / 2;
if(drawStart < 0) drawStart = 0; if(drawStart < 0) drawStart = 0;
int drawEnd = lineHeight / 2 + data->screen_y / 2; int drawEnd = lineHeight / 2 + WINDOW_HEIGHT / 2;
if(drawEnd >= data->screen_y) drawEnd = data->screen_y - 1; if(drawEnd >= WINDOW_HEIGHT) drawEnd = WINDOW_HEIGHT - 1;
int color; // Get correct wall texture based on direction
if (side == 0 && stepX > 0) t_texture *wall_tex;
color = 0x00FF0000; if (side == 0)
else if (side == 0 && stepX < 0) {
color = 0x0000FF00; if (stepX > 0)
else if (side == 1 && stepY > 0) wall_tex = &data->wall_so;
color = 0x000000FF; else
wall_tex = &data->wall_no;
}
else 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++) 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); mlx_put_image_to_window(data->mlx, data->win, data->img, 0, 0);
return (0); return (0);
@ -241,13 +288,45 @@ int render_frame(t_data *data)
int main(void) int main(void)
{ {
t_data data; t_data data;
int width, height;
data.mlx = mlx_init(); data.mlx = mlx_init();
mlx_get_screen_size(data.mlx, &data.screen_x, &data.screen_y); data.win = mlx_new_window(data.mlx, WINDOW_WIDTH, WINDOW_HEIGHT, "Raycaster");
data.win = mlx_new_window(data.mlx, data.screen_x, data.screen_y, "Raycaster"); data.img = mlx_new_image(data.mlx, WINDOW_WIDTH, WINDOW_HEIGHT);
data.img = mlx_new_image(data.mlx, data.screen_x, data.screen_y);
data.addr = mlx_get_data_addr(data.img, &data.bits_per_pixel, &data.line_length, &data.endian); 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_x = 22;
data.pos_y = 12; data.pos_y = 12;
data.dir_x = -1; data.dir_x = -1;

View file

@ -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 % "
};

View file

@ -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..."
};

View file

@ -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",
"............ .............."
};