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);
|
World(const World& other);
|
||||||
|
|
||||||
// Create empty entity
|
// Create empty entity
|
||||||
EntityID CreateEntity(EntityID parent = 0);
|
EntityID CreateEntity(EntityID parent = EntityID_Invalid);
|
||||||
// Delete entity and all components within
|
// Delete entity and all components within
|
||||||
void DeleteEntity(EntityID entity);
|
void DeleteEntity(EntityID entity);
|
||||||
// Check if an entity exists
|
// Check if an entity exists
|
||||||
bool ValidEntity(EntityID entity) const;
|
bool ValidEntity(EntityID entity) const;
|
||||||
// Register a component type and allocate space for it
|
// 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
|
// Attach a component to an entity and fill it with default values
|
||||||
ComponentWrapper AttachComponent(EntityID entity, const std::string& componentType);
|
ComponentWrapper AttachComponent(EntityID entity, const std::string& componentType);
|
||||||
// Check if an entity has a component
|
// Check if an entity has a component
|
||||||
@@ -53,6 +53,10 @@ public:
|
|||||||
// Get the first entity in the world with the name.
|
// Get the first entity in the world with the name.
|
||||||
EntityWrapper GetFirstEntityByName(const std::string& 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:
|
private:
|
||||||
EventBroker* m_EventBroker = nullptr;
|
EventBroker* m_EventBroker = nullptr;
|
||||||
EntityID m_CurrentEntityID = 0;
|
EntityID m_CurrentEntityID = 0;
|
||||||
|
|||||||
@@ -45,7 +45,7 @@ bool World::ValidEntity(EntityID entity) const
|
|||||||
return m_EntityParents.find(entity) != m_EntityParents.end();
|
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()) {
|
if (m_ComponentPools.find(ci.Name) == m_ComponentPools.end()) {
|
||||||
m_ComponentPools[ci.Name] = new ComponentPool(ci);
|
m_ComponentPools[ci.Name] = new ComponentPool(ci);
|
||||||
@@ -169,6 +169,43 @@ EntityWrapper World::GetFirstEntityByName(const std::string& name)
|
|||||||
return EntityWrapper::Invalid;
|
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()
|
EntityID World::generateEntityID()
|
||||||
{
|
{
|
||||||
// TODO: Make EntityID generation smarter
|
// TODO: Make EntityID generation smarter
|
||||||
|
|||||||
Reference in New Issue
Block a user