diff --git a/assets/ceiling64x64.png b/assets/ceiling64x64.png new file mode 100644 index 0000000..f7b30eb Binary files /dev/null and b/assets/ceiling64x64.png differ diff --git a/assets/floor.png b/assets/floor.png new file mode 100644 index 0000000..0684953 Binary files /dev/null and b/assets/floor.png differ diff --git a/inc/cub3d.h b/inc/cub3d.h index e5edc8c..bad1506 100644 --- a/inc/cub3d.h +++ b/inc/cub3d.h @@ -6,7 +6,7 @@ /* By: qmennen +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2025/04/15 12:22:29 by qmennen #+# #+# */ -/* Updated: 2025/05/06 15:56:57 by qmennen ### ########.fr */ +/* Updated: 2025/05/06 18:54:42 by qmennen ### ########.fr */ /* */ /* ************************************************************************** */ @@ -16,8 +16,8 @@ # define FAILURE 0 # define SUCCESS 1 -# define WIDTH 1920 -# define HEIGHT 1080 +# define WIDTH 1280 +# define HEIGHT 720 # define TITLE "Cub3D" # define RESET "\033[0m" diff --git a/inc/types.h b/inc/types.h index cfa3129..bfa79cb 100644 --- a/inc/types.h +++ b/inc/types.h @@ -6,7 +6,7 @@ /* By: qmennen +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2025/04/15 15:52:44 by qmennen #+# #+# */ -/* Updated: 2025/05/06 18:04:13 by qmennen ### ########.fr */ +/* Updated: 2025/05/06 18:36:47 by qmennen ### ########.fr */ /* */ /* ************************************************************************** */ @@ -60,6 +60,8 @@ typedef struct s_map char *SO_texture; char *WE_texture; char *EA_texture; + mlx_texture_t *texture_floor; + mlx_texture_t *texture_ceiling; mlx_texture_t *textures[4]; unsigned int floor_color; unsigned int ceiling_color; diff --git a/src/game.c b/src/game.c index 41d0001..f668fbf 100644 --- a/src/game.c +++ b/src/game.c @@ -6,7 +6,7 @@ /* By: qmennen +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2025/04/15 15:46:08 by qmennen #+# #+# */ -/* Updated: 2025/05/06 15:20:18 by qmennen ### ########.fr */ +/* Updated: 2025/05/06 18:56:57 by qmennen ### ########.fr */ /* */ /* ************************************************************************** */ diff --git a/src/render/DDAscratch.c b/src/render/DDAscratch.c index 0a9709d..a8afa22 100644 --- a/src/render/DDAscratch.c +++ b/src/render/DDAscratch.c @@ -6,7 +6,7 @@ /* By: qmennen +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2025/05/02 11:58:09 by whaffman #+# #+# */ -/* Updated: 2025/05/06 18:17:55 by qmennen ### ########.fr */ +/* Updated: 2025/05/06 19:01:32 by qmennen ### ########.fr */ /* */ /* ************************************************************************** */ @@ -130,26 +130,11 @@ t_render cast_ray(t_game *game, int x) return (render); } -unsigned int get_color(t_render render) -{ - double dist; - const unsigned int color[4] = { - 0x488B49, - 0x4AAD52, - 0x6EB257, - 0xC5E063}; - - dist = (render.perp_dist == 0) * 1e30 + (render.perp_dist > 1) * render.perp_dist + (render.perp_dist <= 1) * 1; - return (color[render.side] << 8 | (int)(1.0 / dist * 255)); -} - unsigned int get_texture_color(mlx_texture_t *texture, t_render render, int tex_x, int tex_y) { int index; double dist; - if (render.side == SIDE_NORTH || render.side == SIDE_EAST) - tex_x = texture->width - tex_x - 1; index = (tex_x + tex_y * texture->height) * texture->bytes_per_pixel; dist = (render.perp_dist == 0) * 1e30 + (render.perp_dist > 1) * render.perp_dist + (render.perp_dist <= 1) * 1; return texture->pixels[index] << 24 | texture->pixels[index + 1] << 16 | texture->pixels[index + 2] << 8 | (int)(1.0 / dist * 255); @@ -166,7 +151,6 @@ void draw_line(t_game *game, t_render render, int x) int tex_x; int tex_y; - y = 0; lineHeight = (int)(game->screen->height / render.perp_dist); drawStart = -lineHeight / 2 + game->screen->height / 2; texDrawStart = drawStart; @@ -176,18 +160,13 @@ void draw_line(t_game *game, t_render render, int x) if (drawEnd >= game->screen->height) drawEnd = game->screen->height - 1; tex_x = (int)(render.wall_x * (double)game->map->textures[render.side]->width); - while (y < game->screen->height) + if (render.side == SIDE_NORTH || render.side == SIDE_EAST) + tex_x = game->map->textures[render.side]->width - tex_x - 1; + y = drawStart; + while (y map->ceiling_color << 8 | (int)fabs(2 * y * 0xFF / (double)game->screen->height - 0xFF); - else if (y > drawEnd) - color = game->map->floor_color << 8 | (int)fabs(2 * y * 0xFF / (double)game->screen->height - 0xFF); - else - { - tex_y = (int)(((double) game->map->textures[render.side]->height / (double) lineHeight) * (y - texDrawStart)); color = get_texture_color(game->map->textures[render.side], render, tex_x, tex_y); - } if (x < 0 || x >= game->screen->width || y < 0 || y >= game->screen->height) break; mlx_put_pixel(game->screen->img, x, y, color); @@ -196,12 +175,50 @@ void draw_line(t_game *game, t_render render, int x) } } +void draw_floor(t_game *game) +{ + int y; + int x; + int color; + double row_dist; + t_vec2 floor_step; + t_vec2 floor_pos; + t_vec2_int floor_cell; + t_vec2_int tex_coords; + const t_vec2 left_ray = sub(game->player->dir, game->player->camera); + const t_vec2 right_ray = add(game->player->dir, game->player->camera); + + y = 0; + while (y < game->screen->height) + { + row_dist = 0.5 * game->screen->height / (y - game->screen->height / 2.0); + floor_step = mul(mul(sub(right_ray, left_ray), row_dist), 1.0 / game->screen->width); + floor_pos = add(game->player->pos, mul(left_ray, row_dist)); + + x = 0; + while (x < game->screen->width) + { + floor_cell = (t_vec2_int){(int)floor_pos.x, (int)floor_pos.y}; + tex_coords = (t_vec2_int){(int) (64 * (floor_pos.x - floor_cell.x)) & 63, + (int) (64 * (floor_pos.y - floor_cell.y)) & 63}; + floor_pos = add(floor_pos, floor_step); + color = get_texture_color(game->map->texture_floor, (t_render){row_dist, 0, 0}, tex_coords.x, tex_coords.y); + mlx_put_pixel(game->screen->img, x, y, color); + color = get_texture_color(game->map->texture_ceiling, (t_render){row_dist, 0, 0}, tex_coords.x, tex_coords.y); + mlx_put_pixel(game->screen->img, x, game->screen->height - y - 1, color); + x++; + } + y++; + } +} + void cast_rays(t_game *game) { - int x; - t_render render; + int x; + t_render render; x = 0; + draw_floor(game); while (x < game->screen->width) { render = cast_ray(game, x); @@ -209,3 +226,4 @@ void cast_rays(t_game *game) x++; } } + diff --git a/src/render/render.c b/src/render/render.c index 02218d8..8e63331 100644 --- a/src/render/render.c +++ b/src/render/render.c @@ -1,12 +1,12 @@ /* ************************************************************************** */ /* */ -/* :::::::: */ -/* render.c :+: :+: */ -/* +:+ */ -/* By: whaffman +#+ */ -/* +#+ */ -/* Created: 2025/04/15 16:28:10 by qmennen #+# #+# */ -/* Updated: 2025/05/04 16:54:33 by whaffman ######## odam.nl */ +/* ::: :::::::: */ +/* render.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: qmennen +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2025/04/15 16:28:10 by qmennen #+# #+# */ +/* Updated: 2025/05/06 19:02:53 by qmennen ### ########.fr */ /* */ /* ************************************************************************** */ diff --git a/src/texture/texutre_load.c b/src/texture/texutre_load.c index 2f8dadd..d2685da 100644 --- a/src/texture/texutre_load.c +++ b/src/texture/texutre_load.c @@ -6,7 +6,7 @@ /* By: qmennen +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2025/05/06 15:45:58 by qmennen #+# #+# */ -/* Updated: 2025/05/06 15:55:30 by qmennen ### ########.fr */ +/* Updated: 2025/05/06 19:01:15 by qmennen ### ########.fr */ /* */ /* ************************************************************************** */ @@ -23,6 +23,16 @@ void texture_delete(t_game *game) mlx_delete_texture(game->map->textures[i]); i++; } + if (game->map->texture_floor) + { + mlx_delete_texture(game->map->texture_floor); + game->map->texture_floor = NULL; + } + if (game->map->texture_ceiling) + { + mlx_delete_texture(game->map->texture_ceiling); + game->map->texture_ceiling = NULL; + } } int texture_load(t_game *game) @@ -31,6 +41,8 @@ int texture_load(t_game *game) game->map->textures[SIDE_EAST] = mlx_load_png(game->map->EA_texture); game->map->textures[SIDE_SOUTH] = mlx_load_png(game->map->SO_texture); game->map->textures[SIDE_WEST] = mlx_load_png(game->map->WE_texture); + game->map->texture_floor = mlx_load_png("./assets/floor.png"); + game->map->texture_ceiling = mlx_load_png("./assets/ceiling64x64.png"); if (!game->map->textures[SIDE_NORTH] || !game->map->textures[SIDE_EAST] || !game->map->textures[SIDE_SOUTH] || !game->map->textures[SIDE_WEST]) { diff --git a/test.cub b/test.cub index e0de358..24144fb 100644 --- a/test.cub +++ b/test.cub @@ -1,11 +1,11 @@ -NO ./assets/bricksx64_north.png +NO ./assets/bricks_cyan_x64.png -WE ./assets/bricksx64_west.png +WE ./assets/bricks_green_x64.png -SO ./assets/bricksx64_south.png -EA ./assets/bricksx64_east.png +SO ./assets/bricks_orange_x64.png +EA ./assets/bricksx64.png F 90,30,30