diff options
Diffstat (limited to 'src/gl_calls.cpp')
-rw-r--r-- | src/gl_calls.cpp | 36 |
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"); |