summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorJohn Firebaugh <john.firebaugh@gmail.com>2017-05-02 11:30:07 -0700
committerJohn Firebaugh <john.firebaugh@gmail.com>2017-05-04 09:59:56 -0700
commite7d2796762c3ba05e824177969c501ab2370336f (patch)
tree22caa9990d87f94c68b346993b5956b6792b5dbe /src
parent89f1ffc6d29d5631dfd322834397ec2247c5c9d7 (diff)
downloadqtlocation-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')
-rw-r--r--src/mbgl/map/map.cpp35
-rw-r--r--src/mbgl/map/update.hpp3
-rw-r--r--src/mbgl/renderer/property_evaluation_parameters.hpp10
-rw-r--r--src/mbgl/renderer/update_parameters.hpp26
-rw-r--r--src/mbgl/style/style.cpp112
-rw-r--r--src/mbgl/style/style.hpp10
-rw-r--r--src/mbgl/tile/geometry_tile_worker.cpp5
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;