78 lines
2.4 KiB
C++
78 lines
2.4 KiB
C++
#include "HydraCamera.h"
|
|
#include "../engine/HydraEngine.h"
|
|
#include "../windowmanager/HydraRenderSettings.h"
|
|
#include "../actor/HydraActor.h"
|
|
#include "../actor/HydraActorManager.h"
|
|
|
|
|
|
glm::mat4x4 HydraCamera::GetView()
|
|
{
|
|
glm::dvec3 actor_pos = glm::dvec3(0,0,0);
|
|
|
|
glm::mat4 actor_rot = glm::mat4(1);
|
|
glm::vec3 actor_euler = glm::vec3(0);
|
|
|
|
if(m_attached_actor != INVALID_HYDRA_ID)
|
|
{
|
|
HydraActor* actor = GetEngine()->ActorManager()->GetActor(m_attached_actor);
|
|
if(actor != nullptr)
|
|
{
|
|
actor_pos = (GetEngine()->ActorManager()->GetActorPosition(m_attached_actor)) * glm::dvec3(-1, -1, -1);
|
|
actor_euler = GetEngine()->ActorManager()->GetActorOrientation(m_attached_actor);
|
|
actor_rot = glm::eulerAngleXYZ(actor_euler.x, actor_euler.y, actor_euler.z);
|
|
}
|
|
}
|
|
|
|
glm::mat4 trans = glm::translate(actor_pos);
|
|
glm::mat4 rot = actor_rot;// * glm::eulerAngleXYZ(EulerAngle.x, EulerAngle.y, EulerAngle.z);
|
|
|
|
glm::mat4 camera_transform = rot * trans;
|
|
return camera_transform;
|
|
}
|
|
|
|
glm::mat4x4 HydraCamera::GetProjection()
|
|
{
|
|
HydraRenderSettings render_settings = GetEngine()->RenderSettings();
|
|
float fovRad = glm::radians(render_settings.FOV);
|
|
//glm::mat4 projection = glm::perspectiveLH<float>(fovRad, (float)render_settings->ViewportWidth / (float)render_settings->ViewportHeight, render_settings->Near, render_settings->Far);
|
|
glm::mat4 projection = glm::perspectiveRH<float>(fovRad, (float)render_settings.ViewportWidth / (float)render_settings.ViewportHeight, render_settings.Near, render_settings.Far);
|
|
// glm::mat4 correction = {1, 0, 0, 0,
|
|
// 0,-1, 0, 0,
|
|
// 0, 0, 0.5f,0.5f,
|
|
// 0,0, 0, 1};
|
|
// projection = correction * projection;
|
|
return projection;
|
|
}
|
|
|
|
glm::mat4x4 HydraCamera::GetOrthoProjection()
|
|
{
|
|
HydraRenderSettings render_settings = GetEngine()->RenderSettings();
|
|
float fovRad = glm::radians(render_settings.FOV);
|
|
glm::mat4 projection = glm::ortho<float>(0.0f, render_settings.DisplayWidth, 0, render_settings.DisplayHeight, 0.0f, 1000.0f);
|
|
|
|
|
|
return projection;
|
|
}
|
|
|
|
glm::vec3 HydraCamera::GetPosition()
|
|
{
|
|
glm::dvec3 actor_pos = glm::dvec3(0,0,0);
|
|
|
|
if(m_attached_actor != INVALID_HYDRA_ID)
|
|
{
|
|
HydraActor* actor = GetEngine()->ActorManager()->GetActor(m_attached_actor);
|
|
if(actor != nullptr)
|
|
{
|
|
actor_pos = (GetEngine()->ActorManager()->GetActorPosition(m_attached_actor)) * glm::dvec3(1, 1, 1);
|
|
|
|
}
|
|
}
|
|
return actor_pos;
|
|
|
|
}
|
|
|
|
void HydraCamera::AttachToActor(HydraID actorID)
|
|
{
|
|
m_attached_actor = actorID;
|
|
}
|