diff --git a/data/shader.frag b/data/shader.frag index 39c76dc..a02584f 100644 --- a/data/shader.frag +++ b/data/shader.frag @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:f8c856aacd810bd74889ff1533ad9dc233369691d3a73350bdf7bbf3cf5ca47f -size 370 +oid sha256:bfc35c46bb495d8699765e860332272163882faa55232ec6b2ad2f1f623a2503 +size 258 diff --git a/data/shader.vert b/data/shader.vert index 15dc94a..5e20a3f 100644 --- a/data/shader.vert +++ b/data/shader.vert @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:647f6695f1948d8216d7116dd07b31eb524ae9b1976f99e43735b2a5e8f6d771 -size 471 +oid sha256:3ff8f67f345ed8947356dec98d84bc64a2358e398bb3551fe87dbdafc03810cd +size 341 diff --git a/src/main.cpp b/src/main.cpp index b8a8e3c..b300990 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -345,7 +345,7 @@ loop(RenderState* rs) for (u32 k = 0; k < e.num_meshes; k++) { GLmesh& glm = e.meshes[k]; - renderVAO(&glm, e.xform, rg.shader); + renderVAO(&glm, e.xform, rg.shader, e.diffuse_texture->id); } } } diff --git a/src/shader.cpp b/src/shader.cpp index 3c39fd0..7902c1c 100644 --- a/src/shader.cpp +++ b/src/shader.cpp @@ -66,6 +66,8 @@ addShaderProgram(MemoryArena* arena, // queries after at least one shader has been linked initCTXSizes(gl_ctx); s->model_xform_id = glGetUniformLocation(s->prog_id, "model_xform"); + // TODO: add sampler uniform detection in dynamic shader parsing + s->sampler_id = glGetUniformLocation(s->prog_id, "sampler"); glDetachShader(s->prog_id, vs_id); glDetachShader(s->prog_id, fs_id); glDeleteShader(vs_id); @@ -160,12 +162,21 @@ getGLTexture(GLContext* gl_ctx, util_image* diffuse_img) } void -renderVAO(GLmesh* glmesh, glm::mat4* model_xform, shader_program* shader) +renderVAO(GLmesh* glmesh, + glm::mat4* model_xform, + shader_program* shader, + GLuint tex_id) { glUseProgram(shader->prog_id); glBindVertexArray(glmesh->vao_id); glUniformMatrix4fv(shader->model_xform_id, 1, GL_FALSE, (float*) model_xform); + + if (tex_id > 0) { + glBindTexture(GL_TEXTURE_2D, tex_id); + glUniform1i(shader->sampler_id, 0); + } + glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, glmesh->element_buf->id); glDrawElements( glmesh->draw_mode, glmesh->num_indices, GL_UNSIGNED_SHORT, 0); @@ -385,6 +396,7 @@ u32 getGLTypeSize(GLenum e) { switch (e) { + case GL_FLOAT_VEC2: return 2 * sizeof(GLfloat); case GL_FLOAT_VEC3: return 3 * sizeof(GLfloat); case GL_FLOAT_VEC4: return 4 * sizeof(GLfloat); case GL_FLOAT_MAT4: return 16 * sizeof(GLfloat); @@ -552,6 +564,7 @@ getNumAttribComponents(GLenum type) { switch (type) { case GL_FLOAT_VEC3: return 3; + case GL_FLOAT_VEC2: return 2; default: printf("%s(), unknown GLenum\n", __FUNCTION__); return 0; @@ -563,6 +576,7 @@ getAttribComponentType(GLenum type) { switch (type) { case GL_FLOAT_VEC3: return GL_FLOAT; + case GL_FLOAT_VEC2: return GL_FLOAT; default: printf("%s(), unknown GLenum\n", __FUNCTION__); return 0; diff --git a/src/shader.h b/src/shader.h index d9d19fd..5e1e9c9 100644 --- a/src/shader.h +++ b/src/shader.h @@ -50,6 +50,7 @@ struct shader_program GLuint prog_id; GLuint xforms_ubo_id; GLuint model_xform_id; + GLint sampler_id; u32 num_blocks; GLUniformBlock* uniform_blocks; @@ -160,19 +161,31 @@ bool addShaderProgram(MemoryArena* arena, const char* vs, const char* fs, const char* name); + shader_program* getShaderByName(const char* name, GLContext* gl_ctx); + shader_program* getShaderByID(GLContext* gl_ctx, GLuint prog_id); + shader_program* getShaderByHash(GLContext* gl_ctx, u64 hash); + shader_program* getFreeShader(GLContext* gl_ctx); + GLTexture* getGLTexture(GLContext* gl_ctx, util_image* diffuse_img); -void renderVAO(GLmesh* glmesh, glm::mat4* model_xform, shader_program* shader); + +void renderVAO(GLmesh* glmesh, + glm::mat4* model_xform, + shader_program* shader, + GLuint tex_id = 0); + GLVertexAttrib* getVertexAttribByName(shader_program* shader, const char* name); + GLmesh loadGLMesh(const mesh& m, GLenum draw_mode, GLuint diffuse_texture_id, const glm::vec3& pos, u32 num_mappings, GLBufferToAttribMapping mappings[]); + void initTransforms(MemoryArena* arena, transforms* xforms, gl_buffer* xform_ubo,