diff options
Diffstat (limited to 'src/mbgl/renderer')
-rw-r--r-- | src/mbgl/renderer/buckets/symbol_bucket.cpp | 2 | ||||
-rw-r--r-- | src/mbgl/renderer/buckets/symbol_bucket.hpp | 2 | ||||
-rw-r--r-- | src/mbgl/renderer/layers/render_symbol_layer.cpp | 25 | ||||
-rw-r--r-- | src/mbgl/renderer/render_layer.hpp | 16 |
4 files changed, 39 insertions, 6 deletions
diff --git a/src/mbgl/renderer/buckets/symbol_bucket.cpp b/src/mbgl/renderer/buckets/symbol_bucket.cpp index 55002e7851..7b8eec4471 100644 --- a/src/mbgl/renderer/buckets/symbol_bucket.cpp +++ b/src/mbgl/renderer/buckets/symbol_bucket.cpp @@ -23,6 +23,7 @@ SymbolBucket::SymbolBucket(Immutable<style::SymbolLayoutProperties::PossiblyEval bool sortFeaturesByY_, const std::string bucketName_, const std::vector<SymbolInstance>&& symbolInstances_, + const std::vector<SortKeyRange>&& sortKeyRanges_, float tilePixelRatio_, bool allowVerticalPlacement_, std::vector<style::TextWritingModeType> placementModes_, @@ -40,6 +41,7 @@ SymbolBucket::SymbolBucket(Immutable<style::SymbolLayoutProperties::PossiblyEval hasVariablePlacement(false), hasUninitializedSymbols(false), symbolInstances(symbolInstances_), + sortKeyRanges(sortKeyRanges_), textSizeBinder(SymbolSizeBinder::create(zoom, textSize, TextSize::defaultValue())), iconSizeBinder(SymbolSizeBinder::create(zoom, iconSize, IconSize::defaultValue())), tilePixelRatio(tilePixelRatio_), diff --git a/src/mbgl/renderer/buckets/symbol_bucket.hpp b/src/mbgl/renderer/buckets/symbol_bucket.hpp index 82d8c682aa..2b41ac9295 100644 --- a/src/mbgl/renderer/buckets/symbol_bucket.hpp +++ b/src/mbgl/renderer/buckets/symbol_bucket.hpp @@ -73,6 +73,7 @@ public: bool sortFeaturesByY, const std::string bucketLeaderID, const std::vector<SymbolInstance>&&, + const std::vector<SortKeyRange>&&, const float tilePixelRatio, bool allowVerticalPlacement, std::vector<style::TextWritingModeType> placementModes, @@ -117,6 +118,7 @@ public: bool hasUninitializedSymbols : 1; std::vector<SymbolInstance> symbolInstances; + std::vector<SortKeyRange> sortKeyRanges; struct PaintProperties { SymbolIconProgram::Binders iconBinders; 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; + } + } } } } diff --git a/src/mbgl/renderer/render_layer.hpp b/src/mbgl/renderer/render_layer.hpp index ba3c638f88..4931893271 100644 --- a/src/mbgl/renderer/render_layer.hpp +++ b/src/mbgl/renderer/render_layer.hpp @@ -1,11 +1,11 @@ #pragma once +#include <list> #include <mbgl/layout/layout.hpp> #include <mbgl/renderer/render_pass.hpp> #include <mbgl/renderer/render_source.hpp> #include <mbgl/style/layer_properties.hpp> #include <mbgl/tile/geometry_tile_data.hpp> #include <mbgl/util/mat4.hpp> - #include <memory> #include <string> @@ -20,6 +20,7 @@ class RenderTile; class TransformState; class PatternAtlas; class LineAtlas; +class SymbolBucket; class LayerRenderData { public: @@ -29,9 +30,16 @@ public: class LayerPlacementData { public: + friend bool operator<(const LayerPlacementData& lhs, const LayerPlacementData& rhs) { + return lhs.sortKey < rhs.sortKey; + } std::reference_wrapper<Bucket> bucket; std::reference_wrapper<const RenderTile> tile; std::shared_ptr<FeatureIndex> featureIndex; + bool firstInBucket; + float sortKey; + size_t symbolInstanceStart; + size_t symbolInstanceEnd; }; class LayerPrepareParameters { @@ -95,9 +103,7 @@ public: virtual void prepare(const LayerPrepareParameters&); - const std::vector<LayerPlacementData>& getPlacementData() const { - return placementData; - } + const std::list<LayerPlacementData>& getPlacementData() const { return placementData; } // Latest evaluated properties. Immutable<style::LayerProperties> evaluatedProperties; @@ -126,7 +132,7 @@ protected: // evaluated StyleProperties object and is updated accordingly. RenderPass passes = RenderPass::None; - std::vector<LayerPlacementData> placementData; + std::list<LayerPlacementData> placementData; private: // Some layers may not render correctly on some hardware when the vertex attribute limit of |