Demos #10
3 changed files with 21 additions and 40 deletions
|
|
@ -17,10 +17,6 @@ struct IDManager
|
||||||
*/
|
*/
|
||||||
pragma(inline, false) EntityID getNewID() nothrow @nogc
|
pragma(inline, false) EntityID getNewID() nothrow @nogc
|
||||||
{
|
{
|
||||||
//uint current = m_next_id;
|
|
||||||
//uint next;// = m_ids_array[m_next_id].next_id;
|
|
||||||
//begin:
|
|
||||||
//if (current == uint.max)//> m_last_id)
|
|
||||||
int current = m_stack_top.atomicOp!"-="(1) + 1;
|
int current = m_stack_top.atomicOp!"-="(1) + 1;
|
||||||
if(current < 0)
|
if(current < 0)
|
||||||
{
|
{
|
||||||
|
|
@ -48,29 +44,11 @@ struct IDManager
|
||||||
return id;
|
return id;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
//current += 1;
|
|
||||||
uint index = m_free_stack[current];
|
uint index = m_free_stack[current];
|
||||||
EntityID id;
|
EntityID id;
|
||||||
id.id = index;
|
id.id = index;
|
||||||
id.counter = m_ids_array[index].counter;
|
id.counter = m_ids_array[index].counter;
|
||||||
//current = m_ids_array[index].next_id;
|
|
||||||
return id;
|
return id;
|
||||||
|
|
||||||
/*next = m_ids_array[current].next_id;
|
|
||||||
if(cas(&m_next_id,current,next))
|
|
||||||
{
|
|
||||||
EntityID id;
|
|
||||||
id.id = current;
|
|
||||||
id.counter = m_ids_array[current].counter;
|
|
||||||
m_next_id = m_ids_array[current].next_id;
|
|
||||||
return id;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
current = next;
|
|
||||||
goto begin;
|
|
||||||
}*/
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/************************************************************************************************************************
|
/************************************************************************************************************************
|
||||||
|
|
@ -82,9 +60,7 @@ struct IDManager
|
||||||
if (data.counter != id.counter)
|
if (data.counter != id.counter)
|
||||||
return;
|
return;
|
||||||
data.counter++;
|
data.counter++;
|
||||||
//data.next_id = m_next_id;
|
|
||||||
data.entity = null;
|
data.entity = null;
|
||||||
///m_next_id = id.id;
|
|
||||||
|
|
||||||
m_stack_top.atomicOp!"+="(1);
|
m_stack_top.atomicOp!"+="(1);
|
||||||
m_free_stack[m_stack_top] = id.id;
|
m_free_stack[m_stack_top] = id.id;
|
||||||
|
|
@ -241,13 +217,10 @@ struct IDManager
|
||||||
|
|
||||||
private:
|
private:
|
||||||
Mutex* add_mutex;
|
Mutex* add_mutex;
|
||||||
//shared uint m_next_id = 0;
|
|
||||||
|
|
||||||
//shared uint m_last_id = 0;
|
|
||||||
Data[] m_ids_array = null;
|
Data[] m_ids_array = null;
|
||||||
uint m_blocks_count = 0;
|
uint m_blocks_count = 0;
|
||||||
Block[] m_blocks;
|
Block[] m_blocks;
|
||||||
//shared int m_stack_top = -1;
|
|
||||||
uint[] m_free_stack = null;
|
uint[] m_free_stack = null;
|
||||||
|
|
||||||
align(64) shared uint m_last_id = 0;
|
align(64) shared uint m_last_id = 0;
|
||||||
|
|
|
||||||
|
|
@ -4,11 +4,16 @@ import bubel.ecs.std;
|
||||||
|
|
||||||
//import core.stdc.string;
|
//import core.stdc.string;
|
||||||
|
|
||||||
|
/************************************************************************************************************************
|
||||||
|
Vector for byte data. Simpler than standard template-based implementation designed for better performance. \
|
||||||
|
Rellocates 1024 elements at once instead of doubling size.
|
||||||
|
*/
|
||||||
struct SimpleVector
|
struct SimpleVector
|
||||||
{
|
{
|
||||||
|
|
||||||
@disable this(this);
|
@disable this(this);
|
||||||
|
|
||||||
|
///Add element to vector
|
||||||
void add(ubyte el) nothrow @nogc
|
void add(ubyte el) nothrow @nogc
|
||||||
{
|
{
|
||||||
while(used >= data.length)
|
while(used >= data.length)
|
||||||
|
|
@ -19,6 +24,7 @@ struct SimpleVector
|
||||||
data[used++] = el;
|
data[used++] = el;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
///Add array of elements to vector
|
||||||
void add(ubyte[] el) nothrow @nogc
|
void add(ubyte[] el) nothrow @nogc
|
||||||
{
|
{
|
||||||
while(used + el.length >= data.length)
|
while(used + el.length >= data.length)
|
||||||
|
|
@ -30,6 +36,7 @@ struct SimpleVector
|
||||||
used += el.length;
|
used += el.length;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
///Return vector length
|
||||||
size_t length() nothrow @nogc
|
size_t length() nothrow @nogc
|
||||||
{
|
{
|
||||||
return used;
|
return used;
|
||||||
|
|
@ -55,6 +62,7 @@ struct SimpleVector
|
||||||
return used;
|
return used;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
///set vector length to 0
|
||||||
void clear() nothrow @nogc
|
void clear() nothrow @nogc
|
||||||
{
|
{
|
||||||
used = 0;
|
used = 0;
|
||||||
|
|
|
||||||
|
|
@ -14,16 +14,16 @@ System contain data required to proper glue EntityManager with Systems.
|
||||||
System callbacks:
|
System callbacks:
|
||||||
$(LIST
|
$(LIST
|
||||||
* void onUpdate(EntitesData);
|
* void onUpdate(EntitesData);
|
||||||
* void onEnable()
|
* void onEnable() - called inside system.enable() function
|
||||||
* void onDisable();
|
* void onDisable() - called inside system.disable() function
|
||||||
* bool onBegin();
|
* bool onBegin() - called inside manager.begin()
|
||||||
* void onEnd();
|
* void onEnd() - called inside manager.end()
|
||||||
* void onCreate()
|
* void onCreate() - called after registration inside registerSystem function
|
||||||
* void onDestroy();
|
* void onDestroy() - called during re-registration and inside manager destructor
|
||||||
* void onAddEntity(EntitesData);
|
* void onAddEntity(EntitesData) - called for every entity which are assigned to system (by adding new entity or changing its components)
|
||||||
* void onRemoveEntity(EntitiesData);
|
* void onRemoveEntity(EntitiesData) - called for every entity removed from system update process
|
||||||
* void onChangeEntity(EntitiesData);
|
* void onChangeEntity(EntitiesData) - called for every entity which components are changed but it was previously assigned to system
|
||||||
* void handleEvent(Entity*, Event);
|
* void handleEvent(Entity*, Event) - called for every event supported by system
|
||||||
)
|
)
|
||||||
*/
|
*/
|
||||||
struct System
|
struct System
|
||||||
|
|
@ -66,15 +66,15 @@ struct System
|
||||||
}
|
}
|
||||||
|
|
||||||
/************************************************************************************************************************
|
/************************************************************************************************************************
|
||||||
Get system priority.
|
Get if system will be executed during current frame. Should be checked after manager.begin(). Its value is setted as result of manager.onBegin() callback.
|
||||||
*/
|
*/
|
||||||
export bool execute() nothrow @nogc
|
export bool willExecute() nothrow @nogc
|
||||||
{
|
{
|
||||||
return m_execute;
|
return m_execute;
|
||||||
}
|
}
|
||||||
|
|
||||||
/************************************************************************************************************************
|
/************************************************************************************************************************
|
||||||
Get system priority.
|
Get system id.
|
||||||
*/
|
*/
|
||||||
export ushort id() nothrow @nogc
|
export ushort id() nothrow @nogc
|
||||||
{
|
{
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue