bubel-ecs/demos/source/game_core/rendering.d
Mergul b0b64b965f Demos update
-added some new types to gui manager + some fixes
-TexCoordsManager now working (probably)
-added CRenderDefault components which makes entities without texcoords possible to draw
-makes better way of binding demos to launcher
-moved some registration related to rendering to one function (basic components + draw system)
-added Sandbox demo (demo which takes all demos to one demo)
-extends ParticlesDemo play area
-added BirckBreaker demo (WIP)
-added special material to additive particles
-added whole bunch of rendering code to rendering module
-added ability to show filtered entities (blinking)
2020-07-01 19:45:53 +02:00

616 lines
No EOL
21 KiB
D

module game_core.rendering;
import bubel.ecs.attributes;
import bubel.ecs.core;
import bubel.ecs.std;
import ecs_utils.gfx.texture;
import ecs_utils.math.vector;
import game_core.basic;
void registerRenderingModule(EntityManager* manager)
{
manager.registerComponent!CLocation;
manager.registerComponent!CScale;
manager.registerComponent!CRotation;
manager.registerComponent!CDepth;
manager.registerComponent!CColor;
manager.registerComponent!CSelected;
manager.registerComponent!CTexCoords;
manager.registerComponent!CTexCoordsIndex;
manager.registerComponent!CMaterialIndex;
manager.registerComponent!CDrawDefault;
manager.registerSystem!DrawSystem(100);
}
struct CTexCoords
{
mixin ECS.Component;
alias value this;///use component as it value
vec4 value;
}
struct CTexCoordsIndex
{
mixin ECS.Component;
alias value this;
ushort value;
}
struct CMaterialIndex
{
mixin ECS.Component;
alias value this;
ushort value;
}
struct CDrawDefault
{
mixin ECS.Component;
}
struct TexCoordsManager
{
import bubel.ecs.vector;
import bubel.ecs.hash_map;
__gshared TexCoordsManager* instance = null;
static void initialize()
{
if(instance is null)instance = Mallocator.make!TexCoordsManager;
}
static void destroy()
{
if(instance)Mallocator.dispose(instance);
instance = null;
}
vec4 get(ushort index)
{
if(index > coords.length)return vec4(0,0,1,1);
else return coords[index];
}
ushort getCoordIndex(vec4 coords)
{
ushort ret = coords_map.get(coords, ushort.max);
if(ret != ushort.max)
{
return ret;
}
this.coords.add(coords);
coords_map.add(coords, cast(ushort)(this.coords.length - 1));
return cast(ushort)(this.coords.length - 1);
}
Vector!vec4 coords;
HashMap!(vec4,ushort) coords_map;
}
struct DrawSystem
{
mixin ECS.System!32;
import ecs_utils.gfx.renderer : Renderer;
struct EntitiesData
{
uint length;
//uint thread_id;
uint job_id;
const(Entity)[] entity;
@readonly CLocation[] locations;
@readonly @optional CScale[] scale;
// @readonly CTexCoords[] texcoord;
@readonly @optional CTexCoords[] texcoord;
@readonly @optional CTexCoordsIndex[] texcoord_index;
@readonly @optional CRotation[] rotation;
@readonly @optional CDepth[] depth;
@readonly @optional CColor[] color;
@readonly @optional CMaterialIndex[] material;
@readonly @optional CDrawDefault[] draw_default;
}
Renderer.DrawData default_data;
float color_time = 0;
uint select_color = 0;
bool onBegin()
{
import app : launcher;
color_time += launcher.delta_time * 0.001;
color_time = color_time - cast(int)(color_time*0.5)*2;
float ratio = color_time - cast(int)color_time;
if(color_time > 1)ratio = 1 - ratio;
uint multipler = cast(uint)(0x60 * ratio);
select_color = 0xA0A0A0A0 + cast(uint)(0x01010101 * multipler);
return true;
}
void onUpdate(EntitiesData data)
{
import app : launcher;
if(launcher.renderer.prepared_items >= launcher.renderer.MaxObjects)return;//simple leave loop if max visible objects count was reached
Renderer.DrawData draw_data = default_data;
draw_data.thread_id = data.job_id;
if(launcher.show_filtered && launcher.filterEntity(data.entity[0]))
{
draw_data.color = select_color;
data.color = null;
}
//import std.stdio;
//writeln(data.draw_default);
//if(data.draw_default is null && data.texcoord is null && data.texcoord_index is null && !data.entity[0].hasComponent(CDrawDefault.component_id))return;
if(data.texcoord is null && data.texcoord_index is null && data.draw_default is null)return;
foreach(i; 0..data.length)
{
draw_data.position = data.locations[i];
if(data.color)draw_data.color = data.color[i];
if(data.depth)draw_data.depth = data.depth[i];
if(data.rotation)draw_data.angle = data.rotation[i];
if(data.scale)draw_data.size = data.scale[i];
if(data.texcoord)draw_data.coords = data.texcoord[i];
else if(data.texcoord_index)draw_data.coords = TexCoordsManager.instance.get(data.texcoord_index[i]);
if(data.material)draw_data.material_id = data.material[i];
launcher.renderer.draw(draw_data);
}//*/
/*
ubyte mode;
if(data.scale)mode |= 0x01;
if(data.texcoord)mode |= 0x02;
if(data.texcoord_index)mode |= 0x04;
if(data.rotation)mode |= 0x08;
if(data.depth)mode |= 0x10;
if(data.color)mode |= 0x20;
if(launcher.show_filtered && launcher.filterEntity(data.entity[0]))
{
draw_data.color = select_color;
mode &= ~0x20;
//goto draw_nocolor;
}
switch(mode)
{
case 0:
foreach(i; 0..data.length)
{
draw_data.position = data.locations[i];
launcher.renderer.draw(draw_data);
}
break;
case 0b000001:
foreach(i; 0..data.length)
{
draw_data.position = data.locations[i];
draw_data.size = data.scale[i];
launcher.renderer.draw(draw_data);
}
break;
case 0b000010:
foreach(i; 0..data.length)
{
draw_data.position = data.locations[i];
draw_data.coords = data.texcoord[i];
launcher.renderer.draw(draw_data);
}
break;
case 0b000011:
foreach(i; 0..data.length)
{
draw_data.position = data.locations[i];
draw_data.size = data.scale[i];
draw_data.coords = data.texcoord[i];
launcher.renderer.draw(draw_data);
}
break;
case 0b001000:
foreach(i; 0..data.length)
{
draw_data.position = data.locations[i];
draw_data.angle = data.rotation[i];
launcher.renderer.draw(draw_data);
}
break;
case 0b001001:
foreach(i; 0..data.length)
{
draw_data.position = data.locations[i];
draw_data.angle = data.rotation[i];
draw_data.size = data.scale[i];
launcher.renderer.draw(draw_data);
}
break;
case 0b001010:
foreach(i; 0..data.length)
{
draw_data.position = data.locations[i];
draw_data.angle = data.rotation[i];
draw_data.coords = data.texcoord[i];
launcher.renderer.draw(draw_data);
}
break;
case 0b001011:
foreach(i; 0..data.length)
{
draw_data.position = data.locations[i];
draw_data.angle = data.rotation[i];
draw_data.size = data.scale[i];
draw_data.coords = data.texcoord[i];
launcher.renderer.draw(draw_data);
}
break;
case 0b010000:
foreach(i; 0..data.length)
{
draw_data.position = data.locations[i];
draw_data.depth = data.depth[i];
launcher.renderer.draw(draw_data);
}
break;
case 0b010001:
foreach(i; 0..data.length)
{
draw_data.position = data.locations[i];
draw_data.depth = data.depth[i];
draw_data.size = data.scale[i];
launcher.renderer.draw(draw_data);
}
break;
case 0b010010:
foreach(i; 0..data.length)
{
draw_data.position = data.locations[i];
draw_data.depth = data.depth[i];
draw_data.coords = data.texcoord[i];
launcher.renderer.draw(draw_data);
}
break;
case 0b010011:
foreach(i; 0..data.length)
{
draw_data.position = data.locations[i];
draw_data.depth = data.depth[i];
draw_data.size = data.scale[i];
draw_data.coords = data.texcoord[i];
launcher.renderer.draw(draw_data);
}
break;
case 0b011000:
foreach(i; 0..data.length)
{
draw_data.position = data.locations[i];
draw_data.depth = data.depth[i];
draw_data.angle = data.rotation[i];
launcher.renderer.draw(draw_data);
}
break;
case 0b011001:
foreach(i; 0..data.length)
{
draw_data.position = data.locations[i];
draw_data.depth = data.depth[i];
draw_data.angle = data.rotation[i];
draw_data.size = data.scale[i];
launcher.renderer.draw(draw_data);
}
break;
case 0b011010:
foreach(i; 0..data.length)
{
draw_data.position = data.locations[i];
draw_data.depth = data.depth[i];
draw_data.angle = data.rotation[i];
draw_data.coords = data.texcoord[i];
launcher.renderer.draw(draw_data);
}
break;
case 0b011011:
foreach(i; 0..data.length)
{
draw_data.position = data.locations[i];
draw_data.depth = data.depth[i];
draw_data.angle = data.rotation[i];
draw_data.size = data.scale[i];
draw_data.coords = data.texcoord[i];
launcher.renderer.draw(draw_data);
}
break;
case 0b100000:
foreach(i; 0..data.length)
{
draw_data.position = data.locations[i];
draw_data.color = data.color[i];
launcher.renderer.draw(draw_data);
}
break;
case 0b100001:
foreach(i; 0..data.length)
{
draw_data.position = data.locations[i];
draw_data.color = data.color[i];
draw_data.size = data.scale[i];
launcher.renderer.draw(draw_data);
}
break;
case 0b100010:
foreach(i; 0..data.length)
{
draw_data.position = data.locations[i];
draw_data.color = data.color[i];
draw_data.coords = data.texcoord[i];
launcher.renderer.draw(draw_data);
}
break;
case 0b100011:
foreach(i; 0..data.length)
{
draw_data.position = data.locations[i];
draw_data.color = data.color[i];
draw_data.size = data.scale[i];
draw_data.coords = data.texcoord[i];
launcher.renderer.draw(draw_data);
}
break;
case 0b101000:
foreach(i; 0..data.length)
{
draw_data.position = data.locations[i];
draw_data.color = data.color[i];
draw_data.angle = data.rotation[i];
launcher.renderer.draw(draw_data);
}
break;
case 0b101001:
foreach(i; 0..data.length)
{
draw_data.position = data.locations[i];
draw_data.color = data.color[i];
draw_data.angle = data.rotation[i];
draw_data.size = data.scale[i];
launcher.renderer.draw(draw_data);
}
break;
case 0b101010:
foreach(i; 0..data.length)
{
draw_data.position = data.locations[i];
draw_data.color = data.color[i];
draw_data.angle = data.rotation[i];
draw_data.coords = data.texcoord[i];
launcher.renderer.draw(draw_data);
}
break;
case 0b101011:
foreach(i; 0..data.length)
{
draw_data.position = data.locations[i];
draw_data.color = data.color[i];
draw_data.angle = data.rotation[i];
draw_data.size = data.scale[i];
draw_data.coords = data.texcoord[i];
launcher.renderer.draw(draw_data);
}
break;
case 0b110000:
foreach(i; 0..data.length)
{
draw_data.position = data.locations[i];
draw_data.color = data.color[i];
draw_data.depth = data.depth[i];
launcher.renderer.draw(draw_data);
}
break;
case 0b110001:
foreach(i; 0..data.length)
{
draw_data.position = data.locations[i];
draw_data.color = data.color[i];
draw_data.depth = data.depth[i];
draw_data.size = data.scale[i];
launcher.renderer.draw(draw_data);
}
break;
case 0b110010:
foreach(i; 0..data.length)
{
draw_data.position = data.locations[i];
draw_data.color = data.color[i];
draw_data.depth = data.depth[i];
draw_data.coords = data.texcoord[i];
launcher.renderer.draw(draw_data);
}
break;
case 0b110011:
foreach(i; 0..data.length)
{
draw_data.position = data.locations[i];
draw_data.color = data.color[i];
draw_data.depth = data.depth[i];
draw_data.size = data.scale[i];
draw_data.coords = data.texcoord[i];
launcher.renderer.draw(draw_data);
}
break;
case 0b111000:
foreach(i; 0..data.length)
{
draw_data.position = data.locations[i];
draw_data.color = data.color[i];
draw_data.depth = data.depth[i];
draw_data.angle = data.rotation[i];
launcher.renderer.draw(draw_data);
}
break;
case 0b111001:
foreach(i; 0..data.length)
{
draw_data.position = data.locations[i];
draw_data.color = data.color[i];
draw_data.depth = data.depth[i];
draw_data.angle = data.rotation[i];
draw_data.size = data.scale[i];
launcher.renderer.draw(draw_data);
}
break;
case 0b111010:
foreach(i; 0..data.length)
{
draw_data.position = data.locations[i];
draw_data.color = data.color[i];
draw_data.depth = data.depth[i];
draw_data.angle = data.rotation[i];
draw_data.coords = data.texcoord[i];
launcher.renderer.draw(draw_data);
}
break;
case 0b111011:
foreach(i; 0..data.length)
{
draw_data.position = data.locations[i];
draw_data.color = data.color[i];
draw_data.depth = data.depth[i];
draw_data.angle = data.rotation[i];
draw_data.size = data.scale[i];
draw_data.coords = data.texcoord[i];
launcher.renderer.draw(draw_data);
}
break;
default:break;
}//*/
/*
if(!data.color)
{
draw_nocolor:
if(!data.depth)
{
if(!data.rotation)
{
foreach(i; 0..data.length)
{
draw_data.coords = data.texcoord[i];
draw_data.size = data.scale[i];
draw_data.position = data.locations[i];
launcher.renderer.draw(draw_data);
}
}
else
{
foreach(i; 0..data.length)
{
draw_data.angle = data.rotation[i];
draw_data.coords = data.texcoord[i];
draw_data.size = data.scale[i];
draw_data.position = data.locations[i];
launcher.renderer.draw(draw_data);
}
}
}
else
{
if(!data.rotation)
{
foreach(i; 0..data.length)
{
draw_data.depth = data.depth[i];
draw_data.coords = data.texcoord[i];
draw_data.size = data.scale[i];
draw_data.position = data.locations[i];
launcher.renderer.draw(draw_data);
}
}
else
{
foreach(i; 0..data.length)
{
draw_data.depth = data.depth[i];
draw_data.angle = data.rotation[i];
draw_data.coords = data.texcoord[i];
draw_data.size = data.scale[i];
draw_data.position = data.locations[i];
launcher.renderer.draw(draw_data);
}
}
}
}
else
{
if(!data.depth)
{
if(!data.rotation)
{
foreach(i; 0..data.length)
{
draw_data.color = data.color[i];
draw_data.coords = data.texcoord[i];
draw_data.size = data.scale[i];
draw_data.position = data.locations[i];
launcher.renderer.draw(draw_data);
}
}
else
{
foreach(i; 0..data.length)
{
draw_data.color = data.color[i];
draw_data.angle = data.rotation[i];
draw_data.coords = data.texcoord[i];
draw_data.size = data.scale[i];
draw_data.position = data.locations[i];
launcher.renderer.draw(draw_data);
}
}
}
else
{
if(!data.rotation)
{
foreach(i; 0..data.length)
{
draw_data.depth = data.depth[i];
draw_data.color = data.color[i];
draw_data.coords = data.texcoord[i];
draw_data.size = data.scale[i];
draw_data.position = data.locations[i];
launcher.renderer.draw(draw_data);
}
}
else
{
foreach(i; 0..data.length)
{
draw_data.depth = data.depth[i];
draw_data.color = data.color[i];
draw_data.coords = data.texcoord[i];
draw_data.size = data.scale[i];
draw_data.position = data.locations[i];
launcher.renderer.draw(draw_data);
}
}
}
}*/
}
}