summaryrefslogtreecommitdiff
path: root/src/mbgl/renderer/layers
diff options
context:
space:
mode:
authorAnsis Brammanis <ansis@mapbox.com>2020-02-11 11:24:14 -0500
committerGitHub <noreply@github.com>2020-02-11 11:24:14 -0500
commit4f18d5fa92df175ac30f856a9273a00349b56cc3 (patch)
tree52efcbe12eb4f40890d6dcdc390036613b233519 /src/mbgl/renderer/layers
parent98f99e07433d057880dcd30f21bcb4f1e147482d (diff)
downloadqtlocation-mapboxgl-4f18d5fa92df175ac30f856a9273a00349b56cc3.tar.gz
[core] sort symbols using symbol-sort-key before placement (#16023)
fix #15964 partially port mapbox/mapbox-gl-js#9054
Diffstat (limited to 'src/mbgl/renderer/layers')
-rw-r--r--src/mbgl/renderer/layers/render_symbol_layer.cpp25
1 files changed, 24 insertions, 1 deletions
diff --git a/src/mbgl/renderer/layers/render_symbol_layer.cpp b/src/mbgl/renderer/layers/render_symbol_layer.cpp
index 17376fd864..955ad2ce51 100644
--- a/src/mbgl/renderer/layers/render_symbol_layer.cpp
+++ b/src/mbgl/renderer/layers/render_symbol_layer.cpp
@@ -424,6 +424,8 @@ void RenderSymbolLayer::render(PaintParameters& parameters) {
assert(bucket.paintProperties.find(getID()) != bucket.paintProperties.end());
const auto& bucketPaintProperties = bucket.paintProperties.at(getID());
+ bucket.justReloaded = false;
+
auto addRenderables = [&renderableSegments, &tile, renderData, &bucketPaintProperties, it = renderableSegments.begin()] (auto& segments, const SymbolType type) mutable {
for (auto& segment : segments) {
it = renderableSegments.emplace_hint(it, SegmentWrapper{std::ref(segment)}, tile, *renderData, bucketPaintProperties, segment.sortKey, type);
@@ -580,7 +582,28 @@ void RenderSymbolLayer::prepare(const LayerPrepareParameters& params) {
const Tile* tile = params.source->getRenderedTile(renderTile.id);
assert(tile);
assert(tile->kind == Tile::Kind::Geometry);
- placementData.push_back({*bucket, renderTile, static_cast<const GeometryTile*>(tile)->getFeatureIndex()});
+
+ bool firstInBucket = true;
+ auto featureIndex = static_cast<const GeometryTile*>(tile)->getFeatureIndex();
+
+ if (bucket->sortKeyRanges.empty()) {
+ placementData.push_back(
+ {*bucket, renderTile, featureIndex, firstInBucket, 0.0f, 0, bucket->symbolInstances.size()});
+ } else {
+ for (const SortKeyRange& sortKeyRange : bucket->sortKeyRanges) {
+ LayerPlacementData layerData{*bucket,
+ renderTile,
+ featureIndex,
+ firstInBucket,
+ sortKeyRange.sortKey,
+ sortKeyRange.symbolInstanceStart,
+ sortKeyRange.symbolInstanceEnd};
+ auto sortPosition = std::upper_bound(placementData.cbegin(), placementData.cend(), layerData);
+ placementData.insert(sortPosition, std::move(layerData));
+
+ firstInBucket = false;
+ }
+ }
}
}
}