2025-07-30 13:34:36 +02:00
|
|
|
/* ************************************************************************** */
|
|
|
|
|
/* */
|
|
|
|
|
/* ::: :::::::: */
|
|
|
|
|
/* ray.c :+: :+: :+: */
|
|
|
|
|
/* +:+ +:+ +:+ */
|
2025-07-31 11:55:41 +02:00
|
|
|
/* By: kcolin <kcolin@42.fr> +#+ +:+ +#+ */
|
2025-07-30 13:34:36 +02:00
|
|
|
/* +#+#+#+#+#+ +#+ */
|
2025-07-31 11:55:41 +02:00
|
|
|
/* Created: 2025/07/31 11:55:41 by kcolin #+# #+# */
|
2025-08-20 12:48:48 +02:00
|
|
|
/* Updated: 2025/08/20 12:48:06 by tchampio ### ########.fr */
|
2025-07-30 13:34:36 +02:00
|
|
|
/* */
|
|
|
|
|
/* ************************************************************************** */
|
|
|
|
|
|
|
|
|
|
#include "ray.h"
|
2025-07-30 16:25:12 +02:00
|
|
|
#include "raycaster.h"
|
2025-07-30 13:34:36 +02:00
|
|
|
#include "../player/player.h"
|
|
|
|
|
#include "../consts.h"
|
|
|
|
|
#include "../cub3d_data.h"
|
2025-07-31 11:55:41 +02:00
|
|
|
#include <float.h>
|
2025-07-30 13:34:36 +02:00
|
|
|
#include <math.h>
|
2025-08-06 11:24:15 +02:00
|
|
|
#include "../map/collision.h"
|
2025-07-30 13:34:36 +02:00
|
|
|
|
|
|
|
|
void init_ray(t_ray *ray, int pos_x, t_player *player)
|
|
|
|
|
{
|
|
|
|
|
ray->plane = 2 * pos_x / (double)WIDTH - 1;
|
|
|
|
|
ray->dir_x = player->dir_x + player->plane_x * ray->plane;
|
|
|
|
|
ray->dir_y = player->dir_y + player->plane_y * ray->plane;
|
|
|
|
|
ray->map_x = (int)player->x;
|
|
|
|
|
ray->map_y = (int)player->y;
|
|
|
|
|
ray->delta_dist_x = fabs(1 / ray->dir_x);
|
|
|
|
|
ray->delta_dist_y = fabs(1 / ray->dir_y);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void ray_calculate_step(t_ray *ray, t_player *player)
|
|
|
|
|
{
|
|
|
|
|
if (ray->dir_x < 0)
|
|
|
|
|
{
|
|
|
|
|
ray->step_x = -1;
|
|
|
|
|
ray->side_dist_x = (player->x - ray->map_x) * ray->delta_dist_x;
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
ray->step_x = 1;
|
|
|
|
|
ray->side_dist_x = (ray->map_x + 1.0 - player->x) * ray->delta_dist_x;
|
|
|
|
|
}
|
|
|
|
|
if (ray->dir_y < 0)
|
|
|
|
|
{
|
|
|
|
|
ray->step_y = -1;
|
|
|
|
|
ray->side_dist_y = (player->y - ray->map_y) * ray->delta_dist_y;
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
ray->step_y = 1;
|
|
|
|
|
ray->side_dist_y = (ray->map_y + 1.0 - player->y) * ray->delta_dist_y;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2025-08-06 11:24:15 +02:00
|
|
|
void calculate_wall_dist(t_ray *ray, t_mapdata *map)
|
2025-07-30 13:34:36 +02:00
|
|
|
{
|
|
|
|
|
while (true)
|
|
|
|
|
{
|
|
|
|
|
if (ray->side_dist_x < ray->side_dist_y)
|
|
|
|
|
{
|
|
|
|
|
ray->side_dist_x += ray->delta_dist_x;
|
|
|
|
|
ray->map_x += ray->step_x;
|
2025-08-05 12:40:53 +02:00
|
|
|
ray->side = NORTH;
|
2025-07-30 13:34:36 +02:00
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
ray->side_dist_y += ray->delta_dist_y;
|
|
|
|
|
ray->map_y += ray->step_y;
|
2025-08-05 12:40:53 +02:00
|
|
|
ray->side = SOUTH;
|
2025-07-30 13:34:36 +02:00
|
|
|
}
|
2025-08-20 12:48:48 +02:00
|
|
|
if (blocks_view(map, ray->map_x, ray->map_y))
|
2025-07-30 13:34:36 +02:00
|
|
|
break ;
|
|
|
|
|
}
|
2025-08-05 12:40:53 +02:00
|
|
|
if (ray->side == NORTH)
|
2025-07-30 13:34:36 +02:00
|
|
|
ray->wall_dist = ray->side_dist_x - ray->delta_dist_x;
|
|
|
|
|
else
|
|
|
|
|
ray->wall_dist = ray->side_dist_y - ray->delta_dist_y;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void calculate_wall_height(t_ray *ray, t_player *player)
|
|
|
|
|
{
|
2025-07-31 11:55:41 +02:00
|
|
|
if (ray->wall_dist <= FLT_EPSILON)
|
|
|
|
|
ray->wall_dist = 0.1;
|
2025-07-30 13:34:36 +02:00
|
|
|
ray->wall_height = (int)(HEIGHT / ray->wall_dist);
|
|
|
|
|
ray->draw_start = -ray->wall_height / 2 + HEIGHT / 2;
|
|
|
|
|
if (ray->draw_start < 0)
|
|
|
|
|
ray->draw_start = 0;
|
|
|
|
|
ray->draw_end = ray->wall_height / 2 + HEIGHT / 2;
|
|
|
|
|
if (ray->draw_end >= HEIGHT)
|
2025-07-30 16:25:12 +02:00
|
|
|
ray->draw_end = HEIGHT - 1;
|
2025-08-05 12:40:53 +02:00
|
|
|
if (ray->side == NORTH)
|
2025-07-30 13:34:36 +02:00
|
|
|
ray->wall_x = player->y + ray->wall_dist * ray->dir_y;
|
|
|
|
|
else
|
|
|
|
|
ray->wall_x = player->x + ray->wall_dist * ray->dir_x;
|
|
|
|
|
ray->wall_x -= floor(ray->wall_x);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void raycaster(t_cub3d_data *data, t_ray *ray)
|
|
|
|
|
{
|
|
|
|
|
int x;
|
|
|
|
|
|
|
|
|
|
x = 0;
|
|
|
|
|
while (x < WIDTH)
|
|
|
|
|
{
|
|
|
|
|
init_ray(ray, x, &data->player);
|
|
|
|
|
ray_calculate_step(ray, &data->player);
|
2025-08-06 11:24:15 +02:00
|
|
|
calculate_wall_dist(ray, data->map);
|
2025-07-30 13:34:36 +02:00
|
|
|
calculate_wall_height(ray, &data->player);
|
2025-07-30 16:25:12 +02:00
|
|
|
render_walls(data, ray, x);
|
2025-08-06 14:04:44 +02:00
|
|
|
data->zbuffer[x] = ray->wall_dist;
|
2025-07-30 16:25:12 +02:00
|
|
|
x++;
|
2025-07-30 13:34:36 +02:00
|
|
|
}
|
|
|
|
|
}
|