Skip to content

Commit 5e0cce6

Browse files
authored
Merge pull request #8996 from CesiumGS/fix-empty-traversal
Fix tile refinement when leaf is empty
2 parents 2422b6b + e047077 commit 5e0cce6

File tree

3 files changed

+40
-5
lines changed

3 files changed

+40
-5
lines changed

CHANGES.md

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

3+
### 1.72 - 2020-08-03
4+
5+
##### Fixes :wrench:
6+
7+
- Fixed 3D Tileset replacement refinement when leaf is empty. [#8996](https://github.com/CesiumGS/cesium/8996)
8+
39
### 1.71 - 2020-07-01
410

511
##### Breaking Changes :mega:

Source/Scene/Cesium3DTilesetTraversal.js

+8-5
Original file line numberDiff line numberDiff line change
@@ -652,11 +652,14 @@ function executeEmptyTraversal(tileset, root, frameState) {
652652
var childrenLength = children.length;
653653

654654
// Only traverse if the tile is empty - traversal stop at descendants with content
655-
var traverse = hasEmptyContent(tile) && canTraverse(tileset, tile);
656-
657-
// Traversal stops but the tile does not have content yet.
658-
// There will be holes if the parent tries to refine to its children, so don't refine.
659-
if (!traverse && !tile.contentAvailable) {
655+
var emptyContent = hasEmptyContent(tile);
656+
var traverse = emptyContent && canTraverse(tileset, tile);
657+
var emptyLeaf = emptyContent && tile.children.length === 0;
658+
659+
// Traversal stops but the tile does not have content yet
660+
// There will be holes if the parent tries to refine to its children, so don't refine
661+
// One exception: a parent may refine even if one of its descendants is an empty leaf
662+
if (!traverse && !tile.contentAvailable && !emptyLeaf) {
660663
allDescendantsLoaded = false;
661664
}
662665

Specs/Scene/Cesium3DTilesetSpec.js

+26
Original file line numberDiff line numberDiff line change
@@ -1411,6 +1411,32 @@ describe(
14111411
});
14121412
});
14131413

1414+
it("replacement refinement - refines if descendant is empty leaf tile", function () {
1415+
// Check that the root is refinable once its children with content are loaded
1416+
//
1417+
// C
1418+
// C C C E
1419+
//
1420+
viewAllTiles();
1421+
var originalLoadJson = Cesium3DTileset.loadJson;
1422+
spyOn(Cesium3DTileset, "loadJson").and.callFake(function (tilesetUrl) {
1423+
return originalLoadJson(tilesetUrl).then(function (tilesetJson) {
1424+
tilesetJson.root.refine = "REPLACE";
1425+
tilesetJson.root.children[3].content = undefined;
1426+
return tilesetJson;
1427+
});
1428+
});
1429+
1430+
return Cesium3DTilesTester.loadTileset(scene, tilesetUrl).then(function (
1431+
tileset
1432+
) {
1433+
tileset.skipLevelOfDetail = false;
1434+
var statistics = tileset._statistics;
1435+
scene.renderForSpecs();
1436+
expect(statistics.numberOfCommands).toEqual(3);
1437+
});
1438+
});
1439+
14141440
it("replacement and additive refinement", function () {
14151441
// A
14161442
// A R (not rendered)

0 commit comments

Comments
 (0)