|
|
|
|
@ -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
|
|
|
|
|
|