@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 +493 -825
- package/dist/browser.js.map +1 -1
- package/dist/browser.min.js +1 -1
- package/dist/browser.min.js.map +1 -1
- package/dist/browser.verbose.js +483 -909
- package/dist/browser.verbose.js.map +1 -1
- package/dist/browser.verbose.min.js +1 -1
- package/dist/browser.verbose.min.js.map +1 -1
- package/dist/main.js +493 -825
- package/dist/main.js.map +1 -1
- package/dist/main.verbose.js +483 -909
- package/dist/main.verbose.js.map +1 -1
- package/dist/module.js +493 -825
- package/dist/module.js.map +1 -1
- package/dist/module.verbose.js +483 -909
- package/dist/module.verbose.js.map +1 -1
- package/package.json +4 -4
- package/types/ShaderInstructionEncoder.d.ts +1 -0
- package/types/ShaderLab.d.ts +4 -3
- package/types/macroProcessor/MacroDefine.d.ts +0 -13
- package/types/macroProcessor/MacroParser.d.ts +0 -7
- package/types/macroProcessor/MacroParserLexer.d.ts +0 -32
- package/types/macroProcessor/Utils.d.ts +0 -5
- package/types/macroProcessor/constants.d.ts +0 -54
- package/types/macroProcessor/index.d.ts +0 -1
- package/types/macroProcessor/sourceMap/index.d.ts +0 -37
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
-
|
|
4629
|
-
|
|
4630
|
-
|
|
4631
|
-
|
|
4632
|
-
|
|
4633
|
-
|
|
4634
|
-
|
|
4635
|
-
|
|
4636
|
-
|
|
4637
|
-
|
|
4638
|
-
|
|
4639
|
-
|
|
4640
|
-
|
|
4641
|
-
|
|
4642
|
-
|
|
4643
|
-
|
|
4644
|
-
|
|
4645
|
-
|
|
4646
|
-
|
|
4647
|
-
|
|
4648
|
-
|
|
4649
|
-
|
|
4650
|
-
|
|
4651
|
-
|
|
4652
|
-
|
|
4653
|
-
|
|
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
|
-
|
|
4833
|
-
|
|
4834
|
-
|
|
4835
|
-
|
|
4836
|
-
|
|
4837
|
-
|
|
4838
|
-
|
|
4839
|
-
|
|
4840
|
-
|
|
4841
|
-
|
|
4842
|
-
|
|
4843
|
-
|
|
4844
|
-
|
|
4845
|
-
|
|
4846
|
-
|
|
4847
|
-
|
|
4848
|
-
|
|
4849
|
-
|
|
4850
|
-
|
|
4851
|
-
|
|
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
|
-
|
|
4899
|
-
|
|
4900
|
-
|
|
4901
|
-
|
|
4902
|
-
|
|
4903
|
-
|
|
4904
|
-
|
|
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
|
-
|
|
4908
|
-
|
|
4909
|
-
|
|
4910
|
-
|
|
4911
|
-
|
|
4912
|
-
|
|
4913
|
-
|
|
4914
|
-
|
|
4915
|
-
|
|
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
|
-
|
|
4920
|
-
|
|
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
|
-
|
|
4932
|
-
valueToken.set(MacroParserToken.line_remain, lexeme, ShaderLab.createRange(start, this.getShaderPosition(0)));
|
|
4933
|
-
return valueToken;
|
|
4808
|
+
return instructions;
|
|
4934
4809
|
};
|
|
4935
|
-
|
|
4936
|
-
|
|
4937
|
-
|
|
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
|
-
|
|
4941
|
-
|
|
4942
|
-
|
|
4943
|
-
|
|
4944
|
-
|
|
4945
|
-
|
|
4946
|
-
|
|
4947
|
-
|
|
4948
|
-
|
|
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
|
|
5028
|
-
};
|
|
5029
|
-
MacroParser._getExpandSegments = function _getExpandSegments() {
|
|
5030
|
-
return this._expandSegmentsStack[this._expandSegmentsStack.length - 1];
|
|
4856
|
+
return -1;
|
|
5031
4857
|
};
|
|
5032
|
-
|
|
5033
|
-
|
|
5034
|
-
|
|
5035
|
-
|
|
5036
|
-
|
|
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
|
-
|
|
5061
|
-
|
|
4864
|
+
instructions.push([
|
|
4865
|
+
ShaderPreprocessorDirective.Text,
|
|
4866
|
+
source.substring(from, to)
|
|
4867
|
+
]);
|
|
5062
4868
|
}
|
|
5063
4869
|
};
|
|
5064
|
-
|
|
5065
|
-
|
|
5066
|
-
|
|
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
|
-
|
|
5069
|
-
|
|
5070
|
-
|
|
5071
|
-
|
|
5072
|
-
|
|
5073
|
-
|
|
5074
|
-
|
|
5075
|
-
|
|
5076
|
-
|
|
5077
|
-
|
|
5078
|
-
|
|
5079
|
-
|
|
5080
|
-
|
|
5081
|
-
|
|
5082
|
-
|
|
5083
|
-
|
|
5084
|
-
|
|
5085
|
-
|
|
5086
|
-
|
|
5087
|
-
|
|
5088
|
-
|
|
5089
|
-
|
|
5090
|
-
|
|
5091
|
-
|
|
5092
|
-
|
|
5093
|
-
|
|
5094
|
-
|
|
5095
|
-
|
|
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
|
-
|
|
5309
|
-
|
|
5310
|
-
|
|
5311
|
-
|
|
5312
|
-
|
|
5313
|
-
|
|
5314
|
-
|
|
5315
|
-
|
|
5316
|
-
|
|
5317
|
-
|
|
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
|
-
|
|
4979
|
+
return {
|
|
4980
|
+
t: "bool",
|
|
4981
|
+
v: lhsNum !== 0
|
|
4982
|
+
};
|
|
5334
4983
|
}
|
|
5335
|
-
|
|
5336
|
-
|
|
5337
|
-
|
|
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
|
-
|
|
5341
|
-
|
|
5342
|
-
|
|
5343
|
-
|
|
5344
|
-
|
|
5345
|
-
|
|
5346
|
-
|
|
5347
|
-
|
|
5348
|
-
|
|
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
|
-
|
|
5002
|
+
t: "def",
|
|
5003
|
+
m: name1
|
|
5397
5004
|
};
|
|
5398
5005
|
};
|
|
5399
|
-
|
|
5400
|
-
|
|
5401
|
-
};
|
|
5402
|
-
|
|
5403
|
-
|
|
5404
|
-
|
|
5405
|
-
|
|
5406
|
-
|
|
5407
|
-
|
|
5408
|
-
|
|
5409
|
-
|
|
5410
|
-
|
|
5411
|
-
var
|
|
5412
|
-
|
|
5413
|
-
|
|
5414
|
-
|
|
5415
|
-
|
|
5416
|
-
|
|
5417
|
-
var
|
|
5418
|
-
|
|
5419
|
-
|
|
5420
|
-
|
|
5421
|
-
|
|
5422
|
-
|
|
5423
|
-
|
|
5424
|
-
|
|
5425
|
-
|
|
5426
|
-
|
|
5427
|
-
|
|
5428
|
-
|
|
5429
|
-
|
|
5430
|
-
|
|
5431
|
-
|
|
5432
|
-
|
|
5433
|
-
|
|
5434
|
-
|
|
5435
|
-
|
|
5436
|
-
|
|
5437
|
-
|
|
5438
|
-
|
|
5439
|
-
|
|
5440
|
-
|
|
5441
|
-
|
|
5442
|
-
|
|
5443
|
-
|
|
5444
|
-
|
|
5445
|
-
|
|
5446
|
-
|
|
5447
|
-
|
|
5448
|
-
|
|
5449
|
-
|
|
5450
|
-
|
|
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
|
|
5070
|
+
return ShaderInstructionEncoder;
|
|
5455
5071
|
}();
|
|
5456
|
-
|
|
5457
|
-
|
|
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
|
|
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
|
|
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
|
|
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.
|
|
8078
|
-
var
|
|
8079
|
-
var
|
|
8080
|
-
|
|
8081
|
-
|
|
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.
|
|
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
|
|
7773
|
+
exports.GSErrorName = GSErrorName;
|
|
8106
7774
|
exports.ShaderLab = ShaderLab;
|
|
8107
7775
|
exports.version = version;
|
|
8108
7776
|
|