-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathraycasting.c
More file actions
123 lines (116 loc) · 3.48 KB
/
raycasting.c
File metadata and controls
123 lines (116 loc) · 3.48 KB
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
/* ************************************************************************** */
/* */
/* ::: :::::::: */
/* raycasting.c :+: :+: :+: */
/* +:+ +:+ +:+ */
/* By: bguzel <bguzel@student.42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2023/09/22 15:07:11 by yturgut #+# #+# */
/* Updated: 2023/09/24 20:13:23 by bguzel ### ########.fr */
/* */
/* ************************************************************************** */
#include "cub3d.h"
void calc_wall_x(t_data *data)
{
data->draw_start = -data->line_height / 2 + SCREEN_HEIGHT / 2;
if (data->draw_start < 0)
data->draw_start = 0;
data->draw_end = data->line_height / 2 + SCREEN_HEIGHT / 2;
if (data->draw_end >= SCREEN_HEIGHT)
data->draw_end = SCREEN_HEIGHT - 1;
if (data->side == 0)
data->wall_x = data->pos_y + data->perp_wall_dist * data->raydir_y;
else
data->wall_x = data->pos_x + data->perp_wall_dist * data->raydir_x;
data->wall_x -= floor(data->wall_x);
}
void ray_casting_2(t_data *data)
{
double camera_x;
camera_x = 2 * data->x / (double)SCREEN_WIDTH - 1;
data->raydir_x = data->dir_x + data->plane_x * camera_x;
data->raydir_y = data->dir_y + data->plane_y * camera_x;
data->map_x = (int)data->pos_x;
data->map_y = (int)data->pos_y;
if (data->raydir_x == 0)
data->delta_dist_x = 1e30;
else
data->delta_dist_x = fabs(1 / data->raydir_x);
if (data->raydir_y == 0)
data->delta_dist_y = 1e30;
else
data->delta_dist_y = fabs(1 / data->raydir_y);
data->hit = 0;
}
void ray_casting_3(t_data *data)
{
if (data->raydir_x < 0)
{
data->step_x = -1;
data->side_dist_x = (data->pos_x - data->map_x) * data->delta_dist_x;
}
else
{
data->step_x = 1;
data->side_dist_x = (data->map_x + 1.0 - data->pos_x)
* data->delta_dist_x;
}
if (data->raydir_y < 0)
{
data->step_y = -1;
data->side_dist_y = (data->pos_y - data->map_y) * data->delta_dist_y;
}
else
{
data->step_y = 1;
data->side_dist_y = (data->map_y + 1.0 - data->pos_y)
* data->delta_dist_y;
}
}
void ray_casting_4(t_data *data)
{
while (data->hit == 0)
{
if (data->side_dist_x < data->side_dist_y)
{
data->side_dist_x += data->delta_dist_x;
data->map_x += data->step_x;
data->side = 0;
}
else
{
data->side_dist_y += data->delta_dist_y;
data->map_y += data->step_y;
data->side = 1;
}
if (data->int_map[data->map_y][data->map_x] > 0)
data->hit = 1;
}
if (data->side == 0)
data->perp_wall_dist = (data->side_dist_x - data->delta_dist_x);
else
data->perp_wall_dist = (data->side_dist_y - data->delta_dist_y);
data->line_height = (int)(SCREEN_HEIGHT / data->perp_wall_dist);
}
int ray_casting(t_data *data)
{
data->x = -1;
while (++(data->x) < SCREEN_WIDTH)
{
ray_casting_2(data);
ray_casting_3(data);
ray_casting_4(data);
calc_wall_x(data);
data->tex_x = (int)(data->wall_x * (double)64);
data->step = 1.0 * 64 / data->line_height;
data->tex_pos = (data->draw_start - SCREEN_HEIGHT / 2
+ data->line_height / 2) * data->step;
data->y = 0;
while (data->y < SCREEN_HEIGHT)
{
calc_texture_pixel_color(data);
data->y++;
}
}
return (0);
}