summaryrefslogtreecommitdiff
path: root/src/mbgl/renderer/render_layer.cpp
diff options
context:
space:
mode:
authorAlexander Shalamov <alexander.shalamov@mapbox.com>2018-10-24 17:13:27 +0300
committerAlexander Shalamov <alexander.shalamov@mapbox.com>2018-11-19 14:06:21 +0200
commitf6ad5f378e9a0741b7d3c293cb91466ba2770e36 (patch)
tree9c15b4f46a84460822dbdb0b760dd46758b102f9 /src/mbgl/renderer/render_layer.cpp
parent006ee8b0034eab7096c53a7ca4eddf7226880161 (diff)
downloadqtlocation-mapboxgl-f6ad5f378e9a0741b7d3c293cb91466ba2770e36.tar.gz
[core] Move RenderTile filtering / sorting logic to render layers
Diffstat (limited to 'src/mbgl/renderer/render_layer.cpp')
-rw-r--r--src/mbgl/renderer/render_layer.cpp39
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() {