From be5de2ae9cd8e39ae8cbdf00de064bb087aaaa9a Mon Sep 17 00:00:00 2001 From: Mergul Date: Sat, 6 Apr 2019 14:47:33 +0000 Subject: [PATCH] -added second mmcommando commit -removed some stupid feature --- source/ecs/manager.d | 99 ++++++++++++++------------------------------ 1 file changed, 31 insertions(+), 68 deletions(-) diff --git a/source/ecs/manager.d b/source/ecs/manager.d index 92f4aaf..36acd5e 100644 --- a/source/ecs/manager.d +++ b/source/ecs/manager.d @@ -249,47 +249,13 @@ class EntityManager //dfmt off static if(hasMember!(Sys,"EventInput")) { - /*static string genEventCompList()() - { - string ret = "Sys.EventInput input;\n"; - string type; - //bool has = true; - foreach (member; __traits(allMembers, Sys.EventInput)) - { - if(mixin("fullyQualifiedName!(ConstOf!(PointerTarget!(typeof(Sys.EventInput."~member~")))) == \"const(ecs.entity.Entity)\"")) - { - ret ~= "input." ~ member ~ " = cast(Entity*) data.block.dataBegin() + data.id;\n"; - continue; - } + /* static void genEventCompList(Sys)(ref EventCallData data, EntityInfo* info, ref Sys.EventInput input) + {*/ + static void callEventHandler(Type)(ref EventCallData data){ + Sys.EventInput input; + Sys* dataSystem = cast(Sys*) data.system_pointer; + EntityInfo* info = data.block.type_info; - bool has = false; - bool optional = false; - foreach(member2; __traits(allMembers, Sys.EntitiesData)) - { - static if(mixin("isBasicType!(typeof(Sys.EntitiesData."~member2~"))")){} - else static if(mixin("fullyQualifiedName!(ConstOf!(PointerTarget!(typeof(Sys.EventInput."~member~")))) == fullyQualifiedName!(ConstOf!(ForeachType!(typeof(Sys.EntitiesData."~member2~"))))")) - { - has = true; - if(mixin("hasUDA!(Sys.EntitiesData."~member2~",\"optional\")"))optional = true; - break; - } - } - if(!has)assert(0); - - if(optional)ret ~= "input." ~ member ~ " = null;\n"; - else ret ~= "input." ~ member ~ " = cast(typeof(Sys.EventInput." ~ member - ~ "))(cast(void*) data.block + info.deltas[typeof(Sys.EventInput." - ~ member ~ ").component_id] + data.id * typeof(Sys.EventInput." ~ member - ~ ").sizeof);\n"; - } - return ret; - }*/ - - //pragma(msg,genEventCompList()); - //pragma(msg,genEventCompList()); - - static void genEventCompList(Sys)(ref EventCallData data, EntityInfo* info, ref Sys.EventInput input) - { alias EventFields=Fields!(Sys.EventInput); foreach (eventFieldNum, ref eventField; input.tupleof) { @@ -320,16 +286,34 @@ class EntityManager } } + dataSystem.handleEvent(input, *cast(Type*)data.event); } - static string checkHandler()(string member) + static void setEventCallers(Sys)(System system){ + enum allEventHandlers=__traits(getOverloads, Sys, "handleEvent").length; + system.m_event_callers = Mallocator.instance.makeArray!(System.EventCaller)(allEventHandlers); + + foreach(j, func; __traits(getOverloads, Sys, "handleEvent")) + { + alias EventParamType=Parameters!( __traits(getOverloads, Sys, "handleEvent")[j] )[1]; + system.m_event_callers[j].callback = cast(void*)&callEventHandler!(EventParamType); + system.m_event_callers[j].id = EventParamType.event_id; + } + } + + static if(__traits(hasMember, Sys, "handleEvent")) + { + setEventCallers!(Sys)(system); + } + + /*static string checkHandler()(string member) { string ret; ret ~= "(Parameters!(Sys."~member~")).length == 2 && "; ret ~= "((is(Parameters!(Sys."~member~")[0] == Sys.EventInput) && hasStaticMember!(Parameters!(Sys."~member~")[1],\"event_id\")) ||"; ret ~= " (is(Parameters!(Sys."~member~")[1] == Sys.EventInput) && hasStaticMember!(Parameters!(Sys."~member~")[0],\"event_id\")))"; return ret; - } + }*/ /*static struct Handler { @@ -337,7 +321,7 @@ class EntityManager void* callback; }*/ - static string catchEventHanlders()() + /*static string catchEventHanlders()() { int event_handlers = 0; string ret; @@ -369,36 +353,15 @@ class EntityManager ret ~= "system.m_event_callers["~event_handlers.to!string~"].id = "~event_param~".event_id;"; event_handlers++; } - - /*ret ~= "ushort max_id = 0;"; - ret ~= "foreach(handler;handlers) - { - if(handler.id > max_id)max_id = handler.id; - }"; - ret ~= "system.m_event_callback = Mallocator.instance.makeArray!(System.EventHandler)(max_id);"; - ret ~= "foreach(handler;handlers) - { - system.m_event_callback[handler.id] = handler.callback; - }";*/ } - - /*static if(__traits(hasMember, Sys, "handleEvent"))//foreach(member; __traits(allMembers,Sys)) - { - - //static foreach() - static if (member == "handleEvent" && mixin("isFunction!(Sys."~member~")")) - { - static if(mixin(checkHandler(member))) - { - event_handlers++; - } - } - }*/ + return ret; } //pragma(msg,catchEventHanlders()); - mixin(catchEventHanlders()); + mixin(catchEventHanlders());*/ + + } //dfmt on