From 4edb2bc22281bc29822d46c3f39a9f99e40afa49 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Konstantin=20K=C3=A4fer?= Date: Fri, 5 Feb 2016 16:10:19 +0100 Subject: [PATCH] [core] draw clipping masks from ClipIDGenerator rather than Sources --- src/mbgl/map/source.cpp | 8 ------ src/mbgl/map/source.hpp | 1 - src/mbgl/renderer/painter.cpp | 2 +- src/mbgl/renderer/painter.hpp | 3 +-- src/mbgl/renderer/painter_clipping.cpp | 35 ++++++++++++++------------ 5 files changed, 21 insertions(+), 28 deletions(-) diff --git a/src/mbgl/map/source.cpp b/src/mbgl/map/source.cpp index 7f9b47440..55d87d988 100644 --- a/src/mbgl/map/source.cpp +++ b/src/mbgl/map/source.cpp @@ -173,14 +173,6 @@ void Source::updateMatrices(const mat4 &projMatrix, const TransformState &transf } } -void Source::drawClippingMasks(Painter &painter) { - for (const auto& pair : tiles) { - Tile &tile = *pair.second; - MBGL_DEBUG_GROUP(std::string { "mask: " } + std::string(tile.id)); - painter.drawClippingMask(tile.matrix, tile.clip); - } -} - void Source::finishRender(Painter &painter) { for (const auto& pair : tiles) { Tile &tile = *pair.second; diff --git a/src/mbgl/map/source.hpp b/src/mbgl/map/source.hpp index d9146c1fd..cca160a72 100644 --- a/src/mbgl/map/source.hpp +++ b/src/mbgl/map/source.hpp @@ -60,7 +60,6 @@ public: bool update(const StyleUpdateParameters&); void updateMatrices(const mat4 &projMatrix, const TransformState &transform); - void drawClippingMasks(Painter &painter); void finishRender(Painter &painter); std::forward_list getLoadedTiles() const; diff --git a/src/mbgl/renderer/painter.cpp b/src/mbgl/renderer/painter.cpp index 0fd76314d..fe0118952 100644 --- a/src/mbgl/renderer/painter.cpp +++ b/src/mbgl/renderer/painter.cpp @@ -151,7 +151,7 @@ void Painter::render(const Style& style, const FrameData& frame_, SpriteAtlas& a source->updateMatrices(projMatrix, state); } - drawClippingMasks(sources); + drawClippingMasks(generator.getStencils()); } frameHistory.record(data.getAnimationTime(), state.getZoom()); diff --git a/src/mbgl/renderer/painter.hpp b/src/mbgl/renderer/painter.hpp index e2949681c..8ab0a4980 100644 --- a/src/mbgl/renderer/painter.hpp +++ b/src/mbgl/renderer/painter.hpp @@ -93,8 +93,7 @@ public: float contrastFactor(float contrast); std::array spinWeights(float spin_value); - void drawClippingMasks(const std::set&); - void drawClippingMask(const mat4& matrix, const ClipID& clip); + void drawClippingMasks(const std::map&); bool needsAnimation() const; diff --git a/src/mbgl/renderer/painter_clipping.cpp b/src/mbgl/renderer/painter_clipping.cpp index 699465041..618c1093a 100644 --- a/src/mbgl/renderer/painter_clipping.cpp +++ b/src/mbgl/renderer/painter_clipping.cpp @@ -6,31 +6,34 @@ using namespace mbgl; -void Painter::drawClippingMasks(const std::set& sources) { + +void Painter::drawClippingMasks(const std::map& stencils) { MBGL_DEBUG_GROUP("clipping masks"); + mat4 matrix; + const GLuint mask = 0b11111111; + config.program = plainShader->program; config.stencilOp.reset(); config.stencilTest = GL_TRUE; - config.depthFunc.reset(); - config.depthTest = GL_TRUE; + config.depthTest = GL_FALSE; config.depthMask = GL_FALSE; config.colorMask = { GL_FALSE, GL_FALSE, GL_FALSE, GL_FALSE }; - config.depthRange = { 1.0f, 1.0f }; + config.stencilMask = mask; coveringPlainArray.bind(*plainShader, tileStencilBuffer, BUFFER_OFFSET_0); - for (const auto& source : sources) { - source->drawClippingMasks(*this); + for (const auto& stencil : stencils) { + const auto& id = stencil.first; + const auto& clip = stencil.second; + + MBGL_DEBUG_GROUP(std::string{ "mask: " } + std::string(id)); + state.matrixFor(matrix, id, id.z); + matrix::multiply(matrix, projMatrix, matrix); + plainShader->u_matrix = matrix; + + const GLint ref = (GLint)(clip.reference.to_ulong()); + config.stencilFunc = { GL_ALWAYS, ref, mask }; + MBGL_CHECK_ERROR(glDrawArrays(GL_TRIANGLES, 0, (GLsizei)tileStencilBuffer.index())); } } - -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()); - config.stencilFunc = { GL_ALWAYS, ref, mask }; - config.stencilMask = mask; - MBGL_CHECK_ERROR(glDrawArrays(GL_TRIANGLES, 0, (GLsizei)tileStencilBuffer.index())); -}