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