Skip to content

Commit 2cbe296

Browse files
authoredMay 19, 2023
Merge pull request #11296 from CesiumGS/terrain-availability
Terrain availability race condition
2 parents c60dd09 + fa78047 commit 2cbe296

File tree

5 files changed

+183
-0
lines changed

5 files changed

+183
-0
lines changed
 

‎CHANGES.md

+8
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,13 @@
11
# Change Log
22

3+
### 1.106 - 2023-06-01
4+
5+
#### @cesium/engine
6+
7+
##### Fixes :wrench:
8+
9+
- Fixed a race condition when loading cut-out terrain. [#11296](https://github.com/CesiumGS/cesium/pull/11296)
10+
311
### 1.105.2 - 2023-05-15
412

513
- This is an npm-only release to fix a dependency issue published in 1.105.1.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
{
2+
"tilejson": "2.1.0",
3+
"format" : "quantized-mesh-1.0",
4+
"version" : "1.0.0",
5+
"scheme" : "tms",
6+
"attribution" : "This amazing data is courtesy The Amazing Data Source!",
7+
"tiles" : [
8+
"{z}/{x}/{y}.terrain?v={version}"
9+
],
10+
"extensions": [
11+
"watermask",
12+
"metadata",
13+
"octvertexnormals"
14+
],
15+
"metadataAvailability": 10,
16+
"minzoom": 0,
17+
"maxzoom": 13,
18+
"available" : [
19+
[
20+
{
21+
"startX" : 0,
22+
"startY" : 0,
23+
"endX" : 1,
24+
"endY" : 0
25+
}
26+
],
27+
[
28+
{
29+
"startX" : 0,
30+
"startY" : 0,
31+
"endX" : 3,
32+
"endY" : 1
33+
}
34+
]
35+
]
36+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
{
2+
"tilejson": "2.1.0",
3+
"format" : "quantized-mesh-1.0",
4+
"version" : "1.0.0",
5+
"scheme" : "tms",
6+
"attribution" : "This is a child tileset!",
7+
"tiles" : [
8+
"{z}/{x}/{y}.terrain?v={version}"
9+
],
10+
"extensions" : [
11+
"watermask",
12+
"metadata",
13+
"octvertexnormals"
14+
],
15+
"metadataAvailability": 10,
16+
"minzoom": 0,
17+
"maxzoom": 13,
18+
"available" : [
19+
[
20+
{
21+
"startX" : 0,
22+
"startY" : 0,
23+
"endX" : 1,
24+
"endY" : 0
25+
}
26+
],
27+
[
28+
{
29+
"startX" : 0,
30+
"startY" : 0,
31+
"endX" : 2,
32+
"endY" : 1
33+
}
34+
]
35+
],
36+
"parentUrl": "./"
37+
}
38+

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

+25
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
@@ -915,9 +917,32 @@ CesiumTerrainProvider.prototype.requestTileGeometry = function (
915917
layerToUse = layer;
916918
break;
917919
}
920+
921+
const availabilityUnloaded = checkLayer(
922+
this,
923+
x,
924+
y,
925+
level,
926+
layer,
927+
i === 0
928+
);
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+
}
918936
}
919937
}
920938

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+
921946
return requestTileGeometry(this, x, y, level, layerToUse, request);
922947
};
923948

‎packages/engine/Specs/Core/CesiumTerrainProviderSpec.js

+76
Original file line numberDiff line numberDiff line change
@@ -133,6 +133,45 @@ describe("Core/CesiumTerrainProvider", function () {
133133
);
134134
}
135135

136+
function returnParentUrlTileJsonWithMetadataAvailability() {
137+
const paths = [
138+
"Data/CesiumTerrainTileJson/ParentUrlAvailability.tile.json",
139+
"Data/CesiumTerrainTileJson/ParentAvailability.tile.json",
140+
];
141+
let i = 0;
142+
const oldLoad = Resource._Implementations.loadWithXhr;
143+
Resource._Implementations.loadWithXhr = function (
144+
url,
145+
responseType,
146+
method,
147+
data,
148+
headers,
149+
deferred,
150+
overrideMimeType
151+
) {
152+
if (url.indexOf("layer.json") >= 0) {
153+
Resource._DefaultImplementations.loadWithXhr(
154+
paths[i++],
155+
responseType,
156+
method,
157+
data,
158+
headers,
159+
deferred
160+
);
161+
} else {
162+
return oldLoad(
163+
url,
164+
responseType,
165+
method,
166+
data,
167+
headers,
168+
deferred,
169+
overrideMimeType
170+
);
171+
}
172+
};
173+
}
174+
136175
async function waitForTile(level, x, y, requestNormals, requestWaterMask, f) {
137176
const terrainProvider = await CesiumTerrainProvider.fromUrl("made/up/url", {
138177
requestVertexNormals: requestNormals,
@@ -899,6 +938,43 @@ describe("Core/CesiumTerrainProvider", function () {
899938
expect(terrainProvider.availability.isTileAvailable(1, 0, 0)).toBe(true);
900939
});
901940

941+
it("provides QuantizedMeshTerrainData with multiple layers and with Metadata availability ", async function () {
942+
Resource._Implementations.loadWithXhr = function (
943+
url,
944+
responseType,
945+
method,
946+
data,
947+
headers,
948+
deferred,
949+
overrideMimeType
950+
) {
951+
Resource._DefaultImplementations.loadWithXhr(
952+
"Data/CesiumTerrainTileJson/tile.metadataavailability.terrain",
953+
responseType,
954+
method,
955+
data,
956+
headers,
957+
deferred
958+
);
959+
};
960+
961+
returnParentUrlTileJsonWithMetadataAvailability();
962+
963+
const terrainProvider = await CesiumTerrainProvider.fromUrl(
964+
"made/up/url"
965+
);
966+
967+
expect(terrainProvider.hasMetadata).toBe(true);
968+
const layers = terrainProvider._layers;
969+
expect(layers.length).toBe(2);
970+
971+
expect(terrainProvider.availability.isTileAvailable(1, 0, 0)).toBe(false);
972+
973+
const loadedData = await terrainProvider.requestTileGeometry(0, 0, 1);
974+
expect(loadedData).toBeInstanceOf(QuantizedMeshTerrainData);
975+
expect(terrainProvider.availability.isTileAvailable(1, 0, 0)).toBe(true);
976+
});
977+
902978
it("returns undefined if too many requests are already in progress", async function () {
903979
const baseUrl = "made/up/url";
904980

0 commit comments

Comments
 (0)
Please sign in to comment.