@galacean/engine-shaderlab 2.0.0-alpha.24 → 2.0.0-alpha.26

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/browser.js CHANGED
@@ -4,6 +4,12 @@
4
4
  (global = typeof globalThis !== 'undefined' ? globalThis : global || self, factory((global.Galacean = global.Galacean || {}, global.Galacean.ShaderLab = {}), global.Galacean));
5
5
  })(this, (function (exports, engine) { 'use strict';
6
6
 
7
+ function _instanceof(left, right) {
8
+ if (right != null && typeof Symbol !== "undefined" && right[Symbol.hasInstance]) {
9
+ return !!right[Symbol.hasInstance](left);
10
+ } else return left instanceof right;
11
+ }
12
+
7
13
  function _set_prototype_of(o, p) {
8
14
  _set_prototype_of = Object.setPrototypeOf || function setPrototypeOf(o, p) {
9
15
  o.__proto__ = p;
@@ -24,12 +30,6 @@
24
30
  if (superClass) _set_prototype_of(subClass, superClass);
25
31
  }
26
32
 
27
- function _instanceof(left, right) {
28
- if (right != null && typeof Symbol !== "undefined" && right[Symbol.hasInstance]) {
29
- return !!right[Symbol.hasInstance](left);
30
- } else return left instanceof right;
31
- }
32
-
33
33
  function _defineProperties(target, props) {
34
34
  for (var i = 0; i < props.length; i++) {
35
35
  var descriptor = props[i];
@@ -1202,7 +1202,7 @@
1202
1202
  return GSError;
1203
1203
  }(_wrap_native_super(Error));
1204
1204
  GSError.wrappingLineCount = 2;
1205
- var GSErrorName$1 = /*#__PURE__*/ function(GSErrorName) {
1205
+ var GSErrorName = /*#__PURE__*/ function(GSErrorName) {
1206
1206
  GSErrorName["PreprocessorError"] = "PreprocessorError";
1207
1207
  GSErrorName["CompilationError"] = "CompilationError";
1208
1208
  GSErrorName["ScannerError"] = "ScannerError";
@@ -1338,7 +1338,7 @@
1338
1338
  engine.Logger.error(message);
1339
1339
  };
1340
1340
  _proto.reportWarning = function reportWarning(loc, message) {
1341
- engine.Logger.warn(new GSError(GSErrorName$1.CompilationWarn, message, loc, ShaderLab._processingPassText).toString());
1341
+ engine.Logger.warn(new GSError(GSErrorName.CompilationWarn, message, loc, ShaderLab._processingPassText).toString());
1342
1342
  };
1343
1343
  _create_class(SemanticAnalyzer, [
1344
1344
  {
@@ -3183,7 +3183,7 @@
3183
3183
  return item.ident.lexeme === lexeme;
3184
3184
  });
3185
3185
  if (!props.length) {
3186
- return ShaderLabUtils.createGSError("referenced attribute not found: " + lexeme, GSErrorName$1.CompilationError, ShaderLab._processingPassText, ident.location);
3186
+ return ShaderLabUtils.createGSError("referenced attribute not found: " + lexeme, GSErrorName.CompilationError, ShaderLab._processingPassText, ident.location);
3187
3187
  }
3188
3188
  this._referencedAttributeList[lexeme] = props;
3189
3189
  };
@@ -3194,7 +3194,7 @@
3194
3194
  return item.ident.lexeme === lexeme;
3195
3195
  });
3196
3196
  if (!props.length) {
3197
- return ShaderLabUtils.createGSError("referenced varying not found: " + lexeme, GSErrorName$1.CompilationError, ShaderLab._processingPassText, ident.location);
3197
+ return ShaderLabUtils.createGSError("referenced varying not found: " + lexeme, GSErrorName.CompilationError, ShaderLab._processingPassText, ident.location);
3198
3198
  }
3199
3199
  this._referencedVaryingList[lexeme] = props;
3200
3200
  };
@@ -3205,7 +3205,7 @@
3205
3205
  return item.ident.lexeme === lexeme;
3206
3206
  });
3207
3207
  if (!props.length) {
3208
- return ShaderLabUtils.createGSError("referenced mrt not found: " + lexeme, GSErrorName$1.CompilationError, ShaderLab._processingPassText, ident.location);
3208
+ return ShaderLabUtils.createGSError("referenced mrt not found: " + lexeme, GSErrorName.CompilationError, ShaderLab._processingPassText, ident.location);
3209
3209
  }
3210
3210
  this._referencedMRTList[lexeme] = props;
3211
3211
  };
@@ -4054,7 +4054,7 @@
4054
4054
  for(var _len = arguments.length, msgs = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++){
4055
4055
  msgs[_key - 1] = arguments[_key];
4056
4056
  }
4057
- var error = ShaderLabUtils.createGSError(msgs.join(" "), GSErrorName$1.ScannerError, this._source, pos);
4057
+ var error = ShaderLabUtils.createGSError(msgs.join(" "), GSErrorName.ScannerError, this._source, pos);
4058
4058
  throw error;
4059
4059
  };
4060
4060
  _proto.scanPairedChar = function scanPairedChar(left, right, balanced, skipLeading) {
@@ -4625,840 +4625,452 @@
4625
4625
  "#undef": Keyword.MACRO_UNDEF
4626
4626
  };
4627
4627
 
4628
- function _type_of(obj) {
4629
- "@swc/helpers - typeof";
4630
-
4631
- return obj && typeof Symbol !== "undefined" && obj.constructor === Symbol ? "symbol" : typeof obj;
4632
- }
4633
-
4634
- var MacroParserToken = /*#__PURE__*/ function(MacroParserToken) {
4635
- MacroParserToken[MacroParserToken["id"] = 0] = "id";
4636
- MacroParserToken[MacroParserToken["line_remain"] = 1] = "line_remain";
4637
- MacroParserToken[MacroParserToken["chunk"] = 2] = "chunk";
4638
- MacroParserToken[MacroParserToken["int_constant"] = 3] = "int_constant";
4639
- MacroParserToken[MacroParserToken["string_const"] = 4] = "string_const";
4640
- /** \>> */ MacroParserToken[MacroParserToken["right_op"] = 5] = "right_op";
4641
- /** << */ MacroParserToken[MacroParserToken["left_op"] = 6] = "left_op";
4642
- MacroParserToken[MacroParserToken["left_paren"] = 7] = "left_paren";
4643
- MacroParserToken[MacroParserToken["right_paren"] = 8] = "right_paren";
4644
- /** \>= */ MacroParserToken[MacroParserToken["ge"] = 9] = "ge";
4645
- /** <= */ MacroParserToken[MacroParserToken["le"] = 10] = "le";
4646
- /** == */ MacroParserToken[MacroParserToken["eq"] = 11] = "eq";
4647
- /** != */ MacroParserToken[MacroParserToken["neq"] = 12] = "neq";
4648
- /** && */ MacroParserToken[MacroParserToken["and"] = 13] = "and";
4649
- /** || */ MacroParserToken[MacroParserToken["or"] = 14] = "or";
4650
- /** < */ MacroParserToken[MacroParserToken["left_angle"] = 15] = "left_angle";
4651
- /** \> */ MacroParserToken[MacroParserToken["right_angle"] = 16] = "right_angle";
4652
- /** \* */ MacroParserToken[MacroParserToken["star"] = 17] = "star";
4653
- /** + */ MacroParserToken[MacroParserToken["plus"] = 18] = "plus";
4654
- /** \- */ MacroParserToken[MacroParserToken["dash"] = 19] = "dash";
4655
- /** ! */ MacroParserToken[MacroParserToken["bang"] = 20] = "bang";
4656
- /** \/ */ MacroParserToken[MacroParserToken["slash"] = 21] = "slash";
4657
- /** % */ MacroParserToken[MacroParserToken["percent"] = 22] = "percent";
4658
- MacroParserToken[MacroParserToken["EOF"] = 100] = "EOF";
4659
- return MacroParserToken;
4660
- }({});
4661
- var MacroParserKeyword = /*#__PURE__*/ function(MacroParserKeyword) {
4662
- MacroParserKeyword[MacroParserKeyword["define"] = 101] = "define";
4663
- MacroParserKeyword[MacroParserKeyword["undef"] = 102] = "undef";
4664
- MacroParserKeyword[MacroParserKeyword["if"] = 103] = "if";
4665
- MacroParserKeyword[MacroParserKeyword["ifdef"] = 104] = "ifdef";
4666
- MacroParserKeyword[MacroParserKeyword["ifndef"] = 105] = "ifndef";
4667
- MacroParserKeyword[MacroParserKeyword["else"] = 106] = "else";
4668
- MacroParserKeyword[MacroParserKeyword["elif"] = 107] = "elif";
4669
- MacroParserKeyword[MacroParserKeyword["endif"] = 108] = "endif";
4670
- MacroParserKeyword[MacroParserKeyword["defined"] = 109] = "defined";
4671
- return MacroParserKeyword;
4672
- }({});
4673
-
4674
- var MacroDefine = /*#__PURE__*/ function() {
4675
- function MacroDefine(macro, body, location, args) {
4676
- this.macro = macro;
4677
- this.body = body;
4678
- this.location = location;
4679
- this.args = args;
4680
- if ((args == null ? void 0 : args.length) > 0) {
4681
- this._argsLexemes = this.args.map(function(item) {
4682
- return item.lexeme;
4683
- });
4684
- this._replaceRegex = new RegExp("\\b(" + this._argsLexemes.join("|") + ")\\b", "g");
4685
- }
4686
- }
4687
- var _proto = MacroDefine.prototype;
4688
- _proto.expandFunctionBody = function expandFunctionBody(args) {
4689
- var _this = this;
4690
- var _this_args;
4691
- if (args.length !== ((_this_args = this.args) == null ? void 0 : _this_args.length)) {
4692
- throw ShaderLabUtils.createGSError("mismatched function macro", GSErrorName.PreprocessorError, "", this.location);
4693
- }
4694
- if (args.length === 0) {
4695
- return this.body.lexeme;
4696
- }
4697
- return this.body.lexeme.replace(this._replaceRegex, function(m) {
4698
- return args[_this._argsLexemes.indexOf(m)];
4699
- });
4700
- };
4701
- _create_class(MacroDefine, [
4702
- {
4703
- key: "isFunction",
4704
- get: function get() {
4705
- return !!this.args;
4706
- }
4707
- }
4708
- ]);
4709
- return MacroDefine;
4710
- }();
4711
-
4712
- var MacroParserLexer = /*#__PURE__*/ function(BaseLexer1) {
4713
- _inherits(MacroParserLexer, BaseLexer1);
4714
- function MacroParserLexer(source) {
4715
- var _this;
4716
- _this = BaseLexer1.call(this, source) || this, _this.macroLvl = 0;
4717
- return _this;
4718
- }
4719
- var _proto = MacroParserLexer.prototype;
4720
- _proto.scanWordsUntilTerminator = function scanWordsUntilTerminator(terminatorChar) {
4721
- var tokens = [];
4722
- while(true){
4723
- this.skipSpace(true);
4724
- if (BaseLexer.isAlpha(this.getCurCharCode())) {
4725
- tokens.push(this.scanWord());
4726
- } else if (this.getCurChar() === terminatorChar) {
4727
- this.advance(1);
4728
- return tokens;
4729
- } else {
4730
- this.advance(1);
4731
- }
4732
- }
4733
- };
4734
- _proto.scanWord = function scanWord() {
4735
- // Skip all non-alphabetic characters, primarily used for handling defined(MACRO) syntax
4736
- while(!BaseLexer.isAlpha(this.getCurCharCode()) && !this.isEnd()){
4737
- this.advance(1);
4738
- }
4739
- if (this.isEnd()) {
4740
- return EOF;
4741
- }
4742
- var start = this._currentIndex;
4743
- while(BaseLexer.isAlnum(this.getCurCharCode()) && !this.isEnd()){
4744
- this.advance(1);
4745
- }
4746
- var end = this._currentIndex;
4747
- var word = this._source.slice(start, end);
4748
- if (end === start) {
4749
- this.throwError(this.getShaderPosition(0), "no word found.");
4750
- }
4751
- var token = BaseToken.pool.get();
4752
- var _MacroParserLexer__lexemeTable_word;
4753
- var tokenType = (_MacroParserLexer__lexemeTable_word = MacroParserLexer._lexemeTable[word]) != null ? _MacroParserLexer__lexemeTable_word : MacroParserToken.id;
4754
- token.set(tokenType, word, this.getShaderPosition(word.length));
4755
- return token;
4756
- };
4757
- _proto.scanToken = function scanToken() {
4758
- this.skipCommentsAndSpace();
4759
- if (this.isEnd()) {
4760
- return;
4761
- }
4762
- var source = this._source;
4763
- var start = this._currentIndex;
4764
- var found = false;
4765
- for(var n = source.length; this._currentIndex < n;){
4766
- if (MacroParserLexer._isPpCharacters(source.charCodeAt(this._currentIndex))) {
4767
- this.advance(1);
4768
- found = true;
4769
- } else {
4770
- if (found) {
4771
- break;
4772
- }
4773
- this.advance(1);
4774
- this.skipCommentsAndSpace();
4775
- start = this._currentIndex;
4776
- }
4777
- }
4778
- var lexeme = source.slice(start, this._currentIndex);
4779
- var token = BaseToken.pool.get();
4780
- var _MacroParserLexer__lexemeTable_lexeme;
4781
- var type = (_MacroParserLexer__lexemeTable_lexeme = MacroParserLexer._lexemeTable[lexeme]) != null ? _MacroParserLexer__lexemeTable_lexeme : MacroParserToken.id;
4782
- token.set(type, lexeme, this.getShaderPosition(this._currentIndex - start));
4783
- if (type === MacroParserKeyword.if || type === MacroParserKeyword.ifdef || type === MacroParserKeyword.ifndef) {
4784
- this.macroLvl++;
4785
- } else if (type === MacroParserKeyword.endif) {
4786
- this.macroLvl--;
4787
- }
4788
- return token;
4789
- };
4790
- _proto.scanQuotedString = function scanQuotedString() {
4791
- this.skipSpace(true);
4792
- var source = this._source;
4793
- var sourceLength = source.length;
4794
- var start = this.getShaderPosition(0);
4795
- var index = this._currentIndex;
4796
- // Check for opening quote
4797
- if (source.charCodeAt(index) !== 34) {
4798
- // 34 = '"'
4799
- this.throwError(start, "Unexpected char, expected '\"'");
4800
- }
4801
- var contentStart = ++index; // Skip opening quote and record start
4802
- // Fast scan to closing quote
4803
- while(index < sourceLength && source.charCodeAt(index) !== 34){
4804
- index++;
4805
- }
4806
- if (index >= sourceLength) {
4807
- this.throwError(this.getShaderPosition(0), "Unexpected char, expected '\"'");
4808
- }
4809
- var lexeme = source.slice(contentStart, index);
4810
- this.advance(index + 1 - this._currentIndex); // Skip to after closing quote
4811
- var token = BaseToken.pool.get();
4812
- token.set(MacroParserToken.string_const, lexeme, start);
4813
- return token;
4814
- };
4815
- _proto.scanToChar = function scanToChar(char) {
4816
- var source = this._source;
4817
- while(source[this._currentIndex] !== char && !this.isEnd()){
4818
- this.advance(1);
4819
- }
4820
- };
4821
- _proto.scanMacroBranchBody = function scanMacroBranchBody() {
4822
- var shaderPosition = this.getShaderPosition(0);
4823
- var startLevel = this.macroLvl;
4824
- var nextDirective = this.scanToken();
4825
- while(true){
4826
- var type = nextDirective.type;
4827
- if (type === MacroParserKeyword.endif && startLevel - 1 === this.macroLvl) {
4828
- break;
4829
- } else if ((type === MacroParserKeyword.elif || type === MacroParserKeyword.else) && startLevel === this.macroLvl) {
4628
+ /** Must stay in sync with ShaderPreprocessorDirective in @galacean/engine-core */ var ShaderPreprocessorDirective = {
4629
+ Text: 0,
4630
+ IfDef: 1,
4631
+ IfNdef: 2,
4632
+ IfCmp: 3,
4633
+ IfExpr: 4,
4634
+ Else: 5,
4635
+ Endif: 6,
4636
+ Define: 7,
4637
+ DefineVal: 8,
4638
+ DefineFunc: 9,
4639
+ Undef: 10
4640
+ };
4641
+ /**
4642
+ * @internal
4643
+ */ var ShaderInstructionEncoder = /*#__PURE__*/ function() {
4644
+ function ShaderInstructionEncoder() {}
4645
+ ShaderInstructionEncoder.parse = function parse(glsl) {
4646
+ var instructions = [];
4647
+ var length = glsl.length;
4648
+ var pos = 0;
4649
+ var backfillStack = [];
4650
+ while(pos < length){
4651
+ var directiveStart = ShaderInstructionEncoder._findDirectiveStart(glsl, pos, length);
4652
+ if (directiveStart === -1) {
4653
+ ShaderInstructionEncoder._pushText(instructions, glsl, pos, length);
4830
4654
  break;
4831
4655
  }
4832
- nextDirective = this.scanToken();
4833
- }
4834
- var lexeme = this._source.slice(shaderPosition.index, this._currentIndex - nextDirective.lexeme.length - 1);
4835
- var body = BaseToken.pool.get();
4836
- body.set(MacroParserToken.chunk, lexeme, shaderPosition);
4837
- return {
4838
- body: body,
4839
- nextDirective: nextDirective
4840
- };
4841
- };
4842
- _proto.scanPairedBlock = function scanPairedBlock(lc, rc) {
4843
- this.scanToChar(lc);
4844
- var level = 0;
4845
- var source = this._source;
4846
- do {
4847
- var curChar = source[this._currentIndex];
4848
- if (curChar === lc) {
4849
- level++;
4850
- } else if (curChar === rc) {
4851
- level--;
4852
- }
4853
- this.advance(1);
4854
- }while (level > 0);
4855
- };
4856
- /**
4857
- * @returns end ShaderPosition
4858
- */ _proto.scanRemainMacro = function scanRemainMacro() {
4859
- var startLvl = this.macroLvl;
4860
- var directive = this.scanToken();
4861
- while(!this.isEnd() && (directive.type !== MacroParserKeyword.endif || startLvl - 1 !== this.macroLvl)){
4862
- directive = this.scanToken();
4863
- }
4864
- return this.getShaderPosition(0);
4865
- };
4866
- _proto.peekNonSpace = function peekNonSpace() {
4867
- var current = this._currentIndex;
4868
- while(/\s/.test(this._source[current])){
4869
- current += 1;
4870
- }
4871
- return this._source[current];
4872
- };
4873
- _proto.scanInteger = function scanInteger() {
4874
- var start = this._currentIndex;
4875
- while(BaseLexer.isDigit(this.getCurCharCode())){
4876
- this.advance(1);
4877
- }
4878
- if (this._currentIndex === start) {
4879
- this.throwError(this.getShaderPosition(0), "no integer found");
4880
- }
4881
- var integer = this._source.slice(start, this._currentIndex);
4882
- var token = BaseToken.pool.get();
4883
- token.set(MacroParserToken.int_constant, integer, this.getShaderPosition(0));
4884
- return token;
4885
- };
4886
- _proto.scanMacroBody = function scanMacroBody() {
4887
- this.skipSpace(false);
4888
- var lexeme = "";
4889
- var source = this._source;
4890
- var sourceLength = source.length;
4891
- var start = this.getShaderPosition(0);
4892
- while(this._currentIndex < sourceLength){
4893
- var charCode = source.charCodeAt(this._currentIndex);
4894
- // Check for line break (terminates macro definition), break when encounter "\n"
4895
- if (charCode === 10) {
4896
- break;
4656
+ if (directiveStart > pos) {
4657
+ ShaderInstructionEncoder._pushText(instructions, glsl, pos, directiveStart);
4658
+ }
4659
+ var lineEnd = glsl.indexOf("\n", directiveStart);
4660
+ if (lineEnd === -1) lineEnd = length;
4661
+ var line = glsl.substring(directiveStart, lineEnd);
4662
+ pos = lineEnd < length ? lineEnd + 1 : length;
4663
+ var match = ShaderInstructionEncoder._DIRECTIVE_RE.exec(line);
4664
+ if (!match) {
4665
+ var last = instructions.length > 0 ? instructions[instructions.length - 1] : null;
4666
+ var text = lineEnd < length ? line + "\n" : line;
4667
+ if (last && last[0] === ShaderPreprocessorDirective.Text) {
4668
+ last[1] += text;
4669
+ } else {
4670
+ instructions.push([
4671
+ ShaderPreprocessorDirective.Text,
4672
+ text
4673
+ ]);
4674
+ }
4675
+ continue;
4897
4676
  }
4898
- // Check for comments (both single-line and multi-line)
4899
- if (charCode === 47) {
4900
- var nextIndex = this._currentIndex + 1;
4901
- if (nextIndex < sourceLength) {
4902
- var nextCharCode = source.charCodeAt(nextIndex);
4903
- // Single-line comment (terminates macro definition), break when encounter "//"
4904
- if (nextCharCode === 47) {
4677
+ var keyword = match[1];
4678
+ var rest = match[2].trim();
4679
+ switch(keyword){
4680
+ case "ifdef":
4681
+ {
4682
+ var idx = instructions.length;
4683
+ instructions.push([
4684
+ ShaderPreprocessorDirective.IfDef,
4685
+ rest,
4686
+ -1
4687
+ ]);
4688
+ backfillStack.push([
4689
+ idx
4690
+ ]);
4691
+ break;
4692
+ }
4693
+ case "ifndef":
4694
+ {
4695
+ var idx1 = instructions.length;
4696
+ instructions.push([
4697
+ ShaderPreprocessorDirective.IfNdef,
4698
+ rest,
4699
+ -1
4700
+ ]);
4701
+ backfillStack.push([
4702
+ idx1
4703
+ ]);
4905
4704
  break;
4906
4705
  }
4907
- // Multi-line comment (skip but don't terminate)
4908
- if (nextCharCode === 42) {
4909
- this.advance(2); // Skip "/*"
4910
- // Skip until end of multi-line comment
4911
- while(this._currentIndex + 1 < sourceLength){
4912
- var currentIndex = this._currentIndex;
4913
- if (source.charCodeAt(currentIndex) === 42 && source.charCodeAt(currentIndex + 1) === 47) {
4914
- this.advance(2); // Skip "*/
4915
- break;
4706
+ case "if":
4707
+ {
4708
+ var cond = ShaderInstructionEncoder._parseCondition(rest);
4709
+ var idx2 = instructions.length;
4710
+ ShaderInstructionEncoder._pushConditionInstruction(instructions, cond);
4711
+ backfillStack.push([
4712
+ idx2
4713
+ ]);
4714
+ break;
4715
+ }
4716
+ case "elif":
4717
+ {
4718
+ var stack = backfillStack[backfillStack.length - 1];
4719
+ var prevIdx = stack[stack.length - 1];
4720
+ var elseIdx = instructions.length;
4721
+ instructions.push([
4722
+ ShaderPreprocessorDirective.Else,
4723
+ -1
4724
+ ]);
4725
+ stack.push(elseIdx);
4726
+ ShaderInstructionEncoder._backfillJump(instructions[prevIdx], instructions.length);
4727
+ var cond1 = ShaderInstructionEncoder._parseCondition(rest);
4728
+ var idx3 = instructions.length;
4729
+ ShaderInstructionEncoder._pushConditionInstruction(instructions, cond1);
4730
+ stack.push(idx3);
4731
+ break;
4732
+ }
4733
+ case "else":
4734
+ {
4735
+ var stack1 = backfillStack[backfillStack.length - 1];
4736
+ var prevIdx1 = stack1[stack1.length - 1];
4737
+ var elseIdx1 = instructions.length;
4738
+ instructions.push([
4739
+ ShaderPreprocessorDirective.Else,
4740
+ -1
4741
+ ]);
4742
+ stack1.push(elseIdx1);
4743
+ ShaderInstructionEncoder._backfillJump(instructions[prevIdx1], instructions.length);
4744
+ break;
4745
+ }
4746
+ case "endif":
4747
+ {
4748
+ var endifIdx = instructions.length;
4749
+ instructions.push([
4750
+ ShaderPreprocessorDirective.Endif
4751
+ ]);
4752
+ var stack2 = backfillStack.pop();
4753
+ if (stack2) {
4754
+ var afterEndif = endifIdx + 1;
4755
+ for(var j = 0; j < stack2.length; j++){
4756
+ var inst = instructions[stack2[j]];
4757
+ if (inst[0] === ShaderPreprocessorDirective.Else) {
4758
+ inst[1] = afterEndif;
4759
+ } else {
4760
+ ShaderInstructionEncoder._backfillJump(inst, afterEndif, true);
4761
+ }
4916
4762
  }
4917
- this.advance(1);
4918
4763
  }
4919
- lexeme += " "; // Replace comment with space
4920
- continue;
4764
+ break;
4765
+ }
4766
+ case "define":
4767
+ {
4768
+ var funcMatch = ShaderInstructionEncoder._FUNC_MACRO_RE.exec(rest);
4769
+ if (funcMatch) {
4770
+ var params = funcMatch[2].split(",").map(function(p) {
4771
+ return p.trim();
4772
+ }).filter(function(p) {
4773
+ return p.length > 0;
4774
+ });
4775
+ instructions.push([
4776
+ ShaderPreprocessorDirective.DefineFunc,
4777
+ funcMatch[1],
4778
+ params,
4779
+ ShaderInstructionEncoder._stripLineComment(funcMatch[3].trim())
4780
+ ]);
4781
+ } else {
4782
+ var spaceIdx = rest.indexOf(" ");
4783
+ if (spaceIdx === -1) {
4784
+ instructions.push([
4785
+ ShaderPreprocessorDirective.Define,
4786
+ rest
4787
+ ]);
4788
+ } else {
4789
+ instructions.push([
4790
+ ShaderPreprocessorDirective.DefineVal,
4791
+ rest.substring(0, spaceIdx),
4792
+ ShaderInstructionEncoder._stripLineComment(rest.substring(spaceIdx + 1).trim())
4793
+ ]);
4794
+ }
4795
+ }
4796
+ break;
4797
+ }
4798
+ case "undef":
4799
+ {
4800
+ instructions.push([
4801
+ ShaderPreprocessorDirective.Undef,
4802
+ rest
4803
+ ]);
4804
+ break;
4921
4805
  }
4922
- }
4923
4806
  }
4924
- // Accumulate useful character
4925
- lexeme += source[this._currentIndex];
4926
- this.advance(1);
4927
- }
4928
- if (lexeme === "") {
4929
- return null;
4930
4807
  }
4931
- var valueToken = BaseToken.pool.get();
4932
- valueToken.set(MacroParserToken.line_remain, lexeme, ShaderLab.createRange(start, this.getShaderPosition(0)));
4933
- return valueToken;
4808
+ return instructions;
4934
4809
  };
4935
- MacroParserLexer._isPpCharacters = function _isPpCharacters(charCode) {
4936
- return charCode === 35 || // #
4937
- BaseLexer.isAlnum(charCode) // _, A-Z, a-z, 0-9
4938
- ;
4810
+ ShaderInstructionEncoder._pushConditionInstruction = function _pushConditionInstruction(instructions, cond) {
4811
+ if (cond.t === "def") {
4812
+ instructions.push([
4813
+ ShaderPreprocessorDirective.IfDef,
4814
+ cond.m,
4815
+ -1
4816
+ ]);
4817
+ } else if (cond.t === "ndef") {
4818
+ instructions.push([
4819
+ ShaderPreprocessorDirective.IfNdef,
4820
+ cond.m,
4821
+ -1
4822
+ ]);
4823
+ } else if (cond.t === "cmp") {
4824
+ instructions.push([
4825
+ ShaderPreprocessorDirective.IfCmp,
4826
+ cond.m,
4827
+ cond.op,
4828
+ cond.v,
4829
+ -1
4830
+ ]);
4831
+ } else {
4832
+ instructions.push([
4833
+ ShaderPreprocessorDirective.IfExpr,
4834
+ cond,
4835
+ -1
4836
+ ]);
4837
+ }
4939
4838
  };
4940
- return MacroParserLexer;
4941
- }(BaseLexer);
4942
- MacroParserLexer._lexemeTable = {
4943
- "#define": MacroParserKeyword.define,
4944
- "#undef": MacroParserKeyword.undef,
4945
- "#if": MacroParserKeyword.if,
4946
- "#ifdef": MacroParserKeyword.ifdef,
4947
- "#ifndef": MacroParserKeyword.ifndef,
4948
- "#else": MacroParserKeyword.else,
4949
- "#elif": MacroParserKeyword.elif,
4950
- "#endif": MacroParserKeyword.endif,
4951
- defined: MacroParserKeyword.defined
4952
- };
4953
-
4954
- var PpUtils = /*#__PURE__*/ function() {
4955
- function PpUtils() {}
4956
- PpUtils.expand = function expand(segments, source) {
4957
- var ret = [];
4958
- var startIdx = 0;
4959
- var generatedIdx = 0;
4960
- for(var _iterator = _create_for_of_iterator_helper_loose(segments), _step; !(_step = _iterator()).done;){
4961
- var seg = _step.value;
4962
- var originSlice = source.slice(startIdx, seg.rangeInBlock.start.index);
4963
- ret.push(originSlice, seg.replace);
4964
- var generatedIdxEnd = generatedIdx + originSlice.length + seg.replace.length;
4965
- startIdx = seg.rangeInBlock.end.index;
4966
- generatedIdx = generatedIdxEnd;
4967
- }
4968
- ret.push(source.slice(startIdx));
4969
- var result = ret.join("");
4970
- // Replace multiple consecutive newlines with a single newline to clean up the output
4971
- return result.replace(/\n\s*\n+/g, "\n");
4972
- };
4973
- return PpUtils;
4974
- }();
4975
-
4976
- /** @internal */ var MacroParser = /*#__PURE__*/ function() {
4977
- function MacroParser() {}
4978
- MacroParser.parse = function parse(source, macros) {
4979
- MacroParser._reset();
4980
- for(var _iterator = _create_for_of_iterator_helper_loose(macros), _step; !(_step = _iterator()).done;){
4981
- var macro = _step.value;
4982
- MacroParser._addPredefinedMacro(macro.name, macro.value);
4983
- }
4984
- this.lexer = new MacroParserLexer(source);
4985
- return MacroParser._parseDirectives(this.lexer);
4986
- };
4987
- MacroParser._reset = function _reset() {
4988
- this._expandSegmentsStack.length = 0;
4989
- this._expandSegmentsStack.push([]);
4990
- this._definedMacros.clear();
4991
- this._addPredefinedMacro("GL_ES");
4992
- };
4993
- MacroParser._addPredefinedMacro = function _addPredefinedMacro(macro, value) {
4994
- var token = BaseToken.pool.get();
4995
- token.set(MacroParserToken.id, macro);
4996
- var macroBody;
4997
- if (value != undefined) {
4998
- macroBody = BaseToken.pool.get();
4999
- macroBody.set(MacroParserToken.id, value);
5000
- }
5001
- this._definedMacros.set(macro, new MacroDefine(token, macroBody));
5002
- };
5003
- MacroParser._parseDirectives = function _parseDirectives(lexer) {
5004
- var directive;
5005
- while(directive = lexer.scanToken()){
5006
- switch(directive.type){
5007
- case MacroParserToken.id:
5008
- this._parseMacro(lexer, directive);
5009
- break;
5010
- case MacroParserKeyword.define:
5011
- this._parseDefine(lexer);
5012
- break;
5013
- case MacroParserKeyword.undef:
5014
- this._parseUndef(lexer);
5015
- break;
5016
- case MacroParserKeyword.if:
5017
- this._parseIfDirective(lexer, MacroParserKeyword.if);
5018
- break;
5019
- case MacroParserKeyword.ifndef:
5020
- this._parseIfDirective(lexer, MacroParserKeyword.ifndef);
5021
- break;
5022
- case MacroParserKeyword.ifdef:
5023
- this._parseIfDirective(lexer, MacroParserKeyword.ifdef);
4839
+ ShaderInstructionEncoder._findDirectiveStart = function _findDirectiveStart(source, from, length) {
4840
+ var i = from;
4841
+ while(i < length){
4842
+ var j = i;
4843
+ while(j < length){
4844
+ var c = source.charCodeAt(j);
4845
+ if (c === 32 /* space */ || c === 9 /* tab */ ) {
4846
+ j++;
4847
+ } else {
5024
4848
  break;
4849
+ }
5025
4850
  }
4851
+ if (j < length && source.charCodeAt(j) === 35 /* '#' */ ) return i;
4852
+ var nl = source.indexOf("\n", i);
4853
+ if (nl === -1) break;
4854
+ i = nl + 1;
5026
4855
  }
5027
- return PpUtils.expand(this._getExpandSegments(), lexer.source, lexer.sourceMap);
5028
- };
5029
- MacroParser._getExpandSegments = function _getExpandSegments() {
5030
- return this._expandSegmentsStack[this._expandSegmentsStack.length - 1];
4856
+ return -1;
5031
4857
  };
5032
- MacroParser._reportError = function _reportError(loc, message, source, file) {
5033
- ShaderLabUtils.createGSError(message, GSErrorName$1.PreprocessorError, source, loc, file);
5034
- };
5035
- MacroParser._parseIfDirective = function _parseIfDirective(lexer, directiveType) {
5036
- var directiveLength = directiveType === MacroParserKeyword.if ? 3 : directiveType === MacroParserKeyword.ifdef ? 6 : 7; // #if = 3, #ifdef = 6, #ifndef = 7
5037
- var start = lexer.currentIndex - directiveLength;
5038
- var skipMacro = false;
5039
- var shouldInclude;
5040
- if (directiveType === MacroParserKeyword.if) {
5041
- shouldInclude = this._parseConstantExpression(lexer);
5042
- } else {
5043
- var macroToken = lexer.scanWord();
5044
- var lexeme = macroToken.lexeme;
5045
- if (lexeme.startsWith("GL_")) {
5046
- skipMacro = true;
5047
- } else {
5048
- var defined = this._definedMacros.get(lexeme);
5049
- shouldInclude = directiveType === MacroParserKeyword.ifdef ? !!defined : !defined;
5050
- }
5051
- }
5052
- lexer.skipSpace(true);
5053
- var _lexer_scanMacroBranchBody = lexer.scanMacroBranchBody(), body = _lexer_scanMacroBranchBody.body, nextDirective = _lexer_scanMacroBranchBody.nextDirective;
5054
- if (skipMacro) return;
5055
- if (shouldInclude) {
5056
- var end = nextDirective.type === MacroParserKeyword.endif ? lexer.getShaderPosition(0) : lexer.scanRemainMacro();
5057
- var expanded = this._expandMacroChunk(body.lexeme, body.location, lexer);
5058
- this._addContentReplace(lexer.file, ShaderLab.createPosition(start), end, expanded.content, lexer.blockRange, expanded.sourceMap);
4858
+ ShaderInstructionEncoder._pushText = function _pushText(instructions, source, from, to) {
4859
+ if (from >= to) return;
4860
+ var last = instructions.length > 0 ? instructions[instructions.length - 1] : null;
4861
+ if (last && last[0] === ShaderPreprocessorDirective.Text) {
4862
+ last[1] += source.substring(from, to);
5059
4863
  } else {
5060
- this._addEmptyReplace(lexer, start);
5061
- this._processConditionalDirective(nextDirective.type, lexer);
4864
+ instructions.push([
4865
+ ShaderPreprocessorDirective.Text,
4866
+ source.substring(from, to)
4867
+ ]);
5062
4868
  }
5063
4869
  };
5064
- MacroParser._processConditionalDirective = function _processConditionalDirective(directive, scanner) {
5065
- if (directive === MacroParserKeyword.endif) {
5066
- return;
4870
+ /**
4871
+ * Backfill jump offset of an IF/ELIF instruction.
4872
+ * When onlyPlaceholder is true, only backfill if the current value is still -1
4873
+ */ ShaderInstructionEncoder._backfillJump = function _backfillJump(inst, target, onlyPlaceholder) {
4874
+ if (onlyPlaceholder === void 0) onlyPlaceholder = false;
4875
+ var directive = inst[0];
4876
+ if (directive === ShaderPreprocessorDirective.IfDef || directive === ShaderPreprocessorDirective.IfNdef) {
4877
+ if (!onlyPlaceholder || inst[2] === -1) inst[2] = target;
4878
+ } else if (directive === ShaderPreprocessorDirective.IfCmp) {
4879
+ if (!onlyPlaceholder || inst[4] === -1) inst[4] = target;
4880
+ } else if (directive === ShaderPreprocessorDirective.IfExpr) {
4881
+ if (!onlyPlaceholder || inst[2] === -1) inst[2] = target;
4882
+ }
4883
+ };
4884
+ ShaderInstructionEncoder._stripLineComment = function _stripLineComment(s) {
4885
+ var idx = s.indexOf("//");
4886
+ return idx >= 0 ? s.substring(0, idx).trimEnd() : s;
4887
+ };
4888
+ ShaderInstructionEncoder._parseCondition = function _parseCondition(expr) {
4889
+ var ctx = {
4890
+ s: expr.trim(),
4891
+ i: 0
4892
+ };
4893
+ return ShaderInstructionEncoder._parseOr(ctx);
4894
+ };
4895
+ ShaderInstructionEncoder._skipWs = function _skipWs(ctx) {
4896
+ while(ctx.i < ctx.s.length && (ctx.s.charCodeAt(ctx.i) === 32 /* space */ || ctx.s.charCodeAt(ctx.i) === 9))ctx.i++;
4897
+ };
4898
+ ShaderInstructionEncoder._parseOr = function _parseOr(ctx) {
4899
+ var left = ShaderInstructionEncoder._parseAnd(ctx);
4900
+ ShaderInstructionEncoder._skipWs(ctx);
4901
+ while(ctx.i < ctx.s.length - 1 && ctx.s.charCodeAt(ctx.i) === 124 /* '|' */ && ctx.s.charCodeAt(ctx.i + 1) === 124 /* '|' */ ){
4902
+ ctx.i += 2;
4903
+ ShaderInstructionEncoder._skipWs(ctx);
4904
+ left = {
4905
+ t: "or",
4906
+ l: left,
4907
+ r: ShaderInstructionEncoder._parseAnd(ctx)
4908
+ };
4909
+ ShaderInstructionEncoder._skipWs(ctx);
4910
+ }
4911
+ return left;
4912
+ };
4913
+ ShaderInstructionEncoder._parseAnd = function _parseAnd(ctx) {
4914
+ var left = ShaderInstructionEncoder._parseUnary(ctx);
4915
+ ShaderInstructionEncoder._skipWs(ctx);
4916
+ while(ctx.i < ctx.s.length - 1 && ctx.s.charCodeAt(ctx.i) === 38 /* '&' */ && ctx.s.charCodeAt(ctx.i + 1) === 38 /* '&' */ ){
4917
+ ctx.i += 2;
4918
+ ShaderInstructionEncoder._skipWs(ctx);
4919
+ left = {
4920
+ t: "and",
4921
+ l: left,
4922
+ r: ShaderInstructionEncoder._parseUnary(ctx)
4923
+ };
4924
+ ShaderInstructionEncoder._skipWs(ctx);
4925
+ }
4926
+ return left;
4927
+ };
4928
+ ShaderInstructionEncoder._parseUnary = function _parseUnary(ctx) {
4929
+ ShaderInstructionEncoder._skipWs(ctx);
4930
+ if (ctx.s.charCodeAt(ctx.i) === 33 /* '!' */ ) {
4931
+ ctx.i++;
4932
+ ShaderInstructionEncoder._skipWs(ctx);
4933
+ return {
4934
+ t: "not",
4935
+ c: ShaderInstructionEncoder._parsePrimary(ctx)
4936
+ };
5067
4937
  }
5068
- var start = scanner.currentIndex;
5069
- if (directive === MacroParserKeyword.else) {
5070
- var body = scanner.scanMacroBranchBody().body;
5071
- var expanded = this._expandMacroChunk(body.lexeme, body.location, scanner);
5072
- this._addContentReplace(scanner.file, ShaderLab.createPosition(start), scanner.getShaderPosition(0), expanded.content, scanner.blockRange, expanded.sourceMap);
5073
- } else if (directive === MacroParserKeyword.elif) {
5074
- var constantExpr = this._parseConstantExpression(scanner);
5075
- var _scanner_scanMacroBranchBody = scanner.scanMacroBranchBody(), body1 = _scanner_scanMacroBranchBody.body, nextDirective = _scanner_scanMacroBranchBody.nextDirective;
5076
- if (constantExpr) {
5077
- var end = nextDirective.type === MacroParserKeyword.endif ? scanner.currentIndex : scanner.scanRemainMacro().index;
5078
- var expanded1 = this._expandMacroChunk(body1.lexeme, body1.location, scanner);
5079
- this._addContentReplace(scanner.file, ShaderLab.createPosition(start), ShaderLab.createPosition(end), expanded1.content, scanner.blockRange, expanded1.sourceMap);
5080
- } else {
5081
- this._addContentReplace(scanner.file, ShaderLab.createPosition(start), ShaderLab.createPosition(scanner.currentIndex), "", scanner.blockRange);
5082
- this._processConditionalDirective(nextDirective.type, scanner);
5083
- }
5084
- }
5085
- };
5086
- MacroParser._parseConstantExpression = function _parseConstantExpression(scanner) {
5087
- scanner.skipSpace(true);
5088
- return this._parseLogicalOrExpression(scanner);
5089
- };
5090
- MacroParser._parseLogicalOrExpression = function _parseLogicalOrExpression(scanner) {
5091
- var operand1 = this._parseLogicalAndExpression(scanner);
5092
- var operator = scanner.peek(2);
5093
- if (operator && operator === "||") {
5094
- scanner.advance(2);
5095
- scanner.skipSpace(false);
5096
- var operand2 = this._parseLogicalOrExpression(scanner);
5097
- return operand1 || operand2;
5098
- }
5099
- return operand1;
5100
- };
5101
- MacroParser._parseLogicalAndExpression = function _parseLogicalAndExpression(scanner) {
5102
- var operand1 = this._parseEqualityExpression(scanner);
5103
- var operator = scanner.peek(2);
5104
- if (operator && operator === "&&") {
5105
- scanner.advance(2);
5106
- scanner.skipSpace(false);
5107
- var operand2 = this._parseLogicalAndExpression(scanner);
5108
- return operand1 && operand2;
5109
- }
5110
- return operand1;
5111
- };
5112
- MacroParser._parseEqualityExpression = function _parseEqualityExpression(scanner) {
5113
- var operand1 = this._parseRelationalExpression(scanner);
5114
- var operator = scanner.peek(2);
5115
- if (operator && [
5116
- "==",
5117
- "!="
5118
- ].includes(operator)) {
5119
- scanner.advance(2);
5120
- scanner.skipSpace(false);
5121
- var operand2 = this._parseEqualityExpression(scanner);
5122
- switch(operator){
5123
- case "==":
5124
- return operand1 === operand2;
5125
- case "!=":
5126
- return operand1 !== operand2;
5127
- }
5128
- }
5129
- return operand1;
5130
- };
5131
- MacroParser._parseRelationalExpression = function _parseRelationalExpression(scanner) {
5132
- var operand1 = this._parseShiftExpression(scanner);
5133
- var operator = scanner.peek(2);
5134
- if (operator[1] !== "=") operator = operator[0];
5135
- if (operator && [
5136
- ">",
5137
- "<",
5138
- ">=",
5139
- "<="
5140
- ].includes(operator)) {
5141
- var opPos = scanner.getShaderPosition(0);
5142
- scanner.advance(operator.length);
5143
- scanner.skipSpace(false);
5144
- var operand2 = this._parseRelationalExpression(scanner);
5145
- if ((typeof operand1 === "undefined" ? "undefined" : _type_of(operand1)) !== (typeof operand2 === "undefined" ? "undefined" : _type_of(operand2)) && typeof operand1 !== "number") {
5146
- this._reportError(opPos, "invalid operator in relation expression.", scanner.source, scanner.file);
5147
- return;
5148
- }
5149
- switch(operator){
5150
- case ">":
5151
- return operand1 > operand2;
5152
- case "<":
5153
- return operand1 < operand2;
5154
- case ">=":
5155
- return operand1 >= operand2;
5156
- case "<=":
5157
- return operand1 <= operand2;
5158
- }
5159
- }
5160
- return operand1;
5161
- };
5162
- MacroParser._parseShiftExpression = function _parseShiftExpression(scanner) {
5163
- var operand1 = this._parseAdditiveExpression(scanner);
5164
- var operator = scanner.peek(2);
5165
- if (operator && [
5166
- ">>",
5167
- "<<"
5168
- ].includes(operator)) {
5169
- var opPos = scanner.getShaderPosition(0);
5170
- scanner.advance(2);
5171
- scanner.skipSpace(false);
5172
- var operand2 = this._parseShiftExpression(scanner);
5173
- if ((typeof operand1 === "undefined" ? "undefined" : _type_of(operand1)) !== (typeof operand2 === "undefined" ? "undefined" : _type_of(operand2)) && typeof operand1 !== "number") {
5174
- this._reportError(opPos, "invalid operator in shift expression.", scanner.source, scanner.file);
5175
- return;
5176
- }
5177
- switch(operator){
5178
- case ">>":
5179
- return operand1 >> operand2;
5180
- case "<<":
5181
- return operand1 << operand2;
5182
- }
5183
- }
5184
- return operand1;
5185
- };
5186
- MacroParser._parseAdditiveExpression = function _parseAdditiveExpression(scanner) {
5187
- var operand1 = this._parseMulticativeExpression(scanner);
5188
- if ([
5189
- ">",
5190
- "<"
5191
- ].includes(scanner.getCurChar())) {
5192
- var opPos = scanner.getShaderPosition(0);
5193
- scanner.advance(1);
5194
- var operator = scanner.getCurChar();
5195
- scanner.skipSpace(false);
5196
- var operand2 = this._parseAdditiveExpression(scanner);
5197
- if ((typeof operand1 === "undefined" ? "undefined" : _type_of(operand1)) !== (typeof operand2 === "undefined" ? "undefined" : _type_of(operand2)) && typeof operand1 !== "number") {
5198
- this._reportError(opPos, "invalid operator.", scanner.source, scanner.file);
5199
- return false;
5200
- }
5201
- switch(operator){
5202
- case "+":
5203
- return operand1 + operand2;
5204
- case "-":
5205
- return operand1 - operand2;
5206
- }
5207
- }
5208
- return operand1;
5209
- };
5210
- MacroParser._parseMulticativeExpression = function _parseMulticativeExpression(scanner) {
5211
- var operand1 = this._parseUnaryExpression(scanner);
5212
- scanner.skipSpace(false);
5213
- if ([
5214
- "*",
5215
- "/",
5216
- "%"
5217
- ].includes(scanner.getCurChar())) {
5218
- var opPos = scanner.getShaderPosition(0);
5219
- var operator = scanner.getCurChar();
5220
- scanner.skipSpace(false);
5221
- var operand2 = this._parseMulticativeExpression(scanner);
5222
- if ((typeof operand1 === "undefined" ? "undefined" : _type_of(operand1)) !== (typeof operand2 === "undefined" ? "undefined" : _type_of(operand2)) && typeof operand1 !== "number") {
5223
- this._reportError(opPos, "invalid operator.", scanner.source, scanner.file);
5224
- return;
5225
- }
5226
- switch(operator){
5227
- case "*":
5228
- return operand1 * operand2;
5229
- case "/":
5230
- return operand1 / operand2;
5231
- case "%":
5232
- return operand1 % operand2;
5233
- }
5234
- }
5235
- return operand1;
5236
- };
5237
- MacroParser._parseUnaryExpression = function _parseUnaryExpression(scanner) {
5238
- var operator = scanner.getCurChar();
5239
- if ([
5240
- "+",
5241
- "-",
5242
- "!"
5243
- ].includes(operator)) {
5244
- var opPos = scanner.getShaderPosition(0);
5245
- scanner.advance(1);
5246
- scanner.skipSpace(false);
5247
- var parenExpr = this._parseParenthesisExpression(scanner);
5248
- if (operator === "!" && typeof parenExpr !== "boolean" || operator !== "!" && typeof parenExpr !== "number") {
5249
- this._reportError(opPos, "invalid operator.", scanner.source, scanner.file);
5250
- }
5251
- switch(operator){
5252
- case "+":
5253
- return parenExpr;
5254
- case "-":
5255
- return -parenExpr;
5256
- case "!":
5257
- return !parenExpr;
5258
- }
5259
- }
5260
- return this._parseParenthesisExpression(scanner);
5261
- };
5262
- MacroParser._parseParenthesisExpression = function _parseParenthesisExpression(scanner) {
5263
- if (scanner.getCurChar() === "(") {
5264
- scanner.advance(1);
5265
- scanner.skipSpace(false);
5266
- var ret = this._parseConstantExpression(scanner);
5267
- scanner.scanToChar(")");
5268
- scanner.advance(1);
5269
- return ret;
5270
- }
5271
- return this._parseConstant(scanner);
5272
- };
5273
- MacroParser._parseConstant = function _parseConstant(scanner) {
5274
- if (BaseLexer.isAlpha(scanner.getCurCharCode())) {
5275
- var id = scanner.scanWord();
5276
- if (id.type === MacroParserKeyword.defined) {
5277
- var withParen = scanner.peekNonSpace() === "(";
5278
- var macro = scanner.scanWord();
5279
- if (withParen) {
5280
- scanner.scanToChar(")");
5281
- scanner.advance(1);
5282
- }
5283
- return !!this._definedMacros.get(macro.lexeme);
5284
- } else {
5285
- var macro1 = this._definedMacros.get(id.lexeme);
5286
- if (!macro1) {
5287
- return false;
5288
- }
5289
- if (!macro1.body) {
5290
- return true;
5291
- }
5292
- if (macro1.isFunction) {
5293
- this._reportError(id.location, "invalid function macro usage", scanner.source, scanner.file);
5294
- }
5295
- var value = Number(macro1.body.lexeme);
5296
- if (!Number.isInteger(value)) {
5297
- this._reportError(id.location, "invalid const macro: " + id.lexeme, scanner.source, scanner.file);
5298
- }
5299
- return value;
5300
- }
5301
- } else if (BaseLexer.isDigit(scanner.getCurCharCode())) {
5302
- var integer = scanner.scanInteger();
5303
- return Number(integer.lexeme);
5304
- } else {
5305
- this._reportError(scanner.getShaderPosition(0), "invalid token: " + scanner.getCurChar(), scanner.source, scanner.file);
4938
+ return ShaderInstructionEncoder._parsePrimary(ctx);
4939
+ };
4940
+ ShaderInstructionEncoder._parsePrimary = function _parsePrimary(ctx) {
4941
+ ShaderInstructionEncoder._skipWs(ctx);
4942
+ var s = ctx.s;
4943
+ // Parenthesized expression
4944
+ if (s.charCodeAt(ctx.i) === 40 /* '(' */ ) {
4945
+ ctx.i++;
4946
+ ShaderInstructionEncoder._skipWs(ctx);
4947
+ var inner = ShaderInstructionEncoder._parseOr(ctx);
4948
+ ShaderInstructionEncoder._skipWs(ctx);
4949
+ if (s.charCodeAt(ctx.i) === 41 /* ')' */ ) ctx.i++;
4950
+ return inner;
4951
+ }
4952
+ // defined(MACRO) or defined MACRO
4953
+ if (s.substring(ctx.i, ctx.i + 7) === "defined") {
4954
+ ctx.i += 7;
4955
+ ShaderInstructionEncoder._skipWs(ctx);
4956
+ var hasParen = s.charCodeAt(ctx.i) === 40; /* '(' */
4957
+ if (hasParen) ctx.i++;
4958
+ ShaderInstructionEncoder._skipWs(ctx);
4959
+ var name = ShaderInstructionEncoder._scanIdentifier(ctx);
4960
+ ShaderInstructionEncoder._skipWs(ctx);
4961
+ if (hasParen && s.charCodeAt(ctx.i) === 41 /* ')' */ ) ctx.i++;
4962
+ return {
4963
+ t: "def",
4964
+ m: name
4965
+ };
5306
4966
  }
5307
- };
5308
- MacroParser._parseMacroFunctionArgs = function _parseMacroFunctionArgs(source, startIndex, macroName) {
5309
- var length = source.length;
5310
- var i = startIndex + macroName.length;
5311
- // Find opening parenthesis
5312
- while(i < length && source.charCodeAt(i) !== 40)i++;
5313
- // Parse function arguments
5314
- var args = [];
5315
- var level = 1;
5316
- var argStart = i + 1;
5317
- var k = argStart;
5318
- while(k < length && level > 0){
5319
- var charCode = source.charCodeAt(k);
5320
- if (charCode === 40) {
5321
- level++;
5322
- } else if (charCode === 41) {
5323
- if (--level === 0) {
5324
- var arg = source.substring(argStart, k).trim();
5325
- if (arg.length > 0) args.push(arg);
5326
- break;
5327
- }
5328
- } else if (charCode === 44 && level === 1) {
5329
- var arg1 = source.substring(argStart, k).trim();
5330
- if (arg1.length > 0) args.push(arg1);
5331
- argStart = k + 1;
4967
+ // Numeric literal
4968
+ if (ctx.i < s.length && ShaderInstructionEncoder._isDigit(s.charCodeAt(ctx.i))) {
4969
+ var lhsNum = ShaderInstructionEncoder._scanNumber(ctx);
4970
+ ShaderInstructionEncoder._skipWs(ctx);
4971
+ var op = ShaderInstructionEncoder._scanOp(ctx);
4972
+ if (op) {
4973
+ ShaderInstructionEncoder._skipWs(ctx);
4974
+ return {
4975
+ t: "bool",
4976
+ v: ShaderInstructionEncoder._evalNumOp(lhsNum, op, ShaderInstructionEncoder._scanNumber(ctx))
4977
+ };
5332
4978
  }
5333
- k++;
4979
+ return {
4980
+ t: "bool",
4981
+ v: lhsNum !== 0
4982
+ };
5334
4983
  }
5335
- return {
5336
- args: args,
5337
- endIndex: k + 1
4984
+ // Identifier — comparison or defined check
4985
+ var name1 = ShaderInstructionEncoder._scanIdentifier(ctx);
4986
+ if (!name1) return {
4987
+ t: "bool",
4988
+ v: false
5338
4989
  };
5339
- };
5340
- MacroParser._expandMacroBody = function _expandMacroBody(body) {
5341
- var visitedMacros = this._expandVisitedMacros;
5342
- var currentVersionId = ++this._expandVersionId;
5343
- var expandedBody = body;
5344
- var hasExpansion = true;
5345
- while(hasExpansion){
5346
- hasExpansion = false;
5347
- var length = expandedBody.length;
5348
- var i = 0;
5349
- while(i < length){
5350
- var charCode = expandedBody.charCodeAt(i);
5351
- if (!BaseLexer.isAlpha(charCode)) {
5352
- i++;
5353
- continue;
5354
- }
5355
- var start = i;
5356
- while(i < length && BaseLexer.isAlnum(expandedBody.charCodeAt(i))){
5357
- i++;
5358
- }
5359
- var macroName = expandedBody.substring(start, i);
5360
- var macro = this._definedMacros.get(macroName);
5361
- if (!macro || visitedMacros[macroName] === currentVersionId) {
5362
- continue;
5363
- }
5364
- // Prevent circular references
5365
- visitedMacros[macroName] = currentVersionId;
5366
- var replacement = void 0;
5367
- var endIndex = void 0;
5368
- if (!macro.isFunction) {
5369
- var _macro_body;
5370
- var _macro_body_lexeme;
5371
- replacement = (_macro_body_lexeme = (_macro_body = macro.body) == null ? void 0 : _macro_body.lexeme) != null ? _macro_body_lexeme : "";
5372
- endIndex = i;
5373
- } else {
5374
- var _this__parseMacroFunctionArgs = this._parseMacroFunctionArgs(expandedBody, start, macroName), args = _this__parseMacroFunctionArgs.args, newEndIndex = _this__parseMacroFunctionArgs.endIndex;
5375
- replacement = macro.expandFunctionBody(args);
5376
- endIndex = newEndIndex;
5377
- }
5378
- expandedBody = expandedBody.substring(0, start) + replacement + expandedBody.substring(endIndex);
5379
- hasExpansion = true;
5380
- break;
5381
- }
5382
- }
5383
- return expandedBody;
5384
- };
5385
- MacroParser._expandMacroChunk = function _expandMacroChunk(chunk, loc, scannerOrFile) {
5386
- this._expandSegmentsStack.push([]);
5387
- var scanner;
5388
- if (typeof scannerOrFile === "string") {
5389
- scanner = new MacroParserLexer(chunk, scannerOrFile);
5390
- } else {
5391
- scanner = new MacroParserLexer(chunk, scannerOrFile.file, loc);
4990
+ ShaderInstructionEncoder._skipWs(ctx);
4991
+ var op1 = ShaderInstructionEncoder._scanOp(ctx);
4992
+ if (op1) {
4993
+ ShaderInstructionEncoder._skipWs(ctx);
4994
+ return {
4995
+ t: "cmp",
4996
+ m: name1,
4997
+ op: op1,
4998
+ v: ShaderInstructionEncoder._scanNumber(ctx)
4999
+ };
5392
5000
  }
5393
- var ret = this._parseDirectives(scanner);
5394
- this._expandSegmentsStack.pop();
5395
5001
  return {
5396
- content: ret
5002
+ t: "def",
5003
+ m: name1
5397
5004
  };
5398
5005
  };
5399
- MacroParser._addEmptyReplace = function _addEmptyReplace(lexer, start) {
5400
- this._addContentReplace(lexer.file, ShaderLab.createPosition(start), lexer.getShaderPosition(0), "", lexer.blockRange);
5401
- };
5402
- MacroParser._addContentReplace = function _addContentReplace(sourceFile, start, end, content, sourceRange, sourceMap) {
5403
- var range = ShaderLab.createRange(start, end);
5404
- this._getExpandSegments().push({
5405
- rangeInBlock: range,
5406
- replace: content
5407
- });
5408
- };
5409
- MacroParser._parseDefine = function _parseDefine(lexer) {
5410
- var start = lexer.getShaderPosition(7);
5411
- var macroName = lexer.scanWord();
5412
- var lexeme = macroName.lexeme, location = macroName.location;
5413
- var end = location.end;
5414
- if (this._definedMacros.get(lexeme) && lexeme.startsWith("GL_")) {
5415
- this._reportError(location, "Redefined macro: " + lexeme, lexer.source, lexer.file);
5416
- }
5417
- var macroArgs;
5418
- if (lexer.getCurChar() === "(") {
5419
- macroArgs = lexer.scanWordsUntilTerminator(")");
5420
- end = lexer.getShaderPosition(0);
5421
- }
5422
- var macroBody = lexer.scanMacroBody();
5423
- var range = ShaderLab.createRange(start, end);
5424
- var macroDefine = new MacroDefine(macroName, macroBody, range, macroArgs);
5425
- this._definedMacros.set(lexeme, macroDefine);
5426
- this._addContentReplace(lexer.file, start, lexer.getShaderPosition(0), "", lexer.blockRange);
5427
- };
5428
- MacroParser._parseUndef = function _parseUndef(lexer) {
5429
- var start = lexer.getShaderPosition(6);
5430
- var macroName = lexer.scanWord();
5431
- this._definedMacros.delete(macroName.lexeme);
5432
- this._addContentReplace(lexer.file, start, lexer.getShaderPosition(0), "", lexer.blockRange);
5433
- };
5434
- MacroParser._parseMacro = function _parseMacro(lexer, token) {
5435
- var macro = this._definedMacros.get(token.lexeme);
5436
- if (macro) {
5437
- var location = token.location;
5438
- if (macro.isFunction) {
5439
- var _this__parseMacroFunctionArgs = this._parseMacroFunctionArgs(lexer.source, location.start.index, token.lexeme), args = _this__parseMacroFunctionArgs.args, endIndex = _this__parseMacroFunctionArgs.endIndex;
5440
- var macroBodyExpanded = macro.expandFunctionBody(args);
5441
- var expandedContent = this._expandMacroBody(macroBodyExpanded);
5442
- var remainingLength = endIndex - location.end.index;
5443
- lexer.advance(remainingLength);
5444
- this._addContentReplace(lexer.file, location.start, lexer.getShaderPosition(0), expandedContent, lexer.blockRange);
5445
- } else {
5446
- var _macro_body;
5447
- var _macro_body_lexeme;
5448
- var macroContent = (_macro_body_lexeme = (_macro_body = macro.body) == null ? void 0 : _macro_body.lexeme) != null ? _macro_body_lexeme : "";
5449
- var expandedContent1 = this._expandMacroBody(macroContent);
5450
- this._addContentReplace(lexer.file, location.start, location.end, expandedContent1, lexer.blockRange);
5451
- }
5006
+ ShaderInstructionEncoder._isDigit = function _isDigit(charCode) {
5007
+ return charCode >= 48 /* '0' */ && charCode <= 57 /* '9' */ ;
5008
+ };
5009
+ ShaderInstructionEncoder._isAlnum = function _isAlnum(charCode) {
5010
+ return charCode >= 65 /* 'A' */ && charCode <= 90 || charCode >= 97 /* 'a' */ && charCode <= 122 || charCode >= 48 /* '0' */ && charCode <= 57 || charCode === 95 /* '_' */ ;
5011
+ };
5012
+ ShaderInstructionEncoder._scanIdentifier = function _scanIdentifier(ctx) {
5013
+ var start = ctx.i;
5014
+ while(ctx.i < ctx.s.length && ShaderInstructionEncoder._isAlnum(ctx.s.charCodeAt(ctx.i)))ctx.i++;
5015
+ return ctx.s.substring(start, ctx.i);
5016
+ };
5017
+ ShaderInstructionEncoder._scanNumber = function _scanNumber(ctx) {
5018
+ var start = ctx.i;
5019
+ if (ctx.s.charCodeAt(ctx.i) === 45 /* '-' */ ) ctx.i++;
5020
+ while(ctx.i < ctx.s.length && (ShaderInstructionEncoder._isDigit(ctx.s.charCodeAt(ctx.i)) || ctx.s.charCodeAt(ctx.i) === 46))ctx.i++;
5021
+ return Number(ctx.s.substring(start, ctx.i)) || 0;
5022
+ };
5023
+ ShaderInstructionEncoder._scanOp = function _scanOp(ctx) {
5024
+ var c = ctx.s.charCodeAt(ctx.i);
5025
+ var c2 = ctx.i + 1 < ctx.s.length ? ctx.s.charCodeAt(ctx.i + 1) : 0;
5026
+ if (c === 61 /* '=' */ && c2 === 61 /* '=' */ ) {
5027
+ ctx.i += 2;
5028
+ return "==";
5029
+ }
5030
+ if (c === 33 /* '!' */ && c2 === 61 /* '=' */ ) {
5031
+ ctx.i += 2;
5032
+ return "!=";
5033
+ }
5034
+ if (c === 62 /* '>' */ && c2 === 61 /* '=' */ ) {
5035
+ ctx.i += 2;
5036
+ return ">=";
5037
+ }
5038
+ if (c === 60 /* '<' */ && c2 === 61 /* '=' */ ) {
5039
+ ctx.i += 2;
5040
+ return "<=";
5041
+ }
5042
+ if (c === 62 /* '>' */ ) {
5043
+ ctx.i++;
5044
+ return ">";
5045
+ }
5046
+ if (c === 60 /* '<' */ ) {
5047
+ ctx.i++;
5048
+ return "<";
5049
+ }
5050
+ return "";
5051
+ };
5052
+ ShaderInstructionEncoder._evalNumOp = function _evalNumOp(lhs, op, rhs) {
5053
+ switch(op){
5054
+ case "==":
5055
+ return lhs === rhs;
5056
+ case "!=":
5057
+ return lhs !== rhs;
5058
+ case ">":
5059
+ return lhs > rhs;
5060
+ case "<":
5061
+ return lhs < rhs;
5062
+ case ">=":
5063
+ return lhs >= rhs;
5064
+ case "<=":
5065
+ return lhs <= rhs;
5066
+ default:
5067
+ return false;
5452
5068
  }
5453
5069
  };
5454
- return MacroParser;
5070
+ return ShaderInstructionEncoder;
5455
5071
  }();
5456
- MacroParser._definedMacros = new Map();
5457
- MacroParser._expandSegmentsStack = [
5458
- []
5459
- ];
5460
- MacroParser._expandVisitedMacros = {};
5461
- MacroParser._expandVersionId = 1;
5072
+ ShaderInstructionEncoder._DIRECTIVE_RE = /^[ \t]*#[ \t]*(if|ifdef|ifndef|elif|else|endif|define|undef)\b(.*)/;
5073
+ ShaderInstructionEncoder._FUNC_MACRO_RE = /^(\w+)\(([^)]*)\)\s*(.*)/;
5462
5074
 
5463
5075
  var StateItem = /*#__PURE__*/ function() {
5464
5076
  function StateItem(production, position, lookahead) {
@@ -7307,7 +6919,7 @@
7307
6919
  traceBackStack.push(nextState);
7308
6920
  continue;
7309
6921
  } else {
7310
- ShaderLabUtils.createGSError("Unexpected token " + token.lexeme, GSErrorName$1.CompilationError, ShaderLab._processingPassText, token.location);
6922
+ ShaderLabUtils.createGSError("Unexpected token " + token.lexeme, GSErrorName.CompilationError, ShaderLab._processingPassText, token.location);
7311
6923
  return null;
7312
6924
  }
7313
6925
  }
@@ -7498,7 +7110,7 @@
7498
7110
  }
7499
7111
  };
7500
7112
  _proto.createCompileError = function createCompileError(message, location) {
7501
- return ShaderLabUtils.createGSError(message, GSErrorName$1.CompilationError, this.source, location != null ? location : this.getShaderPosition(0));
7113
+ return ShaderLabUtils.createGSError(message, GSErrorName.CompilationError, this.source, location != null ? location : this.getShaderPosition(0));
7502
7114
  };
7503
7115
  _proto._scanWord = function _scanWord(start) {
7504
7116
  // Scan the complete word first
@@ -7960,7 +7572,7 @@
7960
7572
  lexer.scanLexeme("=");
7961
7573
  var entry = lexer.scanToken();
7962
7574
  if (passSource[token.lexeme]) {
7963
- ShaderLabUtils.createGSError("Reassign main entry", GSErrorName$1.CompilationError, lexer.source, lexer.getShaderPosition(0));
7575
+ ShaderLabUtils.createGSError("Reassign main entry", GSErrorName.CompilationError, lexer.source, lexer.getShaderPosition(0));
7964
7576
  }
7965
7577
  var key = token.type === Keyword.GSVertexShader ? "vertexEntry" : "fragmentEntry";
7966
7578
  passSource[key] = entry.lexeme;
@@ -8072,13 +7684,69 @@
8072
7684
  engine.Logger.info("[Task - CodeGen] cost time: " + (performance.now() - codeGenStartTime) + "ms");
8073
7685
  engine.Logger.info("[Task - Total compilation] cost time: " + (performance.now() - totalStartTime) + "ms");
8074
7686
  ShaderLab._processingPassText = undefined;
7687
+ if (ret) {
7688
+ // Always parse instructions for the compiled GLSL
7689
+ ret.vertexShaderInstructions = ShaderInstructionEncoder.parse(ret.vertex);
7690
+ ret.fragmentShaderInstructions = ShaderInstructionEncoder.parse(ret.fragment);
7691
+ }
8075
7692
  return ret;
8076
7693
  };
8077
- _proto._parseMacros = function _parseMacros(content, macros) {
8078
- var startTime = performance.now();
8079
- var parsedContent = MacroParser.parse(content, macros);
8080
- engine.Logger.info("[Task - parse macros] cost time: " + (performance.now() - startTime) + "ms");
8081
- return parsedContent;
7694
+ _proto._precompile = function _precompile(sourceCode, platformTarget, basePath) {
7695
+ var _this = this;
7696
+ var shaderSource = this._parseShaderSource(sourceCode);
7697
+ var subShaders = shaderSource.subShaders.map(function(sub) {
7698
+ return {
7699
+ name: sub.name,
7700
+ tags: sub.tags,
7701
+ passes: sub.passes.map(function(pass) {
7702
+ if (pass.isUsePass) {
7703
+ return {
7704
+ name: pass.name,
7705
+ isUsePass: true,
7706
+ tags: pass.tags,
7707
+ renderStates: _this._serializeRenderStates(pass.renderStates)
7708
+ };
7709
+ }
7710
+ var programSource = _this._parseShaderPass(pass.contents, pass.vertexEntry, pass.fragmentEntry, platformTarget, basePath);
7711
+ if (!programSource) {
7712
+ throw new Error('Shader pass "' + shaderSource.name + "." + sub.name + "." + pass.name + '" precompile failed, please check the shader source code.');
7713
+ }
7714
+ return {
7715
+ name: pass.name,
7716
+ isUsePass: false,
7717
+ tags: pass.tags,
7718
+ renderStates: _this._serializeRenderStates(pass.renderStates),
7719
+ vertexShaderInstructions: programSource.vertexShaderInstructions,
7720
+ fragmentShaderInstructions: programSource.fragmentShaderInstructions
7721
+ };
7722
+ })
7723
+ };
7724
+ });
7725
+ return {
7726
+ name: shaderSource.name,
7727
+ platformTarget: platformTarget,
7728
+ subShaders: subShaders
7729
+ };
7730
+ };
7731
+ _proto._serializeRenderStates = function _serializeRenderStates(renderStates) {
7732
+ var constantMap = {};
7733
+ for(var key in renderStates.constantMap){
7734
+ var value = renderStates.constantMap[key];
7735
+ if (_instanceof(value, engine.Color)) {
7736
+ constantMap[key] = [
7737
+ value.r,
7738
+ value.g,
7739
+ value.b,
7740
+ value.a
7741
+ ];
7742
+ } else {
7743
+ constantMap[key] = value;
7744
+ }
7745
+ }
7746
+ return {
7747
+ constantMap: constantMap,
7748
+ variableMap: renderStates.variableMap
7749
+ };
8082
7750
  };
8083
7751
  ShaderLab.createPosition = function createPosition(index, line, column) {
8084
7752
  var position = this._shaderPositionPool.get();
@@ -8097,12 +7765,12 @@
8097
7765
  ShaderLab._shaderRangePool = ShaderLabUtils.createObjectPool(ShaderRange);
8098
7766
 
8099
7767
  //@ts-ignore
8100
- var version = "2.0.0-alpha.24";
7768
+ var version = "2.0.0-alpha.26";
8101
7769
  var mode = "Release";
8102
7770
  console.log("Galacean Engine ShaderLab Version: " + version + " | Mode: " + mode);
8103
7771
 
8104
7772
  exports.GSError = GSError;
8105
- exports.GSErrorName = GSErrorName$1;
7773
+ exports.GSErrorName = GSErrorName;
8106
7774
  exports.ShaderLab = ShaderLab;
8107
7775
  exports.version = version;
8108
7776