From eb32e873870d2153562a4addf0854bdeebe72aad Mon Sep 17 00:00:00 2001 From: maverickdgg Date: Mon, 14 Nov 2022 15:10:23 +0800 Subject: [PATCH 1/3] Camera Orthographic projection --- SHADE_Engine/src/Camera/SHCameraSystem.cpp | 37 ++++++++++++++-------- 1 file changed, 24 insertions(+), 13 deletions(-) diff --git a/SHADE_Engine/src/Camera/SHCameraSystem.cpp b/SHADE_Engine/src/Camera/SHCameraSystem.cpp index ff942666..5ae6d35e 100644 --- a/SHADE_Engine/src/Camera/SHCameraSystem.cpp +++ b/SHADE_Engine/src/Camera/SHCameraSystem.cpp @@ -107,7 +107,11 @@ namespace SHADE editorCamera.SetPitch(0.0f); editorCamera.SetYaw(0.0f); editorCamera.SetRoll(0.0f); + editorCamera.SetWidth(1080.0f); + editorCamera.SetHeight(720.0f); + editorCamera.SetFar(10000000.0f); editorCamera.movementSpeed = 2.0f; + editorCamera.perspProj = true; SHComponentManager::CreateComponentSparseSet(); SHComponentManager::CreateComponentSparseSet(); @@ -228,18 +232,24 @@ namespace SHADE } else { - //const float R = camera.width * 0.5f; - //const float L = -R; - //const float T = camera.height * 0.5f; - //const float B = -T; + const float right = camera.GetWidth() * 0.5f; + const float left = -right; + const float top = camera.GetHeight() * 0.5f; + const float btm = -top; + const float n = camera.GetNear(); + const float f = camera.GetFar(); - //camera.projMatrix = SHMatrix::Identity; - //camera.projMatrix(0, 0) = 2.0f / (R - L); - //camera.projMatrix(1, 1) = 2.0f / (B - T); - //camera.projMatrix(2, 2) = 1.0f / (camera.zFar - camera.zNear); - //camera.projMatrix(3, 0) = -(R + L) / (R - L); - //camera.projMatrix(3, 1) = -(B + T) / (B - T); - //camera.projMatrix(3, 2) = -camera.zNear / (camera.zFar - camera.zNear); + 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.projMatrix = SHMatrix::OrthographicRH(camera.GetWidth(), camera.GetHeight(), camera.GetNear(), camera.GetFar()); + //camera.projMatrix.Transpose(); camera.dirtyProj = false; } @@ -252,8 +262,6 @@ namespace SHADE SHVec3 up = { 0.0f,1.0f,0.0f }; - - target = SHVec3::RotateX(target, SHMath::DegreesToRadians(camera.pitch)); target = SHVec3::RotateY(target, SHMath::DegreesToRadians(camera.yaw)); target += camera.position; @@ -287,6 +295,9 @@ namespace SHADE if (SHSceneManager::CheckNodeAndComponentsActive(cam.GetEID())) system->UpdateCameraComponent(cam); } + + + for (auto& handle : system->directorHandleList) { handle->UpdateMatrix(); From c80a819b6e1dbe387c16c6273cff9113b4bf5060 Mon Sep 17 00:00:00 2001 From: maverickdgg Date: Thu, 17 Nov 2022 04:55:46 +0800 Subject: [PATCH 2/3] Guard Find entity by name function --- SHADE_Engine/src/ECS_Base/Managers/SHEntityManager.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/SHADE_Engine/src/ECS_Base/Managers/SHEntityManager.cpp b/SHADE_Engine/src/ECS_Base/Managers/SHEntityManager.cpp index 6ce4f277..19eb5168 100644 --- a/SHADE_Engine/src/ECS_Base/Managers/SHEntityManager.cpp +++ b/SHADE_Engine/src/ECS_Base/Managers/SHEntityManager.cpp @@ -218,7 +218,7 @@ namespace SHADE EntityID result = MAX_EID; for (auto& entity : entityVec) { - if (entity->name == name) + if (entity && entity->name == name) result = entity->GetEID(); } return result; From 7d71390d435949e70ceea307b459e93257d4ce22 Mon Sep 17 00:00:00 2001 From: maverickdgg Date: Thu, 17 Nov 2022 05:29:11 +0800 Subject: [PATCH 3/3] 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; - } + } }