d817c3084d
- Flip coordinate system for SwapChain passthrough - Normalize MouseMoveEvent coordination - Add RemoveSystem to Ecs
84 lines
2.4 KiB
C++
84 lines
2.4 KiB
C++
#include "copium/ecs/SystemPool.h"
|
|
|
|
namespace Copium
|
|
{
|
|
SystemPool::SystemPool(ECSManager* manager)
|
|
: manager{manager}
|
|
{}
|
|
|
|
SystemPool::~SystemPool()
|
|
{
|
|
for (auto& system : systemOrder)
|
|
{
|
|
delete system;
|
|
}
|
|
systemOrder.clear();
|
|
systems.clear();
|
|
}
|
|
|
|
SystemOrderer SystemPool::AddSystem(const std::type_index& systemId, SystemBase* system)
|
|
{
|
|
system->manager = manager;
|
|
CP_ASSERT(systems.find(systemId) == systems.end(), "System already exist in Ecs");
|
|
systems.emplace(systemId, system);
|
|
systemOrder.emplace_back(system);
|
|
return SystemOrderer{systemId, this};
|
|
}
|
|
|
|
void SystemPool::RemoveSystem(const std::type_index& systemId)
|
|
{
|
|
auto it = systems.find(systemId);
|
|
if (it == systems.end())
|
|
{
|
|
CP_WARN("System does not exist in Ecs");
|
|
return;
|
|
}
|
|
|
|
auto itOrder = std::find(systemOrder.begin(), systemOrder.end(), it->second);
|
|
delete it->second;
|
|
systems.erase(it);
|
|
systemOrder.erase(itOrder);
|
|
}
|
|
|
|
void SystemPool::Update()
|
|
{
|
|
for (auto& system : systemOrder)
|
|
{
|
|
system->Run();
|
|
}
|
|
}
|
|
|
|
void SystemPool::Update(const Signal& signal)
|
|
{
|
|
for (auto& system : systemOrder)
|
|
{
|
|
system->Run(signal);
|
|
}
|
|
}
|
|
|
|
void SystemPool::MoveSystemAfter(const std::type_index& systemId, const std::type_index& afterSystemId)
|
|
{
|
|
auto it1 = systems.find(systemId);
|
|
CP_ASSERT(it1 != systems.end(), "System does not exist in SystemPool");
|
|
auto it2 = systems.find(afterSystemId);
|
|
CP_ASSERT(it2 != systems.end(), "System does not exist in SystemPool");
|
|
|
|
auto itSystemId = std::find(systemOrder.rbegin(), systemOrder.rend(), it1->second);
|
|
auto itAfterSystemId = std::find(systemOrder.rbegin(), systemOrder.rend(), it2->second);
|
|
std::rotate(itSystemId, itSystemId + 1, itAfterSystemId);
|
|
}
|
|
|
|
void SystemPool::MoveSystemBefore(const std::type_index& systemId, const std::type_index& beforeSystemId)
|
|
{
|
|
auto it1 = systems.find(systemId);
|
|
CP_ASSERT(it1 != systems.end(), "System does not exist in SystemPool");
|
|
auto it2 = systems.find(beforeSystemId);
|
|
CP_ASSERT(it2 != systems.end(), "System does not exist in SystemPool");
|
|
|
|
auto itSystemId = std::find(systemOrder.rbegin(), systemOrder.rend(), it1->second);
|
|
auto itBeforeSystemId = std::find(systemOrder.rbegin(), systemOrder.rend(), it2->second);
|
|
|
|
std::rotate(itSystemId, itSystemId + 1, itBeforeSystemId + 1);
|
|
}
|
|
}
|