Skip to content

Commit f27108e

Browse files
authored
PMREMNode: Manage own generator. (#30504)
* PMREMNode: Manage own generator. * PMREMNode: Fix import. * PMREMNode: Simplify code. * PMREMNode: Clean up. * PMREMNode: Fix cache.
1 parent f640829 commit f27108e

File tree

2 files changed

+47
-38
lines changed

2 files changed

+47
-38
lines changed

src/nodes/core/NodeBuilder.js

Lines changed: 0 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -22,8 +22,6 @@ import { getCurrentStack, setCurrentStack } from '../tsl/TSLBase.js';
2222
import CubeRenderTarget from '../../renderers/common/CubeRenderTarget.js';
2323
import ChainMap from '../../renderers/common/ChainMap.js';
2424

25-
import PMREMGenerator from '../../renderers/common/extras/PMREMGenerator.js';
26-
2725
import BindGroup from '../../renderers/common/BindGroup.js';
2826

2927
import { REVISION, IntType, UnsignedIntType, LinearFilter, LinearMipmapNearestFilter, NearestMipmapLinearFilter, LinearMipmapLinearFilter } from '../../constants.js';
@@ -472,19 +470,6 @@ class NodeBuilder {
472470

473471
}
474472

475-
/**
476-
* Factory method for creating an instance of {@link PMREMGenerator}.
477-
*
478-
* @return {PMREMGenerator} The PMREM generator.
479-
*/
480-
createPMREMGenerator() {
481-
482-
// TODO: Move Materials.js to outside of the Nodes.js in order to remove this function and improve tree-shaking support
483-
484-
return new PMREMGenerator( this.renderer );
485-
486-
}
487-
488473
/**
489474
* Whether the given node is included in the internal array of nodes or not.
490475
*

src/nodes/pmrem/PMREMNode.js

Lines changed: 47 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -5,10 +5,8 @@ import { uniform } from '../core/UniformNode.js';
55
import { NodeUpdateType } from '../core/constants.js';
66
import { nodeProxy, vec3 } from '../tsl/TSLBase.js';
77

8-
import { WebGLCoordinateSystem } from '../../constants.js';
98
import { Texture } from '../../textures/Texture.js';
10-
11-
let _generator = null;
9+
import PMREMGenerator from '../../renderers/common/extras/PMREMGenerator.js';
1210

1311
const _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

320344
export default PMREMNode;

0 commit comments

Comments
 (0)