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"
This commit is contained in:
Light 2021-07-21 15:14:22 +04:30
parent 2967cf5675
commit 43b2f72ded
7 changed files with 84 additions and 89 deletions

View file

@ -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

View file

@ -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()

View file

@ -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);
}
}
}

View file

@ -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; }

View file

@ -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();

View file

@ -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<Layer*>::iterator begin() { return m_Layers.begin(); }
std::vector<Layer*>::iterator end() { return m_Layers.end(); }
std::vector<Layer*>::reverse_iterator rbegin() { return m_Layers.rbegin(); }
std::vector<Layer*>::reverse_iterator rend() { return m_Layers.rend(); }
private:
void AttachLayerImpl(Layer* layer);

View file

@ -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()