Browse Source

add helper functions for GL type sizes

main
cinnaboot 5 years ago
parent
commit
b98cc29e1b
  1. 35
      src/shader.cpp

35
src/shader.cpp

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

Loading…
Cancel
Save