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); } } } } } }