Basic renderhierarchy async updates

This commit is contained in:
Dynamitos
2021-10-05 12:24:41 +02:00
parent 5dfc8300c5
commit a6f784e6a1
11 changed files with 123 additions and 24 deletions
+1 -1
View File
@@ -33,7 +33,7 @@ DECLARE_REF(CameraActor)
DECLARE_REF(CameraComponent)
struct BasePassData
{
const Array<StaticMeshBatch> staticDrawList;
Array<StaticMeshBatch> staticDrawList;
};
class BasePass : public RenderPass<BasePassData>
{
@@ -32,7 +32,7 @@ DECLARE_REF(CameraActor)
DECLARE_REF(CameraComponent)
struct DepthPrepassData
{
const Array<StaticMeshBatch> staticDrawList;
Array<StaticMeshBatch> staticDrawList;
};
class DepthPrepass : public RenderPass<DepthPrepassData>
{
@@ -11,7 +11,7 @@ DECLARE_REF(Scene)
DECLARE_REF(Viewport)
struct LightCullingPassData
{
const LightEnv lightEnv;
LightEnv lightEnv;
};
class LightCullingPass : public RenderPass<LightCullingPassData>
{
+2 -2
View File
@@ -45,11 +45,11 @@ public:
void addPrimitiveComponent(PPrimitiveComponent comp);
const Array<PPrimitiveComponent>& getPrimitives() const { return primitives; }
const Array<MeshBatch>& getStaticMeshes() const { return staticMeshes; }
const Array<StaticMeshBatch>& getStaticMeshes() const { return staticMeshes; }
const LightEnv& getLightBuffer() const { return lightEnv; }
UPSceneUpdater& getSceneUpdater() { return updater; }
private:
Array<MeshBatch> staticMeshes;
Array<StaticMeshBatch> staticMeshes;
Array<PActor> rootActors;
Array<PPrimitiveComponent> primitives;
LightEnv lightEnv;
+2
View File
@@ -6,6 +6,8 @@ target_sources(SeeleEngine
Layout.cpp
RenderHierarchy.h
RenderHierarchy.cpp
System.h
System.cpp
VerticalLayout.h
VerticalLayout.cpp)
+2
View File
@@ -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<PElement> children;
friend class Layout;
+47 -6
View File
@@ -3,12 +3,18 @@
using namespace Seele;
using namespace Seele::UI;
RenderElement::RenderElement()
void AddElementRenderHierarchyUpdate::apply(Array<RenderElement>& elements)
{
for(auto element : elements)
{
if(element.parent == parent)
{
}
}
}
RenderElement::~RenderElement()
void RemoveElementRenderHierarchyUpdate::apply(Array<RenderElement>& 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<RenderHierarchyUpdate*> 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;
}
}
+31 -12
View File
@@ -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<RenderElement>& elements) = 0;
};
struct AddElementRenderHierarchyUpdate : public RenderHierarchyUpdate
{
Element* addedElement;
Element* parent;
virtual void apply(Array<RenderElement>& elements) override;
};
struct RemoveElementRenderHierarchyUpdate : public RenderHierarchyUpdate
{
Element* element;
virtual void apply(Array<RenderElement>& 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<RenderElement>);
// List of all drawable elements in draw order
Array<RenderElement> drawElements;
List<RenderHierarchyUpdate*> updates;
std::mutex updateLock;
};
} // namespace UI
} // namespace Seele
+14
View File
@@ -0,0 +1,14 @@
#include "System.h"
using namespace Seele;
using namespace Seele::UI;
System::System()
{
}
System::~System()
{
}
+21
View File
@@ -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<RenderHierarchyUpdate*> updates;
};
DEFINE_REF(System)
} // namespace UI
} // namespace Seele
+1 -1
View File
@@ -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;