From de8461e2579e567ed328234cb29f95be7bf049af Mon Sep 17 00:00:00 2001 From: William Moberg Date: Fri, 18 Dec 2015 15:33:25 +0100 Subject: [PATCH 1/5] SystemPipeline should update systems in order depending on input update priority in AddSystem. --- include/Engine/Core/SystemPipeline.h | 68 ++++++++++++++++------------ src/Game/Game.cpp | 14 ++++-- 2 files changed, 49 insertions(+), 33 deletions(-) diff --git a/include/Engine/Core/SystemPipeline.h b/include/Engine/Core/SystemPipeline.h index 78ebc966..fdae834f 100644 --- a/include/Engine/Core/SystemPipeline.h +++ b/include/Engine/Core/SystemPipeline.h @@ -14,23 +14,29 @@ public: { } ~SystemPipeline() { - for (auto& pair : m_PureSystems) { - for (auto& system : pair.second) { - delete system; + for (UnorderedSystems& group : m_OrderedSystemGroups) { + for (auto& pair : group.PureSystems) { + for (auto& system : pair.second) { + delete system; + } } } } template - void AddSystem(Arguments... args) + void AddSystem(int updateOrderPriority, Arguments... args) { + if (updateOrderPriority + 1 > m_OrderedSystemGroups.size()) { + m_OrderedSystemGroups.resize(updateOrderPriority + 1); + } + UnorderedSystems& group = m_OrderedSystemGroups[updateOrderPriority]; System* system = new T(m_EventBroker, args...); - m_Systems[typeid(T).name()] = system; + group.Systems[typeid(T).name()] = system; if (std::is_base_of::value) { PureSystem* pureSystem = static_cast(system); if (!pureSystem->m_ComponentType.empty()) { - m_PureSystems[pureSystem->m_ComponentType].push_back(pureSystem); + group.PureSystems[pureSystem->m_ComponentType].push_back(pureSystem); } else { LOG_ERROR("Failed to add pure system \"%s\": Missing component type!", typeid(T).name()); } @@ -38,41 +44,47 @@ public: if (std::is_base_of::value) { ImpureSystem* impureSystem = static_cast(system); - m_ImpureSystems.push_back(impureSystem); + group.ImpureSystems.push_back(impureSystem); } } void Update(World* world, double dt) { - // Process events - for (auto& pair : m_Systems) { - m_EventBroker->Process(pair.first); - } - - // Update - for (auto& pair : m_PureSystems) { - const std::string& componentName = pair.first; - auto& systems = pair.second; - const ComponentPool* pool = world->GetComponents(componentName); - if (pool == nullptr) { - continue; + for (UnorderedSystems& group : m_OrderedSystemGroups) { + // Process events + for (auto& pair : group.Systems) { + m_EventBroker->Process(pair.first); } - for (auto& component : *pool) { - for (auto& system : systems) { - system->UpdateComponent(world, component, dt); + + // Update + for (auto& pair : group.PureSystems) { + const std::string& componentName = pair.first; + auto& systems = pair.second; + const ComponentPool* pool = world->GetComponents(componentName); + if (pool == nullptr) { + continue; + } + for (auto& component : *pool) { + for (auto& system : systems) { + system->UpdateComponent(world, component, dt); + } } } - } - for (auto& system : m_ImpureSystems) { - system->Update(world, dt); + for (auto& system : group.ImpureSystems) { + system->Update(world, dt); + } } } private: EventBroker* m_EventBroker; - std::map m_Systems; - std::map> m_PureSystems; - std::vector m_ImpureSystems; + struct UnorderedSystems + { + std::map Systems; + std::map> PureSystems; + std::vector ImpureSystems; + }; + std::vector m_OrderedSystemGroups; }; #endif \ No newline at end of file diff --git a/src/Game/Game.cpp b/src/Game/Game.cpp index bf990e23..b0628bd8 100644 --- a/src/Game/Game.cpp +++ b/src/Game/Game.cpp @@ -52,11 +52,15 @@ Game::Game(int argc, char* argv[]) // Create system pipeline m_SystemPipeline = new SystemPipeline(m_EventBroker); - m_SystemPipeline->AddSystem(); - m_SystemPipeline->AddSystem(); - m_SystemPipeline->AddSystem(m_Renderer); - m_SystemPipeline->AddSystem(); - m_SystemPipeline->AddSystem(); + unsigned int updateOrderPriority = 0; + m_SystemPipeline->AddSystem(updateOrderPriority); + m_SystemPipeline->AddSystem(updateOrderPriority); + m_SystemPipeline->AddSystem(updateOrderPriority, m_Renderer); + + //Collision and TriggerSystem should update after player. + ++updateOrderPriority; + m_SystemPipeline->AddSystem(updateOrderPriority); + m_SystemPipeline->AddSystem(updateOrderPriority); m_LastTime = glfwGetTime(); From fa8775a72e2a85c05ccf7ef9a53eacdf95592f84 Mon Sep 17 00:00:00 2001 From: William Moberg Date: Thu, 7 Jan 2016 10:28:18 +0100 Subject: [PATCH 2/5] Renamed vars and added some comments. --- include/Engine/Core/SystemPipeline.h | 9 +++++---- src/Engine/Collision/CollisionSystem.cpp | 2 -- src/Game/Game.cpp | 16 +++++++++------- 3 files changed, 14 insertions(+), 13 deletions(-) diff --git a/include/Engine/Core/SystemPipeline.h b/include/Engine/Core/SystemPipeline.h index fdae834f..cffa04de 100644 --- a/include/Engine/Core/SystemPipeline.h +++ b/include/Engine/Core/SystemPipeline.h @@ -24,12 +24,13 @@ public: } template - void AddSystem(int updateOrderPriority, Arguments... args) + //All systems with orderlevel 0 will be updated first, then 1, 2, etc. + void AddSystem(int updateOrderLevel, Arguments... args) { - if (updateOrderPriority + 1 > m_OrderedSystemGroups.size()) { - m_OrderedSystemGroups.resize(updateOrderPriority + 1); + if (updateOrderLevel + 1 > m_OrderedSystemGroups.size()) { + m_OrderedSystemGroups.resize(updateOrderLevel + 1); } - UnorderedSystems& group = m_OrderedSystemGroups[updateOrderPriority]; + UnorderedSystems& group = m_OrderedSystemGroups[updateOrderLevel]; System* system = new T(m_EventBroker, args...); group.Systems[typeid(T).name()] = system; diff --git a/src/Engine/Collision/CollisionSystem.cpp b/src/Engine/Collision/CollisionSystem.cpp index dec33a20..69929c6d 100644 --- a/src/Engine/Collision/CollisionSystem.cpp +++ b/src/Engine/Collision/CollisionSystem.cpp @@ -4,8 +4,6 @@ void CollisionSystem::UpdateComponent(World * world, ComponentWrapper & cAABB, double dt) { - //TODO: Update CollisionSystem system after PlayerSystem. - //Right now, cAABB is a component attached to any entity that should be collideable. AABB thisBox; if (!Collision::GetEntityBox(world, cAABB, thisBox)) { diff --git a/src/Game/Game.cpp b/src/Game/Game.cpp index b0628bd8..414f113d 100644 --- a/src/Game/Game.cpp +++ b/src/Game/Game.cpp @@ -52,15 +52,17 @@ Game::Game(int argc, char* argv[]) // Create system pipeline m_SystemPipeline = new SystemPipeline(m_EventBroker); - unsigned int updateOrderPriority = 0; - m_SystemPipeline->AddSystem(updateOrderPriority); - m_SystemPipeline->AddSystem(updateOrderPriority); - m_SystemPipeline->AddSystem(updateOrderPriority, m_Renderer); + + //All systems with orderlevel 0 will be updated first. + unsigned int updateOrderLevel = 0; + m_SystemPipeline->AddSystem(updateOrderLevel); + m_SystemPipeline->AddSystem(updateOrderLevel); + m_SystemPipeline->AddSystem(updateOrderLevel, m_Renderer); //Collision and TriggerSystem should update after player. - ++updateOrderPriority; - m_SystemPipeline->AddSystem(updateOrderPriority); - m_SystemPipeline->AddSystem(updateOrderPriority); + ++updateOrderLevel; + m_SystemPipeline->AddSystem(updateOrderLevel); + m_SystemPipeline->AddSystem(updateOrderLevel); m_LastTime = glfwGetTime(); From 4048ce6bd4d6dd67315e34cb5b2d44064aa46c4a Mon Sep 17 00:00:00 2001 From: William Moberg Date: Thu, 7 Jan 2016 15:18:35 +0100 Subject: [PATCH 3/5] Small fix. --- src/Tests/OctTreeTestGameClass.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Tests/OctTreeTestGameClass.cpp b/src/Tests/OctTreeTestGameClass.cpp index 05aa35d4..10d4d6a5 100644 --- a/src/Tests/OctTreeTestGameClass.cpp +++ b/src/Tests/OctTreeTestGameClass.cpp @@ -45,7 +45,7 @@ Game::Game(int argc, char* argv[]) : someOctTree(AABB(-0.5f*worldSize, 0.5f*worl m_World = new HardcodedTestWorld(); m_SystemPipeline = new SystemPipeline(m_EventBroker); - m_SystemPipeline->AddSystem(); + m_SystemPipeline->AddSystem(0); m_LastTime = glfwGetTime(); } From 7fb71f17b282438ac9faa0dbd0ad6af717d80c53 Mon Sep 17 00:00:00 2001 From: William Moberg Date: Thu, 7 Jan 2016 16:13:52 +0100 Subject: [PATCH 4/5] Destruct all systems properly in the pipeline. --- include/Engine/Core/SystemPipeline.h | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/include/Engine/Core/SystemPipeline.h b/include/Engine/Core/SystemPipeline.h index cffa04de..d6a6b371 100644 --- a/include/Engine/Core/SystemPipeline.h +++ b/include/Engine/Core/SystemPipeline.h @@ -15,10 +15,8 @@ public: ~SystemPipeline() { for (UnorderedSystems& group : m_OrderedSystemGroups) { - for (auto& pair : group.PureSystems) { - for (auto& system : pair.second) { - delete system; - } + for (auto& pair : group.Systems) { + delete pair.second; } } } From ef9ce7932a60f758158adfb6dfb7b1fb310d73dc Mon Sep 17 00:00:00 2001 From: William Moberg Date: Thu, 7 Jan 2016 17:40:47 +0100 Subject: [PATCH 5/5] New small fix. --- src/Tests/HealthSystemTest.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Tests/HealthSystemTest.cpp b/src/Tests/HealthSystemTest.cpp index 7ba2b89d..84d6199d 100644 --- a/src/Tests/HealthSystemTest.cpp +++ b/src/Tests/HealthSystemTest.cpp @@ -47,8 +47,8 @@ GameHealthSystemTest::GameHealthSystemTest() // Create system pipeline m_SystemPipeline = new SystemPipeline(m_EventBroker); - m_SystemPipeline->AddSystem(); - m_SystemPipeline->AddSystem(); + m_SystemPipeline->AddSystem(0); + m_SystemPipeline->AddSystem(0); //The Test //create entity which has transorm,player,model,health in it. i.e. is a player