-added filterEntity callback (used to filter EntityInfos for system, better control than simply @optional)

-removed some redundant code (two times same code)
-added some common functions
This commit is contained in:
Mergul 2021-01-03 13:05:48 +01:00
parent 13c82acad4
commit 3c1c67efd0
4 changed files with 155 additions and 25 deletions

View file

@ -139,6 +139,7 @@ void afterEveryTest()
unittest
{
EntityTemplate* tmpl_ = gEM.allocateTemplate([CInt.component_id, CFloat.component_id, CFlag.component_id].staticArray);
scope(exit)gEM.freeTemplate(tmpl_);
Entity* entity = gEM.addEntity(tmpl_);
EntityMeta meta = entity.getMeta();
assert(meta.hasComponent(CInt.component_id));
@ -1615,4 +1616,107 @@ unittest
assert(pass.system_callers[3].dependencies[2].system_id == TestSystem3.system_id);
assert(pass.system_callers[4].dependencies[0].system_id == TestSystem2.system_id);
assert(pass.system_callers[4].dependencies[1].system_id == TestSystem4.system_id);
}
}
@("CustomFilter")
unittest
{
struct TestSystem
{
mixin ECS.System;
struct EntitiesData
{
uint length;
@optional CInt[] int_;
@optional CLong[] long_;
@optional CFloat[] float_;
@optional CDouble[] double_;
}
bool filterEntity(EntityManager.EntityInfo* info)
{
if(!info.hasComponent(CInt.component_id))return false;
int one_from = 0;
if(info.hasComponent(CLong.component_id))one_from++;
if(info.hasComponent(CFloat.component_id))one_from++;
if(info.hasComponent(CDouble.component_id))one_from++;
if(one_from == 1)return true;
return false;
}
void onUpdate(EntitiesData entities)
{
updates++;
}
uint updates = 0;
}
struct TestSystem2
{
mixin ECS.System;
struct EntitiesData
{
uint length;
@optional CInt[] int_;
@optional CLong[] long_;
@optional CFloat[] float_;
@optional CDouble[] double_;
}
bool filterEntity(EntityManager.EntityInfo* info)
{
if(info.hasComponent(CInt.component_id) && info.hasComponent(CFloat.component_id) && !info.hasComponent(CLong.component_id) && !info.hasComponent(CDouble.component_id))return true;
if(info.hasComponent(CLong.component_id) && info.hasComponent(CDouble.component_id) && !info.hasComponent(CInt.component_id) && !info.hasComponent(CFloat.component_id))return true;
return false;
}
void onUpdate(EntitiesData entities)
{
updates++;
}
uint updates = 0;
}
gEM.beginRegister();
gEM.registerSystem!TestSystem(0);
gEM.registerSystem!TestSystem2(1);
gEM.endRegister();
EntityTemplate* tmpl_ = gEM.allocateTemplate([CInt.component_id, CLong.component_id, CFloat.component_id, CDouble.component_id].staticArray);
scope(exit)gEM.freeTemplate(tmpl_);
EntityTemplate* tmpl_2 = gEM.allocateTemplate([CInt.component_id, CFloat.component_id].staticArray);
scope(exit)gEM.freeTemplate(tmpl_2);
EntityTemplate* tmpl_3 = gEM.allocateTemplate([CLong.component_id, CDouble.component_id].staticArray);
scope(exit)gEM.freeTemplate(tmpl_3);
EntityTemplate* tmpl_4 = gEM.allocateTemplate([CInt.component_id, CLong.component_id, CDouble.component_id].staticArray);
scope(exit)gEM.freeTemplate(tmpl_4);
EntityTemplate* tmpl_5 = gEM.allocateTemplate([CInt.component_id, CDouble.component_id].staticArray);
scope(exit)gEM.freeTemplate(tmpl_5);
EntityTemplate* tmpl_6 = gEM.allocateTemplate([CDouble.component_id].staticArray);
scope(exit)gEM.freeTemplate(tmpl_6);
gEM.addEntity(tmpl_);
gEM.addEntity(tmpl_2);
gEM.addEntity(tmpl_3);
gEM.addEntity(tmpl_4);
gEM.addEntity(tmpl_5);
gEM.addEntity(tmpl_6);
TestSystem* test_system = gEM.getSystem!TestSystem;
TestSystem2* test_system2 = gEM.getSystem!TestSystem2;
gEM.begin();
gEM.update();
gEM.end();
assert(test_system.updates == 2);
assert(test_system2.updates == 2);
}