diff --git a/LearnOpenGL/Camera.h b/LearnOpenGL/Camera.h index 61571c9bfade79d542aafbbff92a3271043f3e4c..2ce75658fdd3a34590f521e75b1e46830c5bb2bb 100644 --- a/LearnOpenGL/Camera.h +++ b/LearnOpenGL/Camera.h @@ -1,10 +1,7 @@ #ifndef CAMERA_H #define CAMERA_H -#include <glm/glm.hpp> -#include <glm/gtc/matrix_transform.hpp> - -#include <vector> +#include "Transform.h" // Defines several possible options for camera movement. Used as abstraction to stay away from window-system specific input methods enum Camera_Movement { @@ -21,64 +18,62 @@ const float SPEED = 10.0f; const float SENSITIVITY = 0.1f; const float ZOOM = 45.0f; -// An abstract camera class that processes input and calculates the corresponding Euler Angles, Vectors and Matrices for use in OpenGL class Camera { public: - // Camera Attributes + Transform transform; + glm::vec3 Position; glm::vec3 Front; - glm::vec3 Up; - glm::vec3 Right; glm::vec3 WorldUp; - // Euler Angles + float Yaw; float Pitch; - // Camera options + float MovementSpeed; float MouseSensitivity; float Zoom; - // Constructor with vectors Camera(glm::vec3 position = glm::vec3(0.0f, 0.0f, 0.0f), glm::vec3 up = glm::vec3(0.0f, 1.0f, 0.0f), float yaw = YAW, float pitch = PITCH) : Front(glm::vec3(0.0f, 0.0f, -1.0f)), MovementSpeed(SPEED), MouseSensitivity(SENSITIVITY), Zoom(ZOOM) { - Position = position; + transform.set_translate(position); + WorldUp = up; Yaw = yaw; Pitch = pitch; - updateCameraVectors(); + + transform.set_rotate(glm::vec3(PITCH, YAW, 0)); } - // Constructor with scalar values + Camera(float posX, float posY, float posZ, float upX, float upY, float upZ, float yaw, float pitch) : Front(glm::vec3(0.0f, 0.0f, -1.0f)), MovementSpeed(SPEED), MouseSensitivity(SENSITIVITY), Zoom(ZOOM) { - Position = glm::vec3(posX, posY, posZ); + transform.set_translate(glm::vec3(posX, posY, posZ)); + WorldUp = glm::vec3(upX, upY, upZ); Yaw = yaw; Pitch = pitch; - updateCameraVectors(); + + transform.set_rotate(glm::vec3(PITCH, YAW, 0)); } - // Returns the view matrix calculated using Euler Angles and the LookAt Matrix glm::mat4 GetViewMatrix() { - return glm::lookAt(Position, Position + Front, Up); + return glm::lookAt(transform.get_translate(), transform.get_translate() + transform.get_front(), transform.get_up()); } - // Processes input received from any keyboard-like input system. Accepts input parameter in the form of camera defined ENUM (to abstract it from windowing systems) void ProcessKeyboard(Camera_Movement direction, float deltaTime) { float velocity = MovementSpeed * deltaTime; if (direction == FORWARD) - Position += Front * velocity; + transform.set_translate(transform.get_translate() += transform.get_front() * velocity); if (direction == BACKWARD) - Position -= Front * velocity; + transform.set_translate(transform.get_translate() -= transform.get_front() * velocity); if (direction == LEFT) - Position -= Right * velocity; + transform.set_translate(transform.get_translate() -= transform.get_right() * velocity); if (direction == RIGHT) - Position += Right * velocity; + transform.set_translate(transform.get_translate() += transform.get_right() * velocity); } - // Processes input received from a mouse input system. Expects the offset value in both the x and y direction. void ProcessMouseMovement(float xoffset, float yoffset, bool constrainPitch = true) { xoffset *= MouseSensitivity; @@ -87,7 +82,6 @@ public: Yaw += xoffset; Pitch += yoffset; - // Make sure that when pitch is out of bounds, screen doesn't get flipped if (constrainPitch) { if (Pitch > 89.0f) @@ -95,12 +89,9 @@ public: if (Pitch < -89.0f) Pitch = -89.0f; } - - // Update Front, Right and Up Vectors using the updated Euler angles - updateCameraVectors(); + transform.set_rotate(glm::vec3(Pitch, Yaw, 0)); } - // Processes input received from a mouse scroll-wheel event. Only requires input on the vertical wheel-axis void ProcessMouseScroll(float yoffset) { if (Zoom >= 1.0f && Zoom <= 45.0f) @@ -110,20 +101,5 @@ public: if (Zoom >= 45.0f) Zoom = 45.0f; } - -private: - // Calculates the front vector from the Camera's (updated) Euler Angles - void updateCameraVectors() - { - // Calculate the new Front vector - glm::vec3 front; - front.x = cos(glm::radians(Yaw)) * cos(glm::radians(Pitch)); - front.y = sin(glm::radians(Pitch)); - front.z = sin(glm::radians(Yaw)) * cos(glm::radians(Pitch)); - Front = glm::normalize(front); - // Also re-calculate the Right and Up vector - Right = glm::normalize(glm::cross(Front, WorldUp)); // Normalize the vectors, because their length gets closer to 0 the more you look up or down which results in slower movement. - Up = glm::normalize(glm::cross(Right, Front)); - } }; #endif \ No newline at end of file