Ndk/BaseSystem: Added entity validation

Former-commit-id: d82a66179244ae8807f65b193ed9be2f48abffa4
This commit is contained in:
Lynix 2015-05-03 19:51:56 +02:00
parent 3ebf967f30
commit 47c5d1072b
4 changed files with 31 additions and 9 deletions

View File

@ -60,11 +60,14 @@ namespace Ndk
virtual void OnEntityAdded(Entity* entity);
virtual void OnEntityRemoved(Entity* entity);
virtual void OnEntityValidation(Entity* entity, bool justAdded);
void RemoveEntity(Entity* entity);
void SetWorld(World& world);
void ValidateEntity(Entity* entity, bool justAdded);
static bool Initialize();
static void Uninitialize();

View File

@ -136,6 +136,14 @@ namespace Ndk
OnEntityRemoved(entity); // Et on appelle le callback
}
inline void BaseSystem::ValidateEntity(Entity* entity, bool justAdded)
{
NazaraAssert(entity, "Invalid entity");
NazaraAssert(HasEntity(entity), "Entity should be part of system");
OnEntityValidation(entity, justAdded);
}
inline void BaseSystem::SetWorld(World& world)
{
m_world = &world;

View File

@ -47,5 +47,11 @@ namespace Ndk
NazaraUnused(entity);
}
void BaseSystem::OnEntityValidation(Entity* entity, bool justAdded)
{
NazaraUnused(entity);
NazaraUnused(justAdded);
}
SystemIndex BaseSystem::s_nextIndex;
}

View File

@ -125,25 +125,30 @@ namespace Ndk
{
NazaraAssert(i < m_entities.size(), "Entity index out of range");
Entity& entity = m_entities[i].entity;
Entity* entity = &m_entities[i].entity;
// Aucun intérêt de traiter une entité n'existant plus
if (entity.IsValid())
if (entity->IsValid())
{
for (auto& system : m_systems)
{
// L'entité est-elle enregistrée comme faisant partie du système ?
bool partOfSystem = system->HasEntity(&entity);
bool partOfSystem = system->HasEntity(entity);
// Doit-elle en faire partie ?
if (system->Filters(&entity) != partOfSystem)
if (system->Filters(entity))
{
// L'entité n'est pas dans l'état dans lequel elle devrait être vis-à-vis de ce système
// si elle en fait partie, nous devons l'en enlever, et inversément
// L'entité doit faire partie du système, revalidons-là (événement système) ou ajoutons-la au système
if (!partOfSystem)
system->AddEntity(entity);
system->ValidateEntity(entity, !partOfSystem);
}
else
{
// Elle ne doit pas en faire partie, si elle en faisait partie nous devons la retirer
if (partOfSystem)
system->RemoveEntity(&entity);
else
system->AddEntity(&entity);
system->RemoveEntity(entity);
}
}
}