116 lines
3.2 KiB
C
Executable File
116 lines
3.2 KiB
C
Executable File
/* ************************************************************************** */
|
|
/* */
|
|
/* ::: :::::::: */
|
|
/* render.c :+: :+: :+: */
|
|
/* +:+ +:+ +:+ */
|
|
/* By: aortigos <aortigos@student.42malaga.com +#+ +:+ +#+ */
|
|
/* +#+#+#+#+#+ +#+ */
|
|
/* Created: 2025/12/09 18:42:30 by aortigos #+# #+# */
|
|
/* Updated: 2026/01/25 16:43:48 by aortigos ### ########.fr */
|
|
/* */
|
|
/* ************************************************************************** */
|
|
|
|
#include "../../includes/cub3d.h"
|
|
|
|
void draw_floor_ceiling(t_mlx *mlx, int ray, int t_pix, int b_pix)
|
|
{
|
|
int i;
|
|
int c;
|
|
|
|
i = b_pix;
|
|
c = get_rgba(ft_atoi(mlx->dt->ff[0]), ft_atoi(mlx->dt->ff[1]),
|
|
ft_atoi(mlx->dt->ff[2]), 255);
|
|
while (i < S_H)
|
|
cub3d_put_pixel(mlx, ray, i++, c);
|
|
c = get_rgba(ft_atoi(mlx->dt->cc[0]), ft_atoi(mlx->dt->cc[1]),
|
|
ft_atoi(mlx->dt->cc[2]), 255);
|
|
i = 0;
|
|
while (i < t_pix)
|
|
cub3d_put_pixel(mlx, ray, i++, c);
|
|
}
|
|
|
|
mlx_texture_t *get_texture(t_mlx *mlx, int flag)
|
|
{
|
|
mlx->ray->ray_ngl = nor_angle(mlx->ray->ray_ngl);
|
|
if (flag == 0)
|
|
{
|
|
if (mlx->ray->ray_ngl > M_PI / 2 && mlx->ray->ray_ngl < 3 * (M_PI / 2))
|
|
return (mlx->tex->ea);
|
|
else
|
|
return (mlx->tex->we);
|
|
}
|
|
else
|
|
{
|
|
if (mlx->ray->ray_ngl > 0 && mlx->ray->ray_ngl < M_PI)
|
|
return (mlx->tex->so);
|
|
else
|
|
return (mlx->tex->no);
|
|
}
|
|
}
|
|
|
|
double get_x_o(mlx_texture_t *texture, t_mlx *mlx)
|
|
{
|
|
double x_o;
|
|
|
|
if (mlx->ray->flag == 1)
|
|
{
|
|
x_o = (int)fmodf((mlx->ray->horiz_x * (texture->width / WALL_SIZE)),
|
|
texture->width);
|
|
if (mlx->ray->ray_ngl > 0 && mlx->ray->ray_ngl < M_PI)
|
|
x_o = texture->width - x_o - 1;
|
|
}
|
|
else
|
|
{
|
|
x_o = (int)fmodf((mlx->ray->vert_y * (texture->width / WALL_SIZE)),
|
|
texture->width);
|
|
if (mlx->ray->ray_ngl > M_PI / 2
|
|
&& mlx->ray->ray_ngl < 3 * M_PI / 2)
|
|
x_o = texture->width - x_o - 1;
|
|
}
|
|
return (x_o);
|
|
}
|
|
|
|
void draw_wall(t_mlx *mlx, int t_pix, int b_pix, double wall_h)
|
|
{
|
|
double x_o;
|
|
double y_o;
|
|
mlx_texture_t *texture;
|
|
uint32_t *arr;
|
|
double factor;
|
|
|
|
texture = get_texture(mlx, mlx->ray->flag);
|
|
arr = (uint32_t *)texture->pixels;
|
|
factor = (double)texture->height / wall_h;
|
|
x_o = get_x_o(texture, mlx);
|
|
y_o = (t_pix - (S_H / 2) + (wall_h / 2)) * factor;
|
|
if (y_o < 0)
|
|
y_o = 0;
|
|
while (t_pix < b_pix)
|
|
{
|
|
cub3d_put_pixel(mlx, mlx->ray->index, t_pix, reverse_bytes(arr[(int)y_o
|
|
* texture->width + (int)x_o]));
|
|
y_o += factor;
|
|
t_pix++;
|
|
}
|
|
}
|
|
|
|
void render_wall(t_mlx *mlx, int ray)
|
|
{
|
|
double wall_h;
|
|
double b_pix;
|
|
double t_pix;
|
|
|
|
mlx->ray->distance *= cos(nor_angle(mlx->ray->ray_ngl - mlx->ply->angle));
|
|
wall_h = (WALL_SIZE / mlx->ray->distance) * ((S_W / 2)
|
|
/ tan(mlx->ply->fov_rd / 2));
|
|
b_pix = (S_H / 2) + (wall_h / 2);
|
|
t_pix = (S_H / 2) - (wall_h / 2);
|
|
if (b_pix > S_H)
|
|
b_pix = S_H;
|
|
if (t_pix < 0)
|
|
t_pix = 0;
|
|
mlx->ray->index = ray;
|
|
draw_wall(mlx, t_pix, b_pix, wall_h);
|
|
draw_floor_ceiling(mlx, ray, t_pix, b_pix);
|
|
}
|