diff options
author | Mikhail Pozdnyakov <mikhail.pozdnyakov@mapbox.com> | 2019-09-17 15:15:17 +0300 |
---|---|---|
committer | Mikhail Pozdnyakov <mikhail.pozdnyakov@mapbox.com> | 2019-09-19 14:51:32 +0300 |
commit | f04efb69c0d72c85618c9b609fb8f56a5f0a9aa4 (patch) | |
tree | 1e23281a8c1a5148b92547d9549e18d225e94ceb /src/mbgl/renderer | |
parent | 870f306f680a26d2a4994d46cadb1fd664696396 (diff) | |
download | qtlocation-mapboxgl-f04efb69c0d72c85618c9b609fb8f56a5f0a9aa4.tar.gz |
[core] Immutable/Mutable pattern for Placement
Diffstat (limited to 'src/mbgl/renderer')
-rw-r--r-- | src/mbgl/renderer/render_orchestrator.cpp | 30 | ||||
-rw-r--r-- | src/mbgl/renderer/render_orchestrator.hpp | 2 |
2 files changed, 16 insertions, 16 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; } diff --git a/src/mbgl/renderer/render_orchestrator.hpp b/src/mbgl/renderer/render_orchestrator.hpp index 4592abc35c..9b63498a2a 100644 --- a/src/mbgl/renderer/render_orchestrator.hpp +++ b/src/mbgl/renderer/render_orchestrator.hpp @@ -122,7 +122,7 @@ private: RenderLight renderLight; CrossTileSymbolIndex crossTileSymbolIndex; - std::shared_ptr<Placement> placement; + PlacementController placementController; const bool backgroundLayerAsColor; bool contextLost = false; |