diff options
| -rw-r--r-- | src/rendering/include/engine/rendering/rendering.h | 30 | ||||
| -rw-r--r-- | src/rendering/src/gl.c | 140 |
2 files changed, 91 insertions, 79 deletions
diff --git a/src/rendering/include/engine/rendering/rendering.h b/src/rendering/include/engine/rendering/rendering.h index 4bfbf16..5ac03ae 100644 --- a/src/rendering/include/engine/rendering/rendering.h +++ b/src/rendering/include/engine/rendering/rendering.h @@ -25,6 +25,25 @@ typedef struct { v2_i32 coord; } Sprite; +typedef struct { + /* Shader proram */ + u32 program; +} Shader; + +typedef struct { + /* Shader proram */ + Shader shader; + /* Vertex Array Object */ + u32 vao; + /* Vertex Buffer Object */ + u32 vbo; + /* Index Buffer Object */ + u32 ibo; + /* Color (?) */ + u32 col; + /* MVP (a uniform from the shader) */ + u32 mvp; +} RenderObject; #include <engine/engine.h> #include <engine/ui.h> @@ -78,14 +97,9 @@ typedef struct { } sprite; } data; } RenderDrawCall; -// -//struct RenderObject { -// u32 vao; -// u32 vbo; -// u32 col; -// u32 shaderprogram; -// f32 g_vertex_buffer_data[9]; -//}; + +RenderObject RenderObject_new(); + // // //#endif diff --git a/src/rendering/src/gl.c b/src/rendering/src/gl.c index 2958d49..b66aef8 100644 --- a/src/rendering/src/gl.c +++ b/src/rendering/src/gl.c @@ -6,95 +6,95 @@ #include <engine/core/types.h> #include <engine/core/logging.h> -// http://www.opengl-tutorial.org/beginners-tutorials/tutorial-2-the-first-triangle/ -GLuint LoadShaders( - const GladGLContext* gl, - const char * vertex_file_path, - const char * fragment_file_path) { +isize f_get_sz(FILE* f) { + if (f == NULL) { + ERROR("File was null!"); + return 0; + } - // Create the shaders - GLuint VertexShaderID = gl->CreateShader(GL_VERTEX_SHADER); - GLuint FragmentShaderID = gl->CreateShader(GL_FRAGMENT_SHADER); + const isize pos = ftell(f); - // Read the Vertex Shader code from the file - char* VertexShaderCode; - FILE* VertexShaderStream = fopen(vertex_file_path, "r"); - if(VertexShaderStream != NULL){ - fseek(VertexShaderStream, 0, SEEK_END); - const i64 size = ftell(VertexShaderStream); - rewind(VertexShaderStream); - VertexShaderCode = calloc(size + 1, sizeof(char)); + fseek(f, 0, SEEK_END); + const i64 size = ftell(f); - // Assume the whole file is successfully read - fread(VertexShaderCode, sizeof(char), size, VertexShaderStream); + // Reset the position to the position prior to calling f_get_sz + fseek(f, pos, SEEK_SET); - fclose(VertexShaderStream); - } else { - ERROR("Impossible to open %s. Are you in the right directory?\n", vertex_file_path); - getchar(); - return 0; + return size; +} + +const GLuint +compile_shader(const GladGLContext *gl, const char* file_path, const GLenum shader_type) { + GLuint shaderID = 0; + + if (file_path == NULL) { + WARN("Empty path to shader"); + return (GLuint)0; } - // Read the Fragment Shader code from the file - char* FragmentShaderCode; - FILE* FragmentShaderStream = fopen(fragment_file_path, "r"); - if(FragmentShaderStream != NULL){ - fseek(FragmentShaderStream, 0, SEEK_END); - const i64 size = ftell(FragmentShaderStream); - rewind(FragmentShaderStream); - FragmentShaderCode = calloc(size + 1, sizeof(char)); + GLint Result = GL_FALSE; + int InfoLogLength; + + char* source; + FILE* file = fopen(file_path, "r"); + + shaderID = gl->CreateShader(shader_type); + + if(file != NULL) { + const i64 size = f_get_sz(file); + + source = calloc(size + 1, sizeof(char)); // Assume the whole file is successfully read - fread(FragmentShaderCode, sizeof(char), size, FragmentShaderStream); - LOG("fragment source is %d bytes", size); + fread(source, sizeof(char), size, file); - fclose(FragmentShaderStream); + fclose(file); } else { - ERROR("Impossible to open %s. Are you in the right directory?\n", fragment_file_path); - getchar(); + ERROR("Cannot open %s.\n", file_path); return 0; } - GLint Result = GL_FALSE; - int InfoLogLength; + // Compile shader + INFO("Compiling shader: %s\n", file_path); + char const * src_ptr = source; + gl->ShaderSource(shaderID, 1, &src_ptr , NULL); + gl->CompileShader(shaderID); - // Compile Vertex Shader - INFO("Compiling shader: %s\n", vertex_file_path); - char const * VertexSourcePointer = VertexShaderCode; - gl->ShaderSource(VertexShaderID, 1, &VertexSourcePointer , NULL); - gl->CompileShader(VertexShaderID); - - // Check Vertex Shader - gl->GetShaderiv(VertexShaderID, GL_COMPILE_STATUS, &Result); - gl->GetShaderiv(VertexShaderID, GL_INFO_LOG_LENGTH, &InfoLogLength); + // Check shader + gl->GetShaderiv(shaderID, GL_COMPILE_STATUS, &Result); + gl->GetShaderiv(shaderID, GL_INFO_LOG_LENGTH, &InfoLogLength); if ( InfoLogLength > 0 ) { char* msg = calloc(InfoLogLength + 1, sizeof(char)); - gl->GetShaderInfoLog(VertexShaderID, InfoLogLength, NULL, msg); - ERROR("Compiling shader: %s\n", msg); + gl->GetShaderInfoLog(shaderID, InfoLogLength, NULL, msg); + ERROR("Failed to compile shader: %s\n", msg); free(msg); } + free(source); - // Compile Fragment Shader - INFO("Compiling shader: %s\n", fragment_file_path); - char const * FragmentSourcePointer = FragmentShaderCode; - gl->ShaderSource(FragmentShaderID, 1, &FragmentSourcePointer , NULL); - gl->CompileShader(FragmentShaderID); + return shaderID; +} - // Check Fragment Shader - gl->GetShaderiv(FragmentShaderID, GL_COMPILE_STATUS, &Result); - gl->GetShaderiv(FragmentShaderID, GL_INFO_LOG_LENGTH, &InfoLogLength); - if ( InfoLogLength > 0 ){ - char* msg = calloc(InfoLogLength + 1, sizeof(char)); - gl->GetShaderInfoLog(FragmentShaderID, InfoLogLength, NULL, msg); - ERROR("Compiling shader: %s\n", msg); - free(msg); - } + +// http://www.opengl-tutorial.org/beginners-tutorials/tutorial-2-the-first-triangle/ +GLuint LoadShaders( + const GladGLContext* gl, + const char * vertex_file_path, + const char * fragment_file_path) { + + GLint Result = GL_FALSE; + int InfoLogLength; + + // Create the shaders + const GLuint vertexShader = compile_shader(gl, vertex_file_path, GL_VERTEX_SHADER); + const GLuint fragmentShader = compile_shader(gl, vertex_file_path, GL_FRAGMENT_SHADER); // Link the program INFO("Linking program\n"); GLuint ProgramID = gl->CreateProgram(); - gl->AttachShader(ProgramID, VertexShaderID); - gl->AttachShader(ProgramID, FragmentShaderID); + + if (vertex_file_path != NULL) gl->AttachShader(ProgramID, vertexShader); + if (fragment_file_path != NULL) gl->AttachShader(ProgramID, fragmentShader); + gl->LinkProgram(ProgramID); // Check the program @@ -107,13 +107,11 @@ GLuint LoadShaders( free(msg); } - gl->DetachShader(ProgramID, VertexShaderID); - gl->DetachShader(ProgramID, FragmentShaderID); + gl->DetachShader(ProgramID, vertexShader); + gl->DetachShader(ProgramID, fragmentShader); - gl->DeleteShader(VertexShaderID); - gl->DeleteShader(FragmentShaderID); + gl->DeleteShader(vertexShader); + gl->DeleteShader(fragmentShader); - free(VertexShaderCode); - free(FragmentShaderCode); return ProgramID; } |
