瀏覽代碼

added dispose method

Emmett Lalish 5 年之前
父節點
當前提交
8dc9e7c440

+ 39 - 1
examples/js/pmrem/PMREMGenerator.js

@@ -38,6 +38,8 @@ THREE.PMREMGenerator = ( function () {
 
 
 	var _flatCamera = new THREE.OrthographicCamera();
 	var _flatCamera = new THREE.OrthographicCamera();
 	var _blurMaterial = _getBlurShader( MAX_SAMPLES );
 	var _blurMaterial = _getBlurShader( MAX_SAMPLES );
+	var _equirectShader = null;
+	var _cubemapShader = null;
 
 
 	var { _lodPlanes, _sizeLods, _sigmas } = _createPlanes();
 	var { _lodPlanes, _sizeLods, _sigmas } = _createPlanes();
 	var _pingPongRenderTarget = null;
 	var _pingPongRenderTarget = null;
@@ -124,6 +126,25 @@ THREE.PMREMGenerator = ( function () {
 
 
 		},
 		},
 
 
+		/**
+		 * Disposes of the PMREMGenerator's internal memory. Note that PMREMGenerator is a static class,
+		 * so you should not need more than one PMREMGenerator object. If you do, calling dispose() on
+		 * one of them will cause any others to also become unusable.
+		 */
+		dispose: function () {
+
+			_blurMaterial.dispose();
+			if ( _cubemapShader != null ) _cubemapShader.dispose();
+			if ( _equirectShader != null ) _equirectShader.dispose();
+			var plane;
+			for ( plane of _lodPlanes ) {
+
+				plane.dispose();
+
+			}
+
+		},
+
 	};
 	};
 
 
 	function _createPlanes() {
 	function _createPlanes() {
@@ -300,7 +321,24 @@ THREE.PMREMGenerator = ( function () {
 	function _textureToCubeUV( texture, cubeUVRenderTarget ) {
 	function _textureToCubeUV( texture, cubeUVRenderTarget ) {
 
 
 		var scene = new THREE.Scene();
 		var scene = new THREE.Scene();
-		var material = texture.isCubeTexture ? _getCubemapShader() : _getEquirectShader();
+		if ( texture.isCubeTexture ) {
+
+			if ( _cubemapShader == null ) {
+
+				_cubemapShader = _getCubemapShader();
+
+			}
+
+		} else {
+
+			if ( _equirectShader == null ) {
+
+				_equirectShader = _getEquirectShader();
+
+			}
+
+		}
+		var material = texture.isCubeTexture ? _cubemapShader : _equirectShader;
 		scene.add( new THREE.Mesh( _lodPlanes[ 0 ], material ) );
 		scene.add( new THREE.Mesh( _lodPlanes[ 0 ], material ) );
 		var uniforms = material.uniforms;
 		var uniforms = material.uniforms;
 
 

+ 1 - 0
examples/jsm/pmrem/PMREMGenerator.d.ts

@@ -12,5 +12,6 @@ export class PMREMGenerator {
 	fromScene( scene:Scene, sigma?:number, near?:number, far?:number ): WebGLRenderTarget;
 	fromScene( scene:Scene, sigma?:number, near?:number, far?:number ): WebGLRenderTarget;
 	fromEquirectangular( equirectangular:Texture ): WebGLRenderTarget;
 	fromEquirectangular( equirectangular:Texture ): WebGLRenderTarget;
 	fromCubemap( cubemap:CubeTexture ): WebGLRenderTarget;
 	fromCubemap( cubemap:CubeTexture ): WebGLRenderTarget;
+	dispose(): void;
 
 
 }
 }

+ 39 - 1
examples/jsm/pmrem/PMREMGenerator.js

@@ -64,6 +64,8 @@ var PMREMGenerator = ( function () {
 
 
 	var _flatCamera = new OrthographicCamera();
 	var _flatCamera = new OrthographicCamera();
 	var _blurMaterial = _getBlurShader( MAX_SAMPLES );
 	var _blurMaterial = _getBlurShader( MAX_SAMPLES );
+	var _equirectShader = null;
+	var _cubemapShader = null;
 
 
 	var { _lodPlanes, _sizeLods, _sigmas } = _createPlanes();
 	var { _lodPlanes, _sizeLods, _sigmas } = _createPlanes();
 	var _pingPongRenderTarget = null;
 	var _pingPongRenderTarget = null;
@@ -150,6 +152,25 @@ var PMREMGenerator = ( function () {
 
 
 		},
 		},
 
 
+		/**
+		 * Disposes of the PMREMGenerator's internal memory. Note that PMREMGenerator is a static class,
+		 * so you should not need more than one PMREMGenerator object. If you do, calling dispose() on
+		 * one of them will cause any others to also become unusable.
+		 */
+		dispose: function () {
+
+			_blurMaterial.dispose();
+			if ( _cubemapShader != null ) _cubemapShader.dispose();
+			if ( _equirectShader != null ) _equirectShader.dispose();
+			var plane;
+			for ( plane of _lodPlanes ) {
+
+				plane.dispose();
+
+			}
+
+		},
+
 	};
 	};
 
 
 	function _createPlanes() {
 	function _createPlanes() {
@@ -326,7 +347,24 @@ var PMREMGenerator = ( function () {
 	function _textureToCubeUV( texture, cubeUVRenderTarget ) {
 	function _textureToCubeUV( texture, cubeUVRenderTarget ) {
 
 
 		var scene = new Scene();
 		var scene = new Scene();
-		var material = texture.isCubeTexture ? _getCubemapShader() : _getEquirectShader();
+		if ( texture.isCubeTexture ) {
+
+			if ( _cubemapShader == null ) {
+
+				_cubemapShader = _getCubemapShader();
+
+			}
+
+		} else {
+
+			if ( _equirectShader == null ) {
+
+				_equirectShader = _getEquirectShader();
+
+			}
+
+		}
+		var material = texture.isCubeTexture ? _cubemapShader : _equirectShader;
 		scene.add( new Mesh( _lodPlanes[ 0 ], material ) );
 		scene.add( new Mesh( _lodPlanes[ 0 ], material ) );
 		var uniforms = material.uniforms;
 		var uniforms = material.uniforms;
 
 

+ 7 - 4
examples/webgl_materials_envmaps_hdr.html

@@ -77,14 +77,19 @@
 				planeMesh.rotation.x = - Math.PI * 0.5;
 				planeMesh.rotation.x = - Math.PI * 0.5;
 				scene.add( planeMesh );
 				scene.add( planeMesh );
 
 
-				var hdrUrls = [ 'px.hdr', 'nx.hdr', 'py.hdr', 'ny.hdr', 'pz.hdr', 'nz.hdr' ];
+				var pmremGenerator = new PMREMGenerator( renderer );
+				THREE.DefaultLoadingManager.onLoad = function ( ) {
+
+					pmremGenerator.dispose();
+					
+				}
 
 
+				var hdrUrls = [ 'px.hdr', 'nx.hdr', 'py.hdr', 'ny.hdr', 'pz.hdr', 'nz.hdr' ];
 				hdrCubeMap = new HDRCubeTextureLoader()
 				hdrCubeMap = new HDRCubeTextureLoader()
 					.setPath( './textures/cube/pisaHDR/' )
 					.setPath( './textures/cube/pisaHDR/' )
 					.setDataType( THREE.UnsignedByteType )
 					.setDataType( THREE.UnsignedByteType )
 					.load( hdrUrls, function () {
 					.load( hdrUrls, function () {
 
 
-						var pmremGenerator = new PMREMGenerator( renderer );
 						hdrCubeRenderTarget = pmremGenerator.fromCubemap( hdrCubeMap );
 						hdrCubeRenderTarget = pmremGenerator.fromCubemap( hdrCubeMap );
 
 
 						hdrCubeMap.magFilter = THREE.LinearFilter;
 						hdrCubeMap.magFilter = THREE.LinearFilter;
@@ -99,7 +104,6 @@
 
 
 						ldrCubeMap.encoding = THREE.GammaEncoding;
 						ldrCubeMap.encoding = THREE.GammaEncoding;
 
 
-						var pmremGenerator = new PMREMGenerator( renderer );
 						ldrCubeRenderTarget = pmremGenerator.fromCubemap( ldrCubeMap );
 						ldrCubeRenderTarget = pmremGenerator.fromCubemap( ldrCubeMap );
 
 
 					} );
 					} );
@@ -113,7 +117,6 @@
 						rgbmCubeMap.encoding = THREE.RGBM16Encoding;
 						rgbmCubeMap.encoding = THREE.RGBM16Encoding;
 						rgbmCubeMap.format = THREE.RGBAFormat;
 						rgbmCubeMap.format = THREE.RGBAFormat;
 
 
-						var pmremGenerator = new PMREMGenerator( renderer );
 						rgbmCubeRenderTarget = pmremGenerator.fromCubemap( rgbmCubeMap );
 						rgbmCubeRenderTarget = pmremGenerator.fromCubemap( rgbmCubeMap );
 
 
 						rgbmCubeMap.magFilter = THREE.LinearFilter;
 						rgbmCubeMap.magFilter = THREE.LinearFilter;