From c8cb929a53bf63eea97c0907be4abd24195f0012 Mon Sep 17 00:00:00 2001 From: sunag Date: Wed, 25 Sep 2024 16:56:18 -0300 Subject: [PATCH 1/3] VolumeNodeMaterial: simplify a little --- examples/webgpu_volume_perlin.html | 4 ++-- src/materials/nodes/VolumeNodeMaterial.js | 12 ++++++------ 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/examples/webgpu_volume_perlin.html b/examples/webgpu_volume_perlin.html index 677cd262b2762b..25738f64de1603 100644 --- a/examples/webgpu_volume_perlin.html +++ b/examples/webgpu_volume_perlin.html @@ -89,7 +89,7 @@ const geometry = new THREE.BoxGeometry( 1, 1, 1 ); const material = new THREE.VolumeNodeMaterial( { - side: THREE.BackSide, + side: THREE.BackSide } ); material.base = new THREE.Color( 0x798aa0 ); @@ -103,7 +103,7 @@ If( mapValue.greaterThan( threshold ), () => { - const p = vec3().temp().assign( probe ).addAssign( 0.5 ); + const p = vec3( probe ).add( 0.5 ); finalColor.rgb.assign( map.normal( p ).mul( 0.5 ).add( probe.mul( 1.5 ).add( 0.25 ) ) ); finalColor.a.assign( 1 ); diff --git a/src/materials/nodes/VolumeNodeMaterial.js b/src/materials/nodes/VolumeNodeMaterial.js index 3976c235321d4d..db9e82ac3de018 100644 --- a/src/materials/nodes/VolumeNodeMaterial.js +++ b/src/materials/nodes/VolumeNodeMaterial.js @@ -4,7 +4,7 @@ import { materialReference } from '../../nodes/accessors/MaterialReferenceNode.j import { modelWorldMatrixInverse } from '../../nodes/accessors/ModelNode.js'; import { cameraPosition } from '../../nodes/accessors/Camera.js'; import { positionGeometry } from '../../nodes/accessors/Position.js'; -import { Fn, varying, vec2, vec3, vec4 } from '../../nodes/tsl/TSLBase.js'; +import { Fn, varying, float, vec2, vec3, vec4 } from '../../nodes/tsl/TSLBase.js'; import { min, max } from '../../nodes/math/MathNode.js'; import { Loop, Break } from '../../nodes/utils/LoopNode.js'; import { texture3D } from '../../nodes/accessors/Texture3DNode.js'; @@ -59,19 +59,19 @@ class VolumeNodeMaterial extends NodeMaterial { const vDirection = varying( positionGeometry.sub( vOrigin ) ); const rayDir = vDirection.normalize(); - const bounds = property( 'vec2', 'bounds' ).assign( hitBox( { orig: vOrigin, dir: rayDir } ) ); + const bounds = vec2( hitBox( { orig: vOrigin, dir: rayDir } ) ).toVar(); bounds.x.greaterThan( bounds.y ).discard(); bounds.assign( vec2( max( bounds.x, 0.0 ), bounds.y ) ); - const p = property( 'vec3', 'p' ).assign( vOrigin.add( bounds.x.mul( rayDir ) ) ); - const inc = property( 'vec3', 'inc' ).assign( vec3( rayDir.abs().reciprocal() ) ); - const delta = property( 'float', 'delta' ).assign( min( inc.x, min( inc.y, inc.z ) ) ); + const p = vec3( vOrigin.add( bounds.x.mul( rayDir ) ) ).toVar(); + const inc = vec3( rayDir.abs().reciprocal() ).toVar(); + const delta = float( min( inc.x, min( inc.y, inc.z ) ) ).toVar( 'delta' ); // used 'delta' name in loop delta.divAssign( materialReference( 'steps', 'float' ) ); - const ac = property( 'vec4', 'ac' ).assign( vec4( materialReference( 'base', 'color' ), 0.0 ) ); + const ac = vec4( materialReference( 'base', 'color' ), 0.0 ).toVar(); Loop( { type: 'float', start: bounds.x, end: bounds.y, update: '+= delta' }, () => { From 42f2169b68ff04bcf406818dcf94cf350bfd9bca Mon Sep 17 00:00:00 2001 From: sunag Date: Wed, 25 Sep 2024 16:56:59 -0300 Subject: [PATCH 2/3] cleanup --- src/nodes/gpgpu/ComputeBuiltinNode.js | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/nodes/gpgpu/ComputeBuiltinNode.js b/src/nodes/gpgpu/ComputeBuiltinNode.js index e2312095930585..bf3213a9d21f47 100644 --- a/src/nodes/gpgpu/ComputeBuiltinNode.js +++ b/src/nodes/gpgpu/ComputeBuiltinNode.js @@ -39,8 +39,6 @@ class ComputeBuiltinNode extends Node { getBuiltinName( /*builder*/ ) { - console.log( this._builtinName ); - return this._builtinName; } From a2e8de3b8c98984e0aaa78485e3b7db7b3937b5d Mon Sep 17 00:00:00 2001 From: sunag Date: Wed, 25 Sep 2024 17:02:51 -0300 Subject: [PATCH 3/3] NodeBuilder: Introduce `addFlowCodeHierarchy()` --- src/nodes/accessors/StorageTextureNode.js | 2 +- src/nodes/accessors/Texture3DNode.js | 2 +- src/nodes/accessors/TextureNode.js | 2 +- src/nodes/code/ExpressionNode.js | 2 +- src/nodes/core/AssignNode.js | 6 +-- src/nodes/core/BypassNode.js | 2 +- src/nodes/core/Node.js | 4 ++ src/nodes/core/NodeBuilder.js | 51 ++++++++++++++++++- src/nodes/core/OutputStructNode.js | 2 +- src/nodes/core/TempNode.js | 2 +- src/nodes/core/VarNode.js | 2 +- src/nodes/gpgpu/AtomicFunctionNode.js | 4 +- src/nodes/gpgpu/BarrierNode.js | 2 +- src/nodes/gpgpu/ComputeNode.js | 2 +- src/nodes/math/ConditionalNode.js | 19 +++++-- src/nodes/utils/FlipNode.js | 2 +- .../webgl-fallback/nodes/GLSLNodeBuilder.js | 4 +- 17 files changed, 88 insertions(+), 22 deletions(-) diff --git a/src/nodes/accessors/StorageTextureNode.js b/src/nodes/accessors/StorageTextureNode.js index 033d57b275034e..e46780fe08c7c2 100644 --- a/src/nodes/accessors/StorageTextureNode.js +++ b/src/nodes/accessors/StorageTextureNode.js @@ -86,7 +86,7 @@ class StorageTextureNode extends TextureNode { const snippet = builder.generateTextureStore( builder, textureProperty, uvSnippet, storeSnippet ); - builder.addLineFlowCode( snippet ); + builder.addLineFlowCode( snippet, this ); } diff --git a/src/nodes/accessors/Texture3DNode.js b/src/nodes/accessors/Texture3DNode.js index 5543d0f24fc2c9..2bad0f3a42121c 100644 --- a/src/nodes/accessors/Texture3DNode.js +++ b/src/nodes/accessors/Texture3DNode.js @@ -5,7 +5,7 @@ const normal = Fn( ( { texture, uv } ) => { const epsilon = 0.0001; - const ret = vec3().temp(); + const ret = vec3().toVar(); If( uv.x.lessThan( epsilon ), () => { diff --git a/src/nodes/accessors/TextureNode.js b/src/nodes/accessors/TextureNode.js index 586a95c089cbaf..a67b00bcf68369 100644 --- a/src/nodes/accessors/TextureNode.js +++ b/src/nodes/accessors/TextureNode.js @@ -277,7 +277,7 @@ class TextureNode extends UniformNode { const snippet = this.generateSnippet( builder, textureProperty, uvSnippet, levelSnippet, biasSnippet, depthSnippet, compareSnippet, gradSnippet ); - builder.addLineFlowCode( `${propertyName} = ${snippet}` ); + builder.addLineFlowCode( `${propertyName} = ${snippet}`, this ); nodeData.snippet = snippet; nodeData.propertyName = propertyName; diff --git a/src/nodes/code/ExpressionNode.js b/src/nodes/code/ExpressionNode.js index f2cc0b31ba23ae..11cb38e6d4a09d 100644 --- a/src/nodes/code/ExpressionNode.js +++ b/src/nodes/code/ExpressionNode.js @@ -24,7 +24,7 @@ class ExpressionNode extends Node { if ( type === 'void' ) { - builder.addLineFlowCode( snippet ); + builder.addLineFlowCode( snippet, this ); } else { diff --git a/src/nodes/core/AssignNode.js b/src/nodes/core/AssignNode.js index 5b6ccf761fac29..ee4e0f2d2e31c3 100644 --- a/src/nodes/core/AssignNode.js +++ b/src/nodes/core/AssignNode.js @@ -80,7 +80,7 @@ class AssignNode extends TempNode { const sourceVar = builder.getVarFromNode( this, null, targetType ); const sourceProperty = builder.getPropertyName( sourceVar ); - builder.addLineFlowCode( `${ sourceProperty } = ${ source }` ); + builder.addLineFlowCode( `${ sourceProperty } = ${ source }`, this ); const targetRoot = targetNode.node.context( { assign: true } ).build( builder ); @@ -88,7 +88,7 @@ class AssignNode extends TempNode { const component = targetNode.components[ i ]; - builder.addLineFlowCode( `${ targetRoot }.${ component } = ${ sourceProperty }[ ${ i } ]` ); + builder.addLineFlowCode( `${ targetRoot }.${ component } = ${ sourceProperty }[ ${ i } ]`, this ); } @@ -104,7 +104,7 @@ class AssignNode extends TempNode { if ( output === 'void' || sourceType === 'void' ) { - builder.addLineFlowCode( snippet ); + builder.addLineFlowCode( snippet, this ); if ( output !== 'void' ) { diff --git a/src/nodes/core/BypassNode.js b/src/nodes/core/BypassNode.js index 68e7187f2e1bd9..9e7e6aff7e5cb9 100644 --- a/src/nodes/core/BypassNode.js +++ b/src/nodes/core/BypassNode.js @@ -32,7 +32,7 @@ class BypassNode extends Node { if ( snippet !== '' ) { - builder.addLineFlowCode( snippet ); + builder.addLineFlowCode( snippet, this ); } diff --git a/src/nodes/core/Node.js b/src/nodes/core/Node.js index 6d510db9c25c77..43c857322b8fba 100644 --- a/src/nodes/core/Node.js +++ b/src/nodes/core/Node.js @@ -361,6 +361,10 @@ class Node extends EventDispatcher { nodeData.snippet = result; + } else if ( nodeData.flowCodes !== undefined && builder.context.nodeBlock !== undefined ) { + + builder.addFlowCodeHierarchy( this, builder.context.nodeBlock ); + } result = builder.format( result, type, output ); diff --git a/src/nodes/core/NodeBuilder.js b/src/nodes/core/NodeBuilder.js index e8ab3c9a1f33e2..83aec557258982 100644 --- a/src/nodes/core/NodeBuilder.js +++ b/src/nodes/core/NodeBuilder.js @@ -941,10 +941,59 @@ class NodeBuilder { } - addLineFlowCode( code ) { + addFlowCodeHierarchy( node, nodeBlock ) { + + const { flowCodes, flowCodeBlock } = this.getDataFromNode( node ); + + let needsFlowCode = true; + let nodeBlockHierarchy = nodeBlock; + + while ( nodeBlockHierarchy ) { + + if ( flowCodeBlock.get( nodeBlockHierarchy ) === true ) { + + needsFlowCode = false; + break; + + } + + nodeBlockHierarchy = this.getDataFromNode( nodeBlockHierarchy ).parentNodeBlock; + + } + + if ( needsFlowCode ) { + + for ( const flowCode of flowCodes ) { + + this.addLineFlowCode( flowCode ); + + } + + } + + } + + addLineFlowCodeBlock( node, code, nodeBlock ) { + + const nodeData = this.getDataFromNode( node ); + const flowCodes = nodeData.flowCodes || ( nodeData.flowCodes = [] ); + const codeBlock = nodeData.flowCodeBlock || ( nodeData.flowCodeBlock = new WeakMap() ); + + flowCodes.push( code ); + codeBlock.set( nodeBlock, true ); + + } + + addLineFlowCode( code, node = null ) { if ( code === '' ) return this; + if ( node !== null && this.context.nodeBlock ) { + + this.addLineFlowCodeBlock( node, code, this.context.nodeBlock ); + + } + code = this.tab + code; if ( ! /;\s*$/.test( code ) ) { diff --git a/src/nodes/core/OutputStructNode.js b/src/nodes/core/OutputStructNode.js index 314f01e76bb7e1..a0db27b64dcca5 100644 --- a/src/nodes/core/OutputStructNode.js +++ b/src/nodes/core/OutputStructNode.js @@ -48,7 +48,7 @@ class OutputStructNode extends Node { const snippet = members[ i ].build( builder, output ); - builder.addLineFlowCode( `${ structPrefix }m${ i } = ${ snippet }` ); + builder.addLineFlowCode( `${ structPrefix }m${ i } = ${ snippet }`, this ); } diff --git a/src/nodes/core/TempNode.js b/src/nodes/core/TempNode.js index ba1dd7c8e77ab4..4027dcd9a29027 100644 --- a/src/nodes/core/TempNode.js +++ b/src/nodes/core/TempNode.js @@ -42,7 +42,7 @@ class TempNode extends Node { const nodeVar = builder.getVarFromNode( this, null, type ); const propertyName = builder.getPropertyName( nodeVar ); - builder.addLineFlowCode( `${propertyName} = ${snippet}` ); + builder.addLineFlowCode( `${propertyName} = ${snippet}`, this ); nodeData.snippet = snippet; nodeData.propertyName = propertyName; diff --git a/src/nodes/core/VarNode.js b/src/nodes/core/VarNode.js index b3399bfd3b541e..db31cc3de101d4 100644 --- a/src/nodes/core/VarNode.js +++ b/src/nodes/core/VarNode.js @@ -44,7 +44,7 @@ class VarNode extends Node { const snippet = node.build( builder, nodeVar.type ); - builder.addLineFlowCode( `${propertyName} = ${snippet}` ); + builder.addLineFlowCode( `${propertyName} = ${snippet}`, this ); return propertyName; diff --git a/src/nodes/gpgpu/AtomicFunctionNode.js b/src/nodes/gpgpu/AtomicFunctionNode.js index 48cab8f9ed5827..682b4367d98ed5 100644 --- a/src/nodes/gpgpu/AtomicFunctionNode.js +++ b/src/nodes/gpgpu/AtomicFunctionNode.js @@ -54,11 +54,11 @@ class AtomicFunctionNode extends TempNode { const varSnippet = this.storeNode.build( builder, inputType ); - builder.addLineFlowCode( `${varSnippet} = ${methodSnippet}` ); + builder.addLineFlowCode( `${varSnippet} = ${methodSnippet}`, this ); } else { - builder.addLineFlowCode( methodSnippet ); + builder.addLineFlowCode( methodSnippet, this ); } diff --git a/src/nodes/gpgpu/BarrierNode.js b/src/nodes/gpgpu/BarrierNode.js index 683e8d6472666a..f613c2656a4b52 100644 --- a/src/nodes/gpgpu/BarrierNode.js +++ b/src/nodes/gpgpu/BarrierNode.js @@ -22,7 +22,7 @@ class BarrierNode extends Node { } else { - builder.addLineFlowCode( `${scope}Barrier()` ); + builder.addLineFlowCode( `${scope}Barrier()`, this ); } diff --git a/src/nodes/gpgpu/ComputeNode.js b/src/nodes/gpgpu/ComputeNode.js index 29ebe4a9ce5803..2678b76cd2d3e3 100644 --- a/src/nodes/gpgpu/ComputeNode.js +++ b/src/nodes/gpgpu/ComputeNode.js @@ -72,7 +72,7 @@ class ComputeNode extends Node { if ( snippet !== '' ) { - builder.addLineFlowCode( snippet ); + builder.addLineFlowCode( snippet, this ); } diff --git a/src/nodes/math/ConditionalNode.js b/src/nodes/math/ConditionalNode.js index 716cfa9d9c53b7..6b312b63869cfc 100644 --- a/src/nodes/math/ConditionalNode.js +++ b/src/nodes/math/ConditionalNode.js @@ -43,10 +43,23 @@ class ConditionalNode extends Node { setup( builder ) { + const condNode = this.condNode.cache(); + const ifNode = this.ifNode.cache(); + const elseNode = this.elseNode ? this.elseNode.cache() : null; + + // + + const currentNodeBlock = builder.context.nodeBlock; + + builder.getDataFromNode( ifNode ).parentNodeBlock = currentNodeBlock; + if ( elseNode !== null ) builder.getDataFromNode( elseNode ).parentNodeBlock = currentNodeBlock; + + // + const properties = builder.getNodeProperties( this ); - properties.condNode = this.condNode.cache(); - properties.ifNode = this.ifNode.cache(); - properties.elseNode = this.elseNode ? this.elseNode.cache() : null; + properties.condNode = condNode; + properties.ifNode = ifNode.context( { nodeBlock: ifNode } ); + properties.elseNode = elseNode ? elseNode.context( { nodeBlock: elseNode } ) : null; } diff --git a/src/nodes/utils/FlipNode.js b/src/nodes/utils/FlipNode.js index 2999357cb184b8..235ca49f6bbf12 100644 --- a/src/nodes/utils/FlipNode.js +++ b/src/nodes/utils/FlipNode.js @@ -34,7 +34,7 @@ class FlipNode extends TempNode { const sourceCache = builder.getVarFromNode( this ); const sourceProperty = builder.getPropertyName( sourceCache ); - builder.addLineFlowCode( sourceProperty + ' = ' + sourceSnippet ); + builder.addLineFlowCode( sourceProperty + ' = ' + sourceSnippet, this ); const length = builder.getTypeLength( sourceType ); const snippetValues = []; diff --git a/src/renderers/webgl-fallback/nodes/GLSLNodeBuilder.js b/src/renderers/webgl-fallback/nodes/GLSLNodeBuilder.js index 79263da7379615..01e14f964bc7bf 100644 --- a/src/renderers/webgl-fallback/nodes/GLSLNodeBuilder.js +++ b/src/renderers/webgl-fallback/nodes/GLSLNodeBuilder.js @@ -232,7 +232,7 @@ ${ flowData.code } this.getVarFromNode( node, propertySizeName, 'uint' ); - this.addLineFlowCode( `${ propertySizeName } = uint( textureSize( ${ textureName }, 0 ).x )` ); + this.addLineFlowCode( `${ propertySizeName } = uint( textureSize( ${ textureName }, 0 ).x )`, storageArrayElementNode ); bufferNodeData.propertySizeName = propertySizeName; @@ -262,7 +262,7 @@ ${ flowData.code } } - this.addLineFlowCode( `${ propertyName } = ${prefix}(${ snippet })${channel}` ); + this.addLineFlowCode( `${ propertyName } = ${prefix}(${ snippet })${channel}`, storageArrayElementNode ); elementNodeData.propertyName = propertyName;