summaryrefslogtreecommitdiff
path: root/src/mbgl/renderer/layers/render_symbol_layer.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/mbgl/renderer/layers/render_symbol_layer.cpp')
-rw-r--r--src/mbgl/renderer/layers/render_symbol_layer.cpp19
1 files changed, 19 insertions, 0 deletions
diff --git a/src/mbgl/renderer/layers/render_symbol_layer.cpp b/src/mbgl/renderer/layers/render_symbol_layer.cpp
index df38d64d70..cc084c5e1a 100644
--- a/src/mbgl/renderer/layers/render_symbol_layer.cpp
+++ b/src/mbgl/renderer/layers/render_symbol_layer.cpp
@@ -362,4 +362,23 @@ style::SymbolPropertyValues RenderSymbolLayer::textPropertyValues(const style::S
};
}
+RenderLayer::RenderTiles RenderSymbolLayer::filterRenderTiles(RenderTiles tiles) const {
+ auto filterFn = [](auto& tile){ return !tile.tile.isRenderable(); };
+ return RenderLayer::filterRenderTiles(std::move(tiles), filterFn);
+}
+
+void RenderSymbolLayer::sortRenderTiles(const TransformState& state) {
+ // Sort symbol tiles in opposite y position, so tiles with overlapping symbols are drawn
+ // on top of each other, with lower symbols being drawn on top of higher symbols.
+ std::sort(renderTiles.begin(), renderTiles.end(), [&state](const auto& a, const auto& b) {
+ Point<float> pa(a.get().id.canonical.x, a.get().id.canonical.y);
+ Point<float> pb(b.get().id.canonical.x, b.get().id.canonical.y);
+
+ auto par = util::rotate(pa, state.getAngle());
+ auto pbr = util::rotate(pb, state.getAngle());
+
+ return std::tie(b.get().id.canonical.z, par.y, par.x) < std::tie(a.get().id.canonical.z, pbr.y, pbr.x);
+ });
+}
+
} // namespace mbgl