|
|
@@ -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;
|