diff options
Diffstat (limited to '')
-rw-r--r-- | src/ft_raycasting.c | 41 |
1 files changed, 35 insertions, 6 deletions
diff --git a/src/ft_raycasting.c b/src/ft_raycasting.c index d36eacf..8aa4dbe 100644 --- a/src/ft_raycasting.c +++ b/src/ft_raycasting.c @@ -2,21 +2,50 @@ #include <stdint.h> static void -ft_initray(t_cub *clist, uint16_t i) +ft_initray(t_cub *cl, uint16_t i) { - (void)clist; - (void)i; + 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->x_step) / 2) / cl->rlist.x_ray_dir; + else + cl->rlist.wall_dist = (cl->rlist.sqy - cl->rlist.y_ray_pos + + (1 - cl->y_step) / 2) / cl->rlist.y_ray_dir; } void -ft_castray(t_cub *clist) +ft_castray(t_cub *cl) { uint16_t i; + t_win *wl; i = 0; - while (i < clist->wlist->y_size) + wl = cl->wlist; + while (i < wl->x_size) { - ft_initray(clist, i); + ft_initray(cl, i); + 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 >= wl->y_size)\ + cl->rlist.wall_b = wl->y_size - 1; + ft_draw_verline(cl, i, cl->rlist.wall_t - 1, cl->rlist.wall_b, 0x0000ffaa); i++; } } |