diff --git a/inc/camera.hpp b/inc/camera.hpp index 178e533..6f9e0fe 100755 --- a/inc/camera.hpp +++ b/inc/camera.hpp @@ -9,23 +9,37 @@ struct GLFWwindow; class Camera { private: - int screenWidth; - int screenHeight; + int width; + int height; double mousePosX; double mousePosY; + // first mouse detection bool firstMouse = true; - float cameraYaw; - float cameraPitch; + float cameraYaw = -90.f; // horizontal angle + float cameraPitch = 10.f; // vertical angle - glm::vec3 cameraFront; + // front camera vector (where the camera is pointed.) + glm::vec3 cameraFront = glm::vec3(0.f, 0.f, -1.f); + // up world vector (absolute up pos) + glm::vec3 worldUp = glm::vec3(0.f, 1.f, 0.f); + + // up camera vector (relative up from the camera) glm::vec3 cameraUp; + // right camera vector (relative right from the camera) glm::vec3 cameraRight; - glm::vec3 worldUp; + // camera position + glm::vec3 cameraPosition = glm::vec3(0.f, 0.f, 0.f); + + // glfw window GLFWwindow* window; + float speed = 3.f; // move speed + float cameraSensitivity; // mouse sensitivity + float fov = 45.f; // Field Of View + void processInput(float deltaTime); void processMouseMovement(); void updateCameraVectors(); @@ -34,13 +48,21 @@ class Camera Camera(int width, int height, GLFWwindow* window, float sensitivity); void update(float deltaTime); - glm::mat4 getViewMatrix(); - float speed; - float cameraSensitivity; - float fov; + // view matrix + glm::mat4 getViewMatrix() const; + // projection matrix + glm::mat4 getProjectionMatrix() const; - glm::vec3 cameraPosition; + float getFov() const { return fov; } + float getSpeed() const { return speed; } + float getCameraSensitivity() const { return cameraSensitivity; } + glm::vec3 getPosition() const { return cameraPosition; } + + void setSpeed(float newSpeed); + void setCameraSensitivity(float newSensitivity); + void setFov(float newFov); + void setPosition(const glm::vec3& newPosition); }; #endif diff --git a/src/camera.cpp b/src/camera.cpp index 7f6ebd6..886227e 100755 --- a/src/camera.cpp +++ b/src/camera.cpp @@ -4,18 +4,10 @@ #include Camera::Camera(int width, int height, GLFWwindow* window, float sensitivity) - : screenWidth(width), - screenHeight(height), + : width(width), + height(height), window(window), - cameraYaw(-90.0f), - cameraPitch(10.0f), - speed(3.0f), - cameraSensitivity(sensitivity), - fov(45.0f), - cameraPosition(0.0f, 0.0f, 0.0f), - cameraFront(0.0f, 0.0f, -1.0f), - worldUp(0.0f, 1.0f, 0.0f), - firstMouse(true) + cameraSensitivity(sensitivity) { glfwSetInputMode(window, GLFW_CURSOR, GLFW_CURSOR_DISABLED); updateCameraVectors(); @@ -28,6 +20,7 @@ void Camera::update(float deltaTime) updateCameraVectors(); } +// TODO: callback management void Camera::processInput(float deltaTime) { float velocity = speed * deltaTime; @@ -97,7 +90,44 @@ void Camera::updateCameraVectors() cameraUp = glm::normalize(glm::cross(cameraRight, cameraFront)); } -glm::mat4 Camera::getViewMatrix() +glm::mat4 Camera::getViewMatrix() const { return glm::lookAt(cameraPosition, cameraPosition + cameraFront, cameraUp); } + +glm::mat4 Camera::getProjectionMatrix() const +{ + return glm::perspective( + glm::radians(this->fov), + static_cast(this->width) / static_cast(this->height), 0.1f, + 100.0f); +} + +void Camera::setSpeed(float newSpeed) +{ + if (newSpeed > 0.0f) + { + speed = newSpeed; + } +} + +void Camera::setCameraSensitivity(float newSensitivity) +{ + if (newSensitivity > 0.0f) + { + cameraSensitivity = newSensitivity; + } +} + +void Camera::setFov(float newFov) +{ + if (newFov > 1.0f && newFov < 179.0f) + { + fov = newFov; + } +} + +void Camera::setPosition(const glm::vec3& newPosition) +{ + cameraPosition = newPosition; +} \ No newline at end of file