diff --git a/bakara/src/bakara/core/application.cpp b/bakara/src/bakara/core/application.cpp index eccade2..ddcbad1 100644 --- a/bakara/src/bakara/core/application.cpp +++ b/bakara/src/bakara/core/application.cpp @@ -12,9 +12,14 @@ namespace Bk { void Application::on_event(Event& e) { EventDispatcher dispatcher(e); - dispatcher.dispatch(BK_BIND_DISPACHER_FN(WindowCloseEvent, on_window_close)); - dispatcher.dispatch(BK_BIND_DISPACHER_FN(WindowResizeEvent, on_window_resize)); - BK_CORE_INFO("Event : {0}", GET_EVENT_STRING(e)); + if (!(dispatcher.dispatch(BK_BIND_DISPACHER_FN(WindowCloseEvent, on_window_close)) || + dispatcher.dispatch(BK_BIND_DISPACHER_FN(WindowResizeEvent, on_window_resize)))) + { + for(auto it = layer_stack.rbegin(); it != layer_stack.rend(); it++) + { + (*it)->on_event(e); + } + } } bool Application::on_window_close(WindowCloseEvent& e) diff --git a/bakara/src/bakara/core/application.h b/bakara/src/bakara/core/application.h index 117c1a1..ef00ace 100644 --- a/bakara/src/bakara/core/application.h +++ b/bakara/src/bakara/core/application.h @@ -3,6 +3,7 @@ #include #include #include +#include namespace Bk { @@ -17,9 +18,16 @@ namespace Bk { void on_event(Event& e); bool on_window_close(WindowCloseEvent& e); bool on_window_resize(WindowResizeEvent& e); + + void push_overlay(Layer* layer) { layer_stack.push_overlay(layer); } + std::unique_ptr pop_overlay() { return layer_stack.pop_overlay(); } + void push_layer(Layer* layer) { layer_stack.push_layer(layer); } + std::unique_ptr pop_layer() { return layer_stack.pop_layer(); } + void run(); private: std::unique_ptr p_window; + LayerStack layer_stack; bool p_running = true; }; diff --git a/bakara/src/bakara/core/layer.h b/bakara/src/bakara/core/layer.h index 00edf42..c1f6210 100644 --- a/bakara/src/bakara/core/layer.h +++ b/bakara/src/bakara/core/layer.h @@ -1,5 +1,6 @@ #pragma once #include +#include namespace Bk { class Layer @@ -10,9 +11,10 @@ namespace Bk { virtual void on_attach() {} virtual void on_detach() {} - virtual void on_event() {} + virtual void on_event(Event& e) {} virtual void on_update() {} - private: + const std::string to_string() const { return name; } + protected: std::string name; }; } \ No newline at end of file diff --git a/bakara/src/bakara/core/layer_stack.cpp b/bakara/src/bakara/core/layer_stack.cpp index e69de29..af06632 100644 --- a/bakara/src/bakara/core/layer_stack.cpp +++ b/bakara/src/bakara/core/layer_stack.cpp @@ -0,0 +1,50 @@ +#include "layer_stack.h" + +namespace Bk { + LayerStack::~LayerStack() + { + std::for_each(p_layers.begin(), p_layers.end(), [](Layer* layer) + { + layer->on_detach(); + delete layer; + }); + p_layers.clear(); + } + + void LayerStack::push_overlay(Layer* layer) + { + layer->on_attach(); + p_layers.emplace_back(layer); + } + + std::unique_ptr LayerStack::pop_overlay() + { + if(auto layer = p_layers.back()) + { + p_layers.pop_back(); + return std::make_unique(*layer); + } + return nullptr; + } + + void LayerStack::push_layer(Layer* layer) + { + layer->on_attach(); + p_layers.emplace_front(layer); + } + + std::unique_ptr LayerStack::pop_layer() + { + if(auto layer = p_layers.front()) + { + p_layers.pop_front(); + return std::make_unique(*layer); + } + return nullptr; + } + + void LayerStack::clear() + { + p_layers.clear(); + } +} \ No newline at end of file diff --git a/bakara/src/bakara/core/layer_stack.h b/bakara/src/bakara/core/layer_stack.h index 2a03220..d986f57 100644 --- a/bakara/src/bakara/core/layer_stack.h +++ b/bakara/src/bakara/core/layer_stack.h @@ -1,8 +1,29 @@ #pragma once -namespace BK { +#include +#include "layer.h" + +namespace Bk { class LayerStack { + public: + LayerStack() = default; + ~LayerStack(); + + void push_overlay(Layer* layer); + std::unique_ptr pop_overlay(); + void push_layer(Layer* layer); + std::unique_ptr pop_layer(); + void clear(); + + std::deque::iterator begin() { return p_layers.begin(); } + std::deque::iterator end() { return p_layers.end(); } + + std::deque::reverse_iterator rbegin() { return p_layers.rbegin(); } + std::deque::reverse_iterator rend() { return p_layers.rend(); } + private: + std::deque p_layers; + uint p_layer_index = 0; }; } \ No newline at end of file