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; | ||||
| 	} | ||||
| 
 | ||||
| 	[[nodiscard]] auto get_layer_stack() -> LayerStack & | ||||
| 	{ | ||||
| 		return *m_layer_stack; | ||||
| 	} | ||||
| 
 | ||||
| 	static void quit(); | ||||
| 
 | ||||
| protected: | ||||
|  | @ -64,6 +69,8 @@ private: | |||
| 
 | ||||
| 	Scope<Renderer> m_renderer; | ||||
| 
 | ||||
| 	Scope<LayerStack> m_layer_stack; | ||||
| 
 | ||||
| 	static Application *s_instance; | ||||
| }; | ||||
| 
 | ||||
|  |  | |||
|  | @ -1,6 +1,5 @@ | |||
| #pragma once | ||||
| 
 | ||||
| 
 | ||||
| namespace lt { | ||||
| 
 | ||||
| class Layer; | ||||
|  | @ -9,61 +8,43 @@ class Event; | |||
| class LayerStack | ||||
| { | ||||
| public: | ||||
| 	static auto instance() -> LayerStack & | ||||
| 	{ | ||||
| 		static auto instance = LayerStack {}; | ||||
| 		return instance; | ||||
| 	} | ||||
| 
 | ||||
| 	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) | ||||
| 	{ | ||||
| 		instance().attach_layer_impl(std::move(layer)); | ||||
| 	} | ||||
| 	void attach_layer(Ref<Layer> layer); | ||||
| 
 | ||||
| 	static void detach_layer(const Ref<Layer> &layer) | ||||
| 	{ | ||||
| 		instance().detach_layer_impl(layer); | ||||
| 	} | ||||
| 	void detach_layer(const Ref<Layer> &layer); | ||||
| 
 | ||||
| 	auto is_empty() -> bool | ||||
| 	[[nodiscard]] auto is_empty() const -> bool | ||||
| 	{ | ||||
| 		return m_layers.empty(); | ||||
| 	} | ||||
| 
 | ||||
| 	auto begin() -> std::vector<Ref<Layer>>::iterator | ||||
| 	[[nodiscard]] auto begin() -> std::vector<Ref<Layer>>::iterator | ||||
| 	{ | ||||
| 		return m_layers.begin(); | ||||
| 	} | ||||
| 
 | ||||
| 	auto end() -> std::vector<Ref<Layer>>::iterator | ||||
| 	[[nodiscard]] auto end() -> std::vector<Ref<Layer>>::iterator | ||||
| 	{ | ||||
| 		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(); | ||||
| 	} | ||||
| 
 | ||||
| 	auto rend() -> std::vector<Ref<Layer>>::reverse_iterator | ||||
| 	[[nodiscard]] auto rend() -> std::vector<Ref<Layer>>::reverse_iterator | ||||
| 	{ | ||||
| 		return m_layers.rend(); | ||||
| 	} | ||||
| 
 | ||||
| private: | ||||
| 	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
 | ||||
|  |  | |||
|  | @ -66,6 +66,8 @@ Application::Application(): m_window(nullptr) | |||
| 	    (GLFWwindow *)m_window->get_handle(), | ||||
| 	    m_graphics_context->get_shared_context() | ||||
| 	); | ||||
| 
 | ||||
| 	m_layer_stack = create_scope<LayerStack>(); | ||||
| } | ||||
| 
 | ||||
| void Application::game_loop() | ||||
|  | @ -88,7 +90,7 @@ void Application::quit() | |||
| 
 | ||||
| void Application::update_layers() | ||||
| { | ||||
| 	for (auto &it : LayerStack::instance()) | ||||
| 	for (auto &it : *m_layer_stack) | ||||
| 	{ | ||||
| 		it->on_update(m_timer.get_elapsed_time()); | ||||
| 	} | ||||
|  | @ -101,7 +103,7 @@ void Application::render_layers() | |||
| { | ||||
| 	m_renderer->begin_frame(); | ||||
| 
 | ||||
| 	for (auto &it : LayerStack::instance()) | ||||
| 	for (auto &it : *m_layer_stack) | ||||
| 	{ | ||||
| 		it->on_render(); | ||||
| 	} | ||||
|  | @ -113,7 +115,7 @@ void Application::render_user_interface() | |||
| { | ||||
| 	m_user_interface->begin(); | ||||
| 
 | ||||
| 	for (auto &it : LayerStack::instance()) | ||||
| 	for (auto &it : *m_layer_stack) | ||||
| 	{ | ||||
| 		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)) | ||||
| 		{ | ||||
|  | @ -167,7 +169,8 @@ void Application::on_event(const Event &event) | |||
| 	lt_assert(m_user_interface, "User interface is not initialized"); | ||||
| 	lt_assert(m_graphics_context, "Graphics context 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..."); | ||||
| 	this->log_debug_data(); | ||||
|  |  | |||
|  | @ -1,21 +1,17 @@ | |||
| #include <engine/layer/layer.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 { | ||||
| 
 | ||||
| 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)); | ||||
| } | ||||
| 
 | ||||
| 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)); | ||||
| } | ||||
| 
 | ||||
|  |  | |||
|  | @ -13,17 +13,13 @@ class Mirror: public Application | |||
| public: | ||||
| 	Mirror() | ||||
| 	{ | ||||
| 		// Set window properties
 | ||||
| 		auto properties = WindowProperties { | ||||
| 			.title = "Mirror", | ||||
| 			.size = glm::uvec2(1280u, 720u), | ||||
| 			.vsync = true, | ||||
| 		}; | ||||
| 		get_window().set_properties(WindowProperties { | ||||
| 		    .title = "Mirror", | ||||
| 		    .size = glm::uvec2(1280u, 720u), | ||||
| 		    .vsync = true, | ||||
| 		}); | ||||
| 
 | ||||
| 		get_window().set_properties(properties); | ||||
| 
 | ||||
| 		// Attach the sandbox layer
 | ||||
| 		LayerStack::emplace_layer<EditorLayer>("MirrorLayer"); | ||||
| 		get_layer_stack().emplace_layer<EditorLayer>("MirrorLayer"); | ||||
| 	} | ||||
| }; | ||||
| 
 | ||||
|  |  | |||
		Loading…
	
	Add table
		
		Reference in a new issue