summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMikhail Pozdnyakov <mikhail.pozdnyakov@mapbox.com>2019-04-30 11:40:25 +0300
committerMikhail Pozdnyakov <mikhail.pozdnyakov@mapbox.com>2019-04-30 11:52:03 +0300
commitac9cdb87fd65d33992e5ff42a76889df2c5bb7f6 (patch)
treef484c00915b58e85e73b4871d2cdaaa5c42e15af
parentf17870d84600214a91376f7c80b5a3544e6e53bb (diff)
downloadqtlocation-mapboxgl-upstream/circle_layers_clip_tiles.tar.gz
[core]Clip overlapped tiles at RenderCircleLayerupstream/circle_layers_clip_tiles
-rw-r--r--src/mbgl/renderer/layers/render_circle_layer.cpp33
-rw-r--r--src/mbgl/renderer/paint_parameters.cpp2
2 files changed, 19 insertions, 16 deletions
diff --git a/src/mbgl/renderer/layers/render_circle_layer.cpp b/src/mbgl/renderer/layers/render_circle_layer.cpp
index d6e6fe2c19..a8679b0e6f 100644
--- a/src/mbgl/renderer/layers/render_circle_layer.cpp
+++ b/src/mbgl/renderer/layers/render_circle_layer.cpp
@@ -21,15 +21,16 @@ inline const style::CircleLayer::Impl& impl(const Immutable<style::Layer::Impl>&
namespace {
+// Returns pointer to the parent.
template <typename Iterator>
-bool isCoveredByParent(const UnwrappedTileID& child, Iterator begin, Iterator end) {
+auto isCoveredByParent(const UnwrappedTileID& child, Iterator begin, Iterator end) -> RenderTile* {
for (auto it = begin; it != end; ++it) {
const auto& tileId = it->get().id;
if (child != tileId && child.isChildOf(tileId)) {
- return true;
+ return &it->get();
}
}
- return false;
+ return nullptr;
}
} // namespace
@@ -71,6 +72,7 @@ void RenderCircleLayer::render(PaintParameters& parameters, RenderSource*) {
if (parameters.pass == RenderPass::Opaque) {
return;
}
+ parameters.renderTileClippingMasks(renderTiles);
for (const RenderTile& tile : renderTiles) {
const LayerRenderData* renderData = tile.tile.getLayerRenderData(*baseImpl);
@@ -118,7 +120,7 @@ void RenderCircleLayer::render(PaintParameters& parameters, RenderSource*) {
*parameters.renderPass,
gfx::Triangles(),
parameters.depthModeForSublayer(0, gfx::DepthMaskType::ReadOnly),
- gfx::StencilMode::disabled(),
+ tile.needsClipping ? parameters.stencilModeForClipping(tile.id) : gfx::StencilMode::disabled(),
parameters.colorModeForRenderPass(),
gfx::CullFaceMode::disabled(),
*bucket.indexBuffer,
@@ -202,30 +204,29 @@ bool RenderCircleLayer::queryIntersectsFeature(
return false;
}
-void RenderCircleLayer::setRenderTiles(RenderTiles tiles_, const TransformState& state) {
- RenderLayer::setRenderTiles(std::move(tiles_), state);
+void RenderCircleLayer::setRenderTiles(RenderTiles tiles, const TransformState& state) {
+ RenderLayer::setRenderTiles(std::move(tiles), state);
// Tiles are sorted by tile id / zoom level, if first and last tiles are from different
// zoom levels, check whether tile vector contains parents covering children area.
// This might happen when map is panned (or zoomed) and missing tile is not yet loaded,
// thus, cached parent tile is used to cover missing area, therefore, loaded child tiles
// will be drawn together with the parent.
-
if (renderTiles.size() > 1 &&
- renderTiles.front().get().id.canonical.z != renderTiles.back().get().id.canonical.z) {
-
- RenderTiles filtered;
- filtered.reserve(renderTiles.size());
+ renderTiles.front().get().id.canonical.z != renderTiles.back().get().id.canonical.z) {
auto lowerBound = renderTiles.end();
for (auto it = renderTiles.rbegin(); it != renderTiles.rend(); ++it) {
- if (!isCoveredByParent(it->get().id, renderTiles.begin(), --lowerBound)) {
- filtered.emplace_back(it->get());
+ RenderTile& child = it->get();
+ if (RenderTile* parent = isCoveredByParent(child.id, renderTiles.begin(), --lowerBound)) {
+ parent->needsClipping = true;
+ child.needsClipping = true;
}
}
-
- std::reverse(filtered.begin(), filtered.end());
- renderTiles = std::move(filtered);
+ } else {
+ for (RenderTile& tile : renderTiles) {
+ tile.needsClipping = false;
+ }
}
}
diff --git a/src/mbgl/renderer/paint_parameters.cpp b/src/mbgl/renderer/paint_parameters.cpp
index e9f42d2579..0637452944 100644
--- a/src/mbgl/renderer/paint_parameters.cpp
+++ b/src/mbgl/renderer/paint_parameters.cpp
@@ -115,6 +115,8 @@ void PaintParameters::renderTileClippingMasks(const std::vector<std::reference_w
const ClippingMaskProgram::Binders paintAttributeData(properties, 0);
for (const RenderTile& renderTile : renderTiles) {
+ if (!renderTile.needsClipping) continue;
+
const int32_t stencilID = nextStencilID++;
tileClippingMaskIDs.emplace(renderTile.id, stencilID);