-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathcalculator.c
More file actions
120 lines (114 loc) · 3.52 KB
/
calculator.c
File metadata and controls
120 lines (114 loc) · 3.52 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
/* ************************************************************************** */
/* */
/* ::: :::::::: */
/* calculator.c :+: :+: :+: */
/* +:+ +:+ +:+ */
/* By: bkarlida <bkarlida@student.42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2023/08/23 14:33:21 by bkarlida #+# #+# */
/* Updated: 2023/09/03 15:48:49 by bkarlida ### ########.fr */
/* */
/* ************************************************************************** */
#include "cub3d.h"
void calc_frame_init(t_cub3d *game)
{
game->camera_x = 2 * game->x / (double)WIDTH - 1;
game->ray_dir_x = game->player.dir_x + game->player.plane_x
* game->camera_x;
game->ray_dir_y = game->player.dir_y + game->player.plane_y
* game->camera_x;
game->map_x = (int)game->player.x;
game->map_y = (int)game->player.y;
if (game->ray_dir_x == 0)
game->delta_dist_x = 1e30;
else
game->delta_dist_x = fabs(1 / game->ray_dir_x);
if (game->ray_dir_y == 0)
game->delta_dist_y = 1e30;
else
game->delta_dist_y = fabs(1 / game->ray_dir_y);
game->hit = 0;
}
void calc_side_dist(t_cub3d *game)
{
if (game->ray_dir_x < 0)
{
game->step_x = -1;
game->side_dist_x = (game->player.x - game->map_x) * game->delta_dist_x;
}
else
{
game->step_x = 1;
game->side_dist_x = (game->map_x + 1.0 - game->player.x)
* game->delta_dist_x;
}
if (game->ray_dir_y < 0)
{
game->step_y = -1;
game->side_dist_y = (game->player.y - game->map_y) * game->delta_dist_y;
}
else
{
game->step_y = 1;
game->side_dist_y = (game->map_y + 1.0 - game->player.y)
* game->delta_dist_y;
}
}
void calc_wall_height(t_cub3d *game)
{
while (game->hit == 0)
{
if (game->side_dist_x < game->side_dist_y)
{
game->side_dist_x += game->delta_dist_x;
game->map_x += game->step_x;
game->side = 0;
}
else
{
game->side_dist_y += game->delta_dist_y;
game->map_y += game->step_y;
game->side = 1;
}
if (game->b_map[game->map_y][game->map_x] > '0')
game->hit = 1;
}
if (game->side == 0)
game->perp_wall_dist = (game->side_dist_x - game->delta_dist_x);
else
game->perp_wall_dist = (game->side_dist_y - game->delta_dist_y);
game->line_height = (int)(HEIGHT / game->perp_wall_dist);
}
void calc_wall_x(t_cub3d *game)
{
game->draw_start = -game->line_height / 2 + HEIGHT / 2;
if (game->draw_start < 0)
game->draw_start = 0;
game->draw_end = game->line_height / 2 + HEIGHT / 2;
if (game->draw_end >= HEIGHT)
game->draw_end = HEIGHT - 1;
if (game->side == 0)
game->wall_x = game->player.y + game->perp_wall_dist * game->ray_dir_y;
else
game->wall_x = game->player.x + game->perp_wall_dist * game->ray_dir_x;
game->wall_x -= floor(game->wall_x);
}
void game_arithmetic(t_cub3d *game)
{
game->x = -1;
mlx_clear_window(game->mlx, game->img.window);
while (++(game->x) < WIDTH)
{
calc_frame_init(game);
calc_side_dist(game);
calc_wall_height(game);
calc_wall_x(game);
game->tex_x = (int)(game->wall_x * (double)TEX_W);
game->step = 1.0 * TEX_H / game->line_height;
game->tex_pos = (game->draw_start - HEIGHT / 2 + game->line_height / 2)
* game->step;
game->y = -1;
while (++game->y < HEIGHT)
calc_texture_pixel_color(game);
}
}