98 lines
2.6 KiB
C
98 lines
2.6 KiB
C
/* ************************************************************************** */
|
|
/* */
|
|
/* ::: :::::::: */
|
|
/* raycast_utils.c :+: :+: :+: */
|
|
/* +:+ +:+ +:+ */
|
|
/* By: jle-neze <marvin@42.fr> +#+ +:+ +#+ */
|
|
/* +#+#+#+#+#+ +#+ */
|
|
/* Created: 2025/10/29 18:20:00 by jle-neze #+# #+# */
|
|
/* Updated: 2025/10/29 18:20:00 by jle-neze ### ########.fr */
|
|
/* */
|
|
/* ************************************************************************** */
|
|
|
|
#include "cub.h"
|
|
|
|
static void draw_textured(t_game *g, t_texdraw d)
|
|
{
|
|
double wall_x;
|
|
int tex_x;
|
|
double step;
|
|
double tex_pos;
|
|
t_texline l;
|
|
|
|
if (d.r->side == 0)
|
|
wall_x = g->cam.pos_y + d.c.perp_dist * d.r->ray_dir_y;
|
|
else
|
|
wall_x = g->cam.pos_x + d.c.perp_dist * d.r->ray_dir_x;
|
|
wall_x -= floor(wall_x);
|
|
tex_x = (int)(wall_x * (double)d.t->w);
|
|
if ((d.r->side == 0 && d.r->ray_dir_x > 0)
|
|
|| (d.r->side == 1 && d.r->ray_dir_y < 0))
|
|
tex_x = d.t->w - tex_x - 1;
|
|
step = (double)d.t->h / (double)d.c.line_h;
|
|
tex_pos = (d.c.draw_start - g->gfx.h / 2 + d.c.line_h / 2) * step;
|
|
l.tex = d.t;
|
|
l.tex_x = tex_x;
|
|
l.step = step;
|
|
l.tex_pos = tex_pos;
|
|
l.y0 = d.c.draw_start;
|
|
l.y1 = d.c.draw_end;
|
|
draw_tex_vline(g, d.x, l);
|
|
}
|
|
|
|
static void set_tex_id(t_ray *r)
|
|
{
|
|
if (r->side == 0)
|
|
{
|
|
if (r->step_x < 0)
|
|
r->tex_id = 2;
|
|
else
|
|
r->tex_id = 3;
|
|
}
|
|
else
|
|
{
|
|
if (r->step_y < 0)
|
|
r->tex_id = 1;
|
|
else
|
|
r->tex_id = 0;
|
|
}
|
|
}
|
|
|
|
static void draw_color_column(t_game *g, int x, t_ray *r, t_col c)
|
|
{
|
|
t_vline v;
|
|
|
|
v.y0 = c.draw_start;
|
|
v.y1 = c.draw_end;
|
|
v.color = g->colors.wall_nsew[r->tex_id];
|
|
if (r->side == 1)
|
|
v.color = (v.color & 0xFEFEFE) >> 1;
|
|
draw_vline(g, x, v);
|
|
}
|
|
|
|
void draw_column(t_game *g, int x, t_ray *r)
|
|
{
|
|
t_tex *t;
|
|
t_col c;
|
|
t_texdraw d;
|
|
|
|
if (r->side == 0)
|
|
c.perp_dist = r->side_dist_x - r->delta_dist_x;
|
|
else
|
|
c.perp_dist = r->side_dist_y - r->delta_dist_y;
|
|
if (c.perp_dist < 1e-6)
|
|
c.perp_dist = 1e-6;
|
|
c.line_h = (int)(g->gfx.h / c.perp_dist);
|
|
c.draw_start = -c.line_h / 2 + g->gfx.h / 2;
|
|
c.draw_end = c.line_h / 2 + g->gfx.h / 2;
|
|
set_tex_id(r);
|
|
if (!g->has_tex)
|
|
return (draw_color_column(g, x, r, c));
|
|
t = &g->tex[r->tex_id];
|
|
d.x = x;
|
|
d.r = r;
|
|
d.t = t;
|
|
d.c = c;
|
|
draw_textured(g, d);
|
|
}
|