-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathraycasting.c
137 lines (130 loc) · 5.62 KB
/
raycasting.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
/* ************************************************************************** */
/* */
/* ::: :::::::: */
/* raycasting.c :+: :+: :+: */
/* +:+ +:+ +:+ */
/* By: ahajji <ahajji@student.1337.ma> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2023/11/03 12:37:30 by ahajji #+# #+# */
/* Updated: 2023/12/10 12:56:55 by ahajji ### ########.fr */
/* */
/* ************************************************************************** */
#include "cub3d.h"
void ray_casting(t_cub3d *data, float ray_angle,
int id_ray, mlx_image_t *img)
{
double height_wall;
int xstart;
int ystart;
int xend;
int yend;
data->dist = data->dist * cos(to_rad(ray_angle) - to_rad(data->angle));
height_wall = ((data->size_shape) * HEIGHT_WIN) / data->dist;
xstart = id_ray;
xend = id_ray;
ystart = (HEIGHT_WIN / 2) - (height_wall / 2);
yend = (HEIGHT_WIN / 2) + (height_wall / 2);
if (yend > HEIGHT_WIN)
yend = HEIGHT_WIN;
data->texture_offset_x = data->present_texture * img->width;
data->wall_start = ystart;
while (ystart < yend)
{
data->texture_offset_y = (((float)ystart - (float)data->wall_start)
/ (float)height_wall) * img->height;
if (ystart >= 0 && ystart < HEIGHT_WIN)
mlx_put_pixel(data->img, xstart, (int)ystart,
get_texel(img, data->texture_offset_x, data->texture_offset_y));
ystart += 1;
}
}
void check_ray_draw_down(t_cub3d *data, float ray_angle)
{
data->hores_inters_y = floor((data->py / data->size_shape) + 1)
* data->size_shape;
data->hores_inters_x = data->px + (data->hores_inters_y - data->py)
/ tan(to_rad(ray_angle));
data->next_hor_inters_y = data->hores_inters_y + data->size_shape;
data->next_hor_inters_x = data->hores_inters_x + ((data->next_hor_inters_y
- data->hores_inters_y) / tan(to_rad(ray_angle)));
data->step_hor_y = data->size_shape;
data->step_hor_x = data->next_hor_inters_x - data->hores_inters_x;
while (((int)(data->hores_inters_x / data->size_shape)) < data->width_map
&& ((int)(data->hores_inters_y / data->size_shape)) < data->height_map
&& data->hores_inters_x >= 0 && data->hores_inters_y >= 0
&& data->map[(int)(data->hores_inters_y
/ data->size_shape)][(int)(data->hores_inters_x
/ data->size_shape)] != '1')
{
data->hores_inters_y += data->step_hor_y;
data->hores_inters_x += data->step_hor_x;
}
}
void check_ray_draw_up(t_cub3d *data, float ray_angle)
{
data->hores_inters_y = floor((data->py / data->size_shape))
* data->size_shape;
data->hores_inters_x = data->px - ((data->py - data->hores_inters_y)
/ tan(to_rad(ray_angle)));
data->next_hor_inters_y = data->hores_inters_y - data->size_shape;
data->next_hor_inters_x = data->hores_inters_x - ((data->hores_inters_y
- data->next_hor_inters_y) / tan(to_rad(ray_angle)));
data->step_hor_y = data->size_shape;
data->step_hor_x = data->next_hor_inters_x - data->hores_inters_x;
while (((int)(data->hores_inters_x / data->size_shape)) < data->width_map
&& ((int)((data->hores_inters_y - 1)
/ data->size_shape)) < data->height_map
&& data->hores_inters_x >= 0 && data->hores_inters_y >= 0
&& data->map[(int)((data->hores_inters_y - 1)
/ data->size_shape)][(int)(data->hores_inters_x
/ data->size_shape)] != '1')
{
data->hores_inters_y -= data->step_hor_y;
data->hores_inters_x += data->step_hor_x;
}
}
void check_ray_draw_right(t_cub3d *data, float ray_angle)
{
data->vertcl_inters_x = floor((data->px / data->size_shape) + 1)
* data->size_shape;
data->vertcl_inters_y = data->py - ((data->px - data->vertcl_inters_x)
* tan(to_rad(ray_angle)));
data->next_ver_inters_x = data->vertcl_inters_x + data->size_shape;
data->next_ver_inters_y = data->vertcl_inters_y - ((data->vertcl_inters_x
- data->next_ver_inters_x) * tan(to_rad(ray_angle)));
data->step_ver_x = data->size_shape;
data->step_ver_y = data->next_ver_inters_y - data->vertcl_inters_y;
while (((int)(data->vertcl_inters_x / data->size_shape)) < data->width_map
&& ((int)(data->vertcl_inters_y / data->size_shape)) < data->height_map
&& data->vertcl_inters_x >= 0 && data->vertcl_inters_y >= 0
&& data->map[(int)(data->vertcl_inters_y
/ data->size_shape)][(int)(data->vertcl_inters_x
/ data->size_shape)] != '1')
{
data->vertcl_inters_y += data->step_ver_y;
data->vertcl_inters_x += data->step_ver_x;
}
}
void check_ray_draw_left(t_cub3d *data, float ray_angle)
{
data->vertcl_inters_x = floor((data->px / data->size_shape))
* data->size_shape;
data->vertcl_inters_y = data->py - ((data->px - data->vertcl_inters_x)
* tan(to_rad(ray_angle)));
data->next_ver_inters_x = data->vertcl_inters_x - data->size_shape;
data->next_ver_inters_y = data->vertcl_inters_y - ((data->vertcl_inters_x
- data->next_ver_inters_x) * tan(to_rad(ray_angle)));
data->step_ver_x = data->size_shape;
data->step_ver_y = data->next_ver_inters_y - data->vertcl_inters_y;
while (((int)((data->vertcl_inters_x - 1)
/ data->size_shape)) < data->width_map
&& ((int)(data->vertcl_inters_y / data->size_shape)) < data->height_map
&& data->vertcl_inters_x >= 0 && data->vertcl_inters_y >= 0
&& data->map[(int)(data->vertcl_inters_y
/ data->size_shape)][(int)((data->vertcl_inters_x - 1)
/ data->size_shape)] != '1')
{
data->vertcl_inters_y += data->step_ver_y;
data->vertcl_inters_x -= data->step_ver_x;
}
}