Skip to content

Commit cfd654e

Browse files
committed
Renderer: Manage PMREMGenerato in renderer instead of node builder.
1 parent 89d62af commit cfd654e

File tree

3 files changed

+36
-31
lines changed

3 files changed

+36
-31
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: 7 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,6 @@ import { nodeProxy, vec3 } from '../tsl/TSLBase.js';
88
import { WebGLCoordinateSystem } from '../../constants.js';
99
import { Texture } from '../../textures/Texture.js';
1010

11-
let _generator = null;
12-
1311
const _cache = new WeakMap();
1412

1513
/**
@@ -36,9 +34,10 @@ function _generateCubeUVSize( imageHeight ) {
3634
*
3735
* @private
3836
* @param {Texture} texture - The texture to create the PMREM for.
37+
* @param {PMREMGenerator} generator - The PMREM generator.
3938
* @return {Texture} The PMREM.
4039
*/
41-
function _getPMREMFromTexture( texture ) {
40+
function _getPMREMFromTexture( texture, generator ) {
4241

4342
let cacheTexture = _cache.get( texture );
4443

@@ -52,7 +51,7 @@ function _getPMREMFromTexture( texture ) {
5251

5352
if ( isCubeMapReady( image ) ) {
5453

55-
cacheTexture = _generator.fromCubemap( texture, cacheTexture );
54+
cacheTexture = generator.fromCubemap( texture, cacheTexture );
5655

5756
} else {
5857

@@ -65,7 +64,7 @@ function _getPMREMFromTexture( texture ) {
6564

6665
if ( isEquirectangularMapReady( image ) ) {
6766

68-
cacheTexture = _generator.fromEquirectangular( texture, cacheTexture );
67+
cacheTexture = generator.fromEquirectangular( texture, cacheTexture );
6968

7069
} else {
7170

@@ -234,7 +233,7 @@ class PMREMNode extends TempNode {
234233

235234
}
236235

237-
updateBefore() {
236+
updateBefore( frame ) {
238237

239238
let pmrem = this._pmrem;
240239

@@ -249,7 +248,7 @@ class PMREMNode extends TempNode {
249248

250249
} else {
251250

252-
pmrem = _getPMREMFromTexture( texture );
251+
pmrem = _getPMREMFromTexture( texture, frame.builder.renderer._getPMREMGenerator() );
253252

254253
}
255254

@@ -267,15 +266,7 @@ class PMREMNode extends TempNode {
267266

268267
setup( builder ) {
269268

270-
if ( _generator === null ) {
271-
272-
_generator = builder.createPMREMGenerator();
273-
274-
}
275-
276-
//
277-
278-
this.updateBefore( builder );
269+
this.updateBefore( { builder } );
279270

280271
//
281272

src/renderers/common/Renderer.js

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ import RenderBundles from './RenderBundles.js';
1717
import NodeLibrary from './nodes/NodeLibrary.js';
1818
import Lighting from './Lighting.js';
1919
import XRManager from './XRManager.js';
20+
import PMREMGenerator from './extras/PMREMGenerator.js';
2021

2122
import NodeMaterial from '../../materials/nodes/NodeMaterial.js';
2223

@@ -625,6 +626,14 @@ class Renderer {
625626
*/
626627
this._compilationPromises = null;
627628

629+
/**
630+
* A reference to a PMREM generator that can be globally used for generating PMREMs.
631+
*
632+
* @type {?PMREMGenerator}
633+
* @default null
634+
*/
635+
this._pmremGenerator = null;
636+
628637
/**
629638
* Whether the renderer should render transparent render objects or not.
630639
*
@@ -2080,6 +2089,8 @@ class Renderer {
20802089
this._renderContexts.dispose();
20812090
this._textures.dispose();
20822091

2092+
if ( this._pmremGenerator !== null ) this._pmremGenerator.dispose();
2093+
20832094
if ( this._frameBufferTarget !== null ) this._frameBufferTarget.dispose();
20842095

20852096
Object.values( this.backend.timestampQueryPool ).forEach( queryPool => {
@@ -2910,6 +2921,24 @@ class Renderer {
29102921

29112922
}
29122923

2924+
/**
2925+
* Returns an instance of {@link PMREMGenerator} for PMREM generation.
2926+
*
2927+
* @private
2928+
* @return {PMREMGenerator} The PMREM generator.
2929+
*/
2930+
_getPMREMGenerator() {
2931+
2932+
if ( this._pmremGenerator === null ) {
2933+
2934+
this._pmremGenerator = new PMREMGenerator( this );
2935+
2936+
}
2937+
2938+
return this._pmremGenerator;
2939+
2940+
}
2941+
29132942
/**
29142943
* Alias for `compileAsync()`.
29152944
*

0 commit comments

Comments
 (0)