*EntityTemplate.getComponent *Adding/removing components for Entitites -better code for adding components
86 lines
1.9 KiB
D
86 lines
1.9 KiB
D
module ecs.id_manager;
|
|
|
|
import ecs.entity;
|
|
import ecs.vector;
|
|
|
|
struct IDManager
|
|
{
|
|
EntityID getNewID()
|
|
{
|
|
if (m_next_id >= m_ids_array.length)
|
|
m_ids_array.add(Data());
|
|
EntityID id;
|
|
id.id = m_next_id;
|
|
id.counter = /*++*/m_ids_array[m_next_id].counter;
|
|
m_next_id = m_ids_array[m_next_id].next_id;
|
|
if (m_next_id == uint.max)
|
|
m_next_id = cast(uint) m_ids_array.length;
|
|
return id;
|
|
}
|
|
|
|
void releaseID(EntityID id)
|
|
{
|
|
Data* data = &m_ids_array[id.id];
|
|
if (data.counter != id.counter)
|
|
return;
|
|
data.counter++;
|
|
data.next_id = m_next_id;
|
|
data.entity = null;
|
|
m_next_id = id.id;
|
|
}
|
|
|
|
void update(ref Entity entity)
|
|
{
|
|
if(entity.id.counter == m_ids_array[entity.id.id].counter)m_ids_array[entity.id.id].entity = &entity;
|
|
}
|
|
|
|
export Entity* getEntityPointer(EntityID id)
|
|
{
|
|
Data* data = &m_ids_array[id.id];
|
|
if (data.counter != id.counter)
|
|
return null;
|
|
else
|
|
return data.entity;
|
|
}
|
|
|
|
export bool isExist(EntityID id)
|
|
{
|
|
Data* data = &m_ids_array[id.id];
|
|
return data.counter == id.counter;
|
|
}
|
|
|
|
struct Data
|
|
{
|
|
uint counter = 0;
|
|
uint next_id = uint.max;
|
|
Entity* entity = null;
|
|
}
|
|
|
|
private uint m_next_id = 0;
|
|
Vector!Data m_ids_array;
|
|
}
|
|
|
|
unittest
|
|
{
|
|
IDManager manager;
|
|
EntityID id1 = manager.getNewID();
|
|
EntityID id2 = manager.getNewID();
|
|
EntityID id3 = manager.getNewID();
|
|
|
|
assert(id1 == EntityID(0, 1));
|
|
assert(id2 == EntityID(1, 1));
|
|
assert(id3 == EntityID(2, 1));
|
|
|
|
manager.releaseID(id2);
|
|
manager.releaseID(id1);
|
|
|
|
id2 = manager.getNewID();
|
|
id1 = manager.getNewID();
|
|
|
|
assert(id1 == EntityID(1, 2));
|
|
assert(id2 == EntityID(0, 2));
|
|
assert(id3 == EntityID(2, 1));
|
|
assert(manager.isExist(id3));
|
|
assert(!manager.isExist(EntityID(0, 1)));
|
|
|
|
}
|