Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 10 additions & 0 deletions src/core/renderer/tiles/TilesRendererBase.js
Original file line number Diff line number Diff line change
Expand Up @@ -81,6 +81,16 @@ const optimizedPriorityCallback = ( a, b ) => {
// load internal tile sets first
return a.internal.hasUnrenderableContent ? 1 : - 1;

} else if ( a.traversal.kicked !== b.traversal.kicked ) {

// kicked means that a tile should be visible but isn't ready yet
return a.traversal.kicked ? 1 : - 1;

} else if ( a.traversal.coverage !== b.traversal.coverage ) {

// load tiles with less coverage first
return a.traversal.coverage < b.traversal.coverage ? 1 : - 1;

} else if ( a.traversal.distanceFromCamera !== b.traversal.distanceFromCamera ) {

// load closer tiles first
Expand Down
56 changes: 55 additions & 1 deletion src/core/renderer/tiles/optimizedTraverseFunctions.js
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,7 @@ function areChildrenProcessed( tile ) {
// Checks whether we can stop at this tile for rendering or not
function canUnconditionallyRefine( tile ) {

return tile.internal.hasUnrenderableContent || ( tile.parent && tile.parent.geometricError < tile.geometricError );
return tile.internal.hasUnrenderableContent || tile.geometricError > 1e90 || ( tile.parent && tile.parent.geometricError < tile.geometricError );

}

Expand All @@ -57,6 +57,8 @@ function resetFrameState( tile, renderer ) {
tile.traversal.allChildrenReady = false;
tile.traversal.kicked = false;
tile.traversal.allUsedChildrenProcessed = false;
tile.traversal.coverage = 0.0;
tile.traversal.visibleCoverage = 0.0;

// update tile frustum and error state
renderer.calculateTileViewError( tile, viewErrorTarget );
Expand Down Expand Up @@ -423,6 +425,7 @@ function toggleTiles( tile, renderer ) {
if ( tile.internal.loadingState !== LOADED ) {

tile.traversal.active = false;
tile.traversal.kicked = true;

}

Expand Down Expand Up @@ -495,10 +498,61 @@ function toggleTiles( tile, renderer ) {
tile.traversal.usedLastFrame = isUsed;

const children = tile.children;
let coverage = 0;
let coverageChildren = 0;
let visibleCoverageChildren = 0;
let visibleCoverage = 0;
for ( let i = 0, l = children.length; i < l; i ++ ) {

const c = children[ i ];
toggleTiles( c, renderer );
coverage += c.traversal?.coverage || 0;
coverageChildren ++;

if ( c.traversal?.inFrustum ) {

visibleCoverageChildren ++;
visibleCoverage += c.traversal?.visibleCoverage || 0;

}

}

// TODO: it may be more simple to keep non-content tiles marked as "active" and fire "setVisible" and "setActive"
// so plugins etc can react to empty tile visibility if desired
if ( tile.internal.hasContent && ! canUnconditionallyRefine( tile ) || tile.traversal.isLeaf ) {

if ( tile.internal.hasContent && ! isDownloadFinished( tile.internal.loadingState ) ) {

if ( tile.traversal.active ) {

tile.traversal.coverage = 0;
tile.traversal.visibleCoverage = 0;

} else {

tile.traversal.coverage = coverage / coverageChildren;
tile.traversal.visibleCoverage = visibleCoverage / visibleCoverageChildren;

}

} else {

tile.traversal.coverage = 1.0;
tile.traversal.visibleCoverage = tile.traversal.inFrustum ? 1.0 : 0.0;

}


} else if ( tile.refine === 'ADD' ) {

tile.traversal.coverage = 1.0;
tile.traversal.visibleCoverage = tile.traversal.inFrustum ? 1.0 : 0.0;

} else {

tile.traversal.coverage = coverage / coverageChildren || 0;
tile.traversal.visibleCoverage = visibleCoverage / visibleCoverageChildren || 0;

}

Expand Down
2 changes: 1 addition & 1 deletion src/core/renderer/tiles/traverseFunctions.js
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,7 @@ function areChildrenProcessed( tile ) {

function canUnconditionallyRefine( tile ) {

return tile.internal.hasUnrenderableContent || ( tile.parent && tile.parent.geometricError < tile.geometricError );
return tile.internal.hasUnrenderableContent || tile.geometricError > 1e90 || ( tile.parent && tile.parent.geometricError < tile.geometricError );

}

Expand Down
Loading