summaryrefslogtreecommitdiff
path: root/src/gl_calls.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/gl_calls.cpp')
-rw-r--r--src/gl_calls.cpp78
1 files changed, 68 insertions, 10 deletions
diff --git a/src/gl_calls.cpp b/src/gl_calls.cpp
index 82e8be2..68380aa 100644
--- a/src/gl_calls.cpp
+++ b/src/gl_calls.cpp
@@ -4,6 +4,9 @@
#include "gl_calls.h"
+
+// TODO(fox): Combine into one after fixing Mac/Windows blend mode slowdown.
+
const char *DefaultVertexShaderSource = "#version 330 core\n"
"layout (location = 0) in vec3 Point;\n"
"layout (location = 1) in vec2 aTexCoord;\n"
@@ -52,11 +55,6 @@ const char *DefaultFragmentShaderSource = "#version 330 core\n"
" FragColor = vec4(InputCol, Col.a);\n"
"} else if (FragmentMode == 2) {\n"
" FragColor = Col;\n"
-"} else {\n"
-" vec4 Dest = texture(Texture1, TexCoord);\n"
-" FragColor = Dest + Col;\n"
-" FragColor = ((1.0f - Dest * 2) * Col * Col) + (Dest * 2 * Col);\n"
-" FragColor.a = Col.a;\n"
"}\n"
"}\0";
@@ -111,12 +109,15 @@ const char *BlendVertexShaderSource = "#version 330 core\n"
"}\0";
#endif
+// NOTE(fox): Is this slower than using multiple fragment shaders with less source code?
+// TODO(fox): Multiply and add can be optimized without the texture copy.
const char *BlendFragmentShaderSource = "#version 330 core\n"
"out vec4 FragColor;\n"
"in vec2 TexCoord;\n"
"in vec2 TexCoordBlend;\n"
"uniform sampler2D Texture;\n"
"uniform sampler2D Texture1;\n"
+"uniform int BlendMode;\n"
"uniform vec3 InputCol;\n"
"uniform vec2 ScreenDimensions;\n"
"void main()\n"
@@ -124,12 +125,68 @@ const char *BlendFragmentShaderSource = "#version 330 core\n"
" vec2 NewCoord = gl_FragCoord.xy / ScreenDimensions;\n"
" vec4 Col = texture(Texture, TexCoord);\n"
" vec4 Dest = texture(Texture1, NewCoord);\n"
-" FragColor = Dest + Col;\n"
-" FragColor = ((1.0f - Dest * 2) * Col * Col) + (Dest * 2 * Col);\n"
+" vec4 Blend = Dest;\n"
+" FragColor.a = Dest.a;\n"
+" switch (BlendMode)\n"
+" {\n"
+" case 0:\n"
+" {\n"
+" FragColor.a = Col.a;\n"
+" } break;\n"
+" case 1:\n"
+" {\n"
+" Blend = Dest * Col;\n"
+" } break;\n"
+" case 2:\n"
+" {\n"
+" Blend = 1.0f - ((1.0f - Dest) / Col);\n"
+" } break;\n"
+" case 3:\n"
+" {\n"
+" Blend = (Dest + Col) - 1.0f;\n"
+" } break;\n"
+" case 4:\n"
+" {\n"
+" Blend = Dest + Col;\n"
+" } break;\n"
+" case 5:\n"
+" {\n"
+" Blend = 1.0f - ((1.0f - Dest) * (1.0f - Col));\n"
+" } break;\n"
+" case 6:\n"
+" {\n"
+" Blend = 2.0f * Dest * Col;\n"
+" vec4 BlendSecond = 1.0f - (2.0f * (1.0f - Dest) * (1.0f - Col));\n"
+" Blend = mix(BlendSecond, Blend, lessThan(Dest, vec4(0.5)));\n"
+" } break;\n"
+" case 7:\n"
+" {\n"
+" Blend = ((1.0f - Col * 2) * Dest * Dest) + (Col * 2 * Dest);\n"
+" } break;\n"
+" case 8:\n"
+" {\n"
+" Blend = 2.0f * Dest * Col;\n"
+" vec4 BlendSecond = 1.0f - (2.0f * (1.0f - Dest) * (1.0f - Col));\n"
+" Blend = mix(BlendSecond, Blend, greaterThan(Dest, vec4(0.5)));\n"
+" } break;\n"
+" case 9:\n"
+" {\n"
+" Blend = Dest - Col;\n"
+" } break;\n"
+" case 10:\n"
+" {\n"
+" Blend = Dest / (Col + 0.001f);\n"
+" } break;\n"
+" case 11:\n"
+" {\n"
+" Blend = Col - Dest;\n"
+" vec4 BlendSecond = Dest - Col;\n"
+" Blend = mix(BlendSecond, Blend, greaterThan(Col - Dest, vec4(0.0f)));\n"
+" } break;\n"
+" }\n"
+" FragColor.rgb = Blend.rgb ;\n"
"}\0";
-// " vec2 NewCoord = vec2(0.5, 0.5) + vec2(XAxis + YAxis);\n"
-
static void GL_InitDefaultShader(uint32 *VertexShader, const char *VertexShaderSource,
uint32 *FragmentShader, const char *FragmentShaderSource,
uint32 *ShaderProgram)
@@ -305,7 +362,7 @@ GL_BlitStencil(gl_effect_layer *TestM, void *StrokeData, void *FillData, uint32
static void
GL_RasterizeShape2(gl_effect_layer *TestM, gl_effect_layer *TestM2, void *StrokeData, void *FillData, uint32 StrokeCount, uint32 FillCount,
layer_transforms T, int Width, int Height, int BytesPerPixel, void *Bitmap,
- int L_Width, int L_Height,v4 StrokeCol, v4 FillCol, int RenderMode, int Vector,
+ int L_Width, int L_Height,v4 StrokeCol, v4 FillCol, blend_mode BlendMode, int RenderMode, int Vector,
ImVec2 ViewportSize, ImVec2 UIPos, ImVec2 UIZoom, v2 BlendMin, v2 BlendMax, int StencilLayer)
{
int Uniform = 0;
@@ -444,6 +501,7 @@ GL_RasterizeShape2(gl_effect_layer *TestM, gl_effect_layer *TestM2, void *Stroke
glBindTexture(GL_TEXTURE_2D, TestM2->Texture);
glUniform1i(glGetUniformLocation(BlendShaderProgram, "Texture"), 0);
glUniform1i(glGetUniformLocation(BlendShaderProgram, "Texture1"), 1);
+ glUniform1i(glGetUniformLocation(BlendShaderProgram, "BlendMode"), BlendMode);
} else {
glGenTextures(1, &Texture);
glBindTexture(GL_TEXTURE_2D, Texture);