|
@@ -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;
|
|
|
|
|
|
}
|
|
|
|