From 7d71390d435949e70ceea307b459e93257d4ce22 Mon Sep 17 00:00:00 2001 From: maverickdgg Date: Thu, 17 Nov 2022 05:29:11 +0800 Subject: [PATCH] separated ortho and proj matrix in camera comp --- SHADE_Engine/src/Camera/SHCameraComponent.cpp | 17 +++++- SHADE_Engine/src/Camera/SHCameraComponent.h | 6 +- SHADE_Engine/src/Camera/SHCameraDirector.cpp | 60 +++++++++++++------ SHADE_Engine/src/Camera/SHCameraDirector.h | 16 ++--- SHADE_Engine/src/Camera/SHCameraSystem.cpp | 48 +++++++-------- 5 files changed, 93 insertions(+), 54 deletions(-) diff --git a/SHADE_Engine/src/Camera/SHCameraComponent.cpp b/SHADE_Engine/src/Camera/SHCameraComponent.cpp index ac451df5..7fc71db1 100644 --- a/SHADE_Engine/src/Camera/SHCameraComponent.cpp +++ b/SHADE_Engine/src/Camera/SHCameraComponent.cpp @@ -12,7 +12,7 @@ namespace SHADE :yaw(0.0f), pitch(0.0f), roll(0.0f) , width(1920.0f), height(1080.0f), zNear(0.01f), zFar(10000.0f), fov(90.0f), movementSpeed(1.0f), turnSpeed(0.5f) , perspProj(true), dirtyView(true), dirtyProj(true) - , viewMatrix(), projMatrix() + , viewMatrix(), perspProjMatrix(), orthoProjMatrix() , position(), offset() { ComponentFamily::GetID(); @@ -213,9 +213,22 @@ namespace SHADE const SHMatrix& SHCameraComponent::GetProjMatrix() const noexcept { - return projMatrix; + if (perspProj) + return perspProjMatrix; + else + return orthoProjMatrix; } + const SHMatrix& SHCameraComponent::GetOrthoMatrix() const noexcept + { + return orthoProjMatrix; + } + + const SHMatrix& SHCameraComponent::GetPerspectiveMatrix() const noexcept + { + return orthoProjMatrix; + } + //void SHCameraComponent::SetMainCamera(size_t directorCameraIndex) noexcept //{ // auto system = SHSystemManager::GetSystem(); diff --git a/SHADE_Engine/src/Camera/SHCameraComponent.h b/SHADE_Engine/src/Camera/SHCameraComponent.h index b778b8fa..b0999fe9 100644 --- a/SHADE_Engine/src/Camera/SHCameraComponent.h +++ b/SHADE_Engine/src/Camera/SHCameraComponent.h @@ -29,12 +29,14 @@ namespace SHADE SHMatrix viewMatrix; - SHMatrix projMatrix; + SHMatrix perspProjMatrix; + SHMatrix orthoProjMatrix; SHVec3 position; bool perspProj; SHVec3 offset; + public: @@ -78,6 +80,8 @@ namespace SHADE const SHMatrix& GetViewMatrix() const noexcept; const SHMatrix& GetProjMatrix() const noexcept; + const SHMatrix& GetOrthoMatrix() const noexcept; + const SHMatrix& GetPerspectiveMatrix() const noexcept; //void SetMainCamera(size_t cameraDirectorIndex = 0) noexcept; diff --git a/SHADE_Engine/src/Camera/SHCameraDirector.cpp b/SHADE_Engine/src/Camera/SHCameraDirector.cpp index 9e9ddb5c..ec539fa1 100644 --- a/SHADE_Engine/src/Camera/SHCameraDirector.cpp +++ b/SHADE_Engine/src/Camera/SHCameraDirector.cpp @@ -15,36 +15,42 @@ namespace SHADE } - SHMatrix SHCameraDirector::GetViewMatrix() const noexcept + SHMatrix const& SHCameraDirector::GetViewMatrix() const noexcept { return viewMatrix; } - SHMatrix SHCameraDirector::GetProjMatrix() const noexcept + SHMatrix const& SHCameraDirector::GetProjMatrix() const noexcept { return projMatrix; } - SHMatrix SHCameraDirector::GetVPMatrix() const noexcept + SHMatrix const& SHCameraDirector::GetVPMatrix() const noexcept { return projMatrix * viewMatrix; } + SHCameraComponent* SHCameraDirector::GetMainCameraComponent() noexcept + { + if (mainCameraEID == MAX_EID) + { + auto& dense = SHComponentManager::GetDense(); + if (dense.size() == 0) + { + return nullptr; + } + mainCameraEID = dense[0].GetEID(); + } + SHCameraComponent* camComponent = SHComponentManager::GetComponent_s(mainCameraEID); + if (!camComponent) + { + SHLOG_WARNING("Camera Director warning: Entity does not have a camera"); + } + } + + void SHCameraDirector::UpdateMatrix() noexcept { - if (mainCameraEID == MAX_EID) - { - auto& dense = SHComponentManager::GetDense(); - if (dense.size() == 0) - { - return; - } - mainCameraEID = dense[0].GetEID(); - } - SHCameraComponent* camComponent = SHComponentManager::GetComponent_s(mainCameraEID); - if (!camComponent) - { - SHLOG_WARNING("Camera Director warning: Entity does not have a camera"); - } - else + SHCameraComponent* camComponent = GetMainCameraComponent(); + if(camComponent) { viewMatrix = camComponent->GetViewMatrix(); projMatrix = camComponent->GetProjMatrix(); @@ -62,6 +68,24 @@ namespace SHADE mainCameraEID = camera.GetEID(); } + SHMatrix const& SHCameraDirector::GetOrthoMatrix() noexcept + { + + SHCameraComponent* camComponent = GetMainCameraComponent(); + if (camComponent) + return camComponent->GetOrthoMatrix(); + else + return SHMatrix::Identity; + } + + SHMatrix const& SHCameraDirector::GetPerspectiveMatrix() noexcept + { + SHCameraComponent* camComponent = GetMainCameraComponent(); + if (camComponent) + return camComponent->GetPerspectiveMatrix(); + else + return SHMatrix::Identity; + } } diff --git a/SHADE_Engine/src/Camera/SHCameraDirector.h b/SHADE_Engine/src/Camera/SHCameraDirector.h index 6d5404c5..8538a824 100644 --- a/SHADE_Engine/src/Camera/SHCameraDirector.h +++ b/SHADE_Engine/src/Camera/SHCameraDirector.h @@ -23,20 +23,20 @@ namespace SHADE EntityID transitionCameraEID; - SHMatrix GetViewMatrix() const noexcept; - SHMatrix GetProjMatrix() const noexcept; - SHMatrix GetVPMatrix() const noexcept; + SHMatrix const& GetViewMatrix() const noexcept; + SHMatrix const& GetProjMatrix() const noexcept; + SHMatrix const& GetVPMatrix() const noexcept; void UpdateMatrix() noexcept; void SetMainCamera(SHCameraComponent& cam) noexcept; - + SHMatrix const& GetOrthoMatrix() noexcept; + SHMatrix const& GetPerspectiveMatrix() noexcept; private: + SHMatrix viewMatrix; + SHMatrix projMatrix; + SHCameraComponent* GetMainCameraComponent() noexcept; - protected: - SHMatrix viewMatrix; - SHMatrix projMatrix; - }; typedef Handle DirectorHandle; diff --git a/SHADE_Engine/src/Camera/SHCameraSystem.cpp b/SHADE_Engine/src/Camera/SHCameraSystem.cpp index 5ae6d35e..78dabc37 100644 --- a/SHADE_Engine/src/Camera/SHCameraSystem.cpp +++ b/SHADE_Engine/src/Camera/SHCameraSystem.cpp @@ -214,24 +214,22 @@ namespace SHADE } if (camera.dirtyProj == true) { - if (camera.perspProj == true) - { + //Perspective projection matrix. const float ASPECT_RATIO = (camera.GetAspectRatio()); const float TAN_HALF_FOV = tan(SHMath::DegreesToRadians(camera.fov) * 0.5f); - camera.projMatrix = SHMatrix::Identity; - camera.projMatrix(0, 0) = 1.0f / (ASPECT_RATIO * TAN_HALF_FOV); - camera.projMatrix(1, 1) = 1.0f / TAN_HALF_FOV; - camera.projMatrix(2, 2) = camera.zFar / (camera.zFar - camera.zNear); - camera.projMatrix(3, 3) = 0.0f; + camera.perspProjMatrix = SHMatrix::Identity; + camera.perspProjMatrix(0, 0) = 1.0f / (ASPECT_RATIO * TAN_HALF_FOV); + camera.perspProjMatrix(1, 1) = 1.0f / TAN_HALF_FOV; + camera.perspProjMatrix(2, 2) = camera.zFar / (camera.zFar - camera.zNear); + camera.perspProjMatrix(3, 3) = 0.0f; + + camera.perspProjMatrix(3, 2) = 1.0f; + camera.perspProjMatrix(2, 3) = -(camera.zFar * camera.zNear) / (camera.zFar - camera.zNear); + + + + //Orthographic projection matrix - camera.projMatrix(3, 2) = 1.0f; - camera.projMatrix(2, 3) = -(camera.zFar * camera.zNear) / (camera.zFar - camera.zNear); - - - camera.dirtyProj = false; - } - else - { const float right = camera.GetWidth() * 0.5f; const float left = -right; const float top = camera.GetHeight() * 0.5f; @@ -239,20 +237,20 @@ namespace SHADE const float n = camera.GetNear(); const float f = camera.GetFar(); - camera.projMatrix = SHMatrix::Identity; - camera.projMatrix(0, 0) = 2.0f / (right - left); - camera.projMatrix(1, 1) = 2.0f / (btm - top); - camera.projMatrix(2, 2) = 1.0f / (f-n); - camera.projMatrix(0, 3) = -(right + left) / (right - left); - camera.projMatrix(1, 3) = -(btm + top) / (btm - top); - camera.projMatrix(2, 3) = -n / (f-n); - camera.projMatrix(3, 3) = 1.0f; + camera.orthoProjMatrix = SHMatrix::Identity; + camera.orthoProjMatrix(0, 0) = 2.0f / (right - left); + camera.orthoProjMatrix(1, 1) = 2.0f / (btm - top); + camera.orthoProjMatrix(2, 2) = 1.0f / (f-n); + camera.orthoProjMatrix(0, 3) = -(right + left) / (right - left); + camera.orthoProjMatrix(1, 3) = -(btm + top) / (btm - top); + camera.orthoProjMatrix(2, 3) = -n / (f-n); + camera.orthoProjMatrix(3, 3) = 1.0f; - camera.projMatrix = SHMatrix::OrthographicRH(camera.GetWidth(), camera.GetHeight(), camera.GetNear(), camera.GetFar()); + camera.orthoProjMatrix = SHMatrix::OrthographicRH(camera.GetWidth(), camera.GetHeight(), camera.GetNear(), camera.GetFar()); //camera.projMatrix.Transpose(); camera.dirtyProj = false; - } + } }