Merge branch 'TestRunner' into 'master'
Test runner See merge request Mergul/bubel-ecs!4
This commit is contained in:
commit
d47a5c3e5c
16 changed files with 1154 additions and 82 deletions
BIN
demos/assets/textures/apple.png
Normal file
BIN
demos/assets/textures/apple.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 2.3 KiB |
BIN
demos/assets/textures/atlas.png
Normal file
BIN
demos/assets/textures/atlas.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 17 KiB |
BIN
demos/assets/textures/snake.png
Normal file
BIN
demos/assets/textures/snake.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 2.3 KiB |
BIN
demos/assets/textures/snake_head.png
Normal file
BIN
demos/assets/textures/snake_head.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 2.5 KiB |
BIN
demos/assets/textures/snake_horizontal.png
Normal file
BIN
demos/assets/textures/snake_horizontal.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 2.7 KiB |
|
|
@ -92,7 +92,7 @@ compile(['source'], 'demo.bc')
|
||||||
if clean or os.path.exists('../ecs.bc') == 0 or os.path.isfile('../ecs.bc') == 0:
|
if clean or os.path.exists('../ecs.bc') == 0 or os.path.isfile('../ecs.bc') == 0:
|
||||||
compile(['../source'], '../ecs.bc')
|
compile(['../source'], '../ecs.bc')
|
||||||
|
|
||||||
emcc_cmd = 'emcc -v ' + shared_flags + emc_flags + '-s DISABLE_DEPRECATED_FIND_EVENT_TARGET_BEHAVIOR=1 -s ALLOW_MEMORY_GROWTH=1 -s WASM_MEM_MAX=2048MB -s MALLOC=dlmalloc -s WASM=1 -o index.html '
|
emcc_cmd = 'emcc -v ' + shared_flags + emc_flags + '-s ERROR_ON_UNDEFINED_SYMBOLS=0 -s DISABLE_DEPRECATED_FIND_EVENT_TARGET_BEHAVIOR=1 -s ALLOW_MEMORY_GROWTH=1 -s MINIFY_HTML=0 -s WASM_MEM_MAX=2048MB -s MALLOC=dlmalloc -s WASM=1 -o ecs_demo.html '
|
||||||
#-s ALLOW_MEMORY_GROWTH=1 -s PROXY_TO_PTHREAD=1 -Wl,--no-check-features -s ERROR_ON_UNDEFINED_SYMBOLS=0 -s TOTAL_MEMORY=512MB
|
#-s ALLOW_MEMORY_GROWTH=1 -s PROXY_TO_PTHREAD=1 -Wl,--no-check-features -s ERROR_ON_UNDEFINED_SYMBOLS=0 -s TOTAL_MEMORY=512MB
|
||||||
|
|
||||||
emcc_cmd += '../ecs.bc '
|
emcc_cmd += '../ecs.bc '
|
||||||
|
|
|
||||||
|
|
@ -138,6 +138,7 @@ struct CountSystem
|
||||||
struct EntitiesData
|
struct EntitiesData
|
||||||
{
|
{
|
||||||
uint length;
|
uint length;
|
||||||
|
const (Entity)[] entity;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool onBegin()
|
bool onBegin()
|
||||||
|
|
@ -749,7 +750,7 @@ void loadGFX()
|
||||||
GfxConfig.materials = Mallocator.makeArray!Material(1);
|
GfxConfig.materials = Mallocator.makeArray!Material(1);
|
||||||
GfxConfig.meshes = Mallocator.makeArray!Mesh(1);
|
GfxConfig.meshes = Mallocator.makeArray!Mesh(1);
|
||||||
|
|
||||||
float[16] vertices = [-0.5,-0.5, 0,0, -0.5,0.5, 0,1, 0.5,-0.5, 1,0, 0.5,0.5, 1,1];
|
float[16] vertices = [-0.5,-0.5, 0,1, -0.5,0.5, 0,0, 0.5,-0.5, 1,1, 0.5,0.5, 1,0];
|
||||||
GfxConfig.meshes[0].vertices = Mallocator.makeArray(vertices);
|
GfxConfig.meshes[0].vertices = Mallocator.makeArray(vertices);
|
||||||
ushort[6] indices = [0,1,2,1,2,3];
|
ushort[6] indices = [0,1,2,1,2,3];
|
||||||
GfxConfig.meshes[0].indices = Mallocator.makeArray(indices);
|
GfxConfig.meshes[0].indices = Mallocator.makeArray(indices);
|
||||||
|
|
|
||||||
|
|
@ -38,9 +38,7 @@ struct Snake
|
||||||
|
|
||||||
EntityTemplate* apple_tmpl;
|
EntityTemplate* apple_tmpl;
|
||||||
EntityTemplate* snake_tmpl;
|
EntityTemplate* snake_tmpl;
|
||||||
Texture snake_texture;
|
Texture texture;
|
||||||
Texture wall_texture;
|
|
||||||
Texture apple_texture;
|
|
||||||
|
|
||||||
bool move_system = true;
|
bool move_system = true;
|
||||||
bool draw_system = true;
|
bool draw_system = true;
|
||||||
|
|
@ -85,15 +83,16 @@ struct Snake
|
||||||
|
|
||||||
void drawMap()
|
void drawMap()
|
||||||
{
|
{
|
||||||
|
const float px = 1.0/512.0;
|
||||||
foreach(x; 0 .. map_size)
|
foreach(x; 0 .. map_size)
|
||||||
{
|
{
|
||||||
foreach(y; 0 .. map_size)
|
foreach(y; 0 .. map_size)
|
||||||
{
|
{
|
||||||
switch(element(ivec2(x,y)).type)
|
switch(element(ivec2(x,y)).type)
|
||||||
{
|
{
|
||||||
case MapElement.Type.apple:launcher.renderer.draw(apple_texture, vec2(x*32,y*32), vec2(32,32), vec4(0,0,1,1), 0, 0 , 0);break;
|
case MapElement.Type.apple:launcher.renderer.draw(texture, vec2(x*32,y*32), vec2(32,32), vec4(0,32*px,16*px,16*px), 0, 0 , 0);break;
|
||||||
case MapElement.Type.snake:launcher.renderer.draw(snake_texture, vec2(x*32,y*32), vec2(32,32), vec4(0,0,1,1), 0, 0 , 0);break;
|
case MapElement.Type.snake:launcher.renderer.draw(texture, vec2(x*32,y*32), vec2(32,32), vec4(0,48*px,16*px,16*px), 0, 0 , 0);break;
|
||||||
case MapElement.Type.wall:launcher.renderer.draw(wall_texture, vec2(x*32,y*32), vec2(32,32), vec4(0,0,1,1), 0, 0 , 0);break;
|
case MapElement.Type.wall:launcher.renderer.draw(texture, vec2(x*32,y*32), vec2(32,32), vec4(0,0,1,1), 0, 0 , 0);break;
|
||||||
default:break;
|
default:break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -444,14 +443,8 @@ void snakeStart()
|
||||||
{
|
{
|
||||||
snake = Mallocator.make!Snake;
|
snake = Mallocator.make!Snake;
|
||||||
|
|
||||||
snake.snake_texture.create();
|
snake.texture.create();
|
||||||
snake.snake_texture.load("assets/textures/buckler.png");
|
snake.texture.load("assets/textures/atlas.png");
|
||||||
|
|
||||||
snake.apple_texture.create();
|
|
||||||
snake.apple_texture.load("assets/textures/buckler.png");
|
|
||||||
|
|
||||||
snake.wall_texture.create();
|
|
||||||
snake.wall_texture.load("assets/textures/buckler.png");
|
|
||||||
|
|
||||||
launcher.manager.beginRegister();
|
launcher.manager.beginRegister();
|
||||||
|
|
||||||
|
|
@ -503,10 +496,6 @@ void snakeStart()
|
||||||
|
|
||||||
void snakeEnd()
|
void snakeEnd()
|
||||||
{
|
{
|
||||||
snake.wall_texture.destroy();
|
|
||||||
snake.apple_texture.destroy();
|
|
||||||
snake.snake_texture.destroy();
|
|
||||||
|
|
||||||
//launcher.manager.freeTemplate(simple.tmpl);
|
//launcher.manager.freeTemplate(simple.tmpl);
|
||||||
Mallocator.dispose(snake);
|
Mallocator.dispose(snake);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -29,9 +29,7 @@ struct SpaceInvaders
|
||||||
EntityTemplate* enemy_tmpl;
|
EntityTemplate* enemy_tmpl;
|
||||||
EntityTemplate* ship_tmpl;
|
EntityTemplate* ship_tmpl;
|
||||||
EntityTemplate* laser_tmpl;
|
EntityTemplate* laser_tmpl;
|
||||||
Texture enemy_tex;
|
Texture texture;
|
||||||
Texture ship_tex;
|
|
||||||
Texture laser_tex;
|
|
||||||
|
|
||||||
bool move_system = true;
|
bool move_system = true;
|
||||||
bool draw_system = true;
|
bool draw_system = true;
|
||||||
|
|
@ -111,6 +109,7 @@ struct CTexture
|
||||||
mixin ECS.Component;
|
mixin ECS.Component;
|
||||||
|
|
||||||
Texture tex;
|
Texture tex;
|
||||||
|
vec4 coords = vec4(0,0,0,1);
|
||||||
}
|
}
|
||||||
|
|
||||||
struct CVelocity
|
struct CVelocity
|
||||||
|
|
@ -214,7 +213,7 @@ struct DrawSystem
|
||||||
{
|
{
|
||||||
foreach(i; 0..data.length)
|
foreach(i; 0..data.length)
|
||||||
{
|
{
|
||||||
launcher.renderer.draw(data.textures[i].tex, data.locations[i].value, data.scale[i], vec4(0,0,1,1), 0, 0 , 0);
|
launcher.renderer.draw(data.textures[i].tex, data.locations[i].value, data.scale[i], data.textures[i].coords, 0, 0 , 0);
|
||||||
//draw(renderer, data.textures[i].tex, data.locations[i], vec2(32,32), vec4(0,0,1,1));
|
//draw(renderer, data.textures[i].tex, data.locations[i], vec2(32,32), vec4(0,0,1,1));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -645,13 +644,12 @@ __gshared SpaceInvaders* space_invaders;
|
||||||
|
|
||||||
void spaceInvadersStart()
|
void spaceInvadersStart()
|
||||||
{
|
{
|
||||||
|
const float px = 1.0/512.0;
|
||||||
|
|
||||||
space_invaders = Mallocator.make!SpaceInvaders;
|
space_invaders = Mallocator.make!SpaceInvaders;
|
||||||
|
|
||||||
space_invaders.ship_tex.create();
|
space_invaders.texture.create();
|
||||||
space_invaders.ship_tex.load("assets/textures/buckler.png");
|
space_invaders.texture.load("assets/textures/atlas.png");
|
||||||
|
|
||||||
space_invaders.laser_tex.create();
|
|
||||||
space_invaders.laser_tex.load("assets/textures/buckler.png");
|
|
||||||
|
|
||||||
launcher.manager.beginRegister();
|
launcher.manager.beginRegister();
|
||||||
|
|
||||||
|
|
@ -693,7 +691,8 @@ void spaceInvadersStart()
|
||||||
space_invaders.ship_tmpl = launcher.manager.allocateTemplate(components);
|
space_invaders.ship_tmpl = launcher.manager.allocateTemplate(components);
|
||||||
|
|
||||||
CTexture* tex_comp = space_invaders.ship_tmpl.getComponent!CTexture;
|
CTexture* tex_comp = space_invaders.ship_tmpl.getComponent!CTexture;
|
||||||
tex_comp.tex = space_invaders.ship_tex;
|
tex_comp.tex = space_invaders.texture;//ship_tex;
|
||||||
|
tex_comp.coords = vec4(0*px,48*px,16*px,16*px);
|
||||||
CLocation* loc_comp = space_invaders.ship_tmpl.getComponent!CLocation;
|
CLocation* loc_comp = space_invaders.ship_tmpl.getComponent!CLocation;
|
||||||
loc_comp.value = vec2(64,64);
|
loc_comp.value = vec2(64,64);
|
||||||
CLaserWeapon* weapon = space_invaders.ship_tmpl.getComponent!CLaserWeapon;
|
CLaserWeapon* weapon = space_invaders.ship_tmpl.getComponent!CLaserWeapon;
|
||||||
|
|
@ -707,7 +706,8 @@ void spaceInvadersStart()
|
||||||
space_invaders.laser_tmpl = launcher.manager.allocateTemplate(components);
|
space_invaders.laser_tmpl = launcher.manager.allocateTemplate(components);
|
||||||
|
|
||||||
CTexture* tex_comp = space_invaders.laser_tmpl.getComponent!CTexture;
|
CTexture* tex_comp = space_invaders.laser_tmpl.getComponent!CTexture;
|
||||||
tex_comp.tex = space_invaders.laser_tex;
|
tex_comp.tex = space_invaders.texture;//laser_tex;
|
||||||
|
tex_comp.coords = vec4(0*px,48*px,16*px,16*px);
|
||||||
CScale* scale_comp = space_invaders.laser_tmpl.getComponent!CScale;
|
CScale* scale_comp = space_invaders.laser_tmpl.getComponent!CScale;
|
||||||
scale_comp.value = vec2(4,16);
|
scale_comp.value = vec2(4,16);
|
||||||
CVelocity* vel_comp = space_invaders.laser_tmpl.getComponent!CVelocity;
|
CVelocity* vel_comp = space_invaders.laser_tmpl.getComponent!CVelocity;
|
||||||
|
|
@ -724,7 +724,8 @@ void spaceInvadersStart()
|
||||||
space_invaders.enemy_tmpl = launcher.manager.allocateTemplate(components);
|
space_invaders.enemy_tmpl = launcher.manager.allocateTemplate(components);
|
||||||
|
|
||||||
CTexture* tex_comp = space_invaders.enemy_tmpl.getComponent!CTexture;
|
CTexture* tex_comp = space_invaders.enemy_tmpl.getComponent!CTexture;
|
||||||
tex_comp.tex = space_invaders.ship_tex;
|
tex_comp.tex = space_invaders.texture;//ship_tex;
|
||||||
|
tex_comp.coords = vec4(32*px,32*px,16*px,16*px);
|
||||||
CLocation* loc_comp = space_invaders.enemy_tmpl.getComponent!CLocation;
|
CLocation* loc_comp = space_invaders.enemy_tmpl.getComponent!CLocation;
|
||||||
loc_comp.value = vec2(64,space_invaders.map_size.y - 64);
|
loc_comp.value = vec2(64,space_invaders.map_size.y - 64);
|
||||||
CShootDirection* shoot_dir_comp = space_invaders.enemy_tmpl.getComponent!CShootDirection;
|
CShootDirection* shoot_dir_comp = space_invaders.enemy_tmpl.getComponent!CShootDirection;
|
||||||
|
|
@ -775,8 +776,6 @@ void spaceInvadersEnd()
|
||||||
launcher.manager.getSystem(MovementSystem.system_id).disable();
|
launcher.manager.getSystem(MovementSystem.system_id).disable();
|
||||||
launcher.manager.getSystem(ClampPositionSystem.system_id).disable();
|
launcher.manager.getSystem(ClampPositionSystem.system_id).disable();
|
||||||
|
|
||||||
space_invaders.ship_tex.destroy();
|
|
||||||
|
|
||||||
launcher.manager.freeTemplate(space_invaders.enemy_tmpl);
|
launcher.manager.freeTemplate(space_invaders.enemy_tmpl);
|
||||||
Mallocator.dispose(space_invaders);
|
Mallocator.dispose(space_invaders);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
2
dub.json
2
dub.json
|
|
@ -125,7 +125,5 @@
|
||||||
"tests/tests.d"
|
"tests/tests.d"
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|
@ -95,7 +95,7 @@ package struct EventManager
|
||||||
|
|
||||||
void clearEvents() nothrow @nogc
|
void clearEvents() nothrow @nogc
|
||||||
{
|
{
|
||||||
uint threads_count = cast(uint)manager.threads.length;
|
//uint threads_count = cast(uint)manager.threads.length;
|
||||||
foreach(ref event;events)
|
foreach(ref event;events)
|
||||||
{
|
{
|
||||||
foreach(ref first_block; event.first_blocks)
|
foreach(ref first_block; event.first_blocks)
|
||||||
|
|
@ -133,23 +133,11 @@ package struct EventManager
|
||||||
|
|
||||||
private void disposeData() nothrow @nogc
|
private void disposeData() nothrow @nogc
|
||||||
{
|
{
|
||||||
|
clearEvents();
|
||||||
if(events)
|
if(events)
|
||||||
{
|
{
|
||||||
foreach(ref event;events)
|
foreach(ref event;events)
|
||||||
{
|
{
|
||||||
foreach(first_block; event.first_blocks)
|
|
||||||
{
|
|
||||||
EventBlock* block = first_block;
|
|
||||||
EventBlock* next_block;
|
|
||||||
if(block)next_block = first_block.next;
|
|
||||||
while(block)
|
|
||||||
{
|
|
||||||
Mallocator.dispose(block);
|
|
||||||
block = next_block;
|
|
||||||
if(block)next_block = block.next;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
Mallocator.dispose(event.blocks);
|
Mallocator.dispose(event.blocks);
|
||||||
Mallocator.dispose(event.first_blocks);
|
Mallocator.dispose(event.first_blocks);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1187,7 +1187,7 @@ export struct EntityManager
|
||||||
(cast(Ev*) pointer).onDestroy();
|
(cast(Ev*) pointer).onDestroy();
|
||||||
}
|
}
|
||||||
|
|
||||||
info.destroy_callback = &callDestroy;
|
info.destroy_callback = cast(void function(void*) nothrow @nogc)&callDestroy;
|
||||||
}
|
}
|
||||||
|
|
||||||
info.size = Ev.sizeof;
|
info.size = Ev.sizeof;
|
||||||
|
|
@ -1214,7 +1214,7 @@ export struct EntityManager
|
||||||
"Can't call function with system which hasn't EntitesData structure.");
|
"Can't call function with system which hasn't EntitesData structure.");
|
||||||
static assert(__traits(hasMember, Sys, "onUpdate"),
|
static assert(__traits(hasMember, Sys, "onUpdate"),
|
||||||
"Can't call function with system which hasn't onUpdate function callback.");
|
"Can't call function with system which hasn't onUpdate function callback.");
|
||||||
static assert(is(T == typeof(&s.onUpdate)), "Function must match system update function.");
|
static assert(is(SetFunctionAttributes!(T,functionLinkage!(s.onUpdate), functionAttributes!(s.onUpdate)) == typeof(&s.onUpdate)), "Function must match system update function.");
|
||||||
static assert(__traits(hasMember, Sys, "system_id"), "Sys must be system type.");
|
static assert(__traits(hasMember, Sys, "system_id"), "Sys must be system type.");
|
||||||
|
|
||||||
System* system = getSystem(Sys.system_id);
|
System* system = getSystem(Sys.system_id);
|
||||||
|
|
@ -1527,8 +1527,8 @@ export struct EntityManager
|
||||||
ids[j] = ids[i];
|
ids[j] = ids[i];
|
||||||
j++;
|
j++;
|
||||||
}
|
}
|
||||||
else
|
//else
|
||||||
debug assert(0, "Duplicated components in template!!!");
|
// debug assert(0, "Duplicated components in template!!!");
|
||||||
}
|
}
|
||||||
ids = ids[0 .. j];
|
ids = ids[0 .. j];
|
||||||
}
|
}
|
||||||
|
|
@ -1544,8 +1544,6 @@ export struct EntityManager
|
||||||
{
|
{
|
||||||
memcpy(temp.entity_data.ptr + info.tmpl_deltas[comp],
|
memcpy(temp.entity_data.ptr + info.tmpl_deltas[comp],
|
||||||
components[comp].init_data.ptr, components[comp].size);
|
components[comp].init_data.ptr, components[comp].size);
|
||||||
/*temp.entity_data[info.tmpl_deltas[comp] .. info.tmpl_deltas[comp] + components[comp].size]
|
|
||||||
= components[comp].init_data;*/
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return temp;
|
return temp;
|
||||||
|
|
@ -1593,8 +1591,8 @@ export struct EntityManager
|
||||||
ids[j] = ids[i];
|
ids[j] = ids[i];
|
||||||
j++;
|
j++;
|
||||||
}
|
}
|
||||||
else
|
//else
|
||||||
debug assert(0, "Duplicated components in template!!!");
|
// debug assert(0, "Duplicated components in template!!!");
|
||||||
}
|
}
|
||||||
ids = ids[0 .. j];
|
ids = ids[0 .. j];
|
||||||
}
|
}
|
||||||
|
|
@ -1747,11 +1745,12 @@ export struct EntityManager
|
||||||
int j;
|
int j;
|
||||||
for (j = 0; j < add_len; j++)
|
for (j = 0; j < add_len; j++)
|
||||||
{
|
{
|
||||||
if (systems[i].priority > systems[tmp_add[j]].priority)
|
if (systems[i].priority < systems[tmp_add[j]].priority)
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
add_len++;
|
add_len++;
|
||||||
//move elements after new listener
|
//move elements after new listener
|
||||||
|
if(add_len < tmp_add.length)
|
||||||
for (int k = add_len; k > j; k--)
|
for (int k = add_len; k > j; k--)
|
||||||
{
|
{
|
||||||
tmp_add[k] = tmp_add[k - 1];
|
tmp_add[k] = tmp_add[k - 1];
|
||||||
|
|
@ -1766,11 +1765,12 @@ export struct EntityManager
|
||||||
int j;
|
int j;
|
||||||
for (j = 0; j < rem_len; j++)
|
for (j = 0; j < rem_len; j++)
|
||||||
{
|
{
|
||||||
if (systems[i].priority > systems[tmp_rem[j]].priority)
|
if (systems[i].priority < systems[tmp_rem[j]].priority)
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
rem_len++;
|
rem_len++;
|
||||||
//move elements after new listener
|
//move elements after new listener
|
||||||
|
if(rem_len < tmp_add.length)
|
||||||
for (int k = rem_len; k > j; k--)
|
for (int k = rem_len; k > j; k--)
|
||||||
{
|
{
|
||||||
tmp_rem[k] = tmp_rem[k - 1];
|
tmp_rem[k] = tmp_rem[k - 1];
|
||||||
|
|
@ -1785,11 +1785,12 @@ export struct EntityManager
|
||||||
int j;
|
int j;
|
||||||
for (j = 0; j < ch_len; j++)
|
for (j = 0; j < ch_len; j++)
|
||||||
{
|
{
|
||||||
if (systems[i].priority > systems[tmp_ch[j]].priority)
|
if (systems[i].priority < systems[tmp_ch[j]].priority)
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
ch_len++;
|
ch_len++;
|
||||||
//move elements after new listener
|
//move elements after new listener
|
||||||
|
if(ch_len < tmp_add.length)
|
||||||
for (int k = ch_len; k > j; k--)
|
for (int k = ch_len; k > j; k--)
|
||||||
{
|
{
|
||||||
tmp_ch[k] = tmp_ch[k - 1];
|
tmp_ch[k] = tmp_ch[k - 1];
|
||||||
|
|
@ -2082,6 +2083,7 @@ export struct EntityManager
|
||||||
{
|
{
|
||||||
num--;
|
num--;
|
||||||
new_ids[i] = new_ids[num];
|
new_ids[i] = new_ids[num];
|
||||||
|
data_pointers[i] = data_pointers[num];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -2555,6 +2557,7 @@ export struct EntityManager
|
||||||
pointers[i] = &thread.change_entities_list[index];
|
pointers[i] = &thread.change_entities_list[index];
|
||||||
index += components[ids[i]].size;
|
index += components[ids[i]].size;
|
||||||
}
|
}
|
||||||
|
|
||||||
__addComponents(id, ids, pointers[0 .. num]);
|
__addComponents(id, ids, pointers[0 .. num]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -2722,6 +2725,7 @@ export struct EntityManager
|
||||||
call_data);
|
call_data);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if(events[i].destroy_callback)events[i].destroy_callback(event_pointer);
|
||||||
event_pointer += events[i].size;
|
event_pointer += events[i].size;
|
||||||
}
|
}
|
||||||
block = block.next;
|
block = block.next;
|
||||||
|
|
@ -2952,7 +2956,7 @@ export struct EntityManager
|
||||||
ushort size;
|
ushort size;
|
||||||
ushort alignment;
|
ushort alignment;
|
||||||
EventCaller[] callers;
|
EventCaller[] callers;
|
||||||
void function(void* pointer) destroy_callback;
|
void function(void* pointer) nothrow @nogc destroy_callback;
|
||||||
}
|
}
|
||||||
|
|
||||||
/************************************************************************************************************************
|
/************************************************************************************************************************
|
||||||
|
|
@ -3133,12 +3137,13 @@ export struct EntityManager
|
||||||
struct EntitiesBlock
|
struct EntitiesBlock
|
||||||
{
|
{
|
||||||
///return distance (in bytes) from begin of block to data
|
///return distance (in bytes) from begin of block to data
|
||||||
export uint dataDelta() nothrow @nogc pure
|
///TODO: probably to remove. It's used by old code if I remeber correctly.
|
||||||
|
/*export uint dataDelta() nothrow @nogc pure
|
||||||
{
|
{
|
||||||
ushort dif = EntitiesBlock.sizeof;
|
ushort dif = EntitiesBlock.sizeof;
|
||||||
alignNum(dif, type_info.alignment);
|
alignNum(dif, type_info.alignment);
|
||||||
return dif;
|
return dif;
|
||||||
}
|
}*/
|
||||||
|
|
||||||
///return pointer to first element in block
|
///return pointer to first element in block
|
||||||
export void* dataBegin() nothrow @nogc pure
|
export void* dataBegin() nothrow @nogc pure
|
||||||
|
|
|
||||||
|
|
@ -187,13 +187,15 @@ static struct Mallocator
|
||||||
|
|
||||||
static void dispose(T)(T object) nothrow @nogc
|
static void dispose(T)(T object) nothrow @nogc
|
||||||
{
|
{
|
||||||
static if(__traits(hasMember, T, "__dtor"))object.__dtor();
|
static if(__traits(hasMember, T, "__xdtor"))object.__xdtor();
|
||||||
|
else static if(__traits(hasMember, T, "__dtor"))object.__dtor();
|
||||||
free(cast(void*)object);
|
free(cast(void*)object);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void alignDispose(T)(T object)
|
static void alignDispose(T)(T object)
|
||||||
{
|
{
|
||||||
static if(__traits(hasMember, T, "__dtor"))object.__dtor();
|
static if(__traits(hasMember, T, "__xdtor"))object.__xdtor();
|
||||||
|
else static if(__traits(hasMember, T, "__dtor"))object.__dtor();
|
||||||
version(Posix)free(cast(void*)object);
|
version(Posix)free(cast(void*)object);
|
||||||
else version(Windows)_aligned_free(cast(void*)object);
|
else version(Windows)_aligned_free(cast(void*)object);
|
||||||
else version(ECSEmscripten)free(cast(void*)object);
|
else version(ECSEmscripten)free(cast(void*)object);
|
||||||
|
|
|
||||||
1042
tests/basic.d
1042
tests/basic.d
File diff suppressed because it is too large
Load diff
|
|
@ -60,6 +60,11 @@ string copyString(const char* str)
|
||||||
return cast(string) Mallocator.makeArray(arr);
|
return cast(string) Mallocator.makeArray(arr);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
string copyString(string str)
|
||||||
|
{
|
||||||
|
return cast(string) Mallocator.makeArray((cast(char*)str)[0 .. str.length + 1]);
|
||||||
|
}
|
||||||
|
|
||||||
struct TestRunner(Args...)
|
struct TestRunner(Args...)
|
||||||
{
|
{
|
||||||
void generateJUnit()
|
void generateJUnit()
|
||||||
|
|
@ -90,10 +95,10 @@ struct TestRunner(Args...)
|
||||||
write(test.name);
|
write(test.name);
|
||||||
write("\" classname=\"");
|
write("\" classname=\"");
|
||||||
write(suite.name);
|
write(suite.name);
|
||||||
write("\">\n");
|
write("\">");
|
||||||
if (test.msg)
|
if (test.msg)
|
||||||
{
|
{
|
||||||
write("\t\t\t<failure type=\"Fail\" message=\"");
|
write("\n\t\t\t<failure type=\"Fail\" message=\"");
|
||||||
write(test.msg[0 .. $ - 1]);
|
write(test.msg[0 .. $ - 1]);
|
||||||
write("\">");
|
write("\">");
|
||||||
write("Assert! File: ");
|
write("Assert! File: ");
|
||||||
|
|
@ -103,9 +108,11 @@ struct TestRunner(Args...)
|
||||||
write(" Message: ");
|
write(" Message: ");
|
||||||
write(test.msg[0 .. $ - 1]);
|
write(test.msg[0 .. $ - 1]);
|
||||||
write("</failure>\n");
|
write("</failure>\n");
|
||||||
}
|
|
||||||
write("\t\t</testcase>\n");
|
write("\t\t</testcase>\n");
|
||||||
}
|
}
|
||||||
|
else write("</testcase>\n");
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
write("\t</testsuite>\n");
|
write("\t</testsuite>\n");
|
||||||
}
|
}
|
||||||
|
|
@ -168,12 +175,13 @@ struct TestRunner(Args...)
|
||||||
static if (__traits(hasMember, module_, "beforeEveryTest"))
|
static if (__traits(hasMember, module_, "beforeEveryTest"))
|
||||||
module_.beforeEveryTest();
|
module_.beforeEveryTest();
|
||||||
|
|
||||||
|
version(D_BetterC)
|
||||||
|
{
|
||||||
// Save calling environment for longjmp
|
// Save calling environment for longjmp
|
||||||
int jmp_ret = setjmp(gEnvBuffer);
|
int jmp_ret = setjmp(gEnvBuffer);
|
||||||
|
|
||||||
if (jmp_ret == ASSERTED)
|
if (jmp_ret == ASSERTED)
|
||||||
{
|
{
|
||||||
passed = false;
|
|
||||||
test.passed = false;
|
test.passed = false;
|
||||||
test.file = copyString(gAssertInfo.file);
|
test.file = copyString(gAssertInfo.file);
|
||||||
test.file_line = gAssertInfo.line;
|
test.file_line = gAssertInfo.line;
|
||||||
|
|
@ -184,6 +192,23 @@ struct TestRunner(Args...)
|
||||||
unittest_();
|
unittest_();
|
||||||
test.passed = true;
|
test.passed = true;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
import core.exception : AssertError;
|
||||||
|
try
|
||||||
|
{
|
||||||
|
unittest_();
|
||||||
|
test.passed = true;
|
||||||
|
}
|
||||||
|
catch(AssertError error)
|
||||||
|
{
|
||||||
|
test.passed = false;
|
||||||
|
test.file = copyString(error.file);
|
||||||
|
test.file_line = cast(int)error.line;
|
||||||
|
test.msg = copyString(error.msg);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (test.passed)
|
if (test.passed)
|
||||||
suite.passed++;
|
suite.passed++;
|
||||||
|
|
@ -360,3 +385,14 @@ extern (C) int main(int argc, char** args)
|
||||||
else
|
else
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
version (D_BetterC)
|
||||||
|
{
|
||||||
|
version(LDC)
|
||||||
|
{
|
||||||
|
extern (C) __gshared int _d_eh_personality(int, int, size_t, void*, void*)
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -16,4 +16,20 @@ unittest
|
||||||
|
|
||||||
vector.clear();
|
vector.clear();
|
||||||
assert(vector.length == 0);
|
assert(vector.length == 0);
|
||||||
|
|
||||||
|
ubyte[1025] array;
|
||||||
|
foreach(i;0..cast(uint)array.length)array[i] = cast(ubyte)i;
|
||||||
|
vector.add(array);
|
||||||
|
assert(vector.length == 1025);
|
||||||
|
assert(vector[] == array[]);
|
||||||
|
|
||||||
|
SimpleVector vector2;
|
||||||
|
vector2.clear();
|
||||||
|
vector2.add(array[0..1023]);
|
||||||
|
vector2.add('a');
|
||||||
|
vector2.add('b');
|
||||||
|
assert(vector2.length == 1025);
|
||||||
|
assert(vector2[0..1023] == array[0..1023]);
|
||||||
|
assert(vector2[1023] == 'a');
|
||||||
|
assert(vector2[1024] == 'b');
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue