12#ifndef ECS__ENTITY_MANAGER_H__
13#define ECS__ENTITY_MANAGER_H__
30#pragma warning(disable: 4291)
85 static const char* ENTITY_TYPE_NAME{
typeid(T).name() };
86 return ENTITY_TYPE_NAME;
94 this->DestroyObject(
object);
99 using EntityRegistry = eastl::unordered_map<EntityTypeId, IEntityContainer*>;
138 auto it = this->m_EntityRegistry.find(EID);
141 if (it == this->m_EntityRegistry.end())
144 this->m_EntityRegistry[EID] = ec;
149 assert(ec !=
nullptr &&
"Failed to create EntityContainer<T>!");
209 template<
class T,
class... ARGS>
213 void* pObjectMemory = GetEntityContainer<T>()->CreateObject();
215 ECS::EntityId entityId = this->AqcuireEntityId((T*)pObjectMemory);
217 ((T*)pObjectMemory)->m_EntityID = entityId;
218 ((T*)pObjectMemory)->m_ComponentManagerInstance = this->m_ComponentManagerInstance;
221 IEntity* entity =
new (pObjectMemory)T(std::forward<ARGS>(args)...);
229 RemoveDestroyedEntity(entityId);
235 if (this->m_NumPendingDestroyedEntities < this->m_PendingDestroyedEntities.size())
237 this->m_PendingDestroyedEntities[this->m_NumPendingDestroyedEntities++] = entityId;
241 this->m_PendingDestroyedEntities.push_back(entityId);
242 this->m_NumPendingDestroyedEntities++;
263 return this->m_EntityHandleTable[entityId];
283 return this->m_EntityHandleTable[index];
286 void RemoveDestroyedEntity(
EntityId id);
299 void RemoveDestroyedEntities();
#define ENITY_T_CHUNK_SIZE
EntityContainer & operator=(EntityContainer &)=delete
virtual void DestroyEntity(IEntity *object) override
virtual ~EntityContainer() override=default
virtual const char * GetEntityContainerTypeName() const override
EntityContainer(const EntityContainer &)=delete
virtual void DestroyEntity(IEntity *object)=0
virtual const char * GetEntityContainerTypeName() const =0
virtual ~IEntityContainer()
void DestroyAndRemoveEntity(EntityId entityId)
EntityRegistry m_EntityRegistry
EntityHandleTable m_EntityHandleTable
EntityManager & operator=(EntityManager &)=delete
EntityId GetEntityId(EntityId::value_type index) const
EntityContainer< T > * GetEntityContainer()
eastl::vector< EntityId > PendingDestroyedEntities
void DestroyEntity(EntityId entityId)
EntityId CreateEntity(ARGS &&... args)
EntityManager(const EntityManager &)=delete
eastl::unordered_map< EntityTypeId, IEntityContainer * > EntityRegistry
size_t m_NumPendingDestroyedEntities
PendingDestroyedEntities m_PendingDestroyedEntities
IEntity * GetEntity(EntityId entityId)
handle_value_type value_type