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.cpp36
1 files changed, 31 insertions, 5 deletions
diff --git a/src/gl_calls.cpp b/src/gl_calls.cpp
index 8bdd7f1..1203c2f 100644
--- a/src/gl_calls.cpp
+++ b/src/gl_calls.cpp
@@ -260,7 +260,11 @@ GL_RasterizeShape2(gl_effect_layer *TestM, void *StrokeData, void *FillData, uin
Uniform = glGetUniformLocation(DefaultShaderProgram, "Scale");
glUniform1f(Uniform, T.scale);
- if (RenderMode == 0 || RenderMode == 1)
+ // Concave shapes are fairly more costly than convex: we have to write to
+ // the stencil buffer, but since we also are using it to mask out precomps,
+ // every shape has to be drawn a second time to "clean up" the buffer.
+
+ if (RenderMode & gl_renderflag_fill && RenderMode & gl_renderflag_concave)
{
// disable color component writing and allow stencil writing using the shape layer's vertices
glColorMask(GL_FALSE, GL_FALSE, GL_FALSE, GL_FALSE);
@@ -309,8 +313,6 @@ GL_RasterizeShape2(gl_effect_layer *TestM, void *StrokeData, void *FillData, uin
// ---
- // NOTE(fox): We need to clean up the mask after we draw the colors if
- // precomps are involved.
// TODO(fox): If this is the final method, add this optimization: shapes with
// no precomps below them don't have to be drawn twice and can instead
// get cleaned by setting StencilOp to GL_DECR.
@@ -335,14 +337,38 @@ GL_RasterizeShape2(gl_effect_layer *TestM, void *StrokeData, void *FillData, uin
glDrawArrays(GL_TRIANGLE_FAN, 0, FillCount);
glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE);
- } else {
+ }
+ else if (RenderMode & gl_renderflag_fill)
+ {
+ glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE);
+ glBindVertexArray(0);
+ glStencilFunc(GL_EQUAL, StencilLayer, 0xFF);
+ glStencilOp(GL_KEEP, GL_KEEP, GL_KEEP);
+
+ Uniform = glGetUniformLocation(DefaultShaderProgram, "VertexMode");
+ glUniform1i(Uniform, 1);
+ Uniform = glGetUniformLocation(DefaultShaderProgram, "FragmentMode");
+ glUniform1i(Uniform, 1);
+ Uniform = glGetUniformLocation(DefaultShaderProgram, "InputCol");
+ glUniform3f(Uniform, FillCol.r, FillCol.g, FillCol.b);
+
+ glBindBuffer(GL_ARRAY_BUFFER, ShapeVerts.VertexBufferObject);
+ glBufferData(GL_ARRAY_BUFFER, sizeof(real32) * 4 * FillCount, FillData, GL_STATIC_DRAW);
+ glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, 4 * sizeof(float), (void*)0);
+ glEnableVertexAttribArray(0);
+ glVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE, 4 * sizeof(float), (void*)(2 * sizeof(float)));
+
+ glDrawElements(GL_TRIANGLE_STRIP, 6, GL_UNSIGNED_INT, 0);
+ }
+ else {
glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE);
}
glBindVertexArray(0);
// stroke component
- if (RenderMode == 0 || RenderMode == 2) {
+ if (RenderMode & gl_renderflag_stroke)
+ {
Uniform = glGetUniformLocation(DefaultShaderProgram, "VertexMode");
glUniform1i(Uniform, 1);
Uniform = glGetUniformLocation(DefaultShaderProgram, "FragmentMode");