Make common draw system, moved some components to basic components and fixed bug with GUI for signed short integers

This commit is contained in:
Mergul 2020-06-12 20:51:05 +02:00
parent 3a7a5b2a21
commit d733bb514c
5 changed files with 326 additions and 86 deletions

View file

@ -0,0 +1,178 @@
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);
}
}
}
}
}
}