[core] Fix placement for updated buckets
Buckets update initiates new placement, so that newly added symbols are placed and shown immediately.
This commit is contained in:
@@ -361,26 +361,24 @@ std::unique_ptr<RenderTree> RenderOrchestrator::createRenderTree(const UpdatePar
|
||||
}
|
||||
|
||||
bool symbolBucketsChanged = false;
|
||||
renderTreeParameters->placementChanged = !placement->stillRecent(updateParameters.timePoint, updateParameters.transformState.getZoom());
|
||||
for (auto it = layersNeedPlacement.rbegin(); it != layersNeedPlacement.rend(); ++it) {
|
||||
if (crossTileSymbolIndex.addLayer(*it, updateParameters.transformState.getLatLng().longitude())) symbolBucketsChanged = true;
|
||||
}
|
||||
renderTreeParameters->placementChanged = !placement->stillRecent(updateParameters.timePoint, updateParameters.transformState.getZoom()) || symbolBucketsChanged;
|
||||
|
||||
std::set<std::string> usedSymbolLayers;
|
||||
if (renderTreeParameters->placementChanged) {
|
||||
placement = std::make_unique<Placement>(
|
||||
updateParameters.transformState, updateParameters.mode,
|
||||
updateParameters.transitionOptions, updateParameters.crossSourceCollisions,
|
||||
std::move(placement));
|
||||
}
|
||||
|
||||
for (auto it = layersNeedPlacement.rbegin(); it != layersNeedPlacement.rend(); ++it) {
|
||||
const RenderLayer& layer = *it;
|
||||
if (crossTileSymbolIndex.addLayer(layer, updateParameters.transformState.getLatLng().longitude())) symbolBucketsChanged = true;
|
||||
|
||||
if (renderTreeParameters->placementChanged) {
|
||||
for (auto it = layersNeedPlacement.rbegin(); it != layersNeedPlacement.rend(); ++it) {
|
||||
const RenderLayer& layer = *it;
|
||||
usedSymbolLayers.insert(layer.getID());
|
||||
placement->placeLayer(layer, renderTreeParameters->transformParams.projMatrix, updateParameters.debugOptions & MapDebugOptions::Collision);
|
||||
}
|
||||
}
|
||||
|
||||
if (renderTreeParameters->placementChanged) {
|
||||
placement->commit(updateParameters.timePoint, updateParameters.transformState.getZoom());
|
||||
crossTileSymbolIndex.pruneUnusedLayers(usedSymbolLayers);
|
||||
for (const auto& entry : renderSources) {
|
||||
@@ -391,7 +389,7 @@ std::unique_ptr<RenderTree> RenderOrchestrator::createRenderTree(const UpdatePar
|
||||
}
|
||||
|
||||
for (auto it = layersNeedPlacement.rbegin(); it != layersNeedPlacement.rend(); ++it) {
|
||||
placement->updateLayerBuckets(*it, updateParameters.transformState, renderTreeParameters->placementChanged || symbolBucketsChanged);
|
||||
placement->updateLayerBuckets(*it, updateParameters.transformState, renderTreeParameters->placementChanged);
|
||||
}
|
||||
|
||||
renderTreeParameters->symbolFadeChange = placement->symbolFadeChange(updateParameters.timePoint);
|
||||
|
||||
@@ -699,7 +699,7 @@ void Placement::updateBucketOpacities(SymbolBucket& bucket, const TransformState
|
||||
if (bucket.hasTextCollisionBoxData()) bucket.textCollisionBox->dynamicVertices.clear();
|
||||
if (bucket.hasTextCollisionCircleData()) bucket.textCollisionCircle->dynamicVertices.clear();
|
||||
|
||||
JointOpacityState duplicateOpacityState(false, false, true);
|
||||
const JointOpacityState duplicateOpacityState(false, false, true);
|
||||
|
||||
const bool textAllowOverlap = bucket.layout->get<style::TextAllowOverlap>();
|
||||
const bool iconAllowOverlap = bucket.layout->get<style::IconAllowOverlap>();
|
||||
@@ -712,7 +712,7 @@ void Placement::updateBucketOpacities(SymbolBucket& bucket, const TransformState
|
||||
// But we have to wait for placement if we potentially depend on a paired icon/text
|
||||
// with allow-overlap: false.
|
||||
// See https://github.com/mapbox/mapbox-gl-native/issues/12483
|
||||
JointOpacityState defaultOpacityState(
|
||||
const JointOpacityState defaultOpacityState(
|
||||
textAllowOverlap && (iconAllowOverlap || !(bucket.hasIconData() || bucket.hasSdfIconData()) || bucket.layout->get<style::IconOptional>()),
|
||||
iconAllowOverlap && (textAllowOverlap || !bucket.hasTextData() || bucket.layout->get<style::TextOptional>()),
|
||||
true);
|
||||
@@ -728,10 +728,6 @@ void Placement::updateBucketOpacities(SymbolBucket& bucket, const TransformState
|
||||
opacityState = it->second;
|
||||
}
|
||||
|
||||
if (it == opacities.end()) {
|
||||
opacities.emplace(symbolInstance.crossTileID, defaultOpacityState);
|
||||
}
|
||||
|
||||
seenCrossTileIDs.insert(symbolInstance.crossTileID);
|
||||
|
||||
if (symbolInstance.hasText()) {
|
||||
|
||||
Reference in New Issue
Block a user