Last development push

This commit is contained in:
2025-12-09 19:57:51 +01:00
parent a7f7d77bf9
commit 5e08fc76ef
25 changed files with 764 additions and 195 deletions

106
src/execution/render.c Normal file
View File

@@ -0,0 +1,106 @@
/* ************************************************************************** */
/* */
/* ::: :::::::: */
/* render.c :+: :+: :+: */
/* +:+ +:+ +:+ */
/* By: aortigos <aortigos@student.42malaga.com +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2025/12/09 18:42:30 by aortigos #+# #+# */
/* Updated: 2025/12/09 19:55:21 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)
my_mlx_pixel_put(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)
my_mlx_pixel_put(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);
else
x_o = (int)fmodf((mlx->ray->vert_y * (texture->width / WALL_SIZE)),
texture->width);
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)
{
my_mlx_pixel_put(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);
}