From 8dc9e7c440a0efb3ebf27017f49464e637a265da Mon Sep 17 00:00:00 2001 From: Emmett Lalish Date: Tue, 26 Nov 2019 11:15:39 -0800 Subject: [PATCH] added dispose method --- examples/js/pmrem/PMREMGenerator.js | 40 ++++++++++++++++++++++- examples/jsm/pmrem/PMREMGenerator.d.ts | 1 + examples/jsm/pmrem/PMREMGenerator.js | 40 ++++++++++++++++++++++- examples/webgl_materials_envmaps_hdr.html | 11 ++++--- 4 files changed, 86 insertions(+), 6 deletions(-) diff --git a/examples/js/pmrem/PMREMGenerator.js b/examples/js/pmrem/PMREMGenerator.js index 840887475b..4e7eb76705 100644 --- a/examples/js/pmrem/PMREMGenerator.js +++ b/examples/js/pmrem/PMREMGenerator.js @@ -38,6 +38,8 @@ THREE.PMREMGenerator = ( function () { var _flatCamera = new THREE.OrthographicCamera(); var _blurMaterial = _getBlurShader( MAX_SAMPLES ); + var _equirectShader = null; + var _cubemapShader = null; var { _lodPlanes, _sizeLods, _sigmas } = _createPlanes(); 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() { @@ -300,7 +321,24 @@ THREE.PMREMGenerator = ( function () { function _textureToCubeUV( texture, cubeUVRenderTarget ) { 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 ) ); var uniforms = material.uniforms; diff --git a/examples/jsm/pmrem/PMREMGenerator.d.ts b/examples/jsm/pmrem/PMREMGenerator.d.ts index 650aa40e6c..2d33782103 100644 --- a/examples/jsm/pmrem/PMREMGenerator.d.ts +++ b/examples/jsm/pmrem/PMREMGenerator.d.ts @@ -12,5 +12,6 @@ export class PMREMGenerator { fromScene( scene:Scene, sigma?:number, near?:number, far?:number ): WebGLRenderTarget; fromEquirectangular( equirectangular:Texture ): WebGLRenderTarget; fromCubemap( cubemap:CubeTexture ): WebGLRenderTarget; + dispose(): void; } diff --git a/examples/jsm/pmrem/PMREMGenerator.js b/examples/jsm/pmrem/PMREMGenerator.js index ca40eeebd0..28c32b0062 100644 --- a/examples/jsm/pmrem/PMREMGenerator.js +++ b/examples/jsm/pmrem/PMREMGenerator.js @@ -64,6 +64,8 @@ var PMREMGenerator = ( function () { var _flatCamera = new OrthographicCamera(); var _blurMaterial = _getBlurShader( MAX_SAMPLES ); + var _equirectShader = null; + var _cubemapShader = null; var { _lodPlanes, _sizeLods, _sigmas } = _createPlanes(); 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() { @@ -326,7 +347,24 @@ var PMREMGenerator = ( function () { function _textureToCubeUV( texture, cubeUVRenderTarget ) { 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 ) ); var uniforms = material.uniforms; diff --git a/examples/webgl_materials_envmaps_hdr.html b/examples/webgl_materials_envmaps_hdr.html index 09d7eb38ef..0793a893a3 100644 --- a/examples/webgl_materials_envmaps_hdr.html +++ b/examples/webgl_materials_envmaps_hdr.html @@ -77,14 +77,19 @@ planeMesh.rotation.x = - Math.PI * 0.5; 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() .setPath( './textures/cube/pisaHDR/' ) .setDataType( THREE.UnsignedByteType ) .load( hdrUrls, function () { - var pmremGenerator = new PMREMGenerator( renderer ); hdrCubeRenderTarget = pmremGenerator.fromCubemap( hdrCubeMap ); hdrCubeMap.magFilter = THREE.LinearFilter; @@ -99,7 +104,6 @@ ldrCubeMap.encoding = THREE.GammaEncoding; - var pmremGenerator = new PMREMGenerator( renderer ); ldrCubeRenderTarget = pmremGenerator.fromCubemap( ldrCubeMap ); } ); @@ -113,7 +117,6 @@ rgbmCubeMap.encoding = THREE.RGBM16Encoding; rgbmCubeMap.format = THREE.RGBAFormat; - var pmremGenerator = new PMREMGenerator( renderer ); rgbmCubeRenderTarget = pmremGenerator.fromCubemap( rgbmCubeMap ); rgbmCubeMap.magFilter = THREE.LinearFilter; -- GitLab