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