Common update:

-added VBo batch rendering (current default, no render mode switch yet)
-fixed camera positioning calculation
-fixed buffer issue with WebGL
-added viewport scalling (at least 300 pixels height). Pixels are scalled if screen is bigger.
-center demos gameplay area
-added fullpage html template for Emscripten build
This commit is contained in:
Mergul 2020-04-24 20:55:25 +02:00
parent 7c263d3ed4
commit 8381ac166b
7 changed files with 61 additions and 40 deletions

View file

@ -98,7 +98,7 @@ struct Renderer
alias Technique = RenderTechnique;
__gshared Technique technique = Technique.simple;
__gshared Technique technique = Technique.vbo_batch;
void* data_ptr;
//import ecs_utils.core : RenderTechnique;
@ -339,6 +339,7 @@ struct Renderer
//import core.stdc.string;
with(this_)
{
if(item_id >= MaxObjects)return;
//pos += view_pos;
size.x *= view_size.x;
size.y *= view_size.y;
@ -470,8 +471,8 @@ struct Renderer
break;
case Technique.vbo_batch:
//if(data_index){
batch_vbo[0].bufferSubData(item_id*4*16,0,batch_vertices.ptr);
batch_ibo[0].bufferSubData(item_id*6*2,0,batch_indices.ptr);
batch_vbo[0].bufferSubData(Buffer.BindTarget.array,item_id*4*16,0,batch_vertices.ptr);
batch_ibo[0].bufferSubData(Buffer.BindTarget.element_array,item_id*6*2,0,batch_indices.ptr);
batch_vbo[0].bind(Buffer.BindTarget.array);
batch_ibo[0].bind(Buffer.BindTarget.element_array);
@ -480,8 +481,8 @@ struct Renderer
glVertexAttribPointer(1,2,GL_FLOAT,false,16,cast(void*)8);//}
break;
case Technique.instanced_attrib_divisor:
ubos[0].bufferSubData(data_index,0,uniform_block.ptr);
ubos[0].bind(Buffer.BindTarget.array);
ubos[0].bufferSubData(Buffer.BindTarget.uniform,data_index,0,uniform_block.ptr);
ubos[0].bind(Buffer.BindTarget.uniform);
glEnableVertexAttribArray(2);
glEnableVertexAttribArray(3);
glEnableVertexAttribArray(4);
@ -496,7 +497,7 @@ struct Renderer
break;
case Technique.uniform_buffer:
//ubos[0].bufferData(1,64*MaxObjects,BufferUsage,null);
/*if(data_index)*/ubos[0].bufferSubData(data_index,0,uniform_block.ptr);
/*if(data_index)*/ubos[0].bufferSubData(Buffer.BindTarget.uniform,data_index,0,uniform_block.ptr);
break;
case Technique.uniform_buffer_indexed:
ubos[0].bindRange(Buffer.BindTarget.uniform,0,0,block_max_size);
@ -581,6 +582,8 @@ struct Renderer
{
material_id = render_list[i].material_id;
GfxConfig.materials[material_id].bind();
float[3*4] data = [1,0,0,1,0,0,0,0,0,0,1,1];
GfxConfig.materials[material_id].pushUniforms(data.ptr);
}
if(texture.data != render_list[i].texture.data)
{
@ -589,17 +592,17 @@ struct Renderer
}
uint instance_count = 16_384;
if(i*16_384 > item_id)
if((i+1)*16_384 > item_id)
{
instance_count = i*16_384 - item_id;
instance_count = item_id%16_384;
}
/*glVertexAttribPointer(0,2,GL_FLOAT,false,16,cast(void*)(i*16_384*4*16));
glVertexAttribPointer(0,2,GL_FLOAT,false,16,cast(void*)(i*16_384*4*16));
glVertexAttribPointer(1,2,GL_FLOAT,false,16,cast(void*)(i*16_384*4*16+8));
glDrawElements(GL_TRIANGLES,instance_count*6,GL_UNSIGNED_SHORT,cast(void*)(i*16_384*6*2));*/
glDrawElements(GL_TRIANGLES,instance_count*6,GL_UNSIGNED_SHORT,cast(void*)(i*16_384*6*2));
glDrawElementsBaseVertex(GL_TRIANGLES,instance_count*6,GL_UNSIGNED_SHORT,cast(void*)(i*16_384*6*2),i*16_384*4);
//glDrawElementsBaseVertex(GL_TRIANGLES,instance_count*6,GL_UNSIGNED_SHORT,cast(void*)(i*16_384*6*2),i*16_384*4);
}
}
else if(technique == Technique.ssbo_instanced || technique == Technique.instanced_attrib_divisor)
@ -794,9 +797,10 @@ struct Renderer
void view(vec2 pos, vec2 size)
{
view_pos = pos * size - 1;
//view_pos = pos * size - 1;
view_size = vec2(2/size.x,2/size.y);
sdl_transform = vec4(0,0,1.0/size.x,1.0/size.y);
view_pos = (pos - size * 0.5) * view_size;
}
__gshared void function(ref Renderer this_, Texture tex, vec2 pos, vec2 size, vec4 coords, float angle, uint material_id, uint mesh_id) __draw;