FIxed GDC compilation (basic betterC WIP) and some improvements

-fixed issue with adding/removing entities inside events handling
-fixed EntityMeta.getComponent() (added check if component_id is valid)
-added function hasComponent to entity to check if component exists
This commit is contained in:
Mergul 2020-05-14 22:18:57 +02:00
parent f731b4cedb
commit 9589a5cb2d
11 changed files with 174 additions and 94 deletions

View file

@ -46,6 +46,14 @@ struct Entity
return cast(T*)(cast(void*)block + info.deltas[T.component_id] + ind * T.sizeof);
}
bool hasComponent(ushort component_id)
{
EntityManager.EntitiesBlock* block = gEM.getMetaData(&this);
EntityManager.EntityInfo* info = block.type_info;
if (component_id >= info.deltas.length || info.deltas[component_id] == 0)return false;
return true;
}
EntityMeta getMeta()
{
EntityMeta meta;
@ -65,8 +73,18 @@ struct EntityMeta
T* getComponent(T)() const
{
const (EntityManager.EntityInfo)* info = block.type_info;
if (T.component_id >= info.deltas.length || info.deltas[T.component_id] == 0)
return null;
return cast(T*)(cast(void*)block + block.type_info.deltas[T.component_id] + index * T.sizeof);
}
bool hasComponent(ushort component_id)
{
EntityManager.EntityInfo* info = block.type_info;
if (component_id >= info.deltas.length || info.deltas[component_id] == 0)return false;
return true;
}
}
/************************************************************************************************************************

View file

@ -126,7 +126,7 @@ export struct EntityManager
//if(info.components)Mallocator.dispose(info.components);
Mallocator.dispose(info);
} //*/
}
foreach (UpdatePass* pass; passes)
{
@ -472,50 +472,52 @@ export struct EntityManager
if (member == "length" || member == "thread_id"
|| is(MemberType == Entity[]) || is(MemberType == const(Entity)[]))
{
continue;
//continue;
}
string name;
static if (isArray!MemberType)
{ // Workaround. This code is never called with: not an array type, but compiler prints an error
name = Unqual!(ForeachType!MemberType).stringof;
}
bool is_optional;
bool is_read_only;
if (is(CopyConstness!(ForeachType!(MemberType), int) == const(int)))
else
{
is_read_only = true;
}
foreach (att; __traits(getAttributes, __traits(getMember,
Sys.EntitiesData, member)))
{
if (att == "optional")
{
is_optional = true;
string name;
static if (isArray!MemberType)
{ // Workaround. This code is never called with: not an array type, but compiler prints an error
name = Unqual!(ForeachType!MemberType).stringof;
}
if (att == "readonly")
bool is_optional;
bool is_read_only;
if (is(CopyConstness!(ForeachType!(MemberType), int) == const(int)))
{
is_read_only = true;
}
}
if (is_read_only)
{
components_counts.readonly++;
}
else
{
components_counts.mutable++;
}
if (is_optional)
{
components_counts.optional++;
}
else
{
components_counts.req++;
foreach (att; __traits(getAttributes, __traits(getMember,
Sys.EntitiesData, member)))
{
if (att == "optional")
{
is_optional = true;
}
if (att == "readonly")
{
is_read_only = true;
}
}
if (is_read_only)
{
components_counts.readonly++;
}
else
{
components_counts.mutable++;
}
if (is_optional)
{
components_counts.optional++;
}
else
{
components_counts.req++;
}
}
}
@ -695,50 +697,52 @@ export struct EntityManager
{
if (is(MemberType == Entity[]) || is(MemberType == const(Entity)[]))
components_info.entites_array = member;
continue;
//continue;
}
string name;
static if (isArray!MemberType)
{ // Workaround. This code is never called with: not an array type, but compiler prints an error
name = Unqual!(ForeachType!MemberType).stringof;
}
bool is_optional;
bool is_read_only;
if (is(CopyConstness!(ForeachType!(MemberType), int) == const(int)))
else
{
is_read_only = true;
}
foreach (att; __traits(getAttributes, __traits(getMember,
Sys.EntitiesData, member)))
{
if (att == "optional")
{
is_optional = true;
string name;
static if (isArray!MemberType)
{ // Workaround. This code is never called with: not an array type, but compiler prints an error
name = Unqual!(ForeachType!MemberType).stringof;
}
if (att == "readonly")
bool is_optional;
bool is_read_only;
if (is(CopyConstness!(ForeachType!(MemberType), int) == const(int)))
{
is_read_only = true;
}
}
if (is_read_only)
{
components_info.addReadonly(CompInfo(member, name));
}
else
{
components_info.addMutable(CompInfo(member, name));
}
if (is_optional)
{
components_info.addOptional(CompInfo(member, name));
}
else
{
components_info.addReq(CompInfo(member, name));
foreach (att; __traits(getAttributes, __traits(getMember,
Sys.EntitiesData, member)))
{
if (att == "optional")
{
is_optional = true;
}
if (att == "readonly")
{
is_read_only = true;
}
}
if (is_read_only)
{
components_info.addReadonly(CompInfo(member, name));
}
else
{
components_info.addMutable(CompInfo(member, name));
}
if (is_optional)
{
components_info.addOptional(CompInfo(member, name));
}
else
{
components_info.addReq(CompInfo(member, name));
}
}
}
@ -874,7 +878,7 @@ export struct EntityManager
}
}
static void fillInputData(ref Sys.EntitiesData input_data, EntityInfo* info,
static void fillInputData()(ref Sys.EntitiesData input_data, EntityInfo* info,
EntitiesBlock* block, uint offset, uint entities_count, System* system)
{
//enum ComponentsIndices components_info = getComponentsInfo();
@ -2863,7 +2867,11 @@ export struct EntityManager
id_manager.optimize();
updateBlocks();
changeEntities();
updateEvents();
id_manager.optimize();
updateBlocks();
removeEntities();
event_manager.clearEvents();
}

View file

@ -113,6 +113,14 @@ else version(D_BetterC)
alloca_pos += length;
return ret;
}
version(GNU)
{
extern(C) void __gdc_personality_v0()
{
}
}
}
else
{

View file

@ -55,7 +55,8 @@ public:
/*foreach (ref el; array[0 .. used]) {
destroy(el);
}*/
freeData(cast(void[]) array);
//freeData(cast(void[]) array);
freeData((cast(void*)array.ptr)[0 .. array.length * T.sizeof]);
gVectorsDestroyed++;
}
array = null;
@ -78,7 +79,9 @@ public:
}
} else {
foreach (ref el; array[newLength .. used]) {
destroy(el);
//destroy(el);
static if(__traits(hasMember, T, "__xdtor"))el.__xdtor();
else static if(__traits(hasMember, T, "__dtor"))el.__dtor();
}
}
used = newLength;
@ -122,7 +125,8 @@ public:
T* memory = cast(T*) malloc(newSize);
memcpy(cast(void*) memory, cast(void*) oldArray.ptr, oldSize);
array = memory[0 .. newNumOfElements];
return cast(void[]) oldArray;
//return cast(void[]) oldArray;
return (cast(void*)oldArray.ptr)[0 .. oldArray.length * T.sizeof];
}
export Vector!T copy()() {
@ -169,7 +173,9 @@ public:
}
export void remove(size_t elemNum) {
destroy(array[elemNum]);
//destroy(array[elemNum]);
static if(__traits(hasMember, T, "__xdtor"))array[elemNum].__xdtor();
else static if(__traits(hasMember, T, "__dtor"))array[elemNum].__dtor();
//swap(array[elemNum], array[used - 1]);
array[elemNum] = array[used - 1];
used--;