@@ -164,28 +164,13 @@ class Textures extends DataMap {
164164
165165			// dispose 
166166
167- 			const   onDispose  =  ( )  =>  { 
167+ 			renderTargetData . onDispose  =  ( )  =>  { 
168168
169- 				renderTarget . removeEventListener (  'dispose' ,  onDispose  ) ; 
170- 
171- 				for  (  let  i  =  0 ;  i  <  textures . length ;  i  ++  )  { 
172- 
173- 					this . _destroyTexture (  textures [  i  ]  ) ; 
174- 
175- 				} 
176- 
177- 				if  (  depthTexture  )  { 
178- 
179- 					this . _destroyTexture (  depthTexture  ) ; 
180- 
181- 				} 
182- 
183- 				this . delete (  renderTarget  ) ; 
184- 				this . backend . delete (  renderTarget  ) ; 
169+ 				this . _destroyRenderTarget (  renderTarget  ) ; 
185170
186171			} ; 
187172
188- 			renderTarget . addEventListener (  'dispose' ,  onDispose  ) ; 
173+ 			renderTarget . addEventListener (  'dispose' ,  renderTargetData . onDispose  ) ; 
189174
190175		} 
191176
@@ -348,15 +333,13 @@ class Textures extends DataMap {
348333
349334			// dispose 
350335
351- 			const  onDispose  =  ( )  =>  { 
352- 
353- 				texture . removeEventListener (  'dispose' ,  onDispose  ) ; 
336+ 			textureData . onDispose  =  ( )  =>  { 
354337
355338				this . _destroyTexture (  texture  ) ; 
356339
357340			} ; 
358341
359- 			texture . addEventListener (  'dispose' ,  onDispose  ) ; 
342+ 			texture . addEventListener (  'dispose' ,  textureData . onDispose  ) ; 
360343
361344		} 
362345
@@ -484,6 +467,46 @@ class Textures extends DataMap {
484467
485468	} 
486469
470+ 	/** 
471+ 	 * Frees internal resources when the given render target isn't 
472+ 	 * required anymore. 
473+ 	 * 
474+ 	 * @param  {RenderTarget } renderTarget - The render target to destroy. 
475+ 	 */ 
476+ 	_destroyRenderTarget (  renderTarget  )  { 
477+ 
478+ 		if  (  this . has (  renderTarget  )  ===  true  )  { 
479+ 
480+ 			const  renderTargetData  =  this . get (  renderTarget  ) ; 
481+ 
482+ 			const  textures  =  renderTargetData . textures ; 
483+ 			const  depthTexture  =  renderTargetData . depthTexture ; 
484+ 
485+ 			// 
486+ 
487+ 			renderTarget . removeEventListener (  'dispose' ,  renderTargetData . onDispose  ) ; 
488+ 
489+ 			// 
490+ 
491+ 			for  (  let  i  =  0 ;  i  <  textures . length ;  i  ++  )  { 
492+ 
493+ 				this . _destroyTexture (  textures [  i  ]  ) ; 
494+ 
495+ 			} 
496+ 
497+ 			if  (  depthTexture  )  { 
498+ 
499+ 				this . _destroyTexture (  depthTexture  ) ; 
500+ 
501+ 			} 
502+ 
503+ 			this . delete (  renderTarget  ) ; 
504+ 			this . backend . delete (  renderTarget  ) ; 
505+ 
506+ 		} 
507+ 
508+ 	} 
509+ 
487510	/** 
488511	 * Frees internal resource when the given texture isn't 
489512	 * required anymore. 
@@ -494,12 +517,18 @@ class Textures extends DataMap {
494517
495518		if  (  this . has (  texture  )  ===  true  )  { 
496519
520+ 			const  textureData  =  this . get (  texture  ) ; 
521+ 
522+ 			// 
523+ 
524+ 			texture . removeEventListener (  'dispose' ,  textureData . onDispose  ) ; 
525+ 
497526			// if a texture is not ready for use, it falls back to a default texture so it's possible 
498527			// to use it for rendering. If a texture in this state is disposed, it's important to 
499528			// not destroy/delete the underlying GPU texture object since it is cached and shared with 
500529			// other textures. 
501530
502- 			const  isDefaultTexture  =  this . get (   texture   ) . isDefaultTexture ; 
531+ 			const  isDefaultTexture  =  textureData . isDefaultTexture ; 
503532			this . backend . destroyTexture (  texture ,  isDefaultTexture  ) ; 
504533
505534			this . delete (  texture  ) ; 
0 commit comments