From b2428835871933ecf5a93e86493bac0b76db0ede Mon Sep 17 00:00:00 2001 From: Mikhail Pozdnyakov Date: Mon, 3 Jun 2019 16:22:54 +0300 Subject: [core] Use fresh transform state for bucket vertices update in placement The transform state cached in placement might get stale and cannot be used for bucket vertices updates. --- src/mbgl/renderer/bucket.hpp | 3 ++- src/mbgl/renderer/buckets/symbol_bucket.cpp | 6 +++--- src/mbgl/renderer/buckets/symbol_bucket.hpp | 2 +- src/mbgl/renderer/renderer_impl.cpp | 2 +- src/mbgl/text/collision_index.hpp | 2 ++ src/mbgl/text/placement.cpp | 12 ++++++------ src/mbgl/text/placement.hpp | 7 +++---- 7 files changed, 18 insertions(+), 16 deletions(-) diff --git a/src/mbgl/renderer/bucket.hpp b/src/mbgl/renderer/bucket.hpp index 6840d8c47a..a978c06d6b 100644 --- a/src/mbgl/renderer/bucket.hpp +++ b/src/mbgl/renderer/bucket.hpp @@ -18,6 +18,7 @@ class OverscaledTileID; class PatternDependency; using PatternLayerMap = std::map; class Placement; +class TransformState; class BucketPlacementParameters; class RenderTile; @@ -60,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 RenderTile&, std::set&) {} + virtual void updateVertices(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 c9dd126181..2ad5318d19 100644 --- a/src/mbgl/renderer/buckets/symbol_bucket.cpp +++ b/src/mbgl/renderer/buckets/symbol_bucket.cpp @@ -253,14 +253,14 @@ void SymbolBucket::place(Placement& placement, const BucketPlacementParameters& placement.placeBucket(*this, params, seenIds); } -void SymbolBucket::updateVertices(Placement& placement, bool updateOpacities, const RenderTile& tile, std::set& seenIds) { +void SymbolBucket::updateVertices(Placement& placement, bool updateOpacities, const TransformState& state, const RenderTile& tile, std::set& seenIds) { if (updateOpacities) { - placement.updateBucketOpacities(*this, seenIds); + placement.updateBucketOpacities(*this, state, seenIds); placementChangesUploaded = false; uploaded = false; } - if (placement.updateBucketDynamicVertices(*this, tile)) { + if (placement.updateBucketDynamicVertices(*this, state, tile)) { dynamicUploaded = false; uploaded = false; } diff --git a/src/mbgl/renderer/buckets/symbol_bucket.hpp b/src/mbgl/renderer/buckets/symbol_bucket.hpp index ed2ccd98c8..f72e832169 100644 --- a/src/mbgl/renderer/buckets/symbol_bucket.hpp +++ b/src/mbgl/renderer/buckets/symbol_bucket.hpp @@ -60,7 +60,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 RenderTile&, std::set&) override; + void updateVertices(Placement&, bool updateOpacities, const TransformState&, const RenderTile&, std::set&) override; bool hasTextData() const; bool hasIconData() const; bool hasCollisionBoxData() const; diff --git a/src/mbgl/renderer/renderer_impl.cpp b/src/mbgl/renderer/renderer_impl.cpp index 201d46ebac..294b4dfa1c 100644 --- a/src/mbgl/renderer/renderer_impl.cpp +++ b/src/mbgl/renderer/renderer_impl.cpp @@ -348,7 +348,7 @@ void Renderer::Impl::render(const UpdateParameters& updateParameters) { } for (auto it = layersNeedPlacement.rbegin(); it != layersNeedPlacement.rend(); ++it) { - placement->updateLayerBuckets(*it, placementChanged || symbolBucketsChanged); + placement->updateLayerBuckets(*it, updateParameters.transformState, placementChanged || symbolBucketsChanged); } } diff --git a/src/mbgl/text/collision_index.hpp b/src/mbgl/text/collision_index.hpp index dd160c945c..ea65a426fd 100644 --- a/src/mbgl/text/collision_index.hpp +++ b/src/mbgl/text/collision_index.hpp @@ -42,6 +42,8 @@ public: CollisionTileBoundaries projectTileBoundaries(const mat4& posMatrix) const; + const TransformState& getTransformState() const { return transformState; } + private: bool isOffscreen(const CollisionBox&) const; bool isInsideGrid(const CollisionBox&) const; diff --git a/src/mbgl/text/placement.cpp b/src/mbgl/text/placement.cpp index 452a071683..edf73101ab 100644 --- a/src/mbgl/text/placement.cpp +++ b/src/mbgl/text/placement.cpp @@ -60,7 +60,6 @@ const CollisionGroups::CollisionGroup& CollisionGroups::get(const std::string& s Placement::Placement(const TransformState& state_, MapMode mapMode_, style::TransitionOptions transitionOptions_, const bool crossSourceCollisions, std::unique_ptr prevPlacement_) : collisionIndex(state_) - , state(state_) , mapMode(mapMode_) , transitionOptions(std::move(transitionOptions_)) , collisionGroups(crossSourceCollisions) @@ -103,6 +102,7 @@ void Placement::placeBucket( std::set& seenCrossTileIDs) { const auto& layout = bucket.layout; const auto& renderTile = params.tile; + const auto& state = collisionIndex.getTransformState(); const float pixelsToTileUnits = renderTile.id.pixelsToTileUnits(1, state.getZoom()); const OverscaledTileID& overscaledID = renderTile.getOverscaledTileID(); const float scale = std::pow(2, state.getZoom() - overscaledID.overscaledZ); @@ -384,10 +384,10 @@ void Placement::commit(TimePoint now) { fadeStartTime = placementChanged ? commitTime : prevPlacement->fadeStartTime; } -void Placement::updateLayerBuckets(const RenderLayer& layer, bool updateOpacities) { +void Placement::updateLayerBuckets(const RenderLayer& layer, const TransformState& state, bool updateOpacities) { std::set seenCrossTileIDs; for (const auto& item : layer.getPlacementData()) { - item.bucket.get().updateVertices(*this, updateOpacities, item.tile, seenCrossTileIDs); + item.bucket.get().updateVertices(*this, updateOpacities, state, item.tile, seenCrossTileIDs); } } @@ -402,7 +402,7 @@ Point calculateVariableRenderShift(style::SymbolAnchorType anchor, float } } // namespace -bool Placement::updateBucketDynamicVertices(SymbolBucket& bucket, const RenderTile& tile) { +bool Placement::updateBucketDynamicVertices(SymbolBucket& bucket, const TransformState& state, const RenderTile& tile) { using namespace style; const auto& layout = bucket.layout; const bool alongLine = layout.get() != SymbolPlacementType::Point; @@ -499,7 +499,7 @@ bool Placement::updateBucketDynamicVertices(SymbolBucket& bucket, const RenderTi return result; } -void Placement::updateBucketOpacities(SymbolBucket& bucket, std::set& seenCrossTileIDs) { +void Placement::updateBucketOpacities(SymbolBucket& bucket, const TransformState& state, std::set& seenCrossTileIDs) { if (bucket.hasTextData()) bucket.text.opacityVertices.clear(); if (bucket.hasIconData()) bucket.icon.opacityVertices.clear(); if (bucket.hasCollisionBoxData()) bucket.collisionBox.dynamicVertices.clear(); @@ -597,7 +597,7 @@ void Placement::updateBucketOpacities(SymbolBucket& bucket, std::set& } }; - auto updateCollisionTextBox = [this, &bucket, &symbolInstance, variablePlacement, rotateWithMap, pitchWithMap](const auto& feature, const bool placed) { + auto updateCollisionTextBox = [this, &bucket, &symbolInstance, &state, variablePlacement, rotateWithMap, pitchWithMap](const auto& feature, const bool placed) { if (feature.alongLine) { return; } diff --git a/src/mbgl/text/placement.hpp b/src/mbgl/text/placement.hpp index 69d05c94db..6ffe58afc5 100644 --- a/src/mbgl/text/placement.hpp +++ b/src/mbgl/text/placement.hpp @@ -101,7 +101,7 @@ public: Placement(const TransformState&, MapMode, style::TransitionOptions, const bool crossSourceCollisions, std::unique_ptr prevPlacementOrNull = nullptr); void placeLayer(const RenderLayer&, const mat4&, bool showCollisionBoxes); void commit(TimePoint); - void updateLayerBuckets(const RenderLayer&, bool updateOpacities); + void updateLayerBuckets(const RenderLayer&, const TransformState&, bool updateOpacities); float symbolFadeChange(TimePoint now) const; bool hasTransitions(TimePoint now) const; @@ -119,13 +119,12 @@ private: const BucketPlacementParameters&, std::set& seenCrossTileIDs); // Returns `true` if bucket vertices were updated; returns `false` otherwise. - bool updateBucketDynamicVertices(SymbolBucket& bucket, const RenderTile& tile); - void updateBucketOpacities(SymbolBucket&, std::set&); + bool updateBucketDynamicVertices(SymbolBucket&, const TransformState&, const RenderTile& tile); + void updateBucketOpacities(SymbolBucket&, const TransformState&, std::set&); void markUsedJustification(SymbolBucket&, style::TextVariableAnchorType, SymbolInstance&); CollisionIndex collisionIndex; - TransformState state; MapMode mapMode; style::TransitionOptions transitionOptions; -- cgit v1.2.1