floor and ceilingtexture
This commit is contained in:
parent
b0a0cfe722
commit
a54f811a93
BIN
assets/ceiling64x64.png
Normal file
BIN
assets/ceiling64x64.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 14 KiB |
BIN
assets/floor.png
Normal file
BIN
assets/floor.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 6.6 KiB |
@ -6,7 +6,7 @@
|
|||||||
/* By: qmennen <qmennen@student.codam.nl> +#+ +:+ +#+ */
|
/* By: qmennen <qmennen@student.codam.nl> +#+ +:+ +#+ */
|
||||||
/* +#+#+#+#+#+ +#+ */
|
/* +#+#+#+#+#+ +#+ */
|
||||||
/* Created: 2025/04/15 12:22:29 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 FAILURE 0
|
||||||
# define SUCCESS 1
|
# define SUCCESS 1
|
||||||
|
|
||||||
# define WIDTH 1920
|
# define WIDTH 1280
|
||||||
# define HEIGHT 1080
|
# define HEIGHT 720
|
||||||
# define TITLE "Cub3D"
|
# define TITLE "Cub3D"
|
||||||
|
|
||||||
# define RESET "\033[0m"
|
# define RESET "\033[0m"
|
||||||
|
|||||||
@ -6,7 +6,7 @@
|
|||||||
/* By: qmennen <qmennen@student.codam.nl> +#+ +:+ +#+ */
|
/* By: qmennen <qmennen@student.codam.nl> +#+ +:+ +#+ */
|
||||||
/* +#+#+#+#+#+ +#+ */
|
/* +#+#+#+#+#+ +#+ */
|
||||||
/* Created: 2025/04/15 15:52:44 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 *SO_texture;
|
||||||
char *WE_texture;
|
char *WE_texture;
|
||||||
char *EA_texture;
|
char *EA_texture;
|
||||||
|
mlx_texture_t *texture_floor;
|
||||||
|
mlx_texture_t *texture_ceiling;
|
||||||
mlx_texture_t *textures[4];
|
mlx_texture_t *textures[4];
|
||||||
unsigned int floor_color;
|
unsigned int floor_color;
|
||||||
unsigned int ceiling_color;
|
unsigned int ceiling_color;
|
||||||
|
|||||||
@ -6,7 +6,7 @@
|
|||||||
/* By: qmennen <qmennen@student.codam.nl> +#+ +:+ +#+ */
|
/* By: qmennen <qmennen@student.codam.nl> +#+ +:+ +#+ */
|
||||||
/* +#+#+#+#+#+ +#+ */
|
/* +#+#+#+#+#+ +#+ */
|
||||||
/* Created: 2025/04/15 15:46:08 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 */
|
||||||
/* */
|
/* */
|
||||||
/* ************************************************************************** */
|
/* ************************************************************************** */
|
||||||
|
|
||||||
|
|||||||
@ -6,7 +6,7 @@
|
|||||||
/* By: qmennen <qmennen@student.codam.nl> +#+ +:+ +#+ */
|
/* By: qmennen <qmennen@student.codam.nl> +#+ +:+ +#+ */
|
||||||
/* +#+#+#+#+#+ +#+ */
|
/* +#+#+#+#+#+ +#+ */
|
||||||
/* Created: 2025/05/02 11:58:09 by whaffman #+# #+# */
|
/* 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);
|
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)
|
unsigned int get_texture_color(mlx_texture_t *texture, t_render render, int tex_x, int tex_y)
|
||||||
{
|
{
|
||||||
int index;
|
int index;
|
||||||
double dist;
|
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;
|
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;
|
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);
|
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_x;
|
||||||
int tex_y;
|
int tex_y;
|
||||||
|
|
||||||
y = 0;
|
|
||||||
lineHeight = (int)(game->screen->height / render.perp_dist);
|
lineHeight = (int)(game->screen->height / render.perp_dist);
|
||||||
drawStart = -lineHeight / 2 + game->screen->height / 2;
|
drawStart = -lineHeight / 2 + game->screen->height / 2;
|
||||||
texDrawStart = drawStart;
|
texDrawStart = drawStart;
|
||||||
@ -176,18 +160,13 @@ void draw_line(t_game *game, t_render render, int x)
|
|||||||
if (drawEnd >= game->screen->height)
|
if (drawEnd >= game->screen->height)
|
||||||
drawEnd = game->screen->height - 1;
|
drawEnd = game->screen->height - 1;
|
||||||
tex_x = (int)(render.wall_x * (double)game->map->textures[render.side]->width);
|
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 <drawEnd)
|
||||||
{
|
{
|
||||||
if (y < drawStart)
|
|
||||||
color = game->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));
|
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);
|
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)
|
if (x < 0 || x >= game->screen->width || y < 0 || y >= game->screen->height)
|
||||||
break;
|
break;
|
||||||
mlx_put_pixel(game->screen->img, x, y, color);
|
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)
|
void cast_rays(t_game *game)
|
||||||
{
|
{
|
||||||
int x;
|
int x;
|
||||||
t_render render;
|
t_render render;
|
||||||
|
|
||||||
x = 0;
|
x = 0;
|
||||||
|
draw_floor(game);
|
||||||
while (x < game->screen->width)
|
while (x < game->screen->width)
|
||||||
{
|
{
|
||||||
render = cast_ray(game, x);
|
render = cast_ray(game, x);
|
||||||
@ -209,3 +226,4 @@ void cast_rays(t_game *game)
|
|||||||
x++;
|
x++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -1,12 +1,12 @@
|
|||||||
/* ************************************************************************** */
|
/* ************************************************************************** */
|
||||||
/* */
|
/* */
|
||||||
/* :::::::: */
|
/* ::: :::::::: */
|
||||||
/* render.c :+: :+: */
|
/* render.c :+: :+: :+: */
|
||||||
/* +:+ */
|
/* +:+ +:+ +:+ */
|
||||||
/* By: whaffman <whaffman@student.codam.nl> +#+ */
|
/* By: qmennen <qmennen@student.codam.nl> +#+ +:+ +#+ */
|
||||||
/* +#+ */
|
/* +#+#+#+#+#+ +#+ */
|
||||||
/* Created: 2025/04/15 16:28:10 by qmennen #+# #+# */
|
/* Created: 2025/04/15 16:28:10 by qmennen #+# #+# */
|
||||||
/* Updated: 2025/05/04 16:54:33 by whaffman ######## odam.nl */
|
/* Updated: 2025/05/06 19:02:53 by qmennen ### ########.fr */
|
||||||
/* */
|
/* */
|
||||||
/* ************************************************************************** */
|
/* ************************************************************************** */
|
||||||
|
|
||||||
|
|||||||
@ -6,7 +6,7 @@
|
|||||||
/* By: qmennen <qmennen@student.codam.nl> +#+ +:+ +#+ */
|
/* By: qmennen <qmennen@student.codam.nl> +#+ +:+ +#+ */
|
||||||
/* +#+#+#+#+#+ +#+ */
|
/* +#+#+#+#+#+ +#+ */
|
||||||
/* Created: 2025/05/06 15:45:58 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]);
|
mlx_delete_texture(game->map->textures[i]);
|
||||||
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)
|
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_EAST] = mlx_load_png(game->map->EA_texture);
|
||||||
game->map->textures[SIDE_SOUTH] = mlx_load_png(game->map->SO_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->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]
|
if (!game->map->textures[SIDE_NORTH] || !game->map->textures[SIDE_EAST]
|
||||||
|| !game->map->textures[SIDE_SOUTH] || !game->map->textures[SIDE_WEST])
|
|| !game->map->textures[SIDE_SOUTH] || !game->map->textures[SIDE_WEST])
|
||||||
{
|
{
|
||||||
|
|||||||
8
test.cub
8
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
|
SO ./assets/bricks_orange_x64.png
|
||||||
EA ./assets/bricksx64_east.png
|
EA ./assets/bricksx64.png
|
||||||
|
|
||||||
F 90,30,30
|
F 90,30,30
|
||||||
|
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user