CI and common update:
-added webpage deploymnet stage -added separate build stage which build all binaries and generate documentation -added Emscripten build stage for merge to master only -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:
parent
f67eb452cc
commit
54a6d5dec2
29 changed files with 1167 additions and 322 deletions
|
|
@ -55,10 +55,10 @@ struct Buffer
|
|||
glBufferStorage(GL_ARRAY_BUFFER,size*count,data, flags);
|
||||
}*/
|
||||
|
||||
void bufferSubData(uint size, uint offset, void* data) nothrow
|
||||
void bufferSubData(BindTarget target, uint size, uint offset, void* data) nothrow
|
||||
{
|
||||
bind(BindTarget.array);
|
||||
glBufferSubData(GL_ARRAY_BUFFER,offset,size,data);
|
||||
bind(target);
|
||||
glBufferSubData(target,offset,size,data);
|
||||
}
|
||||
|
||||
void map(BindTarget target) nothrow
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -55,6 +55,7 @@ struct Texture
|
|||
data.data[0..$] = (cast(ubyte*)surf.pixels)[0..data.data.length];
|
||||
|
||||
glGenTextures(1, &data.gl_handle);
|
||||
glActiveTexture(GL_TEXTURE0);
|
||||
glBindTexture(GL_TEXTURE_2D,data.gl_handle);
|
||||
|
||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
|
||||
|
|
|
|||
|
|
@ -30,6 +30,11 @@ struct vec2
|
|||
else static assert(0, "Operator "~op~" not implemented");
|
||||
}
|
||||
|
||||
ivec2 opCast()
|
||||
{
|
||||
return ivec2(cast(int)x,cast(int)y);
|
||||
}
|
||||
|
||||
void opOpAssign(string op)(vec2 v)
|
||||
{
|
||||
static if (op == "+")
|
||||
|
|
@ -69,6 +74,15 @@ struct vec4
|
|||
}
|
||||
float[4] data;
|
||||
}
|
||||
|
||||
vec4 opBinary(string op)(float v)
|
||||
{
|
||||
static if (op == "+") return vec4(x + v, y + v, z + v, w + v);
|
||||
else static if (op == "-") return vec4(x - v, y - v, z - v, w - v);
|
||||
else static if (op == "*") return vec4(x * v, y * v, z * v, w * v);
|
||||
else static if (op == "/") return vec4(x / v, y / v, z / v, w / v);
|
||||
else static assert(0, "Operator "~op~" not implemented");
|
||||
}
|
||||
}
|
||||
|
||||
struct ivec2
|
||||
|
|
@ -82,6 +96,11 @@ struct ivec2
|
|||
}
|
||||
int[2] data;
|
||||
}
|
||||
|
||||
vec2 opCast()
|
||||
{
|
||||
return vec2(x,y);
|
||||
}
|
||||
}
|
||||
|
||||
struct ivec4
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue