|
@@ -12,6 +12,8 @@ import { float, vec2 } from '../shadernode/ShaderNode.js';
|
|
|
import { cubeTexture } from '../accessors/CubeTextureNode.js';
|
|
|
import { reference } from '../accessors/ReferenceNode.js';
|
|
|
|
|
|
+const envNodeCache = new WeakMap();
|
|
|
+
|
|
|
class EnvironmentNode extends LightingNode {
|
|
|
|
|
|
constructor( envNode = null ) {
|
|
@@ -29,13 +31,23 @@ class EnvironmentNode extends LightingNode {
|
|
|
|
|
|
if ( envNode.isTextureNode && envNode.value.isCubeTexture !== true ) {
|
|
|
|
|
|
- const texture = envNode.value;
|
|
|
- const renderer = builder.renderer;
|
|
|
+ let cacheEnvNode = envNodeCache.get( envNode.value );
|
|
|
+
|
|
|
+ if ( cacheEnvNode === undefined ) {
|
|
|
+
|
|
|
+ const texture = envNode.value;
|
|
|
+ const renderer = builder.renderer;
|
|
|
+
|
|
|
+ // @TODO: Add dispose logic here
|
|
|
+ const cubeRTT = builder.getCubeRenderTarget( 512 ).fromEquirectangularTexture( renderer, texture );
|
|
|
|
|
|
- // @TODO: Add dispose logic here
|
|
|
- const cubeRTT = builder.getCubeRenderTarget( 512 ).fromEquirectangularTexture( renderer, texture );
|
|
|
+ cacheEnvNode = cubeTexture( cubeRTT.texture );
|
|
|
+
|
|
|
+ envNodeCache.set( envNode.value, cacheEnvNode );
|
|
|
+
|
|
|
+ }
|
|
|
|
|
|
- envNode = cubeTexture( cubeRTT.texture );
|
|
|
+ envNode = cacheEnvNode;
|
|
|
|
|
|
}
|
|
|
|