]> git.lizzy.rs Git - dragonblocks_alpha.git/blob - src/client/camera.c
Add items
[dragonblocks_alpha.git] / src / client / camera.c
1 #include <math.h>
2 #include "client/camera.h"
3
4 struct Camera camera;
5
6 static const vec3 world_up = {0.0f, 1.0f, 0.0f};
7
8 static void camera_update()
9 {
10         vec3 center;
11         vec3_add(center, camera.eye, camera.front);
12
13         mat4x4_look_at(camera.view, camera.eye, center, camera.up);
14 }
15
16 void camera_init()
17 {
18         camera_set_position((v3f32) {0.0f, 0.0f, 0.0f});
19         camera_set_angle(0.0f, 0.0f);
20 }
21
22 void camera_set_position(v3f32 pos)
23 {
24         camera.eye[0] = pos.x;
25         camera.eye[1] = pos.y;
26         camera.eye[2] = pos.z;
27
28         camera_update();
29 }
30
31 void camera_set_angle(f32 yaw, f32 pitch)
32 {
33         camera.front[0] = camera.movement_dirs.front[0] = cos(yaw) * cos(pitch);
34         camera.front[1] = sin(pitch);
35         camera.front[2] = camera.movement_dirs.front[2] = sin(yaw) * cos(pitch);
36
37         vec3_norm(camera.front, camera.front);
38         vec3_norm(camera.movement_dirs.front, camera.movement_dirs.front);
39
40         vec3_mul_cross(camera.right, camera.front, world_up);
41         camera.movement_dirs.right[0] = camera.right[0];
42         camera.movement_dirs.right[2] = camera.right[2];
43
44         vec3_norm(camera.right, camera.right);
45         vec3_norm(camera.movement_dirs.right, camera.movement_dirs.right);
46
47         vec3_mul_cross(camera.up, camera.right, camera.front);
48         vec3_norm(camera.up, camera.up);
49
50         camera.movement_dirs.up[0] = world_up[0];
51         camera.movement_dirs.up[1] = world_up[1];
52         camera.movement_dirs.up[2] = world_up[2];
53
54         camera_update();
55 }