Skip to content

Commit 0c69d1b

Browse files
committedMay 18, 2023
Return the correct promise
1 parent b35ac36 commit 0c69d1b

File tree

2 files changed

+37
-40
lines changed

2 files changed

+37
-40
lines changed
 

‎packages/engine/Source/Core/CesiumTerrainProvider.js

+21-24
Original file line numberDiff line numberDiff line change
@@ -901,6 +901,8 @@ CesiumTerrainProvider.prototype.requestTileGeometry = function (
901901
const layers = this._layers;
902902
let layerToUse;
903903
const layerCount = layers.length;
904+
let unknownAvailability = false;
905+
let availabilityPromise = Promise.resolve();
904906

905907
if (layerCount === 1) {
906908
// Optimized path for single layers
@@ -916,36 +918,31 @@ CesiumTerrainProvider.prototype.requestTileGeometry = function (
916918
break;
917919
}
918920

919-
if (!defined(layer.availabilityLevels)) {
920-
// This layer doesn't use cutout terrain, so we don't need to do the following check
921-
continue;
922-
}
923-
924-
const tile = getAvailabilityTile(layer, x, y, level);
925-
if (
926-
!defined(tile) ||
927-
!layer.availability.isTileAvailable(tile.level, tile.x, tile.y) ||
928-
layer.availabilityTilesLoaded.isTileAvailable(
929-
tile.level,
930-
tile.x,
931-
tile.y
932-
)
933-
) {
934-
continue;
935-
}
936-
937-
// There are some cases where availability tiles are not completely loaded at this point. Request them now.
938-
return requestTileGeometry(
921+
const availabilityUnloaded = checkLayer(
939922
this,
940-
tile.x,
941-
tile.y,
942-
tile.level,
923+
x,
924+
y,
925+
level,
943926
layer,
944-
request
927+
i === 0
945928
);
929+
if (availabilityUnloaded.result) {
930+
// We can't know yet since the availability is not yet loaded
931+
unknownAvailability = true;
932+
availabilityPromise = availabilityPromise.then(
933+
() => availabilityUnloaded.promise
934+
);
935+
}
946936
}
947937
}
948938

939+
if (!defined(layerToUse) && unknownAvailability) {
940+
// Try again when availability data is ready– Otherwise the tile will be marked as failed and never re-requested
941+
return availabilityPromise.then(() =>
942+
this.requestTileGeometry(x, y, level, request)
943+
);
944+
}
945+
949946
return requestTileGeometry(this, x, y, level, layerToUse, request);
950947
};
951948

‎packages/engine/Source/Core/TileAvailability.js

+16-16
Original file line numberDiff line numberDiff line change
@@ -396,10 +396,10 @@ function findMaxLevelFromNode(stopNode, node, position) {
396396
// Find the deepest quadtree node containing this point.
397397
let found = false;
398398
while (!found) {
399-
const nw = node.nw && rectangleContainsPosition(node.nw.extent, position);
400-
const ne = node.ne && rectangleContainsPosition(node.ne.extent, position);
401-
const sw = node.sw && rectangleContainsPosition(node.sw.extent, position);
402-
const se = node.se && rectangleContainsPosition(node.se.extent, position);
399+
const nw = node._nw && rectangleContainsPosition(node._nw.extent, position);
400+
const ne = node._ne && rectangleContainsPosition(node._ne.extent, position);
401+
const sw = node._sw && rectangleContainsPosition(node._sw.extent, position);
402+
const se = node._se && rectangleContainsPosition(node._se.extent, position);
403403

404404
// The common scenario is that the point is in only one quadrant and we can simply
405405
// iterate down the tree. But if the point is on a boundary between tiles, it is
@@ -408,36 +408,36 @@ function findMaxLevelFromNode(stopNode, node, position) {
408408
if (nw) {
409409
maxLevel = Math.max(
410410
maxLevel,
411-
findMaxLevelFromNode(node, node.nw, position)
411+
findMaxLevelFromNode(node, node._nw, position)
412412
);
413413
}
414414
if (ne) {
415415
maxLevel = Math.max(
416416
maxLevel,
417-
findMaxLevelFromNode(node, node.ne, position)
417+
findMaxLevelFromNode(node, node._ne, position)
418418
);
419419
}
420420
if (sw) {
421421
maxLevel = Math.max(
422422
maxLevel,
423-
findMaxLevelFromNode(node, node.sw, position)
423+
findMaxLevelFromNode(node, node._sw, position)
424424
);
425425
}
426426
if (se) {
427427
maxLevel = Math.max(
428428
maxLevel,
429-
findMaxLevelFromNode(node, node.se, position)
429+
findMaxLevelFromNode(node, node._se, position)
430430
);
431431
}
432432
break;
433433
} else if (nw) {
434-
node = node.nw;
434+
node = node._nw;
435435
} else if (ne) {
436-
node = node.ne;
436+
node = node._ne;
437437
} else if (sw) {
438-
node = node.sw;
438+
node = node._sw;
439439
} else if (se) {
440-
node = node.se;
440+
node = node._se;
441441
} else {
442442
found = true;
443443
}
@@ -501,10 +501,10 @@ function updateCoverageWithNode(
501501
}
502502

503503
// Update with child nodes.
504-
updateCoverageWithNode(remainingToCoverByLevel, node.nw, rectanglesToCover);
505-
updateCoverageWithNode(remainingToCoverByLevel, node.ne, rectanglesToCover);
506-
updateCoverageWithNode(remainingToCoverByLevel, node.sw, rectanglesToCover);
507-
updateCoverageWithNode(remainingToCoverByLevel, node.se, rectanglesToCover);
504+
updateCoverageWithNode(remainingToCoverByLevel, node._nw, rectanglesToCover);
505+
updateCoverageWithNode(remainingToCoverByLevel, node._ne, rectanglesToCover);
506+
updateCoverageWithNode(remainingToCoverByLevel, node._sw, rectanglesToCover);
507+
updateCoverageWithNode(remainingToCoverByLevel, node._se, rectanglesToCover);
508508
}
509509

510510
function subtractRectangle(rectangleList, rectangleToSubtract) {

0 commit comments

Comments
 (0)
Please sign in to comment.