-added first mmcommando commit

This commit is contained in:
Mergul 2019-04-06 14:24:31 +00:00
parent 77f67004dd
commit 7e7658af3b
2 changed files with 70 additions and 7 deletions

View file

@ -21,6 +21,7 @@ import ecs.id_manager;
import ecs.system;
import ecs.vector;
import ecs.events;
import ecs.traits;
alias gEM = EntityManager.instance;
alias gEntityManager = EntityManager.instance;
@ -248,7 +249,7 @@ class EntityManager
//dfmt off
static if(hasMember!(Sys,"EventInput"))
{
static string genEventCompList()()
/*static string genEventCompList()()
{
string ret = "Sys.EventInput input;\n";
string type;
@ -282,11 +283,45 @@ class EntityManager
~ ").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)
{
alias EventFieldType = Unqual!(typeof(*eventField));
enum bool isEntity = is( EventFieldType == ecs.entity.Entity );
static if(isEntity)
{
eventField=cast(Entity*) data.block.dataBegin() + data.id;
continue;
}
else
{
enum long indexInEntitiesData=getIndexOfTypeInEntitiesData!(Sys.EntitiesData, EventFieldType);
static assert(indexInEntitiesData != -1);// Type present in EventInput has to be present in EntitiesData
enum bool isOptional = hasUDA!(Sys.EntitiesData.tupleof[indexInEntitiesData], "optional");
static if(isOptional)
{
eventField=null;
}
else
{
eventField = cast(EventFieldType*)(cast(void*) data.block
+ info.deltas[EventFieldType.component_id]
+ data.id * EventFieldType.sizeof);
}
}
}
}
static string checkHandler()(string member)
{
string ret;
@ -325,7 +360,9 @@ class EntityManager
ret ~= "static void callHandler"~event_handlers.to!string~"(ref EventCallData data)\n{\n";
ret ~= "Sys* s = cast(Sys*) data.system_pointer;
EntityInfo* info = data.block.type_info;";
ret ~= genEventCompList();
//ret ~= genEventCompList();
ret ~= "Sys.EventInput input;\n";
ret ~= "genEventCompList!(Sys)(data, info, input);";
ret ~= "s.handleEvent(input, *cast("~event_param~"*)data.event);";
ret ~= "}\n";
ret ~= "system.m_event_callers["~event_handlers.to!string~"].callback = cast(void*)&callHandler"~event_handlers.to!string~";";
@ -1171,7 +1208,7 @@ class EntityManager
info.size = EntityID.sizeof;
info.alignment = EntityID.alignof;
info.tmpl_deltas = Mallocator.instance.makeArray!ushort(ids[$ - 1] + 1,ushort.max);
info.tmpl_deltas = Mallocator.instance.makeArray!ushort(ids[$ - 1] + 1, ushort.max);
uint components_size = EntityID.sizeof;
foreach (i, id; ids)

View file

@ -2,12 +2,38 @@ module ecs.traits;
import std.traits;
bool isForeachDelegateWithTypes(DG, Types...)() {
bool isForeachDelegateWithTypes(DG, Types...)()
{
return is(DG == delegate) && is(ReturnType!DG == int) && is(Parameters!DG == Types);
}
unittest {
unittest
{
assert(isForeachDelegateWithTypes!(int delegate(int, int), int, int));
assert(isForeachDelegateWithTypes!(int delegate(ref int, ref int), int, int));
assert(!isForeachDelegateWithTypes!(int delegate(double), int, int));
}
/************************************************************************************************************************
* Returns index of Component/Entity array in System's EntitiesData struct
*/
static long getIndexOfTypeInEntitiesData(EntitiesData, Type)()
{
alias EntitiesDataFields = Fields!(EntitiesData);
long index = -1;
foreach (fieldNum, FieldType; Fields!(EntitiesData))
{
static if (!isBasicType!(FieldType)) // Not basic type
{
// FieldType should be something like: 'const(SomeComponent)[]'
enum bool entitiesMatches = is(Type == Unqual!(ForeachType!(FieldType)));
static if (entitiesMatches)
{
index = fieldNum;
break;
}
}
}
return index;
}