diff options
Diffstat (limited to 'src/ft_floor_cast.c')
-rw-r--r-- | src/ft_floor_cast.c | 109 |
1 files changed, 109 insertions, 0 deletions
diff --git a/src/ft_floor_cast.c b/src/ft_floor_cast.c new file mode 100644 index 0000000..6111eca --- /dev/null +++ b/src/ft_floor_cast.c @@ -0,0 +1,109 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_raycasting.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: rbousset <marvin@42.fr> +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2020/02/14 17:22:57 by rbousset #+# #+# */ +/* Updated: 2020/02/14 17:23:42 by rbousset ### ########lyon.fr */ +/* */ +/* ************************************************************************** */ + +#include <cub3d.h> +#include <stdint.h> + +static void + ft_draw_plain_horizontal(t_rgb rgb, t_cub *cl, int32_t y, int32_t x) +{ + *(int*)(cl->img.ptr + + (x * 4 + (y * cl->img.sizeline))) = ft_darken(rgb, cl); +} + +static void + ft_draw_extra_tex(uint8_t tid, uint16_t y, uint16_t x, t_cub *cl) +{ + float dist; + float calc; + + if ((dist = cl->rlist.row_dist) <= 0) + dist = 0.0001; + calc = (dist * 0.1 * cl->mlist.darklvl); + calc = (calc >= 255) ? (255) : (calc); + calc = (calc < 1) ? (1) : (calc); + cl->img.ptr[x * 4 + (cl->img.sizeline * y)] = + (uint8_t)cl->tlist[tid].ptr[cl->tlist[tid].tex_x * 4 + 4 * + cl->tlist[tid].img_h * cl->tlist[tid].tex_y] / calc; + cl->img.ptr[x * 4 + (cl->img.sizeline * y) + 1] = + (uint8_t)cl->tlist[tid].ptr[cl->tlist[tid].tex_x * 4 + 4 * + cl->tlist[tid].img_h * cl->tlist[tid].tex_y + 1] / calc; + cl->img.ptr[x * 4 + (cl->img.sizeline * y) + 2] = + (uint8_t)cl->tlist[tid].ptr[cl->tlist[tid].tex_x * 4 + 4 * + cl->tlist[tid].img_h * cl->tlist[tid].tex_y + 2] / calc; + cl->img.ptr[x * 4 + cl->wlist.x_size * y + 3] = (char)0; +} + +static void + ft_set_tex_xy(uint8_t tid, t_ray *rl, t_cub *cl) +{ + cl->tlist[tid].tex_y = (int32_t)(cl->tlist[tid].img_w + * (rl->x_floor - rl->x_cell)) % (cl->tlist[tid].img_w); + cl->tlist[tid].tex_x = (int32_t)(cl->tlist[tid].img_h + * (rl->y_floor - rl->y_cell)) % (cl->tlist[tid].img_h); + cl->tlist[tid].tex_x = (cl->tlist[tid].tex_x > 0) + ? (cl->tlist[tid].tex_x) : (-cl->tlist[tid].tex_x); + cl->tlist[tid].tex_y = (cl->tlist[tid].tex_y > 0) + ? (cl->tlist[tid].tex_y) : (-cl->tlist[tid].tex_y); +} + +static void + ft_floor_cast_loop(uint16_t y, uint16_t x, t_ray *rl, t_cub *cl) +{ + rl->x_cell = (int32_t)(rl->x_floor); + rl->y_cell = (int32_t)(rl->y_floor); + if (cl->mlist.isftex) + { + ft_set_tex_xy(6, rl, cl); + } + if (cl->mlist.isctex) + { + ft_set_tex_xy(7, rl, cl); + } + rl->x_floor += cl->mlist.x_floor_step; + rl->y_floor += cl->mlist.y_floor_step; + if (cl->mlist.isftex) + ft_draw_extra_tex(6, y, x, cl); + else + ft_draw_plain_horizontal(cl->f_rgb, cl, y, x); + if (cl->mlist.isctex) + ft_draw_extra_tex(7, cl->wlist.y_size - y - 1, x, cl); + else + ft_draw_plain_horizontal(cl->c_rgb, cl, cl->wlist.y_size - y - 1, x); +} + +void + ft_floor_cast(uint16_t y, t_cub *cl) +{ + t_ray *rl; + uint16_t x; + + rl = &cl->rlist; + rl->x_f_ray_dir = cl->plist.dir_x - cl->plist.plane_x; + rl->y_f_ray_dir = cl->plist.dir_y - cl->plist.plane_y; + rl->x_f_ray_dir_bis = cl->plist.dir_x + cl->plist.plane_x; + rl->y_f_ray_dir_bis = cl->plist.dir_y + cl->plist.plane_y; + rl->p = y - cl->wlist.y_size / 2; + cl->plist.pos_z = 0.5 * cl->wlist.y_size; + rl->row_dist = cl->plist.pos_z / rl->p; + cl->mlist.x_floor_step = rl->row_dist * + (rl->x_f_ray_dir_bis - rl->x_f_ray_dir) / cl->wlist.x_size; + cl->mlist.y_floor_step = rl->row_dist * + (rl->y_f_ray_dir_bis - rl->y_f_ray_dir) / cl->wlist.x_size; + rl->x_floor = cl->plist.pos_y + rl->row_dist * rl->x_f_ray_dir; + rl->y_floor = cl->plist.pos_x + rl->row_dist * rl->y_f_ray_dir; + x = 0; + while (++x < cl->wlist.x_size) + { + ft_floor_cast_loop(y, x, rl, cl); + } +} |