浏览代码

Nodes: Move ShaderNode internals to a Node class (#24961)

* Move ShaderNode internals to a Node class

* Fix

* fix redundant build

* Example: Material ShaderNode (no inputs)

* update var name

Co-authored-by: sunag <[email protected]>
Levi Pesin 2 年之前
父节点
当前提交
044d7b292e
共有 2 个文件被更改,包括 37 次插入12 次删除
  1. 25 12
      examples/jsm/nodes/shadernode/ShaderNode.js
  2. 12 0
      examples/webgpu_materials.html

+ 25 - 12
examples/jsm/nodes/shadernode/ShaderNode.js

@@ -1,3 +1,4 @@
+import Node from '../core/Node.js';
 import ArrayElementNode from '../utils/ArrayElementNode.js';
 import ConvertNode from '../utils/ConvertNode.js';
 import JoinNode from '../utils/JoinNode.js';
@@ -147,31 +148,43 @@ const ShaderNodeImmutable = function ( NodeClass, ...params ) {
 
 };
 
-const ShaderNodeScript = function ( jsFunc ) {
+class ShaderNodeInternal extends Node {
+
+	constructor( jsFunc ) {
 
-	// @TODO: Move this to Node extended class
+		super();
 
-	const self = {
+		this._jsFunc = jsFunc;
 
-		build: ( builder ) => {
+	}
 
-			self.call( {}, builder );
+	call( inputs, builder ) {
 
-			return '';
+		inputs = nodeObjects( inputs );
+
+		return nodeObject( this._jsFunc( inputs, builder ) );
+
+	}
 
-		},
+	generate( builder, output ) {
 
-		call: ( inputs, builder ) => {
+		const nodeCall = this.call( {}, builder );
 
-			inputs = nodeObjects( inputs );
+		if ( nodeCall === undefined ) {
 
-			return nodeObject( jsFunc( inputs, builder ) );
+			return '';
 
 		}
 
-	};
+		return builder.format( nodeCall.build( builder ), nodeCall.getNodeType( builder ), output );
+
+	}
+
+}
+
+const ShaderNodeScript = function ( jsFunc ) {
 
-	return self;
+	return new ShaderNodeInternal( jsFunc );
 
 };
 

+ 12 - 0
examples/webgpu_materials.html

@@ -144,6 +144,18 @@
 				material.colorNode = desaturateShaderNode.call( { color: new Nodes.TextureNode( texture ) } );
 				materials.push( material );
 
+				// Custom ShaderNode(no inputs) > Approach 2
+
+				const desaturateNoInputsShaderNode = new ShaderNode( () => {
+
+					return dot( vec3( 0.299, 0.587, 0.114 ), Nodes.texture( texture ).xyz );
+
+				} );
+
+				material = new Nodes.MeshBasicNodeMaterial();
+				material.colorNode = desaturateNoInputsShaderNode;
+				materials.push( material );
+
 				// Custom WGSL ( desaturate filter )
 
 				const desaturateWGSLNode = new Nodes.FunctionNode( `