@@ -20,21 +20,22 @@ import PointsMaterial, {
2020 PNTS_SIZE_MODE ,
2121 ClassificationScheme ,
2222} from 'Renderer/PointsMaterial' ;
23+ import { VIEW_EVENTS } from 'Core/View' ;
2324
2425const _raycaster = new THREE . Raycaster ( ) ;
2526
27+ // Stores lruCache, downloadQueue and parseQueue for each id of view {@link View}
28+ // every time a tileset has been added
29+ // https://github.com/iTowns/itowns/issues/2426
30+ const viewers = { } ;
31+
2632// Internal instance of GLTFLoader, passed to 3d-tiles-renderer-js to support GLTF 1.0 and 2.0
2733// Temporary exported to be used in deprecated B3dmParser
2834export const itownsGLTFLoader = new iGLTFLoader ( ) ;
2935itownsGLTFLoader . register ( ( ) => new GLTFMeshFeaturesExtension ( ) ) ;
3036itownsGLTFLoader . register ( ( ) => new GLTFStructuralMetadataExtension ( ) ) ;
3137itownsGLTFLoader . register ( ( ) => new GLTFCesiumRTCExtension ( ) ) ;
3238
33- // Instantiated by the first tileset. Used to share cache and download and parse queues between tilesets
34- let lruCache = null ;
35- let downloadQueue = null ;
36- let parseQueue = null ;
37-
3839export const OGC3DTILES_LAYER_EVENTS = {
3940 /**
4041 * Fired when a new root or child tile set is loaded
@@ -171,9 +172,6 @@ class OGC3DTilesLayer extends GeometryLayer {
171172
172173 this . tilesRenderer . manager . addHandler ( / \. g l t f $ / , itownsGLTFLoader ) ;
173174
174- this . _setupCacheAndQueues ( ) ;
175- this . _setupEvents ( ) ;
176-
177175 this . object3d . add ( this . tilesRenderer . group ) ;
178176
179177 // Add an initialization step that is resolved when the root tileset is loaded (see this._setup below), meaning
@@ -209,25 +207,28 @@ class OGC3DTilesLayer extends GeometryLayer {
209207 this . pntsMaxAttenuatedSize = config . pntsMaxAttenuatedSize || 10 ;
210208 }
211209
210+
212211 /**
213- * Sets the lruCache and download and parse queues so they are shared amongst all tilesets.
212+ * Sets the lruCache and download and parse queues so they are shared amongst
213+ * all tilesets from a same {@link View} view.
214+ * @param {View } view - view associated to this layer.
214215 * @private
215216 */
216- _setupCacheAndQueues ( ) {
217- if ( lruCache === null ) {
218- lruCache = this . tilesRenderer . lruCache ;
219- } else {
220- this . tilesRenderer . lruCache = lruCache ;
221- }
222- if ( downloadQueue === null ) {
223- downloadQueue = this . tilesRenderer . downloadQueue ;
217+ _setupCacheAndQueues ( view ) {
218+ const id = view . id ;
219+ if ( viewers [ id ] ) {
220+ this . tilesRenderer . lruCache = viewers [ id ] . lruCache ;
221+ this . tilesRenderer . downloadQueue = viewers [ id ] . downloadQueue ;
222+ this . tilesRenderer . parseQueue = viewers [ id ] . parseQueue ;
224223 } else {
225- this . tilesRenderer . downloadQueue = downloadQueue ;
226- }
227- if ( parseQueue === null ) {
228- parseQueue = this . tilesRenderer . parseQueue ;
229- } else {
230- this . tilesRenderer . parseQueue = parseQueue ;
224+ viewers [ id ] = {
225+ lruCache : this . tilesRenderer . lruCache ,
226+ downloadQueue : this . tilesRenderer . downloadQueue ,
227+ parseQueue : this . tilesRenderer . parseQueue ,
228+ } ;
229+ view . addEventListener ( VIEW_EVENTS . DISPOSED , ( evt ) => {
230+ delete viewers [ evt . target . id ] ;
231+ } ) ;
231232 }
232233 }
233234
@@ -268,6 +269,12 @@ class OGC3DTilesLayer extends GeometryLayer {
268269 } ) ;
269270 view . notifyChange ( this ) ;
270271 } ) ;
272+
273+
274+ this . _setupCacheAndQueues ( view ) ;
275+ this . _setupEvents ( ) ;
276+
277+
271278 // Start loading tileset and tiles
272279 this . tilesRenderer . update ( ) ;
273280 }
0 commit comments