diff --git a/examples/js/pmrem/PMREMGenerator.js b/examples/js/pmrem/PMREMGenerator.js index 840887475becc62b74f45d2f9d441ccb9585a73c..4e7eb767053c8a99fe766b997b67e274dde3ea07 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 650aa40e6c9377721df117e8b780d828b5c16381..2d337821032fe6995ea9ecf0a5a543d3446f18f8 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 ca40eeebd0e756584de4731af9b849dd0d34e2b6..28c32b0062ca149fc7aaefb0124b8000bce769a3 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 09d7eb38ef9c41b321c63bd3437dfd8f870b31ac..0793a893a38a75c76826d080141a42f13756d0b1 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;