diff --git a/example/three/index.js b/example/three/index.js index c61d7deff..a2dcbe2d1 100644 --- a/example/three/index.js +++ b/example/three/index.js @@ -56,6 +56,8 @@ const params = { errorTarget: 6, maxDepth: 15, + loadSiblings: true, + loadAncestors: true, displayActiveTiles: false, resolutionScale: 1.0, @@ -270,7 +272,9 @@ function init() { const tileOptions = gui.addFolder( 'Tiles Options' ); tileOptions.add( params, 'displayActiveTiles' ); tileOptions.add( params, 'errorTarget' ).min( 0 ).max( 50 ); - tileOptions.add( params, 'maxDepth' ).min( 1 ).max( 100 ); + tileOptions.add( params, 'maxDepth' ).min( 1 ).max( 100 ).step( 1 ); + tileOptions.add( params, 'loadAncestors' ); + tileOptions.add( params, 'loadSiblings' ); tileOptions.add( params, 'up', [ '+Y', '+Z', '-Z' ] ); tileOptions.open(); @@ -460,6 +464,8 @@ function animate() { tiles.errorTarget = params.errorTarget; tiles.displayActiveTiles = params.displayActiveTiles; tiles.maxDepth = params.maxDepth; + tiles.loadAncestors = params.loadAncestors; + tiles.loadSiblings = params.loadSiblings; // update plugin const plugin = tiles.getPluginByName( 'DEBUG_TILES_PLUGIN' ); diff --git a/src/core/renderer/tiles/TilesRendererBase.js b/src/core/renderer/tiles/TilesRendererBase.js index 7b00a89ac..2a93409ff 100644 --- a/src/core/renderer/tiles/TilesRendererBase.js +++ b/src/core/renderer/tiles/TilesRendererBase.js @@ -405,8 +405,13 @@ export class TilesRendererBase { set optimizedLoadStrategy( v ) { - console.warn( 'TilesRenderer: "optimizedLoadStrategy" has been deprecated. Please toggle "loadAncestors" to adjust the tile load behavior.' ); - this._optimizedLoadStrategy = v; + if ( v !== this._optimizedLoadStrategy ) { + + console.warn( 'TilesRenderer: "optimizedLoadStrategy" has been deprecated. Please toggle "loadAncestors" to adjust the tile load behavior.' ); + this._optimizedLoadStrategy = v; + + } + } @@ -1319,6 +1324,13 @@ export class TilesRendererBase { } + setEmptyTileVisible( tile, visible ) { + + // callback specifically for indicating whether an "empty", non geometry tile is visible. Ued specifically + // for the DebugTilesPlugin to show intermediate parent tiles. + + } + setTileVisible( tile, visible ) { visible ? this.visibleTiles.add( tile ) : this.visibleTiles.delete( tile ); diff --git a/src/core/renderer/tiles/optimizedTraverseFunctions.js b/src/core/renderer/tiles/optimizedTraverseFunctions.js index 4a9713c54..d32a55876 100644 --- a/src/core/renderer/tiles/optimizedTraverseFunctions.js +++ b/src/core/renderer/tiles/optimizedTraverseFunctions.js @@ -463,10 +463,6 @@ function toggleTiles( tile, renderer ) { } - } else { - - tile.traversal.active = false; - } // when loading parent tiles as fallbacks, keep all used tiles downloaded @@ -487,7 +483,7 @@ function toggleTiles( tile, renderer ) { } // if the tile is loaded and in frustum we can mark it as visible - tile.traversal.visible = tile.internal.hasRenderableContent && tile.traversal.active && tile.traversal.inFrustum && tile.internal.loadingState === LOADED; + tile.traversal.visible = tile.traversal.active && tile.traversal.inFrustum && ( ! tile.internal.hasRenderableContent || tile.internal.loadingState === LOADED ); renderer.stats.used ++; if ( tile.traversal.inFrustum ) { @@ -498,7 +494,7 @@ function toggleTiles( tile, renderer ) { } - if ( isUsed || isProcessed( tile ) && tile.traversal?.usedLastFrame ) { + if ( isUsed || isProcessed( tile ) && tile.traversal.usedLastFrame ) { let setActive = false; let setVisible = false; @@ -552,6 +548,15 @@ function toggleTiles( tile, renderer ) { } + } else if ( ! tile.internal.hasRenderableContent ) { + + // Empty tiles are not tracked in activeTiles so setTileActive is not called here. + if ( tile.traversal.wasSetVisible !== setVisible ) { + + renderer.invokeOnePlugin( plugin => plugin.setEmptyTileVisible && plugin.setEmptyTileVisible( tile, setVisible ) ); + + } + } tile.traversal.wasSetActive = setActive; diff --git a/src/core/renderer/tiles/traverseFunctions.js b/src/core/renderer/tiles/traverseFunctions.js index 8283d815b..9259de57d 100644 --- a/src/core/renderer/tiles/traverseFunctions.js +++ b/src/core/renderer/tiles/traverseFunctions.js @@ -339,6 +339,16 @@ function markVisibleTiles( tile, renderer ) { tile.traversal.active = true; stats.active ++; + } else if ( ! tile.internal.hasRenderableContent ) { + + if ( tile.traversal.inFrustum ) { + + tile.traversal.visible = true; + + } + + tile.traversal.active = true; + } else if ( tile.internal.hasContent ) { renderer.queueTileForDownload( tile ); @@ -463,6 +473,14 @@ function toggleTiles( tile, renderer ) { } + } else if ( ! tile.internal.hasRenderableContent ) { + + if ( tile.traversal.wasSetVisible !== setVisible ) { + + renderer.invokeOnePlugin( plugin => plugin.setEmptyTileVisible && plugin.setEmptyTileVisible( tile, setVisible ) ); + + } + } tile.traversal.wasSetActive = setActive; diff --git a/src/three/plugins/DebugTilesPlugin.js b/src/three/plugins/DebugTilesPlugin.js index 31012de8f..75b607de0 100644 --- a/src/three/plugins/DebugTilesPlugin.js +++ b/src/three/plugins/DebugTilesPlugin.js @@ -325,7 +325,7 @@ export class DebugTilesPlugin { }; - this._onTileVisibilityChangeCB = ( { scene, tile, visible } ) => { + this._onTileVisibilityChangeCB = ( { tile, visible } ) => { this._onTileVisibilityChange( tile, visible ); @@ -722,6 +722,12 @@ export class DebugTilesPlugin { } + setEmptyTileVisible( tile, visible ) { + + this._onTileVisibilityChange( tile, visible ); + + } + _onTileVisibilityChange( tile, visible ) { if ( this.displayParentBounds ) { diff --git a/src/three/plugins/TileFlatteningPlugin.js b/src/three/plugins/TileFlatteningPlugin.js index e7b4eb5ab..0675a5332 100644 --- a/src/three/plugins/TileFlatteningPlugin.js +++ b/src/three/plugins/TileFlatteningPlugin.js @@ -223,7 +223,6 @@ export class TileFlatteningPlugin { } ); - this.tiles.dispatchEvent( { type: 'needs-render' } ); }