@@ -65,6 +65,11 @@ export class IfcStreamer extends OBC.Component implements OBC.Disposable {
6565 */
6666 useCache = true ;
6767
68+ /**
69+ * Flag to cancel the files that are being currently loaded.
70+ */
71+ cancel = false ;
72+
6873 fetch = async ( fileName : string ) : Promise < Response | File > => {
6974 return fetch ( this . url + fileName ) ;
7075 } ;
@@ -422,8 +427,28 @@ export class IfcStreamer extends OBC.Component implements OBC.Disposable {
422427 } ,
423428 visible = true ,
424429 ) {
430+ this . cancel = false ;
431+
432+ const cancelled : { [ modelID : string ] : Set < number > } = { } ;
433+ for ( const modelID in seen ) {
434+ const idsOfModel = new Set < number > ( ) ;
435+ for ( const [ , ids ] of seen [ modelID ] ) {
436+ for ( const id of ids ) {
437+ idsOfModel . add ( id ) ;
438+ }
439+ }
440+ cancelled [ modelID ] = idsOfModel ;
441+ }
442+
425443 for ( const modelID in seen ) {
426- if ( this . _isDisposing ) return ;
444+ if ( this . _isDisposing ) {
445+ return ;
446+ }
447+
448+ if ( this . cancel ) {
449+ this . cancelLoading ( cancelled ) ;
450+ return ;
451+ }
427452
428453 const fragments = this . components . get ( OBC . FragmentsManager ) ;
429454 const group = fragments . groups . get ( modelID ) ;
@@ -441,6 +466,11 @@ export class IfcStreamer extends OBC.Component implements OBC.Disposable {
441466
442467 for ( const [ priority , ids ] of seen [ modelID ] ) {
443468 for ( const id of ids ) {
469+ if ( this . cancel ) {
470+ this . cancelLoading ( cancelled ) ;
471+ return ;
472+ }
473+
444474 allIDs . add ( id ) ;
445475 const geometry = geometries [ id ] ;
446476 if ( ! geometry ) {
@@ -449,6 +479,7 @@ export class IfcStreamer extends OBC.Component implements OBC.Disposable {
449479 if ( geometry . geometryFile ) {
450480 const file = geometry . geometryFile ;
451481 const value = files . get ( file ) || 0 ;
482+ // This adds up the pixels of all fragments in a file to determine its priority
452483 files . set ( file , value + priority ) ;
453484 }
454485 }
@@ -497,7 +528,17 @@ export class IfcStreamer extends OBC.Component implements OBC.Disposable {
497528
498529 if ( result ) {
499530 for ( const [ geometryID , { position, index, normal } ] of result . data ) {
500- if ( this . _isDisposing ) return ;
531+ if ( this . _isDisposing ) {
532+ return ;
533+ }
534+
535+ if ( this . cancel ) {
536+ this . cancelLoading ( cancelled ) ;
537+ return ;
538+ }
539+
540+ // This fragment can be cancelled, it will be loaded
541+ cancelled [ modelID ] . delete ( geometryID ) ;
501542
502543 if ( ! allIDs . has ( geometryID ) ) continue ;
503544
@@ -759,4 +800,9 @@ export class IfcStreamer extends OBC.Component implements OBC.Disposable {
759800
760801 this . _isDisposing = false ;
761802 } ;
803+
804+ private cancelLoading ( items : { [ modelID : string ] : Set < number > } ) {
805+ this . cancel = false ;
806+ this . culler . cancel ( items ) ;
807+ }
762808}
0 commit comments