]> git.lizzy.rs Git - dragonblocks_alpha.git/blob - src/client/camera.c
Redesign file structure and graphics pipeline; add font rendering
[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 vec3 world_up = {0.0f, 1.0f, 0.0f};
12
13 struct camera_movement_dirs camera_movement_dirs;
14
15 static void camera_update()
16 {
17         vec3 center;
18         vec3_add(center, camera.eye, camera.front);
19
20         mat4x4_look_at(camera.view, camera.eye, center, camera.up);
21 }
22
23 void camera_enable(GLint loc_view)
24 {
25         glUniformMatrix4fv(loc_view, 1, GL_FALSE, camera.view[0]);
26 }
27
28 void camera_set_position(v3f pos)
29 {
30         camera.eye[0] = pos.x;
31         camera.eye[1] = pos.y;
32         camera.eye[2] = pos.z;
33
34         camera_update();
35 }
36
37 void camera_set_angle(f32 yaw, f32 pitch)
38 {
39         camera.front[0] = camera_movement_dirs.front[0] = cos(yaw) * cos(pitch);
40         camera.front[1] = sin(pitch);
41         camera.front[2] = camera_movement_dirs.front[2] = sin(yaw) * cos(pitch);
42
43         vec3_norm(camera.front, camera.front);
44         vec3_norm(camera_movement_dirs.front, camera_movement_dirs.front);
45
46         vec3_mul_cross(camera.right, camera.front, world_up);
47         camera_movement_dirs.right[0] = camera.right[0];
48         camera_movement_dirs.right[2] = camera.right[2];
49
50         vec3_norm(camera.right, camera.right);
51         vec3_norm(camera_movement_dirs.right, camera_movement_dirs.right);
52
53         vec3_mul_cross(camera.up, camera.right, camera.front);
54         vec3_norm(camera.up, camera.up);
55
56         camera_update();
57 }