Divide Framework 0.1
A free and open-source 3D Framework under heavy development
Loading...
Searching...
No Matches
EntityManager.h
Go to the documentation of this file.
1/*
2 Author : Tobias Stein
3 Date : 11th July, 2016
4 File : EntityManager.h
5
6 Enity manager class.
7
8 All Rights Reserved. (c) Copyright 2016.
9*/
10
11#pragma once
12#ifndef ECS__ENTITY_MANAGER_H__
13#define ECS__ENTITY_MANAGER_H__
14
15#include "API.h"
16#include "Engine.h"
17
18#include "IEntity.h"
19#include "ComponentManager.h"
20
22
23#include "util/Handle.h"
24
25#ifdef _MSC_VER
26#pragma warning(push)
27
28// warning C4291: 'void *operator new(::size_t,void *) throw()': no matching operator delete found; memory will not be freed if initialization throws an exception
29// note we are using custom memory allocator no need for delete
30#pragma warning(disable: 4291)
31#endif //_MSC_VER
32
33namespace ECS
34{
36
37
39 {
41
42
44 {
45 public:
46
48 {}
49
50 virtual const char* GetEntityContainerTypeName() const = 0;
51
52 virtual void DestroyEntity(IEntity* object) = 0;
53
54 }; // class IEntityContainer
55
68
69 template<class T>
70 class EntityContainer : public Memory::MemoryChunkAllocator<T, ENITY_T_CHUNK_SIZE>, public IEntityContainer
71 {
72
75
76 public:
77
78 EntityContainer() : Memory::MemoryChunkAllocator<T, ENITY_T_CHUNK_SIZE>("EntityManager")
79 {}
80
81 virtual ~EntityContainer() override = default;
82
83 virtual const char* GetEntityContainerTypeName() const override
84 {
85 static const char* ENTITY_TYPE_NAME{ typeid(T).name() };
86 return ENTITY_TYPE_NAME;
87 }
88
89 virtual void DestroyEntity(IEntity* object) override
90 {
91 // call d'tor
92 object->~IEntity();
93
94 this->DestroyObject(object);
95 }
96
97 }; // EntityContainer
98
99 using EntityRegistry = eastl::unordered_map<EntityTypeId, IEntityContainer*>;
101
102 using PendingDestroyedEntities = eastl::vector<EntityId>;
105
107 ComponentManager* m_ComponentManagerInstance = nullptr;
108
109 private:
110
111 EntityManager(const EntityManager&) = delete;
113
115
116
117
132
133 template<class T>
135 {
136 EntityTypeId EID = T::STATIC_ENTITY_TYPE_ID;
137
138 auto it = this->m_EntityRegistry.find(EID);
139 EntityContainer<T>* ec = nullptr;
140
141 if (it == this->m_EntityRegistry.end())
142 {
143 ec = new EntityContainer<T>();
144 this->m_EntityRegistry[EID] = ec;
145 }
146 else
147 ec = (EntityContainer<T>*)it->second;
148
149 assert(ec != nullptr && "Failed to create EntityContainer<T>!");
150 return ec;
151 }
152
168
169 EntityId AqcuireEntityId(IEntity* entity);
170
183
184 void ReleaseEntityId(EntityId id);
185
186 public:
187
188 EntityManager(ComponentManager* componentManagerInstance);
190
208
209 template<class T, class... ARGS>
210 EntityId CreateEntity(ARGS&&... args)
211 {
212 // aqcuire memory for new entity object of type T
213 void* pObjectMemory = GetEntityContainer<T>()->CreateObject();
214
215 ECS::EntityId entityId = this->AqcuireEntityId((T*)pObjectMemory);
216
217 ((T*)pObjectMemory)->m_EntityID = entityId;
218 ((T*)pObjectMemory)->m_ComponentManagerInstance = this->m_ComponentManagerInstance;
219
220 // create entity inplace
221 IEntity* entity = new (pObjectMemory)T(std::forward<ARGS>(args)...);
222 (void)entity;
223
224 return entityId;
225 }
226
228 {
229 RemoveDestroyedEntity(entityId);
230 }
231
232 void DestroyEntity(EntityId entityId)
233 {
234
235 if (this->m_NumPendingDestroyedEntities < this->m_PendingDestroyedEntities.size())
236 {
237 this->m_PendingDestroyedEntities[this->m_NumPendingDestroyedEntities++] = entityId;
238 }
239 else
240 {
241 this->m_PendingDestroyedEntities.push_back(entityId);
242 this->m_NumPendingDestroyedEntities++;
243 }
244 }
245
260
261 inline IEntity* GetEntity(EntityId entityId)
262 {
263 return this->m_EntityHandleTable[entityId];
264 }
265
280
282 {
283 return this->m_EntityHandleTable[index];
284 }
285
286 void RemoveDestroyedEntity(EntityId id);
287
288
298
299 void RemoveDestroyedEntities();
300 };
301
302
303} // namespace ECS
304
305#ifdef _MSC_VER
306#pragma warning(pop)
307#endif //_MSC_VER
308
309#endif // ECS__ENTITY_MANAGER_H__
#define ENITY_T_CHUNK_SIZE
Definition: API.h:22
#define DECLARE_LOGGER
Definition: LoggerMacro.h:15
#define ECS_API
Definition: Platform.h:16
EntityContainer & operator=(EntityContainer &)=delete
virtual void DestroyEntity(IEntity *object) override
Definition: EntityManager.h:89
virtual ~EntityContainer() override=default
virtual const char * GetEntityContainerTypeName() const override
Definition: EntityManager.h:83
EntityContainer(const EntityContainer &)=delete
virtual void DestroyEntity(IEntity *object)=0
virtual const char * GetEntityContainerTypeName() const =0
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
Definition: EntityManager.h:99
size_t m_NumPendingDestroyedEntities
PendingDestroyedEntities m_PendingDestroyedEntities
IEntity * GetEntity(EntityId entityId)
TypeID EntityTypeId
Definition: IEntity.h:15
handle_value_type value_type
Definition: Handle.h:44