diff options
Diffstat (limited to 'src/libjin/graphics/shaders/je_jsl_compiler.cpp')
-rw-r--r-- | src/libjin/graphics/shaders/je_jsl_compiler.cpp | 68 |
1 files changed, 67 insertions, 1 deletions
diff --git a/src/libjin/graphics/shaders/je_jsl_compiler.cpp b/src/libjin/graphics/shaders/je_jsl_compiler.cpp index 437cacd..3cd8299 100644 --- a/src/libjin/graphics/shaders/je_jsl_compiler.cpp +++ b/src/libjin/graphics/shaders/je_jsl_compiler.cpp @@ -1,6 +1,7 @@ #include "../../core/je_configuration.h" #if defined(jin_graphics) && (jin_graphics & jin_graphics_shader) +#include "../../common/je_string.h" #include "../../Filesystem/je_buffer.h" #include "je_jsl_compiler.h" @@ -15,7 +16,72 @@ namespace JinEngine namespace Shaders { - #include "je_base.shader.h" + JinEngine::String SHADER_PROJECTION_MATRIX = "jin_ProjectionMatrix"; + JinEngine::String SHADER_MODELVIEW_MATRIX = "jin_ModelViewMatrix"; + JinEngine::String SHADER_MAIN_TEXTURE = "jin_MainTexture"; + JinEngine::String SHADER_VERTEX_COORDS = "jin_VertexCoords"; + JinEngine::String SHADER_TEXTURE_COORDS = "jin_TextureCoords"; + JinEngine::String SHADER_VERSION = "#version 130 core \n"; + JinEngine::String SHADER_COMMON = R"( + #define Number float + #define Texture sampler2D + #define Canvas sampler2D + #define Color vec4 + #define Vec2 vec2 + #define Vec3 vec3 + #define Vec4 vec4 + + #define texel texture2D + + struct Vertex + { + vec2 xy; + vec2 uv; + }; + )"; + + JinEngine::String JSLCompiler::formatVertexShader(const JinEngine::String& vert) + { + 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; + } + + JinEngine::String JSLCompiler::formatFragmentShader(const JinEngine::String& frag) + { + 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; + } bool JSLCompiler::compile(const string& jsl, string* vertex_shader, string* fragment_shader) { |