minecraft

minecraft
git clone git://git.evenfri.pw/minecraft.git
Log | Files | Refs | README

camera.c (2492B)


      1 #include <math.h>
      2 #include "minecraft.h"
      3 
      4 Camera camera;
      5 
      6 void camera_update_vectors(void) {
      7   float yr = camera.yaw * PI / 180.0f;
      8   float pr = camera.pitch * PI / 180.0f;
      9 
     10   vec3 front;
     11   front.x = cosf(yr) * cosf(pr);
     12   front.y = sinf(pr);
     13   front.z = sinf(yr) * cosf(pr);
     14 
     15   camera.front = vec3_norm(front);
     16   camera.right = vec3_norm(vec3_cross(camera.front, camera.world_up));
     17   camera.up = vec3_norm(vec3_cross(camera.right, camera.front));
     18 }
     19 
     20 void camera_init(vec3 position) {
     21   camera.position = position;
     22   camera.world_up = vec3_make(0.0f, 1.0f, 0.0f);
     23   camera.yaw = 0.0f;
     24   camera.pitch = 0.0f;
     25   camera.speed = CAMERA_SPEED;
     26   camera.sensitivity = CAMERA_SENSITIVITY;
     27   camera.fov = CAMERA_FOV;
     28   camera_update_vectors();
     29 }
     30 
     31 mat4 camera_get_view(void) {
     32   vec3 f = vec3_norm(camera.front);
     33   vec3 s = vec3_norm(vec3_cross(f, camera.up));
     34   vec3 u = vec3_cross(s, f);
     35   vec3 e = camera.position;
     36 
     37   mat4 v;
     38   v.m[0] = s.x; v.m[4] = s.y; v.m[8] = s.z; v.m[12] = -vec3_dot(s, e);
     39   v.m[1] = u.x; v.m[5] = u.y; v.m[9] = u.z; v.m[13] = -vec3_dot(u, e);
     40   v.m[2] = -f.x; v.m[6] = -f.y; v.m[10] = -f.z; v.m[14] = vec3_dot(f, e);
     41   v.m[3] = 0.0f; v.m[7] = 0.0f; v.m[11] = 0.0f; v.m[15] = 1.0f;
     42   return v;
     43 }
     44 
     45 void camera_process_keyboard(float dt) {
     46   float v = camera.speed * dt;
     47 
     48   if (glfwGetKey(Window, GLFW_KEY_E) == GLFW_PRESS) {
     49     camera.position.x += camera.front.x * v;
     50     camera.position.y += camera.front.y * v;
     51     camera.position.z += camera.front.z * v;
     52   }
     53   if (glfwGetKey(Window, GLFW_KEY_D) == GLFW_PRESS) {
     54     camera.position.x -= camera.front.x * v;
     55     camera.position.y -= camera.front.y * v;
     56     camera.position.z -= camera.front.z * v;
     57   }
     58   if (glfwGetKey(Window, GLFW_KEY_S) == GLFW_PRESS) {
     59     camera.position.x -= camera.right.x * v;
     60     camera.position.y -= camera.right.y * v;
     61     camera.position.z -= camera.right.z * v;
     62   }
     63   if (glfwGetKey(Window, GLFW_KEY_F) == GLFW_PRESS) {
     64     camera.position.x += camera.right.x * v;
     65     camera.position.y += camera.right.y * v;
     66     camera.position.z += camera.right.z * v;
     67   }
     68   if (glfwGetKey(Window, GLFW_KEY_SPACE) == GLFW_PRESS)
     69     camera.position.y += v;
     70   if (glfwGetKey(Window, GLFW_KEY_Z) == GLFW_PRESS)
     71     camera.position.y -= v;
     72 }
     73 
     74 void camera_process_mouse(float dx, float dy) {
     75   camera.yaw += dx * camera.sensitivity;
     76   camera.pitch += dy * camera.sensitivity;
     77 
     78   if (camera.pitch > 89.0f) camera.pitch = 89.0f;
     79   if (camera.pitch < -89.0f) camera.pitch = -89.0f;
     80 
     81   camera_update_vectors();
     82 }