refactor: layer stack
This commit is contained in:
		
							parent
							
								
									284ef9be53
								
							
						
					
					
						commit
						6381ed1514
					
				
					 5 changed files with 34 additions and 51 deletions
				
			
		| 
						 | 
					@ -36,6 +36,11 @@ public:
 | 
				
			||||||
		return *m_window;
 | 
							return *m_window;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						[[nodiscard]] auto get_layer_stack() -> LayerStack &
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							return *m_layer_stack;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	static void quit();
 | 
						static void quit();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
protected:
 | 
					protected:
 | 
				
			||||||
| 
						 | 
					@ -64,6 +69,8 @@ private:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	Scope<Renderer> m_renderer;
 | 
						Scope<Renderer> m_renderer;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						Scope<LayerStack> m_layer_stack;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	static Application *s_instance;
 | 
						static Application *s_instance;
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1,6 +1,5 @@
 | 
				
			||||||
#pragma once
 | 
					#pragma once
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					 | 
				
			||||||
namespace lt {
 | 
					namespace lt {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
class Layer;
 | 
					class Layer;
 | 
				
			||||||
| 
						 | 
					@ -9,61 +8,43 @@ class Event;
 | 
				
			||||||
class LayerStack
 | 
					class LayerStack
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
public:
 | 
					public:
 | 
				
			||||||
	static auto instance() -> LayerStack &
 | 
					 | 
				
			||||||
	{
 | 
					 | 
				
			||||||
		static auto instance = LayerStack {};
 | 
					 | 
				
			||||||
		return instance;
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	template<typename Layer_T, typename... Args>
 | 
						template<typename Layer_T, typename... Args>
 | 
				
			||||||
	static void emplace_layer(Args &&...args)
 | 
						void emplace_layer(Args &&...args)
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		instance().attach_layer_impl(create_ref<Layer_T>(std::forward<Args>(args)...));
 | 
							attach_layer(create_ref<Layer_T>(std::forward<Args>(args)...));
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	static void attach_layer(Ref<Layer> layer)
 | 
						void attach_layer(Ref<Layer> layer);
 | 
				
			||||||
	{
 | 
					 | 
				
			||||||
		instance().attach_layer_impl(std::move(layer));
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
	static void detach_layer(const Ref<Layer> &layer)
 | 
						void detach_layer(const Ref<Layer> &layer);
 | 
				
			||||||
	{
 | 
					 | 
				
			||||||
		instance().detach_layer_impl(layer);
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
	auto is_empty() -> bool
 | 
						[[nodiscard]] auto is_empty() const -> bool
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		return m_layers.empty();
 | 
							return m_layers.empty();
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	auto begin() -> std::vector<Ref<Layer>>::iterator
 | 
						[[nodiscard]] auto begin() -> std::vector<Ref<Layer>>::iterator
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		return m_layers.begin();
 | 
							return m_layers.begin();
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	auto end() -> std::vector<Ref<Layer>>::iterator
 | 
						[[nodiscard]] auto end() -> std::vector<Ref<Layer>>::iterator
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		return m_layers.end();
 | 
							return m_layers.end();
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	auto rbegin() -> std::vector<Ref<Layer>>::reverse_iterator
 | 
						[[nodiscard]] auto rbegin() -> std::vector<Ref<Layer>>::reverse_iterator
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		return m_layers.rbegin();
 | 
							return m_layers.rbegin();
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	auto rend() -> std::vector<Ref<Layer>>::reverse_iterator
 | 
						[[nodiscard]] auto rend() -> std::vector<Ref<Layer>>::reverse_iterator
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		return m_layers.rend();
 | 
							return m_layers.rend();
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
private:
 | 
					private:
 | 
				
			||||||
	std::vector<Ref<Layer>> m_layers;
 | 
						std::vector<Ref<Layer>> m_layers;
 | 
				
			||||||
 | 
					 | 
				
			||||||
	LayerStack() = default;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	void attach_layer_impl(Ref<Layer> layer);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	void detach_layer_impl(const Ref<Layer> &layer);
 | 
					 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
} // namespace lt
 | 
					} // namespace lt
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -66,6 +66,8 @@ Application::Application(): m_window(nullptr)
 | 
				
			||||||
	    (GLFWwindow *)m_window->get_handle(),
 | 
						    (GLFWwindow *)m_window->get_handle(),
 | 
				
			||||||
	    m_graphics_context->get_shared_context()
 | 
						    m_graphics_context->get_shared_context()
 | 
				
			||||||
	);
 | 
						);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						m_layer_stack = create_scope<LayerStack>();
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void Application::game_loop()
 | 
					void Application::game_loop()
 | 
				
			||||||
| 
						 | 
					@ -88,7 +90,7 @@ void Application::quit()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void Application::update_layers()
 | 
					void Application::update_layers()
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	for (auto &it : LayerStack::instance())
 | 
						for (auto &it : *m_layer_stack)
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		it->on_update(m_timer.get_elapsed_time());
 | 
							it->on_update(m_timer.get_elapsed_time());
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
| 
						 | 
					@ -101,7 +103,7 @@ void Application::render_layers()
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	m_renderer->begin_frame();
 | 
						m_renderer->begin_frame();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	for (auto &it : LayerStack::instance())
 | 
						for (auto &it : *m_layer_stack)
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		it->on_render();
 | 
							it->on_render();
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
| 
						 | 
					@ -113,7 +115,7 @@ void Application::render_user_interface()
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	m_user_interface->begin();
 | 
						m_user_interface->begin();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	for (auto &it : LayerStack::instance())
 | 
						for (auto &it : *m_layer_stack)
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		it->on_user_interface_update();
 | 
							it->on_user_interface_update();
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
| 
						 | 
					@ -150,7 +152,7 @@ void Application::on_event(const Event &event)
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	for (auto &it : std::ranges::reverse_view(LayerStack::instance()))
 | 
						for (auto &it : std::ranges::reverse_view(*m_layer_stack))
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		if (it->on_event(event))
 | 
							if (it->on_event(event))
 | 
				
			||||||
		{
 | 
							{
 | 
				
			||||||
| 
						 | 
					@ -167,7 +169,8 @@ void Application::on_event(const Event &event)
 | 
				
			||||||
	lt_assert(m_user_interface, "User interface is not initialized");
 | 
						lt_assert(m_user_interface, "User interface is not initialized");
 | 
				
			||||||
	lt_assert(m_graphics_context, "Graphics context is not initialized");
 | 
						lt_assert(m_graphics_context, "Graphics context is not initialized");
 | 
				
			||||||
	lt_assert(m_renderer, "Renderer is not initialized");
 | 
						lt_assert(m_renderer, "Renderer is not initialized");
 | 
				
			||||||
	lt_assert(!LayerStack::instance().is_empty(), "Layer_stack is empty");
 | 
						lt_assert(m_layer_stack, "Layer_stack is not initialized");
 | 
				
			||||||
 | 
						lt_assert(!m_layer_stack->is_empty(), "Layer_stack is empty");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	log_inf("Logging application state...");
 | 
						log_inf("Logging application state...");
 | 
				
			||||||
	this->log_debug_data();
 | 
						this->log_debug_data();
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1,21 +1,17 @@
 | 
				
			||||||
#include <engine/layer/layer.hpp>
 | 
					#include <engine/layer/layer.hpp>
 | 
				
			||||||
#include <engine/layer/layer_stack.hpp>
 | 
					#include <engine/layer/layer_stack.hpp>
 | 
				
			||||||
#include <input/events/event.hpp>
 | 
					 | 
				
			||||||
#include <input/events/keyboard.hpp>
 | 
					 | 
				
			||||||
#include <input/events/mouse.hpp>
 | 
					 | 
				
			||||||
#include <input/events/window.hpp>
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
namespace lt {
 | 
					namespace lt {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void LayerStack::attach_layer_impl(Ref<Layer> layer)
 | 
					void LayerStack::attach_layer(Ref<Layer> layer)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	log_trc("Attaching [{}]", layer->get_name());
 | 
						log_trc("Attaching layer [{}]", layer->get_name());
 | 
				
			||||||
	m_layers.emplace_back(std::move(layer));
 | 
						m_layers.emplace_back(std::move(layer));
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void LayerStack::detach_layer_impl(const Ref<Layer> &layer)
 | 
					void LayerStack::detach_layer(const Ref<Layer> &layer)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	log_trc("Detaching [{}]", layer->get_name());
 | 
						log_trc("Detaching layer [{}]", layer->get_name());
 | 
				
			||||||
	m_layers.erase(std::find(m_layers.begin(), m_layers.end(), layer));
 | 
						m_layers.erase(std::find(m_layers.begin(), m_layers.end(), layer));
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -13,17 +13,13 @@ class Mirror: public Application
 | 
				
			||||||
public:
 | 
					public:
 | 
				
			||||||
	Mirror()
 | 
						Mirror()
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		// Set window properties
 | 
							get_window().set_properties(WindowProperties {
 | 
				
			||||||
		auto properties = WindowProperties {
 | 
					 | 
				
			||||||
		    .title = "Mirror",
 | 
							    .title = "Mirror",
 | 
				
			||||||
		    .size = glm::uvec2(1280u, 720u),
 | 
							    .size = glm::uvec2(1280u, 720u),
 | 
				
			||||||
		    .vsync = true,
 | 
							    .vsync = true,
 | 
				
			||||||
		};
 | 
							});
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		get_window().set_properties(properties);
 | 
							get_layer_stack().emplace_layer<EditorLayer>("MirrorLayer");
 | 
				
			||||||
 | 
					 | 
				
			||||||
		// Attach the sandbox layer
 | 
					 | 
				
			||||||
		LayerStack::emplace_layer<EditorLayer>("MirrorLayer");
 | 
					 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
	Add table
		
		Reference in a new issue