Files
Seele/src/Engine/UI/RenderHierarchy.h
T

60 lines
1.4 KiB
C++
Raw Normal View History

2021-08-21 18:02:53 +02:00
#pragma once
2021-09-23 10:10:39 +02:00
#include "Elements/Element.h"
2021-10-05 12:24:41 +02:00
#include "Containers/List.h"
2021-08-21 18:02:53 +02:00
namespace Seele
{
namespace UI
{
2021-09-23 10:10:39 +02:00
DECLARE_NAME_REF(Gfx, RenderCommand);
class RenderElement
{
public:
2021-10-05 12:24:41 +02:00
RenderElement() = default;
~RenderElement() = default;
2021-09-29 22:12:56 +02:00
uint32 hierarchyIndex;
2021-10-05 12:24:41 +02:00
Element* parent;
Element* referencedElement;
2021-09-23 10:10:39 +02:00
};
2021-09-29 22:12:56 +02:00
struct RenderHierarchyUpdate
2021-10-05 12:24:41 +02:00
{
virtual void apply(Array<RenderElement>& elements) = 0;
};
2021-09-29 22:12:56 +02:00
2021-10-05 12:24:41 +02:00
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;
};
2021-09-29 22:12:56 +02:00
2021-08-21 18:02:53 +02:00
class RenderHierarchy
{
public:
2021-09-23 10:10:39 +02:00
RenderHierarchy();
~RenderHierarchy();
2021-10-05 12:24:41 +02:00
// logic thread interface, queue hierarchy changes
void addElement(PElement addedElement);
void removeElement(PElement elementToRemove);
void moveElement(PElement elementToMove, PElement newParent);
2021-09-29 22:12:56 +02:00
2021-10-05 12:24:41 +02:00
// render thread interface, apply changes
void updateHierarchy();
private:
static_assert(std::is_trivially_copyable_v<RenderElement>);
2021-09-23 10:10:39 +02:00
// List of all drawable elements in draw order
Array<RenderElement> drawElements;
2021-10-05 12:24:41 +02:00
List<RenderHierarchyUpdate*> updates;
std::mutex updateLock;
2021-08-21 18:02:53 +02:00
};
} // namespace UI
} // namespace Seele