|
|
@ -267,6 +267,10 @@ static Vector3 *tempBuffer; |
|
|
|
static int tempBufferCount = 0; |
|
|
|
static bool useTempBuffer = false; |
|
|
|
|
|
|
|
// Shaders |
|
|
|
static unsigned int defaultVertexShader; |
|
|
|
static unsigned int defaultFragmentShader; |
|
|
|
|
|
|
|
// Shader Programs |
|
|
|
static Shader defaultShader; // Basic shader, support vertex color and diffuse texture |
|
|
|
static Shader currentShader; // Shader to be used on rendering (by default, defaultShader) |
|
|
@ -324,7 +328,8 @@ static int screenHeight; // Default framebuffer height |
|
|
|
//---------------------------------------------------------------------------------- |
|
|
|
#if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) |
|
|
|
static void LoadTextureCompressed(unsigned char *data, int width, int height, int compressedFormat, int mipmapCount); |
|
|
|
static unsigned int LoadShaderProgram(const char *vShaderStr, const char *fShaderStr); // Load custom shader strings and return program id |
|
|
|
static unsigned int LoadShaderPartial(const char *shaderStr, int type); // Load custom shader and return shader id |
|
|
|
static unsigned int LoadShaderProgram(unsigned int vertexShader, unsigned int fragmentShader); // Load custom shader strings and return program id |
|
|
|
|
|
|
|
static Shader LoadShaderDefault(void); // Load default shader (just vertex positioning and texture coloring) |
|
|
|
static void SetShaderDefaultLocations(Shader *shader); // Bind default shader locations (attributes and uniforms) |
|
|
@ -2359,22 +2364,33 @@ Shader LoadShader(char *vsFileName, char *fsFileName) |
|
|
|
for (int i = 0; i < MAX_SHADER_LOCATIONS; i++) shader.locs[i] = -1; |
|
|
|
|
|
|
|
#if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) |
|
|
|
// Shaders loading from external text file |
|
|
|
char *vShaderStr = LoadText(vsFileName); |
|
|
|
char *fShaderStr = LoadText(fsFileName); |
|
|
|
|
|
|
|
if ((vShaderStr != NULL) && (fShaderStr != NULL)) |
|
|
|
{ |
|
|
|
shader.id = LoadShaderProgram(vShaderStr, fShaderStr); |
|
|
|
|
|
|
|
// After shader loading, we TRY to set default location names |
|
|
|
if (shader.id > 0) SetShaderDefaultLocations(&shader); |
|
|
|
unsigned int vertexShader, fragmentShader; |
|
|
|
|
|
|
|
// Shader strings must be freed |
|
|
|
if (vsFileName == NULL) { |
|
|
|
vertexShader = defaultVertexShader; |
|
|
|
} else { |
|
|
|
char *vShaderStr = LoadText(vsFileName); |
|
|
|
vertexShader = LoadShaderPartial(vShaderStr, GL_VERTEX_SHADER); |
|
|
|
free(vShaderStr); |
|
|
|
} |
|
|
|
|
|
|
|
if (fsFileName == NULL) { |
|
|
|
fragmentShader = defaultVertexShader; |
|
|
|
} else { |
|
|
|
char* fShaderStr = LoadText(fsFileName); |
|
|
|
fragmentShader = LoadShaderPartial(fShaderStr, GL_FRAGMENT_SHADER); |
|
|
|
free(fShaderStr); |
|
|
|
} |
|
|
|
|
|
|
|
shader.id = LoadShaderProgram(vertexShader, fragmentShader); |
|
|
|
|
|
|
|
// After shader loading, we TRY to set default location names |
|
|
|
if (shader.id > 0) SetShaderDefaultLocations(&shader); |
|
|
|
|
|
|
|
if (vertexShader != defaultVertexShader) glDeleteShader(vertexShader); |
|
|
|
if (fragmentShader != defaultFragmentShader) glDeleteShader(fragmentShader); |
|
|
|
|
|
|
|
if (shader.id == 0) |
|
|
|
{ |
|
|
|
TraceLog(LOG_WARNING, "Custom shader could not be loaded"); |
|
|
@ -3127,45 +3143,28 @@ static void LoadTextureCompressed(unsigned char *data, int width, int height, in |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
// Load custom shader strings and return program id |
|
|
|
static unsigned int LoadShaderProgram(const char *vShaderStr, const char *fShaderStr) |
|
|
|
static unsigned int LoadShaderPartial(const char *shaderStr, int type) |
|
|
|
{ |
|
|
|
unsigned int program = 0; |
|
|
|
|
|
|
|
#if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) |
|
|
|
GLuint vertexShader; |
|
|
|
GLuint fragmentShader; |
|
|
|
|
|
|
|
vertexShader = glCreateShader(GL_VERTEX_SHADER); |
|
|
|
fragmentShader = glCreateShader(GL_FRAGMENT_SHADER); |
|
|
|
|
|
|
|
const char *pvs = vShaderStr; |
|
|
|
const char *pfs = fShaderStr; |
|
|
|
|
|
|
|
glShaderSource(vertexShader, 1, &pvs, NULL); |
|
|
|
glShaderSource(fragmentShader, 1, &pfs, NULL); |
|
|
|
unsigned int shader = glCreateShader(type); |
|
|
|
glShaderSource(shader, 1, &shaderStr, NULL); |
|
|
|
|
|
|
|
GLint success = 0; |
|
|
|
|
|
|
|
glCompileShader(vertexShader); |
|
|
|
|
|
|
|
glGetShaderiv(vertexShader, GL_COMPILE_STATUS, &success); |
|
|
|
glCompileShader(shader); |
|
|
|
glGetShaderiv(shader, GL_COMPILE_STATUS, &success); |
|
|
|
|
|
|
|
if (success != GL_TRUE) |
|
|
|
{ |
|
|
|
TraceLog(LOG_WARNING, "[VSHDR ID %i] Failed to compile vertex shader...", vertexShader); |
|
|
|
|
|
|
|
TraceLog(LOG_WARNING, "[VSHDR ID %i] Failed to compile shader...", shader); |
|
|
|
int maxLength = 0; |
|
|
|
int length; |
|
|
|
|
|
|
|
glGetShaderiv(vertexShader, GL_INFO_LOG_LENGTH, &maxLength); |
|
|
|
glGetShaderiv(shader, GL_INFO_LOG_LENGTH, &maxLength); |
|
|
|
|
|
|
|
#ifdef _MSC_VER |
|
|
|
char *log = malloc(maxLength); |
|
|
|
#else |
|
|
|
char log[maxLength]; |
|
|
|
#endif |
|
|
|
glGetShaderInfoLog(vertexShader, maxLength, &length, log); |
|
|
|
glGetShaderInfoLog(shader, maxLength, &length, log); |
|
|
|
|
|
|
|
TraceLog(LOG_INFO, "%s", log); |
|
|
|
|
|
|
@ -3173,36 +3172,19 @@ static unsigned int LoadShaderProgram(const char *vShaderStr, const char *fShade |
|
|
|
free(log); |
|
|
|
#endif |
|
|
|
} |
|
|
|
else TraceLog(LOG_INFO, "[VSHDR ID %i] Vertex shader compiled successfully", vertexShader); |
|
|
|
|
|
|
|
glCompileShader(fragmentShader); |
|
|
|
|
|
|
|
glGetShaderiv(fragmentShader, GL_COMPILE_STATUS, &success); |
|
|
|
|
|
|
|
if (success != GL_TRUE) |
|
|
|
{ |
|
|
|
TraceLog(LOG_WARNING, "[FSHDR ID %i] Failed to compile fragment shader...", fragmentShader); |
|
|
|
|
|
|
|
int maxLength = 0; |
|
|
|
int length; |
|
|
|
|
|
|
|
glGetShaderiv(fragmentShader, GL_INFO_LOG_LENGTH, &maxLength); |
|
|
|
else TraceLog(LOG_INFO, "[VSHDR ID %i] Shader compiled successfully", shader); |
|
|
|
|
|
|
|
#ifdef _MSC_VER |
|
|
|
char *log = malloc(maxLength); |
|
|
|
#else |
|
|
|
char log[maxLength]; |
|
|
|
#endif |
|
|
|
glGetShaderInfoLog(fragmentShader, maxLength, &length, log); |
|
|
|
return shader; |
|
|
|
} |
|
|
|
|
|
|
|
TraceLog(LOG_INFO, "%s", log); |
|
|
|
// Load custom shader strings and return program id |
|
|
|
static unsigned int LoadShaderProgram(unsigned int vertexShader, unsigned int fragmentShader) |
|
|
|
{ |
|
|
|
unsigned int program = 0; |
|
|
|
|
|
|
|
#ifdef _MSC_VER |
|
|
|
free(log); |
|
|
|
#endif |
|
|
|
} |
|
|
|
else TraceLog(LOG_INFO, "[FSHDR ID %i] Fragment shader compiled successfully", fragmentShader); |
|
|
|
#if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) |
|
|
|
|
|
|
|
GLint success = 0; |
|
|
|
program = glCreateProgram(); |
|
|
|
|
|
|
|
glAttachShader(program, vertexShader); |
|
|
@ -3250,9 +3232,6 @@ static unsigned int LoadShaderProgram(const char *vShaderStr, const char *fShade |
|
|
|
program = 0; |
|
|
|
} |
|
|
|
else TraceLog(LOG_INFO, "[SHDR ID %i] Shader program loaded successfully", program); |
|
|
|
|
|
|
|
glDeleteShader(vertexShader); |
|
|
|
glDeleteShader(fragmentShader); |
|
|
|
#endif |
|
|
|
return program; |
|
|
|
} |
|
|
@ -3326,7 +3305,9 @@ static Shader LoadShaderDefault(void) |
|
|
|
#endif |
|
|
|
"} \n"; |
|
|
|
|
|
|
|
shader.id = LoadShaderProgram(vDefaultShaderStr, fDefaultShaderStr); |
|
|
|
defaultVertexShader = LoadShaderPartial(vDefaultShaderStr, GL_VERTEX_SHADER); |
|
|
|
defaultFragmentShader = LoadShaderPartial(fDefaultShaderStr, GL_FRAGMENT_SHADER); |
|
|
|
shader.id = LoadShaderProgram(defaultVertexShader, defaultFragmentShader); |
|
|
|
|
|
|
|
if (shader.id > 0) |
|
|
|
{ |
|
|
@ -3388,6 +3369,8 @@ static void UnloadShaderDefault(void) |
|
|
|
{ |
|
|
|
glUseProgram(0); |
|
|
|
|
|
|
|
glDeleteShader(defaultVertexShader); |
|
|
|
glDeleteShader(defaultFragmentShader); |
|
|
|
//glDetachShader(defaultShader, vertexShader); |
|
|
|
//glDetachShader(defaultShader, fragmentShader); |
|
|
|
//glDeleteShader(vertexShader); // Already deleted on shader compilation |
|
|
|