@@ -1222,23 +1222,25 @@ define([
1222
1222
1223
1223
///////////////////////////////////////////////////////////////////////////
1224
1224
1225
- function unloadSubtree ( tileset , tile ) {
1225
+ function destroySubtree ( tileset , tile ) {
1226
+ var root = tile ;
1226
1227
var stats = tileset . _statistics ;
1227
- var stack = [ ] ;
1228
+ var stack = scratchStack ;
1228
1229
stack . push ( tile ) ;
1229
1230
while ( stack . length > 0 ) {
1230
1231
tile = stack . pop ( ) ;
1231
- unloadTile ( tileset , tile ) ;
1232
1232
var children = tile . children ;
1233
1233
var length = children . length ;
1234
1234
for ( var i = 0 ; i < length ; ++ i ) {
1235
- var child = children [ i ] ;
1235
+ stack . push ( children [ i ] ) ;
1236
+ }
1237
+ if ( tile !== root ) {
1238
+ unloadTileFromCache ( tileset , tile ) ;
1239
+ tile . destroy ( ) ;
1236
1240
-- stats . numberTotal ;
1237
- stack . push ( child ) ;
1238
1241
}
1239
1242
}
1240
-
1241
- tile . children = [ ] ;
1243
+ root . children = [ ] ;
1242
1244
}
1243
1245
1244
1246
function isVisible ( visibilityPlaneMask ) {
@@ -1263,8 +1265,13 @@ define([
1263
1265
return ;
1264
1266
}
1265
1267
1266
- if ( expired && tile . hasTilesetContent ) {
1267
- unloadSubtree ( tileset , tile ) ;
1268
+ if ( expired ) {
1269
+ if ( tile . hasRenderableContent ) {
1270
+ decrementPointAndFeatureLoadCounts ( tileset , tile . content ) ;
1271
+ -- tileset . _statistics . numberContentReady ;
1272
+ } else if ( tile . hasTilesetContent ) {
1273
+ destroySubtree ( tileset , tile ) ;
1274
+ }
1268
1275
}
1269
1276
1270
1277
++ stats . numberOfPendingRequests ;
@@ -1591,6 +1598,7 @@ define([
1591
1598
tile . _sse = getScreenSpaceError ( tileset , tile . geometricError , tile , frameState ) ;
1592
1599
tile . selected = false ;
1593
1600
tile . _finalResolution = false ;
1601
+ tile . updateExpiration ( ) ;
1594
1602
touch ( tileset , tile , outOfCore ) ;
1595
1603
}
1596
1604
@@ -1623,7 +1631,12 @@ define([
1623
1631
var loadSiblings = tileset . loadSiblings ;
1624
1632
1625
1633
if ( tile . hasTilesetContent ) {
1626
- updateAndPushChildren ( tileset , tile , frameState , stack , loadSiblings , outOfCore ) ;
1634
+ if ( tile . contentExpired ) {
1635
+ // Request new content and destroy subtree
1636
+ loadTile ( tile ) ;
1637
+ } else {
1638
+ updateAndPushChildren ( tileset , tile , frameState , stack , loadSiblings , outOfCore ) ;
1639
+ }
1627
1640
} else {
1628
1641
if ( tile . refine === Cesium3DTileRefine . ADD ) {
1629
1642
loadAndAddToQueue ( tileset , tile , finalQueue ) ;
@@ -1751,12 +1764,17 @@ define([
1751
1764
// Remove from processing queue
1752
1765
tileset . _processingQueue . splice ( index , 1 ) ;
1753
1766
-- tileset . _statistics . numberProcessing ;
1767
+
1754
1768
if ( tile . hasRenderableContent ) {
1755
1769
// RESEARCH_IDEA: ability to unload tiles (without content) for an
1756
1770
// external tileset when all the tiles are unloaded.
1757
- ++ tileset . _statistics . numberContentReady ;
1758
1771
incrementPointAndFeatureLoadCounts ( tileset , tile . content ) ;
1759
- tile . replacementNode = tileset . _replacementList . add ( tile ) ;
1772
+ ++ tileset . _statistics . numberContentReady ;
1773
+
1774
+ // Add to the tile cache. Previously expired tiles are already in the cache.
1775
+ if ( ! defined ( tile . replacementNode ) ) {
1776
+ tile . replacementNode = tileset . _replacementList . add ( tile ) ;
1777
+ }
1760
1778
}
1761
1779
} else {
1762
1780
// Not in processing queue
@@ -1981,8 +1999,9 @@ define([
1981
1999
}
1982
2000
}
1983
2001
1984
- function unloadTile ( tileset , tile ) {
1985
- if ( ! tile . hasRenderableContent ) {
2002
+ function unloadTileFromCache ( tileset , tile ) {
2003
+ var node = tile . replacementNode ;
2004
+ if ( ! defined ( node ) ) {
1986
2005
return ;
1987
2006
}
1988
2007
@@ -1991,13 +2010,12 @@ define([
1991
2010
var tileUnload = tileset . tileUnload ;
1992
2011
1993
2012
tileUnload . raiseEvent ( tile ) ;
1994
- replacementList . remove ( tile . replacementNode ) ;
2013
+ replacementList . remove ( node ) ;
1995
2014
decrementPointAndFeatureLoadCounts ( tileset , tile . content ) ;
1996
2015
-- stats . numberContentReady ;
1997
- tile . unloadContent ( ) ;
1998
2016
}
1999
2017
2000
- function unloadTiles ( tileset , frameState ) {
2018
+ function unloadTiles ( tileset ) {
2001
2019
var trimTiles = tileset . _trimTiles ;
2002
2020
tileset . _trimTiles = false ;
2003
2021
@@ -2013,7 +2031,8 @@ define([
2013
2031
while ( ( node !== sentinel ) && ( ( replacementList . length > maximumNumberOfLoadedTiles ) || trimTiles ) ) {
2014
2032
var tile = node . item ;
2015
2033
node = node . next ;
2016
- unloadTile ( tileset , tile ) ;
2034
+ unloadTileFromCache ( tileset , tile ) ;
2035
+ tile . unloadContent ( ) ;
2017
2036
}
2018
2037
}
2019
2038
@@ -2100,7 +2119,7 @@ define([
2100
2119
updateTiles ( this , frameState ) ;
2101
2120
2102
2121
if ( outOfCore ) {
2103
- unloadTiles ( this , frameState ) ;
2122
+ unloadTiles ( this ) ;
2104
2123
}
2105
2124
2106
2125
// Events are raised (added to the afterRender queue) here since promises
0 commit comments