-EntityTemplate.getComponent additional data check

-LinearLayout proggress:
 *added alignment to data
 *fixed add/remove component functions
This commit is contained in:
Mergul 2018-09-26 12:50:51 +02:00
parent c18ac54265
commit c915b1a8c7
3 changed files with 63 additions and 38 deletions

View file

@ -83,7 +83,7 @@ class EntityManager
i++;
if (isPointer!param)
{
ret ~= "if(opt_ptr" ~ opt.to!string ~ " !is null)opt_ptr"
ret ~= "if(opt_array" ~ opt.to!string ~ " !is null)opt_ptr"
~ opt.to!string ~ " = &opt_array" ~ opt.to!string ~ "[i];";
opt++;
}
@ -151,6 +151,10 @@ class EntityManager
{
ret ~= "PointerTarget!(types[" ~ i.to!string
~ "])[] opt_array" ~ opt.to!string ~ ";";
ret ~= "if(info.deltas[types[" ~ i.to!string ~ "].component_id] != ushort.max)opt_array"
~ opt.to!string ~ "
= (cast(types[" ~ i.to!string ~ "])(cast(void*)block + info.deltas[types["
~ i.to!string ~ "].component_id]))[0..block.entities_count];";
ret ~= "types[" ~ i.to!string ~ "] opt_ptr" ~ opt.to!string ~ ";";
opt++;
}
@ -452,6 +456,11 @@ class EntityManager
num = cast(ushort)((num + alignment - 1) & (-cast(int) alignment)); //num += alignment - (num & (alignment - 1));
}
static ushort alignedNum(ushort num, ushort alignment)
{
return cast(ushort)((num + alignment - 1) & (-cast(int) alignment));
}
extern (C) static int compareUShorts(const void* a, const void* b)
{
ushort _a = *cast(ushort*) a;
@ -523,52 +532,60 @@ class EntityManager
info.components = Mallocator.instance.makeArray(ids);
info.deltas = Mallocator.instance.makeArray!ushort(ids[$ - 1] + 1);
version (LinearLayout)
{
info.tmpl_deltas = Mallocator.instance.makeArray!ushort(ids[$ - 1] + 1);
uint block_memory = page_size - EntitiesBlock.sizeof;
uint entity_comps_size = EntityID.sizeof;
uint mem_begin = EntitiesBlock.sizeof;
foreach (id; ids)
{
entity_comps_size += components[id].size;
}
uint entites_in_block = block_memory / entity_comps_size;
info.max_entities = cast(ushort) entites_in_block;
uint current_delta = cast(uint)(mem_begin + entites_in_block * EntityID.sizeof);
}
info.size = EntityID.sizeof;
info.alignment = EntityID.alignof;
foreach (i, id; ids)
version (LinearLayout)
{
info.alignment = max(info.alignment, components[id].alignment);
alignNum(info.size, components[id].alignment);
info.tmpl_deltas = Mallocator.instance.makeArray!ushort(ids[$ - 1] + 1);
uint components_size = EntityID.sizeof;
version (LinearLayout)
foreach (i, id; ids)
{
info.alignment = max(info.alignment, components[id].alignment);
alignNum(info.size, components[id].alignment);
info.tmpl_deltas[id] = info.size;
info.size += components[id].size;
components_size += components[id].size;
}
alignNum(info.size, info.alignment);
/**/
uint block_memory = cast(uint)(
page_size - EntitiesBlock.sizeof - (info.size - components_size));
//uint entity_comps_size = EntityID.sizeof;
uint mem_begin = EntitiesBlock.sizeof;
/*foreach (id; ids)
{
entity_comps_size += components[id].size;
}*/
uint entites_in_block = block_memory / info.size; //entity_comps_size;
info.max_entities = cast(ushort) entites_in_block;
ushort current_delta = cast(ushort)(mem_begin + entites_in_block * EntityID.sizeof);
foreach (i, id; ids)
{
alignNum(current_delta, components[id].alignment);
info.deltas[id] = cast(ushort) current_delta;
current_delta += entites_in_block * components[id].size;
}
else
{
info.deltas[id] = info.size;
}
info.size += components[id].size;
}
alignNum(info.size, info.alignment);
version (LinearLayout)
{
}
else
{
foreach (i, id; ids)
{
info.alignment = max(info.alignment, components[id].alignment);
alignNum(info.size, components[id].alignment);
info.deltas[id] = info.size;
info.size += components[id].size;
}
alignNum(info.size, info.alignment);
info.max_entities = (page_size - EntitiesBlock.sizeof) / info.size;
}
foreach (uint i, ref system; systems)
{
@ -707,7 +724,10 @@ class EntityManager
EntitiesBlock* new_block = findBlockWithFreeSpace(new_info);
void* start = new_block.dataBegin() + new_block.entities_count * new_info.size;
version (LinearLayout)
void* start = new_block.dataBegin() + new_block.entities_count * EntityID.sizeof;
else
void* start = new_block.dataBegin() + new_block.entities_count * new_info.size;
Entity* new_entity = cast(Entity*) start;
new_entity.id = entity.id;
@ -715,6 +735,7 @@ class EntityManager
version (LinearLayout)
{
static if (EntityID.sizeof == 8)
uint ind = cast(uint)((cast(void*) entity - block.dataBegin()) >> 3);
else
@ -831,14 +852,17 @@ class EntityManager
EntitiesBlock* new_block = findBlockWithFreeSpace(new_info);
void* start = new_block.dataBegin() + new_block.entities_count * new_info.size;
//removeEntityNoID(entity, block);
version (LinearLayout)
void* start = new_block.dataBegin() + new_block.entities_count * EntityID.sizeof;
else
void* start = new_block.dataBegin() + new_block.entities_count * new_info.size;
Entity* new_entity = cast(Entity*) start;
new_entity.id = entity.id;
new_entity.updateID();
//removeEntityNoID(entity, block);
j = 0;
k = 0;
version (LinearLayout)