From dce5ede2b62410b1ea42abbf82f800c722544cc7 Mon Sep 17 00:00:00 2001 From: Bruno de Oliveira Abinader Date: Wed, 3 Oct 2018 17:00:28 -0700 Subject: [PATCH] [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 | 19 +++++++++++-------- src/mbgl/text/placement.hpp | 5 ++++- 4 files changed, 24 insertions(+), 14 deletions(-) diff --git a/include/mbgl/style/transition_options.hpp b/include/mbgl/style/transition_options.hpp index 87a81717a0e..9cb5c1f575e 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 3dc4a5d409e..ff471d488cb 100644 --- a/src/mbgl/renderer/renderer_impl.cpp +++ b/src/mbgl/renderer/renderer_impl.cpp @@ -61,7 +61,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); } @@ -405,7 +405,7 @@ void Renderer::Impl::render(const UpdateParameters& updateParameters) { if (!placement->stillRecent(parameters.timePoint)) { placementChanged = true; - auto newPlacement = std::make_unique(parameters.state, parameters.mapMode, updateParameters.crossSourceCollisions); + auto newPlacement = std::make_unique(parameters.state, parameters.mapMode, updateParameters.transitionOptions, updateParameters.crossSourceCollisions); std::set usedSymbolLayers; for (auto it = order.rbegin(); it != order.rend(); ++it) { if (it->layer.is()) { diff --git a/src/mbgl/text/placement.cpp b/src/mbgl/text/placement.cpp index 5c6cdcde6cc..3fcf6c5eeae 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,25 @@ 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; + return mapMode == MapMode::Continuous && + transitionOptions.enablePlacementTransitions && + commitTime + 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 8527d6df570..36f2d032ff1 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 @@ class CollisionGroups { class Placement { public: - Placement(const TransformState&, MapMode mapMode, const bool crossSourceCollisions); + Placement(const TransformState&, MapMode, style::TransitionOptions, const bool crossSourceCollisions); void placeLayer(RenderSymbolLayer&, const mat4&, bool showCollisionBoxes); void commit(const Placement& prevPlacement, TimePoint); void updateLayerOpacities(RenderSymbolLayer&); @@ -113,6 +114,8 @@ class Placement { TransformState state; MapMode mapMode; + style::TransitionOptions transitionOptions; + TimePoint fadeStartTime; TimePoint commitTime;