diff --git a/src/common/shaderloader.hpp b/src/common/shaderloader.hpp index ab04ca5..1b874ee 100644 --- a/src/common/shaderloader.hpp +++ b/src/common/shaderloader.hpp @@ -2,9 +2,11 @@ #define _SHADERLOADER_H_ #include +#include #include #include #include +#include #include #include @@ -149,6 +151,9 @@ int loadShadersFromFile(const char* file_path, struct ShaderRegistry *registry) char *name; char *type; char *path; + char *file_path_copy = (char*) calloc(strlen(file_path), sizeof(char)); + strncpy(file_path_copy, file_path, strlen(file_path)); + char *base = dirname((char*) file_path_copy); while((size = getline(&line, &size, fp)) != -1) { if(size == 0) { // Skipping, line length 0 @@ -168,10 +173,21 @@ int loadShadersFromFile(const char* file_path, struct ShaderRegistry *registry) // Invalid line, not enough elements. // @TODO Inform the user. free(line_copy); - name = type = path = NULL; + name = type = path = NULL; continue; } + // Strip trailing new lines from the path. + path[strcspn(path, "\n")] = 0; + + // Convert any paths as relative to the basename of the file_path they + // were loaded from. + int real_path_size = strlen(base) + 1 + strlen(path) + 1; + char *shader_path = (char*) calloc(real_path_size, sizeof(char)); + strncat(shader_path, base, strlen(base)); + strcat(shader_path + strlen(base), "/"); + strncat(shader_path + strlen(base) + 1, path, strlen(path)); + // Validate type enum ShaderType shader_type; if(strcmp("fragment", type) == 0) { @@ -188,18 +204,26 @@ int loadShadersFromFile(const char* file_path, struct ShaderRegistry *registry) // Invalid line, unknown type. // @TODO Inform the user. free(line_copy); + free(shader_path); name = type = path = NULL; continue; } - GLuint shader_id = compile_shader(path, shader_type); + GLuint shader_id = compile_shader(shader_path, shader_type); if(shader_id == 0) { // Error in compilation of the shader // @TODO Inform the user. free(line_copy); + free(shader_path); name = type = path = NULL; continue; } + + // Add to registry + + // Cleanup + free(line_copy); + free(shader_path); } return 0; }