Просмотр исходного кода

PMREMNode: Manage own generator. (#30504)

* PMREMNode: Manage own generator.

* PMREMNode: Fix import.

* PMREMNode: Simplify code.

* PMREMNode: Clean up.

* PMREMNode: Fix cache.
Michael Herzog 11 месяцев назад
Родитель
Сommit
f27108e864
2 измененных файлов с 47 добавлено и 38 удалено
  1. 0 15
      src/nodes/core/NodeBuilder.js
  2. 47 23
      src/nodes/pmrem/PMREMNode.js

+ 0 - 15
src/nodes/core/NodeBuilder.js

@@ -22,8 +22,6 @@ import { getCurrentStack, setCurrentStack } from '../tsl/TSLBase.js';
 import CubeRenderTarget from '../../renderers/common/CubeRenderTarget.js';
 import ChainMap from '../../renderers/common/ChainMap.js';
 
-import PMREMGenerator from '../../renderers/common/extras/PMREMGenerator.js';
-
 import BindGroup from '../../renderers/common/BindGroup.js';
 
 import { REVISION, IntType, UnsignedIntType, LinearFilter, LinearMipmapNearestFilter, NearestMipmapLinearFilter, LinearMipmapLinearFilter } from '../../constants.js';
@@ -472,19 +470,6 @@ class NodeBuilder {
 
 	}
 
-	/**
-	 * Factory method for creating an instance of {@link PMREMGenerator}.
-	 *
-	 * @return {PMREMGenerator} The PMREM generator.
-	 */
-	createPMREMGenerator() {
-
-		// TODO: Move Materials.js to outside of the Nodes.js in order to remove this function and improve tree-shaking support
-
-		return new PMREMGenerator( this.renderer );
-
-	}
-
 	/**
 	 * Whether the given node is included in the internal array of nodes or not.
 	 *

+ 47 - 23
src/nodes/pmrem/PMREMNode.js

@@ -5,10 +5,8 @@ import { uniform } from '../core/UniformNode.js';
 import { NodeUpdateType } from '../core/constants.js';
 import { nodeProxy, vec3 } from '../tsl/TSLBase.js';
 
-import { WebGLCoordinateSystem } from '../../constants.js';
 import { Texture } from '../../textures/Texture.js';
-
-let _generator = null;
+import PMREMGenerator from '../../renderers/common/extras/PMREMGenerator.js';
 
 const _cache = new WeakMap();
 
@@ -32,15 +30,19 @@ function _generateCubeUVSize( imageHeight ) {
 }
 
 /**
- * Generates a PMREM from the given texture .
+ * Generates a PMREM from the given texture.
  *
  * @private
  * @param {Texture} texture - The texture to create the PMREM for.
+ * @param {Renderer} renderer - The renderer.
+ * @param {PMREMGenerator} generator - The PMREM generator.
  * @return {Texture} The PMREM.
  */
-function _getPMREMFromTexture( texture ) {
+function _getPMREMFromTexture( texture, renderer, generator ) {
+
+	const cache = _getCache( renderer );
 
-	let cacheTexture = _cache.get( texture );
+	let cacheTexture = cache.get( texture );
 
 	const pmremVersion = cacheTexture !== undefined ? cacheTexture.pmremVersion : - 1;
 
@@ -52,7 +54,7 @@ function _getPMREMFromTexture( texture ) {
 
 			if ( isCubeMapReady( image ) ) {
 
-				cacheTexture = _generator.fromCubemap( texture, cacheTexture );
+				cacheTexture = generator.fromCubemap( texture, cacheTexture );
 
 			} else {
 
@@ -65,7 +67,7 @@ function _getPMREMFromTexture( texture ) {
 
 			if ( isEquirectangularMapReady( image ) ) {
 
-				cacheTexture = _generator.fromEquirectangular( texture, cacheTexture );
+				cacheTexture = generator.fromEquirectangular( texture, cacheTexture );
 
 			} else {
 
@@ -77,7 +79,7 @@ function _getPMREMFromTexture( texture ) {
 
 		cacheTexture.pmremVersion = texture.pmremVersion;
 
-		_cache.set( texture, cacheTexture );
+		cache.set( texture, cacheTexture );
 
 	}
 
@@ -85,6 +87,30 @@ function _getPMREMFromTexture( texture ) {
 
 }
 
+/**
+ * Returns a cache that stores generated PMREMs for the respective textures.
+ * A cache must be maintaned per renderer since PMREMs are render target textures
+ * which can't be shared across render contexts.
+ *
+ * @private
+ * @param {Renderer} renderer - The renderer.
+ * @return {WeakMap<Texture, Texture>} The PMREM cache.
+ */
+function _getCache( renderer ) {
+
+	let rendererCache = _cache.get( renderer );
+
+	if ( rendererCache === undefined ) {
+
+		rendererCache = new WeakMap();
+		_cache.set( renderer, rendererCache );
+
+	}
+
+	return rendererCache;
+
+}
+
 /**
  * This node represents a PMREM which is a special type of preprocessed
  * environment map intended for PBR materials.
@@ -234,7 +260,7 @@ class PMREMNode extends TempNode {
 
 	}
 
-	updateBefore() {
+	updateBefore( frame ) {
 
 		let pmrem = this._pmrem;
 
@@ -249,7 +275,7 @@ class PMREMNode extends TempNode {
 
 			} else {
 
-				pmrem = _getPMREMFromTexture( texture );
+				pmrem = _getPMREMFromTexture( texture, frame.renderer, this._generator );
 
 			}
 
@@ -267,14 +293,12 @@ class PMREMNode extends TempNode {
 
 	setup( builder ) {
 
-		if ( _generator === null ) {
+		if ( this._generator === null ) {
 
-			_generator = builder.createPMREMGenerator();
+			this._generator = new PMREMGenerator( builder.renderer );
 
 		}
 
-		//
-
 		this.updateBefore( builder );
 
 		//
@@ -289,14 +313,6 @@ class PMREMNode extends TempNode {
 
 		//
 
-		const texture = this.value;
-
-		if ( builder.renderer.coordinateSystem === WebGLCoordinateSystem && texture.isPMREMTexture !== true && texture.isRenderTargetTexture === true ) {
-
-			uvNode = vec3( uvNode.x.negate(), uvNode.yz );
-
-		}
-
 		uvNode = vec3( uvNode.x, uvNode.y.negate(), uvNode.z );
 
 		//
@@ -315,6 +331,14 @@ class PMREMNode extends TempNode {
 
 	}
 
+	dispose() {
+
+		super.dispose();
+
+		if ( this._generator !== null ) this._generator.dispose();
+
+	}
+
 }
 
 export default PMREMNode;

粤ICP备19079148号