summaryrefslogtreecommitdiff
path: root/src/mbgl/text
diff options
context:
space:
mode:
authorMikhail Pozdnyakov <mikhail.pozdnyakov@mapbox.com>2019-06-03 16:22:54 +0300
committerMikhail Pozdnyakov <mikhail.pozdnyakov@mapbox.com>2019-06-03 17:03:57 +0300
commitb2428835871933ecf5a93e86493bac0b76db0ede (patch)
treec53eeea19bfc01438cc4c9394a41056ffc76cc38 /src/mbgl/text
parenta44b7f1e5ddae61260e55db5b68b10d9aa5e711d (diff)
downloadqtlocation-mapboxgl-b2428835871933ecf5a93e86493bac0b76db0ede.tar.gz
[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.
Diffstat (limited to 'src/mbgl/text')
-rw-r--r--src/mbgl/text/collision_index.hpp2
-rw-r--r--src/mbgl/text/placement.cpp12
-rw-r--r--src/mbgl/text/placement.hpp7
3 files changed, 11 insertions, 10 deletions
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<Placement> prevPlacement_)
: collisionIndex(state_)
- , state(state_)
, mapMode(mapMode_)
, transitionOptions(std::move(transitionOptions_))
, collisionGroups(crossSourceCollisions)
@@ -103,6 +102,7 @@ void Placement::placeBucket(
std::set<uint32_t>& 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<uint32_t> 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<float> 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<SymbolPlacement>() != SymbolPlacementType::Point;
@@ -499,7 +499,7 @@ bool Placement::updateBucketDynamicVertices(SymbolBucket& bucket, const RenderTi
return result;
}
-void Placement::updateBucketOpacities(SymbolBucket& bucket, std::set<uint32_t>& seenCrossTileIDs) {
+void Placement::updateBucketOpacities(SymbolBucket& bucket, const TransformState& state, std::set<uint32_t>& 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<uint32_t>&
}
};
- 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<Placement> 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<uint32_t>& seenCrossTileIDs);
// Returns `true` if bucket vertices were updated; returns `false` otherwise.
- bool updateBucketDynamicVertices(SymbolBucket& bucket, const RenderTile& tile);
- void updateBucketOpacities(SymbolBucket&, std::set<uint32_t>&);
+ bool updateBucketDynamicVertices(SymbolBucket&, const TransformState&, const RenderTile& tile);
+ void updateBucketOpacities(SymbolBucket&, const TransformState&, std::set<uint32_t>&);
void markUsedJustification(SymbolBucket&, style::TextVariableAnchorType, SymbolInstance&);
CollisionIndex collisionIndex;
- TransformState state;
MapMode mapMode;
style::TransitionOptions transitionOptions;