93 lines
2.2 KiB
C++
93 lines
2.2 KiB
C++
#include "camera.h"
|
|
|
|
Camera::Camera()
|
|
{
|
|
m_projectionType = PERSPECTIVE;
|
|
m_position = glm::vec3(0.0f);
|
|
m_direction = glm::vec3(0.0f, 0.0f, 1.0f);
|
|
m_front = glm::vec3(0.0f, 0.0f, 0.0f);
|
|
m_right = glm::vec3(0.0f, 0.0f, 0.0f);
|
|
m_up = glm::vec3(0.0f, 1.0f, 0.0f);
|
|
m_fov = 70.0f;
|
|
m_yaw = 0.0f;
|
|
m_pitch = 0.0f;
|
|
}
|
|
|
|
Camera::~Camera()
|
|
{
|
|
}
|
|
|
|
void Camera::SetYawPitch(float yaw, float pitch)
|
|
{
|
|
m_yaw = yaw;
|
|
m_pitch = pitch;
|
|
|
|
m_direction.x = cos(glm::radians(yaw)) * cos(glm::radians(pitch));
|
|
m_direction.y = sin(glm::radians(pitch));
|
|
m_direction.z = sin(glm::radians(yaw)) * cos(glm::radians(pitch));
|
|
|
|
m_front = glm::normalize(m_direction);
|
|
|
|
m_right = glm::normalize(glm::cross(m_front, m_up));
|
|
}
|
|
|
|
glm::quat Camera::GetOrientation()
|
|
{
|
|
const glm::quat rotQuatY = glm::angleAxis(glm::radians(-GetYaw()), glm::vec3(0, 1, 0));
|
|
const glm::quat rotQuatX = glm::angleAxis(glm::radians(GetPitch()), GetRight());
|
|
return rotQuatX * rotQuatY;
|
|
}
|
|
|
|
glm::mat4 Camera::GetProjectionMatrix(const Viewport& viewport) const
|
|
{
|
|
glm::mat4 proj = glm::mat4(1.0f);
|
|
if (m_projectionType == ORTHOGONAL)
|
|
{
|
|
proj = glm::ortho(0.0f, (float)viewport.width, 0.0f, (float)viewport.height, 0.1f, 1000.0f);
|
|
}
|
|
else // if (m_projectionType == PERSPECTIVE): Control return in all path's
|
|
{
|
|
float aspectRatio = (float)viewport.width / (float)viewport.height;
|
|
proj = glm::perspective(glm::radians(m_fov), aspectRatio, 0.01f, 100.0f);
|
|
}
|
|
|
|
return proj;
|
|
}
|
|
|
|
glm::mat4 Camera::GetViewMatrix() const
|
|
{
|
|
glm::mat4 view = glm::mat4(1.0f);
|
|
view = glm::lookAt(m_position, m_position + m_front, m_up);
|
|
return view;
|
|
}
|
|
|
|
glm::mat4 Camera::GetTranslationMatrix() const
|
|
{
|
|
glm::mat4 t = glm::mat4(1.0f);
|
|
t = glm::translate(t, m_position);
|
|
t = glm::rotate(t, m_direction.x, glm::vec3(1.0f, 0.0f, 0.0f));
|
|
t = glm::rotate(t, m_direction.y, glm::vec3(0.0f, 1.0f, 0.0f));
|
|
t = glm::rotate(t, m_direction.z, glm::vec3(0.0f, 0.0f, 1.0f));
|
|
return t;
|
|
}
|
|
|
|
Frustum& Camera::GetFrustum()
|
|
{
|
|
return m_frustum;
|
|
}
|
|
|
|
//////////////////////////////////////////////////////////////////////////
|
|
// Camera Manager
|
|
|
|
CameraManager g_cameraManager;
|
|
|
|
void CameraManager::SetActiveCamera(Camera* p_camera)
|
|
{
|
|
m_activeCamera = p_camera;
|
|
}
|
|
|
|
Camera* CameraManager::GetActiveCamera() const
|
|
{
|
|
return m_activeCamera;
|
|
}
|