Slightly changed rendering code

-renderer draw function now takes struct instead of multiple parameters
This commit is contained in:
Mergul 2020-06-12 14:53:59 +02:00
parent 8cba2626be
commit 3a7a5b2a21
5 changed files with 199 additions and 72 deletions

View file

@ -134,19 +134,30 @@ struct DrawSystem
void onUpdate(EntitiesData data) void onUpdate(EntitiesData data)
{ {
if(launcher.renderer.prepared_items >= launcher.renderer.MaxObjects)return;//simple leave loop if max visible objects count was reached if(launcher.renderer.prepared_items >= launcher.renderer.MaxObjects)return;//simple leave loop if max visible objects count was reached
import ecs_utils.gfx.renderer;
Renderer.DrawData draw_data;
draw_data.size = vec2(2,2);
draw_data.coords = vec4(246,64,2,2)*px;
draw_data.color = 0x80808080;
draw_data.material_id = 2;
draw_data.thread_id = data.job_id;
draw_data.texture = particles_demo.texture;
if(!data.color) if(!data.color)
{ {
foreach(i; 0..data.length) foreach(i; 0..data.length)
{ {
launcher.renderer.draw(particles_demo.texture, data.locations[i], vec2(2,2), vec4(246,64,2,2)*px, 0, 0x80808080, 0, 2, 0, data.job_id); draw_data.position = data.locations[i];
launcher.renderer.draw(draw_data);//particles_demo.texture, data.locations[i], vec2(2,2), vec4(246,64,2,2)*px, 0, 0x80808080, 0, 2, 0, data.job_id);
} }
} }
else else
{ {
foreach(i; 0..data.length) foreach(i; 0..data.length)
{ {
launcher.renderer.draw(particles_demo.texture, data.locations[i], vec2(2,2), vec4(246,64,2,2)*px, 0, data.color[i].value, 0, 2, 0, data.job_id); draw_data.position = data.locations[i];
draw_data.color = data.color[i].value;
launcher.renderer.draw(draw_data);//particles_demo.texture, data.locations[i], vec2(2,2), vec4(246,64,2,2)*px, 0, data.color[i].value, 0, 2, 0, data.job_id);
} }
} }

View file

@ -52,9 +52,21 @@ struct DrawSystem
void onUpdate(EntitiesData data) void onUpdate(EntitiesData data)
{ {
if(launcher.renderer.prepared_items >= launcher.renderer.MaxObjects)return;//simple leave loop if max visible objects count was reached if(launcher.renderer.prepared_items >= launcher.renderer.MaxObjects)return;//simple leave loop if max visible objects count was reached
import ecs_utils.gfx.renderer;
Renderer.DrawData draw_data;
draw_data.size = vec2(16,16);
draw_data.coords = vec4(0,0,1,1);
draw_data.color = 0x80808080;
draw_data.material_id = 0;
draw_data.thread_id = data.job_id;
draw_data.texture = simple.texture;
foreach(i; 0..data.length) foreach(i; 0..data.length)
{ {
launcher.renderer.draw(simple.texture, data.locations[i], vec2(16,16), vec4(0,0,1,1), cast(ushort)(data.locations[i].y), 0x80808080, 0, 0, 0, data.job_id); draw_data.position = data.locations[i];
draw_data.depth = cast(ushort)(data.locations[i].y);
launcher.renderer.draw(draw_data);
//launcher.renderer.draw(simple.texture, data.locations[i], vec2(16,16), vec4(0,0,1,1), cast(ushort)(data.locations[i].y), 0x80808080, 0, 0, 0, data.job_id);
// launcher.renderer.draw(data.textures[i].tex, data.locations[i].location, vec2(16,16), vec4(0,0,1,1), 0, 0x80808080, 0, 0, 0, data.job_id); // launcher.renderer.draw(data.textures[i].tex, data.locations[i].location, vec2(16,16), vec4(0,0,1,1), 0, 0x80808080, 0, 0, 0, data.job_id);
//draw(renderer, data.textures[i].tex, data.locations[i], vec2(32,32), vec4(0,0,1,1)); //draw(renderer, data.textures[i].tex, data.locations[i], vec2(32,32), vec4(0,0,1,1));
} }

View file

@ -348,9 +348,21 @@ struct AnimationRenderSystem
void onUpdate(EntitiesData data) void onUpdate(EntitiesData data)
{ {
import ecs_utils.gfx.renderer;
Renderer.DrawData draw_data;
draw_data.size = vec2(16,16);
//draw_data.coords = vec4(0,0,1,1)*px;
draw_data.color = 0x80808080;
draw_data.material_id = 0;
draw_data.thread_id = 0;
draw_data.texture = snake.texture;
draw_data.depth = -1;
foreach(i;0..data.length) foreach(i;0..data.length)
{ {
launcher.renderer.draw(snake.texture, cast(vec2)cast(ivec2)data.location[i], vec2(16,16), data.animation[i].frames[cast(int)(data.animation[i].time)], -1, 0x80808080); draw_data.position = data.location[i];
draw_data.coords = data.animation[i].frames[cast(int)(data.animation[i].time)];
launcher.renderer.draw(draw_data);
//launcher.renderer.draw(snake.texture, cast(vec2)cast(ivec2)data.location[i], vec2(16,16), data.animation[i].frames[cast(int)(data.animation[i].time)], -1, 0x80808080);
} }
} }
} }
@ -649,9 +661,19 @@ struct DrawAppleSystem
void onUpdate(EntitiesData data) void onUpdate(EntitiesData data)
{ {
import ecs_utils.gfx.renderer;
Renderer.DrawData draw_data;
draw_data.size = vec2(16,16);
draw_data.coords = vec4(0,32*px,16*px,16*px);
draw_data.color = 0x80808080;
draw_data.material_id = 0;
draw_data.thread_id = 0;
draw_data.texture = snake.texture;
foreach(i; 0..data.location.length) foreach(i; 0..data.location.length)
{ {
launcher.renderer.draw(snake.texture, vec2(data.location[i].x*16,data.location[i].y*16), vec2(16,16), vec4(0,32*px,16*px,16*px), 0, 0x80808080, 0); draw_data.position = vec2(data.location[i].x*16,data.location[i].y*16);
launcher.renderer.draw(draw_data);
//launcher.renderer.draw(snake.texture, vec2(data.location[i].x*16,data.location[i].y*16), vec2(16,16), vec4(0,32*px,16*px,16*px), 0, 0x80808080, 0);
} }
} }
} }
@ -719,34 +741,49 @@ struct DrawSnakeSystem
static void drawElement(ivec2 loc, SnakePart part) static void drawElement(ivec2 loc, SnakePart part)
{ {
import ecs_utils.gfx.renderer;
Renderer.DrawData draw_data;
draw_data.size = vec2(16,16);
draw_data.color = 0x80808080;
draw_data.texture = snake.texture;
draw_data.position = cast(vec2)loc;
final switch(cast(ubyte)part) final switch(cast(ubyte)part)
{ {
case SnakePart.tail_up:launcher.renderer.draw(.snake.texture, cast(vec2)loc, vec2(16,16), vec4(16,112,16,16)*px, 0, 0x80808080, 0);break; case SnakePart.tail_up:draw_data.coords = vec4(16,112,16,16)*px;break;
case SnakePart.tail_down:launcher.renderer.draw(.snake.texture, cast(vec2)loc, vec2(16,16), vec4(0,112,16,16)*px, 0, 0x80808080, 0);break; case SnakePart.tail_down:draw_data.coords = vec4(0,112,16,16)*px;break;
case SnakePart.tail_left:launcher.renderer.draw(.snake.texture, cast(vec2)loc, vec2(16,16), vec4(32,112,16,16)*px, 0, 0x80808080, 0);break; case SnakePart.tail_left:draw_data.coords = vec4(32,112,16,16)*px;break;
case SnakePart.tail_right:launcher.renderer.draw(.snake.texture, cast(vec2)loc, vec2(16,16), vec4(0,144,16,16)*px, 0, 0x80808080, 0);break; case SnakePart.tail_right:draw_data.coords = vec4(0,144,16,16)*px;break;
case SnakePart.turn_ld:launcher.renderer.draw(.snake.texture, cast(vec2)loc, vec2(16,16), vec4(64,128,16,16)*px, 0, 0x80808080, 0);break; case SnakePart.turn_ld:draw_data.coords = vec4(64,128,16,16)*px;break;
case SnakePart.turn_lu:launcher.renderer.draw(.snake.texture, cast(vec2)loc, vec2(16,16), vec4(32,144,16,16)*px, 0, 0x80808080, 0);break; case SnakePart.turn_lu:draw_data.coords = vec4(32,144,16,16)*px;break;
case SnakePart.turn_rd:launcher.renderer.draw(.snake.texture, cast(vec2)loc, vec2(16,16), vec4(16,144,16,16)*px, 0, 0x80808080, 0);break; case SnakePart.turn_rd:draw_data.coords = vec4(16,144,16,16)*px;break;
case SnakePart.turn_ru:launcher.renderer.draw(.snake.texture, cast(vec2)loc, vec2(16,16), vec4(64,112,16,16)*px, 0, 0x80808080, 0);break; case SnakePart.turn_ru:draw_data.coords = vec4(64,112,16,16)*px;break;
case SnakePart.vertical:launcher.renderer.draw(.snake.texture, cast(vec2)loc, vec2(16,16), vec4(16,128,16,16)*px, 0, 0x80808080, 0);break; case SnakePart.vertical:draw_data.coords = vec4(16,128,16,16)*px;break;
case SnakePart.horizontal:launcher.renderer.draw(.snake.texture, cast(vec2)loc, vec2(16,16), vec4(48,128,16,16)*px, 0, 0x80808080, 0);break; case SnakePart.horizontal:draw_data.coords = vec4(48,128,16,16)*px;break;
} }
launcher.renderer.draw(draw_data);
} }
void onUpdate(EntitiesData data) void onUpdate(EntitiesData data)
{ {
import ecs_utils.gfx.renderer;
Renderer.DrawData draw_data;
draw_data.size = vec2(16,16);
draw_data.color = 0x80808080;
draw_data.texture = snake.texture;
foreach(i; 0..data.length) foreach(i; 0..data.length)
{ {
const (CSnake)* snake = &data.snake[i]; const (CSnake)* snake = &data.snake[i];
scope vec2 loc = cast(vec2)(data.location[i].location * 16); scope vec2 loc = cast(vec2)(data.location[i].location * 16);
draw_data.position = loc;
final switch(snake.direction) final switch(snake.direction)
{ {
case CMovement.Direction.up:launcher.renderer.draw(.snake.texture, vec2(data.location[i].x*16,data.location[i].y*16), vec2(16,16), vec4(48,112,16,16)*px, 0, 0x80808080, 0);break; case CMovement.Direction.up:draw_data.coords = vec4(48,112,16,16)*px;break;
case CMovement.Direction.down:launcher.renderer.draw(.snake.texture, vec2(data.location[i].x*16,data.location[i].y*16), vec2(16,16), vec4(48,144,16,16)*px, 0, 0x80808080, 0);break; case CMovement.Direction.down:draw_data.coords = vec4(48,144,16,16)*px;break;
case CMovement.Direction.left:launcher.renderer.draw(.snake.texture, vec2(data.location[i].x*16,data.location[i].y*16), vec2(16,16), vec4(0,128,16,16)*px, 0, 0x80808080, 0);break; case CMovement.Direction.left:draw_data.coords = vec4(0,128,16,16)*px;break;
case CMovement.Direction.right:launcher.renderer.draw(.snake.texture, vec2(data.location[i].x*16,data.location[i].y*16), vec2(16,16), vec4(32,128,16,16)*px, 0, 0x80808080, 0);break; case CMovement.Direction.right:draw_data.coords = vec4(32,128,16,16)*px;break;
} }
launcher.renderer.draw(draw_data);
if(snake.parts.length >1) if(snake.parts.length >1)
{ {
foreach(j;1..snake.parts.length - 1)drawElement(snake.parts[j]*16, snakePart(snake.parts[j], snake.parts[j+1], snake.parts[j-1])); foreach(j;1..snake.parts.length - 1)drawElement(snake.parts[j]*16, snakePart(snake.parts[j], snake.parts[j+1], snake.parts[j-1]));

View file

@ -976,31 +976,52 @@ struct DrawSystem
void onUpdate(EntitiesData data) void onUpdate(EntitiesData data)
{ {
if(launcher.renderer.prepared_items >= launcher.renderer.MaxObjects)return;//simple leave loop if max visible objects count was reached
import ecs_utils.gfx.renderer;
Renderer.DrawData draw_data;
draw_data.color = 0x80808080;
draw_data.thread_id = data.job_id;
draw_data.texture = space_invaders.texture;
//uint color_mask = 0xFCFCFCFC;
uint const_map = 0x80A08080;//0x80808080;
if(!data.depth) if(!data.depth)
{ {
if(data.hit_mark) if(data.hit_mark)
{ {
foreach(i; 0..data.length) foreach(i; 0..data.length)
{ {
uint color = 0x80808080 + 0x01010101 * data.hit_mark[i]; draw_data.color = 0x80808080 + 0x01010101 * data.hit_mark[i];
short depth = cast(short)(data.locations[i].y); draw_data.depth = cast(short)(data.locations[i].y);
launcher.renderer.draw(space_invaders.texture, data.locations[i].value, data.scale[i], data.textures[i].coords, depth, color, 0, 0, 0, data.job_id); draw_data.coords = data.textures[i].coords;
draw_data.size = data.scale[i];
draw_data.position = data.locations[i];
launcher.renderer.draw(draw_data);
//launcher.renderer.draw(space_invaders.texture, data.locations[i].value, data.scale[i], data.textures[i].coords, depth, color|const_map, 0, 0, 0, data.job_id);
} }
} }
else if(data.rotation) else if(data.rotation)
{ {
foreach(i; 0..data.length) foreach(i; 0..data.length)
{ {
short depth = cast(short)(data.locations[i].y); draw_data.depth = cast(short)(data.locations[i].y);
launcher.renderer.draw(space_invaders.texture, data.locations[i].value, data.scale[i], data.textures[i].coords, depth, 0x80808080, data.rotation[i], 0, 0, data.job_id); draw_data.angle = data.rotation[i];
draw_data.coords = data.textures[i].coords;
draw_data.size = data.scale[i];
draw_data.position = data.locations[i];
launcher.renderer.draw(draw_data);
//launcher.renderer.draw(space_invaders.texture, data.locations[i].value, data.scale[i], data.textures[i].coords, depth, 0x80808080|const_map, data.rotation[i], 0, 0, data.job_id);
} }
} }
else else
{ {
foreach(i; 0..data.length) foreach(i; 0..data.length)
{ {
short depth = cast(short)(data.locations[i].y); draw_data.depth = cast(short)(data.locations[i].y);
launcher.renderer.draw(space_invaders.texture, data.locations[i].value, data.scale[i], data.textures[i].coords, depth, 0x80808080, 0, 0, 0, data.job_id); draw_data.coords = data.textures[i].coords;
draw_data.size = data.scale[i];
draw_data.position = data.locations[i];
launcher.renderer.draw(draw_data);
//launcher.renderer.draw(space_invaders.texture, data.locations[i].value, data.scale[i], data.textures[i].coords, depth, 0x80808080|const_map, 0, 0, 0, data.job_id);
} }
} }
} }
@ -1012,18 +1033,27 @@ struct DrawSystem
{ {
foreach(i; 0..data.length) foreach(i; 0..data.length)
{ {
uint color = 0x80808080 + 0x01010101 * data.hit_mark[i]; draw_data.color = 0x80808080 + 0x01010101 * data.hit_mark[i];
short depth = cast(short)(data.depth[i] * 8 + data.locations[i].y); draw_data.angle = data.rotation[i];
launcher.renderer.draw(space_invaders.texture, data.locations[i].value, data.scale[i], data.textures[i].coords, depth, color, data.rotation[i], 0, 0, data.job_id); draw_data.depth = cast(short)(data.depth[i] * 8 + data.locations[i].y);
draw_data.coords = data.textures[i].coords;
draw_data.size = data.scale[i];
draw_data.position = data.locations[i];
launcher.renderer.draw(draw_data);
//launcher.renderer.draw(space_invaders.texture, data.locations[i].value, data.scale[i], data.textures[i].coords, depth, color|const_map, data.rotation[i], 0, 0, data.job_id);
} }
} }
else else
{ {
foreach(i; 0..data.length) foreach(i; 0..data.length)
{ {
uint color = 0x80808080 + 0x01010101 * data.hit_mark[i]; draw_data.color = 0x80808080 + 0x01010101 * data.hit_mark[i];
short depth = cast(short)(data.depth[i] * 8 + data.locations[i].y); draw_data.depth = cast(short)(data.depth[i] * 8 + data.locations[i].y);
launcher.renderer.draw(space_invaders.texture, data.locations[i].value, data.scale[i], data.textures[i].coords, depth, color, 0, 0, 0, data.job_id); draw_data.coords = data.textures[i].coords;
draw_data.size = data.scale[i];
draw_data.position = data.locations[i];
launcher.renderer.draw(draw_data);
//launcher.renderer.draw(space_invaders.texture, data.locations[i].value, data.scale[i], data.textures[i].coords, depth, color|const_map, 0, 0, 0, data.job_id);
} }
} }
} }
@ -1031,16 +1061,25 @@ struct DrawSystem
{ {
foreach(i; 0..data.length) foreach(i; 0..data.length)
{ {
short depth = cast(short)(data.depth[i] * 8 + data.locations[i].y); draw_data.angle = data.rotation[i];
launcher.renderer.draw(space_invaders.texture, data.locations[i].value, data.scale[i], data.textures[i].coords, depth, 0x80808080, data.rotation[i], 0, 0, data.job_id); draw_data.depth = cast(short)(data.depth[i] * 8 + data.locations[i].y);
draw_data.coords = data.textures[i].coords;
draw_data.size = data.scale[i];
draw_data.position = data.locations[i];
launcher.renderer.draw(draw_data);
//launcher.renderer.draw(space_invaders.texture, data.locations[i].value, data.scale[i], data.textures[i].coords, depth, 0x80808080|const_map, data.rotation[i], 0, 0, data.job_id);
} }
} }
else else
{ {
foreach(i; 0..data.length) foreach(i; 0..data.length)
{ {
short depth = cast(short)(data.depth[i] * 8 + data.locations[i].y); draw_data.depth = cast(short)(data.depth[i] * 8 + data.locations[i].y);
launcher.renderer.draw(space_invaders.texture, data.locations[i].value, data.scale[i], data.textures[i].coords, depth, 0x80808080, 0, 0, 0, data.job_id); draw_data.coords = data.textures[i].coords;
draw_data.size = data.scale[i];
draw_data.position = data.locations[i];
launcher.renderer.draw(draw_data);
//launcher.renderer.draw(space_invaders.texture, data.locations[i].value, data.scale[i], data.textures[i].coords, depth, 0x80808080|const_map, 0, 0, 0, data.job_id);
} }
} }
} }

View file

@ -430,13 +430,29 @@ struct Renderer
} }
void draw(Texture tex, vec2 pos, vec2 size, vec4 coords, short depth = 0, uint color = uint.max, float angle = 0, uint material_id = 0, uint mesh_id = 0, uint thread_id = 0) struct DrawData
{ {
if(prepared_items >= MaxObjects)return; Texture texture;
__draw(this,tex,pos,size,coords,depth,color,angle,material_id,mesh_id,thread_id); vec2 position;
vec2 size;
vec4 coords;
short depth = 0;
uint color = uint.max;
float angle = 0;
uint material_id = 0;
uint mesh_id = 0;
uint thread_id = 0;
} }
private static void __draw_sdl(ref Renderer this_, Texture tex, vec2 pos, vec2 size, vec4 coords, short depth, uint color, float angle, uint material_id, uint mesh_id, uint thread_id) //void draw(Texture tex, vec2 pos, vec2 size, vec4 coords, short depth = 0, uint color = uint.max, float angle = 0, uint material_id = 0, uint mesh_id = 0, uint thread_id = 0)
void draw(scope ref const(DrawData) data)
{
if(prepared_items >= MaxObjects)return;
__draw(this,data);//tex,pos,size,coords,depth,color,angle,material_id,mesh_id,thread_id);
}
//private static void __draw_sdl(ref Renderer this_, Texture tex, vec2 pos, vec2 size, vec4 coords, short depth, uint color, float angle, uint material_id, uint mesh_id, uint thread_id)
private static void __draw_sdl(ref Renderer this_, scope ref const(DrawData) data)
{ {
/*with(this_) /*with(this_)
{ {
@ -456,22 +472,25 @@ struct Renderer
}*/ }*/
} }
private static void __draw_gl(ref Renderer this_, Texture tex, vec2 pos, vec2 size, vec4 coords, short depth, uint color, float angle, uint material_id, uint mesh_id, uint thread_id) // private static void __draw_gl(ref Renderer this_, Texture tex, vec2 pos, vec2 size, vec4 coords, short depth, uint color, float angle, uint material_id, uint mesh_id, uint thread_id)
private static void __draw_gl(ref Renderer this_, scope ref const(DrawData) data)
{ {
//import core.stdc.string; //import core.stdc.string;
with(this_) with(this_)
{ {
//pos += view_pos; //pos += view_pos;
size.x *= view_size.x; vec2 pos = void;
size.y *= view_size.y; vec2 size = void;
pos.x = pos.x * view_size.x + view_pos.x; size.x = data.size.x * view_size.x;
pos.y = pos.y * view_size.y + view_pos.y;//*/ size.y = data.size.y * view_size.y;
pos.x = data.position.x * view_size.x + view_pos.x;
pos.y = data.position.y * view_size.y + view_pos.y;//*/
/*version(ver6)void* ptr = ubos[0].mappedPointer() + data_index; /*version(ver6)void* ptr = ubos[0].mappedPointer() + data_index;
else void* ptr = uniform_block.ptr + data_index;*/ else void* ptr = uniform_block.ptr + data_index;*/
if(data_ptr is null)return; if(data_ptr is null)return;
void* ptr = data_ptr + data_index; void* ptr = data_ptr + data_index;
if(angle == 0) if(data.angle == 0)
{ {
*cast(float*)ptr = size.x; *cast(float*)ptr = size.x;
*cast(float*)(ptr+4) = 0; *cast(float*)(ptr+4) = 0;
@ -481,8 +500,8 @@ struct Renderer
else else
{ {
//import core.stdc.math; //import core.stdc.math;
float sinn = sinf(angle); float sinn = sinf(data.angle);
float coss = cosf(angle); float coss = cosf(data.angle);
*cast(float*)ptr = coss * size.x; *cast(float*)ptr = coss * size.x;
*cast(float*)(ptr+4) = -sinn * size.y; *cast(float*)(ptr+4) = -sinn * size.y;
*cast(float*)(ptr+8) = sinn * size.x; *cast(float*)(ptr+8) = sinn * size.x;
@ -491,12 +510,12 @@ struct Renderer
//memcpy(ptr,); //memcpy(ptr,);
memcpy(ptr+16,pos.data.ptr,8); memcpy(ptr+16,pos.data.ptr,8);
memcpy(ptr+32,coords.data.ptr,16); memcpy(ptr+32,data.coords.data.ptr,16);
//render_list[item_id] = RenderData(tex,material_id,mesh_id); //render_list[item_id] = RenderData(tex,material_id,mesh_id);
render_list[item_id].texture = tex; render_list[item_id].texture = *cast(Texture*)&data.texture;
render_list[item_id].material_id = material_id; render_list[item_id].material_id = data.material_id;
render_list[item_id].mesh_id = mesh_id; render_list[item_id].mesh_id = data.mesh_id;
data_index += data_offset; data_index += data_offset;
item_id++; item_id++;
@ -504,39 +523,43 @@ struct Renderer
} }
} }
private static void __draw_gl_vbo_batch(ref Renderer this_, Texture tex, vec2 pos, vec2 size, vec4 coords, short depth, uint color, float angle, uint material_id, uint mesh_id, uint thread_id = 0) // private static void __draw_gl_vbo_batch(ref Renderer this_, Texture tex, vec2 pos, vec2 size, vec4 coords, short depth, uint color, float angle, uint material_id, uint mesh_id, uint thread_id = 0)
private static void __draw_gl_vbo_batch(ref Renderer this_, scope ref const(DrawData) data)
{ {
import ecs_utils.gfx.config; import ecs_utils.gfx.config;
//import core.stdc.string; //import core.stdc.string;
with(this_) with(this_)
{ {
uint thread_id = data.thread_id;
//if(item_id >= MaxObjects)return; //if(item_id >= MaxObjects)return;
//pos += view_pos; //pos += view_pos;
Thread* thread = &threads[thread_id]; Thread* thread = &threads[thread_id];
VertexBlock* block; VertexBlock* block;
assert(thread.blocks.length > material_id); assert(thread.blocks.length > data.material_id);
block = &thread.blocks[material_id]; block = &thread.blocks[data.material_id];
if(block.items == 0) if(block.items == 0)
{ {
thread.blocks[material_id] = getBlock(); thread.blocks[data.material_id] = getBlock();
block = &thread.blocks[material_id]; block = &thread.blocks[data.material_id];
block.material_id = material_id; block.material_id = data.material_id;
} }
else if(block.items >= VertexBlock.max_items) else if(block.items >= VertexBlock.max_items)
{ {
//pushBlock(thread.block); //pushBlock(thread.block);
prepared_items += block.items; prepared_items += block.items;
thread.filled_blocks.add(*block); thread.filled_blocks.add(*block);
thread.blocks[material_id] = getBlock(); thread.blocks[data.material_id] = getBlock();
block = &thread.blocks[material_id]; block = &thread.blocks[data.material_id];
block.material_id = material_id; block.material_id = data.material_id;
} }
short[3] mem = [depth, *cast(short*)&color, *(cast(short*)&color + 1)]; short[3] mem = [data.depth, *cast(short*)&data.color, *(cast(short*)&data.color + 1)];
pos.x = pos.x * view_size.x + view_pos.x; vec2 pos = void;
pos.y = pos.y * view_size.y + view_pos.y;//*/ vec2 size = void;
pos.x = data.position.x * view_size.x + view_pos.x;
pos.y = data.position.y * view_size.y + view_pos.y;//*/
/*void* ptr = data_ptr + data_index; /*void* ptr = data_ptr + data_index;
*cast(float*)ptr = size.x; *cast(float*)ptr = size.x;
@ -550,10 +573,13 @@ struct Renderer
short[] verts = cast(short[])block.batch_vertices; short[] verts = cast(short[])block.batch_vertices;
uint item_id = block.items; uint item_id = block.items;
if(angle == 0) uint mesh_id = data.mesh_id;
vec4 coords = data.coords;
if(data.angle == 0)
{ {
size.x *= view_size.x; size.x = data.size.x * view_size.x;
size.y *= view_size.y; size.y = data.size.y * view_size.y;
verts[item_id*28] = cast(short)((GfxConfig.meshes[mesh_id].vertices[0] * size.x + pos.x) * 8191); verts[item_id*28] = cast(short)((GfxConfig.meshes[mesh_id].vertices[0] * size.x + pos.x) * 8191);
verts[item_id*28+1] = cast(short)((GfxConfig.meshes[mesh_id].vertices[1] * size.y + pos.y) * 8191); verts[item_id*28+1] = cast(short)((GfxConfig.meshes[mesh_id].vertices[1] * size.y + pos.y) * 8191);
@ -585,10 +611,11 @@ struct Renderer
else else
{ {
//import core.stdc.math; //import core.stdc.math;
float sinx = sinf(angle) * size.x * view_size.y; float angle = data.angle;
float cosx = cosf(angle) * size.x * view_size.x; float sinx = sinf(angle) * data.size.x * view_size.y;
float siny = sinf(angle) * size.y * view_size.x; float cosx = cosf(angle) * data.size.x * view_size.x;
float cosy = cosf(angle) * size.y * view_size.y; float siny = sinf(angle) * data.size.y * view_size.x;
float cosy = cosf(angle) * data.size.y * view_size.y;
/*batch_vertices[item_id*28] = GfxConfig.meshes[mesh_id].vertices[0] * size.x; /*batch_vertices[item_id*28] = GfxConfig.meshes[mesh_id].vertices[0] * size.x;
batch_vertices[item_id*28+1] = GfxConfig.meshes[mesh_id].vertices[1] * size.y; batch_vertices[item_id*28+1] = GfxConfig.meshes[mesh_id].vertices[1] * size.y;
@ -1088,7 +1115,8 @@ struct Renderer
view_pos = (pos - size * 0.5) * view_size; view_pos = (pos - size * 0.5) * view_size;
} }
__gshared void function(ref Renderer this_, Texture tex, vec2 pos, vec2 size, vec4 coords, short depth, uint color, float angle, uint material_id, uint mesh_id, uint thread_id) __draw; // __gshared void function(ref Renderer this_, Texture tex, vec2 pos, vec2 size, vec4 coords, short depth, uint color, float angle, uint material_id, uint mesh_id, uint thread_id) __draw;
__gshared void function(ref Renderer this_, scope ref const(DrawData) data) __draw;
__gshared void function(ref Renderer this_) __present; __gshared void function(ref Renderer this_) __present;
__gshared void function(ref Renderer this_) __clear; __gshared void function(ref Renderer this_) __clear;
__gshared void function(ref Renderer this_) __initialize; __gshared void function(ref Renderer this_) __initialize;