diff options
author | JozanLeClerc <bousset.rudy@gmail.com> | 2020-03-24 20:06:05 +0100 |
---|---|---|
committer | JozanLeClerc <bousset.rudy@gmail.com> | 2020-03-24 20:06:05 +0100 |
commit | b6736a2dc2cead76bd6a619b52d2d18ac3d4029d (patch) | |
tree | ee89b6ac356cb37a7906ff157c1f1908823b9d2b /src/ft_castray_loop.c | |
parent | Norme and merge (diff) | |
download | 42-cub3d-b6736a2dc2cead76bd6a619b52d2d18ac3d4029d.tar.gz 42-cub3d-b6736a2dc2cead76bd6a619b52d2d18ac3d4029d.tar.bz2 42-cub3d-b6736a2dc2cead76bd6a619b52d2d18ac3d4029d.tar.xz 42-cub3d-b6736a2dc2cead76bd6a619b52d2d18ac3d4029d.tar.zst 42-cub3d-b6736a2dc2cead76bd6a619b52d2d18ac3d4029d.zip |
Get normed
Diffstat (limited to 'src/ft_castray_loop.c')
-rw-r--r-- | src/ft_castray_loop.c | 87 |
1 files changed, 87 insertions, 0 deletions
diff --git a/src/ft_castray_loop.c b/src/ft_castray_loop.c new file mode 100644 index 0000000..28277a7 --- /dev/null +++ b/src/ft_castray_loop.c @@ -0,0 +1,87 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* 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 <libft.h> +#include <cub3d.h> +#include <stdint.h> +#include <stdlib.h> +#include <math.h> + +void + ft_calc_tex(t_cub *cl) +{ + if (cl->rlist.side == 0) + cl->rlist.wall_hit_x = (cl->plist.pos_x) + + cl->rlist.wall_dist * cl->rlist.y_ray_dir; + else + cl->rlist.wall_hit_x = (cl->plist.pos_y) + + cl->rlist.wall_dist * cl->rlist.x_ray_dir; + cl->rlist.wall_hit_x -= floor(cl->rlist.wall_hit_x); + cl->tlist[cl->w_side].tex_x = (int)(cl->rlist.wall_hit_x * + (double)cl->tlist[cl->w_side].img_w); + if (cl->rlist.side == 0 && cl->rlist.x_ray_dir > 0) + cl->tlist[cl->w_side].tex_x = cl->tlist[cl->w_side].img_w + - cl->tlist[cl->w_side].tex_x - 1; + else if (cl->rlist.side == 1 && cl->rlist.y_ray_dir < 0) + cl->tlist[cl->w_side].tex_x = cl->tlist[cl->w_side].img_w + - cl->tlist[cl->w_side].tex_x - 1; +} + +void + ft_initray(uint16_t i, t_cub *cl) +{ + t_win *wl; + t_player *pl; + + wl = &cl->wlist; + pl = &cl->plist; + pl->cam_x = 2 * i / (float)(wl->x_size) - 1; + cl->rlist.x_ray_pos = pl->pos_y; + cl->rlist.y_ray_pos = pl->pos_x; + cl->rlist.x_ray_dir = pl->dir_x + pl->plane_x * + pl->cam_x; + cl->rlist.y_ray_dir = pl->dir_y + pl->plane_y * + pl->cam_x; + cl->rlist.sqx = (int16_t)cl->rlist.x_ray_pos; + cl->rlist.sqy = (int16_t)cl->rlist.y_ray_pos; + ft_detect(cl); + if (cl->rlist.side == 0) + { + cl->rlist.wall_dist = (cl->rlist.sqx - cl->rlist.x_ray_pos + + (1 - cl->mlist.x_step) / 2) / cl->rlist.x_ray_dir; + } + else + { + cl->rlist.wall_dist = (cl->rlist.sqy - cl->rlist.y_ray_pos + + (1 - cl->mlist.y_step) / 2) / cl->rlist.y_ray_dir; + } +} + +void + ft_castray_loop(uint16_t i, t_win *wl, t_cub *cl) +{ + ft_initray(i, cl); + cl->rlist.line_h = (int16_t)(wl->y_size / cl->rlist.wall_dist); + cl->rlist.wall_t = -cl->rlist.line_h / 2 + wl->y_size / 2; + if (cl->rlist.wall_t < 0) + cl->rlist.wall_t = 0; + cl->rlist.wall_b = cl->rlist.line_h / 2 + wl->y_size / 2; + if (cl->rlist.wall_b >= (int16_t)wl->y_size) + cl->rlist.wall_b = wl->y_size - 1; + ft_choose_tex(i, cl); + ft_calc_tex(cl); + cl->rlist.tex_x_tab[i] = cl->tlist[cl->w_side].tex_x; + cl->rlist.line_h_tab[i] = cl->rlist.line_h; + cl->rlist.wall_t_tab[i] = cl->rlist.wall_t; + cl->rlist.wall_b_tab[i] = cl->rlist.wall_b; + cl->rlist.wall_dist_tab[i] = cl->rlist.wall_dist; +} |