178 lines
No EOL
5.4 KiB
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);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
} |