-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)
616 lines
No EOL
21 KiB
D
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);
|
|
}
|
|
}
|
|
}
|
|
}*/
|
|
}
|
|
} |