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