OutputStructNode.js 1.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859
  1. import Node, { addNodeClass } from './Node.js';
  2. import StructTypeNode from './StructTypeNode.js';
  3. import { nodeProxy } from '../shadernode/ShaderNode.js';
  4. class OutputStructNode extends Node {
  5. constructor( ...members ) {
  6. super();
  7. this.members = members;
  8. this.isOutputStructNode = true;
  9. }
  10. setup( builder ) {
  11. super.setup( builder );
  12. const members = this.members;
  13. const types = [];
  14. for ( let i = 0; i < members.length; i ++ ) {
  15. types.push( members[ i ].getNodeType( builder ) );
  16. }
  17. this.nodeType = builder.getStructTypeFromNode( new StructTypeNode( types ) ).name;
  18. }
  19. generate( builder, output ) {
  20. const propertyName = builder.getOutputStructName();
  21. const members = this.members;
  22. const structPrefix = propertyName !== '' ? propertyName + '.' : '';
  23. for ( let i = 0; i < members.length; i ++ ) {
  24. const snippet = members[ i ].build( builder, output );
  25. builder.addLineFlowCode( `${ structPrefix }m${ i } = ${ snippet }` );
  26. }
  27. return propertyName;
  28. }
  29. }
  30. export default OutputStructNode;
  31. export const outputStruct = nodeProxy( OutputStructNode );
  32. addNodeClass( 'OutputStructNode', OutputStructNode );