diff options
author | Ansis Brammanis <ansis@mapbox.com> | 2020-02-11 11:24:14 -0500 |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-02-11 11:24:14 -0500 |
commit | 4f18d5fa92df175ac30f856a9273a00349b56cc3 (patch) | |
tree | 52efcbe12eb4f40890d6dcdc390036613b233519 /src/mbgl/renderer/layers | |
parent | 98f99e07433d057880dcd30f21bcb4f1e147482d (diff) | |
download | qtlocation-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.cpp | 25 |
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; + } + } } } } |