diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/libjin/graphics/shaders/je_base.shader.h | 111 | ||||
-rw-r--r-- | src/libjin/graphics/shaders/je_jsl_compiler.cpp | 8 |
2 files changed, 52 insertions, 67 deletions
diff --git a/src/libjin/graphics/shaders/je_base.shader.h b/src/libjin/graphics/shaders/je_base.shader.h index 1cecddf..9fed6a1 100644 --- a/src/libjin/graphics/shaders/je_base.shader.h +++ b/src/libjin/graphics/shaders/je_base.shader.h @@ -1,8 +1,18 @@ #ifndef __JE_BASE_SHADER_H__ #define __JE_BASE_SHADER_H__ -static const char* base_shared = R"( -#define Number float +#include "../../common/je_string.h" + +////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +static const JinEngine::String SHADER_PROJECTION_MATRIX = "jin_ProjectionMatrix"; +static const JinEngine::String SHADER_MODELVIEW_MATRIX = "jin_ModelViewMatrix"; +static const JinEngine::String SHADER_MAIN_TEXTURE = "jin_MainTexture"; +static const JinEngine::String SHADER_VERTEX_COORDS = "jin_VertexCoords"; +static const JinEngine::String SHADER_TEXTURE_COORDS = "jin_TextureCoords"; +static const JinEngine::String SHADER_VERSION = "#version 130 core \n"; +static const JinEngine::String SHADER_COMMON = R"( +#define Number float #define Texture sampler2D #define Canvas sampler2D #define Color vec4 @@ -17,72 +27,51 @@ struct Vertex vec2 xy; vec2 uv; }; - )"; -static const int BASE_SHARED_SIZE = strlen(base_shared); - -static const char* base_vertex = R"( -#version 130 core - -%s - -uniform mat4 jin_ProjectionMatrix; -uniform mat4 jin_ModelViewMatrix; - -in vec2 jin_VertexCoords; -in vec2 jin_TextureCoords; +////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -out vec4 jin_Color; -out vec2 jin_XY; -out vec2 jin_UV; - -%s - -void main() +static JinEngine::String formatVertexShader(const JinEngine::String& vert) { - vec4 v = jin_ModelViewMatrix * vec4(jin_VertexCoords, 0, 1.0); - Vertex _v = vert(Vertex(v.xy, jin_TextureCoords)); - gl_Position = jin_ProjectionMatrix * vec4(_v.xy, 0, 1.0f); - jin_Color = gl_Color; - jin_XY = _v.xy; - jin_UV = _v.uv; + static JinEngine::String vert_part1 = + SHADER_VERSION + + SHADER_COMMON + + "uniform mat4 " + SHADER_PROJECTION_MATRIX + ";\n" + "uniform mat4 " + SHADER_MODELVIEW_MATRIX + ";\n" + "in vec2 " + SHADER_VERTEX_COORDS + ";\n" + "in vec2 " + SHADER_TEXTURE_COORDS + ";\n" + "out vec4 jin_Color; \n" + "out vec2 jin_XY; \n" + "out vec2 jin_UV; \n"; + static JinEngine::String vert_part2 = + "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" + " 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" + "}"; + return vert_part1 + vert + vert_part2; } -)"; - -static const int BASE_VERTEX_SHADER_SIZE = strlen(base_vertex) + BASE_SHARED_SIZE; - -#define formatVertexShader(buf, program) sprintf(buf,base_vertex, base_shared, program) -static const char* base_fragment = R"( -#version 130 core - -%s - -uniform Texture jin_MainTexture; - -in vec4 jin_Color; -in vec2 jin_XY; -in vec2 jin_UV; - -out vec4 jin_OutColor; - -%s - -void main() +static JinEngine::String formatFragmentShader(const JinEngine::String& frag) { - jin_OutColor = frag(jin_Color, jin_MainTexture, Vertex(jin_XY, jin_UV)); + static JinEngine::String frag_part1 = + SHADER_VERSION + + SHADER_COMMON + + "uniform Texture " + SHADER_MAIN_TEXTURE + "; \n" + "in vec4 jin_Color; \n" + "in vec2 jin_XY; \n" + "in vec2 jin_UV; \n" + "out vec4 jin_OutColor; \n"; + static JinEngine::String frag_part2 = + "void main() \n" + "{\n" + " jin_OutColor = frag(jin_Color, " + SHADER_MAIN_TEXTURE + ", Vertex(jin_XY, jin_UV));\n" + "}\n"; + return frag_part1 + frag + frag_part2; } -)"; - -static const int BASE_FRAGMENT_SHADER_SIZE = strlen(base_fragment) + BASE_SHARED_SIZE; - -#define formatFragmentShader(buf, program) sprintf(buf, base_fragment, base_shared, program) - -static const char* SHADER_PROJECTION_MATRIX = "jin_ProjectionMatrix"; -static const char* SHADER_MODELVIEW_MATRIX = "jin_ModelViewMatrix"; -static const char* SHADER_MAIN_TEXTURE = "jin_MainTexture"; -static const char* SHADER_VERTEX_COORDS = "jin_VertexCoords"; -static const char* SHADER_TEXTURE_COORDS = "jin_TextureCoords"; #endif // __JE_BASE_SHADER_H__
\ No newline at end of file diff --git a/src/libjin/graphics/shaders/je_jsl_compiler.cpp b/src/libjin/graphics/shaders/je_jsl_compiler.cpp index feb88d4..437cacd 100644 --- a/src/libjin/graphics/shaders/je_jsl_compiler.cpp +++ b/src/libjin/graphics/shaders/je_jsl_compiler.cpp @@ -35,17 +35,13 @@ namespace JinEngine // Compile JSL vertex program. int start = loc_VERTEX_SHADER + strlen("#VERTEX_SHADER"); *vertex_shader = jsl.substr(start, loc_END_VERTEX_SHADER - start); - Buffer vbuffer = Buffer(vertex_shader->length() + BASE_VERTEX_SHADER_SIZE); - formatVertexShader((char*)&vbuffer, vertex_shader->c_str()); - vertex_shader->assign((char*)&vbuffer); + vertex_shader->assign(formatVertexShader(*vertex_shader)); } { // Compile JSL fragment program. int start = loc_FRAGMENT_SHADER + strlen("#FRAGMENT_SHADER"); *fragment_shader = jsl.substr(start, loc_END_FRAGMENT_SHADER - start); - Buffer fbuffer = Buffer(fragment_shader->length() + BASE_FRAGMENT_SHADER_SIZE); - formatFragmentShader((char*)&fbuffer, fragment_shader->c_str()); - fragment_shader->assign((char*)&fbuffer); + fragment_shader->assign(formatFragmentShader(*fragment_shader)); } return true; } |