CoriEngine
Loading...
Searching...
No Matches
LayerStack.cpp
Go to the documentation of this file.
1#include "LayerStack.hpp"
2
3namespace Cori {
4 namespace Core {
5 LayerStack::LayerStack() {
7 }
8
9 LayerStack::~LayerStack() {
10 while (!m_Layers.empty()) {
11 m_Layers.back()->OnDetach();
12 delete m_Layers.back();
13 m_Layers.pop_back();
14 }
16 }
17
18 std::expected<void, CoriError<>> LayerStack::PushLayerToQueue(Layer* layer) {
19 if (layer) {
20 bool nameCollision = false;
21 for (const Layer* l : m_Layers) {
22 if (!nameCollision) {
23 nameCollision = l->GetName() == layer->GetName();
24 } else {
25 break;
26 }
27 }
28 if (nameCollision) {
29 return std::unexpected{CoriError(std::format("Layer with name '{}' already exist in the LayerStack. Layers can't have duplicate names.", layer->GetName()))};
30 }
31
32 m_LayerPushQueue.push_back(layer);
33 //layer->OnAttach();
34 return {};
35 }
36
37 return std::unexpected(CoriError("Trying to push a null Layer."));
38 }
39
40 std::expected<void, CoriError<>> LayerStack::PushOverlayToQueue(Layer* overlay) {
41 if (overlay) {
42 bool nameCollision = false;
43 for (const Layer* l : m_Layers) {
44 if (!nameCollision) {
45 nameCollision = l->GetName() == overlay->GetName();
46 } else {
47 break;
48 }
49 }
50 if (nameCollision) {
51 return std::unexpected{CoriError(std::format("Layer with name '{}' already exist in the LayerStack. Layers can't have duplicate names.", overlay->GetName()))};
52 }
53
54 m_OverlayPushQueue.push_back(overlay);
55 //overlay->OnAttach();
56 return {};
57 }
58
59 return std::unexpected(CoriError("Trying to push a null Overlay Layer."));
60 }
61
62 void LayerStack::PopLayerToQueue() {
63 m_LayerPopQueue++;
64 }
65
66 void LayerStack::PopOverlayToQueue() {
67 m_LayerPopQueue++;
68 }
69
70 void LayerStack::ProcessQueue() {
72 if (m_LayerPushQueue.size() != 0) {
73 std::vector<Layer*> layersToPush = std::move(m_LayerPushQueue);
74 for (Layer* layer : std::views::reverse(layersToPush)) {
75 PushLayer(layer);
76 //m_LayerPushQueue.erase(std::ranges::find(m_LayerPushQueue, layer));
77 }
78 }
79
80 if (m_OverlayPushQueue.size() != 0) {
81 std::vector<Layer*> layersToPush = std::move(m_OverlayPushQueue);
82 for (Layer* layer : std::views::reverse(layersToPush)) {
83 PushOverlay(layer);
84 //m_OverlayPushQueue.erase(std::ranges::find(m_OverlayPushQueue, layer));
85 }
86 }
87
88 if (m_LayerPopQueue != 0) {
89 for (uint32_t i = 0; i < m_LayerPopQueue; ++i) {
90 PopLayer();
91 }
92 m_LayerPopQueue = 0;
93 }
94
95 if (m_OverlayPopQueue != 0) {
96 for (uint32_t i = 0; i < m_OverlayPopQueue; ++i) {
97 PopOverlay();
98 }
99 m_OverlayPopQueue = 0;
100 }
101 }
102
103 void LayerStack::ClearStack() {
105 while (!m_Layers.empty()) {
106 m_Layers.back()->OnDetach();
107 delete m_Layers.back();
108 m_Layers.pop_back();
109 }
111 }
112
113 void LayerStack::PushLayer(Layer* layer) {
114 m_Layers.emplace(m_Layers.begin() + m_LayerInsertIndex, layer);
115 layer->OnAttach();
116 ++m_LayerInsertIndex;
117 CORI_CORE_DEBUG_TAGGED({ Logger::Tags::Core::Self, Logger::Tags::Core::LayerStack }, "Pushed Layer '{}' to LayerStack.", layer->GetName());
118 }
119
120 void LayerStack::PushOverlay(Layer* overlay) {
121 m_Layers.emplace_back(overlay);
122 overlay->OnAttach();
123 ++m_OverlayLayerCount;
124 CORI_CORE_DEBUG_TAGGED({ Logger::Tags::Core::Self, Logger::Tags::Core::LayerStack }, "Pushed Overlay Layer '{}' to LayerStack.", overlay->GetName());
125 }
126
127 void LayerStack::PopLayer() {
128 if (m_LayerInsertIndex != 0) {
129 Layer* layer = m_Layers.at(m_LayerInsertIndex - 1);
130 layer->OnDetach();
131 m_Layers.erase(m_Layers.begin() + m_LayerInsertIndex);
132 --m_LayerInsertIndex;
133 CORI_CORE_DEBUG_TAGGED({ Logger::Tags::Core::Self, Logger::Tags::Core::LayerStack }, "Popped Layer '{}' from LayerStack.", layer->GetName());
134 }
135 }
136
137 void LayerStack::PopOverlay() {
138 if (m_OverlayLayerCount != 0) {
139 Layer* overlay = m_Layers.at(m_Layers.size() - 1 - m_OverlayLayerCount);
140 overlay->OnDetach();
141 m_Layers.erase(m_Layers.begin() + m_Layers.size() - m_OverlayLayerCount);
142 --m_OverlayLayerCount;
143 CORI_CORE_DEBUG_TAGGED({ Logger::Tags::Core::Self, Logger::Tags::Core::LayerStack }, "Popped Overlay Layer '{}' from LayerStack.", overlay->GetName());
144 }
145 }
146 }
147}
#define CORI_CORE_DEBUG_TAGGED(...)
Definition Logger.hpp:1026
#define CORI_CORE_INFO_TAGGED(...)
Definition Logger.hpp:1027
#define CORI_PROFILE_FUNCTION()
Definition Profiler.hpp:9
An abstract class that is ment to be used as a template for defining layers.
Definition Layer.hpp:13
Core systems of the engine are here.
Global engine namespace.
static constexpr char LayerStack[]
Definition Logger.hpp:95
static constexpr char Self[]
Definition Logger.hpp:83