@@ -40,9 +40,16 @@ function onTileVisibilityChange( scene, tile, visible ) {
4040
4141}
4242
43- function onLoadModel ( scene ) {
43+ function onLoadModel ( scene , tile ) {
4444
4545 this . _fadeManager . prepareObject ( scene ) ;
46+ this . _tileMap . add ( scene , tile ) ;
47+
48+ }
49+
50+ function onDisposeModel ( scene ) {
51+
52+ this . _fadeManager . deleteObject ( scene ) ;
4653
4754}
4855
@@ -53,62 +60,6 @@ function onFadeComplete( object ) {
5360
5461 this . _fadeGroup . remove ( object ) ;
5562
56- // TODO: this is basically duplicating all disposal logic from TilesRenderer disposeTile. Would be best to not duplicate this.
57- if ( this . disposeSet . has ( object ) ) {
58-
59- const info = this . disposeSet . get ( object ) ;
60- const materials = info . materials ;
61- const geometry = info . geometry ;
62- const textures = info . textures ;
63- const parent = info . scene . parent ;
64- const tile = info . tile ;
65-
66- for ( let i = 0 , l = geometry . length ; i < l ; i ++ ) {
67-
68- geometry [ i ] . dispose ( ) ;
69-
70- }
71-
72- for ( let i = 0 , l = materials . length ; i < l ; i ++ ) {
73-
74- materials [ i ] . dispose ( ) ;
75-
76- }
77-
78- for ( let i = 0 , l = textures . length ; i < l ; i ++ ) {
79-
80- const texture = textures [ i ] ;
81-
82- if ( texture . image instanceof ImageBitmap ) {
83-
84- texture . image . close ( ) ;
85-
86- }
87-
88- texture . dispose ( ) ;
89-
90- }
91-
92- if ( parent ) {
93-
94- parent . remove ( info . scene ) ;
95-
96- }
97-
98- this . dispatchEvent ( {
99- type : 'dispose-model' ,
100- scene : info . scene ,
101- tile,
102- } ) ;
103-
104- if ( this . onDisposeModel ) {
105-
106- this . onDisposeModel ( info . scene , tile ) ;
107-
108- }
109-
110- }
111-
11263 }
11364
11465}
@@ -150,28 +101,30 @@ export const FadeTilesRendererMixin = base => class extends base {
150101
151102 this . _fadeManager = fadeManager ;
152103 this . _fadeGroup = fadeGroup ;
104+ this . _tileMap = new Map ( ) ;
153105
154- this . addEventListener ( 'load-model' , e => onLoadModel . call ( this , e . scene ) ) ;
106+ this . addEventListener ( 'load-model' , e => onLoadModel . call ( this , e . scene , e . tile ) ) ;
107+ this . addEventListener ( 'dispose-model' , e => onDisposeModel . call ( this , e . scene ) ) ;
155108 this . addEventListener ( 'tile-visibility-change' , e => onTileVisibilityChange . call ( this , e . scene , e . tile , e . visible ) ) ;
156109
157110 this . initialLayerRendered = false ;
158111 this . prevCameraTransforms = new Map ( ) ;
159- this . disposeSet = new Map ( ) ;
160112
161113 }
162114
163115 update ( ...args ) {
164116
165117 const displayActiveTiles = this . displayActiveTiles ;
118+ const fadeManager = this . _fadeManager ;
166119 this . displayActiveTiles = true ;
167120
168121 // update the tiles
169- const fadingBefore = this . _fadeManager . fadeCount ;
122+ const fadingBefore = fadeManager . fadeCount ;
170123
171124 super . update ( ...args ) ;
172- this . _fadeManager . update ( ) ;
125+ fadeManager . update ( ) ;
173126
174- const fadingAfter = this . _fadeManager . fadeCount ;
127+ const fadingAfter = fadeManager . fadeCount ;
175128 if ( fadingBefore !== 0 && fadingAfter !== 0 ) {
176129
177130 this . dispatchEvent ( { type : 'fade-change' } ) ;
@@ -243,6 +196,13 @@ export const FadeTilesRendererMixin = base => class extends base {
243196
244197 } ) ;
245198
199+ const lruCache = this . lruCache ;
200+ const tileMap = this . _tileMap ;
201+ fadeManager . forEachObject ( scene => {
202+
203+ lruCache . markUsed ( tileMap . get ( scene ) ) ;
204+
205+ } ) ;
246206
247207 }
248208
@@ -253,47 +213,6 @@ export const FadeTilesRendererMixin = base => class extends base {
253213
254214 }
255215
256- disposeTile ( tile ) {
257-
258- // When a tile is disposed we keep it around if it's currently fading out and mark it for disposal later
259- const scene = tile . cached . scene ;
260- if ( scene && scene . parent === this . _fadeGroup ) {
261-
262- const cached = tile . cached ;
263- this . disposeSet . set ( scene , { tile, ...cached } ) ;
264-
265- // TODO: duplicating logic from TilesRenderer disposeTile
266- cached . scene = null ;
267- cached . materials = null ;
268- cached . textures = null ;
269- cached . geometry = null ;
270- cached . metadata = null ;
271-
272- this . activeTiles . delete ( tile ) ;
273- this . visibleTiles . delete ( tile ) ;
274- tile . _loadIndex ++ ;
275-
276- } else {
277-
278- super . disposeTile ( tile ) ;
279- this . _fadeManager . deleteObject ( scene ) ;
280-
281- }
282-
283- }
284-
285- dispose ( ) {
286-
287- super . dispose ( ) ;
288-
289- this . disposeSet . forEach ( object => {
290-
291- onFadeComplete . call ( this , object ) ;
292-
293- } ) ;
294-
295- }
296-
297216} ;
298217
299218export const FadeTilesRenderer = FadeTilesRendererMixin ( TilesRenderer ) ;
0 commit comments