From 233f4abd47a89dccc4f86289dfedebf117f045aa Mon Sep 17 00:00:00 2001 From: Mergul Date: Sat, 23 May 2020 10:53:36 +0200 Subject: [PATCH] Added job_id parameter to EntitiesData (index of currently executing job) --- source/bubel/ecs/manager.d | 28 ++++++++++++++++++++++++++-- 1 file changed, 26 insertions(+), 2 deletions(-) diff --git a/source/bubel/ecs/manager.d b/source/bubel/ecs/manager.d index dc3b9f5..d5892bb 100644 --- a/source/bubel/ecs/manager.d +++ b/source/bubel/ecs/manager.d @@ -469,7 +469,7 @@ export struct EntityManager foreach (member; __traits(allMembers, Sys.EntitiesData)) { alias MemberType = typeof(__traits(getMember, Sys.EntitiesData, member)); - if (member == "length" || member == "thread_id" + if (member == "length" || member == "thread_id" || member == "job_id" || is(MemberType == Entity[]) || is(MemberType == const(Entity)[])) { //continue; @@ -692,7 +692,7 @@ export struct EntityManager foreach (member; __traits(allMembers, Sys.EntitiesData)) { alias MemberType = typeof(__traits(getMember, Sys.EntitiesData, member)); - if (member == "length" || member == "thread_id" + if (member == "length" || member == "thread_id" || member == "job_id" || is(MemberType == Entity[]) || is(MemberType == const(Entity)[])) { if (is(MemberType == Entity[]) || is(MemberType == const(Entity)[])) @@ -809,6 +809,13 @@ export struct EntityManager static assert(MemberType.sizeof > 1, "EntitiesData 'thread_id' member can't be byte or ubyte."); } + else static if (member == "job_id") + { + static assert(isIntegral!(MemberType), + "EntitiesData 'job_id' member must be integral type."); + static assert(MemberType.sizeof > 1, + "EntitiesData 'job_id' member can't be byte or ubyte."); + } else static if (!(isArray!(MemberType))) static assert(0, "EntitiesData members should be arrays of elements!"); } @@ -1009,6 +1016,12 @@ export struct EntityManager .thread_id; } + static if (hasMember!(Sys.EntitiesData, "job_id")) + { + input_data.job_id = cast(typeof(input_data.job_id)) data + .job_id; + } + //s.onUpdate(input_data); (cast(typeof(&__traits(getOverloads, s, "onUpdate")[OnUpdateOverloadNum])) data.update_delegate)(input_data); @@ -1037,6 +1050,12 @@ export struct EntityManager input_data.thread_id = cast(typeof(input_data.thread_id)) data.thread_id; } + static if (hasMember!(Sys.EntitiesData, "job_id")) + { + input_data.job_id = cast(typeof(input_data.job_id)) data + .job_id; + } + (cast(typeof(&__traits(getOverloads, s, "onUpdate")[OnUpdateOverloadNum])) data.update_delegate)(input_data); } @@ -1406,6 +1425,7 @@ export struct EntityManager memcpy(callers.ptr, &tmp_datas[0], CallData.sizeof * tmp_datas.length); tmp_datas.clear(); sys.jobs[job_id].callers = callers; + sys.jobs[job_id].id = job_id; job_id++; } @@ -3415,6 +3435,8 @@ export struct EntityManager ushort end; ///current thread index uint thread_id; + //current job index + uint job_id; } struct ListenerCallData @@ -3428,6 +3450,7 @@ export struct EntityManager struct Job { CallData[] callers; + uint id; export void execute() nothrow @nogc { @@ -3435,6 +3458,7 @@ export struct EntityManager foreach (ref caller; callers) { caller.thread_id = EntityManager.instance.threadID(); + caller.job_id = id; caller.update(); } }