diff options
author | Alexander Shalamov <alexander.shalamov@mapbox.com> | 2019-04-25 12:36:18 +0300 |
---|---|---|
committer | Alexander Shalamov <alexander.shalamov@mapbox.com> | 2019-04-26 11:28:26 +0300 |
commit | f43e50b1c522b6220a993f7434f6ac1ef1ce3434 (patch) | |
tree | 295fce03f943a0d56cb76e46c3936babb995b2d7 | |
parent | f5773adcce7f1395fd422f74754ed8d2b1ef90d4 (diff) | |
download | qtlocation-mapboxgl-upstream/alexshalamov_use_multiset_for_symbol-sort-keys.tar.gz |
[core] Store type of renderable segment when sorting symbols by keyupstream/alexshalamov_use_multiset_for_symbol-sort-keys
-rw-r--r-- | src/mbgl/renderer/layers/render_symbol_layer.cpp | 43 |
1 files changed, 28 insertions, 15 deletions
diff --git a/src/mbgl/renderer/layers/render_symbol_layer.cpp b/src/mbgl/renderer/layers/render_symbol_layer.cpp index 7e2eb1aa86..22cbf26e10 100644 --- a/src/mbgl/renderer/layers/render_symbol_layer.cpp +++ b/src/mbgl/renderer/layers/render_symbol_layer.cpp @@ -74,25 +74,38 @@ struct RenderableSegment { const RenderTile& tile_, const LayerRenderData& renderData_, const SymbolBucket::PaintProperties& bucketPaintProperties_, - float sortKey_) : + float sortKey_, + bool isText_) : segment(std::move(segment_)), tile(tile_), renderData(renderData_), bucketPaintProperties(bucketPaintProperties_), - sortKey(sortKey_) {} + sortKey(sortKey_), + isText(isText_) {} SegmentWrapper segment; const RenderTile& tile; const LayerRenderData& renderData; const SymbolBucket::PaintProperties& bucketPaintProperties; float sortKey; - - bool hasIconData() const { - return static_cast<const SymbolBucket&>(*renderData.bucket).hasIconData(); - } + bool isText; friend bool operator < (const RenderableSegment& lhs, const RenderableSegment& rhs) { - return lhs.sortKey < rhs.sortKey; + // Sort renderable segments by a sort key. + if (lhs.sortKey < rhs.sortKey) { + return true; + } + + // In cases when sort key is the same, sort by the type of a segment (text over icons), + // and for segments of the same type with the same sort key, sort by a tile id. + if (lhs.sortKey == rhs.sortKey) { + if (lhs.isText == rhs.isText) { + return lhs.tile.id < rhs.tile.id; + } + return lhs.isText < rhs.isText; + } + + return false; } }; @@ -383,7 +396,7 @@ void RenderSymbolLayer::render(PaintParameters& parameters, RenderSource*) { } const bool sortFeaturesByKey = !impl(baseImpl).layout.get<SymbolSortKey>().isUndefined(); - std::set<RenderableSegment> renderableSegments; + std::multiset<RenderableSegment> renderableSegments; const auto draw = [¶meters, this] (auto& programInstance, const auto& uniformValues, @@ -464,15 +477,15 @@ void RenderSymbolLayer::render(PaintParameters& parameters, RenderSource*) { assert(bucket.paintProperties.find(getID()) != bucket.paintProperties.end()); const auto& bucketPaintProperties = bucket.paintProperties.at(getID()); - auto addRenderables = [&renderableSegments, &tile, renderData, &bucketPaintProperties, it = renderableSegments.begin()] (auto& segments) mutable { + auto addRenderables = [&renderableSegments, &tile, renderData, &bucketPaintProperties, it = renderableSegments.begin()] (auto& segments, bool isText) mutable { for (auto& segment : segments) { - it = renderableSegments.emplace_hint(it, SegmentWrapper{std::ref(segment)}, tile, *renderData, bucketPaintProperties, segment.sortKey); + it = renderableSegments.emplace_hint(it, SegmentWrapper{std::ref(segment)}, tile, *renderData, bucketPaintProperties, segment.sortKey, isText); } }; if (bucket.hasIconData()) { if (sortFeaturesByKey) { - addRenderables(bucket.icon.segments); + addRenderables(bucket.icon.segments, false /*isText*/); } else { drawIcon(draw, tile, *renderData, std::ref(bucket.icon.segments), bucketPaintProperties, parameters); } @@ -480,7 +493,7 @@ void RenderSymbolLayer::render(PaintParameters& parameters, RenderSource*) { if (bucket.hasTextData()) { if (sortFeaturesByKey) { - addRenderables(bucket.text.segments); + addRenderables(bucket.text.segments, true /*isText*/); } else { drawText(draw, tile, *renderData, std::ref(bucket.text.segments), bucketPaintProperties, parameters); } @@ -565,10 +578,10 @@ void RenderSymbolLayer::render(PaintParameters& parameters, RenderSource*) { if (sortFeaturesByKey) { for (auto& renderable : renderableSegments) { - if (renderable.hasIconData()) { - drawIcon(draw, renderable.tile, renderable.renderData, renderable.segment, renderable.bucketPaintProperties, parameters); - } else { + if (renderable.isText) { drawText(draw, renderable.tile, renderable.renderData, renderable.segment, renderable.bucketPaintProperties, parameters); + } else { + drawIcon(draw, renderable.tile, renderable.renderData, renderable.segment, renderable.bucketPaintProperties, parameters); } } } |