From a6f784e6a1068bf03ca71fc06dee494716a88d64 Mon Sep 17 00:00:00 2001 From: Dynamitos Date: Tue, 5 Oct 2021 12:24:41 +0200 Subject: [PATCH] Basic renderhierarchy async updates --- src/Engine/Graphics/RenderPass/BasePass.h | 2 +- src/Engine/Graphics/RenderPass/DepthPrepass.h | 2 +- .../Graphics/RenderPass/LightCullingPass.h | 2 +- src/Engine/Scene/Scene.h | 4 +- src/Engine/UI/CMakeLists.txt | 2 + src/Engine/UI/Elements/Element.h | 2 + src/Engine/UI/RenderHierarchy.cpp | 53 ++++++++++++++++--- src/Engine/UI/RenderHierarchy.h | 43 ++++++++++----- src/Engine/UI/System.cpp | 14 +++++ src/Engine/UI/System.h | 21 ++++++++ src/Engine/Window/SceneView.h | 2 +- 11 files changed, 123 insertions(+), 24 deletions(-) create mode 100644 src/Engine/UI/System.cpp create mode 100644 src/Engine/UI/System.h diff --git a/src/Engine/Graphics/RenderPass/BasePass.h b/src/Engine/Graphics/RenderPass/BasePass.h index 93cc596..101eaca 100644 --- a/src/Engine/Graphics/RenderPass/BasePass.h +++ b/src/Engine/Graphics/RenderPass/BasePass.h @@ -33,7 +33,7 @@ DECLARE_REF(CameraActor) DECLARE_REF(CameraComponent) struct BasePassData { - const Array staticDrawList; + Array staticDrawList; }; class BasePass : public RenderPass { diff --git a/src/Engine/Graphics/RenderPass/DepthPrepass.h b/src/Engine/Graphics/RenderPass/DepthPrepass.h index df5732c..4727556 100644 --- a/src/Engine/Graphics/RenderPass/DepthPrepass.h +++ b/src/Engine/Graphics/RenderPass/DepthPrepass.h @@ -32,7 +32,7 @@ DECLARE_REF(CameraActor) DECLARE_REF(CameraComponent) struct DepthPrepassData { - const Array staticDrawList; + Array staticDrawList; }; class DepthPrepass : public RenderPass { diff --git a/src/Engine/Graphics/RenderPass/LightCullingPass.h b/src/Engine/Graphics/RenderPass/LightCullingPass.h index 1d9a442..5eb6b77 100644 --- a/src/Engine/Graphics/RenderPass/LightCullingPass.h +++ b/src/Engine/Graphics/RenderPass/LightCullingPass.h @@ -11,7 +11,7 @@ DECLARE_REF(Scene) DECLARE_REF(Viewport) struct LightCullingPassData { - const LightEnv lightEnv; + LightEnv lightEnv; }; class LightCullingPass : public RenderPass { diff --git a/src/Engine/Scene/Scene.h b/src/Engine/Scene/Scene.h index 08fea93..64e9ac2 100644 --- a/src/Engine/Scene/Scene.h +++ b/src/Engine/Scene/Scene.h @@ -45,11 +45,11 @@ public: void addPrimitiveComponent(PPrimitiveComponent comp); const Array& getPrimitives() const { return primitives; } - const Array& getStaticMeshes() const { return staticMeshes; } + const Array& getStaticMeshes() const { return staticMeshes; } const LightEnv& getLightBuffer() const { return lightEnv; } UPSceneUpdater& getSceneUpdater() { return updater; } private: - Array staticMeshes; + Array staticMeshes; Array rootActors; Array primitives; LightEnv lightEnv; diff --git a/src/Engine/UI/CMakeLists.txt b/src/Engine/UI/CMakeLists.txt index 352d40b..749ede4 100644 --- a/src/Engine/UI/CMakeLists.txt +++ b/src/Engine/UI/CMakeLists.txt @@ -6,6 +6,8 @@ target_sources(SeeleEngine Layout.cpp RenderHierarchy.h RenderHierarchy.cpp + System.h + System.cpp VerticalLayout.h VerticalLayout.cpp) diff --git a/src/Engine/UI/Elements/Element.h b/src/Engine/UI/Elements/Element.h index 8984340..2870377 100644 --- a/src/Engine/UI/Elements/Element.h +++ b/src/Engine/UI/Elements/Element.h @@ -7,6 +7,7 @@ namespace UI { //Element defines any part of the UI DECLARE_REF(Element) +DECLARE_REF(System) class Element { public: @@ -32,6 +33,7 @@ protected: bool dirty; bool enabled; + PSystem system; PElement parent; Array children; friend class Layout; diff --git a/src/Engine/UI/RenderHierarchy.cpp b/src/Engine/UI/RenderHierarchy.cpp index bc4db24..05b53fa 100644 --- a/src/Engine/UI/RenderHierarchy.cpp +++ b/src/Engine/UI/RenderHierarchy.cpp @@ -3,12 +3,18 @@ using namespace Seele; using namespace Seele::UI; -RenderElement::RenderElement() +void AddElementRenderHierarchyUpdate::apply(Array& elements) { - + for(auto element : elements) + { + if(element.parent == parent) + { + + } + } } -RenderElement::~RenderElement() +void RemoveElementRenderHierarchyUpdate::apply(Array& elements) { } @@ -23,10 +29,45 @@ RenderHierarchy::~RenderHierarchy() } -void RenderHierarchy::updateHierarchyIndices() +void RenderHierarchy::addElement(PElement addedElement) { - for (uint32 i = 0; i < drawElements.size(); i++) + std::lock_guard lock(updateLock); + updates.add(new AddElementRenderHierarchyUpdate{ + addedElement.getHandle(), + addedElement->getParent().getHandle() + })); +} + +void RenderHierarchy::removeElement(PElement elementToRemove) +{ + std::lock_guard lock(updateLock); + updates.add(new RemoveElementRenderHierarchyUpdate{ + elementToRemove.getHandle(), + }); +} + +void RenderHierarchy::moveElement(PElement elementToMove, PElement newParent) +{ + std::lock_guard lock(updateLock); + updates.add(new AddElementRenderHierarchyUpdate{ + elementToMove.getHandle(), + newParent.getHandle() + }); + updates.add(new RemoveElementRenderHierarchyUpdate{ + elementToMove.getHandle() + }); +} + +void RenderHierarchy::updateHierarchy() +{ + Array localUpdates; + { // make a local copy of the updates so we dont hold the lock for too long + std::lock_guard lock(updateLock); + localUpdates = updates; + updates.clear(); + } + for(auto update : localUpdates) { - drawElements[i].hierarchyIndex = i; + } } diff --git a/src/Engine/UI/RenderHierarchy.h b/src/Engine/UI/RenderHierarchy.h index 3cc8f20..6f4c275 100644 --- a/src/Engine/UI/RenderHierarchy.h +++ b/src/Engine/UI/RenderHierarchy.h @@ -1,5 +1,6 @@ #pragma once #include "Elements/Element.h" +#include "Containers/List.h" namespace Seele { @@ -9,32 +10,50 @@ DECLARE_NAME_REF(Gfx, RenderCommand); class RenderElement { public: - RenderElement(); - virtual ~RenderElement(); -private: + RenderElement() = default; + ~RenderElement() = default; uint32 hierarchyIndex; - RenderElement* parent; - PElement referencedElement; - Gfx::PRenderCommand renderCommand; - friend class RenderHierarchy; + Element* parent; + Element* referencedElement; }; struct RenderHierarchyUpdate -{}; -DEFINE_REF(RenderHierarchyUpdate) +{ + virtual void apply(Array& elements) = 0; +}; +struct AddElementRenderHierarchyUpdate : public RenderHierarchyUpdate +{ + Element* addedElement; + Element* parent; + virtual void apply(Array& elements) override; +}; + +struct RemoveElementRenderHierarchyUpdate : public RenderHierarchyUpdate +{ + Element* element; + virtual void apply(Array& elements) override; +}; class RenderHierarchy { public: RenderHierarchy(); ~RenderHierarchy(); - -private: - void updateHierarchyIndices(); + // logic thread interface, queue hierarchy changes + void addElement(PElement addedElement); + void removeElement(PElement elementToRemove); + void moveElement(PElement elementToMove, PElement newParent); + // render thread interface, apply changes + void updateHierarchy(); +private: + static_assert(std::is_trivially_copyable_v); // List of all drawable elements in draw order Array drawElements; + + List updates; + std::mutex updateLock; }; } // namespace UI } // namespace Seele diff --git a/src/Engine/UI/System.cpp b/src/Engine/UI/System.cpp new file mode 100644 index 0000000..6edd7fd --- /dev/null +++ b/src/Engine/UI/System.cpp @@ -0,0 +1,14 @@ +#include "System.h" + +using namespace Seele; +using namespace Seele::UI; + +System::System() +{ + +} + +System::~System() +{ + +} diff --git a/src/Engine/UI/System.h b/src/Engine/UI/System.h new file mode 100644 index 0000000..4f2641a --- /dev/null +++ b/src/Engine/UI/System.h @@ -0,0 +1,21 @@ +#pragma once +#include "MinimalEngine.h" +#include "RenderHierarchy.h" + +namespace Seele +{ +namespace UI +{ +DECLARE_REF(Panel) +class System +{ +public: + System(); + virtual ~System(); +private: + PPanel rootPanel; + Array updates; +}; +DEFINE_REF(System) +} // namespace UI +} // namespace Seele diff --git a/src/Engine/Window/SceneView.h b/src/Engine/Window/SceneView.h index 2ddadd4..3625750 100644 --- a/src/Engine/Window/SceneView.h +++ b/src/Engine/Window/SceneView.h @@ -30,7 +30,7 @@ private: BasePass basePass; DepthPrepassData depthPrepassData; - LightCullingPassData lightCullingData; + LightCullingPassData lightCullingPassData; BasePassData basePassData; virtual void keyCallback(KeyCode code, InputAction action, KeyModifier modifier) override;