diff options
author | Konstantin Käfer <mail@kkaefer.com> | 2016-05-27 17:01:12 +0200 |
---|---|---|
committer | Konstantin Käfer <mail@kkaefer.com> | 2016-06-10 12:42:14 +0200 |
commit | 4e5d0650000a51c3fb76b82d5d4447d74bd788f6 (patch) | |
tree | bd026ce6c69e752153011030d380a1a2cdddbe41 /src | |
parent | fce5dd5f6afd4864456197a5cfec20a5e8cd0e6a (diff) | |
download | qtlocation-mapboxgl-4e5d0650000a51c3fb76b82d5d4447d74bd788f6.tar.gz |
[core] load parents of missing tiles as optional
Diffstat (limited to 'src')
-rw-r--r-- | src/mbgl/algorithm/update_renderables.hpp | 30 | ||||
-rw-r--r-- | src/mbgl/style/source.cpp | 10 |
2 files changed, 24 insertions, 16 deletions
diff --git a/src/mbgl/algorithm/update_renderables.hpp b/src/mbgl/algorithm/update_renderables.hpp index 1f58075a58..5ef8e5fbc3 100644 --- a/src/mbgl/algorithm/update_renderables.hpp +++ b/src/mbgl/algorithm/update_renderables.hpp @@ -33,17 +33,19 @@ void updateRenderables(GetTileDataFn getTileData, const OverscaledTileID idealDataTileID(dataTileZoom, idealRenderTileID.canonical); auto data = getTileData(idealDataTileID); if (!data) { - data = createTileData(idealDataTileID, true); + data = createTileData(idealDataTileID); assert(data); } // if (source has the tile and bucket is loaded) { if (data->isRenderable()) { - retainTileData(*data); + retainTileData(*data, true); renderTile(idealRenderTileID, *data); } else { + bool triedPrevious = data->hasTriedOptional(); + // The tile isn't loaded yet, but retain it anyway because it's an ideal tile. - retainTileData(*data); + retainTileData(*data, true); covered = true; overscaledZ = dataTileZoom + 1; if (overscaledZ > info.maxZoom) { @@ -51,7 +53,7 @@ void updateRenderables(GetTileDataFn getTileData, const auto childDataTileID = idealDataTileID.scaledTo(overscaledZ); data = getTileData(childDataTileID); if (data && data->isRenderable()) { - retainTileData(*data); + retainTileData(*data, false); renderTile(idealRenderTileID, *data); } else { covered = false; @@ -62,7 +64,7 @@ void updateRenderables(GetTileDataFn getTileData, const OverscaledTileID childDataTileID(overscaledZ, childTileID); data = getTileData(childDataTileID); if (data && data->isRenderable()) { - retainTileData(*data); + retainTileData(*data, false); renderTile(childDataTileID.unwrapTo(idealRenderTileID.wrap), *data); } else { // At least one child tile doesn't exist, so we are going to look for @@ -88,11 +90,19 @@ void updateRenderables(GetTileDataFn getTileData, } data = getTileData(parentDataTileID); - if (data && data->isRenderable()) { - retainTileData(*data); - renderTile(parentRenderTileID, *data); - // Break parent tile ascent, since we found one. - break; + if (!data && triedPrevious) { + data = createTileData(parentDataTileID); + } + + if (data) { + triedPrevious = data->hasTriedOptional(); + retainTileData(*data, false); + + if (data->isRenderable()) { + renderTile(parentRenderTileID, *data); + // Break parent tile ascent, since we found one. + break; + } } } } diff --git a/src/mbgl/style/source.cpp b/src/mbgl/style/source.cpp index c398fe845e..952d0086ce 100644 --- a/src/mbgl/style/source.cpp +++ b/src/mbgl/style/source.cpp @@ -279,18 +279,16 @@ bool Source::update(const UpdateParameters& parameters) { // we're actively using, e.g. as a replacement for tile that aren't loaded yet. std::set<OverscaledTileID> retain; - auto retainTileDataFn = [&retain](const TileData& tileData) -> void { + auto retainTileDataFn = [&retain](TileData& tileData, bool required) -> void { retain.emplace(tileData.id); + tileData.getTileSource()->setNecessity(required ? TileSource::Necessity::Required + : TileSource::Necessity::Optional); }; auto getTileDataFn = [this](const OverscaledTileID& dataTileID) -> TileData* { return getTileData(dataTileID); }; - auto createTileDataFn = [this, ¶meters](const OverscaledTileID& dataTileID, - bool required) -> TileData* { + auto createTileDataFn = [this, ¶meters](const OverscaledTileID& dataTileID) -> TileData* { if (auto data = createTile(dataTileID, parameters)) { - if (required) { - data->getTileSource()->setNecessity(TileSource::Necessity::Required); - } return tileDataMap.emplace(dataTileID, std::move(data)).first->second.get(); } else { return nullptr; |