#include "camera.h" Camera::Camera() { this->width = Window::width; this->height = Window::height; this->field_of_view = glm::radians(80.0f); this->projection_matrix = glm::perspective( this->field_of_view, (float)this->width / (float)this->height, 0.1f, 1000.0f ); Window::current_window->register_resize_callback((void(*)(void*, int, int))&Camera::update_projection_matrix, this); } void Camera::update_projection_matrix(int width, int height) { this->width = width; this->height = height; this->projection_matrix = glm::perspective( this->field_of_view, (float)this->width / (float)this->height, 0.1f, 1000.0f ); } glm::mat4 Camera::get_projection_matrix() { return this->projection_matrix; } glm::mat4 Camera::get_view_matrix() { glm::mat4 r1Matrix = glm::rotate(-this->rotation.x, glm::vec3(1, 0, 0)); glm::mat4 r2Matrix = glm::rotate(-this->rotation.y, glm::vec3(0, 1, 0)); glm::mat4 r3Matrix = glm::rotate(-this->rotation.z, glm::vec3(0, 0, 1)); glm::mat4 tMatrix = glm::translate(glm::mat4(1.0f), -this->position); return r1Matrix * r2Matrix * r3Matrix * tMatrix; } glm::vec3 Camera::get_position() { return this->position; } void Camera::set_position(glm::vec3 position) { this->position = position; } void Camera::change_position_by(glm::vec3 position) { this->position += position; } glm::vec3 Camera::get_rotation() { return this->rotation; } void Camera::set_rotation(glm::vec3 rotation) { this->rotation = rotation; } void Camera::change_rotation_by(glm::vec3 rotation) { this->rotation += rotation; } void Camera::move_by(glm::vec3 position) { glm::vec3 forward( glm::cos(-this->rotation.x) * glm::sin(this->rotation.y), glm::sin(-this->rotation.x), glm::cos(-this->rotation.x) * glm::cos(this->rotation.y) ); glm::vec3 right( glm::sin(this->rotation.y + 1.57f), 0, glm::cos(this->rotation.y + 1.57f) ); glm::vec3 up = -glm::cross(right, forward); this->position += right * position.x; this->position += up * position.y; this->position += forward * position.z; }