diff --git a/src/shader.cpp b/src/shader.cpp index 190f3d1..2c8ab02 100644 --- a/src/shader.cpp +++ b/src/shader.cpp @@ -26,6 +26,7 @@ bool compileAndLinkShader(shader_program* shader, const char* frag_src, GLuint& vs_id, GLuint& fs_id); +u32 getGLTypeSize(GLenum e); // NOTE: interface @@ -310,15 +311,28 @@ dumpTextFile(const char* filepath) return s; } +u32 +getGLTypeSize(GLenum e) +{ + switch (e) { + case GL_FLOAT_VEC3: return 3 * sizeof(GLfloat); + case GL_FLOAT_VEC4: return 4 * sizeof(GLfloat); + case GL_FLOAT_MAT4: return 16 * sizeof(GLfloat); + default: + printf("%s(), unknown GLenum\n", __FUNCTION__); + return 0; + } +} + // NOTE: returns sizes based on GLSL layout std140 // https://www.khronos.org/opengl/wiki/Interface_Block_(GLSL)#Memory_layout u32 -getGLTypeSize(GLenum e) +getGLTypeSizeStd140(GLenum e) { switch (e) { - case 0x8b51: return 4 * sizeof(GLfloat); // GL_FLOAT_VEC3 - case 0x8b52: return 4 * sizeof(GLfloat); // GL_FLOAT_VEC4 - case 0x8b5c: return 16 * sizeof(GLfloat); // GL_FLOAT_MAT4 + case GL_FLOAT_VEC3: return 4 * sizeof(GLfloat); + case GL_FLOAT_VEC4: return 4 * sizeof(GLfloat); + case GL_FLOAT_MAT4: return 16 * sizeof(GLfloat); default: printf("%s(), unknown GLenum\n", __FUNCTION__); return 0; @@ -476,6 +490,17 @@ getNumAttribComponents(GLenum type) } } +GLenum +getAttribComponentType(GLenum type) +{ + switch (type) { + case GL_FLOAT_VEC3: return GL_FLOAT; + default: + printf("%s(), unknown GLenum\n", __FUNCTION__); + return 0; + } +} + bool parseAttributes(memory_arena* arena, shader_program* s, GLContext* gl_ctx) { @@ -507,6 +532,8 @@ parseAttributes(memory_arena* arena, shader_program* s, GLContext* gl_ctx) attrib->location = location; attrib->num_components = getNumAttribComponents(type); assert(attrib->num_components > 0); + attrib->component_type = getAttribComponentType(type); + assert(attrib->component_type > 0); attrib->name = arenaCopyCStr(arena, attrib_name, sizeof(attrib_name)); // TODO: replace POSITION, NORMAL, UV... etc enums in loadGLMesh() // with extra logic to detect mesh to shader mapping