From e4e48946105f06b5e9cc55fecc5cc2960e27ba60 Mon Sep 17 00:00:00 2001 From: maverickdgg Date: Thu, 10 Nov 2022 13:01:31 +0800 Subject: [PATCH 1/4] Canvas Component Added a canvas component. No functionality added yet --- SHADE_Engine/src/Camera/SHCameraSystem.cpp | 2 +- SHADE_Engine/src/UI/SHCanvasComponent.h | 35 ++++++++++++++++++++++ 2 files changed, 36 insertions(+), 1 deletion(-) create mode 100644 SHADE_Engine/src/UI/SHCanvasComponent.h diff --git a/SHADE_Engine/src/Camera/SHCameraSystem.cpp b/SHADE_Engine/src/Camera/SHCameraSystem.cpp index d5bd414d..60e66df6 100644 --- a/SHADE_Engine/src/Camera/SHCameraSystem.cpp +++ b/SHADE_Engine/src/Camera/SHCameraSystem.cpp @@ -399,7 +399,7 @@ namespace SHADE SHVec3 up = { 0.0f,1.0f,0.0f }; - ////SHVec3::RotateZ(target, SHMath::DegreesToRadians(camera.roll)); + //SHVec3::RotateZ(target, SHMath::DegreesToRadians(camera.roll)); //target = SHVec3::Normalise(target); diff --git a/SHADE_Engine/src/UI/SHCanvasComponent.h b/SHADE_Engine/src/UI/SHCanvasComponent.h new file mode 100644 index 00000000..2e9a54f1 --- /dev/null +++ b/SHADE_Engine/src/UI/SHCanvasComponent.h @@ -0,0 +1,35 @@ +#pragma once + +#include "SH_API.h" +#include "ECS_Base/Components/SHComponent.h" + + +namespace SHADE +{ + + class SH_API SHCanvasComponent final: public SHComponent + { + using CanvasSizeType = uint32_t; + + + public: + SHCanvasComponent(); + ~SHCanvasComponent() = default; + + void SetCanvasSize(CanvasSizeType width, CanvasSizeType height) noexcept; + void SetCanvasWidth(CanvasSizeType width) noexcept; + void SetCanvasHeight(CanvasSizeType height) noexcept; + + CanvasSizeType const GetCanvasWidth() const noexcept; + CanvasSizeType const GetCanvasHeight() const noexcept; + + private: + CanvasSizeType width; + CanvasSizeType height; + + + + }; + + +} \ No newline at end of file From 4d0598a7f539b2a32c1a2f2209acf7cc2bbb6fd5 Mon Sep 17 00:00:00 2001 From: maverickdgg Date: Sun, 13 Nov 2022 05:19:46 +0800 Subject: [PATCH 2/4] Added Editor Camera Arm function --- SHADE_Engine/src/Camera/SHCameraSystem.cpp | 96 ++++++++++------------ SHADE_Engine/src/Camera/SHCameraSystem.h | 10 +-- 2 files changed, 48 insertions(+), 58 deletions(-) diff --git a/SHADE_Engine/src/Camera/SHCameraSystem.cpp b/SHADE_Engine/src/Camera/SHCameraSystem.cpp index 60e66df6..62750d16 100644 --- a/SHADE_Engine/src/Camera/SHCameraSystem.cpp +++ b/SHADE_Engine/src/Camera/SHCameraSystem.cpp @@ -60,64 +60,49 @@ namespace SHADE camera.dirtyView = true; } + + + UpdateCameraComponent(editorCamera); + + if (SHInputManager::GetKeyDown(SHInputManager::SH_KEYCODE::LEFT_ALT)) + { + UpdateEditorArm(dt, true, SHVec3{ 0.0f }); + } + UpdateEditorArm(dt, false, SHVec3{ 0.0f }); } - void SHCameraSystem::EditorCameraUpdate::Execute(double dt) noexcept - { - SHCameraSystem* system = static_cast(GetSystem()); - auto& camera = system->editorCamera; - SHVec3 view, right, UP; - system->GetCameraAxis(camera, view, right, UP); - if (SHInputManager::GetKey(SHInputManager::SH_KEYCODE::A)) + void SHCameraSystem::UpdateEditorArm(double dt,bool active ,SHVec3 const& targetPos) noexcept + { + if (active == false) { - //std::cout << "Camera movement: "<UpdateCameraComponent(system->editorCamera); - system->DecomposeViewMatrix(camera.viewMatrix, camera.pitch, camera.yaw, camera.roll, camera.position); - } + + editorCameraArm.armLength += SHInputManager::GetMouseWheelVerticalDelta() * dt; + + if (editorCameraArm.armLength < 1.0f) + editorCameraArm.armLength = 1.0f; + + UpdatePivotArmComponent(editorCameraArm); + + editorCamera.offset = editorCameraArm.GetOffset(); + + CameraLookAt(editorCamera, targetPos); + + } + void SHCameraSystem::Init(void) { @@ -164,6 +149,9 @@ namespace SHADE void SHCameraSystem::UpdateCameraComponent(SHCameraComponent& camera) noexcept { + if (camera.isActive == false) + return; + if (SHComponentManager::HasComponent(camera.GetEID()) == true && &camera != &editorCamera) { auto transform = SHComponentManager::GetComponent(camera.GetEID()); @@ -183,11 +171,17 @@ namespace SHADE if (SHComponentManager::HasComponent(camera.GetEID())) { auto arm = SHComponentManager::GetComponent(camera.GetEID()); - camera.offset = arm->GetOffset(); - if(arm->lookAtCameraOrigin) - CameraLookAt(camera, camera.position); + if (arm->isActive == true) + { + camera.offset = arm->GetOffset(); + if (arm->lookAtCameraOrigin) + CameraLookAt(camera, camera.position); + } + } + + SHVec3 view, right, UP; diff --git a/SHADE_Engine/src/Camera/SHCameraSystem.h b/SHADE_Engine/src/Camera/SHCameraSystem.h index 98fd442f..fc6e9166 100644 --- a/SHADE_Engine/src/Camera/SHCameraSystem.h +++ b/SHADE_Engine/src/Camera/SHCameraSystem.h @@ -5,6 +5,7 @@ #include "ECS_Base/System/SHSystemRoutine.h" #include "Resource/SHResourceLibrary.h" #include "SHCameraDirector.h" +#include "SHCameraArmComponent.h" #include "SH_API.h" namespace SHADE @@ -18,6 +19,7 @@ namespace SHADE //A camera component that represents editor camera. //This is not tied to any entity. Hence this EID should not be used. SHCameraComponent editorCamera; + SHCameraArmComponent editorCameraArm; SHResourceLibrary directorLibrary; std::vector directorHandleList; @@ -34,14 +36,7 @@ namespace SHADE void Init (void); void Exit (void); - class SH_API EditorCameraUpdate final : public SHSystemRoutine - { - public: - EditorCameraUpdate() : SHSystemRoutine("Editor Camera Update", true) { }; - virtual void Execute(double dt) noexcept override final; - - }; friend class EditorCameraUpdate; class SH_API CameraSystemUpdate final: public SHSystemRoutine @@ -63,6 +58,7 @@ namespace SHADE void DecomposeViewMatrix(SHMatrix const& matrix, float& pitch, float& yaw, float& roll, SHVec3& pos) noexcept; void SetCameraViewMatrix(SHCameraComponent& camera, SHMatrix const& viewMatrix) noexcept; void CameraLookAt(SHCameraComponent& camera, SHVec3 target) noexcept; + void UpdateEditorArm(double dt,bool active ,SHVec3 const& targetPos) noexcept; }; From 258c07e8578d956aefa948795b08ce763c2ee61d Mon Sep 17 00:00:00 2001 From: maverickdgg Date: Sun, 13 Nov 2022 05:31:18 +0800 Subject: [PATCH 3/4] Added helper functions to check if Scene nodes are active --- SHADE_Engine/src/Scene/SHSceneManager.h | 51 +++++++++++++++++++++++++ 1 file changed, 51 insertions(+) diff --git a/SHADE_Engine/src/Scene/SHSceneManager.h b/SHADE_Engine/src/Scene/SHSceneManager.h index 23d13261..8f03b352 100644 --- a/SHADE_Engine/src/Scene/SHSceneManager.h +++ b/SHADE_Engine/src/Scene/SHSceneManager.h @@ -21,6 +21,7 @@ #include "SH_API.h" #include "ECS_Base/General/SHFamily.h" #include "Assets/SHAssetMacros.h" +#include "ECS_Base/Managers/SHComponentManager.h" namespace SHADE { @@ -116,6 +117,56 @@ namespace SHADE sceneChanged = true; } + /******************************************************************** + * \brief + * Check if the Entity's scene node is active and all the + * components specified are active. + * This does not check if the entity HasComponent. Please use + * CheckNodeAndHasComponentActive for that. + * \param eid + * EntityID of the entity to check for. + * \return + * true if scene node is active and all the components specified + * are also active. + ********************************************************************/ + template + static std::enable_if_t<(... && std::is_base_of_v), bool> CheckNodeAndComponentsActive(EntityID eid) + { + return CheckNodeActive(eid) && (... && SHComponentManager::GetComponent_s(eid)->isActive); + } + + /******************************************************************** + * \brief + * Check if the Entity's scene node is active and all the + * components specified are active. + * This also checks to verify that the entity has such components. + * \param eid + * EntityID of the entity to check for. + * \return + * true if scene node is active and all the components specified + * are also active. + ********************************************************************/ + template + static std::enable_if_t<(... && std::is_base_of_v), bool> CheckNodeAndHasComponentsActive(EntityID eid) + { + return CheckNodeActive(eid) + && (... && SHComponentManager::HasComponent(eid)) + && (... && SHComponentManager::GetComponent_s(eid)->isActive); + } + + /******************************************************************** + * \brief + * Check if Scene node is active. + * \param eid + * EntityID of the entity to check for. + * \return + * true if scene node is active + ********************************************************************/ + static bool CheckNodeActive(EntityID eid) + { + return GetCurrentSceneGraph().IsActiveInHierarchy(eid); + } + /*!************************************************************************* * \brief From efed33ce94b5cb3c2034a5ca502e999870434098 Mon Sep 17 00:00:00 2001 From: maverickdgg Date: Sun, 13 Nov 2022 05:45:43 +0800 Subject: [PATCH 4/4] Added code to test EditorCameraArm. --- SHADE_Engine/src/Camera/SHCameraSystem.cpp | 31 +++++++++++++--------- 1 file changed, 19 insertions(+), 12 deletions(-) diff --git a/SHADE_Engine/src/Camera/SHCameraSystem.cpp b/SHADE_Engine/src/Camera/SHCameraSystem.cpp index 62750d16..8f886926 100644 --- a/SHADE_Engine/src/Camera/SHCameraSystem.cpp +++ b/SHADE_Engine/src/Camera/SHCameraSystem.cpp @@ -7,13 +7,15 @@ #include "ECS_Base/Managers/SHComponentManager.h" #include "Math/Transform/SHTransformComponent.h" #include - +#include "Scene/SHSceneManager.h" namespace SHADE { void SHCameraSystem::UpdateEditorCamera(double dt) noexcept { + + auto& camera = editorCamera; SHVec3 view, right, UP; GetCameraAxis(camera, view, right, UP); @@ -60,17 +62,15 @@ namespace SHADE camera.dirtyView = true; } - - - UpdateCameraComponent(editorCamera); - - if (SHInputManager::GetKeyDown(SHInputManager::SH_KEYCODE::LEFT_ALT)) + if (SHInputManager::GetKey(SHInputManager::SH_KEYCODE::LEFT_ALT)) { UpdateEditorArm(dt, true, SHVec3{ 0.0f }); } - UpdateEditorArm(dt, false, SHVec3{ 0.0f }); + else + UpdateEditorArm(dt, false, SHVec3{ 0.0f }); + } void SHCameraSystem::UpdateEditorArm(double dt,bool active ,SHVec3 const& targetPos) noexcept @@ -81,16 +81,21 @@ namespace SHADE return; } - + editorCamera.SetPosition(targetPos); double mouseX, mouseY; SHInputManager::GetMouseVelocity(&mouseX, &mouseY); editorCameraArm.pitch -= mouseY * dt * editorCamera.turnSpeed.x; editorCameraArm.yaw -= mouseX * dt * editorCamera.turnSpeed.y; - + constexpr float pitchClamp = 85.0f; - editorCameraArm.armLength += SHInputManager::GetMouseWheelVerticalDelta() * dt; + if (editorCameraArm.pitch > pitchClamp) + editorCameraArm.pitch = pitchClamp; + if (editorCameraArm.pitch < -pitchClamp) + editorCameraArm.pitch = -pitchClamp; + + editorCameraArm.armLength -= SHInputManager::GetMouseWheelVerticalDelta() * dt; if (editorCameraArm.armLength < 1.0f) editorCameraArm.armLength = 1.0f; @@ -281,12 +286,14 @@ namespace SHADE for (auto& pivot : pivotDense) { - system->UpdatePivotArmComponent(pivot); + if(SHSceneManager::CheckNodeAndComponentsActive(pivot.GetEID())) + system->UpdatePivotArmComponent(pivot); } for (auto& cam : dense) { - system->UpdateCameraComponent(cam); + if (SHSceneManager::CheckNodeAndComponentsActive(cam.GetEID())) + system->UpdateCameraComponent(cam); } for (auto& handle : system->directorHandleList) {