|
@@ -1,7 +1,7 @@
|
|
|
import TempNode from '../core/TempNode.js';
|
|
import TempNode from '../core/TempNode.js';
|
|
|
import { default as TextureNode/*, texture*/ } from '../accessors/TextureNode.js';
|
|
import { default as TextureNode/*, texture*/ } from '../accessors/TextureNode.js';
|
|
|
import { NodeUpdateType } from '../core/constants.js';
|
|
import { NodeUpdateType } from '../core/constants.js';
|
|
|
-import { nodeObject } from '../tsl/TSLBase.js';
|
|
|
|
|
|
|
+import { nodeObject, context } from '../tsl/TSLBase.js';
|
|
|
import { uniform } from '../core/UniformNode.js';
|
|
import { uniform } from '../core/UniformNode.js';
|
|
|
import { viewZToOrthographicDepth, perspectiveDepthToViewZ } from './ViewportDepthNode.js';
|
|
import { viewZToOrthographicDepth, perspectiveDepthToViewZ } from './ViewportDepthNode.js';
|
|
|
|
|
|
|
@@ -248,6 +248,22 @@ class PassNode extends TempNode {
|
|
|
*/
|
|
*/
|
|
|
this.renderTarget = renderTarget;
|
|
this.renderTarget = renderTarget;
|
|
|
|
|
|
|
|
|
|
+ /**
|
|
|
|
|
+ * An optional global context for the pass.
|
|
|
|
|
+ *
|
|
|
|
|
+ * @type {ContextNode|null}
|
|
|
|
|
+ */
|
|
|
|
|
+ this.contextNode = null;
|
|
|
|
|
+
|
|
|
|
|
+ /**
|
|
|
|
|
+ * A cache for the context node.
|
|
|
|
|
+ *
|
|
|
|
|
+ * @private
|
|
|
|
|
+ * @type {?Object}
|
|
|
|
|
+ * @default null
|
|
|
|
|
+ */
|
|
|
|
|
+ this._contextNodeCache = null;
|
|
|
|
|
+
|
|
|
/**
|
|
/**
|
|
|
* A dictionary holding the internal result textures.
|
|
* A dictionary holding the internal result textures.
|
|
|
*
|
|
*
|
|
@@ -739,6 +755,7 @@ class PassNode extends TempNode {
|
|
|
const currentMRT = renderer.getMRT();
|
|
const currentMRT = renderer.getMRT();
|
|
|
const currentAutoClear = renderer.autoClear;
|
|
const currentAutoClear = renderer.autoClear;
|
|
|
const currentMask = camera.layers.mask;
|
|
const currentMask = camera.layers.mask;
|
|
|
|
|
+ const currentContextNode = renderer.contextNode;
|
|
|
|
|
|
|
|
this._cameraNear.value = camera.near;
|
|
this._cameraNear.value = camera.near;
|
|
|
this._cameraFar.value = camera.far;
|
|
this._cameraFar.value = camera.far;
|
|
@@ -759,6 +776,21 @@ class PassNode extends TempNode {
|
|
|
renderer.setMRT( this._mrt );
|
|
renderer.setMRT( this._mrt );
|
|
|
renderer.autoClear = true;
|
|
renderer.autoClear = true;
|
|
|
|
|
|
|
|
|
|
+ if ( this.contextNode !== null ) {
|
|
|
|
|
+
|
|
|
|
|
+ if ( this._contextNodeCache === null || this._contextNodeCache.version !== this.version ) {
|
|
|
|
|
+
|
|
|
|
|
+ this._contextNodeCache = {
|
|
|
|
|
+ version: this.version,
|
|
|
|
|
+ context: context( { ...renderer.contextNode.value, ...this.contextNode.getFlowContextData() } )
|
|
|
|
|
+ };
|
|
|
|
|
+
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ renderer.contextNode = this._contextNodeCache.context;
|
|
|
|
|
+
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
const currentSceneName = scene.name;
|
|
const currentSceneName = scene.name;
|
|
|
|
|
|
|
|
scene.name = this.name ? this.name : scene.name;
|
|
scene.name = this.name ? this.name : scene.name;
|
|
@@ -770,6 +802,7 @@ class PassNode extends TempNode {
|
|
|
renderer.setRenderTarget( currentRenderTarget );
|
|
renderer.setRenderTarget( currentRenderTarget );
|
|
|
renderer.setMRT( currentMRT );
|
|
renderer.setMRT( currentMRT );
|
|
|
renderer.autoClear = currentAutoClear;
|
|
renderer.autoClear = currentAutoClear;
|
|
|
|
|
+ renderer.contextNode = currentContextNode;
|
|
|
|
|
|
|
|
camera.layers.mask = currentMask;
|
|
camera.layers.mask = currentMask;
|
|
|
|
|
|