summaryrefslogtreecommitdiff
path: root/src/mbgl/renderer/painter_clipping.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/mbgl/renderer/painter_clipping.cpp')
-rw-r--r--src/mbgl/renderer/painter_clipping.cpp39
1 files changed, 39 insertions, 0 deletions
diff --git a/src/mbgl/renderer/painter_clipping.cpp b/src/mbgl/renderer/painter_clipping.cpp
new file mode 100644
index 0000000000..dc625ded4e
--- /dev/null
+++ b/src/mbgl/renderer/painter_clipping.cpp
@@ -0,0 +1,39 @@
+#include <mbgl/renderer/painter.hpp>
+#include <mbgl/renderer/fill_bucket.hpp>
+#include <mbgl/map/map.hpp>
+#include <mbgl/map/source.hpp>
+#include <mbgl/util/clip_ids.hpp>
+
+using namespace mbgl;
+
+void Painter::drawClippingMasks(const std::set<util::ptr<StyleSource>> &sources) {
+ gl::group group("clipping masks");
+
+ useProgram(plainShader->program);
+ glDisable(GL_DEPTH_TEST);
+ depthMask(false);
+ glColorMask(false, false, false, false);
+ depthRange(1.0f, 1.0f);
+
+ coveringPlainArray.bind(*plainShader, tileStencilBuffer, BUFFER_OFFSET(0));
+
+ for (const util::ptr<StyleSource> &source : sources) {
+ source->source->drawClippingMasks(*this);
+ }
+
+ glEnable(GL_DEPTH_TEST);
+ glColorMask(true, true, true, true);
+ depthMask(true);
+ glStencilMask(0x0);
+}
+
+void Painter::drawClippingMask(const mat4& matrix, const ClipID &clip) {
+ plainShader->u_matrix = matrix;
+
+ const GLint ref = (GLint)(clip.reference.to_ulong());
+ const GLuint mask = (GLuint)(clip.mask.to_ulong());
+ glStencilFunc(GL_ALWAYS, ref, mask);
+ glStencilMask(mask);
+
+ glDrawArrays(GL_TRIANGLES, 0, (GLsizei)tileStencilBuffer.index());
+}