|
@ -1140,7 +1140,7 @@ void rlglDraw(void) |
|
|
|
|
|
|
|
|
glUniformMatrix4fv(currentShader.projectionLoc, 1, false, GetMatrixVector(projection)); |
|
|
glUniformMatrix4fv(currentShader.projectionLoc, 1, false, GetMatrixVector(projection)); |
|
|
glUniformMatrix4fv(currentShader.modelviewLoc, 1, false, GetMatrixVector(modelview)); |
|
|
glUniformMatrix4fv(currentShader.modelviewLoc, 1, false, GetMatrixVector(modelview)); |
|
|
glUniform1i(currentShader.textureLoc, 0); |
|
|
|
|
|
|
|
|
glUniform1i(currentShader.mapDiffuseLoc, 0); |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
// NOTE: We draw in this order: triangle shapes, textured quads and lines |
|
|
// NOTE: We draw in this order: triangle shapes, textured quads and lines |
|
@ -1159,9 +1159,12 @@ void rlglDraw(void) |
|
|
glVertexAttribPointer(currentShader.vertexLoc, 3, GL_FLOAT, 0, 0, 0); |
|
|
glVertexAttribPointer(currentShader.vertexLoc, 3, GL_FLOAT, 0, 0, 0); |
|
|
glEnableVertexAttribArray(currentShader.vertexLoc); |
|
|
glEnableVertexAttribArray(currentShader.vertexLoc); |
|
|
|
|
|
|
|
|
glBindBuffer(GL_ARRAY_BUFFER, trianglesBuffer[1]); |
|
|
|
|
|
glVertexAttribPointer(currentShader.colorLoc, 4, GL_UNSIGNED_BYTE, GL_TRUE, 0, 0); |
|
|
|
|
|
glEnableVertexAttribArray(currentShader.colorLoc); |
|
|
|
|
|
|
|
|
if (currentShader.colorLoc != -1) |
|
|
|
|
|
{ |
|
|
|
|
|
glBindBuffer(GL_ARRAY_BUFFER, trianglesBuffer[1]); |
|
|
|
|
|
glVertexAttribPointer(currentShader.colorLoc, 4, GL_UNSIGNED_BYTE, GL_TRUE, 0, 0); |
|
|
|
|
|
glEnableVertexAttribArray(currentShader.colorLoc); |
|
|
|
|
|
} |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
glDrawArrays(GL_TRIANGLES, 0, triangles.vCounter); |
|
|
glDrawArrays(GL_TRIANGLES, 0, triangles.vCounter); |
|
@ -1191,10 +1194,13 @@ void rlglDraw(void) |
|
|
glVertexAttribPointer(currentShader.texcoordLoc, 2, GL_FLOAT, 0, 0, 0); |
|
|
glVertexAttribPointer(currentShader.texcoordLoc, 2, GL_FLOAT, 0, 0, 0); |
|
|
glEnableVertexAttribArray(currentShader.texcoordLoc); |
|
|
glEnableVertexAttribArray(currentShader.texcoordLoc); |
|
|
|
|
|
|
|
|
glBindBuffer(GL_ARRAY_BUFFER, quadsBuffer[2]); |
|
|
|
|
|
glVertexAttribPointer(currentShader.colorLoc, 4, GL_UNSIGNED_BYTE, GL_TRUE, 0, 0); |
|
|
|
|
|
glEnableVertexAttribArray(currentShader.colorLoc); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (currentShader.colorLoc != -1) |
|
|
|
|
|
{ |
|
|
|
|
|
glBindBuffer(GL_ARRAY_BUFFER, quadsBuffer[2]); |
|
|
|
|
|
glVertexAttribPointer(currentShader.colorLoc, 4, GL_UNSIGNED_BYTE, GL_TRUE, 0, 0); |
|
|
|
|
|
glEnableVertexAttribArray(currentShader.colorLoc); |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, quadsBuffer[3]); |
|
|
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, quadsBuffer[3]); |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
@ -1244,9 +1250,12 @@ void rlglDraw(void) |
|
|
glVertexAttribPointer(currentShader.vertexLoc, 3, GL_FLOAT, 0, 0, 0); |
|
|
glVertexAttribPointer(currentShader.vertexLoc, 3, GL_FLOAT, 0, 0, 0); |
|
|
glEnableVertexAttribArray(currentShader.vertexLoc); |
|
|
glEnableVertexAttribArray(currentShader.vertexLoc); |
|
|
|
|
|
|
|
|
glBindBuffer(GL_ARRAY_BUFFER, linesBuffer[1]); |
|
|
|
|
|
glVertexAttribPointer(currentShader.colorLoc, 4, GL_UNSIGNED_BYTE, GL_TRUE, 0, 0); |
|
|
|
|
|
glEnableVertexAttribArray(currentShader.colorLoc); |
|
|
|
|
|
|
|
|
if (currentShader.colorLoc != -1) |
|
|
|
|
|
{ |
|
|
|
|
|
glBindBuffer(GL_ARRAY_BUFFER, linesBuffer[1]); |
|
|
|
|
|
glVertexAttribPointer(currentShader.colorLoc, 4, GL_UNSIGNED_BYTE, GL_TRUE, 0, 0); |
|
|
|
|
|
glEnableVertexAttribArray(currentShader.colorLoc); |
|
|
|
|
|
} |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
glDrawArrays(GL_LINES, 0, lines.vCounter); |
|
|
glDrawArrays(GL_LINES, 0, lines.vCounter); |
|
@ -1348,13 +1357,16 @@ void rlglDrawModel(Model model, Vector3 position, float rotationAngle, Vector3 r |
|
|
// NOTE: Drawing in OpenGL 3.3+, transform is passed to shader |
|
|
// NOTE: Drawing in OpenGL 3.3+, transform is passed to shader |
|
|
glUniformMatrix4fv(model.shader.projectionLoc, 1, false, GetMatrixVector(projection)); |
|
|
glUniformMatrix4fv(model.shader.projectionLoc, 1, false, GetMatrixVector(projection)); |
|
|
glUniformMatrix4fv(model.shader.modelviewLoc, 1, false, GetMatrixVector(modelviewworld)); |
|
|
glUniformMatrix4fv(model.shader.modelviewLoc, 1, false, GetMatrixVector(modelviewworld)); |
|
|
glUniform1i(model.shader.textureLoc, 0); // Texture fits in texture unit 0 (Check glActiveTexture()) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// Apply color tinting to model |
|
|
// Apply color tinting to model |
|
|
// NOTE: Just update one uniform on fragment shader |
|
|
// NOTE: Just update one uniform on fragment shader |
|
|
float vColor[4] = { (float)color.r/255, (float)color.g/255, (float)color.b/255, (float)color.a/255 }; |
|
|
float vColor[4] = { (float)color.r/255, (float)color.g/255, (float)color.b/255, (float)color.a/255 }; |
|
|
|
|
|
|
|
|
glUniform4fv(model.shader.tintColorLoc, 1, vColor); |
|
|
glUniform4fv(model.shader.tintColorLoc, 1, vColor); |
|
|
|
|
|
|
|
|
|
|
|
// Set shader textures (diffuse, normal, specular) |
|
|
|
|
|
glActiveTexture(GL_TEXTURE0); |
|
|
|
|
|
glBindTexture(GL_TEXTURE_2D, model.shader.texDiffuseId); |
|
|
|
|
|
//glUniform1i(model.shader.mapDiffuseLoc, 0); // Diffuse texture fits in texture unit 0 |
|
|
|
|
|
|
|
|
if (vaoSupported) |
|
|
if (vaoSupported) |
|
|
{ |
|
|
{ |
|
@ -1377,20 +1389,16 @@ void rlglDrawModel(Model model, Vector3 position, float rotationAngle, Vector3 r |
|
|
glEnableVertexAttribArray(model.shader.normalLoc); |
|
|
glEnableVertexAttribArray(model.shader.normalLoc); |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
glActiveTexture(GL_TEXTURE0); |
|
|
|
|
|
glBindTexture(GL_TEXTURE_2D, model.texture.id); |
|
|
|
|
|
//glActiveTexture(GL_TEXTURE1); |
|
|
|
|
|
//glBindTexture(GL_TEXTURE_2D, 4); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// Draw call! |
|
|
glDrawArrays(GL_TRIANGLES, 0, model.mesh.vertexCount); |
|
|
glDrawArrays(GL_TRIANGLES, 0, model.mesh.vertexCount); |
|
|
|
|
|
|
|
|
glBindTexture(GL_TEXTURE_2D, 0); // Unbind textures |
|
|
glBindTexture(GL_TEXTURE_2D, 0); // Unbind textures |
|
|
glActiveTexture(GL_TEXTURE0); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
glActiveTexture(GL_TEXTURE0); // Set shader active texture to default 0 |
|
|
|
|
|
|
|
|
if (vaoSupported) glBindVertexArray(0); // Unbind VAO |
|
|
if (vaoSupported) glBindVertexArray(0); // Unbind VAO |
|
|
else glBindBuffer(GL_ARRAY_BUFFER, 0); // Unbind VBOs |
|
|
else glBindBuffer(GL_ARRAY_BUFFER, 0); // Unbind VBOs |
|
|
|
|
|
|
|
|
glUseProgram(0); |
|
|
|
|
|
|
|
|
glUseProgram(0); // Unbind shader program |
|
|
#endif |
|
|
#endif |
|
|
|
|
|
|
|
|
#if defined (GRAPHICS_API_OPENGL_11) || defined(GRAPHICS_API_OPENGL_33) |
|
|
#if defined (GRAPHICS_API_OPENGL_11) || defined(GRAPHICS_API_OPENGL_33) |
|
@ -1968,6 +1976,8 @@ unsigned int rlglLoadShaderFromText(char *vShaderStr, char *fShaderStr) |
|
|
glAttachShader(program, fragmentShader); |
|
|
glAttachShader(program, fragmentShader); |
|
|
|
|
|
|
|
|
glLinkProgram(program); |
|
|
glLinkProgram(program); |
|
|
|
|
|
|
|
|
|
|
|
// NOTE: All uniform variables are intitialised to 0 when a program links |
|
|
|
|
|
|
|
|
glGetProgramiv(program, GL_LINK_STATUS, &success); |
|
|
glGetProgramiv(program, GL_LINK_STATUS, &success); |
|
|
|
|
|
|
|
@ -2041,6 +2051,11 @@ Shader rlglLoadShader(char *vsFileName, char *fsFileName) |
|
|
// Shader strings must be freed |
|
|
// Shader strings must be freed |
|
|
free(vShaderStr); |
|
|
free(vShaderStr); |
|
|
free(fShaderStr); |
|
|
free(fShaderStr); |
|
|
|
|
|
|
|
|
|
|
|
// Set shader textures ids (all 0 by default) |
|
|
|
|
|
shader.texDiffuseId = 0; |
|
|
|
|
|
shader.texNormalId = 0; |
|
|
|
|
|
shader.texSpecularId = 0; |
|
|
|
|
|
|
|
|
// Get handles to GLSL input attibute locations |
|
|
// Get handles to GLSL input attibute locations |
|
|
//------------------------------------------------------------------- |
|
|
//------------------------------------------------------------------- |
|
@ -2048,14 +2063,17 @@ Shader rlglLoadShader(char *vsFileName, char *fsFileName) |
|
|
shader.texcoordLoc = glGetAttribLocation(shader.id, "vertexTexCoord"); |
|
|
shader.texcoordLoc = glGetAttribLocation(shader.id, "vertexTexCoord"); |
|
|
shader.normalLoc = glGetAttribLocation(shader.id, "vertexNormal"); |
|
|
shader.normalLoc = glGetAttribLocation(shader.id, "vertexNormal"); |
|
|
// NOTE: custom shader does not use colorLoc |
|
|
// NOTE: custom shader does not use colorLoc |
|
|
|
|
|
shader.colorLoc = -1; |
|
|
|
|
|
|
|
|
// Get handles to GLSL uniform locations (vertex shader) |
|
|
// Get handles to GLSL uniform locations (vertex shader) |
|
|
shader.modelviewLoc = glGetUniformLocation(shader.id, "modelviewMatrix"); |
|
|
shader.modelviewLoc = glGetUniformLocation(shader.id, "modelviewMatrix"); |
|
|
shader.projectionLoc = glGetUniformLocation(shader.id, "projectionMatrix"); |
|
|
shader.projectionLoc = glGetUniformLocation(shader.id, "projectionMatrix"); |
|
|
|
|
|
|
|
|
// Get handles to GLSL uniform locations (fragment shader) |
|
|
// Get handles to GLSL uniform locations (fragment shader) |
|
|
shader.textureLoc = glGetUniformLocation(shader.id, "texture0"); |
|
|
|
|
|
shader.tintColorLoc = glGetUniformLocation(shader.id, "tintColor"); |
|
|
shader.tintColorLoc = glGetUniformLocation(shader.id, "tintColor"); |
|
|
|
|
|
shader.mapDiffuseLoc = glGetUniformLocation(shader.id, "texture0"); |
|
|
|
|
|
shader.mapNormalLoc = -1; // It can be set later |
|
|
|
|
|
shader.mapSpecularLoc = -1; // It can be set later |
|
|
//-------------------------------------------------------------------- |
|
|
//-------------------------------------------------------------------- |
|
|
#endif |
|
|
#endif |
|
|
|
|
|
|
|
@ -2152,18 +2170,66 @@ void SetShaderValue(Shader shader, int uniformLoc, float *value, int size) |
|
|
glUseProgram(0); |
|
|
glUseProgram(0); |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
void SetShaderTexture(Shader shader, int uniformLoc, Texture2D texture) |
|
|
|
|
|
|
|
|
void SetShaderMapDiffuse(Shader *shader, Texture2D texture) |
|
|
{ |
|
|
{ |
|
|
glUseProgram(shader.id); |
|
|
|
|
|
glActiveTexture(GL_TEXTURE1); |
|
|
|
|
|
glBindTexture(GL_TEXTURE_2D, texture.id); |
|
|
|
|
|
|
|
|
shader->texDiffuseId = texture.id; |
|
|
|
|
|
|
|
|
glUniform1i(uniformLoc, 1); // Texture fits in texture unit 1 (Check glActiveTexture()) |
|
|
|
|
|
|
|
|
glUseProgram(shader->id); |
|
|
|
|
|
|
|
|
|
|
|
glActiveTexture(GL_TEXTURE0); |
|
|
|
|
|
glBindTexture(GL_TEXTURE_2D, shader->texDiffuseId); |
|
|
|
|
|
|
|
|
|
|
|
glUniform1i(shader->mapDiffuseLoc, 0); // Texture fits in active texture unit 0 |
|
|
|
|
|
|
|
|
|
|
|
glBindTexture(GL_TEXTURE_2D, 0); |
|
|
glActiveTexture(GL_TEXTURE0); |
|
|
glActiveTexture(GL_TEXTURE0); |
|
|
glUseProgram(0); |
|
|
glUseProgram(0); |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
void SetShaderMapNormal(Shader *shader, const char *uniformName, Texture2D texture) |
|
|
|
|
|
{ |
|
|
|
|
|
shader->mapNormalLoc = glGetUniformLocation(shader->id, uniformName); |
|
|
|
|
|
|
|
|
|
|
|
if (shader->mapNormalLoc == -1) TraceLog(WARNING, "[SHDR ID %i] Shader location for %s could not be found", shader->id, uniformName); |
|
|
|
|
|
else |
|
|
|
|
|
{ |
|
|
|
|
|
shader->texNormalId = texture.id; |
|
|
|
|
|
|
|
|
|
|
|
glUseProgram(shader->id); |
|
|
|
|
|
|
|
|
|
|
|
glActiveTexture(GL_TEXTURE1); |
|
|
|
|
|
glBindTexture(GL_TEXTURE_2D, shader->texNormalId); |
|
|
|
|
|
|
|
|
|
|
|
glUniform1i(shader->mapNormalLoc, 1); // Texture fits in active texture unit 1 |
|
|
|
|
|
|
|
|
|
|
|
glBindTexture(GL_TEXTURE_2D, 0); |
|
|
|
|
|
glActiveTexture(GL_TEXTURE0); |
|
|
|
|
|
glUseProgram(0); |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
void SetShaderMapSpecular(Shader *shader, const char *uniformName, Texture2D texture) |
|
|
|
|
|
{ |
|
|
|
|
|
shader->mapSpecularLoc = glGetUniformLocation(shader->id, uniformName); |
|
|
|
|
|
|
|
|
|
|
|
if (shader->mapSpecularLoc == -1) TraceLog(WARNING, "[SHDR ID %i] Shader location for %s could not be found", shader->id, uniformName); |
|
|
|
|
|
else |
|
|
|
|
|
{ |
|
|
|
|
|
shader->texSpecularId = texture.id; |
|
|
|
|
|
|
|
|
|
|
|
glUseProgram(shader->id); |
|
|
|
|
|
|
|
|
|
|
|
glActiveTexture(GL_TEXTURE2); |
|
|
|
|
|
glBindTexture(GL_TEXTURE_2D, shader->texSpecularId); |
|
|
|
|
|
|
|
|
|
|
|
glUniform1i(shader->mapSpecularLoc, 2); // Texture fits in active texture unit 0 |
|
|
|
|
|
|
|
|
|
|
|
glBindTexture(GL_TEXTURE_2D, 0); |
|
|
|
|
|
glActiveTexture(GL_TEXTURE0); |
|
|
|
|
|
glUseProgram(0); |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
#if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) |
|
|
#if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) |
|
|
void PrintProjectionMatrix(void) |
|
|
void PrintProjectionMatrix(void) |
|
|
{ |
|
|
{ |
|
@ -2281,13 +2347,17 @@ static Shader LoadDefaultShader(void) |
|
|
shader.texcoordLoc = glGetAttribLocation(shader.id, "vertexTexCoord"); |
|
|
shader.texcoordLoc = glGetAttribLocation(shader.id, "vertexTexCoord"); |
|
|
shader.colorLoc = glGetAttribLocation(shader.id, "vertexColor"); |
|
|
shader.colorLoc = glGetAttribLocation(shader.id, "vertexColor"); |
|
|
// NOTE: default shader does not use normalLoc |
|
|
// NOTE: default shader does not use normalLoc |
|
|
|
|
|
shader.normalLoc = -1; |
|
|
|
|
|
|
|
|
// Get handles to GLSL uniform locations (vertex shader) |
|
|
// Get handles to GLSL uniform locations (vertex shader) |
|
|
shader.modelviewLoc = glGetUniformLocation(shader.id, "modelviewMatrix"); |
|
|
shader.modelviewLoc = glGetUniformLocation(shader.id, "modelviewMatrix"); |
|
|
shader.projectionLoc = glGetUniformLocation(shader.id, "projectionMatrix"); |
|
|
shader.projectionLoc = glGetUniformLocation(shader.id, "projectionMatrix"); |
|
|
|
|
|
|
|
|
// Get handles to GLSL uniform locations (fragment shader) |
|
|
// Get handles to GLSL uniform locations (fragment shader) |
|
|
shader.textureLoc = glGetUniformLocation(shader.id, "texture0"); |
|
|
|
|
|
|
|
|
shader.tintColorLoc = -1; |
|
|
|
|
|
shader.mapDiffuseLoc = glGetUniformLocation(shader.id, "texture0"); |
|
|
|
|
|
shader.mapNormalLoc = -1; // It can be set later |
|
|
|
|
|
shader.mapSpecularLoc = -1; // It can be set later |
|
|
//-------------------------------------------------------------------- |
|
|
//-------------------------------------------------------------------- |
|
|
|
|
|
|
|
|
return shader; |
|
|
return shader; |
|
@ -2353,14 +2423,17 @@ static Shader LoadSimpleShader(void) |
|
|
shader.texcoordLoc = glGetAttribLocation(shader.id, "vertexTexCoord"); |
|
|
shader.texcoordLoc = glGetAttribLocation(shader.id, "vertexTexCoord"); |
|
|
shader.normalLoc = glGetAttribLocation(shader.id, "vertexNormal"); |
|
|
shader.normalLoc = glGetAttribLocation(shader.id, "vertexNormal"); |
|
|
// NOTE: simple shader does not use colorLoc |
|
|
// NOTE: simple shader does not use colorLoc |
|
|
|
|
|
shader.colorLoc = -1; |
|
|
|
|
|
|
|
|
// Get handles to GLSL uniform locations (vertex shader) |
|
|
// Get handles to GLSL uniform locations (vertex shader) |
|
|
shader.modelviewLoc = glGetUniformLocation(shader.id, "modelviewMatrix"); |
|
|
shader.modelviewLoc = glGetUniformLocation(shader.id, "modelviewMatrix"); |
|
|
shader.projectionLoc = glGetUniformLocation(shader.id, "projectionMatrix"); |
|
|
shader.projectionLoc = glGetUniformLocation(shader.id, "projectionMatrix"); |
|
|
|
|
|
|
|
|
// Get handles to GLSL uniform locations (fragment shader) |
|
|
// Get handles to GLSL uniform locations (fragment shader) |
|
|
shader.textureLoc = glGetUniformLocation(shader.id, "texture0"); |
|
|
|
|
|
shader.tintColorLoc = glGetUniformLocation(shader.id, "tintColor"); |
|
|
shader.tintColorLoc = glGetUniformLocation(shader.id, "tintColor"); |
|
|
|
|
|
shader.mapDiffuseLoc = glGetUniformLocation(shader.id, "texture0"); |
|
|
|
|
|
shader.mapNormalLoc = -1; // It can be set later |
|
|
|
|
|
shader.mapSpecularLoc = -1; // It can be set later |
|
|
//-------------------------------------------------------------------- |
|
|
//-------------------------------------------------------------------- |
|
|
|
|
|
|
|
|
return shader; |
|
|
return shader; |
|
|