UNPKG

three

Version:

JavaScript 3D library

104 lines (55 loc) 1.59 kB
import { TempNode } from './TempNode.js'; var declarationRegexp = /^struct\s*([a-z_0-9]+)\s*{\s*((.|\n)*?)}/img, propertiesRegexp = /\s*(\w*?)\s*(\w*?)(\=|\;)/img; function StructNode( src ) { TempNode.call( this ); this.parse( src ); } StructNode.prototype = Object.create( TempNode.prototype ); StructNode.prototype.constructor = StructNode; StructNode.prototype.nodeType = "Struct"; StructNode.prototype.getType = function ( builder ) { return builder.getTypeByFormat( this.name ); }; StructNode.prototype.getInputByName = function ( name ) { var i = this.inputs.length; while ( i -- ) { if ( this.inputs[ i ].name === name ) { return this.inputs[ i ]; } } }; StructNode.prototype.generate = function ( builder, output ) { if ( output === 'source' ) { return this.src + ';'; } else { return builder.format( '( ' + this.src + ' )', this.getType( builder ), output ); } }; StructNode.prototype.parse = function ( src ) { this.src = src || ''; this.inputs = []; var declaration = declarationRegexp.exec( this.src ); if ( declaration ) { var properties = declaration[ 2 ], match; while ( match = propertiesRegexp.exec( properties ) ) { this.inputs.push( { type: match[ 1 ], name: match[ 2 ] } ); } this.name = declaration[ 1 ]; } else { this.name = ''; } this.type = this.name; }; StructNode.prototype.toJSON = function ( meta ) { var data = this.getJSONNode( meta ); if ( ! data ) { data = this.createJSONNode( meta ); data.src = this.src; } return data; }; export { StructNode };