|
|
|
@ -19,7 +19,6 @@ GLContext* initGLContext(MemoryArena* arena, |
|
|
|
|
|
|
|
|
|
|
|
// interface
|
|
|
|
// interface
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
RenderState* |
|
|
|
RenderState* |
|
|
|
initRenderState(u32 max_models, |
|
|
|
initRenderState(u32 max_models, |
|
|
|
u32 max_textures, |
|
|
|
u32 max_textures, |
|
|
|
@ -54,6 +53,9 @@ initRenderState(u32 max_models, |
|
|
|
// FIXME: need to test this with another shader that has another UBO
|
|
|
|
// FIXME: need to test this with another shader that has another UBO
|
|
|
|
gl_buffer& ubo = rs->gl_ctx->uniform_buffers[rs->gl_ctx->num_ubos++]; |
|
|
|
gl_buffer& ubo = rs->gl_ctx->uniform_buffers[rs->gl_ctx->num_ubos++]; |
|
|
|
initTransforms(rs->assets.arena, rs->xforms, &ubo, rs->gl_ctx); |
|
|
|
initTransforms(rs->assets.arena, rs->xforms, &ubo, rs->gl_ctx); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
bool ret = loadDefaultShaders(rs); |
|
|
|
|
|
|
|
assert(ret); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
return rs; |
|
|
|
return rs; |
|
|
|
@ -179,6 +181,56 @@ renderFrame(RenderState* rs, const GLClearColor& clear_col) |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
bool |
|
|
|
|
|
|
|
loadDefaultShaders(RenderState* rs, |
|
|
|
|
|
|
|
u32 num_shaders, |
|
|
|
|
|
|
|
const ShaderInit shaders[]) |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
for (u32 i = 0; i < num_shaders; i++) { |
|
|
|
|
|
|
|
const ShaderInit& si = shaders[i]; |
|
|
|
|
|
|
|
bool ret = addShaderProgram(rs->assets.arena, |
|
|
|
|
|
|
|
rs->gl_ctx, |
|
|
|
|
|
|
|
si.vert_path, |
|
|
|
|
|
|
|
si.frag_path, |
|
|
|
|
|
|
|
si.name); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (!ret) { |
|
|
|
|
|
|
|
LOG(Error) << "failed to load shader " << si.name << "\n"; |
|
|
|
|
|
|
|
return false; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// TODO: need to set the mappings here
|
|
|
|
|
|
|
|
shader_program* shader = getShaderByName(si.name, rs->gl_ctx); |
|
|
|
|
|
|
|
assert(shader); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// NOTE: not every buffer will be available for every shader, so we
|
|
|
|
|
|
|
|
// enumerate them all, and store the ones that are present
|
|
|
|
|
|
|
|
u32 attrib_idx = 0; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
for (u32 i = 0; i < MESH_BUFFER_TYPE_COUNT; i++) { |
|
|
|
|
|
|
|
MeshBufferType buf_type = (MeshBufferType) i; |
|
|
|
|
|
|
|
GLVertexAttrib* attrib = getVertexAttribByType(shader, buf_type); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (attrib) |
|
|
|
|
|
|
|
shader->attrib_mappings[attrib_idx++] = { attrib, buf_type }; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
return true; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
GLVertexAttrib* |
|
|
|
|
|
|
|
getVertexAttribByType(shader_program* shader, MeshBufferType buf_type) |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
switch (buf_type) { |
|
|
|
|
|
|
|
case VERTEX: return getVertexAttribByName(shader, "position"); |
|
|
|
|
|
|
|
case NORMAL: return getVertexAttribByName(shader, "normal"); |
|
|
|
|
|
|
|
case UV: return getVertexAttribByName(shader, "uv"); |
|
|
|
|
|
|
|
case COLOR: return getVertexAttribByName(shader, "color"); |
|
|
|
|
|
|
|
default: return nullptr; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// internal
|
|
|
|
// internal
|
|
|
|
|
|
|
|
|
|
|
|
|