|
|
@@ -325,7 +325,13 @@ class ShaderCallNodeInternal extends Node {
|
|
|
const { shaderNode, inputNodes } = this;
|
|
|
|
|
|
const properties = builder.getNodeProperties( shaderNode );
|
|
|
- if ( properties.onceOutput ) return properties.onceOutput;
|
|
|
+ const onceNS = shaderNode.namespace && shaderNode.namespace === builder.namespace ? builder.getNamespace( 'once' ) : 'once';
|
|
|
+
|
|
|
+ if ( properties[ onceNS ] ) {
|
|
|
+
|
|
|
+ return properties[ onceNS ];
|
|
|
+
|
|
|
+ }
|
|
|
|
|
|
//
|
|
|
|
|
|
@@ -368,7 +374,7 @@ class ShaderCallNodeInternal extends Node {
|
|
|
|
|
|
if ( shaderNode.once ) {
|
|
|
|
|
|
- properties.onceOutput = result;
|
|
|
+ properties[ onceNS ] = result;
|
|
|
|
|
|
}
|
|
|
|
|
|
@@ -376,41 +382,63 @@ class ShaderCallNodeInternal extends Node {
|
|
|
|
|
|
}
|
|
|
|
|
|
+ setupOutput( builder ) {
|
|
|
+
|
|
|
+ builder.addStack();
|
|
|
+
|
|
|
+ builder.stack.outputNode = this.call( builder );
|
|
|
+
|
|
|
+ return builder.removeStack();
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
getOutputNode( builder ) {
|
|
|
|
|
|
const properties = builder.getNodeProperties( this );
|
|
|
+ const outputNamespace = builder.getOutputNamespace();
|
|
|
|
|
|
- if ( properties.outputNode === null ) {
|
|
|
+ properties[ outputNamespace ] = properties[ outputNamespace ] || this.setupOutput( builder );
|
|
|
|
|
|
- properties.outputNode = this.setupOutput( builder );
|
|
|
+ return properties[ outputNamespace ];
|
|
|
|
|
|
- }
|
|
|
+ }
|
|
|
|
|
|
- return properties.outputNode;
|
|
|
+ build( builder, output = null ) {
|
|
|
|
|
|
- }
|
|
|
+ let result = null;
|
|
|
|
|
|
- setup( builder ) {
|
|
|
+ const buildStage = builder.getBuildStage();
|
|
|
+ const properties = builder.getNodeProperties( this );
|
|
|
|
|
|
- return this.getOutputNode( builder );
|
|
|
+ const outputNamespace = builder.getOutputNamespace();
|
|
|
+ const outputNode = this.getOutputNode( builder );
|
|
|
|
|
|
- }
|
|
|
+ if ( buildStage === 'setup' ) {
|
|
|
|
|
|
- setupOutput( builder ) {
|
|
|
+ const initializedNamespace = builder.getNamespace( 'initialized' );
|
|
|
|
|
|
- builder.addStack();
|
|
|
+ if ( properties[ initializedNamespace ] !== true ) {
|
|
|
|
|
|
- builder.stack.outputNode = this.call( builder );
|
|
|
+ properties[ initializedNamespace ] = true;
|
|
|
|
|
|
- return builder.removeStack();
|
|
|
+ properties[ outputNamespace ] = this.getOutputNode( builder );
|
|
|
+ properties[ outputNamespace ].build( builder );
|
|
|
|
|
|
- }
|
|
|
+ }
|
|
|
|
|
|
- generate( builder, output ) {
|
|
|
+ result = properties[ outputNamespace ];
|
|
|
|
|
|
- const outputNode = this.getOutputNode( builder );
|
|
|
+ } else if ( buildStage === 'analyze' ) {
|
|
|
+
|
|
|
+ outputNode.build( builder, output );
|
|
|
+
|
|
|
+ } else if ( buildStage === 'generate' ) {
|
|
|
|
|
|
- return outputNode.build( builder, output );
|
|
|
+ result = outputNode.build( builder, output ) || '';
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ return result;
|
|
|
|
|
|
}
|
|
|
|
|
|
@@ -428,6 +456,7 @@ class ShaderNodeInternal extends Node {
|
|
|
this.global = true;
|
|
|
|
|
|
this.once = false;
|
|
|
+ this.namespace = null;
|
|
|
|
|
|
}
|
|
|
|
|
|
@@ -632,9 +661,10 @@ export const Fn = ( jsFunc, layout = null ) => {
|
|
|
|
|
|
};
|
|
|
|
|
|
- fn.once = () => {
|
|
|
+ fn.once = ( namespace = null ) => {
|
|
|
|
|
|
shaderNode.once = true;
|
|
|
+ shaderNode.namespace = namespace;
|
|
|
|
|
|
return fn;
|
|
|
|
|
|
@@ -675,16 +705,6 @@ export const Fn = ( jsFunc, layout = null ) => {
|
|
|
|
|
|
//
|
|
|
|
|
|
-addMethodChaining( 'toGlobal', ( node ) => {
|
|
|
-
|
|
|
- node.global = true;
|
|
|
-
|
|
|
- return node;
|
|
|
-
|
|
|
-} );
|
|
|
-
|
|
|
-//
|
|
|
-
|
|
|
export const setCurrentStack = ( stack ) => {
|
|
|
|
|
|
if ( currentStack === stack ) {
|