diff options
Diffstat (limited to 'src/mbgl/renderer/render_layer.cpp')
-rw-r--r-- | src/mbgl/renderer/render_layer.cpp | 39 |
1 files changed, 36 insertions, 3 deletions
diff --git a/src/mbgl/renderer/render_layer.cpp b/src/mbgl/renderer/render_layer.cpp index 44c141c741..652dad0472 100644 --- a/src/mbgl/renderer/render_layer.cpp +++ b/src/mbgl/renderer/render_layer.cpp @@ -10,8 +10,9 @@ #include <mbgl/renderer/layers/render_symbol_layer.hpp> #include <mbgl/renderer/layers/render_heatmap_layer.hpp> #include <mbgl/renderer/paint_parameters.hpp> -#include <mbgl/style/types.hpp> #include <mbgl/renderer/render_tile.hpp> +#include <mbgl/style/types.hpp> +#include <mbgl/tile/tile.hpp> #include <mbgl/util/logging.hpp> namespace mbgl { @@ -71,8 +72,40 @@ bool RenderLayer::needsRendering(float zoom) const { && baseImpl->maxZoom >= zoom; } -void RenderLayer::setRenderTiles(std::vector<std::reference_wrapper<RenderTile>> tiles) { - renderTiles = std::move(tiles); +void RenderLayer::setRenderTiles(RenderTiles tiles, const TransformState& state) { + renderTiles = filterRenderTiles(std::move(tiles)); + sortRenderTiles(state); +} + +RenderLayer::RenderTiles RenderLayer::filterRenderTiles(RenderTiles tiles) const { + auto filterFn = [](auto& tile){ return !tile.tile.isRenderable() || tile.tile.holdForFade(); }; + return filterRenderTiles(std::move(tiles), filterFn); +} + +void RenderLayer::sortRenderTiles(const TransformState&) { + std::sort(renderTiles.begin(), renderTiles.end(), [](const auto& a, const auto& b) { return a.get().id < b.get().id; }); +} + +RenderLayer::RenderTiles RenderLayer::filterRenderTiles(RenderTiles tiles, FilterFunctionPtr filterFn) const { + assert(filterFn != nullptr); + RenderTiles filtered; + // We only need clipping when we're drawing fill or line layers. + const bool needsClipping_ = + baseImpl->getTypeInfo()->clipping == LayerTypeInfo::Clipping::Required; + + for (auto& tileRef : tiles) { + auto& tile = tileRef.get(); + if (filterFn(tile)) { + continue; + } + + if (tile.tile.getBucket(*baseImpl)) { + tile.used = true; + tile.needsClipping |= needsClipping_; + filtered.emplace_back(tile); + } + } + return filtered; } void RenderLayer::markContextDestroyed() { |