Browse Source

Refactor `VarNode` (#26821)

* Refactor NodeBuilder.getVarFromNode()

* Refactor interaction of ShaderNode and StackNode

* Refactor VarNode.assign()

* Refactor Node.getChildren() and Node.traverse()

* Fix semicolon
Levi Pesin 1 năm trước cách đây
mục cha
commit
44516609c6

+ 3 - 3
examples/jsm/nodes/accessors/CubeTextureNode.js

@@ -54,7 +54,6 @@ class CubeTextureNode extends TextureNode {
 
 		} else {
 
-			const nodeType = this.getNodeType( builder );
 			const nodeData = builder.getDataFromNode( this );
 
 			let propertyName = nodeData.propertyName;
@@ -64,7 +63,7 @@ class CubeTextureNode extends TextureNode {
 				const cubeUV = vec3( uvNode.x.negate(), uvNode.yz );
 				const uvSnippet = cubeUV.build( builder, 'vec3' );
 
-				const nodeVar = builder.getVarFromNode( this, 'vec4' );
+				const nodeVar = builder.getVarFromNode( this );
 
 				propertyName = builder.getPropertyName( nodeVar );
 
@@ -94,6 +93,7 @@ class CubeTextureNode extends TextureNode {
 			}
 
 			let snippet = propertyName;
+			const nodeType = this.getNodeType( builder );
 
 			if ( builder.needsColorSpaceToLinear( this.value ) ) {
 
@@ -101,7 +101,7 @@ class CubeTextureNode extends TextureNode {
 
 			}
 
-			return builder.format( snippet, 'vec4', output );
+			return builder.format( snippet, nodeType, output );
 
 		}
 

+ 2 - 2
examples/jsm/nodes/accessors/TextureNode.js

@@ -140,7 +140,6 @@ class TextureNode extends UniformNode {
 
 		} else {
 
-			const nodeType = this.getNodeType( builder );
 			const nodeData = builder.getDataFromNode( this );
 
 			let propertyName = nodeData.propertyName;
@@ -148,7 +147,7 @@ class TextureNode extends UniformNode {
 			if ( propertyName === undefined ) {
 
 				const uvSnippet = uvNode.build( builder, 'vec2' );
-				const nodeVar = builder.getVarFromNode( this, nodeType );
+				const nodeVar = builder.getVarFromNode( this );
 
 				propertyName = builder.getPropertyName( nodeVar );
 
@@ -184,6 +183,7 @@ class TextureNode extends UniformNode {
 			}
 
 			let snippet = propertyName;
+			const nodeType = this.getNodeType( builder );
 
 			if ( builder.needsColorSpaceToLinear( this.value ) ) {
 

+ 7 - 12
examples/jsm/nodes/core/Node.js

@@ -56,14 +56,9 @@ class Node extends EventDispatcher {
 
 		const self = this;
 
-		for ( const { property, index, childNode } of getNodeChildren( this ) ) {
+		for ( const { childNode } of getNodeChildren( this ) ) {
 
-			yield { childNode, replaceNode( node ) {
-
-				if ( index === undefined ) self[ property ] = node;
-				else self[ property ][ index ] = node;
-
-			} };
+			yield childNode;
 
 		}
 
@@ -75,13 +70,13 @@ class Node extends EventDispatcher {
 
 	}
 
-	traverse( callback, replaceNode = null ) {
+	traverse( callback ) {
 
-		callback( this, replaceNode );
+		callback( this );
 
-		for ( const { childNode, replaceNode } of this.getChildren() ) {
+		for ( const childNode of this.getChildren() ) {
 
-			childNode.traverse( callback, replaceNode );
+			childNode.traverse( callback );
 
 		}
 
@@ -138,7 +133,7 @@ class Node extends EventDispatcher {
 
 		const nodeProperties = builder.getNodeProperties( this );
 
-		for ( const { childNode } of this.getChildren() ) {
+		for ( const childNode of this.getChildren() ) {
 
 			nodeProperties[ '_node' + childNode.id ] = childNode;
 

+ 4 - 3
examples/jsm/nodes/core/NodeBuilder.js

@@ -676,7 +676,7 @@ class NodeBuilder {
 
 	}
 
-	getVarFromNode( node, type, shaderStage = this.shaderStage ) {
+	getVarFromNode( node, name = null, type = node.getNodeType( this ), shaderStage = this.shaderStage ) {
 
 		const nodeData = this.getDataFromNode( node, shaderStage );
 
@@ -685,9 +685,10 @@ class NodeBuilder {
 		if ( nodeVar === undefined ) {
 
 			const vars = this.vars[ shaderStage ];
-			const index = vars.length;
 
-			nodeVar = new NodeVar( 'nodeVar' + index, type );
+			if ( name === null ) name = 'nodeVar' + vars.length;
+
+			nodeVar = new NodeVar( name, type );
 
 			vars.push( nodeVar );
 

+ 1 - 1
examples/jsm/nodes/core/OutputStructNode.js

@@ -32,7 +32,7 @@ class OutputStructNode extends Node {
 
 	generate( builder, output ) {
 
-		const nodeVar = builder.getVarFromNode( this, this.nodeType );
+		const nodeVar = builder.getVarFromNode( this );
 		nodeVar.isOutputStructVar = true;
 
 		const propertyName = builder.getPropertyName( nodeVar );

+ 1 - 10
examples/jsm/nodes/core/PropertyNode.js

@@ -27,16 +27,7 @@ class PropertyNode extends Node {
 
 	generate( builder ) {
 
-		const nodeVary = builder.getVarFromNode( this, this.getNodeType( builder ) );
-		const name = this.name;
-
-		if ( name !== null ) {
-
-			nodeVary.name = name;
-
-		}
-
-		return builder.getPropertyName( nodeVary );
+		return builder.getPropertyName( builder.getVarFromNode( this, this.name ) );
 
 	}
 

+ 1 - 33
examples/jsm/nodes/core/StackNode.js

@@ -1,11 +1,8 @@
 import Node, { addNodeClass } from './Node.js';
-import { assign } from '../math/OperatorNode.js';
 import { bypass } from '../core/BypassNode.js';
 import { expression } from '../code/ExpressionNode.js';
 import { cond } from '../math/CondNode.js';
-import { loop } from '../utils/LoopNode.js';
-import SetNode from '../utils/SetNode.js';
-import { ShaderNode, nodeProxy, nodeObject } from '../shadernode/ShaderNode.js';
+import { ShaderNode, nodeProxy } from '../shadernode/ShaderNode.js';
 
 class StackNode extends Node {
 
@@ -67,35 +64,6 @@ class StackNode extends Node {
 
 	}
 
-	assign( targetNode, sourceValue ) {
-
-		sourceValue = nodeObject( sourceValue );
-
-		if ( targetNode.isSplitNode ) {
-
-			sourceValue = new SetNode( targetNode.node, targetNode.components, sourceValue );
-			targetNode = targetNode.node;
-
-		}
-
-		if ( targetNode.isPropertyNode !== true && targetNode.isVarNode !== true && targetNode.isArrayElementNode !== true && targetNode.isVaryingNode !== true ) {
-
-			console.error( 'THREE.TSL: Invalid assign, target must be a property or variable.', targetNode.getSelf() );
-
-			//return this;
-
-		}
-
-		return this.add( assign( targetNode, sourceValue ) );
-
-	}
-
-	loop( ...params ) {
-
-		return this.add( loop( ...params ) );
-
-	}
-
 	build( builder, ...params ) {
 
 		for ( const node of this.nodes ) {

+ 1 - 1
examples/jsm/nodes/core/TempNode.js

@@ -33,7 +33,7 @@ class TempNode extends Node {
 
 				const snippet = super.build( builder, type );
 
-				const nodeVar = builder.getVarFromNode( this, type );
+				const nodeVar = builder.getVarFromNode( this, null, type );
 				const propertyName = builder.getPropertyName( nodeVar );
 
 				builder.addLineFlowCode( `${propertyName} = ${snippet}` );

+ 3 - 12
examples/jsm/nodes/core/VarNode.js

@@ -10,8 +10,6 @@ class VarNode extends Node {
 		this.node = node;
 		this.name = name;
 
-		this.isVarNode = true;
-
 	}
 
 	isGlobal() {
@@ -36,19 +34,12 @@ class VarNode extends Node {
 
 		const { node, name } = this;
 
-		const type = builder.getVectorType( this.getNodeType( builder ) );
-
-		const snippet = node.build( builder, type );
-		const nodeVar = builder.getVarFromNode( this, type );
-
-		if ( name !== null ) {
-
-			nodeVar.name = name;
-
-		}
+		const nodeVar = builder.getVarFromNode( this, name, builder.getVectorType( this.getNodeType( builder ) ) );
 
 		const propertyName = builder.getPropertyName( nodeVar );
 
+		const snippet = node.build( builder, nodeVar.type );
+
 		builder.addLineFlowCode( `${propertyName} = ${snippet}` );
 
 		return propertyName;

+ 1 - 1
examples/jsm/nodes/lighting/HemisphereLightNode.js

@@ -42,7 +42,7 @@ class HemisphereLightNode extends AnalyticLightNode {
 
 		const irradiance = mix( groundColorNode, colorNode, hemiDiffuseWeight );
 
-		builder.context.irradiance.addAssign( irradiance );
+		builder.stack.addAssign( builder.context.irradiance, irradiance );
 
 	}
 

+ 1 - 1
examples/jsm/nodes/shadernode/ShaderNode.js

@@ -38,7 +38,7 @@ const shaderNodeHandler = {
 
 				const nodeElement = NodeElements.get( prop );
 
-				return ( ...params ) => nodeElement( nodeObj, ...params );
+				return node.isStackNode ? ( ...params ) => nodeObj.add( nodeElement( ...params ) ) : ( ...params ) => nodeElement( nodeObj, ...params );
 
 			} else if ( prop === 'self' ) {