diff options
author | John Firebaugh <john.firebaugh@gmail.com> | 2017-05-02 11:30:07 -0700 |
---|---|---|
committer | John Firebaugh <john.firebaugh@gmail.com> | 2017-05-04 09:59:56 -0700 |
commit | e7d2796762c3ba05e824177969c501ab2370336f (patch) | |
tree | 22caa9990d87f94c68b346993b5956b6792b5dbe /src/mbgl | |
parent | 89f1ffc6d29d5631dfd322834397ec2247c5c9d7 (diff) | |
download | qtlocation-mapboxgl-e7d2796762c3ba05e824177969c501ab2370336f.tar.gz |
[core] Omnibus Style::update method
Combine Style::cascade, recalculate, relayout, and updateTiles into a single method. This allows multiple loops over sources and layers to be consolidated and prepares for additional Style-Map decoupling: rather than tracking pending updates via a set of Update flags held by the Map and passed to the Style, the Style can use its own data to determine what to update.
Diffstat (limited to 'src/mbgl')
-rw-r--r-- | src/mbgl/map/map.cpp | 35 | ||||
-rw-r--r-- | src/mbgl/map/update.hpp | 3 | ||||
-rw-r--r-- | src/mbgl/renderer/property_evaluation_parameters.hpp | 10 | ||||
-rw-r--r-- | src/mbgl/renderer/update_parameters.hpp | 26 | ||||
-rw-r--r-- | src/mbgl/style/style.cpp | 112 | ||||
-rw-r--r-- | src/mbgl/style/style.hpp | 10 | ||||
-rw-r--r-- | src/mbgl/tile/geometry_tile_worker.cpp | 5 |
7 files changed, 100 insertions, 101 deletions
diff --git a/src/mbgl/map/map.cpp b/src/mbgl/map/map.cpp index d28869bd65..5d52fc130b 100644 --- a/src/mbgl/map/map.cpp +++ b/src/mbgl/map/map.cpp @@ -12,7 +12,7 @@ #include <mbgl/style/light.hpp> #include <mbgl/style/observer.hpp> #include <mbgl/style/transition_options.hpp> -#include <mbgl/renderer/tile_parameters.hpp> +#include <mbgl/renderer/update_parameters.hpp> #include <mbgl/renderer/painter.hpp> #include <mbgl/renderer/render_source.hpp> #include <mbgl/storage/file_source.hpp> @@ -243,28 +243,17 @@ void Map::Impl::render(View& view) { annotationManager->updateData(); } - if (updateFlags & Update::Classes) { - style->cascade(timePoint, mode); - } - - if (updateFlags & Update::Classes || updateFlags & Update::RecalculateStyle) { - style->recalculate(transform.getZoom(), timePoint, mode); - } - - if (updateFlags & Update::Layout) { - style->relayout(); - } - - TileParameters parameters(pixelRatio, - debugOptions, - transform.getState(), - scheduler, - fileSource, - mode, - *annotationManager, - *style); - - style->updateTiles(parameters); + style->update({ + mode, + updateFlags, + pixelRatio, + debugOptions, + timePoint, + transform.getState(), + scheduler, + fileSource, + *annotationManager + }); updateFlags = Update::Nothing; diff --git a/src/mbgl/map/update.hpp b/src/mbgl/map/update.hpp index 74ab22dd8a..5e87515eac 100644 --- a/src/mbgl/map/update.hpp +++ b/src/mbgl/map/update.hpp @@ -10,8 +10,7 @@ enum class Update { Classes = 1 << 2, RecalculateStyle = 1 << 3, AnnotationStyle = 1 << 6, - AnnotationData = 1 << 7, - Layout = 1 << 8 + AnnotationData = 1 << 7 }; constexpr Update operator|(Update lhs, Update rhs) { diff --git a/src/mbgl/renderer/property_evaluation_parameters.hpp b/src/mbgl/renderer/property_evaluation_parameters.hpp index b18fe57aca..39b663bdb9 100644 --- a/src/mbgl/renderer/property_evaluation_parameters.hpp +++ b/src/mbgl/renderer/property_evaluation_parameters.hpp @@ -8,13 +8,15 @@ namespace mbgl { class PropertyEvaluationParameters { public: explicit PropertyEvaluationParameters(float z_) - : z(z_) {} + : z(z_), + now(Clock::time_point::max()), + zoomHistory(), + defaultFadeDuration(0) {} - PropertyEvaluationParameters(float z_, + PropertyEvaluationParameters(ZoomHistory zoomHistory_, TimePoint now_, - ZoomHistory zoomHistory_, Duration defaultFadeDuration_) - : z(z_), + : z(zoomHistory_.lastZoom), now(std::move(now_)), zoomHistory(std::move(zoomHistory_)), defaultFadeDuration(std::move(defaultFadeDuration_)) {} diff --git a/src/mbgl/renderer/update_parameters.hpp b/src/mbgl/renderer/update_parameters.hpp new file mode 100644 index 0000000000..ae54ac09e7 --- /dev/null +++ b/src/mbgl/renderer/update_parameters.hpp @@ -0,0 +1,26 @@ +#pragma once + +#include <mbgl/map/mode.hpp> +#include <mbgl/map/update.hpp> + +namespace mbgl { + +class TransformState; +class Scheduler; +class FileSource; +class AnnotationManager; + +class UpdateParameters { +public: + const MapMode mode; + const Update updateFlags; + const float pixelRatio; + const MapDebugOptions debugOptions; + const TimePoint timePoint; + const TransformState& transformState; + Scheduler& scheduler; + FileSource& fileSource; + AnnotationManager& annotationManager; +}; + +} // namespace mbgl diff --git a/src/mbgl/style/style.cpp b/src/mbgl/style/style.cpp index 5180f440c5..1fc738cb84 100644 --- a/src/mbgl/style/style.cpp +++ b/src/mbgl/style/style.cpp @@ -19,10 +19,11 @@ #include <mbgl/sprite/sprite_atlas.hpp> #include <mbgl/text/glyph_atlas.hpp> #include <mbgl/geometry/line_atlas.hpp> -#include <mbgl/renderer/render_source.hpp> -#include <mbgl/renderer/tile_parameters.hpp> +#include <mbgl/renderer/update_parameters.hpp> #include <mbgl/renderer/cascade_parameters.hpp> #include <mbgl/renderer/property_evaluation_parameters.hpp> +#include <mbgl/renderer/tile_parameters.hpp> +#include <mbgl/renderer/render_source.hpp> #include <mbgl/renderer/render_item.hpp> #include <mbgl/renderer/render_tile.hpp> #include <mbgl/renderer/render_background_layer.hpp> @@ -327,30 +328,8 @@ double Style::getDefaultPitch() const { return defaultPitch; } -void Style::updateTiles(const TileParameters& parameters) { - for (const auto& renderSource : renderSources) { - if (renderSource->enabled) { - renderSource->updateTiles(parameters); - } - } -} - -void Style::relayout() { - for (const auto& sourceID : updateBatch.sourceIDs) { - RenderSource* renderSource = getRenderSource(sourceID); - if (renderSource && renderSource->enabled) { - renderSource->reloadTiles(); - } else if (renderSource) { - renderSource->invalidateTiles(); - } - } - updateBatch.sourceIDs.clear(); -} - -void Style::cascade(const TimePoint& timePoint, MapMode mode) { - // When in continuous mode, we can either have user- or style-defined - // transitions. Still mode is always immediate. - static const TransitionOptions immediateTransition {}; +void Style::update(const UpdateParameters& parameters) { + zoomHistory.update(parameters.transformState.getZoom(), parameters.timePoint); std::vector<ClassID> classIDs; for (const auto& className : classes) { @@ -358,37 +337,47 @@ void Style::cascade(const TimePoint& timePoint, MapMode mode) { } classIDs.push_back(ClassID::Default); - const CascadeParameters parameters { + const CascadeParameters cascadeParameters { classIDs, - timePoint, - mode == MapMode::Continuous ? transitionOptions : immediateTransition + parameters.timePoint, + parameters.mode == MapMode::Continuous ? transitionOptions : TransitionOptions() }; - for (const auto& layer : renderLayers) { - layer->cascade(parameters); + const PropertyEvaluationParameters evaluationParameters { + zoomHistory, + parameters.timePoint, + parameters.mode == MapMode::Continuous ? util::DEFAULT_FADE_DURATION : Duration::zero() + }; + + const TileParameters tileParameters(parameters.pixelRatio, + parameters.debugOptions, + parameters.transformState, + parameters.scheduler, + parameters.fileSource, + parameters.mode, + parameters.annotationManager, + *this); + + if (parameters.updateFlags & Update::Classes) { + transitioningLight = TransitioningLight(*light, std::move(transitioningLight), cascadeParameters); } - transitioningLight = TransitioningLight(*light, std::move(transitioningLight), parameters); -} + if (parameters.updateFlags & Update::RecalculateStyle) { + evaluatedLight = EvaluatedLight(transitioningLight, evaluationParameters); + } -void Style::recalculate(float z, const TimePoint& timePoint, MapMode mode) { - // Disable all sources first. If we find an enabled layer that uses this source, we will - // re-enable it later. for (const auto& renderSource : renderSources) { renderSource->enabled = false; } - zoomHistory.update(z, timePoint); - - const PropertyEvaluationParameters parameters { - z, - timePoint, - zoomHistory, - mode == MapMode::Continuous ? util::DEFAULT_FADE_DURATION : Duration::zero() - }; - for (const auto& layer : renderLayers) { - layer->evaluate(parameters); + if (parameters.updateFlags & Update::Classes) { + layer->cascade(cascadeParameters); + } + + if (parameters.updateFlags & Update::Classes || parameters.updateFlags & Update::RecalculateStyle) { + layer->evaluate(evaluationParameters); + } if (layer->needsRendering(zoomHistory.lastZoom)) { if (RenderSource* renderSource = getRenderSource(layer->baseImpl.source)) { @@ -397,14 +386,21 @@ void Style::recalculate(float z, const TimePoint& timePoint, MapMode mode) { } } - evaluatedLight = EvaluatedLight(transitioningLight, parameters); - - // Remove the existing tiles if we didn't end up re-enabling the source. for (const auto& renderSource : renderSources) { - if (!renderSource->enabled) { + bool updated = updateBatch.sourceIDs.count(renderSource->baseImpl.id); + if (renderSource->enabled) { + if (updated) { + renderSource->reloadTiles(); + } + renderSource->updateTiles(tileParameters); + } else if (updated) { + renderSource->invalidateTiles(); + } else { renderSource->removeTiles(); } } + + updateBatch.sourceIDs.clear(); } std::vector<const Source*> Style::getSources() const { @@ -720,12 +716,12 @@ struct QueueSourceReloadVisitor { void Style::onLayerFilterChanged(Layer& layer) { layer.accept(QueueSourceReloadVisitor { updateBatch }); - observer->onUpdate(Update::Layout); + observer->onUpdate(Update::Repaint); } void Style::onLayerVisibilityChanged(Layer& layer) { layer.accept(QueueSourceReloadVisitor { updateBatch }); - observer->onUpdate(Update::RecalculateStyle | Update::Layout); + observer->onUpdate(Update::RecalculateStyle); } void Style::onLayerPaintPropertyChanged(Layer&) { @@ -734,20 +730,16 @@ void Style::onLayerPaintPropertyChanged(Layer&) { void Style::onLayerDataDrivenPaintPropertyChanged(Layer& layer) { layer.accept(QueueSourceReloadVisitor { updateBatch }); - observer->onUpdate(Update::RecalculateStyle | Update::Classes | Update::Layout); + observer->onUpdate(Update::RecalculateStyle | Update::Classes); } void Style::onLayerLayoutPropertyChanged(Layer& layer, const char * property) { layer.accept(QueueSourceReloadVisitor { updateBatch }); - auto update = Update::Layout; - // Recalculate the style for certain properties - bool needsRecalculation = strcmp(property, "icon-size") == 0 || strcmp(property, "text-size") == 0; - if (needsRecalculation) { - update |= Update::RecalculateStyle; - } - observer->onUpdate(update); + observer->onUpdate((strcmp(property, "icon-size") == 0 || strcmp(property, "text-size") == 0) + ? Update::RecalculateStyle + : Update::Repaint); } void Style::dumpDebugLogs() const { diff --git a/src/mbgl/style/style.hpp b/src/mbgl/style/style.hpp index e07a4fda75..b9eb499947 100644 --- a/src/mbgl/style/style.hpp +++ b/src/mbgl/style/style.hpp @@ -36,7 +36,7 @@ class RenderedQueryOptions; class Scheduler; class RenderLayer; class RenderSource; -class TileParameters; +class UpdateParameters; namespace style { @@ -59,13 +59,7 @@ public: bool isLoaded() const; - // Fetch the tiles needed by the current viewport and emit a signal when - // a tile is ready so observers can render the tile. - void updateTiles(const TileParameters&); - - void relayout(); - void cascade(const TimePoint&, MapMode); - void recalculate(float z, const TimePoint&, MapMode); + void update(const UpdateParameters&); bool hasTransitions() const; diff --git a/src/mbgl/tile/geometry_tile_worker.cpp b/src/mbgl/tile/geometry_tile_worker.cpp index a2d1f15906..616a0bba1f 100644 --- a/src/mbgl/tile/geometry_tile_worker.cpp +++ b/src/mbgl/tile/geometry_tile_worker.cpp @@ -256,10 +256,7 @@ static std::vector<std::unique_ptr<RenderLayer>> toRenderLayers(const std::vecto }); renderLayers.back()->evaluate(PropertyEvaluationParameters { - zoom, - Clock::time_point::max(), - ZoomHistory(), - Duration(0) + zoom }); } return renderLayers; |