From f997ae00ae960f38d6920a625fcb7237e5909f9c Mon Sep 17 00:00:00 2001 From: Mikhail Pozdnyakov Date: Fri, 13 Sep 2019 17:37:30 +0300 Subject: [core] Fix Placement constness Update buckets methods do not mutate placement, placement methods do not mutate buckets. --- src/mbgl/geometry/feature_index.cpp | 2 +- src/mbgl/geometry/feature_index.hpp | 4 +++- src/mbgl/renderer/bucket.hpp | 2 +- src/mbgl/renderer/buckets/symbol_bucket.cpp | 10 ++++++---- src/mbgl/renderer/buckets/symbol_bucket.hpp | 4 ++-- src/mbgl/text/placement.cpp | 6 +++--- src/mbgl/text/placement.hpp | 8 ++++---- 7 files changed, 20 insertions(+), 16 deletions(-) diff --git a/src/mbgl/geometry/feature_index.cpp b/src/mbgl/geometry/feature_index.cpp index 20026dd117..982c492469 100644 --- a/src/mbgl/geometry/feature_index.cpp +++ b/src/mbgl/geometry/feature_index.cpp @@ -79,7 +79,7 @@ FeatureIndex::lookupSymbolFeatures(const std::vector& symbolF const RenderedQueryOptions& queryOptions, const std::unordered_map& layers, const OverscaledTileID& tileID, - const std::shared_ptr>& featureSortOrder) const { + const FeatureSortOrder& featureSortOrder) const { std::unordered_map> result; if (!tileData) { return result; diff --git a/src/mbgl/geometry/feature_index.hpp b/src/mbgl/geometry/feature_index.hpp index 5a006a51bc..69897b1f4b 100644 --- a/src/mbgl/geometry/feature_index.hpp +++ b/src/mbgl/geometry/feature_index.hpp @@ -51,6 +51,8 @@ public: uint16_t collisionGroupId; }; +using FeatureSortOrder = std::shared_ptr>; + class FeatureIndex { public: FeatureIndex(std::unique_ptr tileData_); @@ -79,7 +81,7 @@ public: const RenderedQueryOptions& options, const std::unordered_map& layers, const OverscaledTileID& tileID, - const std::shared_ptr>& featureSortOrder) const; + const FeatureSortOrder& featureSortOrder) const; private: void addFeature(std::unordered_map>& result, const IndexedSubfeature&, diff --git a/src/mbgl/renderer/bucket.hpp b/src/mbgl/renderer/bucket.hpp index 6c74b8309f..3dae53408b 100644 --- a/src/mbgl/renderer/bucket.hpp +++ b/src/mbgl/renderer/bucket.hpp @@ -61,7 +61,7 @@ public: } // Places this bucket to the given placement. virtual void place(Placement&, const BucketPlacementParameters&, std::set&) {} - virtual void updateVertices(Placement&, bool /*updateOpacities*/, const TransformState&, const RenderTile&, std::set&) {} + virtual void updateVertices(const Placement&, bool /*updateOpacities*/, const TransformState&, const RenderTile&, std::set&) {} protected: Bucket() = default; diff --git a/src/mbgl/renderer/buckets/symbol_bucket.cpp b/src/mbgl/renderer/buckets/symbol_bucket.cpp index ff201e9c2c..c3e4adfab6 100644 --- a/src/mbgl/renderer/buckets/symbol_bucket.cpp +++ b/src/mbgl/renderer/buckets/symbol_bucket.cpp @@ -232,14 +232,14 @@ void SymbolBucket::sortFeatures(const float angle) { icon.triangles.clear(); sdfIcon.triangles.clear(); - featureSortOrder = std::make_unique>(); - featureSortOrder->reserve(symbolInstances.size()); + auto symbolsSortOrder = std::make_unique>(); + symbolsSortOrder->reserve(symbolInstances.size()); // If the symbols are allowed to overlap sort them by their vertical screen position. // The index array buffer is rewritten to reference the (unchanged) vertices in the // sorted order. for (const SymbolInstance& symbolInstance : getSortedSymbols(angle)) { - featureSortOrder->push_back(symbolInstance.dataFeatureIndex); + symbolsSortOrder->push_back(symbolInstance.dataFeatureIndex); if (symbolInstance.placedRightTextIndex) { addPlacedSymbol(text.triangles, text.placedSymbols[*symbolInstance.placedRightTextIndex]); @@ -266,6 +266,8 @@ void SymbolBucket::sortFeatures(const float angle) { addPlacedSymbol(iconBuffer.triangles, iconBuffer.placedSymbols[*symbolInstance.placedVerticalIconIndex]); } } + + featureSortOrder = std::move(symbolsSortOrder); } std::vector> SymbolBucket::getSortedSymbols(const float angle) const { @@ -301,7 +303,7 @@ void SymbolBucket::place(Placement& placement, const BucketPlacementParameters& placement.placeBucket(*this, params, seenIds); } -void SymbolBucket::updateVertices(Placement& placement, bool updateOpacities, const TransformState& state, const RenderTile& tile, std::set& seenIds) { +void SymbolBucket::updateVertices(const Placement& placement, bool updateOpacities, const TransformState& state, const RenderTile& tile, std::set& seenIds) { if (updateOpacities) { placement.updateBucketOpacities(*this, state, seenIds); placementChangesUploaded = false; diff --git a/src/mbgl/renderer/buckets/symbol_bucket.hpp b/src/mbgl/renderer/buckets/symbol_bucket.hpp index 020190b81f..c2bbcd40a0 100644 --- a/src/mbgl/renderer/buckets/symbol_bucket.hpp +++ b/src/mbgl/renderer/buckets/symbol_bucket.hpp @@ -68,7 +68,7 @@ public: bool hasData() const override; std::pair registerAtCrossTileIndex(CrossTileSymbolLayerIndex&, const OverscaledTileID&, uint32_t& maxCrossTileID) override; void place(Placement&, const BucketPlacementParameters&, std::set&) override; - void updateVertices(Placement&, bool updateOpacities, const TransformState&, const RenderTile&, std::set&) override; + void updateVertices(const Placement&, bool updateOpacities, const TransformState&, const RenderTile&, std::set&) override; bool hasTextData() const; bool hasIconData() const; bool hasSdfIconData() const; @@ -176,7 +176,7 @@ public: const std::vector placementModes; mutable optional hasFormatSectionOverrides_; - std::shared_ptr> featureSortOrder; + FeatureSortOrder featureSortOrder; }; } // namespace mbgl diff --git a/src/mbgl/text/placement.cpp b/src/mbgl/text/placement.cpp index 06777dea44..9e3600aa97 100644 --- a/src/mbgl/text/placement.cpp +++ b/src/mbgl/text/placement.cpp @@ -690,7 +690,7 @@ bool Placement::updateBucketDynamicVertices(SymbolBucket& bucket, const Transfor return result; } -void Placement::updateBucketOpacities(SymbolBucket& bucket, const TransformState& state, std::set& seenCrossTileIDs) { +void Placement::updateBucketOpacities(SymbolBucket& bucket, const TransformState& state, std::set& seenCrossTileIDs) const { if (bucket.hasTextData()) bucket.text.opacityVertices.clear(); if (bucket.hasIconData()) bucket.icon.opacityVertices.clear(); if (bucket.hasSdfIconData()) bucket.sdfIcon.opacityVertices.clear(); @@ -895,7 +895,7 @@ const style::TextJustifyType justifyTypes[] = {style::TextJustifyType::Right, st } // namespace -void Placement::markUsedJustification(SymbolBucket& bucket, style::TextVariableAnchorType placedAnchor, const SymbolInstance& symbolInstance, style::TextWritingModeType orientation) { +void Placement::markUsedJustification(SymbolBucket& bucket, style::TextVariableAnchorType placedAnchor, const SymbolInstance& symbolInstance, style::TextWritingModeType orientation) const { style::TextJustifyType anchorJustify = getAnchorJustification(placedAnchor); assert(anchorJustify != style::TextJustifyType::Auto); const optional& autoIndex = justificationToIndex(anchorJustify, symbolInstance, orientation); @@ -915,7 +915,7 @@ void Placement::markUsedJustification(SymbolBucket& bucket, style::TextVariableA } } -void Placement::markUsedOrientation(SymbolBucket& bucket, style::TextWritingModeType orientation, const SymbolInstance& symbolInstance) { +void Placement::markUsedOrientation(SymbolBucket& bucket, style::TextWritingModeType orientation, const SymbolInstance& symbolInstance) const { auto horizontal = orientation == style::TextWritingModeType::Horizontal ? optional(orientation) : nullopt; auto vertical = orientation == style::TextWritingModeType::Vertical ? diff --git a/src/mbgl/text/placement.hpp b/src/mbgl/text/placement.hpp index b5405cbcd7..1cefaf978c 100644 --- a/src/mbgl/text/placement.hpp +++ b/src/mbgl/text/placement.hpp @@ -61,7 +61,7 @@ struct RetainedQueryData { uint32_t bucketInstanceId; std::shared_ptr featureIndex; OverscaledTileID tileID; - std::shared_ptr> featureSortOrder; + mutable FeatureSortOrder featureSortOrder; RetainedQueryData(uint32_t bucketInstanceId_, std::shared_ptr featureIndex_, @@ -122,9 +122,9 @@ private: std::set& seenCrossTileIDs); // Returns `true` if bucket vertices were updated; returns `false` otherwise. bool updateBucketDynamicVertices(SymbolBucket&, const TransformState&, const RenderTile& tile) const; - void updateBucketOpacities(SymbolBucket&, const TransformState&, std::set&); - void markUsedJustification(SymbolBucket&, style::TextVariableAnchorType, const SymbolInstance&, style::TextWritingModeType orientation); - void markUsedOrientation(SymbolBucket&, style::TextWritingModeType, const SymbolInstance&); + void updateBucketOpacities(SymbolBucket&, const TransformState&, std::set&) const; + void markUsedJustification(SymbolBucket&, style::TextVariableAnchorType, const SymbolInstance&, style::TextWritingModeType orientation) const; + void markUsedOrientation(SymbolBucket&, style::TextWritingModeType, const SymbolInstance&) const; float zoomAdjustment(const float zoom) const; Duration getUpdatePeriod(const float zoom) const; -- cgit v1.2.1