Created World::Merge which will merge a world into another one

This commit is contained in:
2016-03-02 18:38:49 +01:00
parent 76117cb3ce
commit 62c8196ad4
2 changed files with 44 additions and 3 deletions
+6 -2
View File
@@ -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;
+38 -1
View File
@@ -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