summaryrefslogtreecommitdiff
path: root/src/mbgl/renderer/render_orchestrator.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/mbgl/renderer/render_orchestrator.cpp')
-rw-r--r--src/mbgl/renderer/render_orchestrator.cpp30
1 files changed, 15 insertions, 15 deletions
diff --git a/src/mbgl/renderer/render_orchestrator.cpp b/src/mbgl/renderer/render_orchestrator.cpp
index e71799cc19..832fd461ab 100644
--- a/src/mbgl/renderer/render_orchestrator.cpp
+++ b/src/mbgl/renderer/render_orchestrator.cpp
@@ -63,7 +63,7 @@ public:
LineAtlas& lineAtlas_,
PatternAtlas& patternAtlas_,
std::vector<std::reference_wrapper<RenderLayer>> layersNeedPlacement_,
- std::shared_ptr<const Placement> placement_,
+ Immutable<Placement> placement_,
bool updateSymbolOpacities_)
: RenderTree(std::move(parameters_)),
layerRenderItems(std::move(layerRenderItems_)),
@@ -73,7 +73,6 @@ public:
layersNeedPlacement(std::move(layersNeedPlacement_)),
placement(std::move(placement_)),
updateSymbolOpacities(updateSymbolOpacities_) {
- assert(placement);
}
void prepare() override {
@@ -99,7 +98,7 @@ public:
std::reference_wrapper<LineAtlas> lineAtlas;
std::reference_wrapper<PatternAtlas> patternAtlas;
std::vector<std::reference_wrapper<RenderLayer>> layersNeedPlacement;
- std::shared_ptr<const Placement> placement;
+ Immutable<Placement> placement;
bool updateSymbolOpacities;
};
@@ -117,7 +116,6 @@ RenderOrchestrator::RenderOrchestrator(
, sourceImpls(makeMutable<std::vector<Immutable<style::Source::Impl>>>())
, layerImpls(makeMutable<std::vector<Immutable<style::Layer::Impl>>>())
, renderLight(makeMutable<Light::Impl>())
- , placement(std::make_unique<Placement>(TransformState{}, MapMode::Static, TransitionOptions{}, true))
, backgroundLayerAsColor(backgroundLayerAsColor_) {
glyphManager->setObserver(this);
imageManager->setObserver(this);
@@ -386,16 +384,17 @@ std::unique_ptr<RenderTree> RenderOrchestrator::createRenderTree(const UpdatePar
// We want new symbols to show up faster, however simple setting `placementChanged` to `true` would
// initiate placement too often as new buckets ususally come from several rendered tiles in a row within
// a short period of time. Instead, we squeeze placement update period to coalesce buckets updates from several tiles.
- if (symbolBucketsAdded) placement->setMaximumUpdatePeriod(Milliseconds(30));
- renderTreeParameters->placementChanged = !placement->stillRecent(updateParameters.timePoint, updateParameters.transformState.getZoom());
+ optional<Duration> maximumPlacementUpdatePeriod;
+ if (symbolBucketsAdded) maximumPlacementUpdatePeriod = optional<Duration>(Milliseconds(30));
+ renderTreeParameters->placementChanged = !placementController.placementIsRecent(updateParameters.timePoint, updateParameters.transformState.getZoom(), maximumPlacementUpdatePeriod);
symbolBucketsChanged |= renderTreeParameters->placementChanged;
std::set<std::string> usedSymbolLayers;
if (renderTreeParameters->placementChanged) {
- placement = std::make_shared<Placement>(
+ Mutable<Placement> placement = makeMutable<Placement>(
updateParameters.transformState, updateParameters.mode,
updateParameters.transitionOptions, updateParameters.crossSourceCollisions,
- std::move(placement));
+ placementController.getPlacement());
for (auto it = layersNeedPlacement.rbegin(); it != layersNeedPlacement.rend(); ++it) {
const RenderLayer& layer = *it;
@@ -408,10 +407,11 @@ std::unique_ptr<RenderTree> RenderOrchestrator::createRenderTree(const UpdatePar
for (const auto& entry : renderSources) {
entry.second->updateFadingTiles();
}
+ placementController.setPlacement(std::move(placement));
} else {
- placement->setStale();
+ placementController.setPlacementStale();
}
- renderTreeParameters->symbolFadeChange = placement->symbolFadeChange(updateParameters.timePoint);
+ renderTreeParameters->symbolFadeChange = placementController.getPlacement()->symbolFadeChange(updateParameters.timePoint);
}
renderTreeParameters->needsRepaint = isMapModeContinuous && hasTransitions(updateParameters.timePoint);
@@ -435,7 +435,7 @@ std::unique_ptr<RenderTree> RenderOrchestrator::createRenderTree(const UpdatePar
*lineAtlas,
*patternAtlas,
std::move(layersNeedPlacement),
- placement,
+ placementController.getPlacement(),
symbolBucketsChanged);
}
@@ -473,11 +473,11 @@ void RenderOrchestrator::queryRenderedSymbols(std::unordered_map<std::string, st
if (crossTileSymbolIndexLayers.empty()) {
return;
}
-
- auto renderedSymbols = placement->getCollisionIndex().queryRenderedSymbols(geometry);
+ const Placement& placement = *placementController.getPlacement();
+ auto renderedSymbols = placement.getCollisionIndex().queryRenderedSymbols(geometry);
std::vector<std::reference_wrapper<const RetainedQueryData>> bucketQueryData;
for (auto entry : renderedSymbols) {
- bucketQueryData.emplace_back(placement->getQueryData(entry.first));
+ bucketQueryData.emplace_back(placement.getQueryData(entry.first));
}
// Although symbol query is global, symbol results are only sortable within a bucket
// For a predictable global sort renderItems, we sort the buckets based on their corresponding tile position
@@ -643,7 +643,7 @@ bool RenderOrchestrator::hasTransitions(TimePoint timePoint) const {
}
}
- if (placement->hasTransitions(timePoint)) {
+ if (placementController.hasTransitions(timePoint)) {
return true;
}