OutputStructNode.js 1.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263
  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 nodeVar = builder.getVarFromNode( this );
  21. nodeVar.isOutputStructVar = true;
  22. const propertyName = builder.getPropertyName( nodeVar );
  23. const members = this.members;
  24. const structPrefix = propertyName !== '' ? propertyName + '.' : '';
  25. for ( let i = 0; i < members.length; i ++ ) {
  26. const snippet = members[ i ].build( builder, output );
  27. builder.addLineFlowCode( `${ structPrefix }m${ i } = ${ snippet }` );
  28. }
  29. return propertyName;
  30. }
  31. }
  32. export default OutputStructNode;
  33. export const outputStruct = nodeProxy( OutputStructNode );
  34. addNodeClass( 'OutputStructNode', OutputStructNode );