|
@@ -21,6 +21,11 @@ uint32_t Entity::getId() const
|
|
|
return this->id;
|
|
|
}
|
|
|
|
|
|
+void Entity::kill()
|
|
|
+{
|
|
|
+ this->registry->killEntity(*this);
|
|
|
+}
|
|
|
+
|
|
|
/* System */
|
|
|
void System::addEntity(Entity entity)
|
|
|
{
|
|
@@ -48,7 +53,18 @@ const Signature& System::getComponentSignature() const
|
|
|
|
|
|
Entity Registry::createEntity()
|
|
|
{
|
|
|
- uint32_t entityId = this->numEntities++;
|
|
|
+ uint32_t entityId;
|
|
|
+
|
|
|
+ if (this->freeIds.empty())
|
|
|
+ {
|
|
|
+ entityId = this->numEntities++;
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ entityId = this->freeIds.front();
|
|
|
+ this->freeIds.pop_front();
|
|
|
+ }
|
|
|
+
|
|
|
Entity entity(entityId);
|
|
|
|
|
|
entity.registry = this;
|
|
@@ -65,6 +81,12 @@ Entity Registry::createEntity()
|
|
|
return entity;
|
|
|
}
|
|
|
|
|
|
+void Registry::killEntity(Entity entity)
|
|
|
+{
|
|
|
+ Logger::Info("Entity #%d flagged for killing", entity.getId());
|
|
|
+ this->entitiesToBeKilled.insert(entity);
|
|
|
+}
|
|
|
+
|
|
|
void Registry::addEntityToSystems(Entity entity)
|
|
|
{
|
|
|
const auto entityId = entity.getId();
|
|
@@ -83,14 +105,30 @@ void Registry::addEntityToSystems(Entity entity)
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+void Registry::removeEntityFromSystems(Entity entity)
|
|
|
+{
|
|
|
+ for (auto &system: this->systems)
|
|
|
+ {
|
|
|
+ system.second->removeEntity(entity);
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
void Registry::update()
|
|
|
{
|
|
|
/* Add pending entities */
|
|
|
- for(auto entity: entitiesToBeAdded)
|
|
|
+ for(auto entity: this->entitiesToBeAdded)
|
|
|
{
|
|
|
this->addEntityToSystems(entity);
|
|
|
}
|
|
|
- entitiesToBeAdded.clear();
|
|
|
+ this->entitiesToBeAdded.clear();
|
|
|
|
|
|
+ for(auto entity: this->entitiesToBeKilled)
|
|
|
+ {
|
|
|
+ this->removeEntityFromSystems(entity);
|
|
|
|
|
|
+ this->entityComponentSignatures[entity.getId()].reset();
|
|
|
+
|
|
|
+ this->freeIds.push_back(entity.getId());
|
|
|
+ }
|
|
|
+ this->entitiesToBeKilled.clear();
|
|
|
}
|