@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/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/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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
-
|
|
4625
|
-
|
|
4626
|
-
|
|
4627
|
-
|
|
4628
|
-
|
|
4629
|
-
|
|
4630
|
-
|
|
4631
|
-
|
|
4632
|
-
|
|
4633
|
-
|
|
4634
|
-
|
|
4635
|
-
|
|
4636
|
-
|
|
4637
|
-
|
|
4638
|
-
|
|
4639
|
-
|
|
4640
|
-
|
|
4641
|
-
|
|
4642
|
-
|
|
4643
|
-
|
|
4644
|
-
|
|
4645
|
-
|
|
4646
|
-
|
|
4647
|
-
|
|
4648
|
-
|
|
4649
|
-
|
|
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
|
-
|
|
4829
|
-
|
|
4830
|
-
|
|
4831
|
-
|
|
4832
|
-
|
|
4833
|
-
|
|
4834
|
-
|
|
4835
|
-
|
|
4836
|
-
|
|
4837
|
-
|
|
4838
|
-
|
|
4839
|
-
|
|
4840
|
-
|
|
4841
|
-
|
|
4842
|
-
|
|
4843
|
-
|
|
4844
|
-
|
|
4845
|
-
|
|
4846
|
-
|
|
4847
|
-
|
|
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
|
-
|
|
4895
|
-
|
|
4896
|
-
|
|
4897
|
-
|
|
4898
|
-
|
|
4899
|
-
|
|
4900
|
-
|
|
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
|
-
|
|
4904
|
-
|
|
4905
|
-
|
|
4906
|
-
|
|
4907
|
-
|
|
4908
|
-
|
|
4909
|
-
|
|
4910
|
-
|
|
4911
|
-
|
|
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
|
-
|
|
4916
|
-
|
|
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
|
-
|
|
4928
|
-
valueToken.set(MacroParserToken.line_remain, lexeme, ShaderLab.createRange(start, this.getShaderPosition(0)));
|
|
4929
|
-
return valueToken;
|
|
4804
|
+
return instructions;
|
|
4930
4805
|
};
|
|
4931
|
-
|
|
4932
|
-
|
|
4933
|
-
|
|
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
|
-
|
|
4937
|
-
|
|
4938
|
-
|
|
4939
|
-
|
|
4940
|
-
|
|
4941
|
-
|
|
4942
|
-
|
|
4943
|
-
|
|
4944
|
-
|
|
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
|
|
5024
|
-
};
|
|
5025
|
-
MacroParser._getExpandSegments = function _getExpandSegments() {
|
|
5026
|
-
return this._expandSegmentsStack[this._expandSegmentsStack.length - 1];
|
|
4852
|
+
return -1;
|
|
5027
4853
|
};
|
|
5028
|
-
|
|
5029
|
-
|
|
5030
|
-
|
|
5031
|
-
|
|
5032
|
-
|
|
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
|
-
|
|
5057
|
-
|
|
4860
|
+
instructions.push([
|
|
4861
|
+
ShaderPreprocessorDirective.Text,
|
|
4862
|
+
source.substring(from, to)
|
|
4863
|
+
]);
|
|
5058
4864
|
}
|
|
5059
4865
|
};
|
|
5060
|
-
|
|
5061
|
-
|
|
5062
|
-
|
|
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
|
-
|
|
5065
|
-
|
|
5066
|
-
|
|
5067
|
-
|
|
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
|
-
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
|
-
|
|
5305
|
-
|
|
5306
|
-
|
|
5307
|
-
|
|
5308
|
-
|
|
5309
|
-
|
|
5310
|
-
|
|
5311
|
-
|
|
5312
|
-
|
|
5313
|
-
|
|
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
|
-
|
|
4975
|
+
return {
|
|
4976
|
+
t: "bool",
|
|
4977
|
+
v: lhsNum !== 0
|
|
4978
|
+
};
|
|
5330
4979
|
}
|
|
5331
|
-
|
|
5332
|
-
|
|
5333
|
-
|
|
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
|
-
|
|
5337
|
-
|
|
5338
|
-
|
|
5339
|
-
|
|
5340
|
-
|
|
5341
|
-
|
|
5342
|
-
|
|
5343
|
-
|
|
5344
|
-
|
|
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
|
-
|
|
4998
|
+
t: "def",
|
|
4999
|
+
m: name1
|
|
5393
5000
|
};
|
|
5394
5001
|
};
|
|
5395
|
-
|
|
5396
|
-
|
|
5397
|
-
};
|
|
5398
|
-
|
|
5399
|
-
|
|
5400
|
-
|
|
5401
|
-
|
|
5402
|
-
|
|
5403
|
-
|
|
5404
|
-
|
|
5405
|
-
|
|
5406
|
-
|
|
5407
|
-
var
|
|
5408
|
-
|
|
5409
|
-
|
|
5410
|
-
|
|
5411
|
-
|
|
5412
|
-
|
|
5413
|
-
var
|
|
5414
|
-
|
|
5415
|
-
|
|
5416
|
-
|
|
5417
|
-
|
|
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
|
-
|
|
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
|
|
5066
|
+
return ShaderInstructionEncoder;
|
|
5451
5067
|
}();
|
|
5452
|
-
|
|
5453
|
-
|
|
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
|
|
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
|
|
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
|
|
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.
|
|
8074
|
-
var
|
|
8075
|
-
var
|
|
8076
|
-
|
|
8077
|
-
|
|
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.
|
|
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
|
|
7768
|
+
export { GSError, GSErrorName, ShaderLab, version };
|
|
8101
7769
|
//# sourceMappingURL=module.js.map
|