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 OnEntityAdded(Entity* entity);
virtual void OnEntityRemoved(Entity* entity); virtual void OnEntityRemoved(Entity* entity);
virtual void OnEntityValidation(Entity* entity, bool justAdded);
void RemoveEntity(Entity* entity); void RemoveEntity(Entity* entity);
void SetWorld(World& world); void SetWorld(World& world);
void ValidateEntity(Entity* entity, bool justAdded);
static bool Initialize(); static bool Initialize();
static void Uninitialize(); static void Uninitialize();

View File

@ -136,6 +136,14 @@ namespace Ndk
OnEntityRemoved(entity); // Et on appelle le callback 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) inline void BaseSystem::SetWorld(World& world)
{ {
m_world = &world; m_world = &world;

View File

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

View File

@ -125,25 +125,30 @@ namespace Ndk
{ {
NazaraAssert(i < m_entities.size(), "Entity index out of range"); 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 // Aucun intérêt de traiter une entité n'existant plus
if (entity.IsValid()) if (entity->IsValid())
{ {
for (auto& system : m_systems) for (auto& system : m_systems)
{ {
// L'entité est-elle enregistrée comme faisant partie du système ? // 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 ? // 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 // L'entité doit faire partie du système, revalidons-là (événement système) ou ajoutons-la au système
// si elle en fait partie, nous devons l'en enlever, et inversément 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) if (partOfSystem)
system->RemoveEntity(&entity); system->RemoveEntity(entity);
else
system->AddEntity(&entity);
} }
} }
} }