aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/libjin/graphics/shaders/je_base.shader.h111
-rw-r--r--src/libjin/graphics/shaders/je_jsl_compiler.cpp8
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;
}