2
0
Эх сурвалжийг харах

Added function LoadShaderCode()

Allows loading of shader from text code string directly
Ray 7 жил өмнө
parent
commit
4d5d1e0434
2 өөрчлөгдсөн 29 нэмэгдсэн , 27 устгасан
  1. 2 1
      src/raylib.h
  2. 27 26
      src/rlgl.c

+ 2 - 1
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

+ 27 - 26
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;
 }