1#include <zen/camera/ZEN_Camera.h>
4#include <glm/ext/matrix_clip_space.hpp>
5#include <glm/ext/matrix_transform.hpp>
8 Camera::Camera(CameraType type) : m_cameraType(type) {
14 void Camera::setCameraType(CameraType type) {
20 void Camera::setPerspective(
float fov,
float aspect,
float near,
float far) {
21 m_cameraType = CameraType::Perspective;
23 m_aspectRatio = aspect;
29 void Camera::setOrthographic(
float left,
float right,
float bottom,
float top) {
30 m_cameraType = CameraType::Orthographic;
33 m_orthoBottom = bottom;
38 void Camera::setAspectRatio(
float aspect) {
39 m_aspectRatio = aspect;
40 if (m_cameraType == CameraType::Perspective) {
45 void Camera::setClip(
float near,
float far) {
48 if (m_cameraType == CameraType::Perspective) {
53 void Camera::setPosition(
const glm::vec3 &position) {
54 m_position = position;
58 void Camera::setRotation(
float yaw,
float pitch,
float roll) {
67 void Camera::setSpeed(
float speed) { m_cameraSpeed = speed; }
69 void Camera::setSensitivity(
float sensitivity) { m_cameraSensitivity = sensitivity; }
71 CameraType Camera::type()
const {
return m_cameraType; }
73 const glm::vec3 &Camera::position()
const {
return m_position; }
75 glm::vec3 Camera::rotation()
const {
return {m_yaw, m_pitch, m_roll}; }
77 float Camera::speed()
const {
return m_cameraSpeed; }
79 float Camera::sensitivity()
const {
return m_cameraSensitivity; }
81 float Camera::aspectRatio()
const {
return m_aspectRatio; }
83 const glm::mat4 &Camera::projectionMatrix()
const {
return m_projection; }
85 const glm::mat4 &Camera::viewMatrix()
const {
return m_view; }
87 glm::mat4 Camera::viewProjectionMatrix()
const {
return m_projection * m_view; }
89 void Camera::updateProjection() {
90 if (m_cameraType == CameraType::Perspective) {
91 m_projection = glm::perspective(glm::radians(m_fov), m_aspectRatio, m_near, m_far);
93 m_projection = glm::ortho(m_orthoLeft, m_orthoRight, m_orthoBottom, m_orthoTop, -1.0f, 1.0f);
97 void Camera::updateView() {
98 if (m_cameraType == CameraType::Orthographic) {
100 glm::mat4 translate = glm::translate(glm::mat4(1.0f), m_position);
101 glm::mat4 roll = glm::rotate(glm::mat4(1.0f), glm::radians(m_roll), glm::vec3(0, 0, 1));
103 m_view = glm::inverse(translate * roll);
106 const glm::vec3 target = m_position + m_front;
108 m_view = glm::lookAt(m_position, target, m_up);
112 void Camera::updateDirection() {
113 const float yaw = glm::radians(m_yaw);
114 const float pitch = glm::radians(m_pitch);
117 front.x = std::cos(yaw) * std::cos(pitch);
118 front.y = std::sin(pitch);
119 front.z = std::sin(yaw) * std::cos(pitch);
120 m_front = glm::normalize(front);
122 m_right = glm::normalize(glm::cross(m_front, m_worldUp));
123 m_up = glm::normalize(glm::cross(m_right, m_front));
126 void Camera::clampPitch() {
127 m_pitch = std::min(m_pitch, 89.0f);
128 m_pitch = std::max(m_pitch, -89.0f);