Demos update

-fixed critical bug with demos switching
-change multithreaded rendering method (now draw order is keeped even witch multithreading there is no popping)
-added particle emitter components and systems (WIP)
-bullets (laser) now sending EBullet event insead of EDamage which gives possibility to not destroy bullet if shooted entity is already killed
This commit is contained in:
Mergul 2020-05-23 10:55:31 +02:00
parent 233f4abd47
commit 3d98b0ee5e
4 changed files with 284 additions and 87 deletions

View file

@ -103,7 +103,7 @@ struct Launcher
manager.update("clean"); manager.update("clean");
manager.end(); manager.end();
foreach(system; manager.systems) foreach(ref system; manager.systems)
{ {
if(system.id != CountSystem.system_id && system.id != CleanSystem.system_id)system.disable(); if(system.id != CountSystem.system_id && system.id != CleanSystem.system_id)system.disable();
} }
@ -744,7 +744,9 @@ int main(int argc, char** argv)
{ {
import demos.simple; import demos.simple;
launcher.switchDemo(&simpleStart,&simpleLoop,&simpleEnd,&simpleEvent,&simpleTool,Simple.tips); import demos.space_invaders;
launcher.switchDemo(&spaceInvadersStart,&spaceInvadersLoop,&spaceInvadersEnd,&spaceInvadersEvent,&spaceInvadersTool,SpaceInvaders.tips);
// launcher.switchDemo(&simpleStart,&simpleLoop,&simpleEnd,&simpleEvent,&simpleTool,Simple.tips);
} }
int key_num; int key_num;

View file

@ -53,6 +53,7 @@ struct DrawSystem
{ {
uint length; uint length;
uint thread_id; uint thread_id;
uint job_id;
@readonly CTexture[] textures; @readonly CTexture[] textures;
@readonly CLocation[] locations; @readonly CLocation[] locations;
} }
@ -62,10 +63,11 @@ struct DrawSystem
if(launcher.renderer.prepared_items >= launcher.renderer.MaxObjects)return;//simple leave loop if max visible objects count was reached if(launcher.renderer.prepared_items >= launcher.renderer.MaxObjects)return;//simple leave loop if max visible objects count was reached
foreach(i; 0..data.length) foreach(i; 0..data.length)
{ {
launcher.renderer.draw(data.textures[i].tex, data.locations[i].location, vec2(16,16), vec4(0,0,1,1), cast(ushort)(data.locations[i].y*64+data.locations[i].x), 0x80808080, 0, 0, 0, data.thread_id); launcher.renderer.draw(data.textures[i].tex, data.locations[i].location, vec2(16,16), vec4(0,0,1,1), cast(ushort)(data.locations[i].y), 0x80808080, 0, 0, 0, data.job_id);
// launcher.renderer.draw(data.textures[i].tex, data.locations[i].location, vec2(16,16), vec4(0,0,1,1), 0, 0x80808080, 0, 0, 0, data.job_id);
//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));
} }
if(data.thread_id == 0)launcher.renderer.pushData(); //if(data.thread_id == 0)launcher.renderer.pushData();
} }
} }

View file

@ -196,10 +196,10 @@ struct CLaser
{ {
mixin ECS.Component; mixin ECS.Component;
float damage = 1.0f; int damage = 1;
} }
struct CLaserWeapon struct CWeapon
{ {
mixin ECS.Component; mixin ECS.Component;
@ -207,15 +207,25 @@ struct CLaserWeapon
{ {
float reload_time; float reload_time;
float dispersion; float dispersion;
int damage;
} }
__gshared Level[12] levels = [Level(4000,0),Level(4000,0.1), __gshared Level[12] levels = [Level(4000,0),Level(4000,0.1),
Level(500,0),Level(350,0),Level(250,0.02),Level(175,0.03),Level(110,0.04), Level(500,0),Level(350,0),Level(250,0.02),Level(175,0.03),Level(110,0.04),
Level(80,0.05),Level(50,0.08),Level(20,0.1),Level(10,0.12),Level(2,0.14)]; Level(80,0.05),Level(50,0.08),Level(20,0.1),Level(10,0.12),Level(2,0.14)];
enum Type : ubyte
{
laser,
enemy_laser,
blaster,
canon,
plasma
}
ubyte level = 1;
float shoot_time = 0; float shoot_time = 0;
Type type;
ubyte level = 1;
} }
struct CWeaponLocation struct CWeaponLocation
@ -253,7 +263,7 @@ struct CShootGrid
mixin ECS.Component; mixin ECS.Component;
} }
struct CTargetPartent struct CTargetParent
{ {
mixin ECS.Component; mixin ECS.Component;
@ -386,6 +396,10 @@ struct CParticleEmitter
vec2 range; vec2 range;
vec2 time_range; vec2 time_range;
///due to multithreading there should be separate template for every thread.
///It can be array of tempaltes or (like in this demo) simply index of template;
uint tmpl_id;
//EntityTemplate* tmpl;
} }
///Due to perfarmance reason emitter time and attributes are divided into seprate components. ///Due to perfarmance reason emitter time and attributes are divided into seprate components.
@ -397,6 +411,11 @@ struct CParticleEmitterTime
float time; float time;
} }
struct CShootWaveUponDeath
{
mixin ECS.Component;
}
/*####################################################################################################################### /*#######################################################################################################################
------------------------------------------------ Events ------------------------------------------------------------------ ------------------------------------------------ Events ------------------------------------------------------------------
#######################################################################################################################*/ #######################################################################################################################*/
@ -435,6 +454,20 @@ struct EDamage
uint damage = 0; uint damage = 0;
} }
struct EBulletHit
{
mixin ECS.Event;
this(EntityID id, uint damage)
{
this.id = id;
this.damage = damage;
}
EntityID id;
uint damage;
}
struct EDestroyedChild struct EDestroyedChild
{ {
mixin ECS.Event; mixin ECS.Event;
@ -652,9 +685,9 @@ struct ShipWeaponSystem
CChildren* children = entity.getComponent!CChildren; CChildren* children = entity.getComponent!CChildren;
if(children is null || children.childern.length != 0)return; if(children is null || children.childern.length != 0)return;
EntityID[3] weapons; EntityID[3] weapons;
laser1_tmpl.getComponent!CTargetPartent().parent = entity.id; laser1_tmpl.getComponent!CTargetParent().parent = entity.id;
laser2_tmpl.getComponent!CTargetPartent().parent = entity.id; laser2_tmpl.getComponent!CTargetParent().parent = entity.id;
main_weapon_tmpl.getComponent!CTargetPartent().parent = entity.id; main_weapon_tmpl.getComponent!CTargetParent().parent = entity.id;
weapons[0] = launcher.manager.addEntity(laser1_tmpl).id; weapons[0] = launcher.manager.addEntity(laser1_tmpl).id;
weapons[1] = launcher.manager.addEntity(laser2_tmpl).id; weapons[1] = launcher.manager.addEntity(laser2_tmpl).id;
weapons[2] = launcher.manager.addEntity(main_weapon_tmpl).id; weapons[2] = launcher.manager.addEntity(main_weapon_tmpl).id;
@ -663,13 +696,13 @@ struct ShipWeaponSystem
void create() void create()
{ {
laser1_tmpl = launcher.manager.allocateTemplate([CLaserWeapon.component_id, CLocation.component_id, CShootDirection.component_id, CTargetPartent.component_id, CGuild.component_id, CVelocity.component_id].staticArray); laser1_tmpl = launcher.manager.allocateTemplate([CWeapon.component_id, CLocation.component_id, CShootDirection.component_id, CTargetParent.component_id, CGuild.component_id, CVelocity.component_id].staticArray);
main_weapon_tmpl = launcher.manager.allocateTemplate([CLocation.component_id, CShootDirection.component_id, CTargetPartent.component_id, CGuild.component_id, CVelocity.component_id].staticArray); main_weapon_tmpl = launcher.manager.allocateTemplate([CLocation.component_id, CShootDirection.component_id, CTargetParent.component_id, CGuild.component_id, CVelocity.component_id].staticArray);
*laser1_tmpl.getComponent!CLaserWeapon = CLaserWeapon(3,0.0); *laser1_tmpl.getComponent!CWeapon = CWeapon(0,CWeapon.Type.laser,3);
laser1_tmpl.getComponent!CTargetPartent().rel_pos = vec2(10,13); laser1_tmpl.getComponent!CTargetParent().rel_pos = vec2(10,13);
main_weapon_tmpl.getComponent!CTargetPartent().rel_pos = vec2(0,4); main_weapon_tmpl.getComponent!CTargetParent().rel_pos = vec2(0,4);
laser2_tmpl = launcher.manager.allocateTemplate(laser1_tmpl); laser2_tmpl = launcher.manager.allocateTemplate(laser1_tmpl);
laser2_tmpl.getComponent!CTargetPartent().rel_pos = vec2(-10,13); laser2_tmpl.getComponent!CTargetParent().rel_pos = vec2(-10,13);
} }
~this() ~this()
@ -691,10 +724,10 @@ struct ShipWeaponSystem
if(children is null || children.childern.length != 0)return; if(children is null || children.childern.length != 0)return;
CDepth* depth = entity.getComponent!CDepth; CDepth* depth = entity.getComponent!CDepth;
EntityID[2] weapons; EntityID[2] weapons;
weapon_tmpl.getComponent!CTargetPartent().parent = entity.id; weapon_tmpl.getComponent!CTargetParent().parent = entity.id;
if(depth)weapon_tmpl.getComponent!CDepth().depth = cast(short)(depth.depth - 1); if(depth)weapon_tmpl.getComponent!CDepth().depth = cast(short)(depth.depth - 1);
else weapon_tmpl.getComponent!CDepth().depth = -1; else weapon_tmpl.getComponent!CDepth().depth = -1;
top_tmpl.getComponent!CTargetPartent().parent = entity.id; top_tmpl.getComponent!CTargetParent().parent = entity.id;
if(depth)top_tmpl.getComponent!CDepth().depth = cast(short)(depth.depth - 2); if(depth)top_tmpl.getComponent!CDepth().depth = cast(short)(depth.depth - 2);
else top_tmpl.getComponent!CDepth().depth = -2; else top_tmpl.getComponent!CDepth().depth = -2;
@ -706,24 +739,24 @@ struct ShipWeaponSystem
void create() void create()
{ {
weapon_tmpl = launcher.manager.allocateTemplate( weapon_tmpl = launcher.manager.allocateTemplate(
[CLaserWeapon.component_id, CLocation.component_id, CShootDirection.component_id, [CWeapon.component_id, CLocation.component_id, CShootDirection.component_id,
CTargetPartent.component_id, CGuild.component_id, CVelocity.component_id, CTargetParent.component_id, CGuild.component_id, CVelocity.component_id,
CAutoShoot.component_id, CTarget.component_id, CTargetPlayerShip.component_id, CAutoShoot.component_id, CTarget.component_id, CTargetPlayerShip.component_id,
CRotation.component_id, CScale.component_id, CTexture.component_id, CRotation.component_id, CScale.component_id, CTexture.component_id,
CDepth.component_id, CWeaponLocation.component_id].staticArray); CDepth.component_id, CWeaponLocation.component_id].staticArray);
*weapon_tmpl.getComponent!CLaserWeapon = CLaserWeapon(3,0.0); *weapon_tmpl.getComponent!CWeapon = CWeapon(0,CWeapon.Type.laser,3);
weapon_tmpl.getComponent!CTargetPartent().rel_pos = vec2(0,0); weapon_tmpl.getComponent!CTargetParent().rel_pos = vec2(0,0);
weapon_tmpl.getComponent!CGuild().guild = 1; weapon_tmpl.getComponent!CGuild().guild = 1;
weapon_tmpl.getComponent!CScale().value = vec2(4,16); weapon_tmpl.getComponent!CScale().value = vec2(4,16);
weapon_tmpl.getComponent!CLaserWeapon().level = 1; weapon_tmpl.getComponent!CWeapon().level = 1;
weapon_tmpl.getComponent!CDepth().depth = -1; weapon_tmpl.getComponent!CDepth().depth = -1;
weapon_tmpl.getComponent!CTexture().coords = vec4(136,96,4,16)*px; weapon_tmpl.getComponent!CTexture().coords = vec4(136,96,4,16)*px;
weapon_tmpl.getComponent!CWeaponLocation().rel_pos = vec2(0,12); weapon_tmpl.getComponent!CWeaponLocation().rel_pos = vec2(0,12);
top_tmpl = launcher.manager.allocateTemplate( top_tmpl = launcher.manager.allocateTemplate(
[CLocation.component_id, CTargetPartent.component_id, CScale.component_id, [CLocation.component_id, CTargetParent.component_id, CScale.component_id,
CTexture.component_id, CDepth.component_id].staticArray); CTexture.component_id, CDepth.component_id].staticArray);
top_tmpl.getComponent!CTargetPartent().rel_pos = vec2(0,1); top_tmpl.getComponent!CTargetParent().rel_pos = vec2(0,1);
top_tmpl.getComponent!CScale().value = vec2(10,11); top_tmpl.getComponent!CScale().value = vec2(10,11);
top_tmpl.getComponent!CDepth().depth = -2; top_tmpl.getComponent!CDepth().depth = -2;
top_tmpl.getComponent!CTexture().coords = vec4(112,96,10,11)*px; top_tmpl.getComponent!CTexture().coords = vec4(112,96,10,11)*px;
@ -751,10 +784,10 @@ struct ShipWeaponSystem
CParts* parts = entity.getComponent!CParts; CParts* parts = entity.getComponent!CParts;
if(parts)parts.count = 4; if(parts)parts.count = 4;
EntityID[4] towers; EntityID[4] towers;
tower1_tmpl.getComponent!CTargetPartent().parent = entity.id; tower1_tmpl.getComponent!CTargetParent().parent = entity.id;
tower2_tmpl.getComponent!CTargetPartent().parent = entity.id; tower2_tmpl.getComponent!CTargetParent().parent = entity.id;
tower3_tmpl.getComponent!CTargetPartent().parent = entity.id; tower3_tmpl.getComponent!CTargetParent().parent = entity.id;
tower4_tmpl.getComponent!CTargetPartent().parent = entity.id; tower4_tmpl.getComponent!CTargetParent().parent = entity.id;
towers[0] = launcher.manager.addEntity(tower1_tmpl).id; towers[0] = launcher.manager.addEntity(tower1_tmpl).id;
towers[1] = launcher.manager.addEntity(tower2_tmpl).id; towers[1] = launcher.manager.addEntity(tower2_tmpl).id;
towers[2] = launcher.manager.addEntity(tower3_tmpl).id; towers[2] = launcher.manager.addEntity(tower3_tmpl).id;
@ -768,7 +801,7 @@ struct ShipWeaponSystem
[CHitMark.component_id, CHitPoints.component_id, CLocation.component_id, [CHitMark.component_id, CHitPoints.component_id, CLocation.component_id,
CTexture.component_id, CScale.component_id, CEnemy.component_id, CTexture.component_id, CScale.component_id, CEnemy.component_id,
CShootGrid.component_id, CGuild.component_id, CInit.component_id, CShootGrid.component_id, CGuild.component_id, CInit.component_id,
CChildren.component_id, CDepth.component_id, CTargetPartent.component_id].staticArray CChildren.component_id, CDepth.component_id, CTargetParent.component_id].staticArray
); );
CTexture* tex_comp = tower1_tmpl.getComponent!CTexture; CTexture* tex_comp = tower1_tmpl.getComponent!CTexture;
@ -779,17 +812,19 @@ struct ShipWeaponSystem
tower1_tmpl.getComponent!CGuild().guild = 1; tower1_tmpl.getComponent!CGuild().guild = 1;
tower1_tmpl.getComponent!CInit().type = CInit.Type.tower; tower1_tmpl.getComponent!CInit().type = CInit.Type.tower;
tower1_tmpl.getComponent!CHitPoints().value = 10; tower1_tmpl.getComponent!CHitPoints().value = 10;
tower1_tmpl.getComponent!CDepth().depth = -5; tower1_tmpl.getComponent!CDepth().depth = -2;
tower1_tmpl.getComponent!CTargetPartent().rel_pos = vec2(-33,2); tower1_tmpl.getComponent!CTargetParent().rel_pos = vec2(-33,2);
tower2_tmpl = launcher.manager.allocateTemplate(tower1_tmpl); tower2_tmpl = launcher.manager.allocateTemplate(tower1_tmpl);
tower2_tmpl.getComponent!CTargetPartent().rel_pos = vec2(33,2); tower2_tmpl.getComponent!CTargetParent().rel_pos = vec2(33,2);
tower3_tmpl = launcher.manager.allocateTemplate(tower1_tmpl); tower3_tmpl = launcher.manager.allocateTemplate(tower1_tmpl);
tower3_tmpl.getComponent!CTargetPartent().rel_pos = vec2(-39,-15); tower3_tmpl.getComponent!CDepth().depth = 0;
tower3_tmpl.getComponent!CTargetParent().rel_pos = vec2(-40,-15);
tower4_tmpl = launcher.manager.allocateTemplate(tower1_tmpl); tower4_tmpl = launcher.manager.allocateTemplate(tower1_tmpl);
tower4_tmpl.getComponent!CTargetPartent().rel_pos = vec2(39,-15); tower4_tmpl.getComponent!CDepth().depth = 0;
tower4_tmpl.getComponent!CTargetParent().rel_pos = vec2(40,-15);
} }
~this() ~this()
@ -810,13 +845,13 @@ struct ShipWeaponSystem
ship.create(); ship.create();
tower.create(); tower.create();
boss.create(); boss.create();
/*ship.laser1_tmpl = launcher.manager.allocateTemplate([CLaserWeapon.component_id, CLocation.component_id, CShootDirection.component_id, CTargetPartent.component_id, CGuild.component_id, CVelocity.component_id].staticArray); /*ship.laser1_tmpl = launcher.manager.allocateTemplate([CWeapon.component_id, CLocation.component_id, CShootDirection.component_id, CTargetParent.component_id, CGuild.component_id, CVelocity.component_id].staticArray);
ship.main_weapon_tmpl = launcher.manager.allocateTemplate([CLocation.component_id, CShootDirection.component_id, CTargetPartent.component_id, CGuild.component_id, CVelocity.component_id].staticArray); ship.main_weapon_tmpl = launcher.manager.allocateTemplate([CLocation.component_id, CShootDirection.component_id, CTargetParent.component_id, CGuild.component_id, CVelocity.component_id].staticArray);
*ship.laser1_tmpl.getComponent!CLaserWeapon = CLaserWeapon(3,0.0); *ship.laser1_tmpl.getComponent!CWeapon = CWeapon(3,0.0);
ship.laser1_tmpl.getComponent!CTargetPartent().rel_pos = vec2(10,13); ship.laser1_tmpl.getComponent!CTargetParent().rel_pos = vec2(10,13);
ship.main_weapon_tmpl.getComponent!CTargetPartent().rel_pos = vec2(0,4); ship.main_weapon_tmpl.getComponent!CTargetParent().rel_pos = vec2(0,4);
ship.laser2_tmpl = launcher.manager.allocateTemplate(ship.laser1_tmpl); ship.laser2_tmpl = launcher.manager.allocateTemplate(ship.laser1_tmpl);
ship.laser2_tmpl.getComponent!CTargetPartent().rel_pos = vec2(-10,13);*/ ship.laser2_tmpl.getComponent!CTargetParent().rel_pos = vec2(-10,13);*/
} }
void onDestroy() void onDestroy()
@ -832,9 +867,9 @@ struct ShipWeaponSystem
{ {
/*if(data.children[i].childern.length != 0)continue; /*if(data.children[i].childern.length != 0)continue;
EntityID[3] weapons; EntityID[3] weapons;
laser1_tmpl.getComponent!CTargetPartent().parent = data.entity[i].id; laser1_tmpl.getComponent!CTargetParent().parent = data.entity[i].id;
laser2_tmpl.getComponent!CTargetPartent().parent = data.entity[i].id; laser2_tmpl.getComponent!CTargetParent().parent = data.entity[i].id;
main_weapon_tmpl.getComponent!CTargetPartent().parent = data.entity[i].id; main_weapon_tmpl.getComponent!CTargetParent().parent = data.entity[i].id;
weapons[0] = launcher.manager.addEntity(laser1_tmpl).id; weapons[0] = launcher.manager.addEntity(laser1_tmpl).id;
weapons[1] = launcher.manager.addEntity(laser2_tmpl).id; weapons[1] = launcher.manager.addEntity(laser2_tmpl).id;
weapons[2] = launcher.manager.addEntity(main_weapon_tmpl).id; weapons[2] = launcher.manager.addEntity(main_weapon_tmpl).id;
@ -859,7 +894,7 @@ struct MoveToParentTargetSystem
int length; int length;
CLocation[] location; CLocation[] location;
@optional CVelocity[] velocity; @optional CVelocity[] velocity;
@readonly CTargetPartent[] target; @readonly CTargetParent[] target;
} }
void onUpdate(EntitiesData data) void onUpdate(EntitiesData data)
@ -908,6 +943,7 @@ struct DrawSystem
{ {
uint length; uint length;
uint thread_id; uint thread_id;
uint job_id;
@readonly CTexture[] textures; @readonly CTexture[] textures;
@readonly CLocation[] locations; @readonly CLocation[] locations;
@readonly CScale[] scale; @readonly CScale[] scale;
@ -925,24 +961,24 @@ struct DrawSystem
foreach(i; 0..data.length) foreach(i; 0..data.length)
{ {
uint color = 0x80808080 + 0x01010101 * data.hit_mark[i]; uint color = 0x80808080 + 0x01010101 * data.hit_mark[i];
short depth = cast(short)(data.locations[i].y*8 + data.locations[i].x); short depth = cast(short)(data.locations[i].y);
launcher.renderer.draw(space_invaders.texture, data.locations[i].value, data.scale[i], data.textures[i].coords, depth, color, 0, 0, 0, data.thread_id); launcher.renderer.draw(space_invaders.texture, data.locations[i].value, data.scale[i], data.textures[i].coords, depth, color, 0, 0, 0, data.job_id);
} }
} }
else if(data.rotation) else if(data.rotation)
{ {
foreach(i; 0..data.length) foreach(i; 0..data.length)
{ {
short depth = cast(short)(data.locations[i].y*8 + data.locations[i].x); short depth = cast(short)(data.locations[i].y);
launcher.renderer.draw(space_invaders.texture, data.locations[i].value, data.scale[i], data.textures[i].coords, depth, 0x80808080, data.rotation[i], 0, 0, data.thread_id); launcher.renderer.draw(space_invaders.texture, data.locations[i].value, data.scale[i], data.textures[i].coords, depth, 0x80808080, data.rotation[i], 0, 0, data.job_id);
} }
} }
else else
{ {
foreach(i; 0..data.length) foreach(i; 0..data.length)
{ {
short depth = cast(short)(data.locations[i].y*8 + data.locations[i].x); short depth = cast(short)(data.locations[i].y);
launcher.renderer.draw(space_invaders.texture, data.locations[i].value, data.scale[i], data.textures[i].coords, depth, 0x80808080, 0, 0, 0, data.thread_id); launcher.renderer.draw(space_invaders.texture, data.locations[i].value, data.scale[i], data.textures[i].coords, depth, 0x80808080, 0, 0, 0, data.job_id);
} }
} }
} }
@ -955,8 +991,8 @@ struct DrawSystem
foreach(i; 0..data.length) foreach(i; 0..data.length)
{ {
uint color = 0x80808080 + 0x01010101 * data.hit_mark[i]; uint color = 0x80808080 + 0x01010101 * data.hit_mark[i];
short depth = cast(short)(data.depth[i] * 16 + data.locations[i].y*8 + data.locations[i].x); short depth = cast(short)(data.depth[i] * 8 + data.locations[i].y);
launcher.renderer.draw(space_invaders.texture, data.locations[i].value, data.scale[i], data.textures[i].coords, depth, color, data.rotation[i], 0, 0, data.thread_id); launcher.renderer.draw(space_invaders.texture, data.locations[i].value, data.scale[i], data.textures[i].coords, depth, color, data.rotation[i], 0, 0, data.job_id);
} }
} }
else else
@ -964,8 +1000,8 @@ struct DrawSystem
foreach(i; 0..data.length) foreach(i; 0..data.length)
{ {
uint color = 0x80808080 + 0x01010101 * data.hit_mark[i]; uint color = 0x80808080 + 0x01010101 * data.hit_mark[i];
short depth = cast(short)(data.depth[i] * 16 + data.locations[i].y*8 + data.locations[i].x); short depth = cast(short)(data.depth[i] * 8 + data.locations[i].y);
launcher.renderer.draw(space_invaders.texture, data.locations[i].value, data.scale[i], data.textures[i].coords, depth, color, 0, 0, 0, data.thread_id); launcher.renderer.draw(space_invaders.texture, data.locations[i].value, data.scale[i], data.textures[i].coords, depth, color, 0, 0, 0, data.job_id);
} }
} }
} }
@ -973,20 +1009,20 @@ struct DrawSystem
{ {
foreach(i; 0..data.length) foreach(i; 0..data.length)
{ {
short depth = cast(short)(data.depth[i] * 16 + data.locations[i].y*8 + data.locations[i].x); short depth = cast(short)(data.depth[i] * 8 + data.locations[i].y);
launcher.renderer.draw(space_invaders.texture, data.locations[i].value, data.scale[i], data.textures[i].coords, depth, 0x80808080, data.rotation[i], 0, 0, data.thread_id); launcher.renderer.draw(space_invaders.texture, data.locations[i].value, data.scale[i], data.textures[i].coords, depth, 0x80808080, data.rotation[i], 0, 0, data.job_id);
} }
} }
else else
{ {
foreach(i; 0..data.length) foreach(i; 0..data.length)
{ {
short depth = cast(short)(data.depth[i] * 16 + data.locations[i].y*8 + data.locations[i].x); short depth = cast(short)(data.depth[i] * 8 + data.locations[i].y);
launcher.renderer.draw(space_invaders.texture, data.locations[i].value, data.scale[i], data.textures[i].coords, depth, 0x80808080, 0, 0, 0, data.thread_id); launcher.renderer.draw(space_invaders.texture, data.locations[i].value, data.scale[i], data.textures[i].coords, depth, 0x80808080, 0, 0, 0, data.job_id);
} }
} }
} }
if(data.thread_id == 0)launcher.renderer.pushData(); //if(data.thread_id == 0)launcher.renderer.pushData();
} }
} }
@ -1029,7 +1065,7 @@ struct LaserShootingSystem
uint length; uint length;
///variable named "length" contain thread identifier ///variable named "length" contain thread identifier
uint thread_id; uint thread_id;
CLaserWeapon[] laser; CWeapon[] laser;
@readonly CLocation[] location; @readonly CLocation[] location;
@readonly CGuild[] guild; @readonly CGuild[] guild;
@ -1134,14 +1170,14 @@ struct LaserShootingSystem
{ {
foreach(i;0..data.length) foreach(i;0..data.length)
{ {
CLaserWeapon* laser = &data.laser[i]; CWeapon* laser = &data.laser[i];
laser.shoot_time += launcher.delta_time; laser.shoot_time += launcher.delta_time;
while(laser.shoot_time > CLaserWeapon.levels[laser.level - 1].reload_time) while(laser.shoot_time > CWeapon.levels[laser.level - 1].reload_time)
{ {
laser.shoot_time -= CLaserWeapon.levels[laser.level - 1].reload_time; laser.shoot_time -= CWeapon.levels[laser.level - 1].reload_time;
thread.laser_location.value = data.location[i]; thread.laser_location.value = data.location[i];
thread.laser_velocity.value = vec2((randomf()*2-1) * CLaserWeapon.levels[laser.level - 1].dispersion,1);//data.shoot_direction[i].direction == Direction.up ? 1.0 : -1.0); thread.laser_velocity.value = vec2((randomf()*2-1) * CWeapon.levels[laser.level - 1].dispersion,1);//data.shoot_direction[i].direction == Direction.up ? 1.0 : -1.0);
if(data.shoot_direction && data.shoot_direction[i].direction == Direction.down)thread.laser_velocity.y = -1; if(data.shoot_direction && data.shoot_direction[i].direction == Direction.down)thread.laser_velocity.y = -1;
thread.laser_guild.guild = data.guild[i].guild; thread.laser_guild.guild = data.guild[i].guild;
@ -1197,9 +1233,9 @@ struct LaserShootingSystem
{ {
foreach(i;0..data.length) foreach(i;0..data.length)
{ {
CLaserWeapon* laser = &data.laser[i]; CWeapon* laser = &data.laser[i];
laser.shoot_time += launcher.delta_time; laser.shoot_time += launcher.delta_time;
if(laser.shoot_time > CLaserWeapon.levels[laser.level - 1].reload_time)laser.shoot_time = CLaserWeapon.levels[laser.level - 1].reload_time; if(laser.shoot_time > CWeapon.levels[laser.level - 1].reload_time)laser.shoot_time = CWeapon.levels[laser.level - 1].reload_time;
} }
} }
@ -1262,8 +1298,83 @@ struct LaserCollisionSystem
{ {
if(space_invaders.shoot_grid.test(id, data.location[i], cast(ubyte)(~(1 << data.guild[i].guild)))) if(space_invaders.shoot_grid.test(id, data.location[i], cast(ubyte)(~(1 << data.guild[i].guild))))
{ {
launcher.manager.sendEvent(id, EDamage(1)); launcher.manager.sendEvent(id, EBulletHit(data.entity[i].id,1));
launcher.manager.removeEntity(data.entity[i].id); //launcher.manager.removeEntity(data.entity[i].id);
}
}
}
}
struct ParticleEmittingSystem
{
mixin ECS.System!32;
struct EntitiesData
{
uint length;
uint thread_id;
CParticleEmitterTime[] emit_time;
@readonly CLocation[] location;
@readonly CParticleEmitter[] emitter;
@optional @readonly CVelocity[] velocity;
}
struct Thread
{
EntityTemplate*[1] templates;
}
Thread[] threads;
void onCreate()
{
threads = Mallocator.makeArray!Thread(32);
threads[0].templates[0] = launcher.manager.allocateTemplate(
[CLocation.component_id, CTexture.component_id, CScale.component_id,
CAnimation.component_id, CParticle.component_id, CRotation.component_id,
CVelocity.component_id, CDamping.component_id].staticArray);
foreach(ref thread;threads[1 .. $])
{
thread.templates[0] = launcher.manager.allocateTemplate(threads[0].templates[0]);
}
}
void onDestroy()
{
foreach(ref thread;threads[1 .. $])
{
foreach(tmpl; thread.templates)
{
launcher.manager.freeTemplate(tmpl);
}
}
Mallocator.dispose(threads);
}
void onUpdate(EntitiesData data)
{
Thread* thread = &threads[data.thread_id];
foreach(i;0..data.length)
{
data.emit_time[i].time -= launcher.delta_time;
while(data.emit_time[i].time < 0)
{
CParticleEmitter* emitter = &data.emitter[i];
data.emit_time[i].time += emitter.time_range.x + randomf() * emitter.time_range.y;
EntityTemplate* tmpl = thread.templates[emitter.tmpl_id];
CLocation* location = tmpl.getComponent!CLocation;
if(location)location.value = data.location[i];
if(data.velocity)
{
CVelocity* velocity = tmpl.getComponent!CVelocity;
if(velocity)velocity.value = data.velocity[i];
}
launcher.manager.addEntity(tmpl);
} }
} }
} }
@ -1314,10 +1425,10 @@ struct UpgradeSystem
void handleEvent(Entity* entity, EUpgrade event) void handleEvent(Entity* entity, EUpgrade event)
{ {
CLaserWeapon* laser = entity.getComponent!CLaserWeapon; CWeapon* laser = entity.getComponent!CWeapon;
if(laser) if(laser)
{ {
if(laser.level < CLaserWeapon.levels.length)laser.level++; if(laser.level < CWeapon.levels.length)laser.level++;
} }
CShip* ship = entity.getComponent!CShip; CShip* ship = entity.getComponent!CShip;
if(ship) if(ship)
@ -1554,6 +1665,21 @@ struct HitPointsSystem
if(hit_mark)hit_mark.value = 127; if(hit_mark)hit_mark.value = 127;
} }
void handleEvent(Entity* entity, EBulletHit event)
{
CHitPoints* hp = entity.getComponent!CHitPoints;
if(*hp <= 0)return;
launcher.manager.removeEntity(event.id);
*hp -= event.damage;
if(*hp <= 0)
{
launcher.manager.sendEvent(entity.id, EDeath());
//launcher.manager.removeEntity(entity.id);
}
CHitMark* hit_mark = entity.getComponent!CHitMark;
if(hit_mark)hit_mark.value = 127;
}
void handleEvent(Entity* entity, EDeath event) void handleEvent(Entity* entity, EDeath event)
{ {
CEnemy* enemy = entity.getComponent!CEnemy; CEnemy* enemy = entity.getComponent!CEnemy;
@ -1581,12 +1707,12 @@ struct ChildDestroySystem
struct EntitiesData struct EntitiesData
{ {
CTargetPartent[] parent; CTargetParent[] parent;
} }
void handleEvent(Entity* entity, EDeath event) void handleEvent(Entity* entity, EDeath event)
{ {
CTargetPartent* parent = entity.getComponent!CTargetPartent; CTargetParent* parent = entity.getComponent!CTargetParent;
if(parent) if(parent)
{ {
launcher.manager.sendEvent(parent.parent, EDestroyedChild(entity.id)); launcher.manager.sendEvent(parent.parent, EDestroyedChild(entity.id));
@ -1605,15 +1731,52 @@ struct PartsDestroySystem
CParts[] parts; CParts[] parts;
} }
EntityTemplate* flashes_emitter;
void onCreate()
{
flashes_emitter = launcher.manager.allocateTemplate(
[
CVelocity.component_id, CLocation.component_id, CParticleEmitter.component_id,
CParticleEmitterTime.component_id, CTargetParent.component_id
].staticArray);
*flashes_emitter.getComponent!CParticleEmitter() = CParticleEmitter(vec2(0,0), vec2(400,400), 0);
}
void handleEvent(Entity* entity, EDestroyedChild event) void handleEvent(Entity* entity, EDestroyedChild event)
{ {
CParts* parts = entity.getComponent!CParts; CParts* parts = entity.getComponent!CParts;
parts.count--; parts.count--;
CInit* init = entity.getComponent!CInit;
if(init.type == CInit.Type.boss)
{
CChildren* children = entity.getComponent!CChildren;
foreach(EntityID child; children.childern)
{
if(child == event.id)
{
Entity* child_entity = launcher.manager.getEntity(child);
if(child_entity)
{
CTargetParent* target_parent = child_entity.getComponent!CTargetParent;
*flashes_emitter.getComponent!CTargetParent() = *target_parent;
launcher.manager.addEntity(flashes_emitter);
}
break;
}
}
}
if(parts.count == 0) if(parts.count == 0)
{
if(init.type == CInit.Type.boss)
{ {
launcher.manager.addComponents(entity.id, CHitPoints(100), CShootGrid()); launcher.manager.addComponents(entity.id, CHitPoints(100), CShootGrid());
} }
} }
}
} }
struct ClampPositionSystem struct ClampPositionSystem
@ -2033,7 +2196,7 @@ void spaceInvadersStart()
launcher.manager.registerComponent!CScale; launcher.manager.registerComponent!CScale;
launcher.manager.registerComponent!CShootDirection; launcher.manager.registerComponent!CShootDirection;
launcher.manager.registerComponent!CAutoShoot; launcher.manager.registerComponent!CAutoShoot;
launcher.manager.registerComponent!CLaserWeapon; launcher.manager.registerComponent!CWeapon;
launcher.manager.registerComponent!CVelocity; launcher.manager.registerComponent!CVelocity;
launcher.manager.registerComponent!CLaser; launcher.manager.registerComponent!CLaser;
launcher.manager.registerComponent!CSideMove; launcher.manager.registerComponent!CSideMove;
@ -2049,7 +2212,7 @@ void spaceInvadersStart()
launcher.manager.registerComponent!CRotation; launcher.manager.registerComponent!CRotation;
launcher.manager.registerComponent!CAnimationLooped; launcher.manager.registerComponent!CAnimationLooped;
launcher.manager.registerComponent!CDamping; launcher.manager.registerComponent!CDamping;
launcher.manager.registerComponent!CTargetPartent; launcher.manager.registerComponent!CTargetParent;
launcher.manager.registerComponent!CTarget; launcher.manager.registerComponent!CTarget;
launcher.manager.registerComponent!CTargetPlayerShip; launcher.manager.registerComponent!CTargetPlayerShip;
launcher.manager.registerComponent!CChildren; launcher.manager.registerComponent!CChildren;
@ -2066,6 +2229,7 @@ void spaceInvadersStart()
launcher.manager.registerEvent!EUpgrade; launcher.manager.registerEvent!EUpgrade;
launcher.manager.registerEvent!EDeath; launcher.manager.registerEvent!EDeath;
launcher.manager.registerEvent!EDestroyedChild; launcher.manager.registerEvent!EDestroyedChild;
launcher.manager.registerEvent!EBulletHit;
//launcher.manager.registerSystem!MoveSystem(0); //launcher.manager.registerSystem!MoveSystem(0);
launcher.manager.registerSystem!DrawSystem(100); launcher.manager.registerSystem!DrawSystem(100);
@ -2087,6 +2251,7 @@ void spaceInvadersStart()
launcher.manager.registerSystem!MoveToParentTargetSystem(99); launcher.manager.registerSystem!MoveToParentTargetSystem(99);
launcher.manager.registerSystem!ParentOwnerSystem(-101); launcher.manager.registerSystem!ParentOwnerSystem(-101);
launcher.manager.registerSystem!ShipWeaponSystem(-100); launcher.manager.registerSystem!ShipWeaponSystem(-100);
launcher.manager.registerSystem!ParticleEmittingSystem(-100);
launcher.manager.registerSystem!RotateToTargetSystem(-100); launcher.manager.registerSystem!RotateToTargetSystem(-100);
launcher.manager.registerSystem!ShipTargetSystem(-110); launcher.manager.registerSystem!ShipTargetSystem(-110);
@ -2125,7 +2290,7 @@ void spaceInvadersStart()
CShootDirection.component_id, CShootGrid.component_id, CGuild.component_id, CShootDirection.component_id, CShootGrid.component_id, CGuild.component_id,
CDamping.component_id, CChildren.component_id, CInit.component_id].staticArray CDamping.component_id, CChildren.component_id, CInit.component_id].staticArray
); );
//CLaserWeapon* weapon = space_invaders.ship_tmpl.getComponent!CLaserWeapon; //CWeapon* weapon = space_invaders.ship_tmpl.getComponent!CWeapon;
//weapon.level = 3; //weapon.level = 3;
space_invaders.ship_tmpl.getComponent!CTexture().coords = vec4(0*px,80*px,48*px,32*px); space_invaders.ship_tmpl.getComponent!CTexture().coords = vec4(0*px,80*px,48*px,32*px);
space_invaders.ship_tmpl.getComponent!CScale().value = vec2(48,32); space_invaders.ship_tmpl.getComponent!CScale().value = vec2(48,32);
@ -2203,7 +2368,7 @@ void spaceInvadersStart()
space_invaders.enemy_tmpl = launcher.manager.allocateTemplate( space_invaders.enemy_tmpl = launcher.manager.allocateTemplate(
[CWeaponLocation.component_id, CHitMark.component_id, CHitPoints.component_id, [CWeaponLocation.component_id, CHitMark.component_id, CHitPoints.component_id,
CVelocity.component_id, CAutoShoot.component_id, CLocation.component_id, CVelocity.component_id, CAutoShoot.component_id, CLocation.component_id,
CTexture.component_id, CScale.component_id, CLaserWeapon.component_id, CTexture.component_id, CScale.component_id, CWeapon.component_id,
CEnemy.component_id, CShootDirection.component_id, CShootGrid.component_id, CEnemy.component_id, CShootDirection.component_id, CShootGrid.component_id,
CGuild.component_id].staticArray CGuild.component_id].staticArray
); );
@ -2298,10 +2463,10 @@ void spaceInvadersTool(vec2 position, Tool tool, int size)
else if(position.y > 299)position.y = 299; else if(position.y > 299)position.y = 299;
*location = position; *location = position;
} }
CLaserWeapon* laser_weapon = tmpl.getComponent!CLaserWeapon; CWeapon* laser_weapon = tmpl.getComponent!CWeapon;
if(laser_weapon) if(laser_weapon)
{ {
laser_weapon.shoot_time = randomf * CLaserWeapon.levels[laser_weapon.level - 1].reload_time; laser_weapon.shoot_time = randomf * CWeapon.levels[laser_weapon.level - 1].reload_time;
} }
launcher.manager.addEntity(tmpl); launcher.manager.addEntity(tmpl);
} }

View file

@ -114,7 +114,7 @@ struct Renderer
void freeBlocks() void freeBlocks()
{ {
block_stack_mutex.lock(); /*block_stack_mutex.lock();
render_blocks = 0; render_blocks = 0;
current_block = 0; current_block = 0;
foreach(VertexBlock block; blocks) foreach(VertexBlock block; blocks)
@ -124,13 +124,38 @@ struct Renderer
blocks.clear; blocks.clear;
prepared_items=0; prepared_items=0;
draw_list.clear(); draw_list.clear();
block_stack_mutex.unlock(); block_stack_mutex.unlock();*/
foreach(ref Thread thread; threads)
{
foreach(VertexBlock block; thread.blocks)
{
allocator.freeBlock(block.memory);
}
thread.blocks.clear();
}
render_blocks = 0;
current_block = 0;
prepared_items = 0;
draw_list.clear();
} }
void pushData() void pushData()
{ {
foreach(ref Thread thread; threads)
{
foreach(VertexBlock block; thread.blocks)
{
uint items = block.items;
if(items + item_id >= MaxObjects)items = MaxObjects - item_id;
batch_vbo[0].bufferSubData(Buffer.BindTarget.array,items*4*14,item_id*4*14,block.batch_vertices.ptr);
batch_ibo[0].bufferSubData(Buffer.BindTarget.element_array,items*2*6,item_id*2*6,block.batch_indices.ptr);
draw_list.add(DrawCall(item_id,items));
item_id += items;
}
//thread.blocks.clear();
}
//if(!isRemainingBlocks())return; //if(!isRemainingBlocks())return;
while(isRemainingBlocks()) /* while(isRemainingBlocks())
{ {
VertexBlock block = fetchBlock(); VertexBlock block = fetchBlock();
uint items = block.items; uint items = block.items;
@ -139,14 +164,15 @@ struct Renderer
batch_ibo[0].bufferSubData(Buffer.BindTarget.element_array,items*2*6,item_id*2*6,block.batch_indices.ptr); batch_ibo[0].bufferSubData(Buffer.BindTarget.element_array,items*2*6,item_id*2*6,block.batch_indices.ptr);
draw_list.add(DrawCall(item_id,items)); draw_list.add(DrawCall(item_id,items));
item_id += items; item_id += items;
} }*/
} }
void pushThreadsBlocks() void pushThreadsBlocks()
{ {
foreach(i, ref Thread thread; threads) foreach(i, ref Thread thread; threads)
{ {
pushBlock(thread.block); //pushBlock(thread.block);
thread.blocks.add(thread.block);
thread.block = getBlock(); thread.block = getBlock();
} }
} }
@ -156,6 +182,7 @@ struct Renderer
//Vector!VertexBlock block; //Vector!VertexBlock block;
RenderData[] render_list; RenderData[] render_list;
VertexBlock block; VertexBlock block;
Vector!VertexBlock blocks;
} }
Thread[] threads; Thread[] threads;
@ -609,7 +636,8 @@ struct Renderer
threads[thread_id].block.items++; threads[thread_id].block.items++;
if(threads[thread_id].block.items >= VertexBlock.max_items) if(threads[thread_id].block.items >= VertexBlock.max_items)
{ {
pushBlock(threads[thread_id].block); //pushBlock(threads[thread_id].block);
threads[thread_id].blocks.add(threads[thread_id].block);
threads[thread_id].block = getBlock(); threads[thread_id].block = getBlock();
} }
} }