|
|
@@ -3871,8 +3871,6 @@ Object.defineProperties( Node.prototype, proto );
|
|
|
|
|
|
// --- FINISH ---
|
|
|
|
|
|
-const nodeBuilderFunctionsCacheMap = new WeakMap();
|
|
|
-
|
|
|
const ShaderNodeObject = function ( obj, altType = null ) {
|
|
|
|
|
|
const type = getValueType( obj );
|
|
|
@@ -4086,35 +4084,59 @@ class ShaderCallNodeInternal extends Node {
|
|
|
|
|
|
if ( shaderNode.layout ) {
|
|
|
|
|
|
- const backend = builder.renderer.backend;
|
|
|
+ // build inputs first
|
|
|
|
|
|
- let functionNodesCacheMap = nodeBuilderFunctionsCacheMap.get( backend );
|
|
|
+ if ( rawInputs ) {
|
|
|
|
|
|
- if ( functionNodesCacheMap === undefined ) {
|
|
|
+ // use layout inputs to ensure that no extra parameters are built
|
|
|
|
|
|
- functionNodesCacheMap = new WeakMap();
|
|
|
+ const inputs = shaderNode.layout.inputs;
|
|
|
|
|
|
- nodeBuilderFunctionsCacheMap.set( backend, functionNodesCacheMap );
|
|
|
+ if ( isArrayAsParameter( rawInputs ) ) {
|
|
|
|
|
|
- }
|
|
|
+ const rawArrayParameters = rawInputs;
|
|
|
+
|
|
|
+ for ( let i = 0; i < inputs.length; i ++ ) {
|
|
|
+
|
|
|
+ const rawParameter = rawArrayParameters[ i ];
|
|
|
+
|
|
|
+ if ( rawParameter && rawParameter.isNode ) {
|
|
|
+
|
|
|
+ rawParameter.build( builder );
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ } else {
|
|
|
|
|
|
- let functionNode = functionNodesCacheMap.get( shaderNode );
|
|
|
+ const rawObjectParameters = rawInputs[ 0 ];
|
|
|
|
|
|
- if ( functionNode === undefined ) {
|
|
|
+ for ( const param of inputs ) {
|
|
|
|
|
|
- functionNode = nodeObject( builder.buildFunctionNode( shaderNode ) );
|
|
|
+ const rawParameter = rawObjectParameters[ param.name ];
|
|
|
|
|
|
- functionNodesCacheMap.set( shaderNode, functionNode );
|
|
|
+ if ( rawParameter && rawParameter.isNode ) {
|
|
|
+
|
|
|
+ rawParameter.build( builder );
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
|
|
|
}
|
|
|
|
|
|
+ const functionNode = builder.buildFunctionNode( shaderNode );
|
|
|
+
|
|
|
builder.addInclude( functionNode );
|
|
|
|
|
|
//
|
|
|
|
|
|
const inputs = rawInputs ? getLayoutParameters( rawInputs ) : null;
|
|
|
|
|
|
- result = nodeObject( functionNode.call( inputs ) );
|
|
|
+ result = functionNode.call( inputs );
|
|
|
|
|
|
} else {
|
|
|
|
|
|
@@ -4261,15 +4283,19 @@ class ShaderCallNodeInternal extends Node {
|
|
|
|
|
|
}
|
|
|
|
|
|
+function isArrayAsParameter( params ) {
|
|
|
+
|
|
|
+ return params[ 0 ] && ( params[ 0 ].isNode || Object.getPrototypeOf( params[ 0 ] ) !== Object.prototype );
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
function getLayoutParameters( params ) {
|
|
|
|
|
|
let output;
|
|
|
|
|
|
nodeObjects( params );
|
|
|
|
|
|
- const isArrayAsParameter = params[ 0 ] && ( params[ 0 ].isNode || Object.getPrototypeOf( params[ 0 ] ) !== Object.prototype );
|
|
|
-
|
|
|
- if ( isArrayAsParameter ) {
|
|
|
+ if ( isArrayAsParameter( params ) ) {
|
|
|
|
|
|
output = [ ...params ];
|
|
|
|
|
|
@@ -32416,13 +32442,20 @@ class Bindings extends DataMap {
|
|
|
const bindings = this.nodes.getForCompute( computeNode ).bindings;
|
|
|
const computeNodeData = this.get( computeNode );
|
|
|
|
|
|
- if ( computeNodeData.initialized !== true ) {
|
|
|
+ if ( computeNodeData.initialized !== true || computeNodeData.bindings !== bindings ) {
|
|
|
|
|
|
- // bind groups are created once per object
|
|
|
+ // bind groups are created once per compute node version
|
|
|
+
|
|
|
+ if ( computeNodeData.bindings !== undefined ) {
|
|
|
+
|
|
|
+ this._destroyBindings( computeNodeData.bindings );
|
|
|
+
|
|
|
+ }
|
|
|
|
|
|
this._createBindings( bindings );
|
|
|
|
|
|
computeNodeData.initialized = true;
|
|
|
+ computeNodeData.bindings = bindings;
|
|
|
|
|
|
}
|
|
|
|
|
|
@@ -32459,7 +32492,8 @@ class Bindings extends DataMap {
|
|
|
*/
|
|
|
deleteForCompute( computeNode ) {
|
|
|
|
|
|
- const bindings = this.nodes.getForCompute( computeNode ).bindings;
|
|
|
+ const computeNodeData = this.get( computeNode );
|
|
|
+ const bindings = computeNodeData.bindings || this.nodes.getForCompute( computeNode ).bindings;
|
|
|
|
|
|
this._destroyBindings( bindings );
|
|
|
|
|
|
@@ -49870,6 +49904,7 @@ class Matrix4NodeUniform extends Matrix4Uniform {
|
|
|
let _id$5 = 0;
|
|
|
|
|
|
const _bindingGroupsCache = new WeakMap();
|
|
|
+const _functionNodeCache = new WeakMap();
|
|
|
|
|
|
const sharedNodeData = new WeakMap();
|
|
|
|
|
|
@@ -52213,15 +52248,34 @@ class NodeBuilder {
|
|
|
*/
|
|
|
buildFunctionNode( shaderNode ) {
|
|
|
|
|
|
- const fn = new FunctionNode();
|
|
|
+ const backend = this.renderer.backend;
|
|
|
+
|
|
|
+ let cache = _functionNodeCache.get( backend );
|
|
|
|
|
|
- const previous = this.currentFunctionNode;
|
|
|
+ if ( cache === undefined ) {
|
|
|
|
|
|
- this.currentFunctionNode = fn;
|
|
|
+ cache = new WeakMap();
|
|
|
+ _functionNodeCache.set( backend, cache );
|
|
|
|
|
|
- fn.code = this.buildFunctionCode( shaderNode );
|
|
|
+ }
|
|
|
|
|
|
- this.currentFunctionNode = previous;
|
|
|
+ let fn = cache.get( shaderNode );
|
|
|
+
|
|
|
+ if ( fn === undefined ) {
|
|
|
+
|
|
|
+ fn = new FunctionNode();
|
|
|
+
|
|
|
+ const previous = this.currentFunctionNode;
|
|
|
+
|
|
|
+ this.currentFunctionNode = fn;
|
|
|
+
|
|
|
+ fn.code = this.buildFunctionCode( shaderNode );
|
|
|
+
|
|
|
+ this.currentFunctionNode = previous;
|
|
|
+
|
|
|
+ cache.set( shaderNode, fn );
|
|
|
+
|
|
|
+ }
|
|
|
|
|
|
return fn;
|
|
|
|
|
|
@@ -54874,7 +54928,7 @@ class NodeManager extends DataMap {
|
|
|
|
|
|
let nodeBuilderState = computeData.nodeBuilderState;
|
|
|
|
|
|
- if ( nodeBuilderState === undefined ) {
|
|
|
+ if ( nodeBuilderState === undefined || computeData.version !== computeNode.version ) {
|
|
|
|
|
|
const nodeBuilder = this.backend.createNodeBuilder( computeNode, this.renderer );
|
|
|
nodeBuilder.build();
|
|
|
@@ -54882,6 +54936,7 @@ class NodeManager extends DataMap {
|
|
|
nodeBuilderState = this._createNodeBuilderState( nodeBuilder );
|
|
|
|
|
|
computeData.nodeBuilderState = nodeBuilderState;
|
|
|
+ computeData.version = computeNode.version;
|
|
|
|
|
|
}
|
|
|
|