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:
parent
2967cf5675
commit
43b2f72ded
7 changed files with 84 additions and 89 deletions
|
@ -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
|
||||
|
|
|
@ -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()
|
||||
|
|
45
Engine/src/Engine/Layer/Layer.cpp
Normal file
45
Engine/src/Engine/Layer/Layer.cpp
Normal 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);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
|
@ -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; }
|
||||
|
|
|
@ -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();
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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()
|
||||
|
|
Loading…
Add table
Reference in a new issue