summaryrefslogtreecommitdiff
path: root/src/mbgl/renderer/render_layer.cpp
diff options
context:
space:
mode:
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() {