summaryrefslogtreecommitdiff
path: root/src/mbgl/algorithm
diff options
context:
space:
mode:
authorKonstantin Käfer <mail@kkaefer.com>2016-05-27 17:01:12 +0200
committerKonstantin Käfer <mail@kkaefer.com>2016-06-10 12:42:14 +0200
commit4e5d0650000a51c3fb76b82d5d4447d74bd788f6 (patch)
treebd026ce6c69e752153011030d380a1a2cdddbe41 /src/mbgl/algorithm
parentfce5dd5f6afd4864456197a5cfec20a5e8cd0e6a (diff)
downloadqtlocation-mapboxgl-4e5d0650000a51c3fb76b82d5d4447d74bd788f6.tar.gz
[core] load parents of missing tiles as optional
Diffstat (limited to 'src/mbgl/algorithm')
-rw-r--r--src/mbgl/algorithm/update_renderables.hpp30
1 files changed, 20 insertions, 10 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;
+ }
}
}
}