diff options
Diffstat (limited to 'src/libjin/graphics/shaders')
-rw-r--r-- | src/libjin/graphics/shaders/je_jsl_compiler.cpp | 14 | ||||
-rw-r--r-- | src/libjin/graphics/shaders/je_jsl_compiler.h | 1 | ||||
-rw-r--r-- | src/libjin/graphics/shaders/je_shader.cpp | 33 | ||||
-rw-r--r-- | src/libjin/graphics/shaders/je_shader.h | 22 |
4 files changed, 52 insertions, 18 deletions
diff --git a/src/libjin/graphics/shaders/je_jsl_compiler.cpp b/src/libjin/graphics/shaders/je_jsl_compiler.cpp index e04958c..74613ad 100644 --- a/src/libjin/graphics/shaders/je_jsl_compiler.cpp +++ b/src/libjin/graphics/shaders/je_jsl_compiler.cpp @@ -21,6 +21,7 @@ namespace JinEngine JinEngine::String SHADER_MAIN_TEXTURE = "jin_MainTexture"; JinEngine::String SHADER_VERTEX_COORDS = "jin_VertexCoords"; JinEngine::String SHADER_TEXTURE_COORDS = "jin_TextureCoords"; + JinEngine::String SHADER_VERTEX_COLOR = "jin_VertexColor"; JinEngine::String SHADER_VERSION = "#version 130 core \n"; JinEngine::String SHADER_DEFINITIONS = // Types @@ -38,6 +39,7 @@ namespace JinEngine "{ \n" " vec2 xy; \n" " vec2 uv; \n" + " vec4 color; \n" "}; \n" "\n"; JinEngine::String SHADER_UNIFORMS = @@ -52,20 +54,23 @@ namespace JinEngine SHADER_DEFINITIONS + SHADER_UNIFORMS + "in vec2 " + SHADER_VERTEX_COORDS + "; \n" - "in vec2 " + SHADER_TEXTURE_COORDS + "; \n"; + "in vec2 " + SHADER_TEXTURE_COORDS + "; \n" + "in vec4 " + SHADER_VERTEX_COLOR + "; \n"; // Color data in unsigned byte. static JinEngine::String vert_part2 = "\n" "out vec4 jin_Color; \n" "out vec2 jin_XY; \n" "out vec2 jin_UV; \n" + "out vec4 jin_COLOR; \n" "void main()\n" "{\n" " vec4 v = " + SHADER_MODELVIEW_MATRIX + " * vec4(" + SHADER_VERTEX_COORDS + ", 0, 1.0); \n" - " Vertex _v = vert(Vertex(v.xy, " + SHADER_TEXTURE_COORDS + ")); \n" + " Vertex _v = vert(Vertex(v.xy, " + SHADER_TEXTURE_COORDS + ", " + SHADER_VERTEX_COLOR + ")); \n" " gl_Position = " + SHADER_PROJECTION_MATRIX + " * vec4(_v.xy, 0, 1.0f); \n" " jin_Color = gl_Color; \n" " jin_XY = _v.xy; \n" " jin_UV = _v.uv; \n" + " jin_COLOR = _v.color; \n" "}"; return vert_part1 + vert + vert_part2; } @@ -78,13 +83,14 @@ namespace JinEngine SHADER_UNIFORMS + "in vec4 jin_Color; \n" "in vec2 jin_XY; \n" - "in vec2 jin_UV; \n"; + "in vec2 jin_UV; \n" + "in vec4 jin_COLOR; \n"; static JinEngine::String frag_part2 = "\n" "out vec4 jin_OutColor; \n" "void main() \n" "{ \n" - " jin_OutColor = frag(jin_Color, " + SHADER_MAIN_TEXTURE + ", Vertex(jin_XY, jin_UV)); \n" + " jin_OutColor = frag(jin_Color, " + SHADER_MAIN_TEXTURE + ", Vertex(jin_XY, jin_UV, jin_COLOR)); \n" "} \n"; return frag_part1 + frag + frag_part2; } diff --git a/src/libjin/graphics/shaders/je_jsl_compiler.h b/src/libjin/graphics/shaders/je_jsl_compiler.h index ed6775a..c34f8ec 100644 --- a/src/libjin/graphics/shaders/je_jsl_compiler.h +++ b/src/libjin/graphics/shaders/je_jsl_compiler.h @@ -21,6 +21,7 @@ namespace JinEngine extern JinEngine::String SHADER_MAIN_TEXTURE; extern JinEngine::String SHADER_VERTEX_COORDS; extern JinEngine::String SHADER_TEXTURE_COORDS; + extern JinEngine::String SHADER_VERTEX_COLOR; /// /// Compile JSL into GLSL. diff --git a/src/libjin/graphics/shaders/je_shader.cpp b/src/libjin/graphics/shaders/je_shader.cpp index f752e99..16627d5 100644 --- a/src/libjin/graphics/shaders/je_shader.cpp +++ b/src/libjin/graphics/shaders/je_shader.cpp @@ -240,25 +240,36 @@ namespace JinEngine glUniformMatrix4fv(loc, 1, GL_FALSE, mat4->getElements()); } - void Shader::uploadVertices(int n, GLenum type, GLsizei stride, const GLvoid * pointers) + void Shader::uploadVertices(int n, GLenum type, GLsizei stride, const GLvoid * pointers, GLboolean normalized) { - GLint loc = glGetAttribLocation(mPID, SHADER_VERTEX_COORDS); - glEnableVertexAttribArray(0); - glVertexAttribPointer(loc, n, type, GL_FALSE, stride, pointers); + uploadAttribute(SHADER_VERTEX_COORDS, n, type, stride, pointers, normalized); } - void Shader::uploadUV(int n, GLenum type, GLsizei stride, const GLvoid * pointers) + void Shader::uploadUV(int n, GLenum type, GLsizei stride, const GLvoid * pointers, GLboolean normalized) { - GLint loc = glGetAttribLocation(mPID, SHADER_TEXTURE_COORDS); - glEnableVertexAttribArray(1); - glVertexAttribPointer(loc, n, type, GL_FALSE, stride, pointers); + uploadAttribute(SHADER_TEXTURE_COORDS, n, type, stride, pointers, normalized); } - void Shader::uploadAttribute(const String& name, int n, GLenum type, GLsizei stride, const GLvoid * pointers) + void Shader::uploadColor(int n, GLenum type, GLsizei stride, const GLvoid * pointers, GLboolean normalized) + { + uploadAttribute(SHADER_VERTEX_COLOR, n, type, stride, pointers, normalized); + } + + void Shader::beginUploadAttributes() + { + mAttributeIndex = 0; + } + + void Shader::endUploadAttributes() + { + mAttributeIndex = 0; + } + + void Shader::uploadAttribute(const String& name, int n, GLenum type, GLsizei stride, const GLvoid * pointers, GLboolean normalized) { GLint loc = glGetAttribLocation(mPID, name); - glEnableVertexAttribArray(1); - glVertexAttribPointer(loc, n, type, GL_FALSE, stride, pointers); + glEnableVertexAttribArray(mAttributeIndex++); + glVertexAttribPointer(loc, n, type, normalized, stride, pointers); } } // namespace Shaders diff --git a/src/libjin/graphics/shaders/je_shader.h b/src/libjin/graphics/shaders/je_shader.h index 9056d51..6a2db9c 100644 --- a/src/libjin/graphics/shaders/je_shader.h +++ b/src/libjin/graphics/shaders/je_shader.h @@ -132,7 +132,7 @@ namespace JinEngine /// @param stride Byte offset between consecutive generic vertex attributes. /// @param pointers Pointer to the first component of the first generic vertex attribute in the array. /// - void uploadVertices(int n, GLenum type, GLsizei stride, const GLvoid * pointers); + void uploadVertices(int n, GLenum type, GLsizei stride, const GLvoid * pointers, GLboolean normalized = GL_FALSE); /// /// Set texture UV coordinates. @@ -142,12 +142,27 @@ namespace JinEngine /// @param stride Byte offset between consecutive generic vertex attributes. /// @param pointers Pointer to the first component of the first generic vertex attribute in the array. /// - void uploadUV(int n, GLenum type, GLsizei stride, const GLvoid * pointers); + void uploadUV(int n, GLenum type, GLsizei stride, const GLvoid * pointers, GLboolean normalized = GL_FALSE); + + /// + /// Upload vertex color array. + /// + void uploadColor(int n, GLenum type, GLsizei stride, const GLvoid * pointers, GLboolean normalized = GL_FALSE); /// /// Set attribute. /// - void uploadAttribute(const String& name, int n, GLenum type, GLsizei stride, const GLvoid * pointers); + void uploadAttribute(const String& name, int n, GLenum type, GLsizei stride, const GLvoid * pointers, GLboolean normalized = GL_FALSE); + + /// + /// Reset attribute index. + /// + void beginUploadAttributes(); + + /// + /// Reset attribute index. + /// + void endUploadAttributes(); /// /// Program ID. @@ -174,6 +189,7 @@ namespace JinEngine GLuint mPID; GLint mCurrentTextureUnit; std::map<std::string, GLint> mTextureUnits; + GLint mAttributeIndex; }; |