From 4d5d1e0434497d5755fb596675554a8cee74f9f8 Mon Sep 17 00:00:00 2001 From: Ray Date: Mon, 5 Feb 2018 01:03:13 +0100 Subject: [PATCH] Added function LoadShaderCode() Allows loading of shader from text code string directly --- src/raylib.h | 3 ++- src/rlgl.c | 53 ++++++++++++++++++++++++++-------------------------- 2 files changed, 29 insertions(+), 27 deletions(-) diff --git a/src/raylib.h b/src/raylib.h index 3d1f2a490..e3f30e434 100644 --- a/src/raylib.h +++ b/src/raylib.h @@ -1044,7 +1044,8 @@ RLAPI RayHitInfo GetCollisionRayGround(Ray ray, float groundHeight); // Shader loading/unloading functions RLAPI char *LoadText(const char *fileName); // Load chars array from text file -RLAPI Shader LoadShader(char *vsFileName, char *fsFileName); // Load shader from files and bind default locations +RLAPI Shader LoadShader(const char *vsFileName, const char *fsFileName); // Load shader from files and bind default locations +RLAPI Shader LoadShaderCode(char *vsCode, char *fsCode); // Load shader from code strings and bind default locations RLAPI void UnloadShader(Shader shader); // Unload shader from GPU memory (VRAM) RLAPI Shader GetShaderDefault(void); // Get default shader diff --git a/src/rlgl.c b/src/rlgl.c index 63860f1c9..cd68cbdc5 100644 --- a/src/rlgl.c +++ b/src/rlgl.c @@ -2324,39 +2324,40 @@ char *LoadText(const char *fileName) // Load shader from files and bind default locations // NOTE: If shader string is NULL, using default vertex/fragment shaders -Shader LoadShader(char *vsFileName, char *fsFileName) +Shader LoadShader(const char *vsFileName, const char *fsFileName) { Shader shader = { 0 }; + + char *vShaderStr = NULL; + char *fShaderStr = NULL; + + if (vsFileName != NULL) vShaderStr = LoadText(vsFileName); + if (fsFileName != NULL) fShaderStr = LoadText(fsFileName); + shader = LoadShaderCode(vShaderStr, fShaderStr); + + if (vShaderStr != NULL) free(vShaderStr); + if (fShaderStr != NULL) free(fShaderStr); + + return shader; +} + +// Load shader from code strings +// NOTE: If shader string is NULL, using default vertex/fragment shaders +Shader LoadShaderCode(char *vsCode, char *fsCode) +{ + Shader shader = { 0 }; + // NOTE: All locations must be reseted to -1 (no location) for (int i = 0; i < MAX_SHADER_LOCATIONS; i++) shader.locs[i] = -1; - + #if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) unsigned int vertexShaderId = defaultVShaderId; unsigned int fragmentShaderId = defaultFShaderId; - - if (vsFileName != NULL) - { - char *vShaderStr = LoadText(vsFileName); - - if (vShaderStr != NULL) - { - vertexShaderId = CompileShader(vShaderStr, GL_VERTEX_SHADER); - free(vShaderStr); - } - } - - if (fsFileName != NULL) - { - char* fShaderStr = LoadText(fsFileName); - - if (fShaderStr != NULL) - { - fragmentShaderId = CompileShader(fShaderStr, GL_FRAGMENT_SHADER); - free(fShaderStr); - } - } - + + if (vsCode != NULL) vertexShaderId = CompileShader(vsCode, GL_VERTEX_SHADER); + if (fsCode != NULL) fragmentShaderId = CompileShader(fsCode, GL_FRAGMENT_SHADER); + if ((vertexShaderId == defaultVShaderId) && (fragmentShaderId == defaultFShaderId)) shader = defaultShader; else { @@ -2399,7 +2400,7 @@ Shader LoadShader(char *vsFileName, char *fsFileName) TraceLog(LOG_DEBUG, "[SHDR ID %i] Active uniform [%s] set at location: %i", shader.id, name, location); } #endif - + return shader; }