Added job_id parameter to EntitiesData (index of currently executing job)

This commit is contained in:
Mergul 2020-05-23 10:53:36 +02:00
parent bfc0da47e4
commit 233f4abd47

View file

@ -469,7 +469,7 @@ export struct EntityManager
foreach (member; __traits(allMembers, Sys.EntitiesData)) foreach (member; __traits(allMembers, Sys.EntitiesData))
{ {
alias MemberType = typeof(__traits(getMember, Sys.EntitiesData, member)); 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)[])) || is(MemberType == Entity[]) || is(MemberType == const(Entity)[]))
{ {
//continue; //continue;
@ -692,7 +692,7 @@ export struct EntityManager
foreach (member; __traits(allMembers, Sys.EntitiesData)) foreach (member; __traits(allMembers, Sys.EntitiesData))
{ {
alias MemberType = typeof(__traits(getMember, Sys.EntitiesData, member)); 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)[])) || is(MemberType == Entity[]) || is(MemberType == const(Entity)[]))
{ {
if (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, static assert(MemberType.sizeof > 1,
"EntitiesData 'thread_id' member can't be byte or ubyte."); "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))) else static if (!(isArray!(MemberType)))
static assert(0, "EntitiesData members should be arrays of elements!"); static assert(0, "EntitiesData members should be arrays of elements!");
} }
@ -1009,6 +1016,12 @@ export struct EntityManager
.thread_id; .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); //s.onUpdate(input_data);
(cast(typeof(&__traits(getOverloads, s, (cast(typeof(&__traits(getOverloads, s,
"onUpdate")[OnUpdateOverloadNum])) data.update_delegate)(input_data); "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; 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, (cast(typeof(&__traits(getOverloads, s,
"onUpdate")[OnUpdateOverloadNum])) data.update_delegate)(input_data); "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); memcpy(callers.ptr, &tmp_datas[0], CallData.sizeof * tmp_datas.length);
tmp_datas.clear(); tmp_datas.clear();
sys.jobs[job_id].callers = callers; sys.jobs[job_id].callers = callers;
sys.jobs[job_id].id = job_id;
job_id++; job_id++;
} }
@ -3415,6 +3435,8 @@ export struct EntityManager
ushort end; ushort end;
///current thread index ///current thread index
uint thread_id; uint thread_id;
//current job index
uint job_id;
} }
struct ListenerCallData struct ListenerCallData
@ -3428,6 +3450,7 @@ export struct EntityManager
struct Job struct Job
{ {
CallData[] callers; CallData[] callers;
uint id;
export void execute() nothrow @nogc export void execute() nothrow @nogc
{ {
@ -3435,6 +3458,7 @@ export struct EntityManager
foreach (ref caller; callers) foreach (ref caller; callers)
{ {
caller.thread_id = EntityManager.instance.threadID(); caller.thread_id = EntityManager.instance.threadID();
caller.job_id = id;
caller.update(); caller.update();
} }
} }