Cub3D
Loading...
Searching...
No Matches
init_ray.c
1/* ************************************************************************** */
2/* */
3/* ::: :::::::: */
4/* init_ray.c :+: :+: :+: */
5/* +:+ +:+ +:+ */
6/* By: kamitsui <kamitsui@student.42tokyo.jp> +#+ +:+ +#+ */
7/* +#+#+#+#+#+ +#+ */
8/* Created: 2024/08/26 22:32:18 by kamitsui #+# #+# */
9/* Updated: 2024/11/30 15:44:55 by kamitsui ### ########.fr */
10/* */
11/* ************************************************************************** */
12
13#include "cub3d.h"
14
15static void set_x_side(t_ray_cast *ray_cast, t_vector *view_point)
16{
17 t_point grid;
18 t_vector delta_distance;
19
20 grid = ray_cast->grid;
21 delta_distance = ray_cast->delta_distance;
22 if (ray_cast->ray_dir.x < 0)
23 {
24 ray_cast->step_dir.x = -1;
25 ray_cast->next_distance.x
26 = (view_point->x - (double)grid.x) * delta_distance.x;
27 }
28 else
29 {
30 ray_cast->step_dir.x = 1;
31 ray_cast->next_distance.x
32 = ((double)grid.x + 1.0 - view_point->x) * delta_distance.x;
33 }
34}
35
36static void set_y_side(t_ray_cast *ray_cast, t_vector *view_point)
37{
38 t_point grid;
39 t_vector delta_distance;
40
41 grid = ray_cast->grid;
42 delta_distance = ray_cast->delta_distance;
43 if (ray_cast->ray_dir.y < 0)
44 {
45 ray_cast->step_dir.y = -1;
46 ray_cast->next_distance.y
47 = (view_point->y - (double)grid.y) * delta_distance.y;
48 }
49 else
50 {
51 ray_cast->step_dir.y = 1;
52 ray_cast->next_distance.y
53 = ((double)grid.y + 1.0 - view_point->y) * delta_distance.y;
54 }
55}
56
64static void set_direction_and_distance_for_dda(
65 t_ray_cast *ray_cast, t_vector *view_point)
66{
67 set_x_side(ray_cast, view_point);
68 set_y_side(ray_cast, view_point);
69}
70
71static t_vector get_delta_distance(t_ray_cast ray_cast)
72{
73 t_vector delta_distance;
74
75 if (ray_cast.ray_dir.x == 0)
76 delta_distance.x = 1e30;
77 else
78 delta_distance.x = fabs(1 / ray_cast.ray_dir.x);
79 if (ray_cast.ray_dir.y == 0)
80 delta_distance.y = 1e30;
81 else
82 delta_distance.y = fabs(1 / ray_cast.ray_dir.y);
83 return ((t_vector)delta_distance);
84}
85
97void init_ray(t_frame *frame, int x)
98{
99 t_ray_cast ray_cast;
100 t_vector camera_forcal_plane;
101 t_vector ray_dir;
102
103 camera_forcal_plane = frame->player->camera_forcal_plane;
104 ray_dir = frame->player->ray_dir;
105 ray_cast.camera_plane_x = 2 * x / (double)IMG_3D_WIDTH - 1;
106 ray_cast.ray_dir.x
107 = ray_dir.x + camera_forcal_plane.x * ray_cast.camera_plane_x;
108 ray_cast.ray_dir.y
109 = ray_dir.y + camera_forcal_plane.y * ray_cast.camera_plane_x;
110 ray_cast.grid.x = (int)frame->player->view_point.x;
111 ray_cast.grid.y = (int)frame->player->view_point.y;
112 ray_cast.delta_distance = (t_vector)get_delta_distance(ray_cast);
113 set_direction_and_distance_for_dda(&ray_cast, &frame->player->view_point);
114 frame->ray_cast = ray_cast;
115}
116 //debug_ray_cast(frame, "after init_ray()", x);
single still image for render_frame
Definition type_cub3d.h:247
vector
Definition type_cub3d.h:74