1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889 |
- import NodeFunction from '../core/NodeFunction.js';
- import NodeFunctionInput from '../core/NodeFunctionInput.js';
- const declarationRegexp = /^fn\s*([a-z_0-9]+)?\s*\(([\s\S]*?)\)\s*\-\>\s*([a-z_0-9]+)?/i;
- const propertiesRegexp = /[a-z_0-9]+/ig;
- const parse = ( source ) => {
- source = source.trim();
- const declaration = source.match( declarationRegexp );
- if ( declaration !== null && declaration.length === 4 ) {
- // tokenizer
- const inputsCode = declaration[ 2 ];
- const propsMatches = [];
- let nameMatch = null;
- while ( ( nameMatch = propertiesRegexp.exec( inputsCode ) ) !== null ) {
- propsMatches.push( nameMatch );
- }
- // parser
- const inputs = [];
- let i = 0;
- while ( i < propsMatches.length ) {
- const name = propsMatches[ i ++ ][ 0 ];
- const type = propsMatches[ i ++ ][ 0 ];
- propsMatches[ i ++ ][ 0 ]; // precision
- inputs.push( new NodeFunctionInput( type, name ) );
- }
- //
- const blockCode = source.substring( declaration[ 0 ].length );
- const name = declaration[ 1 ] !== undefined ? declaration[ 1 ] : '';
- const type = declaration[ 3 ];
- return {
- type,
- inputs,
- name,
- inputsCode,
- blockCode
- };
- } else {
- throw new Error( 'FunctionNode: Function is not a WGSL code.' );
- }
- };
- class WGSLNodeFunction extends NodeFunction {
- constructor( source ) {
- const { type, inputs, name, inputsCode, blockCode } = parse( source );
- super( type, inputs, name );
- this.inputsCode = inputsCode;
- this.blockCode = blockCode;
- }
- getCode( name = this.name ) {
- return `fn ${ name } ( ${ this.inputsCode.trim() } ) -> ${ this.type }` + this.blockCode;
- }
- }
- export default WGSLNodeFunction;
|