Removed structure top mixins requirement #15

Merged
Mergul merged 3 commits from remove_structure_top_mixin into master 2021-02-27 17:42:50 +01:00
9 changed files with 138 additions and 123 deletions
Showing only changes of commit a926b79223 - Show all commits

View file

@ -53,6 +53,7 @@ module bubel.ecs.core;
public import bubel.ecs.manager; public import bubel.ecs.manager;
public import bubel.ecs.entity; public import bubel.ecs.entity;
public import bubel.ecs.traits : ecsID;
/************************************************************************************************************************ /************************************************************************************************************************
Main struct used as namespace for templates. Main struct used as namespace for templates.
@ -60,12 +61,12 @@ Main struct used as namespace for templates.
static struct ECS static struct ECS
{ {
/************************************************************************************************************************ /************************************************************************************************************************
Mark structure as System. Should be added on top of structure (before any data). Set default system parameters (number of parallel jobs)
*/ */
mixin template System(uint jobs_count = 32) mixin template System(uint jobs_count = 32)
{ {
__gshared ushort system_id = ushort.max; // __gshared ushort system_id = ushort.max;
uint __ecs_jobs_count = jobs_count; __gshared uint __ecs_jobs_count = jobs_count;
} }
/************************************************************************************************************************ /************************************************************************************************************************
@ -73,21 +74,21 @@ static struct ECS
*/ */
mixin template Component() mixin template Component()
{ {
__gshared ushort component_id = ushort.max; //__gshared ushort component_id = ushort.max;
ComponentRef ref_() @nogc nothrow return ComponentRef ref_() @nogc nothrow return
{ {
return ComponentRef(&this, component_id); return ComponentRef(&this, ecsID!(typeof(this)));
} }
} }
/************************************************************************************************************************ /************************************************************************************************************************
Mark structure as Event. Should be added on top of structure (before any data). Mark structure as Event. Should be added on top of structure (before any data).
*/ */
mixin template Event() // mixin template Event()
{ // {
__gshared ushort event_id = ushort.max; // __gshared ushort event_id = ushort.max;
} // }
/************************************************************************************************************************ /************************************************************************************************************************
Make list of excluded components. This template get structure types as argument. Should be added inside System structure. Make list of excluded components. This template get structure types as argument. Should be added inside System structure.

View file

@ -8,6 +8,7 @@ module bubel.ecs.entity;
import bubel.ecs.system; import bubel.ecs.system;
import bubel.ecs.manager; import bubel.ecs.manager;
import bubel.ecs.traits : ecsID;
/************************************************************************************************************************ /************************************************************************************************************************
Entity ID structure. Used as reference to Entity. Pointer to entity should be ever used to store entity reference! Entity ID structure. Used as reference to Entity. Pointer to entity should be ever used to store entity reference!
@ -40,7 +41,7 @@ struct Entity
return null; return null;
return cast(T*)(cast(void*)block + info.deltas[T.component_id] + block.entityIndex(&this) * T.sizeof);*/ return cast(T*)(cast(void*)block + info.deltas[T.component_id] + block.entityIndex(&this) * T.sizeof);*/
return cast(T*)getComponent(T.component_id); return cast(T*)getComponent(ecsID!T);
} }
void* getComponent(ushort component_id) const void* getComponent(ushort component_id) const
@ -81,7 +82,7 @@ struct EntityMeta
if (T.component_id >= info.deltas.length || info.deltas[T.component_id] == 0) if (T.component_id >= info.deltas.length || info.deltas[T.component_id] == 0)
return null; return null;
return cast(T*)(cast(void*)block + info.deltas[T.component_id] + index * T.sizeof);*/ return cast(T*)(cast(void*)block + info.deltas[T.component_id] + index * T.sizeof);*/
return cast(T*)getComponent(T.component_id); return cast(T*)getComponent(ecsID!T);
} }
void* getComponent(ushort component_id) const void* getComponent(ushort component_id) const
@ -125,8 +126,8 @@ export struct EntityTemplate
*/ */
T* getComponent(T)() nothrow @nogc T* getComponent(T)() nothrow @nogc
{ {
if(T.component_id >= info.tmpl_deltas.length || info.tmpl_deltas[T.component_id] == ushort.max)return null; if(ecsID!T >= info.tmpl_deltas.length || info.tmpl_deltas[ecsID!T] == ushort.max)return null;
return cast(T*)(entity_data.ptr + info.tmpl_deltas[T.component_id]); return cast(T*)(entity_data.ptr + info.tmpl_deltas[ecsID!T]);
} }
} }

View file

@ -4,6 +4,7 @@ import bubel.ecs.block_allocator;
import bubel.ecs.entity; import bubel.ecs.entity;
import bubel.ecs.manager; import bubel.ecs.manager;
import bubel.ecs.std; import bubel.ecs.std;
import bubel.ecs.traits : ecsID;
import std.algorithm.comparison : max; import std.algorithm.comparison : max;
@ -32,7 +33,7 @@ package struct EventManager
{ {
uint block_id = current_index + thread_id; uint block_id = current_index + thread_id;
EventData* data = &events[Ev.event_id]; EventData* data = &events[ecsID!Ev];
EventBlock* block = data.blocks[block_id]; EventBlock* block = data.blocks[block_id];
//EntityManager.EventInfo* info = &manager.events[Ev.event_id]; //EntityManager.EventInfo* info = &manager.events[Ev.event_id];
//event.entity_id = id; //event.entity_id = id;

View file

@ -367,10 +367,10 @@ export struct EntityManager
System system; System system;
system.m_pass = pass; system.m_pass = pass;
static if (!(hasMember!(Sys, "system_id")) || !is(typeof(Sys.system_id) == ushort)) // static if (!(hasMember!(Sys, "system_id")) || !is(typeof(Sys.system_id) == ushort))
{ // {
static assert(0, "Add \"mixin ECS.System;\" in top of system structure;"); // static assert(0, "Add \"mixin ECS.System;\" in top of system structure;");
} // }
static if (!(hasMember!(Sys, "EntitiesData"))) static if (!(hasMember!(Sys, "EntitiesData")))
{ {
@ -408,7 +408,7 @@ export struct EntityManager
~ "\" due to non existing event \"" ~ EventName ~ "\"."); ~ "\" due to non existing event \"" ~ EventName ~ "\".");
callers[i].callback = cast(void*)&callEventHandler!(EventParamType); callers[i].callback = cast(void*)&callEventHandler!(EventParamType);
callers[i].id = EventParamType.event_id; callers[i].id = ecsID!EventParamType;
i++; i++;
} }
} }
@ -1125,8 +1125,8 @@ export struct EntityManager
system.m_priority = priority; system.m_priority = priority;
//(cast(Sys*) system.m_system_pointer).__ecsInitialize(); //(cast(Sys*) system.m_system_pointer).__ecsInitialize();
//system.jobs = (cast(Sys*) system.m_system_pointer)._ecs_jobs; //system.jobs = (cast(Sys*) system.m_system_pointer)._ecs_jobs;
system.jobs = Mallocator.makeArray!(Job)((cast(Sys*) system.m_system_pointer) static if(__traits(hasMember, Sys ,"__ecs_jobs_count"))system.jobs = Mallocator.makeArray!(Job)(Sys.__ecs_jobs_count);
.__ecs_jobs_count); else system.jobs = Mallocator.makeArray!(Job)(32);
static if (OnUpdateOverloadNum != -1) static if (OnUpdateOverloadNum != -1)
{ {
@ -1194,7 +1194,7 @@ export struct EntityManager
systems[$ - 1].enable(); systems[$ - 1].enable();
} }
Sys.system_id = system.id; ecsID!Sys = system.id;
} }
/************************************************************************************************************************ /************************************************************************************************************************
@ -1212,9 +1212,9 @@ export struct EntityManager
*/ */
Sys* getSystem(Sys)() nothrow @nogc Sys* getSystem(Sys)() nothrow @nogc
{ {
if (Sys.system_id >= systems.length) if (ecsID!Sys >= systems.length)
return null; return null;
return cast(Sys*) systems[Sys.system_id].m_system_pointer; return cast(Sys*) systems[ecsID!Sys].m_system_pointer;
} }
export ushort registerPass(const(char)[] name) export ushort registerPass(const(char)[] name)
@ -1244,10 +1244,10 @@ export struct EntityManager
enum ComponentName = fullName!Comp; enum ComponentName = fullName!Comp;
// enum ComponentName = Comp.stringof; // enum ComponentName = Comp.stringof;
static if (!(hasMember!(Comp, "component_id")) || !is(typeof(Comp.component_id) == ushort)) // static if (!(hasMember!(Comp, "component_id")) || !is(typeof(Comp.component_id) == ushort))
{ // {
static assert(0, "Add \"mixin ECS.Component;\" in top of component structure;"); // static assert(0, "Add \"mixin ECS.Component;\" in top of component structure;");
} // }
static if (hasMember!(Comp, "onDestroy") && isFunction!(Comp.onDestroy) static if (hasMember!(Comp, "onDestroy") && isFunction!(Comp.onDestroy)
&& is(ReturnType!(Comp.onDestroy) == void) && is(ReturnType!(Comp.onDestroy) == void)
@ -1283,7 +1283,7 @@ export struct EntityManager
ushort comp_id = components_map.get(cast(char[]) ComponentName, ushort.max); ushort comp_id = components_map.get(cast(char[]) ComponentName, ushort.max);
if (comp_id < components.length) if (comp_id < components.length)
{ {
Comp.component_id = comp_id; ecsID!Comp = comp_id;
if (components[comp_id].init_data) if (components[comp_id].init_data)
Mallocator.dispose(components[comp_id].init_data); Mallocator.dispose(components[comp_id].init_data);
components[comp_id] = info; components[comp_id] = info;
@ -1291,7 +1291,7 @@ export struct EntityManager
else else
{ {
components.add(info); components.add(info);
Comp.component_id = cast(ushort)(components.length - 1); ecsID!Comp = cast(ushort)(components.length - 1);
char[] name = Mallocator.makeArray(cast(char[]) ComponentName); char[] name = Mallocator.makeArray(cast(char[]) ComponentName);
components_map.add(name, cast(ushort)(components.length - 1)); components_map.add(name, cast(ushort)(components.length - 1));
} }
@ -1301,10 +1301,10 @@ export struct EntityManager
{ {
EventInfo info; EventInfo info;
static if (!(hasMember!(Ev, "event_id")) || !is(typeof(Ev.event_id) == ushort)) // static if (!(hasMember!(Ev, "event_id")) || !is(typeof(Ev.event_id) == ushort))
{ // {
static assert(0, "Add \"mixin ECS.Event;\" in top of event structure;"); // static assert(0, "Add \"mixin ECS.Event;\" in top of event structure;");
} // }
static if (hasMember!(Ev, "onDestroy") && isFunction!(Ev.onDestroy) static if (hasMember!(Ev, "onDestroy") && isFunction!(Ev.onDestroy)
&& is(ReturnType!(Ev.onDestroy) == void) && Parameters!(Ev.onDestroy).length == 0) && is(ReturnType!(Ev.onDestroy) == void) && Parameters!(Ev.onDestroy).length == 0)
@ -1324,12 +1324,12 @@ export struct EntityManager
ushort event_id = events_map.get(fullName!Ev, ushort.max); ushort event_id = events_map.get(fullName!Ev, ushort.max);
if (event_id < events.length) if (event_id < events.length)
{ {
Ev.event_id = event_id; ecsID!Ev = event_id;
} }
else else
{ {
events.add(info); events.add(info);
Ev.event_id = cast(ushort)(events.length - 1); ecsID!Ev = cast(ushort)(events.length - 1);
// events_map.add(Ev.stringof, cast(ushort)(events.length - 1)); // events_map.add(Ev.stringof, cast(ushort)(events.length - 1));
events_map.add(fullName!Ev, cast(ushort)(events.length - 1)); events_map.add(fullName!Ev, cast(ushort)(events.length - 1));
} }
@ -1348,9 +1348,9 @@ export struct EntityManager
// static assert(is(SetFunctionAttributes!(T, functionLinkage!(s.onUpdate), // static assert(is(SetFunctionAttributes!(T, functionLinkage!(s.onUpdate),
// functionAttributes!(s.onUpdate)) == typeof(&s.onUpdate)), // functionAttributes!(s.onUpdate)) == typeof(&s.onUpdate)),
// "Function must match system update function."); FIXME: It's lead to crash on android build // "Function must match system update function."); FIXME: It's lead to crash on android build
static assert(__traits(hasMember, Sys, "system_id"), "Sys must be system type."); // static assert(__traits(hasMember, Sys, "system_id"), "Sys must be system type.");
System* system = getSystem(Sys.system_id); System* system = getSystem(ecsID!Sys);
assert(system != null, assert(system != null,
"System must be registered in EntityManager before any funcion can be called."); "System must be registered in EntityManager before any funcion can be called.");
if (!system.m_any_system_caller) if (!system.m_any_system_caller)
@ -2256,7 +2256,7 @@ export struct EntityManager
ushort[num] del_ids; ushort[num] del_ids;
static foreach (i, comp; Components) static foreach (i, comp; Components)
{ {
del_ids[i] = comp.component_id; del_ids[i] = ecsID!comp;
} }
removeComponents(entity_id, del_ids); removeComponents(entity_id, del_ids);

View file

@ -2,6 +2,18 @@ module bubel.ecs.traits;
import std.traits; import std.traits;
ref ushort ecsID(T)()
{
__gshared ushort id = ushort.max;
return id;
}
ref ushort ecsID(T)(T obj)
{
static if(isPointer!T)return ecsID!(PointerTarget!T);
else return ecsID!T;
}
bool isForeachDelegateWithTypes(DG, Types...)() bool isForeachDelegateWithTypes(DG, Types...)()
{ {
return is(DG == delegate) && is(ReturnType!DG == int) && is(Parameters!DG == Types); return is(DG == delegate) && is(ReturnType!DG == int) && is(Parameters!DG == Types);

View file

@ -65,7 +65,7 @@ void beforeEveryTest()
gEM.endRegister(); gEM.endRegister();
tmpl = gEM.allocateTemplate([CLong.component_id, CInt.component_id, CUInt.component_id, CBig.component_id].staticArray); tmpl = gEM.allocateTemplate([ecsID!CLong, ecsID!CInt, ecsID!CUInt, ecsID!CBig].staticArray);
foreach(i; 0 .. 100_000)gEM.addEntity(tmpl); foreach(i; 0 .. 100_000)gEM.addEntity(tmpl);
} }

View file

@ -115,7 +115,7 @@ struct EmptySystem
void beforeEveryTest() void beforeEveryTest()
{ {
CUnregistered.component_id = ushort.max; ecsID!CUnregistered = ushort.max;
gEM.initialize(0); gEM.initialize(0);
gEM.beginRegister(); gEM.beginRegister();
@ -138,17 +138,17 @@ void afterEveryTest()
@("EntityMeta") @("EntityMeta")
unittest unittest
{ {
EntityTemplate* tmpl_ = gEM.allocateTemplate([CInt.component_id, CFloat.component_id, CFlag.component_id].staticArray); EntityTemplate* tmpl_ = gEM.allocateTemplate([ecsID!CInt, ecsID!CFloat, ecsID!CFlag].staticArray);
Entity* entity = gEM.addEntity(tmpl_); Entity* entity = gEM.addEntity(tmpl_);
EntityMeta meta = entity.getMeta(); EntityMeta meta = entity.getMeta();
assert(meta.hasComponent(CInt.component_id)); assert(meta.hasComponent(ecsID!CInt));
assert(meta.getComponent!CInt); assert(meta.getComponent!CInt);
assert(meta.hasComponent(CFloat.component_id)); assert(meta.hasComponent(ecsID!CFloat));
assert(meta.getComponent!CFloat); assert(meta.getComponent!CFloat);
assert(!meta.getComponent!CLong); assert(!meta.getComponent!CLong);
assert(!meta.hasComponent(CLong.component_id)); assert(!meta.hasComponent(ecsID!CLong));
assert(!meta.getComponent!CUnregistered); assert(!meta.getComponent!CUnregistered);
assert(!meta.hasComponent(CUnregistered.component_id)); assert(!meta.hasComponent(ecsID!CUnregistered));
assert(*meta.getComponent!CInt == 1); assert(*meta.getComponent!CInt == 1);
assert(*meta.getComponent!CFloat == 2.0); assert(*meta.getComponent!CFloat == 2.0);
} }
@ -156,7 +156,7 @@ unittest
@("AddEntity") @("AddEntity")
unittest unittest
{ {
EntityTemplate* tmpl_ = gEM.allocateTemplate([CInt.component_id, CFloat.component_id, CFlag.component_id].staticArray); EntityTemplate* tmpl_ = gEM.allocateTemplate([ecsID!CInt, ecsID!CFloat, ecsID!CFlag].staticArray);
assert(tmpl_.info.components.length == 3); assert(tmpl_.info.components.length == 3);
assert(tmpl_.info.size == (CInt.sizeof + CFloat.sizeof + EntityID.sizeof)); assert(tmpl_.info.size == (CInt.sizeof + CFloat.sizeof + EntityID.sizeof));
assert(tmpl_.getComponent!CInt); assert(tmpl_.getComponent!CInt);
@ -185,8 +185,8 @@ unittest
//Entity* entity3 = gEM.addEntity(tmpl_, [cint.ref_, clong.ref_].staticArray); //Entity* entity3 = gEM.addEntity(tmpl_, [cint.ref_, clong.ref_].staticArray);
Entity* entity3 = gEM.addEntity(tmpl_, [CInt(10).ref_, CLong().ref_, CFlag().ref_].staticArray); Entity* entity3 = gEM.addEntity(tmpl_, [CInt(10).ref_, CLong().ref_, CFlag().ref_].staticArray);
EntityID id = entity3.id; EntityID id = entity3.id;
assert(entity3.hasComponent(CInt.component_id)); assert(entity3.hasComponent(ecsID!CInt));
assert(entity3.hasComponent(CFloat.component_id)); assert(entity3.hasComponent(ecsID!CFloat));
assert(*entity3.getComponent!CInt == 10); assert(*entity3.getComponent!CInt == 10);
assert(*entity3.getComponent!CFloat == 2.0); assert(*entity3.getComponent!CFloat == 2.0);
@ -201,7 +201,7 @@ unittest
assert(*entity3.getComponent!CFloat == 2.0); assert(*entity3.getComponent!CFloat == 2.0);
assert(*entity3.getComponent!CShort == 2); assert(*entity3.getComponent!CShort == 2);
gEM.removeComponents(entity3.id, [CFlag().component_id,CShort(2).component_id].staticArray); gEM.removeComponents(entity3.id, [ecsID!CFlag,ecsID!CShort].staticArray);
gEM.commit(); gEM.commit();
entity3 = gEM.getEntity(id); entity3 = gEM.getEntity(id);
assert(entity3.getComponent!CInt); assert(entity3.getComponent!CInt);
@ -212,7 +212,7 @@ unittest
assert(*entity3.getComponent!CFloat == 2.0); assert(*entity3.getComponent!CFloat == 2.0);
gEM.addComponents(entity3.id, [CFlag().ref_,CShort(2).ref_].staticArray); gEM.addComponents(entity3.id, [CFlag().ref_,CShort(2).ref_].staticArray);
gEM.removeComponents(entity3.id, [CUnregistered.component_id].staticArray); gEM.removeComponents(entity3.id, [ecsID!CUnregistered].staticArray);
gEM.commit(); gEM.commit();
entity3 = gEM.getEntity(id); entity3 = gEM.getEntity(id);
assert(entity3.getComponent!CInt); assert(entity3.getComponent!CInt);
@ -235,7 +235,7 @@ unittest
assert(entity3.getComponent!CUnregistered); assert(entity3.getComponent!CUnregistered);
assert(*entity3.getComponent!CUnregistered == 4); assert(*entity3.getComponent!CUnregistered == 4);
gEM.removeComponents(entity3.id, [CUnregistered.component_id].staticArray); gEM.removeComponents(entity3.id, [ecsID!CUnregistered].staticArray);
gEM.commit(); gEM.commit();
entity3 = gEM.getEntity(id); entity3 = gEM.getEntity(id);
assert(!entity3.getComponent!CUnregistered); assert(!entity3.getComponent!CUnregistered);
@ -247,9 +247,9 @@ unittest
unittest unittest
{ {
//basic template allocation //basic template allocation
ushort[2] ids = [CInt.component_id, CFloat.component_id]; ushort[2] ids = [ecsID!CInt, ecsID!CFloat];
EntityTemplate* tmpl_ = gEM.allocateTemplate(ids); EntityTemplate* tmpl_ = gEM.allocateTemplate(ids);
EntityTemplate* tmpl_d = gEM.allocateTemplate([CFloat.component_id, CInt.component_id, CFloat.component_id].staticArray); EntityTemplate* tmpl_d = gEM.allocateTemplate([ecsID!CFloat, ecsID!CInt, ecsID!CFloat].staticArray);
EntityTemplate* tmpl_cp = gEM.allocateTemplate(tmpl_); EntityTemplate* tmpl_cp = gEM.allocateTemplate(tmpl_);
assert(tmpl_d.info == tmpl_.info); assert(tmpl_d.info == tmpl_.info);
assert(tmpl_cp.info == tmpl_cp.info); assert(tmpl_cp.info == tmpl_cp.info);
@ -268,7 +268,7 @@ unittest
*tmpl_.getComponent!CFloat = 5.0; *tmpl_.getComponent!CFloat = 5.0;
//allocate template from template with additional components //allocate template from template with additional components
ushort[2] ids2 = [CDouble.component_id,CFlag.component_id]; ushort[2] ids2 = [ecsID!CDouble,ecsID!CFlag];
EntityTemplate* tmpl_2 = gEM.allocateTemplate(tmpl_, ids2); EntityTemplate* tmpl_2 = gEM.allocateTemplate(tmpl_, ids2);
assert(tmpl_2.info.components.length == 4); assert(tmpl_2.info.components.length == 4);
assert(tmpl_2.getComponent!CInt); assert(tmpl_2.getComponent!CInt);
@ -313,7 +313,7 @@ unittest
assert(*tmpl_4.getComponent!CDouble == 3.0); assert(*tmpl_4.getComponent!CDouble == 3.0);
//allocate template from template with three additional component //allocate template from template with three additional component
ushort[3] ids3 = [CDouble.component_id, CLong.component_id, CShort.component_id]; ushort[3] ids3 = [ecsID!CDouble, ecsID!CLong, ecsID!CShort];
EntityTemplate* tmpl_5 = gEM.allocateTemplate(tmpl_2, ids3); EntityTemplate* tmpl_5 = gEM.allocateTemplate(tmpl_2, ids3);
assert(tmpl_5.info.components.length == 6); assert(tmpl_5.info.components.length == 6);
assert(tmpl_5.getComponent!CInt); assert(tmpl_5.getComponent!CInt);
@ -328,7 +328,7 @@ unittest
assert(*tmpl_5.getComponent!CShort == 12); assert(*tmpl_5.getComponent!CShort == 12);
//allocate template from template without one component //allocate template from template without one component
ushort[1] rem_ids = [CFloat.component_id]; ushort[1] rem_ids = [ecsID!CFloat];
EntityTemplate* tmpl_6 = gEM.allocateTemplate(tmpl_, null, rem_ids); EntityTemplate* tmpl_6 = gEM.allocateTemplate(tmpl_, null, rem_ids);
assert(tmpl_6.info.components.length == 1); assert(tmpl_6.info.components.length == 1);
assert(tmpl_6.getComponent!CInt); assert(tmpl_6.getComponent!CInt);
@ -358,8 +358,8 @@ unittest
unittest unittest
{ {
//basic template allocation //basic template allocation
ushort[2] ids = [CFloat.component_id, CInt.component_id]; ushort[2] ids = [ecsID!CFloat, ecsID!CInt];
ushort[2] ids2 = [CInt.component_id, CFloat.component_id]; ushort[2] ids2 = [ecsID!CInt, ecsID!CFloat];
EntityTemplate* tmpl_ = gEM.allocateTemplate(ids); EntityTemplate* tmpl_ = gEM.allocateTemplate(ids);
EntityTemplate* tmpl_2 = gEM.allocateTemplate(ids2); EntityTemplate* tmpl_2 = gEM.allocateTemplate(ids2);
assert(tmpl_.info.components.length == 2); assert(tmpl_.info.components.length == 2);
@ -398,9 +398,9 @@ unittest
assert(system !is null); assert(system !is null);
assert(system.count == 0); assert(system.count == 0);
System* ecs_system = gEM.getSystem(EmptySystem.system_id); System* ecs_system = gEM.getSystem(ecsID!EmptySystem);
assert(ecs_system !is null); assert(ecs_system !is null);
assert(ecs_system.id == EmptySystem.system_id); assert(ecs_system.id == ecsID!EmptySystem);
assert(ecs_system.name == "tests.basic.EmptySystem"); assert(ecs_system.name == "tests.basic.EmptySystem");
gEM.begin(); gEM.begin();
@ -502,7 +502,7 @@ unittest
//FIXME: currently destroy is only called with Manager.destory which is bug, but there is no workaround for this by now //FIXME: currently destroy is only called with Manager.destory which is bug, but there is no workaround for this by now
//assert(destroy == 1); //assert(destroy == 1);
System* ecs_system = gEM.getSystem(system.system_id); System* ecs_system = gEM.getSystem(system.ecsID);
ecs_system.enable(); ecs_system.enable();
assert(system.enable == 1); assert(system.enable == 1);
@ -513,7 +513,7 @@ unittest
assert(system.disable == 1); assert(system.disable == 1);
ushort[2] ids = [CLong.component_id,CFloat.component_id]; ushort[2] ids = [ecsID!CLong,ecsID!CFloat];
EntityTemplate* tmpl = gEM.allocateTemplate(ids); EntityTemplate* tmpl = gEM.allocateTemplate(ids);
scope (exit) gEM.freeTemplate(tmpl); scope (exit) gEM.freeTemplate(tmpl);
gEM.addEntity(tmpl); gEM.addEntity(tmpl);
@ -527,7 +527,7 @@ unittest
gEM.end(); gEM.end();
assert(system.end == 1); assert(system.end == 1);
ushort[2] ids2 = [CLong.component_id, CInt.component_id]; ushort[2] ids2 = [ecsID!CLong, ecsID!CInt];
EntityTemplate* tmpl2 = gEM.allocateTemplate(ids2); EntityTemplate* tmpl2 = gEM.allocateTemplate(ids2);
scope (exit) gEM.freeTemplate(tmpl2); scope (exit) gEM.freeTemplate(tmpl2);
gEM.addEntity(tmpl2); gEM.addEntity(tmpl2);
@ -542,7 +542,7 @@ unittest
gEM.end(); gEM.end();
assert(system.end == 2); assert(system.end == 2);
ushort[2] ids3 = [CLong.component_id, CShort.component_id]; ushort[2] ids3 = [ecsID!CLong, ecsID!CShort];
EntityTemplate* tmpl3 = gEM.allocateTemplate(ids3); EntityTemplate* tmpl3 = gEM.allocateTemplate(ids3);
scope (exit) gEM.freeTemplate(tmpl3); scope (exit) gEM.freeTemplate(tmpl3);
gEM.addEntity(tmpl3); gEM.addEntity(tmpl3);
@ -601,13 +601,13 @@ unittest
assert(system !is null); assert(system !is null);
assert(system.updates_count == 0); assert(system.updates_count == 0);
System* ecs_system = gEM.getSystem(LongAddSystem.system_id); System* ecs_system = gEM.getSystem(ecsID!LongAddSystem);
assert(ecs_system !is null); assert(ecs_system !is null);
assert(ecs_system.id == LongAddSystem.system_id); assert(ecs_system.id == ecsID!LongAddSystem);
assert(ecs_system.priority == -1); assert(ecs_system.priority == -1);
assert(ecs_system.name == "tests.basic.LongAddSystem"); assert(ecs_system.name == "tests.basic.LongAddSystem");
ushort[1] ids = [CLong.component_id]; ushort[1] ids = [ecsID!CLong];
EntityTemplate* tmpl = gEM.allocateTemplate(ids); EntityTemplate* tmpl = gEM.allocateTemplate(ids);
scope (exit) gEM.freeTemplate(tmpl); scope (exit) gEM.freeTemplate(tmpl);
gEM.addEntity(tmpl); gEM.addEntity(tmpl);
@ -757,19 +757,19 @@ unittest
assert(system.remove == 0); assert(system.remove == 0);
assert(system.change == 0); assert(system.change == 0);
EntityTemplate* tmpl = gEM.allocateTemplate([CLong.component_id,CFloat.component_id].staticArray); EntityTemplate* tmpl = gEM.allocateTemplate([ecsID!CLong,ecsID!CFloat].staticArray);
scope (exit) gEM.freeTemplate(tmpl); scope (exit) gEM.freeTemplate(tmpl);
EntityID id0 = gEM.addEntity(tmpl).id; EntityID id0 = gEM.addEntity(tmpl).id;
gEM.commit(); gEM.commit();
assert(system.add == 1); assert(system.add == 1);
EntityTemplate* tmpl2 = gEM.allocateTemplate([CLong.component_id, CInt.component_id].staticArray); EntityTemplate* tmpl2 = gEM.allocateTemplate([ecsID!CLong, ecsID!CInt].staticArray);
scope (exit) gEM.freeTemplate(tmpl2); scope (exit) gEM.freeTemplate(tmpl2);
EntityID id1 = gEM.addEntity(tmpl2).id; EntityID id1 = gEM.addEntity(tmpl2).id;
gEM.commit(); gEM.commit();
assert(system.add == 2); assert(system.add == 2);
EntityTemplate* tmpl3 = gEM.allocateTemplate([CLong.component_id, CShort.component_id].staticArray); EntityTemplate* tmpl3 = gEM.allocateTemplate([ecsID!CLong, ecsID!CShort].staticArray);
scope (exit) gEM.freeTemplate(tmpl3); scope (exit) gEM.freeTemplate(tmpl3);
EntityID id2 = gEM.addEntity(tmpl3).id; EntityID id2 = gEM.addEntity(tmpl3).id;
gEM.commit(); gEM.commit();
@ -778,19 +778,19 @@ unittest
gEM.beginRegister(); gEM.beginRegister();
gEM.endRegister(); gEM.endRegister();
gEM.removeComponents(id0, [CFloat.component_id].staticArray); gEM.removeComponents(id0, [ecsID!CFloat].staticArray);
gEM.commit(); gEM.commit();
assert(system.add == 2); assert(system.add == 2);
assert(system.remove == 0); assert(system.remove == 0);
assert(system.change == 0); assert(system.change == 0);
gEM.removeComponents(id1, [CInt.component_id].staticArray); gEM.removeComponents(id1, [ecsID!CInt].staticArray);
gEM.commit(); gEM.commit();
assert(system.add == 2); assert(system.add == 2);
assert(system.remove == 0); assert(system.remove == 0);
assert(system.change == 1); assert(system.change == 1);
gEM.removeComponents(id2, [CShort.component_id].staticArray); gEM.removeComponents(id2, [ecsID!CShort].staticArray);
gEM.commit(); gEM.commit();
assert(system.add == 3); assert(system.add == 3);
assert(system.remove == 0); assert(system.remove == 0);
@ -889,7 +889,7 @@ unittest
} }
assert(gEM.getSystem!TestSystem is null); assert(gEM.getSystem!TestSystem is null);
assert(gEM.getSystem(TestSystem.system_id) is null); assert(gEM.getSystem(ecsID!TestSystem) is null);
} }
@("MultithreadedUpdate") @("MultithreadedUpdate")
@ -961,10 +961,10 @@ unittest
TestSystem* system = gEM.getSystem!TestSystem; TestSystem* system = gEM.getSystem!TestSystem;
TestEmptySystem* empty_system = gEM.getSystem!TestEmptySystem; TestEmptySystem* empty_system = gEM.getSystem!TestEmptySystem;
ushort[2] ids = [CLong.component_id,CFloat.component_id]; ushort[2] ids = [ecsID!CLong,ecsID!CFloat];
EntityTemplate* tmpl = gEM.allocateTemplate(ids); EntityTemplate* tmpl = gEM.allocateTemplate(ids);
scope (exit) gEM.freeTemplate(tmpl); scope (exit) gEM.freeTemplate(tmpl);
EntityTemplate* tmpl2 = gEM.allocateTemplate([CLong.component_id,CInt.component_id,CShort.component_id,CFloat.component_id].staticArray); EntityTemplate* tmpl2 = gEM.allocateTemplate([ecsID!CLong,ecsID!CInt,ecsID!CShort,ecsID!CFloat].staticArray);
scope (exit) gEM.freeTemplate(tmpl2); scope (exit) gEM.freeTemplate(tmpl2);
gEM.begin(); gEM.begin();
@ -1059,7 +1059,7 @@ unittest
@("AddRemoveEntities") @("AddRemoveEntities")
unittest unittest
{ {
ushort[3] ids = [CLong.component_id,CFloat.component_id,CShort.component_id]; ushort[3] ids = [ecsID!CLong,ecsID!CFloat,ecsID!CShort];
EntityTemplate* tmpl = gEM.allocateTemplate(ids); EntityTemplate* tmpl = gEM.allocateTemplate(ids);
scope (exit) gEM.freeTemplate(tmpl); scope (exit) gEM.freeTemplate(tmpl);
@ -1089,7 +1089,7 @@ unittest
gEM.endRegister(); gEM.endRegister();
ushort[1] ids = [CLong.component_id]; ushort[1] ids = [ecsID!CLong];
EntityTemplate* tmpl = gEM.allocateTemplate(ids); EntityTemplate* tmpl = gEM.allocateTemplate(ids);
scope (exit) gEM.freeTemplate(tmpl); scope (exit) gEM.freeTemplate(tmpl);
@ -1118,7 +1118,7 @@ unittest
assert(*entity.getComponent!CShort == 15); assert(*entity.getComponent!CShort == 15);
assert(*entity.getComponent!CFloat == 13); assert(*entity.getComponent!CFloat == 13);
ushort[3] ids2 = [CFloat.component_id, CLong.component_id, CUnregistered.component_id]; ushort[3] ids2 = [ecsID!CFloat, ecsID!CLong, ecsID!CUnregistered];
gEM.removeComponents(id, ids2); gEM.removeComponents(id, ids2);
gEM.commit(); gEM.commit();
@ -1161,12 +1161,12 @@ unittest
{ {
struct ETest struct ETest
{ {
mixin ECS.Event; // mixin ECS.Event;
} }
struct ETest2 struct ETest2
{ {
mixin ECS.Event; // mixin ECS.Event;
void onDestroy() void onDestroy()
{ {
@ -1253,10 +1253,10 @@ unittest
gEM.endRegister(); gEM.endRegister();
ushort[1] ids = [CLong.component_id]; ushort[1] ids = [ecsID!CLong];
EntityTemplate* tmpl = gEM.allocateTemplate(ids); EntityTemplate* tmpl = gEM.allocateTemplate(ids);
scope (exit) gEM.freeTemplate(tmpl); scope (exit) gEM.freeTemplate(tmpl);
ushort[1] ids2 = [CShort.component_id]; ushort[1] ids2 = [ecsID!CShort];
EntityTemplate* tmpl2 = gEM.allocateTemplate(ids2); EntityTemplate* tmpl2 = gEM.allocateTemplate(ids2);
scope (exit) gEM.freeTemplate(tmpl2); scope (exit) gEM.freeTemplate(tmpl2);
@ -1348,11 +1348,11 @@ unittest
gEM.endRegister(); gEM.endRegister();
EntityTemplate* tmpl = gEM.allocateTemplate([CInt.component_id].staticArray); EntityTemplate* tmpl = gEM.allocateTemplate([ecsID!CInt].staticArray);
scope (exit) gEM.freeTemplate(tmpl); scope (exit) gEM.freeTemplate(tmpl);
EntityID id1 = gEM.addEntity(tmpl).id; EntityID id1 = gEM.addEntity(tmpl).id;
EntityTemplate* tmpl2 = gEM.allocateTemplate([CInt.component_id, CLong.component_id].staticArray); EntityTemplate* tmpl2 = gEM.allocateTemplate([ecsID!CInt, ecsID!CLong].staticArray);
scope (exit) gEM.freeTemplate(tmpl2); scope (exit) gEM.freeTemplate(tmpl2);
EntityID id2 = gEM.addEntity(tmpl2).id; EntityID id2 = gEM.addEntity(tmpl2).id;
@ -1471,22 +1471,22 @@ unittest
const (EntityManager.UpdatePass)* pass = gEM.getPass("update"); const (EntityManager.UpdatePass)* pass = gEM.getPass("update");
assert(pass != null); assert(pass != null);
assert(pass.system_callers.length == 5); assert(pass.system_callers.length == 5);
assert(pass.system_callers[0].system_id == TestSystem.system_id); assert(pass.system_callers[0].system_id == ecsID!TestSystem);
assert(pass.system_callers[1].system_id == TestSystem2.system_id); assert(pass.system_callers[1].system_id == ecsID!TestSystem2);
assert(pass.system_callers[2].system_id == TestSystem3.system_id); assert(pass.system_callers[2].system_id == ecsID!TestSystem3);
assert(pass.system_callers[3].system_id == TestSystem4.system_id); assert(pass.system_callers[3].system_id == ecsID!TestSystem4);
assert(pass.system_callers[4].system_id == TestSystem5.system_id); assert(pass.system_callers[4].system_id == ecsID!TestSystem5);
assert(pass.system_callers[0].dependencies.length == 0); assert(pass.system_callers[0].dependencies.length == 0);
assert(pass.system_callers[1].dependencies.length == 1); assert(pass.system_callers[1].dependencies.length == 1);
assert(pass.system_callers[2].dependencies.length == 1); assert(pass.system_callers[2].dependencies.length == 1);
assert(pass.system_callers[3].dependencies.length == 3); assert(pass.system_callers[3].dependencies.length == 3);
assert(pass.system_callers[4].dependencies.length == 1); assert(pass.system_callers[4].dependencies.length == 1);
assert(pass.system_callers[1].dependencies[0].system_id == TestSystem.system_id); assert(pass.system_callers[1].dependencies[0].system_id == ecsID!TestSystem);
assert(pass.system_callers[2].dependencies[0].system_id == TestSystem2.system_id); assert(pass.system_callers[2].dependencies[0].system_id == ecsID!TestSystem2);
assert(pass.system_callers[3].dependencies[0].system_id == TestSystem.system_id); assert(pass.system_callers[3].dependencies[0].system_id == ecsID!TestSystem);
assert(pass.system_callers[3].dependencies[1].system_id == TestSystem2.system_id); assert(pass.system_callers[3].dependencies[1].system_id == ecsID!TestSystem2);
assert(pass.system_callers[3].dependencies[2].system_id == TestSystem3.system_id); assert(pass.system_callers[3].dependencies[2].system_id == ecsID!TestSystem3);
assert(pass.system_callers[4].dependencies[0].system_id == TestSystem4.system_id); assert(pass.system_callers[4].dependencies[0].system_id == ecsID!TestSystem4);
} }
@("ExternalSystemDependencies") @("ExternalSystemDependencies")
@ -1598,21 +1598,21 @@ unittest
const (EntityManager.UpdatePass)* pass = gEM.getPass("update"); const (EntityManager.UpdatePass)* pass = gEM.getPass("update");
assert(pass != null); assert(pass != null);
assert(pass.system_callers.length == 5); assert(pass.system_callers.length == 5);
assert(pass.system_callers[0].system_id == TestSystem.system_id); assert(pass.system_callers[0].system_id == ecsID!TestSystem);
assert(pass.system_callers[1].system_id == TestSystem2.system_id); assert(pass.system_callers[1].system_id == ecsID!TestSystem2);
assert(pass.system_callers[2].system_id == TestSystem3.system_id); assert(pass.system_callers[2].system_id == ecsID!TestSystem3);
assert(pass.system_callers[3].system_id == TestSystem4.system_id); assert(pass.system_callers[3].system_id == ecsID!TestSystem4);
assert(pass.system_callers[4].system_id == TestSystem5.system_id); assert(pass.system_callers[4].system_id == ecsID!TestSystem5);
assert(pass.system_callers[0].dependencies.length == 0); assert(pass.system_callers[0].dependencies.length == 0);
assert(pass.system_callers[1].dependencies.length == 1); assert(pass.system_callers[1].dependencies.length == 1);
assert(pass.system_callers[2].dependencies.length == 1); assert(pass.system_callers[2].dependencies.length == 1);
assert(pass.system_callers[3].dependencies.length == 3); assert(pass.system_callers[3].dependencies.length == 3);
assert(pass.system_callers[4].dependencies.length == 2); assert(pass.system_callers[4].dependencies.length == 2);
assert(pass.system_callers[1].dependencies[0].system_id == TestSystem.system_id); assert(pass.system_callers[1].dependencies[0].system_id == ecsID!TestSystem);
assert(pass.system_callers[2].dependencies[0].system_id == TestSystem2.system_id); assert(pass.system_callers[2].dependencies[0].system_id == ecsID!TestSystem2);
assert(pass.system_callers[3].dependencies[0].system_id == TestSystem.system_id); assert(pass.system_callers[3].dependencies[0].system_id == ecsID!TestSystem);
assert(pass.system_callers[3].dependencies[1].system_id == TestSystem2.system_id); assert(pass.system_callers[3].dependencies[1].system_id == ecsID!TestSystem2);
assert(pass.system_callers[3].dependencies[2].system_id == TestSystem3.system_id); assert(pass.system_callers[3].dependencies[2].system_id == ecsID!TestSystem3);
assert(pass.system_callers[4].dependencies[0].system_id == TestSystem2.system_id); assert(pass.system_callers[4].dependencies[0].system_id == ecsID!TestSystem2);
assert(pass.system_callers[4].dependencies[1].system_id == TestSystem4.system_id); assert(pass.system_callers[4].dependencies[1].system_id == ecsID!TestSystem4);
} }

View file

@ -21,14 +21,14 @@ unittest
{ {
struct Event1 struct Event1
{ {
mixin ECS.Event; // mixin ECS.Event;
EntityID id; EntityID id;
} }
struct Event2 struct Event2
{ {
mixin ECS.Event; // mixin ECS.Event;
} }
struct System1 struct System1
@ -45,7 +45,7 @@ unittest
void onCreate() void onCreate()
{ {
tmpl = gEM.allocateTemplate([CInt.component_id, CLong.component_id].staticArray); tmpl = gEM.allocateTemplate([ecsID!CInt, ecsID!CLong].staticArray);
} }
void onDestroy() void onDestroy()
@ -118,7 +118,7 @@ unittest
gEM.endRegister(); gEM.endRegister();
EntityTemplate* tmpl = gEM.allocateTemplate([CInt.component_id, CLong.component_id].staticArray); EntityTemplate* tmpl = gEM.allocateTemplate([ecsID!CInt, ecsID!CLong].staticArray);
EntityID id = gEM.addEntity(tmpl,[CLong(10).ref_, CInt(6).ref_].staticArray).id; EntityID id = gEM.addEntity(tmpl,[CLong(10).ref_, CInt(6).ref_].staticArray).id;
EntityID id2 = gEM.addEntity(tmpl,[CInt(4).ref_].staticArray).id; EntityID id2 = gEM.addEntity(tmpl,[CInt(4).ref_].staticArray).id;
gEM.freeTemplate(tmpl); gEM.freeTemplate(tmpl);
@ -126,13 +126,13 @@ unittest
gEM.sendEvent(id2, Event1(id)); gEM.sendEvent(id2, Event1(id));
gEM.getSystem(System2.system_id).disable(); gEM.getSystem(ecsID!System2).disable();
gEM.begin(); gEM.begin();
gEM.update(); gEM.update();
gEM.end(); gEM.end();
gEM.getSystem(System2.system_id).enable(); gEM.getSystem(ecsID!System2).enable();
gEM.begin(); gEM.begin();
gEM.update(); gEM.update();

View file

@ -86,22 +86,22 @@ void afterEveryTest()
void smallTmpl() void smallTmpl()
{ {
tmpl = gEM.allocateTemplate([CShort.component_id].staticArray); tmpl = gEM.allocateTemplate([ecsID!CShort].staticArray);
} }
void bigTmpl() void bigTmpl()
{ {
tmpl = gEM.allocateTemplate([CBig.component_id].staticArray); tmpl = gEM.allocateTemplate([ecsID!CBig].staticArray);
} }
void multiSmallTmpl() void multiSmallTmpl()
{ {
tmpl = gEM.allocateTemplate([CShort.component_id, CLong.component_id, CInt.component_id, CUInt.component_id].staticArray); tmpl = gEM.allocateTemplate([ecsID!CShort, ecsID!CLong, ecsID!CInt, ecsID!CUInt].staticArray);
} }
void multiBigTmpl() void multiBigTmpl()
{ {
tmpl = gEM.allocateTemplate([CLong.component_id, CInt.component_id, CUInt.component_id, CBig.component_id].staticArray); tmpl = gEM.allocateTemplate([ecsID!CLong, ecsID!CInt, ecsID!CUInt, ecsID!CBig].staticArray);
} }
@("AddEntities100k1comp2b") @(before, &smallTmpl) @("AddEntities100k1comp2b") @(before, &smallTmpl)
@ -138,25 +138,25 @@ void allocDealloc100k()
void smallTmplPreAlloc() void smallTmplPreAlloc()
{ {
tmpl = gEM.allocateTemplate([CShort.component_id].staticArray); tmpl = gEM.allocateTemplate([ecsID!CShort].staticArray);
allocDealloc100k(); allocDealloc100k();
} }
void bigTmplPreAlloc() void bigTmplPreAlloc()
{ {
tmpl = gEM.allocateTemplate([CBig.component_id].staticArray); tmpl = gEM.allocateTemplate([ecsID!CBig].staticArray);
allocDealloc100k(); allocDealloc100k();
} }
void multiSmallTmplPreAlloc() void multiSmallTmplPreAlloc()
{ {
tmpl = gEM.allocateTemplate([CShort.component_id, CLong.component_id, CInt.component_id, CUInt.component_id].staticArray); tmpl = gEM.allocateTemplate([ecsID!CShort, ecsID!CLong, ecsID!CInt, ecsID!CUInt].staticArray);
allocDealloc100k(); allocDealloc100k();
} }
void multiBigTmplPreAlloc() void multiBigTmplPreAlloc()
{ {
tmpl = gEM.allocateTemplate([CLong.component_id, CInt.component_id, CUInt.component_id, CBig.component_id].staticArray); tmpl = gEM.allocateTemplate([ecsID!CLong, ecsID!CInt, ecsID!CUInt, ecsID!CBig].staticArray);
allocDealloc100k(); allocDealloc100k();
} }