SDK/Entity: Add entity cloning
Former-commit-id: 3cc9457d125991c6ac98a6e2559aab220446f9cf [formerly 721b19c23c3431e002604e4b201a63a74ddc8404] [formerly b8026d485a23968df3a768ae31afe09e80e31d69 [formerly 892cbc899b0ce57a905b807d5f9cb0747336fe0c]] Former-commit-id: 3bfafaf90dd5db34f1fce455c67ba51f5be3174d [formerly 6f2ab5632b943089fc3e6ad1f06266054740f1e8] Former-commit-id: e2694c2f25769068f64dc437d06e4c53525c0c6c
This commit is contained in:
parent
fd874098f9
commit
4fff7abf61
|
|
@ -34,6 +34,8 @@ namespace Ndk
|
|||
BaseComponent& AddComponent(std::unique_ptr<BaseComponent>&& component);
|
||||
template<typename ComponentType, typename... Args> ComponentType& AddComponent(Args&&... args);
|
||||
|
||||
const EntityHandle& Clone() const;
|
||||
|
||||
inline void Enable(bool enable);
|
||||
|
||||
inline BaseComponent& GetComponent(ComponentIndex index);
|
||||
|
|
|
|||
|
|
@ -44,6 +44,8 @@ namespace Ndk
|
|||
|
||||
void Clear() noexcept;
|
||||
|
||||
const EntityHandle& CloneEntity(EntityId id);
|
||||
|
||||
const EntityHandle& GetEntity(EntityId id);
|
||||
inline const EntityList& GetEntities();
|
||||
inline BaseSystem& GetSystem(SystemIndex index);
|
||||
|
|
|
|||
|
|
@ -61,6 +61,14 @@ namespace Ndk
|
|||
return component;
|
||||
}
|
||||
|
||||
const EntityHandle& Entity::Clone() const
|
||||
{
|
||||
///DOC: The clone is enabled by default, even if the original entity is disabled
|
||||
NazaraAssert(IsValid(), "Invalid entity");
|
||||
|
||||
return m_world->CloneEntity(m_id);
|
||||
}
|
||||
|
||||
void Entity::Kill()
|
||||
{
|
||||
m_world->KillEntity(this);
|
||||
|
|
|
|||
|
|
@ -4,6 +4,7 @@
|
|||
|
||||
#include <NDK/World.hpp>
|
||||
#include <Nazara/Core/Error.hpp>
|
||||
#include <NDK/BaseComponent.hpp>
|
||||
#include <NDK/Systems/PhysicsSystem.hpp>
|
||||
#include <NDK/Systems/VelocitySystem.hpp>
|
||||
|
||||
|
|
@ -74,6 +75,27 @@ namespace Ndk
|
|||
m_killedEntities.Clear();
|
||||
}
|
||||
|
||||
const EntityHandle& World::CloneEntity(EntityId id)
|
||||
{
|
||||
EntityHandle original = GetEntity(id);
|
||||
if (!original)
|
||||
{
|
||||
NazaraError("Invalid entity ID");
|
||||
return EntityHandle::InvalidHandle;
|
||||
}
|
||||
|
||||
EntityHandle clone = CreateEntity();
|
||||
|
||||
const Nz::Bitset<>& componentBits = original->GetComponentBits();
|
||||
for (std::size_t i = componentBits.FindFirst(); i != componentBits.npos; i = componentBits.FindNext(i))
|
||||
{
|
||||
std::unique_ptr<BaseComponent> component(original->GetComponent(ComponentIndex(i)).Clone());
|
||||
clone->AddComponent(std::move(component));
|
||||
}
|
||||
|
||||
return GetEntity(clone->GetId());
|
||||
}
|
||||
|
||||
void World::KillEntity(Entity* entity)
|
||||
{
|
||||
///DOC: Ignoré si l'entité est invalide
|
||||
|
|
|
|||
Loading…
Reference in New Issue