WebGPUNodeBuilder.js 1.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889
  1. import { NodeBuilder } from '../../nodes/core/NodeBuilder.js';
  2. class WebGPUNodeBuilder extends NodeBuilder {
  3. constructor() {
  4. super();
  5. }
  6. parseDefines( code, defines ) {
  7. // use regex maybe for security?
  8. let versionStrIndex = code.indexOf("\n");
  9. let shaderCode = code.substr( 0, versionStrIndex ) + "\n";
  10. const names = Object.keys( defines );
  11. if (names.length) {
  12. shaderCode += "\n#define NODE\n";
  13. for ( let i = 0; i < names.length; i ++ ) {
  14. let name = names[i];
  15. shaderCode += `#define NODE_${name} ${defines[name]}\n`;
  16. }
  17. }
  18. shaderCode += code.substr( versionStrIndex );
  19. return shaderCode;
  20. }
  21. parse( vertexShader, fragmentShader ) {
  22. const material = this.material;
  23. const nodesSlots = [];
  24. const defines = [];
  25. let i, slot;
  26. if ( material.isMeshBasicMaterial ) {
  27. if ( material.color.isNode ) {
  28. slot = { name: 'COLOR', node: material.color, output: 'v3' };
  29. nodesSlots.push( slot );
  30. }
  31. }
  32. for( i = 0; i < nodesSlots.length; i++) {
  33. nodesSlots[i].node.analyze( this );
  34. }
  35. for( i = 0; i < nodesSlots.length; i++) {
  36. slot = nodesSlots[i];
  37. let flowData = slot.node.flow( this, slot.output );
  38. defines[slot.name] = flowData.result;
  39. defines[slot.name + '_CODE'] = flowData.code || '';
  40. }
  41. vertexShader = this.parseDefines( vertexShader, defines );
  42. fragmentShader = this.parseDefines( fragmentShader, defines );
  43. return {
  44. vertexShader,
  45. fragmentShader
  46. };
  47. }
  48. }
  49. export default WebGPUNodeBuilder;