5 LayerStack::LayerStack() {
9 LayerStack::~LayerStack() {
10 while (!m_Layers.empty()) {
11 m_Layers.back()->OnDetach();
12 delete m_Layers.back();
18 std::expected<void, CoriError<>> LayerStack::PushLayerToQueue(
Layer* layer) {
20 bool nameCollision =
false;
21 for (
const Layer* l : m_Layers) {
23 nameCollision = l->GetName() == layer->GetName();
29 return std::unexpected{CoriError(std::format(
"Layer with name '{}' already exist in the LayerStack. Layers can't have duplicate names.", layer->GetName()))};
32 m_LayerPushQueue.push_back(layer);
37 return std::unexpected(CoriError(
"Trying to push a null Layer."));
40 std::expected<void, CoriError<>> LayerStack::PushOverlayToQueue(
Layer* overlay) {
42 bool nameCollision =
false;
43 for (
const Layer* l : m_Layers) {
45 nameCollision = l->GetName() == overlay->GetName();
51 return std::unexpected{CoriError(std::format(
"Layer with name '{}' already exist in the LayerStack. Layers can't have duplicate names.", overlay->GetName()))};
54 m_OverlayPushQueue.push_back(overlay);
59 return std::unexpected(CoriError(
"Trying to push a null Overlay Layer."));
62 void LayerStack::PopLayerToQueue() {
66 void LayerStack::PopOverlayToQueue() {
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)) {
80 if (m_OverlayPushQueue.size() != 0) {
81 std::vector<Layer*> layersToPush = std::move(m_OverlayPushQueue);
82 for (Layer* layer : std::views::reverse(layersToPush)) {
88 if (m_LayerPopQueue != 0) {
89 for (uint32_t i = 0; i < m_LayerPopQueue; ++i) {
95 if (m_OverlayPopQueue != 0) {
96 for (uint32_t i = 0; i < m_OverlayPopQueue; ++i) {
99 m_OverlayPopQueue = 0;
103 void LayerStack::ClearStack() {
105 while (!m_Layers.empty()) {
106 m_Layers.back()->OnDetach();
107 delete m_Layers.back();
113 void LayerStack::PushLayer(
Layer* layer) {
114 m_Layers.emplace(m_Layers.begin() + m_LayerInsertIndex, layer);
116 ++m_LayerInsertIndex;
120 void LayerStack::PushOverlay(
Layer* overlay) {
121 m_Layers.emplace_back(overlay);
123 ++m_OverlayLayerCount;
127 void LayerStack::PopLayer() {
128 if (m_LayerInsertIndex != 0) {
129 Layer* layer = m_Layers.at(m_LayerInsertIndex - 1);
131 m_Layers.erase(m_Layers.begin() + m_LayerInsertIndex);
132 --m_LayerInsertIndex;
137 void LayerStack::PopOverlay() {
138 if (m_OverlayLayerCount != 0) {
139 Layer* overlay = m_Layers.at(m_Layers.size() - 1 - m_OverlayLayerCount);
141 m_Layers.erase(m_Layers.begin() + m_Layers.size() - m_OverlayLayerCount);
142 --m_OverlayLayerCount;
#define CORI_CORE_DEBUG_TAGGED(...)
#define CORI_CORE_INFO_TAGGED(...)
#define CORI_PROFILE_FUNCTION()
An abstract class that is ment to be used as a template for defining layers.
Core systems of the engine are here.