-system name getter
-added error checking for event handling in registerSystem -now only valid handleEvent() functions are taken by system during register
This commit is contained in:
parent
f27e4c30ad
commit
dfdb56d501
3 changed files with 43 additions and 17 deletions
|
|
@ -69,7 +69,7 @@ export class EntityManager
|
|||
if(system.m_components)Mallocator.instance.dispose(system.m_components);
|
||||
if(system.m_excluded_components)Mallocator.instance.dispose(system.m_excluded_components);
|
||||
if(system.m_optional_components)Mallocator.instance.dispose(system.m_optional_components);
|
||||
if(system.name)Mallocator.instance.dispose(system.name);
|
||||
if(system.m_name)Mallocator.instance.dispose(system.m_name);
|
||||
if(system.m_event_callers)Mallocator.instance.dispose(system.m_event_callers);
|
||||
|
||||
if(system.m_system_pointer)Mallocator.instance.dispose(system.m_system_pointer);
|
||||
|
|
@ -344,22 +344,33 @@ export class EntityManager
|
|||
data_system.handleEvent(input, *cast(Type*) data.event);
|
||||
}
|
||||
|
||||
static void setEventCallers(Sys)(ref System system)
|
||||
void setEventCallers(Sys)(ref System system)
|
||||
{
|
||||
enum event_handlers_num = __traits(getOverloads, Sys, "handleEvent").length;
|
||||
system.m_event_callers = Mallocator.instance.makeArray!(
|
||||
System.EventCaller)(event_handlers_num);
|
||||
System.EventCaller[] callers = (cast(System.EventCaller*)alloca(event_handlers_num * System.EventCaller.sizeof))[0..event_handlers_num];
|
||||
int i = 0;
|
||||
|
||||
foreach (j, func; __traits(getOverloads, Sys, "handleEvent"))
|
||||
{
|
||||
alias EventParamType = Parameters!(__traits(getOverloads,
|
||||
Sys, "handleEvent")[j])[1];
|
||||
system.m_event_callers[j].callback = cast(
|
||||
alias Params = Parameters!(__traits(getOverloads,
|
||||
Sys, "handleEvent")[j]);
|
||||
static if(Params.length == 2 && is(Params[0] == __traits(getMember, Sys, "EventInput")))
|
||||
{
|
||||
alias EventParamType = Params[1];
|
||||
enum EventName = Unqual!(EventParamType).stringof;
|
||||
ushort evt = events_map.get(cast(char[]) EventName, ushort.max);
|
||||
assert(evt != ushort.max, "Can't register system \""~Sys.stringof~"\" due to non existing event \""~EventName~"\".");
|
||||
|
||||
callers[i].callback = cast(
|
||||
void*)&callEventHandler!(EventParamType);
|
||||
system.m_event_callers[j].id = EventParamType.event_id;
|
||||
callers[i].id = EventParamType.event_id;
|
||||
i++;
|
||||
}
|
||||
}
|
||||
|
||||
system.m_event_callers = Mallocator.instance.makeArray(callers[0..i]);
|
||||
}
|
||||
|
||||
static if (__traits(hasMember, Sys, "handleEvent"))
|
||||
{
|
||||
setEventCallers!(Sys)(system);
|
||||
|
|
@ -736,8 +747,8 @@ export class EntityManager
|
|||
}
|
||||
else
|
||||
{
|
||||
system.name = Mallocator.instance.makeArray(Sys.stringof);
|
||||
systems_map.add(system.name, cast(ushort) systems.length);
|
||||
system.m_name = Mallocator.instance.makeArray(Sys.stringof);
|
||||
systems_map.add(system.m_name, cast(ushort) systems.length);
|
||||
|
||||
system.m_id = cast(ushort)(systems.length);
|
||||
|
||||
|
|
@ -2302,9 +2313,9 @@ export class EntityManager
|
|||
caller.exclusion = null;
|
||||
|
||||
/*import std.stdio;
|
||||
write("Exclusive systems for system ", caller.system.name, ": ");
|
||||
write("Exclusive systems for system ", caller.system.m_name, ": ");
|
||||
foreach (ex; exclusion[0 .. index])
|
||||
write(ex.system.name, " ");
|
||||
write(ex.system.m_name, " ");
|
||||
writeln();*/
|
||||
}
|
||||
|
||||
|
|
@ -2362,9 +2373,9 @@ export class EntityManager
|
|||
caller.dependencies = null;
|
||||
|
||||
/*import std.stdio;
|
||||
write("Dependencies for system ", caller.system.name, ": ");
|
||||
write("Dependencies for system ", caller.system.m_name, ": ");
|
||||
foreach (ex; caller.dependencies)
|
||||
write(ex.system.name, " ");
|
||||
write(ex.system.m_name, " ");
|
||||
writeln();*/
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -74,6 +74,14 @@ struct System
|
|||
return m_id;
|
||||
}
|
||||
|
||||
/************************************************************************************************************************
|
||||
*Get system name.
|
||||
*/
|
||||
export const (char)[] name() nothrow @nogc
|
||||
{
|
||||
return cast(const (char)[])m_name;
|
||||
}
|
||||
|
||||
struct EventCaller
|
||||
{
|
||||
ushort id;
|
||||
|
|
@ -97,7 +105,7 @@ package:
|
|||
int m_pass;
|
||||
|
||||
///system name
|
||||
char[] name;
|
||||
char[] m_name;
|
||||
|
||||
///required components
|
||||
ushort[] m_components;
|
||||
|
|
|
|||
|
|
@ -376,6 +376,11 @@ struct TestSystem2
|
|||
//TestComp* tt;
|
||||
}
|
||||
|
||||
void handleEvent(EventInput input)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
void handleEvent(EventInput input, ref TestEvent event)
|
||||
{
|
||||
input.test.bg = event.a;
|
||||
|
|
@ -571,9 +576,11 @@ int main()
|
|||
//foreach(j; 0..1_000)gEM.addEntity(tmpl);
|
||||
|
||||
gEM.beginRegister();
|
||||
//gEM.registerSystem!TestSystem2(0);
|
||||
gEM.registerSystem!TestSystem2(0);
|
||||
gEM.endRegister();
|
||||
|
||||
System* sys = EntityManager.instance.getSystem(TestSystem2.system_id);
|
||||
|
||||
//gEM.generateDependencies();
|
||||
|
||||
//assert(*(cast(EntityID*)(cast(void*)tmpl.info.first_block+24)) == EntityID(1,1));
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue