#ifndef HYDRASYSTEMMANAGER #define HYDRASYSTEMMANAGER #include "../engine/HydraObject.h" #include "HydraSystem.h" #include "HydraEntity.h" //#include "../ecssystems/HydraECSRenderSystem.h" #include #include class HydraSystemManager : public HydraObject { private: std::unordered_map m_signatures{}; std::unordered_map> m_systems{}; public: void Shutdown() { for (auto const& pair : m_systems) { auto const& system = pair.second; system->Shutdown(); } } template std::shared_ptr GetSystem() { std::string type_name = std::string(typeid(T).name()); auto it = m_systems.find(type_name); assert(it!= m_systems.end() && "System not found."); return std::static_pointer_cast( it->second); } template std::shared_ptr RegisterSystem() { std::string type_name = std::string(typeid(T).name()); assert(m_systems.find(type_name) == m_systems.end() && "Registering system more than once."); // Create a pointer to the system and return it so it can be used externally auto system = std::make_shared(); system->Initialise(); m_systems.insert({type_name, system}); return system; } template void SetSignature(HydraSignature signature) { std::string type_name = std::string(typeid(T).name()); assert(m_systems.find(type_name) != m_systems.end() && "System used before registered."); // Set the signature for this system m_signatures.insert({type_name, signature}); } void EntitySignatureChanged(HydraID entity_id, HydraSignature signature) { // Notify each system that an entity's signature changed for (auto const& pair : m_systems) { //auto const& type = pair.first; std::string type = pair.first; auto const& system = pair.second; auto const& system_signature = m_signatures[type]; // Entity signature matches system signature - insert into set if ((signature & system_signature) == system_signature) { system->EntitiesToCreate.insert(entity_id); system->Entities.insert(entity_id); } // Entity signature does not match system signature - erase from set else { system->Entities.erase(entity_id); system->EntitiesToCreate.erase(entity_id); } } } void EntityDeleted(HydraID entity_id) { for (auto const& pair : m_systems) { auto const& system = pair.second; system->Entities.erase(entity_id); system->EntitiesToCreate.erase(entity_id); } } void InitialiseComponents() { for (auto const& pair : m_systems) { auto const& system = pair.second; system->InitialiseComponents(); } } }; #endif /* HYDRASYSTEMMANAGER */