|  | @ -3541,59 +3541,56 @@ unsigned int rlLoadShaderCode(const char *vsCode, const char *fsCode) | 
														
													
														
															
																|  |  | unsigned int id = 0; |  |  | unsigned int id = 0; | 
														
													
														
															
																|  |  |  |  |  |  | 
														
													
														
															
																|  |  | #if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) |  |  | #if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) | 
														
													
														
															
																|  |  | unsigned int vertexShaderId = n">RLGL.State.defaultVShaderId; |  |  |  | 
														
													
														
															
																|  |  | unsigned int fragmentShaderId = n">RLGL.State.defaultFShaderId; |  |  |  | 
														
													
														
															
																|  |  |  |  |  | unsigned int vertexShaderId = mi">0; | 
														
													
														
															
																|  |  |  |  |  | unsigned int fragmentShaderId = mi">0; | 
														
													
														
															
																|  |  |  |  |  |  | 
														
													
														
															
																|  |  | if (vsCode != NULL) vertexShaderId = rlCompileShader(vsCode, GL_VERTEX_SHADER); |  |  | if (vsCode != NULL) vertexShaderId = rlCompileShader(vsCode, GL_VERTEX_SHADER); | 
														
													
														
															
																|  |  | if (fsCode != NULL) fragmentShaderId = rlCompileShader(fsCode, GL_FRAGMENT_SHADER); |  |  | if (fsCode != NULL) fragmentShaderId = rlCompileShader(fsCode, GL_FRAGMENT_SHADER); | 
														
													
														
															
																|  |  |  |  |  |  | 
														
													
														
															
																|  |  | if ((vertexShaderId == RLGL.State.defaultVShaderId) && (fragmentShaderId == RLGL.State.defaultFShaderId)) id = RLGL.State.defaultShaderId; |  |  |  | 
														
													
														
															
																|  |  | else |  |  |  | 
														
													
														
															
																|  |  | { |  |  |  | 
														
													
														
															
																|  |  | if ((vertexShaderId != 0) && (fragmentShaderId != 0)) |  |  |  | 
														
													
														
															
																|  |  | { |  |  |  | 
														
													
														
															
																|  |  | id = rlLoadShaderProgram(vertexShaderId, fragmentShaderId); |  |  |  | 
														
													
														
															
																|  |  |  |  |  | // Load shader program if provided vertex/fragment shaders compile successfully | 
														
													
														
															
																|  |  |  |  |  | if ((vertexShaderId != 0) && (fragmentShaderId != 0)) id = rlLoadShaderProgram(vertexShaderId, fragmentShaderId); | 
														
													
														
															
																|  |  |  |  |  |  | 
														
													
														
															
																|  |  | if (vertexShaderId != RLGL.State.defaultVShaderId) |  |  |  | 
														
													
														
															
																|  |  | { |  |  |  | 
														
													
														
															
																|  |  | // Detach shader before deletion to make sure memory is freed |  |  |  | 
														
													
														
															
																|  |  | glDetachShader(id, vertexShaderId); |  |  |  | 
														
													
														
															
																|  |  | glDeleteShader(vertexShaderId); |  |  |  | 
														
													
														
															
																|  |  | } |  |  |  | 
														
													
														
															
																|  |  | if (fragmentShaderId != RLGL.State.defaultFShaderId) |  |  |  | 
														
													
														
															
																|  |  | { |  |  |  | 
														
													
														
															
																|  |  | // Detach shader before deletion to make sure memory is freed |  |  |  | 
														
													
														
															
																|  |  | glDetachShader(id, fragmentShaderId); |  |  |  | 
														
													
														
															
																|  |  | glDeleteShader(fragmentShaderId); |  |  |  | 
														
													
														
															
																|  |  | } |  |  |  | 
														
													
														
															
																|  |  | } |  |  |  | 
														
													
														
															
																|  |  |  |  |  |  | 
														
													
														
															
																|  |  | if (id == 0) |  |  |  | 
														
													
														
															
																|  |  | { |  |  |  | 
														
													
														
															
																|  |  | TRACELOG(RL_LOG_WARNING, "SHADER: Failed to load custom shader code"); |  |  |  | 
														
													
														
															
																|  |  | id = RLGL.State.defaultShaderId; |  |  |  | 
														
													
														
															
																|  |  | } |  |  |  | 
														
													
														
															
																|  |  |  |  |  | // Once shader program is compiled, we can detach and delete vertex/fragment shaders | 
														
													
														
															
																|  |  |  |  |  | // NOTE: Vertex | 
														
													
														
															
																|  |  |  |  |  | if (vertexShaderId != 0) | 
														
													
														
															
																|  |  |  |  |  | { | 
														
													
														
															
																|  |  |  |  |  | // Detach shader before deletion to make sure memory is freed | 
														
													
														
															
																|  |  |  |  |  | glDetachShader(id, vertexShaderId); | 
														
													
														
															
																|  |  |  |  |  | glDeleteShader(vertexShaderId); | 
														
													
														
															
																|  |  |  |  |  | } | 
														
													
														
															
																|  |  |  |  |  | if (fragmentShaderId != 0) | 
														
													
														
															
																|  |  |  |  |  | { | 
														
													
														
															
																|  |  |  |  |  | // Detach shader before deletion to make sure memory is freed | 
														
													
														
															
																|  |  |  |  |  | glDetachShader(id, fragmentShaderId); | 
														
													
														
															
																|  |  |  |  |  | glDeleteShader(fragmentShaderId); | 
														
													
														
															
																|  |  | } |  |  | } | 
														
													
														
															
																|  |  |  |  |  |  | 
														
													
														
															
																|  |  | // Get available shader uniforms |  |  |  | 
														
													
														
															
																|  |  | // NOTE: This information is useful for debug... |  |  |  | 
														
													
														
															
																|  |  | int uniformCount = -1; |  |  |  | 
														
													
														
															
																|  |  |  |  |  |  | 
														
													
														
															
																|  |  | glGetProgramiv(id, GL_ACTIVE_UNIFORMS, &uniformCount); |  |  |  | 
														
													
														
															
																|  |  |  |  |  |  | 
														
													
														
															
																|  |  | for (int i = 0; i < uniformCount; i++) |  |  |  | 
														
													
														
															
																|  |  |  |  |  | if (id == 0) | 
														
													
														
															
																|  |  | { |  |  | { | 
														
													
														
															
																|  |  | int namelen = -1; |  |  |  | 
														
													
														
															
																|  |  | int num = -1; |  |  |  | 
														
													
														
															
																|  |  | char name[256] = { 0 };     // Assume no variable names longer than 256 |  |  |  | 
														
													
														
															
																|  |  | GLenum type = GL_ZERO; |  |  |  | 
														
													
														
															
																|  |  |  |  |  | // In case shader loading fails, we return the default shader | 
														
													
														
															
																|  |  |  |  |  | TRACELOG(RL_LOG_WARNING, "SHADER: Failed to load custom shader code, using default shader"); | 
														
													
														
															
																|  |  |  |  |  | id = RLGL.State.defaultShaderId; | 
														
													
														
															
																|  |  |  |  |  | } | 
														
													
														
															
																|  |  |  |  |  | else | 
														
													
														
															
																|  |  |  |  |  | { | 
														
													
														
															
																|  |  |  |  |  | // Get available shader uniforms | 
														
													
														
															
																|  |  |  |  |  | // NOTE: This information is useful for debug... | 
														
													
														
															
																|  |  |  |  |  | int uniformCount = -1; | 
														
													
														
															
																|  |  |  |  |  | glGetProgramiv(id, GL_ACTIVE_UNIFORMS, &uniformCount); | 
														
													
														
															
																|  |  |  |  |  |  | 
														
													
														
															
																|  |  | // Get the name of the uniforms |  |  |  | 
														
													
														
															
																|  |  | glGetActiveUniform(id, i, sizeof(name) - 1, &namelen, &num, &type, name); |  |  |  | 
														
													
														
															
																|  |  |  |  |  | for (int i = 0; i < uniformCount; i++) | 
														
													
														
															
																|  |  |  |  |  | { | 
														
													
														
															
																|  |  |  |  |  | int namelen = -1; | 
														
													
														
															
																|  |  |  |  |  | int num = -1; | 
														
													
														
															
																|  |  |  |  |  | char name[256] = { 0 };     // Assume no variable names longer than 256 | 
														
													
														
															
																|  |  |  |  |  | GLenum type = GL_ZERO; | 
														
													
														
															
																|  |  |  |  |  |  | 
														
													
														
															
																|  |  | name[namelen] = 0; |  |  |  | 
														
													
														
															
																|  |  |  |  |  | // Get the name of the uniforms | 
														
													
														
															
																|  |  |  |  |  | glGetActiveUniform(id, i, sizeof(name) - 1, &namelen, &num, &type, name); | 
														
													
														
															
																|  |  |  |  |  |  | 
														
													
														
															
																|  |  | TRACELOGD("SHADER: [ID %i] Active uniform (%s) set at location: %i", id, name, glGetUniformLocation(id, name)); |  |  |  | 
														
													
														
															
																|  |  |  |  |  | name[namelen] = 0; | 
														
													
														
															
																|  |  |  |  |  | TRACELOGD("SHADER: [ID %i] Active uniform (%s) set at location: %i", id, name, glGetUniformLocation(id, name)); | 
														
													
														
															
																|  |  |  |  |  | } | 
														
													
														
															
																|  |  | } |  |  | } | 
														
													
														
															
																|  |  | #endif |  |  | #endif | 
														
													
														
															
																|  |  |  |  |  |  | 
														
													
												
													
														
															
																|  | @ -4341,7 +4338,8 @@ static void rlLoadShaderDefault(void) | 
														
													
														
															
																|  |  | "}                                  \n"; |  |  | "}                                  \n"; | 
														
													
														
															
																|  |  | #endif |  |  | #endif | 
														
													
														
															
																|  |  |  |  |  |  | 
														
													
														
															
																|  |  | // NOTE: Compiled vertex/fragment shaders are kept for re-use |  |  |  | 
														
													
														
															
																|  |  |  |  |  | // NOTE: Compiled vertex/fragment shaders are not deleted, | 
														
													
														
															
																|  |  |  |  |  | // they are kept for re-use as default shaders in case some shader loading fails | 
														
													
														
															
																|  |  | RLGL.State.defaultVShaderId = rlCompileShader(defaultVShaderCode, GL_VERTEX_SHADER);     // Compile default vertex shader |  |  | RLGL.State.defaultVShaderId = rlCompileShader(defaultVShaderCode, GL_VERTEX_SHADER);     // Compile default vertex shader | 
														
													
														
															
																|  |  | RLGL.State.defaultFShaderId = rlCompileShader(defaultFShaderCode, GL_FRAGMENT_SHADER);   // Compile default fragment shader |  |  | RLGL.State.defaultFShaderId = rlCompileShader(defaultFShaderCode, GL_FRAGMENT_SHADER);   // Compile default fragment shader | 
														
													
														
															
																|  |  |  |  |  |  | 
														
													
												
													
														
															
																|  |  |