shaderCodeNode.ts 2.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465
  1. import { ProcessingOptions } from './shaderProcessingOptions';
  2. import { StringTools } from '../../Misc/stringTools';
  3. /** @hidden */
  4. export class ShaderCodeNode {
  5. line: string;
  6. children: ShaderCodeNode[] = [];
  7. additionalDefineKey?: string;
  8. additionalDefineValue?: string;
  9. isValid(preprocessors: { [key: string]: string }): boolean {
  10. return true;
  11. }
  12. process(preprocessors: { [key: string]: string }, options: ProcessingOptions): string {
  13. let result = "";
  14. if (this.line) {
  15. let value: string = this.line;
  16. let processor = options.processor;
  17. if (processor) {
  18. if (processor.attributeProcessor && StringTools.StartsWith(this.line, "attribute")) {
  19. value = processor.attributeProcessor(this.line);
  20. } else if (processor.varyingProcessor && StringTools.StartsWith(this.line, "varying")) {
  21. value = processor.varyingProcessor(this.line, options.isFragment);
  22. } else if ((processor.uniformProcessor || processor.uniformBufferProcessor) && StringTools.StartsWith(this.line, "uniform")) {
  23. let regex = /uniform (.+) (.+)/;
  24. if (regex.test(this.line)) { // uniform
  25. if (processor.uniformProcessor) {
  26. value = processor.uniformProcessor(this.line, options.isFragment);
  27. }
  28. } else { // Uniform buffer
  29. if (processor.uniformBufferProcessor) {
  30. value = processor.uniformBufferProcessor(this.line, options.isFragment);
  31. options.lookForClosingBracketForUniformBuffer = true;
  32. }
  33. }
  34. }
  35. if (processor.endOfUniformBufferProcessor) {
  36. if (options.lookForClosingBracketForUniformBuffer && this.line.indexOf("}") !== -1) {
  37. options.lookForClosingBracketForUniformBuffer = false;
  38. value = processor.endOfUniformBufferProcessor(this.line, options.isFragment);
  39. }
  40. }
  41. if (processor.lineProcessor) {
  42. value = processor.lineProcessor(value, options.isFragment);
  43. }
  44. }
  45. result += value + "\r\n";
  46. }
  47. this.children.forEach((child) => {
  48. result += child.process(preprocessors, options);
  49. });
  50. if (this.additionalDefineKey) {
  51. preprocessors[this.additionalDefineKey] = this.additionalDefineValue || "true";
  52. }
  53. return result;
  54. }
  55. }