SDK/Entity: Delay component removal until world update
Allows system to freely remove components while updating Former-commit-id: db5877bc20e6a0dfadd69f81a339f0a57d8404df [formerly 74327b8f1429855625613f258894b37d026041fe] [formerly 65b8f2ba78d2690b7a469d4b9818b189524633db [formerly 71be95adb46b7183261a8038352c4d8bd17cacc3]] Former-commit-id: ba91d5abad60792e648d47e646ae49d43a1c94b5 [formerly 8d0667574ff665e151e7fda5f854fc11a16c854d] Former-commit-id: eb7b06c2739ef698a153a6221870a8d0956dc875
This commit is contained in:
parent
b096096e83
commit
1fc0d564ce
|
|
@ -52,8 +52,8 @@ namespace Ndk
|
||||||
inline bool IsEnabled() const;
|
inline bool IsEnabled() const;
|
||||||
inline bool IsValid() const;
|
inline bool IsValid() const;
|
||||||
|
|
||||||
void RemoveAllComponents();
|
inline void RemoveAllComponents();
|
||||||
void RemoveComponent(ComponentIndex index);
|
inline void RemoveComponent(ComponentIndex index);
|
||||||
template<typename ComponentType> void RemoveComponent();
|
template<typename ComponentType> void RemoveComponent();
|
||||||
|
|
||||||
inline Nz::String ToString() const;
|
inline Nz::String ToString() const;
|
||||||
|
|
@ -67,6 +67,10 @@ namespace Ndk
|
||||||
void Create();
|
void Create();
|
||||||
void Destroy();
|
void Destroy();
|
||||||
|
|
||||||
|
void DestroyComponent(ComponentIndex index);
|
||||||
|
|
||||||
|
inline Nz::Bitset<>& GetRemovedComponentBits();
|
||||||
|
|
||||||
inline void RegisterSystem(SystemIndex index);
|
inline void RegisterSystem(SystemIndex index);
|
||||||
|
|
||||||
inline void SetWorld(World* world) noexcept;
|
inline void SetWorld(World* world) noexcept;
|
||||||
|
|
@ -75,6 +79,7 @@ namespace Ndk
|
||||||
|
|
||||||
std::vector<std::unique_ptr<BaseComponent>> m_components;
|
std::vector<std::unique_ptr<BaseComponent>> m_components;
|
||||||
Nz::Bitset<> m_componentBits;
|
Nz::Bitset<> m_componentBits;
|
||||||
|
Nz::Bitset<> m_removedComponentBits;
|
||||||
Nz::Bitset<> m_systemBits;
|
Nz::Bitset<> m_systemBits;
|
||||||
EntityId m_id;
|
EntityId m_id;
|
||||||
World* m_world;
|
World* m_world;
|
||||||
|
|
|
||||||
|
|
@ -103,12 +103,31 @@ namespace Ndk
|
||||||
RemoveComponent(index);
|
RemoveComponent(index);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
inline void Entity::RemoveAllComponents()
|
||||||
|
{
|
||||||
|
m_removedComponentBits = m_componentBits;
|
||||||
|
|
||||||
|
Invalidate();
|
||||||
|
}
|
||||||
|
|
||||||
|
inline void Entity::RemoveComponent(ComponentIndex index)
|
||||||
|
{
|
||||||
|
m_removedComponentBits.UnboundedSet(index);
|
||||||
|
|
||||||
|
Invalidate();
|
||||||
|
}
|
||||||
|
|
||||||
inline Nz::String Entity::ToString() const
|
inline Nz::String Entity::ToString() const
|
||||||
{
|
{
|
||||||
Nz::StringStream ss;
|
Nz::StringStream ss;
|
||||||
return ss << "Entity(" << GetId() << ')';
|
return ss << "Entity(" << GetId() << ')';
|
||||||
}
|
}
|
||||||
|
|
||||||
|
inline Nz::Bitset<>& Entity::GetRemovedComponentBits()
|
||||||
|
{
|
||||||
|
return m_removedComponentBits;
|
||||||
|
}
|
||||||
|
|
||||||
inline void Entity::RegisterSystem(SystemIndex index)
|
inline void Entity::RegisterSystem(SystemIndex index)
|
||||||
{
|
{
|
||||||
m_systemBits.UnboundedSet(index);
|
m_systemBits.UnboundedSet(index);
|
||||||
|
|
|
||||||
|
|
@ -44,6 +44,7 @@ namespace Ndk
|
||||||
// Affectation et retour du component
|
// Affectation et retour du component
|
||||||
m_components[index] = std::move(componentPtr);
|
m_components[index] = std::move(componentPtr);
|
||||||
m_componentBits.UnboundedSet(index);
|
m_componentBits.UnboundedSet(index);
|
||||||
|
m_removedComponentBits.UnboundedReset(index);
|
||||||
|
|
||||||
Invalidate();
|
Invalidate();
|
||||||
|
|
||||||
|
|
@ -71,40 +72,6 @@ namespace Ndk
|
||||||
m_world->Invalidate(m_id);
|
m_world->Invalidate(m_id);
|
||||||
}
|
}
|
||||||
|
|
||||||
void Entity::RemoveAllComponents()
|
|
||||||
{
|
|
||||||
for (std::size_t i = m_componentBits.FindFirst(); i != m_componentBits.npos; i = m_componentBits.FindNext(i))
|
|
||||||
RemoveComponent(static_cast<ComponentIndex>(i));
|
|
||||||
|
|
||||||
NazaraAssert(m_componentBits.TestNone(), "All components should be gone");
|
|
||||||
|
|
||||||
m_components.clear();
|
|
||||||
|
|
||||||
Invalidate();
|
|
||||||
}
|
|
||||||
|
|
||||||
void Entity::RemoveComponent(ComponentIndex index)
|
|
||||||
{
|
|
||||||
///DOC: N'a aucun effet si le component n'est pas présent
|
|
||||||
if (HasComponent(index))
|
|
||||||
{
|
|
||||||
// On récupère le component et on informe les composants du détachement
|
|
||||||
BaseComponent& component = *m_components[index].get();
|
|
||||||
for (std::size_t i = m_componentBits.FindFirst(); i != m_componentBits.npos; i = m_componentBits.FindNext(i))
|
|
||||||
{
|
|
||||||
if (i != index)
|
|
||||||
m_components[i]->OnComponentDetached(component);
|
|
||||||
}
|
|
||||||
|
|
||||||
component.SetEntity(nullptr);
|
|
||||||
|
|
||||||
m_components[index].reset();
|
|
||||||
m_componentBits.Reset(index);
|
|
||||||
|
|
||||||
Invalidate();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void Entity::Create()
|
void Entity::Create()
|
||||||
{
|
{
|
||||||
m_enabled = true;
|
m_enabled = true;
|
||||||
|
|
@ -128,4 +95,25 @@ namespace Ndk
|
||||||
|
|
||||||
m_valid = false;
|
m_valid = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void Entity::DestroyComponent(ComponentIndex index)
|
||||||
|
{
|
||||||
|
///DOC: N'a aucun effet si le component n'est pas présent
|
||||||
|
if (HasComponent(index))
|
||||||
|
{
|
||||||
|
// On récupère le component et on informe les composants du détachement
|
||||||
|
BaseComponent& component = *m_components[index].get();
|
||||||
|
for (std::size_t i = m_componentBits.FindFirst(); i != m_componentBits.npos; i = m_componentBits.FindNext(i))
|
||||||
|
{
|
||||||
|
if (i != index)
|
||||||
|
m_components[i]->OnComponentDetached(component);
|
||||||
|
}
|
||||||
|
|
||||||
|
component.SetEntity(nullptr);
|
||||||
|
|
||||||
|
m_components[index].reset();
|
||||||
|
m_componentBits.Reset(index);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -139,6 +139,11 @@ namespace Ndk
|
||||||
if (!entity->IsValid())
|
if (!entity->IsValid())
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
|
Nz::Bitset<>& removedComponents = entity->GetRemovedComponentBits();
|
||||||
|
for (std::size_t j = removedComponents.FindFirst(); j != m_dirtyEntities.npos; j = removedComponents.FindNext(j))
|
||||||
|
entity->DestroyComponent(j);
|
||||||
|
removedComponents.Reset();
|
||||||
|
|
||||||
for (auto& system : m_systems)
|
for (auto& system : m_systems)
|
||||||
{
|
{
|
||||||
// Ignore non-existent systems
|
// Ignore non-existent systems
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue