Diggler/src/Camera.cpp

67 lines
1.3 KiB
C++

#include "Camera.hpp"
#include <glm/gtc/matrix_transform.hpp>
#include <glm/gtx/rotate_vector.hpp>
namespace diggler {
Camera::Camera() {
m_worldUp = vec3(0, 1, 0);
update();
}
void Camera::setProjection(const mat4& m) {
m_projMatrix = m;
update();
}
void Camera::setPersp(float rad, float ratio, float near, float far) {
frustum.setCamInternals(rad, ratio, near, far);
setProjection(glm::perspective(rad, ratio, near, far));
}
void Camera::lookAt(const vec3& l) {
m_lookAt = l;
update();
}
void Camera::lookAtAbs(const vec3& l) {
m_lookAt = m_position - l;
update();
}
void Camera::setPosition(const vec3& p) {
m_position = p;
update();
}
void Camera::update() {
m_viewMatrix = glm::lookAt(m_position, m_position + m_lookAt, m_worldUp);
frustum.setCamDef(m_position, m_position + m_lookAt, m_worldUp);
m_up = glm::normalize(glm::cross(glm::cross(m_lookAt, m_worldUp), m_lookAt));
m_pvMatrix = m_projMatrix * m_viewMatrix;
m_skyMatrix = m_projMatrix * glm::lookAt(vec3(), m_lookAt, m_worldUp);
}
const mat4& Camera::getVMatrix() const {
return m_viewMatrix;
}
const mat4& Camera::getPVMatrix() const {
return m_pvMatrix;
}
const mat4& Camera::getSkyMatrix() const {
return m_skyMatrix;
}
const vec3& Camera::getUp() const {
return m_up;
}
const vec3& Camera::getLookAt() const {
return m_lookAt;
}
}