diff options
Diffstat (limited to 'src/mbgl/renderer/sources/render_tile_source.cpp')
-rw-r--r-- | src/mbgl/renderer/sources/render_tile_source.cpp | 42 |
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 |