From 47c5d1072bcf45d2b8a8dcd8d7ae4120cc7026fe Mon Sep 17 00:00:00 2001 From: Lynix Date: Sun, 3 May 2015 19:51:56 +0200 Subject: [PATCH] Ndk/BaseSystem: Added entity validation Former-commit-id: d82a66179244ae8807f65b193ed9be2f48abffa4 --- SDK/include/NDK/BaseSystem.hpp | 3 +++ SDK/include/NDK/BaseSystem.inl | 8 ++++++++ SDK/src/NDK/BaseSystem.cpp | 6 ++++++ SDK/src/NDK/World.cpp | 23 ++++++++++++++--------- 4 files changed, 31 insertions(+), 9 deletions(-) diff --git a/SDK/include/NDK/BaseSystem.hpp b/SDK/include/NDK/BaseSystem.hpp index 1c9a0aa86..2e8201c80 100644 --- a/SDK/include/NDK/BaseSystem.hpp +++ b/SDK/include/NDK/BaseSystem.hpp @@ -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(); diff --git a/SDK/include/NDK/BaseSystem.inl b/SDK/include/NDK/BaseSystem.inl index 3f1d453c6..fec06ef9a 100644 --- a/SDK/include/NDK/BaseSystem.inl +++ b/SDK/include/NDK/BaseSystem.inl @@ -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; diff --git a/SDK/src/NDK/BaseSystem.cpp b/SDK/src/NDK/BaseSystem.cpp index a8e951d4e..5aa9aac30 100644 --- a/SDK/src/NDK/BaseSystem.cpp +++ b/SDK/src/NDK/BaseSystem.cpp @@ -47,5 +47,11 @@ namespace Ndk NazaraUnused(entity); } + void BaseSystem::OnEntityValidation(Entity* entity, bool justAdded) + { + NazaraUnused(entity); + NazaraUnused(justAdded); + } + SystemIndex BaseSystem::s_nextIndex; } diff --git a/SDK/src/NDK/World.cpp b/SDK/src/NDK/World.cpp index 79d84ffcf..ef8eb01fb 100644 --- a/SDK/src/NDK/World.cpp +++ b/SDK/src/NDK/World.cpp @@ -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); } } }