From 43b2f72ded587e49c8ac624298a2e3361b4888e2 Mon Sep 17 00:00:00 2001 From: Light Date: Wed, 21 Jul 2021 15:14:22 +0430 Subject: [PATCH] Layer Improvements - Added 'Layer::OnEvent()', 'Layer' now handles an event by itself and doesn't need another class to determine the event's type - Added reverse iterators 'rend()' and 'rbegin()' to 'LayerStack' - Removed 'LayerStack::On*()', 'LayerStack' is meant to be a data structure for the layers, - 'Layer::On*Event()' are now protected and called by 'Layer::OnEvent()' - 'Application' now handles iterating through the 'Layer's and calling the update/on* functions - Fixed a typo where in 'Mirror' where the name of the 'MirrorLayer' was "SandboxLayer" instead of "MirrorLayer" --- Engine/src/Engine/Base.h | 15 ++++- Engine/src/Engine/Core/Application.cpp | 19 +++++-- Engine/src/Engine/Layer/Layer.cpp | 45 +++++++++++++++ Engine/src/Engine/Layer/Layer.h | 5 ++ Engine/src/Engine/Layer/LayerStack.cpp | 78 +------------------------- Engine/src/Engine/Layer/LayerStack.h | 9 +-- Mirror/src/MirrorApp.cpp | 2 +- 7 files changed, 84 insertions(+), 89 deletions(-) create mode 100644 Engine/src/Engine/Layer/Layer.cpp diff --git a/Engine/src/Engine/Base.h b/Engine/src/Engine/Base.h index c74074e..333816a 100644 --- a/Engine/src/Engine/Base.h +++ b/Engine/src/Engine/Base.h @@ -29,7 +29,20 @@ // 0.7.2: [ Failed engine/client assertion ] // - Separated 'FailedAssertion' into 'FailedEngineAssertion' and 'FailedClientAssertion' // - Minor adjustment to the change log -// +// +// 0.7.3: [ Layer ] +// - Added 'Layer::OnEvent()', 'Layer' now handles an event by itself and doesn't need another class to determine the event's type +// +// - Added reverse iterators 'rend()' and 'rbegin()' to 'LayerStack' +// +// - Removed 'LayerStack::On*()', 'LayerStack' +// +// - 'Layer::On*Event()' are now protected and called by 'Layer::OnEvent()' +// +// - 'Application' now handles iterating through the 'Layer's and calling the update / on * functions +// +// - Fixed a typo where in 'Mirror' where the name of the 'MirrorLayer' was "SandboxLayer" instead of "MirrorLayer" +// ///*** [ CHANGE_LOG ] ***/// // platform diff --git a/Engine/src/Engine/Core/Application.cpp b/Engine/src/Engine/Core/Application.cpp index b429237..d38e7fd 100644 --- a/Engine/src/Engine/Core/Application.cpp +++ b/Engine/src/Engine/Core/Application.cpp @@ -11,6 +11,8 @@ #include "Graphics/Renderer.h" #include "Graphics/RenderCommand.h" +#include "Layer/Layer.h" + #include "Time/Timer.h" #include "UserInterface/UserInterface.h" @@ -56,14 +58,19 @@ namespace Light { { // update layers LT_PROFILE_SCOPE("GameLoop::Update"); - m_LayerStack.OnUpdate(deltaTimer.GetDeltaTime()); + + for (auto it = m_LayerStack.begin(); it != m_LayerStack.end(); it++) + (*it)->OnUpdate(deltaTimer.GetDeltaTime()); } { // render layers LT_PROFILE_SCOPE("GameLoop::Render"); m_Window->GetGfxContext()->GetRenderer()->BeginFrame(); - m_LayerStack.OnRender(); + + for (auto it = m_LayerStack.begin(); it != m_LayerStack.end(); it++) + (*it)->OnRender(); + m_Window->GetGfxContext()->GetRenderer()->EndFrame(); } @@ -71,7 +78,10 @@ namespace Light { // render user interface LT_PROFILE_SCOPE("GameLoop::UserInterface"); m_Window->GetGfxContext()->GetUserInterface()->Begin(); - m_LayerStack.OnUserInterfaceUpdate(); + + for (auto it = m_LayerStack.begin(); it != m_LayerStack.end(); it++) + (*it)->OnUserInterfaceUpdate(); + m_Window->GetGfxContext()->GetUserInterface()->End(); } @@ -108,7 +118,8 @@ namespace Light { // ... // layers - m_LayerStack.OnEvent(event); + for (auto it = m_LayerStack.rbegin(); it != m_LayerStack.rend(); it++) + if ((*it)->OnEvent(event)) return; } void Application::LogDebugData() diff --git a/Engine/src/Engine/Layer/Layer.cpp b/Engine/src/Engine/Layer/Layer.cpp new file mode 100644 index 0000000..e3cbd76 --- /dev/null +++ b/Engine/src/Engine/Layer/Layer.cpp @@ -0,0 +1,45 @@ +#include "ltpch.h" +#include "Layer.h" + +#include "Events/Event.h" +#include "Events/MouseEvents.h" +#include "Events/KeyboardEvents.h" +#include "Events/WindowEvents.h" + +namespace Light { + + bool Layer::OnEvent(const Event& event) + { + switch (event.GetEventType()) + { + //** MOUSE_EVENTS **// + case EventType::MouseMoved: + return OnMouseMoved((MouseMovedEvent&)event); + case EventType::ButtonPressed: + return OnButtonPressed((ButtonPressedEvent&)event); + case EventType::ButtonReleased: + return OnButtonReleased((ButtonReleasedEvent&)event); + case EventType::WheelScrolled: + return OnWheelScrolled((WheelScrolledEvent&)event); + + //** KEYBOARD_EVENTS **// + case EventType::KeyPressed: + return OnKeyPressed((KeyPressedEvent&)event); + case EventType::KeyReleased: + return OnKeyReleased((KeyReleasedEvent&)event); + + //** WINDOW_EVENTS **// + case EventType::WindowClosed: + return OnWindowClosed((WindowClosedEvent&)event); + case EventType::WindowResized: + return OnWindowResized((WindowResizedEvent&)event); + case EventType::WindowMoved: + return OnWindowMoved((WindowMovedEvent&)event); + case EventType::WindowLostFocus: + return OnWindowLostFocus((WindowLostFocusEvent&)event); + case EventType::WindowGainFocus: + return OnWindowGainFocus((WindowGainFocusEvent&)event); + } + } + +} \ No newline at end of file diff --git a/Engine/src/Engine/Layer/Layer.h b/Engine/src/Engine/Layer/Layer.h index 9af01fd..a19d05c 100644 --- a/Engine/src/Engine/Layer/Layer.h +++ b/Engine/src/Engine/Layer/Layer.h @@ -4,6 +4,8 @@ namespace Light { + class Event; + class MouseMovedEvent; class ButtonPressedEvent; class ButtonReleasedEvent; @@ -35,6 +37,9 @@ namespace Light { virtual void OnRender() {} + bool OnEvent(const Event& event); + + protected: //** MOUSE_EVENTS // virtual bool OnMouseMoved(const MouseMovedEvent& event) { return false; } virtual bool OnButtonPressed(const ButtonPressedEvent& event) { return false; } diff --git a/Engine/src/Engine/Layer/LayerStack.cpp b/Engine/src/Engine/Layer/LayerStack.cpp index d2c152e..628d161 100644 --- a/Engine/src/Engine/Layer/LayerStack.cpp +++ b/Engine/src/Engine/Layer/LayerStack.cpp @@ -24,83 +24,9 @@ namespace Light { delete layer; } - void LayerStack::OnUpdate(float deltaTime) - { - for (auto it = m_Begin; it != m_End; it++) - (*it)->OnUpdate(deltaTime); - } - - void LayerStack::OnUserInterfaceUpdate() - { - for (auto it = m_Begin; it != m_End; it++) - (*it)->OnUserInterfaceUpdate(); - } - - void LayerStack::OnRender() - { - for (auto it = m_Begin; it != m_End; it++) - (*it)->OnRender(); - } - - void LayerStack::OnEvent(const Event& event) - { - switch (event.GetEventType()) - { - // Mouse - case EventType::MouseMoved: - for (auto it = m_Begin; it != m_End; it++) - if ((*it)->OnButtonPressed((ButtonPressedEvent&)event)) return; - - case EventType::ButtonPressed: - for (auto it = m_Begin; it != m_End; it++) - if ((*it)->OnButtonPressed((ButtonPressedEvent&)event)) return; - return; - case EventType::ButtonReleased: - for (auto it = m_Begin; it != m_End; it++) - if ((*it)->OnButtonReleased((ButtonReleasedEvent&)event)) return; - return; - case EventType::WheelScrolled: - for (auto it = m_Begin; it != m_End; it++) - if ((*it)->OnWheelScrolled((WheelScrolledEvent&)event)) return; - return; - - // Keyboard - case EventType::KeyPressed: - for (auto it = m_Begin; it != m_End; it++) - if ((*it)->OnKeyPressed((KeyPressedEvent&)event)) return; - return; - case EventType::KeyReleased: - for (auto it = m_Begin; it != m_End; it++) - if ((*it)->OnKeyReleased((KeyReleasedEvent&)event)) return; - return; - - // Window - case EventType::WindowClosed: - for (auto it = m_Begin; it != m_End; it++) - if ((*it)->OnWindowClosed((WindowClosedEvent&)event)) return; - return; - case EventType::WindowResized: - for (auto it = m_Begin; it != m_End; it++) - if ((*it)->OnWindowResized((WindowResizedEvent&)event)) return; - return; - case EventType::WindowMoved: - for (auto it = m_Begin; it != m_End; it++) - if ((*it)->OnWindowMoved((WindowMovedEvent&)event)) return; - return; - case EventType::WindowLostFocus: - for (auto it = m_Begin; it != m_End; it++) - if ((*it)->OnWindowLostFocus((WindowLostFocusEvent&)event)) return; - return; - case EventType::WindowGainFocus: - for (auto it = m_Begin; it != m_End; it++) - if ((*it)->OnWindowGainFocus((WindowGainFocusEvent&)event)) return; - return; - } - } - void LayerStack::AttachLayerImpl(Layer* layer) { - // #todo: handle attaching layer on for loop + // #todo: handle attaching layer inside a for loop m_Layers.push_back(layer); m_Begin = m_Layers.begin(); m_End = m_Layers.end(); @@ -110,7 +36,7 @@ namespace Light { void LayerStack::DetachLayerImpl(Layer* layer) { - // #todo: handle detaching layer on for loop + // #todo: handle detaching layer inside a for loop m_Layers.erase(std::find(m_Layers.begin(), m_Layers.end(), layer)); m_Begin = m_Layers.begin(); m_End = m_Layers.end(); diff --git a/Engine/src/Engine/Layer/LayerStack.h b/Engine/src/Engine/Layer/LayerStack.h index 9862b7d..4c56df7 100644 --- a/Engine/src/Engine/Layer/LayerStack.h +++ b/Engine/src/Engine/Layer/LayerStack.h @@ -24,17 +24,12 @@ namespace Light { static inline void AttachLayer(Layer* layer) { s_Context->AttachLayerImpl(layer); } static inline void DetachLayer(Layer* layer) { s_Context->DetachLayerImpl(layer); } - void OnUpdate(float deltaTime); - void OnUserInterfaceUpdate(); - - void OnRender(); - - void OnEvent(const Event& event); - inline bool IsEmpty() { return m_Layers.empty(); } std::vector::iterator begin() { return m_Layers.begin(); } std::vector::iterator end() { return m_Layers.end(); } + std::vector::reverse_iterator rbegin() { return m_Layers.rbegin(); } + std::vector::reverse_iterator rend() { return m_Layers.rend(); } private: void AttachLayerImpl(Layer* layer); diff --git a/Mirror/src/MirrorApp.cpp b/Mirror/src/MirrorApp.cpp index 1b72521..ab4e5b2 100644 --- a/Mirror/src/MirrorApp.cpp +++ b/Mirror/src/MirrorApp.cpp @@ -20,7 +20,7 @@ public: m_Window->SetProperties(properties); // Attach the sandbox layer - Light::LayerStack::AttachLayer(new MirrorLayer("SandboxLayer")); + Light::LayerStack::AttachLayer(new MirrorLayer("MirrorLayer")); } ~Mirror()