Created World::Merge which will merge a world into another one
This commit is contained in:
@@ -19,13 +19,13 @@ public:
|
||||
World(const World& other);
|
||||
|
||||
// Create empty entity
|
||||
EntityID CreateEntity(EntityID parent = 0);
|
||||
EntityID CreateEntity(EntityID parent = EntityID_Invalid);
|
||||
// Delete entity and all components within
|
||||
void DeleteEntity(EntityID entity);
|
||||
// Check if an entity exists
|
||||
bool ValidEntity(EntityID entity) const;
|
||||
// Register a component type and allocate space for it
|
||||
void RegisterComponent(ComponentInfo& ci);
|
||||
void RegisterComponent(const ComponentInfo& ci);
|
||||
// Attach a component to an entity and fill it with default values
|
||||
ComponentWrapper AttachComponent(EntityID entity, const std::string& componentType);
|
||||
// Check if an entity has a component
|
||||
@@ -53,6 +53,10 @@ public:
|
||||
// Get the first entity in the world with the name.
|
||||
EntityWrapper GetFirstEntityByName(const std::string& name);
|
||||
|
||||
// Merge another world into this one
|
||||
// Returns a map that maps entities from the other world to their copies in this one
|
||||
std::unordered_map<EntityID, EntityID> Merge(World& other);
|
||||
|
||||
private:
|
||||
EventBroker* m_EventBroker = nullptr;
|
||||
EntityID m_CurrentEntityID = 0;
|
||||
|
||||
@@ -45,7 +45,7 @@ bool World::ValidEntity(EntityID entity) const
|
||||
return m_EntityParents.find(entity) != m_EntityParents.end();
|
||||
}
|
||||
|
||||
void World::RegisterComponent(ComponentInfo& ci)
|
||||
void World::RegisterComponent(const ComponentInfo& ci)
|
||||
{
|
||||
if (m_ComponentPools.find(ci.Name) == m_ComponentPools.end()) {
|
||||
m_ComponentPools[ci.Name] = new ComponentPool(ci);
|
||||
@@ -169,6 +169,43 @@ EntityWrapper World::GetFirstEntityByName(const std::string& name)
|
||||
return EntityWrapper::Invalid;
|
||||
}
|
||||
|
||||
std::unordered_map<EntityID, EntityID> World::Merge(World& other)
|
||||
{
|
||||
std::unordered_map<EntityID, EntityID> oldToNew;
|
||||
|
||||
// Create new entities
|
||||
for (auto& kv : other.m_EntityParents) {
|
||||
EntityID entity = kv.first;
|
||||
|
||||
EntityID newEntity = CreateEntity();
|
||||
SetName(newEntity, other.GetName(entity));
|
||||
oldToNew[entity] = newEntity;
|
||||
}
|
||||
// Fix relationships
|
||||
for (auto& kv : other.m_EntityParents) {
|
||||
EntityID entity = kv.first;
|
||||
EntityID parent = kv.second;
|
||||
SetParent(oldToNew.at(entity), oldToNew.at(parent));
|
||||
}
|
||||
|
||||
// Transfer components
|
||||
for (auto& kv : other.m_ComponentPools) {
|
||||
auto& componentType = kv.first;
|
||||
ComponentPool* pool = kv.second;
|
||||
// Register pool if it's not present in world
|
||||
if (m_ComponentPools.count(componentType) == 0) {
|
||||
RegisterComponent(pool->ComponentInfo());
|
||||
}
|
||||
// Copy components
|
||||
for (auto component : *pool) {
|
||||
ComponentWrapper newComponent = AttachComponent(oldToNew.at(component.EntityID), componentType);
|
||||
component.Copy(newComponent);
|
||||
}
|
||||
}
|
||||
|
||||
return oldToNew;
|
||||
}
|
||||
|
||||
EntityID World::generateEntityID()
|
||||
{
|
||||
// TODO: Make EntityID generation smarter
|
||||
|
||||
Reference in New Issue
Block a user