From 4102756e33fec672cd5bb594e16d4a7a5e69a096 Mon Sep 17 00:00:00 2001 From: sippeangelo Date: Thu, 22 May 2014 22:04:54 +0200 Subject: [PATCH 1/2] Beautifully broken --- src/Engine.h | 1 + src/EventBroker.cpp | 55 ++++++++++++++++--- src/EventBroker.h | 74 ++++++++++++++++++++------ src/InputController.h | 5 +- src/InputManager.cpp | 2 + src/InputManager.h | 4 +- src/Systems/DebugSystem.h | 2 +- src/Systems/FreeSteeringSystem.h | 2 +- src/Systems/HelicopterSteeringSystem.h | 2 +- src/Systems/InputSystem.h | 22 ++++---- src/Systems/PhysicsSystem.h | 8 +-- src/Systems/SoundSystem.h | 2 +- src/Systems/TankSteeringSystem.h | 2 +- src/World.cpp | 2 + 14 files changed, 135 insertions(+), 48 deletions(-) diff --git a/src/Engine.h b/src/Engine.h index c063960..2d8215c 100755 --- a/src/Engine.h +++ b/src/Engine.h @@ -38,6 +38,7 @@ public: m_InputManager->Update(dt); m_World->Update(dt); m_Renderer->Draw(dt); + m_EventBroker->Clear(); glfwPollEvents(); } diff --git a/src/EventBroker.cpp b/src/EventBroker.cpp index 68354c9..29ce53c 100644 --- a/src/EventBroker.cpp +++ b/src/EventBroker.cpp @@ -1,5 +1,6 @@ #include "PrecompiledHeader.h" #include "EventBroker.h" +#include "Events/BindKey.h" BaseEventRelay::~BaseEventRelay() { @@ -11,19 +12,57 @@ BaseEventRelay::~BaseEventRelay() void EventBroker::Unsubscribe(BaseEventRelay &relay) // ? { - auto itpair = m_Subscribers.equal_range(relay.m_TypeName); + /*auto itpair = m_Subscribers.equal_range(relay.m_EventTypeName); for (auto it = itpair.first; it != itpair.second; ++it) { - if (it->second == &relay) - { - m_Subscribers.erase(it); - break; - } + if (it->second == &relay) + { + m_Subscribers.erase(it); + break; } + }*/ } void EventBroker::Subscribe(BaseEventRelay &relay) { relay.m_Broker = this; - m_Subscribers.insert(std::make_pair(relay.m_TypeName, &relay)); -} \ No newline at end of file + m_ContextSubscribers[relay.m_ContextTypeName][relay.m_EventTypeName] = &relay; +} + +int EventBroker::Process(std::string contextTypeName) +{ + auto it = m_ContextSubscribers.find(contextTypeName); + if (it == m_ContextSubscribers.end()) + return 0; + + int eventsProcessed = 0; + + EventRelays_t &relays = it->second; + for (auto &pair : *m_EventQueueRead) + { + std::string &eventTypeName = pair.first; + std::shared_ptr event = pair.second; + + /*if (eventTypeName == "struct Events::BindKey") + { + auto bindKey = static_cast(event.get()); + LOG_DEBUG("HsssEJ"); + }*/ + + auto it2 = relays.find(eventTypeName); + if (it2 == relays.end()) + continue; + + auto relay = it2->second; + relay->Receive(event); + eventsProcessed++; + } + + return eventsProcessed; +} + +void EventBroker::Clear() +{ + std::swap(m_EventQueueRead, m_EventQueueWrite); + m_EventQueueWrite->clear(); +} diff --git a/src/EventBroker.h b/src/EventBroker.h index f8877e8..cfd430c 100644 --- a/src/EventBroker.h +++ b/src/EventBroker.h @@ -23,19 +23,22 @@ class BaseEventRelay friend class EventBroker; protected: - BaseEventRelay(std::string typeName) - : m_TypeName(typeName), m_Broker(nullptr) { } + BaseEventRelay(std::string contextTypeName, std::string eventTypeName) + : m_ContextTypeName(contextTypeName) + , m_EventTypeName(eventTypeName) + , m_Broker(nullptr) { } ~BaseEventRelay(); public: - virtual bool Receive(const Event &event) = 0; + virtual bool Receive(std::shared_ptr event) = 0; protected: - std::string m_TypeName; + std::string m_ContextTypeName; + std::string m_EventTypeName; EventBroker* m_Broker; }; -template +template class EventRelay : public BaseEventRelay { public: @@ -43,24 +46,24 @@ public: EventRelay() : m_Callback(nullptr) - , BaseEventRelay(typeid(EventType).name()) { } + , BaseEventRelay(typeid(ContextType).name(), typeid(EventType).name()) { } EventRelay(CallbackType callback) : m_Callback(callback) - , BaseEventRelay(typeid(EventType).name()) { } + , BaseEventRelay(typeid(ContextType).name(), typeid(EventType).name()) { } protected: - bool Receive(const Event &event) override; + bool Receive(std::shared_ptr event) override; private: CallbackType m_Callback; }; -template -bool EventRelay::Receive(const Event &event) +template +bool EventRelay::Receive(std::shared_ptr event) { if (m_Callback != nullptr) { - return m_Callback(static_cast(event)); + return m_Callback(static_cast(*event.get())); } else { @@ -70,27 +73,66 @@ bool EventRelay::Receive(const Event &event) class EventBroker { -template friend class EventRelay; +template friend class EventRelay; public: + EventBroker() + { + m_EventQueueRead = std::make_shared(); + m_EventQueueWrite = std::make_shared(); + } + + void Subscribe(BaseEventRelay &relay); template void Publish(const EventType &event); - void Subscribe(BaseEventRelay &relay); + // Process all events no matter the context. + /*void Process() + { + + }*/ + /* + Process all events in a given context. + Returns: Number of events processed + */ + template + int Process(); + int Process(std::string contextTypeName); + void Clear(); void Unsubscribe(BaseEventRelay &relay); private: - std::unordered_multimap m_Subscribers; + typedef std::string ContextTypeName_t; // typeid(ContextType).name() + typedef std::string EventTypeName_t; // typeid(EventType).name() + + typedef std::unordered_map EventRelays_t; + typedef std::unordered_map ContextSubscribers_t; + ContextSubscribers_t m_ContextSubscribers; + + typedef std::list>> EventQueue_t; + std::shared_ptr m_EventQueueRead; + std::shared_ptr m_EventQueueWrite; }; template void EventBroker::Publish(const EventType &event) { - auto itpair = m_Subscribers.equal_range(typeid(EventType).name()); + /*auto itpair = m_Subscribers.equal_range(typeid(EventType).name()); for (auto it = itpair.first; it != itpair.second; ++it) { it->second->Receive(event); - } + }*/ + + m_EventQueueWrite->push_back(std::make_pair(typeid(EventType).name(), std::shared_ptr(new EventType(event)))); } +template +int EventBroker::Process() +{ + const std::string contextTypeName = typeid(ContextType).name(); + return Process(contextTypeName); +} + + + #endif // MessageRelay_h__ diff --git a/src/InputController.h b/src/InputController.h index 7afd5d5..39c26b1 100644 --- a/src/InputController.h +++ b/src/InputController.h @@ -7,6 +7,7 @@ #include "Events/InputCommand.h" #include "Events/MouseMove.h" +template class InputController { public: @@ -26,8 +27,8 @@ protected: std::shared_ptr<::EventBroker> EventBroker; private: - EventRelay m_EInputCommand; - EventRelay m_EMouseMove; + EventRelay m_EInputCommand; + EventRelay m_EMouseMove; }; #endif // InputController_h__ diff --git a/src/InputManager.cpp b/src/InputManager.cpp index 8c15fea..b20e072 100644 --- a/src/InputManager.cpp +++ b/src/InputManager.cpp @@ -13,6 +13,8 @@ void InputManager::Initialize() void InputManager::Update(double dt) { + EventBroker->Process(); + m_LastKeyState = m_CurrentKeyState; m_LastMouseState = m_CurrentMouseState; m_LastMouseX = m_CurrentMouseX; diff --git a/src/InputManager.h b/src/InputManager.h index 6b56c92..69827ba 100644 --- a/src/InputManager.h +++ b/src/InputManager.h @@ -39,9 +39,9 @@ private: GLFWwindow* m_GLFWWindow; std::shared_ptr<::EventBroker> EventBroker; - EventRelay m_ELockMouse; + EventRelay m_ELockMouse; bool OnLockMouse(const Events::LockMouse &event); - EventRelay m_EUnlockMouse; + EventRelay m_EUnlockMouse; bool OnUnlockMouse(const Events::UnlockMouse &event); std::array m_CurrentKeyState; diff --git a/src/Systems/DebugSystem.h b/src/Systems/DebugSystem.h index 9db4de6..bbf7cd5 100644 --- a/src/Systems/DebugSystem.h +++ b/src/Systems/DebugSystem.h @@ -19,7 +19,7 @@ public: void Update(double dt) override; - EventRelay m_EKeyDown; + EventRelay m_EKeyDown; bool OnKeyDown(const Events::KeyDown &event); //void UpdateEntity(double dt, EntityID entity, EntityID parent) override; diff --git a/src/Systems/FreeSteeringSystem.h b/src/Systems/FreeSteeringSystem.h index b94466b..61a453d 100755 --- a/src/Systems/FreeSteeringSystem.h +++ b/src/Systems/FreeSteeringSystem.h @@ -27,7 +27,7 @@ private: std::unique_ptr m_InputController; }; -class FreeSteeringSystem::FreeSteeringInputController : InputController +class FreeSteeringSystem::FreeSteeringInputController : InputController { public: FreeSteeringInputController(std::shared_ptr<::EventBroker> eventBroker) diff --git a/src/Systems/HelicopterSteeringSystem.h b/src/Systems/HelicopterSteeringSystem.h index ed91096..742ce70 100644 --- a/src/Systems/HelicopterSteeringSystem.h +++ b/src/Systems/HelicopterSteeringSystem.h @@ -27,7 +27,7 @@ private: std::map m_TimeSinceLastShot; }; -class HelicopterSteeringSystem::HelicopterSteeringInputController : InputController +class HelicopterSteeringSystem::HelicopterSteeringInputController : InputController { public: HelicopterSteeringInputController(std::shared_ptr<::EventBroker> eventBroker) diff --git a/src/Systems/InputSystem.h b/src/Systems/InputSystem.h index d13c249..9d51d2a 100755 --- a/src/Systems/InputSystem.h +++ b/src/Systems/InputSystem.h @@ -45,28 +45,28 @@ private: std::unordered_map> m_GamepadButtonBindings; // Gamepad::Button -> command string // Input events - EventRelay m_EKeyDown; + EventRelay m_EKeyDown; bool OnKeyDown(const Events::KeyDown &event); - EventRelay m_EKeyUp; + EventRelay m_EKeyUp; bool OnKeyUp(const Events::KeyUp &event); - EventRelay m_EMousePress; + EventRelay m_EMousePress; bool OnMousePress(const Events::MousePress &event); - EventRelay m_EMouseRelease; + EventRelay m_EMouseRelease; bool OnMouseRelease(const Events::MouseRelease &event); - EventRelay m_EGamepadAxis; + EventRelay m_EGamepadAxis; bool OnGamepadAxis(const Events::GamepadAxis &event); - EventRelay m_EGamepadButtonDown; + EventRelay m_EGamepadButtonDown; bool OnGamepadButtonDown(const Events::GamepadButtonDown &event); - EventRelay m_EGamepadButtonUp; + EventRelay m_EGamepadButtonUp; bool OnGamepadButtonUp(const Events::GamepadButtonUp &event); // Input binding events - EventRelay m_EBindKey; + EventRelay m_EBindKey; bool OnBindKey(const Events::BindKey &event); - EventRelay m_EBindMouseButton; + EventRelay m_EBindMouseButton; bool OnBindMouseButton(const Events::BindMouseButton &event); - EventRelay m_EBindGamepadAxis; + EventRelay m_EBindGamepadAxis; bool OnBindGamepadAxis(const Events::BindGamepadAxis &event); - EventRelay m_EBindGamepadButton; + EventRelay m_EBindGamepadButton; bool OnBindGamepadButton(const Events::BindGamepadButton &event); float GetCommandTotalValue(std::string command); diff --git a/src/Systems/PhysicsSystem.h b/src/Systems/PhysicsSystem.h index 54e61f7..029dd8e 100644 --- a/src/Systems/PhysicsSystem.h +++ b/src/Systems/PhysicsSystem.h @@ -113,13 +113,13 @@ private: hkpWorld* m_PhysicsWorld; // Events - EventRelay m_ETankSteer; + EventRelay m_ETankSteer; bool OnTankSteer(const Events::TankSteer &event); - EventRelay m_ESetVelocity; + EventRelay m_ESetVelocity; bool OnSetVelocity(const Events::SetVelocity &event); - EventRelay m_EApplyForce; + EventRelay m_EApplyForce; bool OnApplyForce(const Events::ApplyForce &event); - EventRelay m_EApplyPointImpulse; + EventRelay m_EApplyPointImpulse; bool OnApplyPointImpulse(const Events::ApplyPointImpulse &event); void SetUpPhysicsState(EntityID entity, EntityID parent); diff --git a/src/Systems/SoundSystem.h b/src/Systems/SoundSystem.h index 7fbc5aa..00ae091 100755 --- a/src/Systems/SoundSystem.h +++ b/src/Systems/SoundSystem.h @@ -44,7 +44,7 @@ private: //unsigned long dataSize; // Events - EventRelay m_EPlaySound; + EventRelay m_EPlaySound; bool OnPlaySound(const Events::PlaySound &event); std::map m_Sources; diff --git a/src/Systems/TankSteeringSystem.h b/src/Systems/TankSteeringSystem.h index 370ba92..ec96df8 100644 --- a/src/Systems/TankSteeringSystem.h +++ b/src/Systems/TankSteeringSystem.h @@ -37,7 +37,7 @@ namespace Systems std::map m_TimeSinceLastShot; }; - class TankSteeringSystem::TankSteeringInputController : InputController + class TankSteeringSystem::TankSteeringInputController : InputController { public: TankSteeringInputController(std::shared_ptr<::EventBroker> eventBroker, int playerID) diff --git a/src/World.cpp b/src/World.cpp index 2a25856..fe1f760 100755 --- a/src/World.cpp +++ b/src/World.cpp @@ -36,7 +36,9 @@ void World::Update(double dt) { for (auto pair : m_Systems) { + const std::string &type = pair.first; auto system = pair.second; + m_EventBroker->Process(type); system->Update(dt); RecursiveUpdate(system, dt, 0); } From e48df894cf15373ee57bd9f48f1d021b5ac2e96a Mon Sep 17 00:00:00 2001 From: sippeangelo Date: Fri, 23 May 2014 23:31:24 +0200 Subject: [PATCH 2/2] Better events --- src/EventBroker.cpp | 46 ++++++++++++++++++++++----------------------- src/EventBroker.h | 31 ++++++++++++++++++++---------- 2 files changed, 44 insertions(+), 33 deletions(-) diff --git a/src/EventBroker.cpp b/src/EventBroker.cpp index 29ce53c..118eddf 100644 --- a/src/EventBroker.cpp +++ b/src/EventBroker.cpp @@ -12,50 +12,50 @@ BaseEventRelay::~BaseEventRelay() void EventBroker::Unsubscribe(BaseEventRelay &relay) // ? { - /*auto itpair = m_Subscribers.equal_range(relay.m_EventTypeName); + auto contextIt = m_ContextRelays.find(relay.m_ContextTypeName); + if (contextIt == m_ContextRelays.end()) + return; + + auto eventRelays = contextIt->second; + + auto itpair = eventRelays.equal_range(relay.m_EventTypeName); for (auto it = itpair.first; it != itpair.second; ++it) { - if (it->second == &relay) - { - m_Subscribers.erase(it); - break; + if (it->second == &relay) + { + eventRelays.erase(it); + break; + } } - }*/ } void EventBroker::Subscribe(BaseEventRelay &relay) { relay.m_Broker = this; - m_ContextSubscribers[relay.m_ContextTypeName][relay.m_EventTypeName] = &relay; + m_ContextRelays[relay.m_ContextTypeName].insert(std::make_pair(relay.m_EventTypeName, &relay)); } int EventBroker::Process(std::string contextTypeName) { - auto it = m_ContextSubscribers.find(contextTypeName); - if (it == m_ContextSubscribers.end()) + auto it = m_ContextRelays.find(contextTypeName); + if (it == m_ContextRelays.end()) return 0; - int eventsProcessed = 0; - EventRelays_t &relays = it->second; + + int eventsProcessed = 0; for (auto &pair : *m_EventQueueRead) { std::string &eventTypeName = pair.first; std::shared_ptr event = pair.second; - /*if (eventTypeName == "struct Events::BindKey") + auto itpair = relays.equal_range(eventTypeName); + for (auto it2 = itpair.first; it2 != itpair.second; ++it2) { - auto bindKey = static_cast(event.get()); - LOG_DEBUG("HsssEJ"); - }*/ - - auto it2 = relays.find(eventTypeName); - if (it2 == relays.end()) - continue; - - auto relay = it2->second; - relay->Receive(event); - eventsProcessed++; + auto relay = it2->second; + relay->Receive(event); + eventsProcessed++; + } } return eventsProcessed; diff --git a/src/EventBroker.h b/src/EventBroker.h index cfd430c..e29437a 100644 --- a/src/EventBroker.h +++ b/src/EventBroker.h @@ -3,6 +3,7 @@ #include #include +#include #include #include @@ -30,7 +31,7 @@ protected: ~BaseEventRelay(); public: - virtual bool Receive(std::shared_ptr event) = 0; + virtual bool Receive(const std::shared_ptr event) = 0; protected: std::string m_ContextTypeName; @@ -52,18 +53,18 @@ public: , BaseEventRelay(typeid(ContextType).name(), typeid(EventType).name()) { } protected: - bool Receive(std::shared_ptr event) override; + bool Receive(const std::shared_ptr event) override; private: CallbackType m_Callback; }; template -bool EventRelay::Receive(std::shared_ptr event) +bool EventRelay::Receive(const std::shared_ptr event) { if (m_Callback != nullptr) { - return m_Callback(static_cast(*event.get())); + return m_Callback(*static_cast(event.get())); } else { @@ -99,21 +100,22 @@ public: int Process(std::string contextTypeName); void Clear(); void Unsubscribe(BaseEventRelay &relay); + template + void UnsubscribeAll(); private: typedef std::string ContextTypeName_t; // typeid(ContextType).name() typedef std::string EventTypeName_t; // typeid(EventType).name() - typedef std::unordered_map EventRelays_t; - typedef std::unordered_map ContextSubscribers_t; - ContextSubscribers_t m_ContextSubscribers; + typedef std::unordered_multimap EventRelays_t; + typedef std::unordered_map ContextRelays_t; + ContextRelays_t m_ContextRelays; typedef std::list>> EventQueue_t; std::shared_ptr m_EventQueueRead; std::shared_ptr m_EventQueueWrite; }; - template void EventBroker::Publish(const EventType &event) { @@ -123,7 +125,7 @@ void EventBroker::Publish(const EventType &event) it->second->Receive(event); }*/ - m_EventQueueWrite->push_back(std::make_pair(typeid(EventType).name(), std::shared_ptr(new EventType(event)))); + m_EventQueueWrite->push_back(std::make_pair(typeid(EventType).name(), std::shared_ptr(new EventType(event)))); } template @@ -133,6 +135,15 @@ int EventBroker::Process() return Process(contextTypeName); } - +template +void EventBroker::UnsubscribeAll() +{ + const std::string contextTypeName = typeid(ContextType).name(); + auto contextIt = m_ContextRelays.find(contextTypeName); + if (contextIt != m_ContextRelays.end()) + { + m_ContextRelays.erase(contextIt); + } +} #endif // MessageRelay_h__