bubel-ecs/demos/source/game_core/rendering.d

178 lines
No EOL
5.4 KiB
D

module game_core.rendering;
import bubel.ecs.core;
import bubel.ecs.attributes;
import ecs_utils.math.vector;
import ecs_utils.gfx.texture;
import game_core.basic;
struct CTexCoords
{
mixin ECS.Component;
alias value this;///use component as it value
vec4 value;
}
struct CTexCoordsIndex
{
mixin ECS.Component;
ushort value;
}
struct TexCoordsManager
{
import bubel.ecs.vector;
import bubel.ecs.hash_map;
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;
@readonly CLocation[] locations;
@readonly 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;
}
Renderer.DrawData default_data;
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(!data.depth)
{
if(!data.color)
{
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.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.color)
{
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.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.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);
}
}
}
}
}
}