Add support for external depencencies
This commit is contained in:
parent
b19fbb1528
commit
5e884352ba
5 changed files with 440 additions and 5 deletions
275
tests/basic.d
275
tests/basic.d
|
|
@ -1220,4 +1220,279 @@ unittest
|
|||
assert(*entity2.getComponent!CInt == 13);
|
||||
|
||||
gEM.end();
|
||||
}
|
||||
|
||||
@("SystemDependencies")
|
||||
unittest
|
||||
{
|
||||
struct TestSystem
|
||||
{
|
||||
mixin ECS.System;
|
||||
|
||||
struct EntitiesData
|
||||
{
|
||||
uint length;
|
||||
@readonly CInt[] int_;
|
||||
}
|
||||
|
||||
void onUpdate(EntitiesData entities)
|
||||
{
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
struct TestSystem2
|
||||
{
|
||||
mixin ECS.System;
|
||||
|
||||
struct EntitiesData
|
||||
{
|
||||
uint length;
|
||||
CInt[] int_;
|
||||
}
|
||||
|
||||
void onUpdate(EntitiesData entities)
|
||||
{
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
struct TestSystem3
|
||||
{
|
||||
mixin ECS.System;
|
||||
|
||||
struct EntitiesData
|
||||
{
|
||||
uint length;
|
||||
@readonly CInt[] int_;
|
||||
}
|
||||
|
||||
void onUpdate(EntitiesData entities)
|
||||
{
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
struct TestSystem4
|
||||
{
|
||||
mixin ECS.System;
|
||||
|
||||
struct EntitiesData
|
||||
{
|
||||
uint length;
|
||||
CInt[] int_;
|
||||
CLong[] long_;
|
||||
}
|
||||
|
||||
void onUpdate(EntitiesData entities)
|
||||
{
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
struct TestSystem5
|
||||
{
|
||||
mixin ECS.System;
|
||||
|
||||
struct EntitiesData
|
||||
{
|
||||
uint length;
|
||||
@readonly CLong[] int_;
|
||||
}
|
||||
|
||||
void onUpdate(EntitiesData entities)
|
||||
{
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
void func1(TestSystem.EntitiesData entities)
|
||||
{
|
||||
foreach(i;0 .. entities.length)
|
||||
{
|
||||
entities.int_[i] += entities.int_[i] / 2;
|
||||
}
|
||||
}
|
||||
|
||||
void func2(TestSystem.EntitiesData entities)
|
||||
{
|
||||
foreach(i;0 .. entities.length)
|
||||
{
|
||||
entities.int_[i] += 8;
|
||||
}
|
||||
}
|
||||
|
||||
gEM.beginRegister();
|
||||
|
||||
gEM.registerSystem!TestSystem(0);
|
||||
gEM.registerSystem!TestSystem2(1);
|
||||
gEM.registerSystem!TestSystem3(2);
|
||||
gEM.registerSystem!TestSystem4(3);
|
||||
gEM.registerSystem!TestSystem5(4);
|
||||
|
||||
gEM.endRegister();
|
||||
|
||||
const (EntityManager.UpdatePass)* pass = gEM.getPass("update");
|
||||
assert(pass != null);
|
||||
assert(pass.system_callers.length == 5);
|
||||
assert(pass.system_callers[0].system_id == TestSystem.system_id);
|
||||
assert(pass.system_callers[1].system_id == TestSystem2.system_id);
|
||||
assert(pass.system_callers[2].system_id == TestSystem3.system_id);
|
||||
assert(pass.system_callers[3].system_id == TestSystem4.system_id);
|
||||
assert(pass.system_callers[4].system_id == TestSystem5.system_id);
|
||||
assert(pass.system_callers[0].dependencies.length == 0);
|
||||
assert(pass.system_callers[1].dependencies.length == 1);
|
||||
assert(pass.system_callers[2].dependencies.length == 1);
|
||||
assert(pass.system_callers[3].dependencies.length == 3);
|
||||
assert(pass.system_callers[4].dependencies.length == 1);
|
||||
assert(pass.system_callers[1].dependencies[0].system_id == TestSystem.system_id);
|
||||
assert(pass.system_callers[2].dependencies[0].system_id == TestSystem2.system_id);
|
||||
assert(pass.system_callers[3].dependencies[0].system_id == TestSystem.system_id);
|
||||
assert(pass.system_callers[3].dependencies[1].system_id == TestSystem2.system_id);
|
||||
assert(pass.system_callers[3].dependencies[2].system_id == TestSystem3.system_id);
|
||||
assert(pass.system_callers[4].dependencies[0].system_id == TestSystem4.system_id);
|
||||
}
|
||||
|
||||
@("ExternalSystemDependencies")
|
||||
unittest
|
||||
{
|
||||
enum TestDependency = "TestDepencency";
|
||||
|
||||
struct TestSystem
|
||||
{
|
||||
mixin ECS.System;
|
||||
|
||||
mixin ECS.ReadOnlyDependencies!(TestDependency);
|
||||
|
||||
struct EntitiesData
|
||||
{
|
||||
uint length;
|
||||
@readonly CInt[] int_;
|
||||
}
|
||||
|
||||
void onUpdate(EntitiesData entities)
|
||||
{
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
struct TestSystem2
|
||||
{
|
||||
mixin ECS.System;
|
||||
|
||||
mixin ECS.WritableDependencies!(TestDependency);
|
||||
|
||||
struct EntitiesData
|
||||
{
|
||||
uint length;
|
||||
@readonly CInt[] int_;
|
||||
}
|
||||
|
||||
void onUpdate(EntitiesData entities)
|
||||
{
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
struct TestSystem3
|
||||
{
|
||||
mixin ECS.System;
|
||||
|
||||
mixin ECS.ReadOnlyDependencies!(TestDependency);
|
||||
|
||||
struct EntitiesData
|
||||
{
|
||||
uint thread_id;
|
||||
}
|
||||
|
||||
void onUpdate(EntitiesData entities)
|
||||
{
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
struct TestSystem4
|
||||
{
|
||||
mixin ECS.System;
|
||||
|
||||
mixin ECS.WritableDependencies!(TestDependency);
|
||||
|
||||
struct EntitiesData
|
||||
{
|
||||
uint length;
|
||||
@readonly CInt[] int_;
|
||||
}
|
||||
|
||||
void onUpdate(EntitiesData entities)
|
||||
{
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
struct TestSystem5
|
||||
{
|
||||
mixin ECS.System;
|
||||
|
||||
mixin ECS.ReadOnlyDependencies!(TestDependency);
|
||||
|
||||
struct EntitiesData
|
||||
{
|
||||
uint length;
|
||||
@readonly CLong[] int_;
|
||||
}
|
||||
|
||||
void onUpdate(EntitiesData entities)
|
||||
{
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
void func1(TestSystem.EntitiesData entities)
|
||||
{
|
||||
foreach(i;0 .. entities.length)
|
||||
{
|
||||
entities.int_[i] += entities.int_[i] / 2;
|
||||
}
|
||||
}
|
||||
|
||||
void func2(TestSystem.EntitiesData entities)
|
||||
{
|
||||
foreach(i;0 .. entities.length)
|
||||
{
|
||||
entities.int_[i] += 8;
|
||||
}
|
||||
}
|
||||
|
||||
gEM.beginRegister();
|
||||
|
||||
gEM.registerDependency(TestDependency);
|
||||
|
||||
gEM.registerSystem!TestSystem(0);
|
||||
gEM.registerSystem!TestSystem2(1);
|
||||
gEM.registerSystem!TestSystem3(2);
|
||||
gEM.registerSystem!TestSystem4(3);
|
||||
gEM.registerSystem!TestSystem5(4);
|
||||
|
||||
gEM.endRegister();
|
||||
|
||||
const (EntityManager.UpdatePass)* pass = gEM.getPass("update");
|
||||
assert(pass != null);
|
||||
assert(pass.system_callers.length == 5);
|
||||
assert(pass.system_callers[0].system_id == TestSystem.system_id);
|
||||
assert(pass.system_callers[1].system_id == TestSystem2.system_id);
|
||||
assert(pass.system_callers[2].system_id == TestSystem3.system_id);
|
||||
assert(pass.system_callers[3].system_id == TestSystem4.system_id);
|
||||
assert(pass.system_callers[4].system_id == TestSystem5.system_id);
|
||||
assert(pass.system_callers[0].dependencies.length == 0);
|
||||
assert(pass.system_callers[1].dependencies.length == 1);
|
||||
assert(pass.system_callers[2].dependencies.length == 1);
|
||||
assert(pass.system_callers[3].dependencies.length == 3);
|
||||
assert(pass.system_callers[4].dependencies.length == 2);
|
||||
assert(pass.system_callers[1].dependencies[0].system_id == TestSystem.system_id);
|
||||
assert(pass.system_callers[2].dependencies[0].system_id == TestSystem2.system_id);
|
||||
assert(pass.system_callers[3].dependencies[0].system_id == TestSystem.system_id);
|
||||
assert(pass.system_callers[3].dependencies[1].system_id == TestSystem2.system_id);
|
||||
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);
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue