summaryrefslogtreecommitdiff
path: root/source/modules/asura-core/graphics/shader.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'source/modules/asura-core/graphics/shader.cpp')
-rw-r--r--source/modules/asura-core/graphics/shader.cpp65
1 files changed, 59 insertions, 6 deletions
diff --git a/source/modules/asura-core/graphics/shader.cpp b/source/modules/asura-core/graphics/shader.cpp
index e6779df..662ce5e 100644
--- a/source/modules/asura-core/graphics/shader.cpp
+++ b/source/modules/asura-core/graphics/shader.cpp
@@ -1,5 +1,6 @@
#include <asura-utils/exceptions/exception.h>
+#include "gl.h"
#include "shader.h"
using namespace std;
@@ -9,6 +10,17 @@ namespace AsuraEngine
namespace Graphics
{
+ ///
+ /// texture unit
+ ///
+ static int _texture_unit = 0;
+
+ const char* Shader::ASLSemantics[] = {
+ "asura_model_matrix", // BUILTIN_UNIFORM_MODEL_MATRIX
+ "asura_view_matrix", // BUILTIN_UNIFORM_VIEW_MATRIX
+ "asura_projection_matrix", // BUILTIN_UNIFORM_PROJECTION_MATRIX
+ };
+
Shader::Shader()
{
}
@@ -85,13 +97,33 @@ namespace AsuraEngine
throw Exception("Link shader program failed:\n%s", warnning.c_str());
}
+ // mvplocation
+ mMVP[MATRIX_MODE_MODEL] = glGetUniformLocation(mProgram, ASLSemantics[BUILTIN_UNIFORM_MODEL_MATRIX]);
+ mMVP[MATRIX_MODE_VIEW] = glGetUniformLocation(mProgram, ASLSemantics[BUILTIN_UNIFORM_VIEW_MATRIX]);
+ mMVP[MATRIX_MODE_PROJECTION] = glGetUniformLocation(mProgram, ASLSemantics[BUILTIN_UNIFORM_PROJECTION_MATRIX]);
+
return true;
}
+ void Shader::OnUse()
+ {
+ _texture_unit = 0;
+ SetBuiltInUniforms();
+ }
+
+ void Shader::OnUnuse()
+ {
+ _texture_unit = 0;
+ }
+
+ int Shader::GetAttributeLocation(const std::string& name)
+ {
+ GLint loc = glGetAttribLocation(mProgram, name.c_str());
+ return loc;
+ }
+
uint Shader::GetUniformLocation(const std::string& uniform)
{
- // This function returns -1 if name does not correspond to an active uniform variable
- // in program or if name starts with the reserved prefix "gl_".
GLint loc = glGetUniformLocation(mProgram, uniform.c_str());
return loc;
}
@@ -102,7 +134,7 @@ namespace AsuraEngine
return loc != -1;
}
- GLuint Shader::GetGLProgramHandle()
+ GLuint Shader::GetGLProgram()
{
return mProgram;
}
@@ -113,10 +145,23 @@ namespace AsuraEngine
glUniform1f(loc, value);
}
- void Shader::SetUniformTexture(uint loc, const Texture& texture)
+ bool Shader::SetUniformTexture(uint loc, const Texture& texture)
{
- if (gl.state.shader == this)
- glUniform1i(loc, texture.GetGLTextureHandle());
+ if (gl.state.shader != this)
+ return false;
+
+ gl.WipeError();
+ glActiveTexture(GL_TEXTURE0 + _texture_unit);
+ if (gl.HasError())
+ return false;
+ GLint tex = texture.GetGLTexture();
+ glBindTexture(GL_TEXTURE_2D, tex);
+ if (gl.HasError())
+ return false;
+ glUniform1i(loc, _texture_unit);
+ if (gl.HasError())
+ return false;
+ ++_texture_unit;
}
void Shader::SetUniformVector2(uint loc, const Math::Vector2f& vec2)
@@ -143,6 +188,14 @@ namespace AsuraEngine
glUniformMatrix4fv(loc, 1, GL_FALSE, mat.GetElements());
}
+ void Shader::SetBuiltInUniforms()
+ {
+ // model\view\projection matrix
+ SetUniformMatrix44(mMVP[MATRIX_MODE_MODEL], gl.GetMatrix(MATRIX_MODE_MODEL));
+ SetUniformMatrix44(mMVP[MATRIX_MODE_VIEW], gl.GetMatrix(MATRIX_MODE_VIEW));
+ SetUniformMatrix44(mMVP[MATRIX_MODE_PROJECTION], gl.GetMatrix(MATRIX_MODE_PROJECTION));
+ }
+
//void Shader::GetUniform()
//{
// //if(gl.state.shader == this)