diff options
author | Konstantin Käfer <mail@kkaefer.com> | 2016-02-05 16:10:19 +0100 |
---|---|---|
committer | Konstantin Käfer <mail@kkaefer.com> | 2016-02-10 11:35:17 +0100 |
commit | 4edb2bc22281bc29822d46c3f39a9f99e40afa49 (patch) | |
tree | 8fa3d2f2aa5c87cde5344a80edea63dbe562180a /src | |
parent | a5c91036569969bb887eb49b2faf9a26674b4128 (diff) | |
download | qtlocation-mapboxgl-4edb2bc22281bc29822d46c3f39a9f99e40afa49.tar.gz |
[core] draw clipping masks from ClipIDGenerator rather than Sources
Diffstat (limited to 'src')
-rw-r--r-- | src/mbgl/map/source.cpp | 8 | ||||
-rw-r--r-- | src/mbgl/map/source.hpp | 1 | ||||
-rw-r--r-- | src/mbgl/renderer/painter.cpp | 2 | ||||
-rw-r--r-- | src/mbgl/renderer/painter.hpp | 3 | ||||
-rw-r--r-- | src/mbgl/renderer/painter_clipping.cpp | 33 |
5 files changed, 20 insertions, 27 deletions
diff --git a/src/mbgl/map/source.cpp b/src/mbgl/map/source.cpp index 7f9b47440b..55d87d988e 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 d9146c1fdb..cca160a726 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<Tile *> getLoadedTiles() const; diff --git a/src/mbgl/renderer/painter.cpp b/src/mbgl/renderer/painter.cpp index 0fd76314dc..fe0118952a 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 e2949681cd..8ab0a49806 100644 --- a/src/mbgl/renderer/painter.hpp +++ b/src/mbgl/renderer/painter.hpp @@ -93,8 +93,7 @@ public: float contrastFactor(float contrast); std::array<float, 3> spinWeights(float spin_value); - void drawClippingMasks(const std::set<Source*>&); - void drawClippingMask(const mat4& matrix, const ClipID& clip); + void drawClippingMasks(const std::map<TileID, ClipID>&); bool needsAnimation() const; diff --git a/src/mbgl/renderer/painter_clipping.cpp b/src/mbgl/renderer/painter_clipping.cpp index 6994650412..618c1093af 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<Source*>& sources) { + +void Painter::drawClippingMasks(const std::map<TileID, ClipID>& 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; -void Painter::drawClippingMask(const mat4& matrix, const ClipID &clip) { - plainShader->u_matrix = matrix; + 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()); - 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())); + const GLint ref = (GLint)(clip.reference.to_ulong()); + config.stencilFunc = { GL_ALWAYS, ref, mask }; + MBGL_CHECK_ERROR(glDrawArrays(GL_TRIANGLES, 0, (GLsizei)tileStencilBuffer.index())); + } } |