@@ -5,10 +5,8 @@ import { uniform } from '../core/UniformNode.js';
55import { NodeUpdateType } from '../core/constants.js' ;
66import { nodeProxy , vec3 } from '../tsl/TSLBase.js' ;
77
8- import { WebGLCoordinateSystem } from '../../constants.js' ;
98import { Texture } from '../../textures/Texture.js' ;
10-
11- let _generator = null ;
9+ import PMREMGenerator from '../../renderers/common/extras/PMREMGenerator.js' ;
1210
1311const _cache = new WeakMap ( ) ;
1412
@@ -32,15 +30,19 @@ function _generateCubeUVSize( imageHeight ) {
3230}
3331
3432/**
35- * Generates a PMREM from the given texture .
33+ * Generates a PMREM from the given texture.
3634 *
3735 * @private
3836 * @param {Texture } texture - The texture to create the PMREM for.
37+ * @param {Renderer } renderer - The renderer.
38+ * @param {PMREMGenerator } generator - The PMREM generator.
3939 * @return {Texture } The PMREM.
4040 */
41- function _getPMREMFromTexture ( texture ) {
41+ function _getPMREMFromTexture ( texture , renderer , generator ) {
42+
43+ const cache = _getCache ( renderer ) ;
4244
43- let cacheTexture = _cache . get ( texture ) ;
45+ let cacheTexture = cache . get ( texture ) ;
4446
4547 const pmremVersion = cacheTexture !== undefined ? cacheTexture . pmremVersion : - 1 ;
4648
@@ -52,7 +54,7 @@ function _getPMREMFromTexture( texture ) {
5254
5355 if ( isCubeMapReady ( image ) ) {
5456
55- cacheTexture = _generator . fromCubemap ( texture , cacheTexture ) ;
57+ cacheTexture = generator . fromCubemap ( texture , cacheTexture ) ;
5658
5759 } else {
5860
@@ -65,7 +67,7 @@ function _getPMREMFromTexture( texture ) {
6567
6668 if ( isEquirectangularMapReady ( image ) ) {
6769
68- cacheTexture = _generator . fromEquirectangular ( texture , cacheTexture ) ;
70+ cacheTexture = generator . fromEquirectangular ( texture , cacheTexture ) ;
6971
7072 } else {
7173
@@ -77,14 +79,38 @@ function _getPMREMFromTexture( texture ) {
7779
7880 cacheTexture . pmremVersion = texture . pmremVersion ;
7981
80- _cache . set ( texture , cacheTexture ) ;
82+ cache . set ( texture , cacheTexture ) ;
8183
8284 }
8385
8486 return cacheTexture . texture ;
8587
8688}
8789
90+ /**
91+ * Returns a cache that stores generated PMREMs for the respective textures.
92+ * A cache must be maintaned per renderer since PMREMs are render target textures
93+ * which can't be shared across render contexts.
94+ *
95+ * @private
96+ * @param {Renderer } renderer - The renderer.
97+ * @return {WeakMap<Texture, Texture> } The PMREM cache.
98+ */
99+ function _getCache ( renderer ) {
100+
101+ let rendererCache = _cache . get ( renderer ) ;
102+
103+ if ( rendererCache === undefined ) {
104+
105+ rendererCache = new WeakMap ( ) ;
106+ _cache . set ( renderer , rendererCache ) ;
107+
108+ }
109+
110+ return rendererCache ;
111+
112+ }
113+
88114/**
89115 * This node represents a PMREM which is a special type of preprocessed
90116 * environment map intended for PBR materials.
@@ -234,7 +260,7 @@ class PMREMNode extends TempNode {
234260
235261 }
236262
237- updateBefore ( ) {
263+ updateBefore ( frame ) {
238264
239265 let pmrem = this . _pmrem ;
240266
@@ -249,7 +275,7 @@ class PMREMNode extends TempNode {
249275
250276 } else {
251277
252- pmrem = _getPMREMFromTexture ( texture ) ;
278+ pmrem = _getPMREMFromTexture ( texture , frame . renderer , this . _generator ) ;
253279
254280 }
255281
@@ -267,14 +293,12 @@ class PMREMNode extends TempNode {
267293
268294 setup ( builder ) {
269295
270- if ( _generator === null ) {
296+ if ( this . _generator === null ) {
271297
272- _generator = builder . createPMREMGenerator ( ) ;
298+ this . _generator = new PMREMGenerator ( builder . renderer ) ;
273299
274300 }
275301
276- //
277-
278302 this . updateBefore ( builder ) ;
279303
280304 //
@@ -289,14 +313,6 @@ class PMREMNode extends TempNode {
289313
290314 //
291315
292- const texture = this . value ;
293-
294- if ( builder . renderer . coordinateSystem === WebGLCoordinateSystem && texture . isPMREMTexture !== true && texture . isRenderTargetTexture === true ) {
295-
296- uvNode = vec3 ( uvNode . x . negate ( ) , uvNode . yz ) ;
297-
298- }
299-
300316 uvNode = vec3 ( uvNode . x , uvNode . y . negate ( ) , uvNode . z ) ;
301317
302318 //
@@ -315,6 +331,14 @@ class PMREMNode extends TempNode {
315331
316332 }
317333
334+ dispose ( ) {
335+
336+ super . dispose ( ) ;
337+
338+ if ( this . _generator !== null ) this . _generator . dispose ( ) ;
339+
340+ }
341+
318342}
319343
320344export default PMREMNode ;
0 commit comments