feat: made 3d... for the cub3d

This commit is contained in:
Theo Champion 2025-07-30 16:25:12 +02:00
parent 077659cd25
commit 5281fe6abd
8 changed files with 185 additions and 5 deletions

View file

@ -23,6 +23,9 @@ SOURCEFILES = \
src/player/angle.c \ src/player/angle.c \
src/player/player.c \ src/player/player.c \
src/player/move.c \ src/player/move.c \
src/raycast/ray.c \
src/raycast/render.c \
src/renderer/render.c \
OBJECTS = $(SOURCEFILES:.c=.o) OBJECTS = $(SOURCEFILES:.c=.o)
NAME = cub3d NAME = cub3d

View file

@ -6,7 +6,7 @@
/* By: kcolin <kcolin@42.fr> +#+ +:+ +#+ */ /* By: kcolin <kcolin@42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */ /* +#+#+#+#+#+ +#+ */
/* Created: 2025/07/17 14:59:37 by kcolin #+# #+# */ /* Created: 2025/07/17 14:59:37 by kcolin #+# #+# */
/* Updated: 2025/07/29 13:43:40 by tchampio ### ########.fr */ /* Updated: 2025/07/30 16:07:36 by tchampio ### ########.fr */
/* */ /* */
/* ************************************************************************** */ /* ************************************************************************** */
@ -17,6 +17,7 @@
# include "draw/img_data.h" # include "draw/img_data.h"
# include "player/player.h" # include "player/player.h"
# include "utils/keypresses.h" # include "utils/keypresses.h"
# include "consts.h"
typedef struct s_cub3d_data typedef struct s_cub3d_data
{ {
@ -26,6 +27,7 @@ typedef struct s_cub3d_data
t_mapdata *map; t_mapdata *map;
t_player player; t_player player;
t_keypresses keypresses; t_keypresses keypresses;
int screen_matrix[HEIGHT][WIDTH];
} t_cub3d_data; } t_cub3d_data;
#endif // CUB3D_DATA_H #endif // CUB3D_DATA_H

View file

@ -6,7 +6,7 @@
/* By: kcolin <kcolin@42.fr> +#+ +:+ +#+ */ /* By: kcolin <kcolin@42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */ /* +#+#+#+#+#+ +#+ */
/* Created: 2025/07/17 14:14:30 by kcolin #+# #+# */ /* Created: 2025/07/17 14:14:30 by kcolin #+# #+# */
/* Updated: 2025/07/29 14:00:36 by tchampio ### ########.fr */ /* Updated: 2025/07/30 16:21:26 by tchampio ### ########.fr */
/* */ /* */
/* ************************************************************************** */ /* ************************************************************************** */
@ -21,6 +21,9 @@
#include "draw/draw_map.h" #include "draw/draw_map.h"
#include "map/mapdata.h" #include "map/mapdata.h"
#include "player/player.h" #include "player/player.h"
#include "raycast/raycaster.h"
#include "renderer/render.h"
#include "raycast/ray.h"
#include "utils/hooks.h" #include "utils/hooks.h"
#include "utils/frees.h" #include "utils/frees.h"
#include <stdbool.h> #include <stdbool.h>
@ -103,8 +106,12 @@ float coord_global_to_local(float coord)
int game_loop(t_cub3d_data *data) int game_loop(t_cub3d_data *data)
{ {
t_ray ray;
mlx_destroy_image(data->mlx, data->img_data->img); mlx_destroy_image(data->mlx, data->img_data->img);
data->img_data->img = mlx_new_image(data->mlx, WIDTH, HEIGHT); data->img_data->img = mlx_new_image(data->mlx, WIDTH, HEIGHT);
reset_matrix(data);
raycaster(data, &ray);
move_player(data); move_player(data);
// if (player_intercardinal_dir(data->player) == SOUTHEAST) // if (player_intercardinal_dir(data->player) == SOUTHEAST)
@ -137,7 +144,8 @@ int game_loop(t_cub3d_data *data)
// ray_angle += fraction; // ray_angle += fraction;
// } // }
draw_map(data->map, &data->player, data->img_data); //draw_map(data->map, &data->player, data->img_data);
matrix_to_image(data);
mlx_put_image_to_window(data->mlx, data->mlx_win, mlx_put_image_to_window(data->mlx, data->mlx_win,
data->img_data->img, 0, 0); data->img_data->img, 0, 0);
mlx_string_put(data->mlx, data->mlx_win, 10, 10, 0x00FFFFFF, COMPILED_TEXT); mlx_string_put(data->mlx, data->mlx_win, 10, 10, 0x00FFFFFF, COMPILED_TEXT);

View file

@ -6,11 +6,12 @@
/* By: tchampio <tchampio@student.42lehavre.fr> +#+ +:+ +#+ */ /* By: tchampio <tchampio@student.42lehavre.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */ /* +#+#+#+#+#+ +#+ */
/* Created: 2025/07/30 12:10:17 by tchampio #+# #+# */ /* Created: 2025/07/30 12:10:17 by tchampio #+# #+# */
/* Updated: 2025/07/30 12:36:11 by tchampio ### ########.fr */ /* Updated: 2025/07/30 16:06:19 by tchampio ### ########.fr */
/* */ /* */
/* ************************************************************************** */ /* ************************************************************************** */
#include "ray.h" #include "ray.h"
#include "raycaster.h"
#include "../player/player.h" #include "../player/player.h"
#include "../consts.h" #include "../consts.h"
#include "../cub3d_data.h" #include "../cub3d_data.h"
@ -84,7 +85,7 @@ void calculate_wall_height(t_ray *ray, t_player *player)
ray->draw_start = 0; ray->draw_start = 0;
ray->draw_end = ray->wall_height / 2 + HEIGHT / 2; ray->draw_end = ray->wall_height / 2 + HEIGHT / 2;
if (ray->draw_end >= HEIGHT) if (ray->draw_end >= HEIGHT)
ray->draw_start = HEIGHT - 1; ray->draw_end = HEIGHT - 1;
if (ray->side == 0) if (ray->side == 0)
ray->wall_x = player->y + ray->wall_dist * ray->dir_y; ray->wall_x = player->y + ray->wall_dist * ray->dir_y;
else else
@ -103,5 +104,7 @@ void raycaster(t_cub3d_data *data, t_ray *ray)
ray_calculate_step(ray, &data->player); ray_calculate_step(ray, &data->player);
calculate_wall_dist(ray, data->map->map); calculate_wall_dist(ray, data->map->map);
calculate_wall_height(ray, &data->player); calculate_wall_height(ray, &data->player);
render_walls(data, ray, x);
x++;
} }
} }

22
src/raycast/raycaster.h Normal file
View file

@ -0,0 +1,22 @@
/* ************************************************************************** */
/* */
/* ::: :::::::: */
/* raycaster.h :+: :+: :+: */
/* +:+ +:+ +:+ */
/* By: tchampio <tchampio@student.42lehavre.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2025/07/30 15:16:04 by tchampio #+# #+# */
/* Updated: 2025/07/30 15:17:02 by tchampio ### ########.fr */
/* */
/* ************************************************************************** */
#ifndef RAYCASTER_H
# define RAYCASTER_H
# include "ray.h"
# include "../cub3d_data.h"
void raycaster(t_cub3d_data *data, t_ray *ray);
void render_walls(t_cub3d_data *data, t_ray *ray, int x);
#endif // RAYCASTER_H

67
src/raycast/render.c Normal file
View file

@ -0,0 +1,67 @@
/* ************************************************************************** */
/* */
/* ::: :::::::: */
/* render.c :+: :+: :+: */
/* +:+ +:+ +:+ */
/* By: tchampio <tchampio@student.42lehavre.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2025/07/30 12:50:10 by tchampio #+# #+# */
/* Updated: 2025/07/30 16:22:42 by tchampio ### ########.fr */
/* */
/* ************************************************************************** */
#include "../cub3d_data.h"
#include "../consts.h"
#include "ray.h"
int get_cardinal(t_ray *ray)
{
if (ray->side == 0)
{
if (ray->dir_x < 0)
return (2);
else
return (3);
}
else
{
if (ray->dir_y > 0)
return (1);
else
return (0);
}
}
/*
* Dir values are:
* 0: North
* 1: South
* 2: West
* 3: East
*/
void render_walls(t_cub3d_data *data, t_ray *ray, int x)
{
int dir;
int tex_x;
unsigned int color;
double step;
double pos;
static int texture_size = 64; // to be changed in favor of a const
dir = get_cardinal(ray);
tex_x = (int)(ray->wall_x * texture_size);
if ((ray->side == 0 && ray->dir_x < 0) || (ray->side == 1 && ray->dir_y > 0))
tex_x = texture_size - tex_x - 1;
step = 1.0 * texture_size / ray->wall_height;
pos = (ray->draw_start - HEIGHT / 2 + ray->wall_height / 2) * step;
while (ray->draw_start < ray->draw_end)
{
pos += step;
color = 0x0000ff;
(void)dir; // cc complains otherwise
(void)pos; // cc complains otherwise
data->screen_matrix[ray->draw_start][x] = color;
ray->draw_start++;
}
}

54
src/renderer/render.c Normal file
View file

@ -0,0 +1,54 @@
/* ************************************************************************** */
/* */
/* ::: :::::::: */
/* render.c :+: :+: :+: */
/* +:+ +:+ +:+ */
/* By: tchampio <tchampio@student.42lehavre.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2025/07/30 14:53:39 by tchampio #+# #+# */
/* Updated: 2025/07/30 16:21:18 by tchampio ### ########.fr */
/* */
/* ************************************************************************** */
#include "render.h"
#include "../consts.h"
#include "../cub3d_data.h"
#include "../draw/drawutils.h"
#include "../../libft/includes/libft.h"
void reset_matrix(t_cub3d_data *data)
{
int x;
int y;
y = 0;
while (y < HEIGHT)
{
x = 0;
while (x < WIDTH)
{
data->screen_matrix[y][x] = 0;
x++;
}
y++;
}
}
void matrix_to_image(t_cub3d_data *data)
{
int x;
int y;
y = 0;
while (y < HEIGHT)
{
x = 0;
while (x < WIDTH)
{
if (data->screen_matrix[y][x] > 0)
my_mlx_pixel_put(data->img_data, x, y, data->screen_matrix[y][x]);
x++;
}
y++;
}
}

21
src/renderer/render.h Normal file
View file

@ -0,0 +1,21 @@
/* ************************************************************************** */
/* */
/* ::: :::::::: */
/* render.h :+: :+: :+: */
/* +:+ +:+ +:+ */
/* By: tchampio <tchampio@student.42lehavre.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2025/07/30 14:52:12 by tchampio #+# #+# */
/* Updated: 2025/07/30 16:20:57 by tchampio ### ########.fr */
/* */
/* ************************************************************************** */
#ifndef RENDER_H
# define RENDER_H
# include "../cub3d_data.h"
void reset_matrix(t_cub3d_data *data);
void matrix_to_image(t_cub3d_data *data);
#endif // RENDER_H