summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBruno de Oliveira Abinader <bruno@mapbox.com>2018-10-03 17:00:28 -0700
committerBruno de Oliveira Abinader <bruno@mapbox.com>2018-11-21 14:19:04 +0200
commit78598ac19dbebe5512c3367650d8021144a8c83b (patch)
treee79b99402c02bb59dd356429979be1d79ad8d58d
parent9f51faf77955b2c5f6d0bbd8b55b3ad507e90a16 (diff)
downloadqtlocation-mapboxgl-upstream/placement-transition.tar.gz
[core] Let placement transitions use the transition duration, if set, and allow disabling them entirelyupstream/placement-transition
-rw-r--r--include/mbgl/style/transition_options.hpp10
-rw-r--r--src/mbgl/renderer/renderer_impl.cpp4
-rw-r--r--src/mbgl/text/placement.cpp21
-rw-r--r--src/mbgl/text/placement.hpp5
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> duration;
optional<Duration> delay;
+ bool enablePlacementTransitions;
TransitionOptions(optional<Duration> duration_ = {},
- optional<Duration> delay_ = {})
+ optional<Duration> 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<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, true)) {
+ , placement(std::make_unique<Placement>(TransformState{}, MapMode::Static, TransitionOptions{}, true)) {
glyphManager->setObserver(this);
}
@@ -338,7 +338,7 @@ void Renderer::Impl::render(const UpdateParameters& updateParameters) {
std::set<std::string> usedSymbolLayers;
if (placementChanged) {
- newPlacement = std::make_unique<Placement>(parameters.state, parameters.mapMode, updateParameters.crossSourceCollisions);
+ newPlacement = std::make_unique<Placement>(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<float>(commitTime - prevPlacement.commitTime) / Duration(std::chrono::milliseconds(300)) :
+ float increment = mapMode == MapMode::Continuous && transitionOptions.enablePlacementTransitions ?
+ std::chrono::duration<float>(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<uint32_t>&
}
float Placement::symbolFadeChange(TimePoint now) const {
- if (mapMode == MapMode::Continuous) {
- return std::chrono::duration<float>(now - commitTime) / Duration(std::chrono::milliseconds(300));
+ if (mapMode == MapMode::Continuous && transitionOptions.enablePlacementTransitions) {
+ return std::chrono::duration<float>(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<float>(now - fadeStartTime) < Duration(std::chrono::milliseconds(300));
+ if (mapMode == MapMode::Continuous && transitionOptions.enablePlacementTransitions) {
+ return stale || std::chrono::duration<float>(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 <mbgl/util/chrono.hpp>
#include <mbgl/text/collision_index.hpp>
#include <mbgl/layout/symbol_projection.hpp>
+#include <mbgl/style/transition_options.hpp>
#include <unordered_set>
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;