From d50f6f439540ff97d2597e753a807a8b1870f61f Mon Sep 17 00:00:00 2001 From: Sean Lilley Date: Sat, 27 Jun 2020 21:48:55 -0400 Subject: [PATCH 1/4] Refine if descendant is empty leaf --- Source/Scene/Cesium3DTilesetTraversal.js | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/Source/Scene/Cesium3DTilesetTraversal.js b/Source/Scene/Cesium3DTilesetTraversal.js index 4e022ba775d..0fb54521e77 100644 --- a/Source/Scene/Cesium3DTilesetTraversal.js +++ b/Source/Scene/Cesium3DTilesetTraversal.js @@ -652,11 +652,14 @@ function executeEmptyTraversal(tileset, root, frameState) { var childrenLength = children.length; // Only traverse if the tile is empty - traversal stop at descendants with content - var traverse = hasEmptyContent(tile) && canTraverse(tileset, tile); - - // Traversal stops but the tile does not have content yet. - // There will be holes if the parent tries to refine to its children, so don't refine. - if (!traverse && !tile.contentAvailable) { + var emptyContent = hasEmptyContent(tile); + var traverse = emptyContent && canTraverse(tileset, tile); + var emptyLeaf = emptyContent && tile.children.length === 0; + + // Traversal stops but the tile does not have content yet + // There will be holes if the parent tries to refine to its children, so don't refine + // One exception: a parent may refine even if one of its descendants is an empty leaf + if (!traverse && !tile.contentAvailable && !emptyLeaf) { allDescendantsLoaded = false; } From 2794ecb5116894d8ecd7aee9b7d309ac5c60e6ac Mon Sep 17 00:00:00 2001 From: Sean Lilley Date: Sat, 27 Jun 2020 22:15:05 -0400 Subject: [PATCH 2/4] Added test --- Specs/Scene/Cesium3DTilesetSpec.js | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/Specs/Scene/Cesium3DTilesetSpec.js b/Specs/Scene/Cesium3DTilesetSpec.js index cb1ac36aade..e30353ec083 100644 --- a/Specs/Scene/Cesium3DTilesetSpec.js +++ b/Specs/Scene/Cesium3DTilesetSpec.js @@ -1410,6 +1410,32 @@ describe( }); }); + it("replacement refinement - refines if descendant is empty leaf tile", function () { + // Check that the root is refinable once its child is loaded + // + // C + // C C C E + // + viewAllTiles(); + var originalLoadJson = Cesium3DTileset.loadJson; + spyOn(Cesium3DTileset, "loadJson").and.callFake(function (tilesetUrl) { + return originalLoadJson(tilesetUrl).then(function (tilesetJson) { + tilesetJson.root.refine = "REPLACE"; + tilesetJson.root.children[3].content = undefined; + return tilesetJson; + }); + }); + + return Cesium3DTilesTester.loadTileset(scene, tilesetUrl).then(function ( + tileset + ) { + tileset.skipLevelOfDetail = false; + var statistics = tileset._statistics; + scene.renderForSpecs(); + expect(statistics.numberOfCommands).toEqual(3); + }); + }); + it("replacement and additive refinement", function () { // A // A R (not rendered) From 4be0a5ac6452632d89f9efe3ee7a277c741b21f3 Mon Sep 17 00:00:00 2001 From: Sean Lilley Date: Sat, 27 Jun 2020 22:16:58 -0400 Subject: [PATCH 3/4] Update CHANGES.md --- CHANGES.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGES.md b/CHANGES.md index 229addeb695..690a61d5423 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -21,6 +21,7 @@ - Fixed a bug where certain rhumb arc polylines would lead to a crash. [#8787](https://github.com/CesiumGS/cesium/pull/8787) - Fixed handling of Label's backgroundColor and backgroundPadding option [#8949](https://github.com/CesiumGS/cesium/8949) - Fixed several bugs when rendering CesiumJS in a WebG 2 context. [#797](https://github.com/CesiumGS/cesium/issues/797) +- Fixed 3D Tileset replacement refinement when leaf is empty. [#8996](https://github.com/CesiumGS/cesium/8996) ### 1.70.1 - 2020-06-10 From f4ced37bd3f5dd1d35055d1eec885d22ea1c5a61 Mon Sep 17 00:00:00 2001 From: Sean Lilley Date: Sat, 27 Jun 2020 22:18:16 -0400 Subject: [PATCH 4/4] Tweak comment --- Specs/Scene/Cesium3DTilesetSpec.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Specs/Scene/Cesium3DTilesetSpec.js b/Specs/Scene/Cesium3DTilesetSpec.js index e30353ec083..63e0395c286 100644 --- a/Specs/Scene/Cesium3DTilesetSpec.js +++ b/Specs/Scene/Cesium3DTilesetSpec.js @@ -1411,7 +1411,7 @@ describe( }); it("replacement refinement - refines if descendant is empty leaf tile", function () { - // Check that the root is refinable once its child is loaded + // Check that the root is refinable once its children with content are loaded // // C // C C C E