From 5ccf499a04871129cb188f0ab7c376716a87c823 Mon Sep 17 00:00:00 2001 From: Joursoir Date: Fri, 2 Apr 2021 16:09:59 +0000 Subject: add camera subsystem --- src/graphics/Camera.cpp | 90 +++++++++++++++++++++++++++++++++++++++++++++++++ src/graphics/Camera.hpp | 49 +++++++++++++++++++++++++++ 2 files changed, 139 insertions(+) create mode 100644 src/graphics/Camera.cpp create mode 100644 src/graphics/Camera.hpp diff --git a/src/graphics/Camera.cpp b/src/graphics/Camera.cpp new file mode 100644 index 0000000..2058d5e --- /dev/null +++ b/src/graphics/Camera.cpp @@ -0,0 +1,90 @@ +#include + +#include "Camera.hpp" +using namespace glm; + +Camera::Camera(vec3 a_pos, vec3 a_front, vec3 a_up, + GLfloat a_yaw, GLfloat a_pitch) + : move_speed(init_speed), + mouse_sensitivity(init_sensitivity), + fov(init_fov) +{ + position = a_pos; + up = a_up; + world_up = up; + yaw = a_yaw; + pitch = a_pitch; + UpdateVectors(); +} + +mat4 Camera::GetProjViewMatrix(int w_width, int w_height) +{ + return + perspective(fov, (GLfloat)w_width / (GLfloat)w_height, 0.1f, 100.0f) * + lookAt(position, position + front, up); +} + +mat4 Camera::GetSkyboxMatrix(int w_width, int w_height) +{ + return + perspective(fov, (GLfloat)w_width / (GLfloat)w_height, 0.1f, 100.0f) * + mat4(mat3(lookAt(position, position + front, up))); +} + +void Camera::Movement(camera_move direction, GLfloat delta_time) +{ + GLfloat velocity; + velocity = move_speed * delta_time; + switch(direction) { + case FORWARD: + position += front * velocity; + break; + case BACKWARD: + position -= front * velocity; + break; + case LEFT: + position -= right * velocity; + break; + case RIGHT: + position += right * velocity; + break; + } + UpdateVectors(); +} + +void Camera::View(GLfloat delta_x, GLfloat delta_y) +{ + yaw += delta_x * mouse_sensitivity; + pitch -= delta_y * mouse_sensitivity; // if '+' then inverse + + if(pitch > 89.0f) + pitch = 89.0f; + else if(pitch < -89.0f) + pitch = -89.0f; + + UpdateVectors(); +} + +void Camera::Fov(GLfloat delta_y) +{ + if(!delta_y) + return; + + fov -= radians(delta_y); + if(fov > radians(45.0f)) + fov = radians(45.0f); + else if(fov < radians(1.0f)) + fov = radians(1.0f); +} + +void Camera::UpdateVectors() +{ + front.x = cos(radians(yaw)) * cos(radians(pitch)); + front.y = sin(radians(pitch)); + front.z = sin(radians(yaw)) * cos(radians(pitch)); + + /* Normalize the vectors, because their length gets closer to 0 + the more you look up or down which results in slower movement. */ + right = normalize(cross(front, world_up)); + up = normalize(cross(right, front)); +} diff --git a/src/graphics/Camera.hpp b/src/graphics/Camera.hpp new file mode 100644 index 0000000..6182b5f --- /dev/null +++ b/src/graphics/Camera.hpp @@ -0,0 +1,49 @@ +#ifndef ENGINE_CAMERA_H +#define ENGINE_CAMERA_H + +#include +#include + +enum camera_move { + FORWARD, + BACKWARD, + LEFT, + RIGHT +}; + +const GLfloat + init_yaw = -90.0f, + init_pitch = 0.0f, + init_speed = 2.5f, + init_sensitivity = 0.25f, + init_fov = glm::radians(45.0f); + +class Camera { + glm::vec3 position; + glm::vec3 front; + glm::vec3 up; + glm::vec3 right; + glm::vec3 world_up; + + GLfloat yaw; // around x + GLfloat pitch; // around y + + GLfloat move_speed; + GLfloat mouse_sensitivity; + GLfloat fov; +public: + Camera(glm::vec3 a_pos = glm::vec3(0.0f, 0.0f, 5.0f), + glm::vec3 a_front = glm::vec3(0.0f, 0.0f, -1.0f), + glm::vec3 a_up = glm::vec3(0.0f, 1.0f, 0.0f), + GLfloat a_yaw = init_yaw, GLfloat a_pitch = init_pitch); + + glm::mat4 GetProjViewMatrix(int w_width, int w_height); + glm::mat4 GetSkyboxMatrix(int w_width, int w_height); + void Movement(camera_move direction, GLfloat deltaTime); + void View(GLfloat delta_x, GLfloat delta_y); + void Fov(GLfloat delta_y); +private: + void UpdateVectors(); +}; + +#endif /* ENGINE_CAMERA_H */ -- cgit v1.2.3-18-g5258