/
fn_init_raycast.c
117 lines (111 loc) · 4.32 KB
/
fn_init_raycast.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
/* ************************************************************************** */
/* */
/* ::: :::::::: */
/* fn_init_raycast.c :+: :+: :+: */
/* +:+ +:+ +:+ */
/* By: melisha <melisha@student.42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2021/01/16 14:14:11 by melisha #+# #+# */
/* Updated: 2021/01/26 01:10:55 by melisha ### ########.fr */
/* */
/* ************************************************************************** */
#include "cub.h"
void fn_init_texpos(t_vars *obj)
{
if (obj->ray.raycast.side == 0)
obj->texture.wall = obj->player.pos_y
+ obj->ray.raycast.perp_wall_dist * obj->ray.dir_y;
else
obj->texture.wall =
obj->player.pos_x + obj->ray.raycast.perp_wall_dist * obj->ray.dir_x;
obj->texture.wall -= floor((obj->texture.wall));
obj->texture.tex_x =
(int)(obj->texture.wall * (double)(obj->texture.t_width));
if (obj->ray.raycast.side == 0 && obj->ray.dir_x > 0)
obj->texture.tex_x = obj->texture.t_width - obj->texture.tex_x - 1;
if (obj->ray.raycast.side == 1 && obj->ray.dir_y < 0)
obj->texture.tex_x = obj->texture.t_height - obj->texture.tex_x - 1;
obj->texture.step = 1.0 * obj->texture.t_width / obj->ray.raycast.lineh;
obj->texture.texpos = (obj->ray.raycast.start - obj->fill.r_two / 2 +
obj->ray.raycast.lineh / 2) * obj->texture.step;
}
void fn_raycast_init_before(t_vars *obj, int x)
{
obj->ray.dir_x = obj->player.dir_x + obj->ray.plane_x *
(2 * x / (double)obj->fill.r_one - 1);
obj->ray.dir_y = obj->player.dir_y + obj->ray.plane_y *
(2 * x / (double)obj->fill.r_one - 1);
obj->ray.raycast.map_x = (int)(obj->player.pos_x);
obj->ray.raycast.map_y = (int)(obj->player.pos_y);
obj->ray.raycast.delta_dist_x = sqrt(1 +
(obj->ray.dir_y * obj->ray.dir_y) / (obj->ray.dir_x * obj->ray.dir_x));
obj->ray.raycast.delta_dist_y = sqrt(1 +
(obj->ray.dir_x * obj->ray.dir_x) / (obj->ray.dir_y * obj->ray.dir_y));
obj->ray.raycast.hit = 0;
}
void fn_raycast_init_after(t_vars *obj)
{
if (obj->ray.raycast.side == 0)
obj->ray.raycast.perp_wall_dist = (obj->ray.raycast.map_x -
obj->player.pos_x + (1 - obj->ray.raycast.step_x) / 2) / obj->ray.dir_x;
else
obj->ray.raycast.perp_wall_dist = (obj->ray.raycast.map_y -
obj->player.pos_y + (1 - obj->ray.raycast.step_y) / 2) / obj->ray.dir_y;
obj->ray.raycast.lineh =
(int)(obj->fill.r_two / obj->ray.raycast.perp_wall_dist);
obj->ray.raycast.start =
((-obj->ray.raycast.lineh / 2) + obj->fill.r_two / 2);
if (obj->ray.raycast.start < 0)
obj->ray.raycast.start = 0;
obj->ray.raycast.end = (obj->ray.raycast.lineh / 2) + (obj->fill.r_two / 2);
if (obj->ray.raycast.end >= obj->fill.r_two)
obj->ray.raycast.end = obj->fill.r_two - 1;
}
void fn_raycast_init_dir_r(t_vars *obj)
{
if (obj->ray.dir_x < 0)
{
obj->ray.raycast.step_x = -1;
obj->ray.raycast.side_dist_x = (obj->player.pos_x -
obj->ray.raycast.map_x) * obj->ray.raycast.delta_dist_x;
}
else
{
obj->ray.raycast.step_x = 1;
obj->ray.raycast.side_dist_x = (obj->ray.raycast.map_x +
1.0 - obj->player.pos_x) * obj->ray.raycast.delta_dist_x;
}
if (obj->ray.dir_y < 0)
{
obj->ray.raycast.step_y = -1;
obj->ray.raycast.side_dist_y = (obj->player.pos_y -
obj->ray.raycast.map_y) * obj->ray.raycast.delta_dist_y;
}
else
{
obj->ray.raycast.step_y = 1;
obj->ray.raycast.side_dist_y = (obj->ray.raycast.map_y +
1.0 - obj->player.pos_y) * obj->ray.raycast.delta_dist_y;
}
}
void fn_raycast_init_hit(t_vars *obj)
{
while (obj->ray.raycast.hit == 0)
{
if (obj->ray.raycast.side_dist_x < obj->ray.raycast.side_dist_y)
{
obj->ray.raycast.side_dist_x += obj->ray.raycast.delta_dist_x;
obj->ray.raycast.map_x += obj->ray.raycast.step_x;
obj->ray.raycast.side = 0;
}
else
{
obj->ray.raycast.side_dist_y += obj->ray.raycast.delta_dist_y;
obj->ray.raycast.map_y += obj->ray.raycast.step_y;
obj->ray.raycast.side = 1;
}
if (obj->fill.map[obj->ray.raycast.map_y]
[obj->ray.raycast.map_x] == '1')
obj->ray.raycast.hit = 1;
}
}