summaryrefslogtreecommitdiff
path: root/src/mbgl/renderer/sources/render_tile_source.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/mbgl/renderer/sources/render_tile_source.cpp')
-rw-r--r--src/mbgl/renderer/sources/render_tile_source.cpp42
1 files changed, 42 insertions, 0 deletions
diff --git a/src/mbgl/renderer/sources/render_tile_source.cpp b/src/mbgl/renderer/sources/render_tile_source.cpp
index 6ee2eca1b1..ef3f34f595 100644
--- a/src/mbgl/renderer/sources/render_tile_source.cpp
+++ b/src/mbgl/renderer/sources/render_tile_source.cpp
@@ -4,8 +4,10 @@
#include <mbgl/renderer/render_tile.hpp>
#include <mbgl/renderer/render_tree.hpp>
#include <mbgl/renderer/paint_parameters.hpp>
+#include <mbgl/renderer/tile_parameters.hpp>
#include <mbgl/renderer/tile_render_data.hpp>
#include <mbgl/tile/vector_tile.hpp>
+#include <mbgl/util/constants.hpp>
#include <mbgl/util/math.hpp>
namespace mbgl {
@@ -139,4 +141,44 @@ void RenderTileSource::dumpDebugLogs() const {
tilePyramid.dumpDebugLogs();
}
+// RenderTileSetSource implementation
+
+RenderTileSetSource::RenderTileSetSource(Immutable<style::Source::Impl> impl_)
+ : RenderTileSource(std::move(impl_)) {
+}
+
+RenderTileSetSource::~RenderTileSetSource() = default;
+
+uint8_t RenderTileSetSource::getMaxZoom() const {
+ return cachedTileset ? cachedTileset->zoomRange.max : util::TERRAIN_RGB_MAXZOOM;
+}
+
+void RenderTileSetSource::update(Immutable<style::Source::Impl> baseImpl_,
+ const std::vector<Immutable<style::LayerProperties>>& layers,
+ const bool needsRendering,
+ const bool needsRelayout,
+ const TileParameters& parameters) {
+ std::swap(baseImpl, baseImpl_);
+
+ enabled = needsRendering;
+
+ const optional<Tileset>& implTileset = getTileset();
+ // In Continuous mode, keep the existing tiles if the new cachedTileset is not
+ // yet available, thus providing smart style transitions without flickering.
+ // In other modes, allow clearing the tile pyramid first, before the early
+ // return in order to avoid render tests being flaky.
+ bool canUpdateTileset = implTileset || parameters.mode != MapMode::Continuous;
+ if (canUpdateTileset && cachedTileset != implTileset) {
+ cachedTileset = implTileset;
+
+ // TODO: this removes existing buckets, and will cause flickering.
+ // Should instead refresh tile data in place.
+ tilePyramid.clearAll();
+ }
+
+ if (!implTileset) return;
+
+ updateInternal(*cachedTileset, layers, needsRendering, needsRelayout, parameters);
+}
+
} // namespace mbgl