diff --git a/SHADE_Engine/SHADE_Engine.vcxproj.filters b/SHADE_Engine/SHADE_Engine.vcxproj.filters index 5d627ce6..6b8bde7f 100644 --- a/SHADE_Engine/SHADE_Engine.vcxproj.filters +++ b/SHADE_Engine/SHADE_Engine.vcxproj.filters @@ -171,6 +171,9 @@ Events + + Events + Events @@ -405,7 +408,6 @@ Tools - diff --git a/SHADE_Engine/src/Events/SHEvent.h b/SHADE_Engine/src/Events/SHEvent.h index c6d5c97b..2ca6648e 100644 --- a/SHADE_Engine/src/Events/SHEvent.h +++ b/SHADE_Engine/src/Events/SHEvent.h @@ -16,7 +16,7 @@ namespace SHADE struct SHEvent { SHEventIdentifier type; - SHEventDataPtr data; + SHEventDataPtr dataPtr; SHEventHandle handle; }; } diff --git a/SHADE_Engine/src/Events/SHEventManager.cpp b/SHADE_Engine/src/Events/SHEventManager.cpp index 7798c944..2b4d15f1 100644 --- a/SHADE_Engine/src/Events/SHEventManager.cpp +++ b/SHADE_Engine/src/Events/SHEventManager.cpp @@ -12,47 +12,18 @@ namespace SHADE { - SHEventManager* SHEventManager::instance; + std::unordered_map SHEventManager::packageReceiverRegistry; + std::unordered_map SHEventManager::dataEventMap; - /**************************************************************************** - * \brief Ctor and Dtor. Dtor will delete instance of self stored at - * data member instance. - ****************************************************************************/ - SHEventManager::SHEventManager() - { + SHEventHandle SHEventManager::handleCounter{ 0 }; - } - - /**************************************************************************** - * \brief Exit function to terminate the manager properly and deallocate - * memory. - ****************************************************************************/ - void SHEventManager::Exit() - { - delete instance; - } - - /**************************************************************************** - * \brief Returns singleton instance of event manager in heap memory. If - * instance does not exist, one is created immediately. - ****************************************************************************/ - SHEventManager& SHEventManager::GetEventManagerInstance() - { - // Create instance of event manager and return - if (!instance) - { - instance = new SHEventManager(); - } - - return *instance; - } /**************************************************************************** * \brief Returns function pointer to entry point for events. ****************************************************************************/ EventManagerListener SHEventManager::GetListenerFunction() { - return &(instance->CatchEvent); + return &CatchEvent; } /**************************************************************************** @@ -66,7 +37,7 @@ namespace SHADE // Do something with the event - instance->Broadcast(event); + Broadcast(event); } /**************************************************************************** @@ -80,11 +51,11 @@ namespace SHADE ****************************************************************************/ void SHEventManager::SubscribeTo(SHEventIdentifier pkgType, ReceiverPtr receiver) { - SHEventManager::GetEventManagerInstance().RegisterReceiverToType(pkgType, receiver); + RegisterReceiverToType(pkgType, receiver); } template - T* SHEventManager::BroadcastData(T data, SHEventIdentifier eventType) + T* SHEventManager::BroadcastEvent(T data, SHEventIdentifier eventType) { SHEventDataPtr ptr = new std::byte[sizeof(data)]; @@ -133,10 +104,10 @@ namespace SHADE ResponseVec& receivers{ packageReceiverRegistry[event.type] }; for (auto& receiver : receivers) { - receiver->Receive(event.data); + receiver->Receive(event); } - //auto& funcs{ staticPackageReceiverRegistry[event.GetType()] }; + //auto& funcs{ ackageReceiverRegistry[event.GetType()] }; //for (auto func : funcs) //{ // func(event.GetData()); diff --git a/SHADE_Engine/src/Events/SHEventManager.h b/SHADE_Engine/src/Events/SHEventManager.h index 4f9b4350..35acd4de 100644 --- a/SHADE_Engine/src/Events/SHEventManager.h +++ b/SHADE_Engine/src/Events/SHEventManager.h @@ -3,21 +3,26 @@ * \author Loh Xiao Qi * \brief Class declaration for event manager. * - * \copyright Copyright (c) 2021 Digipen Institute of Technology. Reproduction + * \copyright Copyright (c) 2022 Digipen Institute of Technology. Reproduction * or disclosure of this file or its contents without the prior written consent * of Digipen Institute of Technology is prohibited. ******************************************************************************/ -#ifndef SH_EVENT_MANAGER_H -#define SH_EVENT_MANAGER_H +#pragma once #include "SHEvent.h" #include "SHEventReceiver.h" #include #include +/****************************************************************************** + INSTRUCTIONS FOR USE: + On broadcaster side: + 1. +******************************************************************************/ + namespace SHADE { - using ResponseFunction = std::function; + using ResponseFunction = std::function; using ReceiverPtr = std::shared_ptr; using ResponseVec = std::vector; using StaticResponseVec = std::vector; @@ -27,29 +32,11 @@ namespace SHADE class SHEventManager { public: - /**************************************************************************** - * \brief Ctor and Dtor. Dtor will delete instance of self stored at - * data member instance. - ****************************************************************************/ - SHEventManager(); - - /**************************************************************************** - * \brief Returns singleton instance of event manager in heap memory. If - * instance does not exist, one is created immediately. - ****************************************************************************/ - static SHEventManager& GetEventManagerInstance(); - - /**************************************************************************** + /**************************************************************************** * \brief Returns function pointer to entry point for events. ****************************************************************************/ static EventManagerListener GetListenerFunction(); - /**************************************************************************** - * \brief Exit function to terminate the manager properly and deallocate - * memory. - ****************************************************************************/ - static void Exit(); - /**************************************************************************** * \param ListenerConstPtr - Const pointer to listener that sent event. * \param EventType - Templated type for every type of event @@ -67,19 +54,18 @@ namespace SHADE * \brief Links a function pointer from a subscriber to a particular * package type ****************************************************************************/ - void SubscribeTo(SHEventIdentifier, ReceiverPtr); + static void SubscribeTo(SHEventIdentifier, ReceiverPtr); template - T* BroadcastData(T data, SHEventIdentifier eventType); + static T* BroadcastEvent(T data, SHEventIdentifier eventType); + private: - // Singleton instance - static SHEventManager* instance; // Registry for broadcasters and subscribers - std::unordered_map packageReceiverRegistry; - std::unordered_map dataEventMap; + static std::unordered_map packageReceiverRegistry; + static std::unordered_map dataEventMap; - SHEventHandle handleCounter; + static SHEventHandle handleCounter; /**************************************************************************** * \param ListenerConstPtr - Const pointer to listener that sent event. @@ -88,7 +74,7 @@ namespace SHADE * \brief Broadcast event to all receivers that are subscribed to this * listener. ****************************************************************************/ - void Broadcast(SHEvent const&); + static void Broadcast(SHEvent const&); /**************************************************************************** * \param ReceiverPtr - Pointer to receiver @@ -97,9 +83,7 @@ namespace SHADE * \brief Registers receiver as a subscriber to listener in the registry. ****************************************************************************/ - void RegisterReceiverToType(SHEventIdentifier, ReceiverPtr); + static void RegisterReceiverToType(SHEventIdentifier, ReceiverPtr); }; } - -#endif // !SH_EVENTS_MANAGER_H diff --git a/SHADE_Engine/src/Events/SHEventReceiver.h b/SHADE_Engine/src/Events/SHEventReceiver.h index ab379901..f968e579 100644 --- a/SHADE_Engine/src/Events/SHEventReceiver.h +++ b/SHADE_Engine/src/Events/SHEventReceiver.h @@ -1,5 +1,4 @@ -#ifndef SH_EVENT_RECEIVER_H -#define SH_EVENT_RECEIVER_H +#pragma once #include "SHEvent.h" @@ -9,7 +8,7 @@ namespace SHADE { private: public: - virtual void Receive(SHEventDataPtr) = 0; + virtual void Receive(SHEvent) = 0; }; template @@ -17,7 +16,7 @@ namespace SHADE { private: T* object; - void(T::*callback)(SHEventDataPtr); + SHEventHandle(T::*callback)(SHEvent); public: SHEventReceiverSpec(T* obj, void(T::* cb)(SHEventDataPtr)) @@ -26,10 +25,9 @@ namespace SHADE } - void Receive(SHEventDataPtr evt) override + void Receive(SHEvent evt) override { (object->*callback)(evt); } }; } -#endif // !SH_EVENT_RECEIVER_H