Browse Source

TSL: Fix WGSL Functions using wrong type (#28690)

* fix wgslNodeFunction layout type overriding to float

* Move outputType to WGSLNodeFunction

---------

Co-authored-by: sunag <[email protected]>
Renaud Rohlinger 1 year ago
parent
commit
7ca25bd0b6
1 changed files with 9 additions and 6 deletions
  1. 9 6
      examples/jsm/renderers/webgpu/nodes/WGSLNodeFunction.js

+ 9 - 6
examples/jsm/renderers/webgpu/nodes/WGSLNodeFunction.js

@@ -1,7 +1,7 @@
 import NodeFunction from '../../../nodes/core/NodeFunction.js';
 import NodeFunctionInput from '../../../nodes/core/NodeFunctionInput.js';
 
-const declarationRegexp = /^[fn]*\s*([a-z_0-9]+)?\s*\(([\s\S]*?)\)\s*[\-\>]*\s*([a-z_0-9]+)?/i;
+const declarationRegexp = /^[fn]*\s*([a-z_0-9]+)?\s*\(([\s\S]*?)\)\s*[\-\>]*\s*([a-z_0-9]+(?:<[\s\S]+?>)?)/i;
 const propertiesRegexp = /([a-z_0-9]+)\s*:\s*([a-z_0-9]+(?:<[\s\S]+?>)?)/ig;
 
 const wgslTypeLib = {
@@ -97,16 +97,18 @@ const parse = ( source ) => {
 		}
 
 		const blockCode = source.substring( declaration[ 0 ].length );
+		const outputType = declaration[ 3 ] || 'void';
 
 		const name = declaration[ 1 ] !== undefined ? declaration[ 1 ] : '';
-		const type = declaration[ 3 ] || 'void';
+		const type = wgslTypeLib[ outputType ] || outputType;
 
 		return {
 			type,
 			inputs,
 			name,
 			inputsCode,
-			blockCode
+			blockCode,
+			outputType
 		};
 
 	} else {
@@ -121,20 +123,21 @@ class WGSLNodeFunction extends NodeFunction {
 
 	constructor( source ) {
 
-		const { type, inputs, name, inputsCode, blockCode } = parse( source );
+		const { type, inputs, name, inputsCode, blockCode, outputType } = parse( source );
 
 		super( type, inputs, name );
 
 		this.inputsCode = inputsCode;
 		this.blockCode = blockCode;
+		this.outputType = outputType;
 
 	}
 
 	getCode( name = this.name ) {
 
-		const type = this.type !== 'void' ? '-> ' + this.type : '';
+		const outputType = this.outputType !== 'void' ? '-> ' + this.outputType : '';
 
-		return `fn ${ name } ( ${ this.inputsCode.trim() } ) ${ type }` + this.blockCode;
+		return `fn ${ name } ( ${ this.inputsCode.trim() } ) ${ outputType }` + this.blockCode;
 
 	}