#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(fovRad, (float)render_settings->ViewportWidth / (float)render_settings->ViewportHeight, render_settings->Near, render_settings->Far); glm::mat4 projection = glm::perspectiveRH(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(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; }