From 78598ac19dbebe5512c3367650d8021144a8c83b Mon Sep 17 00:00:00 2001 From: Bruno de Oliveira Abinader Date: Wed, 3 Oct 2018 17:00:28 -0700 Subject: [core] Let placement transitions use the transition duration, if set, and allow disabling them entirely --- include/mbgl/style/transition_options.hpp | 10 +++++++--- src/mbgl/renderer/renderer_impl.cpp | 4 ++-- src/mbgl/text/placement.cpp | 21 +++++++++++++-------- src/mbgl/text/placement.hpp | 5 ++++- 4 files changed, 26 insertions(+), 14 deletions(-) diff --git a/include/mbgl/style/transition_options.hpp b/include/mbgl/style/transition_options.hpp index 87a81717a0..9cb5c1f575 100644 --- a/include/mbgl/style/transition_options.hpp +++ b/include/mbgl/style/transition_options.hpp @@ -10,16 +10,20 @@ class TransitionOptions { public: optional duration; optional delay; + bool enablePlacementTransitions; TransitionOptions(optional duration_ = {}, - optional delay_ = {}) + optional delay_ = {}, + bool enablePlacementTransitions_ = true) : duration(std::move(duration_)), - delay(std::move(delay_)) {} + delay(std::move(delay_)), + enablePlacementTransitions(enablePlacementTransitions_) {} TransitionOptions reverseMerge(const TransitionOptions& defaults) const { return { duration ? duration : defaults.duration, - delay ? delay : defaults.delay + delay ? delay : defaults.delay, + enablePlacementTransitions }; } diff --git a/src/mbgl/renderer/renderer_impl.cpp b/src/mbgl/renderer/renderer_impl.cpp index 676a9568a4..32fcd57332 100644 --- a/src/mbgl/renderer/renderer_impl.cpp +++ b/src/mbgl/renderer/renderer_impl.cpp @@ -55,7 +55,7 @@ Renderer::Impl::Impl(RendererBackend& backend_, , sourceImpls(makeMutable>>()) , layerImpls(makeMutable>>()) , renderLight(makeMutable()) - , placement(std::make_unique(TransformState{}, MapMode::Static, true)) { + , placement(std::make_unique(TransformState{}, MapMode::Static, TransitionOptions{}, true)) { glyphManager->setObserver(this); } @@ -338,7 +338,7 @@ void Renderer::Impl::render(const UpdateParameters& updateParameters) { std::set usedSymbolLayers; if (placementChanged) { - newPlacement = std::make_unique(parameters.state, parameters.mapMode, updateParameters.crossSourceCollisions); + newPlacement = std::make_unique(parameters.state, parameters.mapMode, updateParameters.transitionOptions, updateParameters.crossSourceCollisions); } for (const auto& item : renderItemsWithSymbols) { diff --git a/src/mbgl/text/placement.cpp b/src/mbgl/text/placement.cpp index 367e421412..3b2cf20b7e 100644 --- a/src/mbgl/text/placement.cpp +++ b/src/mbgl/text/placement.cpp @@ -55,10 +55,11 @@ const CollisionGroups::CollisionGroup& CollisionGroups::get(const std::string& s } } -Placement::Placement(const TransformState& state_, MapMode mapMode_, const bool crossSourceCollisions) +Placement::Placement(const TransformState& state_, MapMode mapMode_, style::TransitionOptions transitionOptions_, const bool crossSourceCollisions) : collisionIndex(state_) , state(state_) , mapMode(mapMode_) + , transitionOptions(transitionOptions_) , collisionGroups(crossSourceCollisions) {} @@ -244,8 +245,8 @@ void Placement::commit(const Placement& prevPlacement, TimePoint now) { bool placementChanged = false; - float increment = mapMode == MapMode::Continuous ? - std::chrono::duration(commitTime - prevPlacement.commitTime) / Duration(std::chrono::milliseconds(300)) : + float increment = mapMode == MapMode::Continuous && transitionOptions.enablePlacementTransitions ? + std::chrono::duration(commitTime - prevPlacement.commitTime) / transitionOptions.duration.value_or(util::DEFAULT_TRANSITION_DURATION) : 1.0; // add the opacities from the current placement, and copy their current values from the previous placement @@ -404,23 +405,27 @@ void Placement::updateBucketOpacities(SymbolBucket& bucket, std::set& } float Placement::symbolFadeChange(TimePoint now) const { - if (mapMode == MapMode::Continuous) { - return std::chrono::duration(now - commitTime) / Duration(std::chrono::milliseconds(300)); + if (mapMode == MapMode::Continuous && transitionOptions.enablePlacementTransitions) { + return std::chrono::duration(now - commitTime) / transitionOptions.duration.value_or(util::DEFAULT_TRANSITION_DURATION); } else { return 1.0; } } bool Placement::hasTransitions(TimePoint now) const { - if (mapMode == MapMode::Continuous) { - return stale || std::chrono::duration(now - fadeStartTime) < Duration(std::chrono::milliseconds(300)); + if (mapMode == MapMode::Continuous && transitionOptions.enablePlacementTransitions) { + return stale || std::chrono::duration(now - fadeStartTime) < transitionOptions.duration.value_or(util::DEFAULT_TRANSITION_DURATION); } else { return false; } } bool Placement::stillRecent(TimePoint now) const { - return mapMode == MapMode::Continuous && commitTime + Duration(std::chrono::milliseconds(300)) > now; + // Even if transitionOptions.duration is set to a value < 300ms, we still wait for this default transition duration + // before attempting another placement operation. + return mapMode == MapMode::Continuous && + transitionOptions.enablePlacementTransitions && + commitTime + std::max(util::DEFAULT_TRANSITION_DURATION, transitionOptions.duration.value_or(util::DEFAULT_TRANSITION_DURATION)) > now; } void Placement::setStale() { diff --git a/src/mbgl/text/placement.hpp b/src/mbgl/text/placement.hpp index f34a8a25c2..cc23110e54 100644 --- a/src/mbgl/text/placement.hpp +++ b/src/mbgl/text/placement.hpp @@ -5,6 +5,7 @@ #include #include #include +#include #include namespace mbgl { @@ -79,7 +80,7 @@ private: class Placement { public: - Placement(const TransformState&, MapMode mapMode, const bool crossSourceCollisions); + Placement(const TransformState&, MapMode, style::TransitionOptions, const bool crossSourceCollisions); void placeLayer(const RenderLayerSymbolInterface&, const mat4&, bool showCollisionBoxes); void commit(const Placement& prevPlacement, TimePoint); void updateLayerOpacities(const RenderLayerSymbolInterface&); @@ -113,6 +114,8 @@ private: TransformState state; MapMode mapMode; + style::TransitionOptions transitionOptions; + TimePoint fadeStartTime; TimePoint commitTime; -- cgit v1.2.1