[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.
This commit is contained in:
Mikhail Pozdnyakov
2019-06-03 16:22:54 +03:00
parent a44b7f1e5d
commit b242883587
7 changed files with 18 additions and 16 deletions

View File

@@ -18,6 +18,7 @@ class OverscaledTileID;
class PatternDependency;
using PatternLayerMap = std::map<std::string, PatternDependency>;
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<uint32_t>&) {}
virtual void updateVertices(Placement&, bool /*updateOpacities*/, const RenderTile&, std::set<uint32_t>&) {}
virtual void updateVertices(Placement&, bool /*updateOpacities*/, const TransformState&, const RenderTile&, std::set<uint32_t>&) {}
protected:
Bucket() = default;

View File

@@ -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<uint32_t>& seenIds) {
void SymbolBucket::updateVertices(Placement& placement, bool updateOpacities, const TransformState& state, const RenderTile& tile, std::set<uint32_t>& 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;
}

View File

@@ -60,7 +60,7 @@ public:
bool hasData() const override;
std::pair<uint32_t, bool> registerAtCrossTileIndex(CrossTileSymbolLayerIndex&, const OverscaledTileID&, uint32_t& maxCrossTileID) override;
void place(Placement&, const BucketPlacementParameters&, std::set<uint32_t>&) override;
void updateVertices(Placement&, bool updateOpacities, const RenderTile&, std::set<uint32_t>&) override;
void updateVertices(Placement&, bool updateOpacities, const TransformState&, const RenderTile&, std::set<uint32_t>&) override;
bool hasTextData() const;
bool hasIconData() const;
bool hasCollisionBoxData() const;

View File

@@ -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);
}
}

View File

@@ -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;

View File

@@ -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;
}

View File

@@ -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;