// Voxspatium Engine - Voxel Planets engine // Copyright (C) 2018 Evert "Diamond" Prants // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . #ifndef __CAMERA_H__ #define __CAMERA_H__ #include "util/Common.h" #include "Shader.h" // Defines several possible options for camera movement. Used as abstraction to stay away from window-system specific input methods enum Camera_Movement { FORWARD, BACKWARD, LEFT, RIGHT }; // Default camera values const GLfloat YAW = -90.0f; const GLfloat PITCH = 0.0f; const GLfloat ROLL = 0.0f; const GLfloat SPEED = 100.0f; const GLfloat SENSITIVTY = 0.25f; const GLfloat ZOOM = 45.0f; class Camera { public: Camera(glm::vec3 position = glm::vec3(0.0f, 0.0f, 0.0f), glm::vec3 up = glm::vec3(0.0f, 1.0f, 0.0f), GLfloat yaw = YAW, GLfloat pitch = PITCH, GLfloat roll = ROLL); Camera(GLfloat posX, GLfloat posY, GLfloat posZ, GLfloat upX, GLfloat upY, GLfloat upZ, GLfloat yaw, GLfloat pitch, GLfloat roll); ~Camera(); glm::mat4 getViewMatrix(void); void processKeyboard(Camera_Movement direction, GLfloat deltaTime); void processMouseMovement(GLfloat xoffset, GLfloat yoffset, GLboolean constrainPitch); void processMouseScroll(GLfloat yoffset); void shaderViewProjection(Shader& shader); inline GLfloat getFOV() const { return m_zoom; } inline glm::vec3 getPosition(void) const { return m_position; } bool frustumContainsPoint(const glm::vec3 &point) const; int frustumContainsSphere(const glm::vec3 &position, const double radius) const; int frustumContainsBox(const glm::vec3 &min, const glm::vec3 &max) const; int frustumContainsPolygon(const std::vector &points) const; void updateFrustum(glm::mat4 modelMatrix); private: glm::vec3 m_position; glm::vec3 m_front; glm::vec3 m_up; glm::vec3 m_right; glm::vec3 m_worldUp; // Eular Angles GLfloat m_yaw; GLfloat m_pitch; GLfloat m_roll; // Camera options GLfloat m_movementSpeed; GLfloat m_mouseSensitivity; GLfloat m_zoom; // The Projection Matrix glm::mat4 m_projection; // Frustum Culling glm::vec4 m_planes[6]; float frustumDistanceToPlane(const int plane, const glm::vec3 &point) const; void updateCameraVectors(void); void updateProjection(void); }; #endif // __CAMERA_H__