aboutsummaryrefslogtreecommitdiff
path: root/src/libjin/graphics/shaders/je_jsl_compiler.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/libjin/graphics/shaders/je_jsl_compiler.cpp')
-rw-r--r--src/libjin/graphics/shaders/je_jsl_compiler.cpp68
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)
{