@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/module.verbose.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 _array_like_to_array(arr, len) {
|
|
4
10
|
if (len == null || len > arr.length) len = arr.length;
|
|
5
11
|
|
|
@@ -59,12 +65,6 @@ function _inherits(subClass, superClass) {
|
|
|
59
65
|
if (superClass) _set_prototype_of(subClass, superClass);
|
|
60
66
|
}
|
|
61
67
|
|
|
62
|
-
function _instanceof(left, right) {
|
|
63
|
-
if (right != null && typeof Symbol !== "undefined" && right[Symbol.hasInstance]) {
|
|
64
|
-
return !!right[Symbol.hasInstance](left);
|
|
65
|
-
} else return left instanceof right;
|
|
66
|
-
}
|
|
67
|
-
|
|
68
68
|
function _defineProperties(target, props) {
|
|
69
69
|
for (var i = 0; i < props.length; i++) {
|
|
70
70
|
var descriptor = props[i];
|
|
@@ -5475,933 +5475,452 @@ Lexer._lexemeTable = {
|
|
|
5475
5475
|
"#undef": Keyword.MACRO_UNDEF
|
|
5476
5476
|
};
|
|
5477
5477
|
|
|
5478
|
-
|
|
5479
|
-
|
|
5480
|
-
|
|
5481
|
-
|
|
5482
|
-
|
|
5483
|
-
|
|
5484
|
-
|
|
5485
|
-
|
|
5486
|
-
|
|
5487
|
-
|
|
5488
|
-
|
|
5489
|
-
|
|
5490
|
-
/** \>> */ MacroParserToken[MacroParserToken["right_op"] = 5] = "right_op";
|
|
5491
|
-
/** << */ MacroParserToken[MacroParserToken["left_op"] = 6] = "left_op";
|
|
5492
|
-
MacroParserToken[MacroParserToken["left_paren"] = 7] = "left_paren";
|
|
5493
|
-
MacroParserToken[MacroParserToken["right_paren"] = 8] = "right_paren";
|
|
5494
|
-
/** \>= */ MacroParserToken[MacroParserToken["ge"] = 9] = "ge";
|
|
5495
|
-
/** <= */ MacroParserToken[MacroParserToken["le"] = 10] = "le";
|
|
5496
|
-
/** == */ MacroParserToken[MacroParserToken["eq"] = 11] = "eq";
|
|
5497
|
-
/** != */ MacroParserToken[MacroParserToken["neq"] = 12] = "neq";
|
|
5498
|
-
/** && */ MacroParserToken[MacroParserToken["and"] = 13] = "and";
|
|
5499
|
-
/** || */ MacroParserToken[MacroParserToken["or"] = 14] = "or";
|
|
5500
|
-
/** < */ MacroParserToken[MacroParserToken["left_angle"] = 15] = "left_angle";
|
|
5501
|
-
/** \> */ MacroParserToken[MacroParserToken["right_angle"] = 16] = "right_angle";
|
|
5502
|
-
/** \* */ MacroParserToken[MacroParserToken["star"] = 17] = "star";
|
|
5503
|
-
/** + */ MacroParserToken[MacroParserToken["plus"] = 18] = "plus";
|
|
5504
|
-
/** \- */ MacroParserToken[MacroParserToken["dash"] = 19] = "dash";
|
|
5505
|
-
/** ! */ MacroParserToken[MacroParserToken["bang"] = 20] = "bang";
|
|
5506
|
-
/** \/ */ MacroParserToken[MacroParserToken["slash"] = 21] = "slash";
|
|
5507
|
-
/** % */ MacroParserToken[MacroParserToken["percent"] = 22] = "percent";
|
|
5508
|
-
MacroParserToken[MacroParserToken["EOF"] = 100] = "EOF";
|
|
5509
|
-
return MacroParserToken;
|
|
5510
|
-
}({});
|
|
5511
|
-
var MacroParserKeyword = /*#__PURE__*/ function(MacroParserKeyword) {
|
|
5512
|
-
MacroParserKeyword[MacroParserKeyword["define"] = 101] = "define";
|
|
5513
|
-
MacroParserKeyword[MacroParserKeyword["undef"] = 102] = "undef";
|
|
5514
|
-
MacroParserKeyword[MacroParserKeyword["if"] = 103] = "if";
|
|
5515
|
-
MacroParserKeyword[MacroParserKeyword["ifdef"] = 104] = "ifdef";
|
|
5516
|
-
MacroParserKeyword[MacroParserKeyword["ifndef"] = 105] = "ifndef";
|
|
5517
|
-
MacroParserKeyword[MacroParserKeyword["else"] = 106] = "else";
|
|
5518
|
-
MacroParserKeyword[MacroParserKeyword["elif"] = 107] = "elif";
|
|
5519
|
-
MacroParserKeyword[MacroParserKeyword["endif"] = 108] = "endif";
|
|
5520
|
-
MacroParserKeyword[MacroParserKeyword["defined"] = 109] = "defined";
|
|
5521
|
-
return MacroParserKeyword;
|
|
5522
|
-
}({});
|
|
5523
|
-
|
|
5524
|
-
var MacroDefine = /*#__PURE__*/ function() {
|
|
5525
|
-
function MacroDefine(macro, body, location, args) {
|
|
5526
|
-
this.macro = macro;
|
|
5527
|
-
this.body = body;
|
|
5528
|
-
this.location = location;
|
|
5529
|
-
this.args = args;
|
|
5530
|
-
if ((args == null ? void 0 : args.length) > 0) {
|
|
5531
|
-
this._argsLexemes = this.args.map(function(item) {
|
|
5532
|
-
return item.lexeme;
|
|
5533
|
-
});
|
|
5534
|
-
this._replaceRegex = new RegExp("\\b(" + this._argsLexemes.join("|") + ")\\b", "g");
|
|
5535
|
-
}
|
|
5536
|
-
}
|
|
5537
|
-
var _proto = MacroDefine.prototype;
|
|
5538
|
-
_proto.expandFunctionBody = function expandFunctionBody(args) {
|
|
5539
|
-
var _this = this;
|
|
5540
|
-
var _this_args;
|
|
5541
|
-
if (args.length !== ((_this_args = this.args) == null ? void 0 : _this_args.length)) {
|
|
5542
|
-
throw ShaderLabUtils.createGSError("mismatched function macro", GSErrorName.PreprocessorError, "", this.location);
|
|
5543
|
-
}
|
|
5544
|
-
if (args.length === 0) {
|
|
5545
|
-
return this.body.lexeme;
|
|
5546
|
-
}
|
|
5547
|
-
return this.body.lexeme.replace(this._replaceRegex, function(m) {
|
|
5548
|
-
return args[_this._argsLexemes.indexOf(m)];
|
|
5549
|
-
});
|
|
5550
|
-
};
|
|
5551
|
-
_create_class(MacroDefine, [
|
|
5552
|
-
{
|
|
5553
|
-
key: "isFunction",
|
|
5554
|
-
get: function get() {
|
|
5555
|
-
return !!this.args;
|
|
5556
|
-
}
|
|
5557
|
-
}
|
|
5558
|
-
]);
|
|
5559
|
-
return MacroDefine;
|
|
5560
|
-
}();
|
|
5561
|
-
|
|
5562
|
-
var BlockInfo = function BlockInfo(sourceFile, rangeInFile, sourceMap) {
|
|
5563
|
-
this.sourceFile = sourceFile != null ? sourceFile : "__main__";
|
|
5564
|
-
this.rangeInFile = rangeInFile;
|
|
5565
|
-
this.sourceMap = sourceMap;
|
|
5478
|
+
/** Must stay in sync with ShaderPreprocessorDirective in @galacean/engine-core */ var ShaderPreprocessorDirective = {
|
|
5479
|
+
Text: 0,
|
|
5480
|
+
IfDef: 1,
|
|
5481
|
+
IfNdef: 2,
|
|
5482
|
+
IfCmp: 3,
|
|
5483
|
+
IfExpr: 4,
|
|
5484
|
+
Else: 5,
|
|
5485
|
+
Endif: 6,
|
|
5486
|
+
Define: 7,
|
|
5487
|
+
DefineVal: 8,
|
|
5488
|
+
DefineFunc: 9,
|
|
5489
|
+
Undef: 10
|
|
5566
5490
|
};
|
|
5567
|
-
|
|
5568
|
-
|
|
5569
|
-
|
|
5570
|
-
|
|
5571
|
-
|
|
5572
|
-
|
|
5573
|
-
|
|
5574
|
-
|
|
5575
|
-
|
|
5576
|
-
|
|
5577
|
-
|
|
5578
|
-
|
|
5579
|
-
|
|
5580
|
-
if (block.sourceFile !== "__main__") return block.sourceMap.map(generatedIdx - this.generatedLoc.start);
|
|
5581
|
-
else if (rangeInBlock) {
|
|
5582
|
-
var _block_rangeInFile1;
|
|
5583
|
-
var _block_rangeInFile_start_index;
|
|
5584
|
-
return {
|
|
5585
|
-
sourceFile: block.sourceFile,
|
|
5586
|
-
index: ((_block_rangeInFile_start_index = (_block_rangeInFile1 = block.rangeInFile) == null ? void 0 : _block_rangeInFile1.start.index) != null ? _block_rangeInFile_start_index : 0) + rangeInBlock.start.index
|
|
5587
|
-
};
|
|
5588
|
-
}
|
|
5589
|
-
}
|
|
5590
|
-
var _block_rangeInFile_start_index1;
|
|
5591
|
-
return {
|
|
5592
|
-
index: generatedIdx - this.generatedLoc.start + rangeInBlock.start.index + ((_block_rangeInFile_start_index1 = (_block_rangeInFile = block.rangeInFile) == null ? void 0 : _block_rangeInFile.start.index) != null ? _block_rangeInFile_start_index1 : 0),
|
|
5593
|
-
sourceFile: this.sourceLoc.block.sourceFile
|
|
5594
|
-
};
|
|
5595
|
-
};
|
|
5596
|
-
return MapRange;
|
|
5597
|
-
}();
|
|
5598
|
-
var PpSourceMap = /*#__PURE__*/ function() {
|
|
5599
|
-
function PpSourceMap() {
|
|
5600
|
-
this.mapRanges = [];
|
|
5601
|
-
}
|
|
5602
|
-
var _proto = PpSourceMap.prototype;
|
|
5603
|
-
_proto.addMapRange = function addMapRange(mapRange) {
|
|
5604
|
-
this.mapRanges.push(mapRange);
|
|
5605
|
-
};
|
|
5606
|
-
/**
|
|
5607
|
-
* @returns index
|
|
5608
|
-
*/ _proto.map = function map(index) {
|
|
5609
|
-
var curRange;
|
|
5610
|
-
for(var _iterator = _create_for_of_iterator_helper_loose(this.mapRanges), _step; !(_step = _iterator()).done;){
|
|
5611
|
-
var range = _step.value;
|
|
5612
|
-
var generatedLoc = range.generatedLoc;
|
|
5613
|
-
if (PpSourceMap.rangeContains(generatedLoc, index)) {
|
|
5614
|
-
return range.getSourceIndex(index);
|
|
5615
|
-
} else if (range.generatedLoc.start < index) {
|
|
5616
|
-
curRange = range;
|
|
5617
|
-
continue;
|
|
5618
|
-
} else {
|
|
5491
|
+
/**
|
|
5492
|
+
* @internal
|
|
5493
|
+
*/ var ShaderInstructionEncoder = /*#__PURE__*/ function() {
|
|
5494
|
+
function ShaderInstructionEncoder() {}
|
|
5495
|
+
ShaderInstructionEncoder.parse = function parse(glsl) {
|
|
5496
|
+
var instructions = [];
|
|
5497
|
+
var length = glsl.length;
|
|
5498
|
+
var pos = 0;
|
|
5499
|
+
var backfillStack = [];
|
|
5500
|
+
while(pos < length){
|
|
5501
|
+
var directiveStart = ShaderInstructionEncoder._findDirectiveStart(glsl, pos, length);
|
|
5502
|
+
if (directiveStart === -1) {
|
|
5503
|
+
ShaderInstructionEncoder._pushText(instructions, glsl, pos, length);
|
|
5619
5504
|
break;
|
|
5620
5505
|
}
|
|
5621
|
-
|
|
5622
|
-
|
|
5623
|
-
|
|
5624
|
-
|
|
5625
|
-
|
|
5626
|
-
|
|
5627
|
-
|
|
5628
|
-
|
|
5629
|
-
|
|
5630
|
-
|
|
5631
|
-
|
|
5632
|
-
|
|
5633
|
-
|
|
5634
|
-
|
|
5635
|
-
|
|
5636
|
-
|
|
5637
|
-
|
|
5638
|
-
|
|
5639
|
-
function MacroParserLexer(source, file, blockRange) {
|
|
5640
|
-
if (file === void 0) file = "__main__";
|
|
5641
|
-
var _this;
|
|
5642
|
-
_this = BaseLexer1.call(this, source) || this, _this.macroLvl = 0, _this.sourceMap = new PpSourceMap();
|
|
5643
|
-
_this.file = file;
|
|
5644
|
-
_this.blockRange = blockRange;
|
|
5645
|
-
return _this;
|
|
5646
|
-
}
|
|
5647
|
-
var _proto = MacroParserLexer.prototype;
|
|
5648
|
-
_proto.scanWordsUntilTerminator = function scanWordsUntilTerminator(terminatorChar) {
|
|
5649
|
-
var tokens = [];
|
|
5650
|
-
while(true){
|
|
5651
|
-
this.skipSpace(true);
|
|
5652
|
-
if (BaseLexer.isAlpha(this.getCurCharCode())) {
|
|
5653
|
-
tokens.push(this.scanWord());
|
|
5654
|
-
} else if (this.getCurChar() === terminatorChar) {
|
|
5655
|
-
this.advance(1);
|
|
5656
|
-
return tokens;
|
|
5657
|
-
} else {
|
|
5658
|
-
this.advance(1);
|
|
5659
|
-
}
|
|
5660
|
-
}
|
|
5661
|
-
};
|
|
5662
|
-
_proto.scanWord = function scanWord() {
|
|
5663
|
-
// Skip all non-alphabetic characters, primarily used for handling defined(MACRO) syntax
|
|
5664
|
-
while(!BaseLexer.isAlpha(this.getCurCharCode()) && !this.isEnd()){
|
|
5665
|
-
this.advance(1);
|
|
5666
|
-
}
|
|
5667
|
-
if (this.isEnd()) {
|
|
5668
|
-
return EOF;
|
|
5669
|
-
}
|
|
5670
|
-
var start = this._currentIndex;
|
|
5671
|
-
while(BaseLexer.isAlnum(this.getCurCharCode()) && !this.isEnd()){
|
|
5672
|
-
this.advance(1);
|
|
5673
|
-
}
|
|
5674
|
-
var end = this._currentIndex;
|
|
5675
|
-
var word = this._source.slice(start, end);
|
|
5676
|
-
if (end === start) {
|
|
5677
|
-
this.throwError(this.getShaderPosition(0), "no word found.");
|
|
5678
|
-
}
|
|
5679
|
-
var token = BaseToken.pool.get();
|
|
5680
|
-
var _MacroParserLexer__lexemeTable_word;
|
|
5681
|
-
var tokenType = (_MacroParserLexer__lexemeTable_word = MacroParserLexer._lexemeTable[word]) != null ? _MacroParserLexer__lexemeTable_word : MacroParserToken.id;
|
|
5682
|
-
token.set(tokenType, word, this.getShaderPosition(word.length));
|
|
5683
|
-
return token;
|
|
5684
|
-
};
|
|
5685
|
-
_proto.scanToken = function scanToken() {
|
|
5686
|
-
this.skipCommentsAndSpace();
|
|
5687
|
-
if (this.isEnd()) {
|
|
5688
|
-
return;
|
|
5689
|
-
}
|
|
5690
|
-
var source = this._source;
|
|
5691
|
-
var start = this._currentIndex;
|
|
5692
|
-
var found = false;
|
|
5693
|
-
for(var n = source.length; this._currentIndex < n;){
|
|
5694
|
-
if (MacroParserLexer._isPpCharacters(source.charCodeAt(this._currentIndex))) {
|
|
5695
|
-
this.advance(1);
|
|
5696
|
-
found = true;
|
|
5697
|
-
} else {
|
|
5698
|
-
if (found) {
|
|
5699
|
-
break;
|
|
5506
|
+
if (directiveStart > pos) {
|
|
5507
|
+
ShaderInstructionEncoder._pushText(instructions, glsl, pos, directiveStart);
|
|
5508
|
+
}
|
|
5509
|
+
var lineEnd = glsl.indexOf("\n", directiveStart);
|
|
5510
|
+
if (lineEnd === -1) lineEnd = length;
|
|
5511
|
+
var line = glsl.substring(directiveStart, lineEnd);
|
|
5512
|
+
pos = lineEnd < length ? lineEnd + 1 : length;
|
|
5513
|
+
var match = ShaderInstructionEncoder._DIRECTIVE_RE.exec(line);
|
|
5514
|
+
if (!match) {
|
|
5515
|
+
var last = instructions.length > 0 ? instructions[instructions.length - 1] : null;
|
|
5516
|
+
var text = lineEnd < length ? line + "\n" : line;
|
|
5517
|
+
if (last && last[0] === ShaderPreprocessorDirective.Text) {
|
|
5518
|
+
last[1] += text;
|
|
5519
|
+
} else {
|
|
5520
|
+
instructions.push([
|
|
5521
|
+
ShaderPreprocessorDirective.Text,
|
|
5522
|
+
text
|
|
5523
|
+
]);
|
|
5700
5524
|
}
|
|
5701
|
-
|
|
5702
|
-
this.skipCommentsAndSpace();
|
|
5703
|
-
start = this._currentIndex;
|
|
5704
|
-
}
|
|
5705
|
-
}
|
|
5706
|
-
var lexeme = source.slice(start, this._currentIndex);
|
|
5707
|
-
var token = BaseToken.pool.get();
|
|
5708
|
-
var _MacroParserLexer__lexemeTable_lexeme;
|
|
5709
|
-
var type = (_MacroParserLexer__lexemeTable_lexeme = MacroParserLexer._lexemeTable[lexeme]) != null ? _MacroParserLexer__lexemeTable_lexeme : MacroParserToken.id;
|
|
5710
|
-
token.set(type, lexeme, this.getShaderPosition(this._currentIndex - start));
|
|
5711
|
-
if (type === MacroParserKeyword.if || type === MacroParserKeyword.ifdef || type === MacroParserKeyword.ifndef) {
|
|
5712
|
-
this.macroLvl++;
|
|
5713
|
-
} else if (type === MacroParserKeyword.endif) {
|
|
5714
|
-
this.macroLvl--;
|
|
5715
|
-
}
|
|
5716
|
-
return token;
|
|
5717
|
-
};
|
|
5718
|
-
_proto.scanQuotedString = function scanQuotedString() {
|
|
5719
|
-
this.skipSpace(true);
|
|
5720
|
-
var source = this._source;
|
|
5721
|
-
var sourceLength = source.length;
|
|
5722
|
-
var start = this.getShaderPosition(0);
|
|
5723
|
-
var index = this._currentIndex;
|
|
5724
|
-
// Check for opening quote
|
|
5725
|
-
if (source.charCodeAt(index) !== 34) {
|
|
5726
|
-
// 34 = '"'
|
|
5727
|
-
this.throwError(start, "Unexpected char, expected '\"'");
|
|
5728
|
-
}
|
|
5729
|
-
var contentStart = ++index; // Skip opening quote and record start
|
|
5730
|
-
// Fast scan to closing quote
|
|
5731
|
-
while(index < sourceLength && source.charCodeAt(index) !== 34){
|
|
5732
|
-
index++;
|
|
5733
|
-
}
|
|
5734
|
-
if (index >= sourceLength) {
|
|
5735
|
-
this.throwError(this.getShaderPosition(0), "Unexpected char, expected '\"'");
|
|
5736
|
-
}
|
|
5737
|
-
var lexeme = source.slice(contentStart, index);
|
|
5738
|
-
this.advance(index + 1 - this._currentIndex); // Skip to after closing quote
|
|
5739
|
-
var token = BaseToken.pool.get();
|
|
5740
|
-
token.set(MacroParserToken.string_const, lexeme, start);
|
|
5741
|
-
return token;
|
|
5742
|
-
};
|
|
5743
|
-
_proto.scanToChar = function scanToChar(char) {
|
|
5744
|
-
var source = this._source;
|
|
5745
|
-
while(source[this._currentIndex] !== char && !this.isEnd()){
|
|
5746
|
-
this.advance(1);
|
|
5747
|
-
}
|
|
5748
|
-
};
|
|
5749
|
-
_proto.scanMacroBranchBody = function scanMacroBranchBody() {
|
|
5750
|
-
var shaderPosition = this.getShaderPosition(0);
|
|
5751
|
-
var startLevel = this.macroLvl;
|
|
5752
|
-
var nextDirective = this.scanToken();
|
|
5753
|
-
while(true){
|
|
5754
|
-
var type = nextDirective.type;
|
|
5755
|
-
if (type === MacroParserKeyword.endif && startLevel - 1 === this.macroLvl) {
|
|
5756
|
-
break;
|
|
5757
|
-
} else if ((type === MacroParserKeyword.elif || type === MacroParserKeyword.else) && startLevel === this.macroLvl) {
|
|
5758
|
-
break;
|
|
5759
|
-
}
|
|
5760
|
-
nextDirective = this.scanToken();
|
|
5761
|
-
}
|
|
5762
|
-
var lexeme = this._source.slice(shaderPosition.index, this._currentIndex - nextDirective.lexeme.length - 1);
|
|
5763
|
-
var body = BaseToken.pool.get();
|
|
5764
|
-
body.set(MacroParserToken.chunk, lexeme, shaderPosition);
|
|
5765
|
-
return {
|
|
5766
|
-
body: body,
|
|
5767
|
-
nextDirective: nextDirective
|
|
5768
|
-
};
|
|
5769
|
-
};
|
|
5770
|
-
_proto.scanPairedBlock = function scanPairedBlock(lc, rc) {
|
|
5771
|
-
this.scanToChar(lc);
|
|
5772
|
-
var level = 0;
|
|
5773
|
-
var source = this._source;
|
|
5774
|
-
do {
|
|
5775
|
-
var curChar = source[this._currentIndex];
|
|
5776
|
-
if (curChar === lc) {
|
|
5777
|
-
level++;
|
|
5778
|
-
} else if (curChar === rc) {
|
|
5779
|
-
level--;
|
|
5780
|
-
}
|
|
5781
|
-
this.advance(1);
|
|
5782
|
-
}while (level > 0);
|
|
5783
|
-
};
|
|
5784
|
-
/**
|
|
5785
|
-
* @returns end ShaderPosition
|
|
5786
|
-
*/ _proto.scanRemainMacro = function scanRemainMacro() {
|
|
5787
|
-
var startLvl = this.macroLvl;
|
|
5788
|
-
var directive = this.scanToken();
|
|
5789
|
-
while(!this.isEnd() && (directive.type !== MacroParserKeyword.endif || startLvl - 1 !== this.macroLvl)){
|
|
5790
|
-
directive = this.scanToken();
|
|
5791
|
-
}
|
|
5792
|
-
return this.getShaderPosition(0);
|
|
5793
|
-
};
|
|
5794
|
-
_proto.peekNonSpace = function peekNonSpace() {
|
|
5795
|
-
var current = this._currentIndex;
|
|
5796
|
-
while(/\s/.test(this._source[current])){
|
|
5797
|
-
current += 1;
|
|
5798
|
-
}
|
|
5799
|
-
return this._source[current];
|
|
5800
|
-
};
|
|
5801
|
-
_proto.scanInteger = function scanInteger() {
|
|
5802
|
-
var start = this._currentIndex;
|
|
5803
|
-
while(BaseLexer.isDigit(this.getCurCharCode())){
|
|
5804
|
-
this.advance(1);
|
|
5805
|
-
}
|
|
5806
|
-
if (this._currentIndex === start) {
|
|
5807
|
-
this.throwError(this.getShaderPosition(0), "no integer found");
|
|
5808
|
-
}
|
|
5809
|
-
var integer = this._source.slice(start, this._currentIndex);
|
|
5810
|
-
var token = BaseToken.pool.get();
|
|
5811
|
-
token.set(MacroParserToken.int_constant, integer, this.getShaderPosition(0));
|
|
5812
|
-
return token;
|
|
5813
|
-
};
|
|
5814
|
-
_proto.scanMacroBody = function scanMacroBody() {
|
|
5815
|
-
this.skipSpace(false);
|
|
5816
|
-
var lexeme = "";
|
|
5817
|
-
var source = this._source;
|
|
5818
|
-
var sourceLength = source.length;
|
|
5819
|
-
var start = this.getShaderPosition(0);
|
|
5820
|
-
while(this._currentIndex < sourceLength){
|
|
5821
|
-
var charCode = source.charCodeAt(this._currentIndex);
|
|
5822
|
-
// Check for line break (terminates macro definition), break when encounter "\n"
|
|
5823
|
-
if (charCode === 10) {
|
|
5824
|
-
break;
|
|
5525
|
+
continue;
|
|
5825
5526
|
}
|
|
5826
|
-
|
|
5827
|
-
|
|
5828
|
-
|
|
5829
|
-
|
|
5830
|
-
|
|
5831
|
-
|
|
5832
|
-
|
|
5527
|
+
var keyword = match[1];
|
|
5528
|
+
var rest = match[2].trim();
|
|
5529
|
+
switch(keyword){
|
|
5530
|
+
case "ifdef":
|
|
5531
|
+
{
|
|
5532
|
+
var idx = instructions.length;
|
|
5533
|
+
instructions.push([
|
|
5534
|
+
ShaderPreprocessorDirective.IfDef,
|
|
5535
|
+
rest,
|
|
5536
|
+
-1
|
|
5537
|
+
]);
|
|
5538
|
+
backfillStack.push([
|
|
5539
|
+
idx
|
|
5540
|
+
]);
|
|
5541
|
+
break;
|
|
5542
|
+
}
|
|
5543
|
+
case "ifndef":
|
|
5544
|
+
{
|
|
5545
|
+
var idx1 = instructions.length;
|
|
5546
|
+
instructions.push([
|
|
5547
|
+
ShaderPreprocessorDirective.IfNdef,
|
|
5548
|
+
rest,
|
|
5549
|
+
-1
|
|
5550
|
+
]);
|
|
5551
|
+
backfillStack.push([
|
|
5552
|
+
idx1
|
|
5553
|
+
]);
|
|
5833
5554
|
break;
|
|
5834
5555
|
}
|
|
5835
|
-
|
|
5836
|
-
|
|
5837
|
-
|
|
5838
|
-
|
|
5839
|
-
|
|
5840
|
-
|
|
5841
|
-
|
|
5842
|
-
|
|
5843
|
-
|
|
5556
|
+
case "if":
|
|
5557
|
+
{
|
|
5558
|
+
var cond = ShaderInstructionEncoder._parseCondition(rest);
|
|
5559
|
+
var idx2 = instructions.length;
|
|
5560
|
+
ShaderInstructionEncoder._pushConditionInstruction(instructions, cond);
|
|
5561
|
+
backfillStack.push([
|
|
5562
|
+
idx2
|
|
5563
|
+
]);
|
|
5564
|
+
break;
|
|
5565
|
+
}
|
|
5566
|
+
case "elif":
|
|
5567
|
+
{
|
|
5568
|
+
var stack = backfillStack[backfillStack.length - 1];
|
|
5569
|
+
var prevIdx = stack[stack.length - 1];
|
|
5570
|
+
var elseIdx = instructions.length;
|
|
5571
|
+
instructions.push([
|
|
5572
|
+
ShaderPreprocessorDirective.Else,
|
|
5573
|
+
-1
|
|
5574
|
+
]);
|
|
5575
|
+
stack.push(elseIdx);
|
|
5576
|
+
ShaderInstructionEncoder._backfillJump(instructions[prevIdx], instructions.length);
|
|
5577
|
+
var cond1 = ShaderInstructionEncoder._parseCondition(rest);
|
|
5578
|
+
var idx3 = instructions.length;
|
|
5579
|
+
ShaderInstructionEncoder._pushConditionInstruction(instructions, cond1);
|
|
5580
|
+
stack.push(idx3);
|
|
5581
|
+
break;
|
|
5582
|
+
}
|
|
5583
|
+
case "else":
|
|
5584
|
+
{
|
|
5585
|
+
var stack1 = backfillStack[backfillStack.length - 1];
|
|
5586
|
+
var prevIdx1 = stack1[stack1.length - 1];
|
|
5587
|
+
var elseIdx1 = instructions.length;
|
|
5588
|
+
instructions.push([
|
|
5589
|
+
ShaderPreprocessorDirective.Else,
|
|
5590
|
+
-1
|
|
5591
|
+
]);
|
|
5592
|
+
stack1.push(elseIdx1);
|
|
5593
|
+
ShaderInstructionEncoder._backfillJump(instructions[prevIdx1], instructions.length);
|
|
5594
|
+
break;
|
|
5595
|
+
}
|
|
5596
|
+
case "endif":
|
|
5597
|
+
{
|
|
5598
|
+
var endifIdx = instructions.length;
|
|
5599
|
+
instructions.push([
|
|
5600
|
+
ShaderPreprocessorDirective.Endif
|
|
5601
|
+
]);
|
|
5602
|
+
var stack2 = backfillStack.pop();
|
|
5603
|
+
if (stack2) {
|
|
5604
|
+
var afterEndif = endifIdx + 1;
|
|
5605
|
+
for(var j = 0; j < stack2.length; j++){
|
|
5606
|
+
var inst = instructions[stack2[j]];
|
|
5607
|
+
if (inst[0] === ShaderPreprocessorDirective.Else) {
|
|
5608
|
+
inst[1] = afterEndif;
|
|
5609
|
+
} else {
|
|
5610
|
+
ShaderInstructionEncoder._backfillJump(inst, afterEndif, true);
|
|
5611
|
+
}
|
|
5844
5612
|
}
|
|
5845
|
-
this.advance(1);
|
|
5846
5613
|
}
|
|
5847
|
-
|
|
5848
|
-
|
|
5614
|
+
break;
|
|
5615
|
+
}
|
|
5616
|
+
case "define":
|
|
5617
|
+
{
|
|
5618
|
+
var funcMatch = ShaderInstructionEncoder._FUNC_MACRO_RE.exec(rest);
|
|
5619
|
+
if (funcMatch) {
|
|
5620
|
+
var params = funcMatch[2].split(",").map(function(p) {
|
|
5621
|
+
return p.trim();
|
|
5622
|
+
}).filter(function(p) {
|
|
5623
|
+
return p.length > 0;
|
|
5624
|
+
});
|
|
5625
|
+
instructions.push([
|
|
5626
|
+
ShaderPreprocessorDirective.DefineFunc,
|
|
5627
|
+
funcMatch[1],
|
|
5628
|
+
params,
|
|
5629
|
+
ShaderInstructionEncoder._stripLineComment(funcMatch[3].trim())
|
|
5630
|
+
]);
|
|
5631
|
+
} else {
|
|
5632
|
+
var spaceIdx = rest.indexOf(" ");
|
|
5633
|
+
if (spaceIdx === -1) {
|
|
5634
|
+
instructions.push([
|
|
5635
|
+
ShaderPreprocessorDirective.Define,
|
|
5636
|
+
rest
|
|
5637
|
+
]);
|
|
5638
|
+
} else {
|
|
5639
|
+
instructions.push([
|
|
5640
|
+
ShaderPreprocessorDirective.DefineVal,
|
|
5641
|
+
rest.substring(0, spaceIdx),
|
|
5642
|
+
ShaderInstructionEncoder._stripLineComment(rest.substring(spaceIdx + 1).trim())
|
|
5643
|
+
]);
|
|
5644
|
+
}
|
|
5645
|
+
}
|
|
5646
|
+
break;
|
|
5647
|
+
}
|
|
5648
|
+
case "undef":
|
|
5649
|
+
{
|
|
5650
|
+
instructions.push([
|
|
5651
|
+
ShaderPreprocessorDirective.Undef,
|
|
5652
|
+
rest
|
|
5653
|
+
]);
|
|
5654
|
+
break;
|
|
5849
5655
|
}
|
|
5850
|
-
}
|
|
5851
5656
|
}
|
|
5852
|
-
// Accumulate useful character
|
|
5853
|
-
lexeme += source[this._currentIndex];
|
|
5854
|
-
this.advance(1);
|
|
5855
5657
|
}
|
|
5856
|
-
|
|
5857
|
-
return null;
|
|
5858
|
-
}
|
|
5859
|
-
var valueToken = BaseToken.pool.get();
|
|
5860
|
-
valueToken.set(MacroParserToken.line_remain, lexeme, ShaderLab.createRange(start, this.getShaderPosition(0)));
|
|
5861
|
-
return valueToken;
|
|
5862
|
-
};
|
|
5863
|
-
MacroParserLexer._isPpCharacters = function _isPpCharacters(charCode) {
|
|
5864
|
-
return charCode === 35 || // #
|
|
5865
|
-
BaseLexer.isAlnum(charCode) // _, A-Z, a-z, 0-9
|
|
5866
|
-
;
|
|
5658
|
+
return instructions;
|
|
5867
5659
|
};
|
|
5868
|
-
|
|
5869
|
-
|
|
5870
|
-
|
|
5871
|
-
|
|
5872
|
-
|
|
5873
|
-
|
|
5874
|
-
|
|
5875
|
-
|
|
5876
|
-
|
|
5877
|
-
|
|
5878
|
-
|
|
5879
|
-
|
|
5880
|
-
|
|
5881
|
-
|
|
5882
|
-
|
|
5883
|
-
|
|
5884
|
-
|
|
5885
|
-
|
|
5886
|
-
|
|
5887
|
-
|
|
5888
|
-
|
|
5889
|
-
|
|
5890
|
-
|
|
5891
|
-
|
|
5892
|
-
|
|
5893
|
-
|
|
5894
|
-
|
|
5895
|
-
end: generatedIdxEnd
|
|
5896
|
-
});
|
|
5897
|
-
sourceMap == null ? void 0 : sourceMap.addMapRange(mapRange);
|
|
5898
|
-
startIdx = seg.rangeInBlock.end.index;
|
|
5899
|
-
generatedIdx = generatedIdxEnd;
|
|
5660
|
+
ShaderInstructionEncoder._pushConditionInstruction = function _pushConditionInstruction(instructions, cond) {
|
|
5661
|
+
if (cond.t === "def") {
|
|
5662
|
+
instructions.push([
|
|
5663
|
+
ShaderPreprocessorDirective.IfDef,
|
|
5664
|
+
cond.m,
|
|
5665
|
+
-1
|
|
5666
|
+
]);
|
|
5667
|
+
} else if (cond.t === "ndef") {
|
|
5668
|
+
instructions.push([
|
|
5669
|
+
ShaderPreprocessorDirective.IfNdef,
|
|
5670
|
+
cond.m,
|
|
5671
|
+
-1
|
|
5672
|
+
]);
|
|
5673
|
+
} else if (cond.t === "cmp") {
|
|
5674
|
+
instructions.push([
|
|
5675
|
+
ShaderPreprocessorDirective.IfCmp,
|
|
5676
|
+
cond.m,
|
|
5677
|
+
cond.op,
|
|
5678
|
+
cond.v,
|
|
5679
|
+
-1
|
|
5680
|
+
]);
|
|
5681
|
+
} else {
|
|
5682
|
+
instructions.push([
|
|
5683
|
+
ShaderPreprocessorDirective.IfExpr,
|
|
5684
|
+
cond,
|
|
5685
|
+
-1
|
|
5686
|
+
]);
|
|
5900
5687
|
}
|
|
5901
|
-
ret.push(source.slice(startIdx));
|
|
5902
|
-
var result = ret.join("");
|
|
5903
|
-
// Replace multiple consecutive newlines with a single newline to clean up the output
|
|
5904
|
-
return result.replace(/\n\s*\n+/g, "\n");
|
|
5905
5688
|
};
|
|
5906
|
-
|
|
5907
|
-
|
|
5908
|
-
|
|
5909
|
-
|
|
5910
|
-
|
|
5911
|
-
|
|
5912
|
-
|
|
5913
|
-
|
|
5914
|
-
|
|
5915
|
-
MacroParser._addPredefinedMacro(macro.name, macro.value);
|
|
5916
|
-
}
|
|
5917
|
-
this.lexer = new MacroParserLexer(source);
|
|
5918
|
-
return MacroParser._parseDirectives(this.lexer);
|
|
5919
|
-
};
|
|
5920
|
-
MacroParser._reset = function _reset() {
|
|
5921
|
-
this._expandSegmentsStack.length = 0;
|
|
5922
|
-
this._expandSegmentsStack.push([]);
|
|
5923
|
-
this._definedMacros.clear();
|
|
5924
|
-
this._addPredefinedMacro("GL_ES");
|
|
5925
|
-
this._errors.length = 0;
|
|
5926
|
-
};
|
|
5927
|
-
MacroParser._addPredefinedMacro = function _addPredefinedMacro(macro, value) {
|
|
5928
|
-
var token = BaseToken.pool.get();
|
|
5929
|
-
token.set(MacroParserToken.id, macro);
|
|
5930
|
-
var macroBody;
|
|
5931
|
-
if (value != undefined) {
|
|
5932
|
-
macroBody = BaseToken.pool.get();
|
|
5933
|
-
macroBody.set(MacroParserToken.id, value);
|
|
5934
|
-
}
|
|
5935
|
-
this._definedMacros.set(macro, new MacroDefine(token, macroBody));
|
|
5936
|
-
};
|
|
5937
|
-
MacroParser._parseDirectives = function _parseDirectives(lexer) {
|
|
5938
|
-
var directive;
|
|
5939
|
-
while(directive = lexer.scanToken()){
|
|
5940
|
-
switch(directive.type){
|
|
5941
|
-
case MacroParserToken.id:
|
|
5942
|
-
this._parseMacro(lexer, directive);
|
|
5943
|
-
break;
|
|
5944
|
-
case MacroParserKeyword.define:
|
|
5945
|
-
this._parseDefine(lexer);
|
|
5946
|
-
break;
|
|
5947
|
-
case MacroParserKeyword.undef:
|
|
5948
|
-
this._parseUndef(lexer);
|
|
5949
|
-
break;
|
|
5950
|
-
case MacroParserKeyword.if:
|
|
5951
|
-
this._parseIfDirective(lexer, MacroParserKeyword.if);
|
|
5952
|
-
break;
|
|
5953
|
-
case MacroParserKeyword.ifndef:
|
|
5954
|
-
this._parseIfDirective(lexer, MacroParserKeyword.ifndef);
|
|
5955
|
-
break;
|
|
5956
|
-
case MacroParserKeyword.ifdef:
|
|
5957
|
-
this._parseIfDirective(lexer, MacroParserKeyword.ifdef);
|
|
5689
|
+
ShaderInstructionEncoder._findDirectiveStart = function _findDirectiveStart(source, from, length) {
|
|
5690
|
+
var i = from;
|
|
5691
|
+
while(i < length){
|
|
5692
|
+
var j = i;
|
|
5693
|
+
while(j < length){
|
|
5694
|
+
var c = source.charCodeAt(j);
|
|
5695
|
+
if (c === 32 /* space */ || c === 9 /* tab */ ) {
|
|
5696
|
+
j++;
|
|
5697
|
+
} else {
|
|
5958
5698
|
break;
|
|
5699
|
+
}
|
|
5959
5700
|
}
|
|
5701
|
+
if (j < length && source.charCodeAt(j) === 35 /* '#' */ ) return i;
|
|
5702
|
+
var nl = source.indexOf("\n", i);
|
|
5703
|
+
if (nl === -1) break;
|
|
5704
|
+
i = nl + 1;
|
|
5960
5705
|
}
|
|
5961
|
-
|
|
5962
|
-
return PpUtils.expand(this._getExpandSegments(), lexer.source, lexer.sourceMap);
|
|
5963
|
-
};
|
|
5964
|
-
MacroParser._getExpandSegments = function _getExpandSegments() {
|
|
5965
|
-
return this._expandSegmentsStack[this._expandSegmentsStack.length - 1];
|
|
5966
|
-
};
|
|
5967
|
-
MacroParser._reportError = function _reportError(loc, message, source, file) {
|
|
5968
|
-
var error = ShaderLabUtils.createGSError(message, GSErrorName.PreprocessorError, source, loc, file);
|
|
5969
|
-
this._errors.push(error);
|
|
5706
|
+
return -1;
|
|
5970
5707
|
};
|
|
5971
|
-
|
|
5972
|
-
|
|
5973
|
-
var
|
|
5974
|
-
|
|
5975
|
-
|
|
5976
|
-
if (directiveType === MacroParserKeyword.if) {
|
|
5977
|
-
shouldInclude = this._parseConstantExpression(lexer);
|
|
5708
|
+
ShaderInstructionEncoder._pushText = function _pushText(instructions, source, from, to) {
|
|
5709
|
+
if (from >= to) return;
|
|
5710
|
+
var last = instructions.length > 0 ? instructions[instructions.length - 1] : null;
|
|
5711
|
+
if (last && last[0] === ShaderPreprocessorDirective.Text) {
|
|
5712
|
+
last[1] += source.substring(from, to);
|
|
5978
5713
|
} else {
|
|
5979
|
-
|
|
5980
|
-
|
|
5981
|
-
|
|
5982
|
-
|
|
5983
|
-
} else {
|
|
5984
|
-
var defined = this._definedMacros.get(lexeme);
|
|
5985
|
-
shouldInclude = directiveType === MacroParserKeyword.ifdef ? !!defined : !defined;
|
|
5986
|
-
}
|
|
5987
|
-
}
|
|
5988
|
-
lexer.skipSpace(true);
|
|
5989
|
-
var _lexer_scanMacroBranchBody = lexer.scanMacroBranchBody(), body = _lexer_scanMacroBranchBody.body, nextDirective = _lexer_scanMacroBranchBody.nextDirective;
|
|
5990
|
-
if (skipMacro) return;
|
|
5991
|
-
if (shouldInclude) {
|
|
5992
|
-
var end = nextDirective.type === MacroParserKeyword.endif ? lexer.getShaderPosition(0) : lexer.scanRemainMacro();
|
|
5993
|
-
var expanded = this._expandMacroChunk(body.lexeme, body.location, lexer);
|
|
5994
|
-
this._addContentReplace(lexer.file, ShaderLab.createPosition(start), end, expanded.content, lexer.blockRange, expanded.sourceMap);
|
|
5995
|
-
} else {
|
|
5996
|
-
this._addEmptyReplace(lexer, start);
|
|
5997
|
-
this._processConditionalDirective(nextDirective.type, lexer);
|
|
5714
|
+
instructions.push([
|
|
5715
|
+
ShaderPreprocessorDirective.Text,
|
|
5716
|
+
source.substring(from, to)
|
|
5717
|
+
]);
|
|
5998
5718
|
}
|
|
5999
5719
|
};
|
|
6000
|
-
|
|
6001
|
-
|
|
6002
|
-
|
|
6003
|
-
|
|
6004
|
-
|
|
6005
|
-
|
|
6006
|
-
|
|
6007
|
-
|
|
6008
|
-
|
|
6009
|
-
|
|
6010
|
-
|
|
6011
|
-
|
|
6012
|
-
|
|
6013
|
-
|
|
6014
|
-
|
|
6015
|
-
|
|
6016
|
-
|
|
6017
|
-
|
|
6018
|
-
|
|
6019
|
-
|
|
6020
|
-
|
|
6021
|
-
|
|
6022
|
-
|
|
6023
|
-
|
|
6024
|
-
|
|
6025
|
-
|
|
6026
|
-
|
|
6027
|
-
|
|
6028
|
-
|
|
6029
|
-
|
|
6030
|
-
|
|
6031
|
-
|
|
6032
|
-
|
|
6033
|
-
|
|
6034
|
-
|
|
6035
|
-
|
|
6036
|
-
|
|
6037
|
-
|
|
6038
|
-
|
|
6039
|
-
|
|
6040
|
-
|
|
6041
|
-
|
|
6042
|
-
|
|
6043
|
-
|
|
6044
|
-
|
|
6045
|
-
|
|
6046
|
-
|
|
6047
|
-
|
|
6048
|
-
|
|
6049
|
-
|
|
6050
|
-
|
|
6051
|
-
|
|
6052
|
-
|
|
6053
|
-
|
|
6054
|
-
|
|
6055
|
-
|
|
6056
|
-
|
|
6057
|
-
|
|
6058
|
-
|
|
6059
|
-
|
|
6060
|
-
|
|
6061
|
-
|
|
6062
|
-
|
|
6063
|
-
|
|
6064
|
-
|
|
6065
|
-
|
|
6066
|
-
|
|
6067
|
-
MacroParser._parseRelationalExpression = function _parseRelationalExpression(scanner) {
|
|
6068
|
-
var operand1 = this._parseShiftExpression(scanner);
|
|
6069
|
-
var operator = scanner.peek(2);
|
|
6070
|
-
if (operator[1] !== "=") operator = operator[0];
|
|
6071
|
-
if (operator && [
|
|
6072
|
-
">",
|
|
6073
|
-
"<",
|
|
6074
|
-
">=",
|
|
6075
|
-
"<="
|
|
6076
|
-
].includes(operator)) {
|
|
6077
|
-
var opPos = scanner.getShaderPosition(0);
|
|
6078
|
-
scanner.advance(operator.length);
|
|
6079
|
-
scanner.skipSpace(false);
|
|
6080
|
-
var operand2 = this._parseRelationalExpression(scanner);
|
|
6081
|
-
if ((typeof operand1 === "undefined" ? "undefined" : _type_of(operand1)) !== (typeof operand2 === "undefined" ? "undefined" : _type_of(operand2)) && typeof operand1 !== "number") {
|
|
6082
|
-
this._reportError(opPos, "invalid operator in relation expression.", scanner.source, scanner.file);
|
|
6083
|
-
return;
|
|
6084
|
-
}
|
|
6085
|
-
switch(operator){
|
|
6086
|
-
case ">":
|
|
6087
|
-
return operand1 > operand2;
|
|
6088
|
-
case "<":
|
|
6089
|
-
return operand1 < operand2;
|
|
6090
|
-
case ">=":
|
|
6091
|
-
return operand1 >= operand2;
|
|
6092
|
-
case "<=":
|
|
6093
|
-
return operand1 <= operand2;
|
|
6094
|
-
}
|
|
6095
|
-
}
|
|
6096
|
-
return operand1;
|
|
6097
|
-
};
|
|
6098
|
-
MacroParser._parseShiftExpression = function _parseShiftExpression(scanner) {
|
|
6099
|
-
var operand1 = this._parseAdditiveExpression(scanner);
|
|
6100
|
-
var operator = scanner.peek(2);
|
|
6101
|
-
if (operator && [
|
|
6102
|
-
">>",
|
|
6103
|
-
"<<"
|
|
6104
|
-
].includes(operator)) {
|
|
6105
|
-
var opPos = scanner.getShaderPosition(0);
|
|
6106
|
-
scanner.advance(2);
|
|
6107
|
-
scanner.skipSpace(false);
|
|
6108
|
-
var operand2 = this._parseShiftExpression(scanner);
|
|
6109
|
-
if ((typeof operand1 === "undefined" ? "undefined" : _type_of(operand1)) !== (typeof operand2 === "undefined" ? "undefined" : _type_of(operand2)) && typeof operand1 !== "number") {
|
|
6110
|
-
this._reportError(opPos, "invalid operator in shift expression.", scanner.source, scanner.file);
|
|
6111
|
-
return;
|
|
6112
|
-
}
|
|
6113
|
-
switch(operator){
|
|
6114
|
-
case ">>":
|
|
6115
|
-
return operand1 >> operand2;
|
|
6116
|
-
case "<<":
|
|
6117
|
-
return operand1 << operand2;
|
|
6118
|
-
}
|
|
6119
|
-
}
|
|
6120
|
-
return operand1;
|
|
6121
|
-
};
|
|
6122
|
-
MacroParser._parseAdditiveExpression = function _parseAdditiveExpression(scanner) {
|
|
6123
|
-
var operand1 = this._parseMulticativeExpression(scanner);
|
|
6124
|
-
if ([
|
|
6125
|
-
">",
|
|
6126
|
-
"<"
|
|
6127
|
-
].includes(scanner.getCurChar())) {
|
|
6128
|
-
var opPos = scanner.getShaderPosition(0);
|
|
6129
|
-
scanner.advance(1);
|
|
6130
|
-
var operator = scanner.getCurChar();
|
|
6131
|
-
scanner.skipSpace(false);
|
|
6132
|
-
var operand2 = this._parseAdditiveExpression(scanner);
|
|
6133
|
-
if ((typeof operand1 === "undefined" ? "undefined" : _type_of(operand1)) !== (typeof operand2 === "undefined" ? "undefined" : _type_of(operand2)) && typeof operand1 !== "number") {
|
|
6134
|
-
this._reportError(opPos, "invalid operator.", scanner.source, scanner.file);
|
|
6135
|
-
return false;
|
|
6136
|
-
}
|
|
6137
|
-
switch(operator){
|
|
6138
|
-
case "+":
|
|
6139
|
-
return operand1 + operand2;
|
|
6140
|
-
case "-":
|
|
6141
|
-
return operand1 - operand2;
|
|
6142
|
-
}
|
|
6143
|
-
}
|
|
6144
|
-
return operand1;
|
|
6145
|
-
};
|
|
6146
|
-
MacroParser._parseMulticativeExpression = function _parseMulticativeExpression(scanner) {
|
|
6147
|
-
var operand1 = this._parseUnaryExpression(scanner);
|
|
6148
|
-
scanner.skipSpace(false);
|
|
6149
|
-
if ([
|
|
6150
|
-
"*",
|
|
6151
|
-
"/",
|
|
6152
|
-
"%"
|
|
6153
|
-
].includes(scanner.getCurChar())) {
|
|
6154
|
-
var opPos = scanner.getShaderPosition(0);
|
|
6155
|
-
var operator = scanner.getCurChar();
|
|
6156
|
-
scanner.skipSpace(false);
|
|
6157
|
-
var operand2 = this._parseMulticativeExpression(scanner);
|
|
6158
|
-
if ((typeof operand1 === "undefined" ? "undefined" : _type_of(operand1)) !== (typeof operand2 === "undefined" ? "undefined" : _type_of(operand2)) && typeof operand1 !== "number") {
|
|
6159
|
-
this._reportError(opPos, "invalid operator.", scanner.source, scanner.file);
|
|
6160
|
-
return;
|
|
6161
|
-
}
|
|
6162
|
-
switch(operator){
|
|
6163
|
-
case "*":
|
|
6164
|
-
return operand1 * operand2;
|
|
6165
|
-
case "/":
|
|
6166
|
-
return operand1 / operand2;
|
|
6167
|
-
case "%":
|
|
6168
|
-
return operand1 % operand2;
|
|
6169
|
-
}
|
|
6170
|
-
}
|
|
6171
|
-
return operand1;
|
|
6172
|
-
};
|
|
6173
|
-
MacroParser._parseUnaryExpression = function _parseUnaryExpression(scanner) {
|
|
6174
|
-
var operator = scanner.getCurChar();
|
|
6175
|
-
if ([
|
|
6176
|
-
"+",
|
|
6177
|
-
"-",
|
|
6178
|
-
"!"
|
|
6179
|
-
].includes(operator)) {
|
|
6180
|
-
var opPos = scanner.getShaderPosition(0);
|
|
6181
|
-
scanner.advance(1);
|
|
6182
|
-
scanner.skipSpace(false);
|
|
6183
|
-
var parenExpr = this._parseParenthesisExpression(scanner);
|
|
6184
|
-
if (operator === "!" && typeof parenExpr !== "boolean" || operator !== "!" && typeof parenExpr !== "number") {
|
|
6185
|
-
this._reportError(opPos, "invalid operator.", scanner.source, scanner.file);
|
|
6186
|
-
}
|
|
6187
|
-
switch(operator){
|
|
6188
|
-
case "+":
|
|
6189
|
-
return parenExpr;
|
|
6190
|
-
case "-":
|
|
6191
|
-
return -parenExpr;
|
|
6192
|
-
case "!":
|
|
6193
|
-
return !parenExpr;
|
|
6194
|
-
}
|
|
6195
|
-
}
|
|
6196
|
-
return this._parseParenthesisExpression(scanner);
|
|
6197
|
-
};
|
|
6198
|
-
MacroParser._parseParenthesisExpression = function _parseParenthesisExpression(scanner) {
|
|
6199
|
-
if (scanner.getCurChar() === "(") {
|
|
6200
|
-
scanner.advance(1);
|
|
6201
|
-
scanner.skipSpace(false);
|
|
6202
|
-
var ret = this._parseConstantExpression(scanner);
|
|
6203
|
-
scanner.scanToChar(")");
|
|
6204
|
-
scanner.advance(1);
|
|
6205
|
-
return ret;
|
|
6206
|
-
}
|
|
6207
|
-
return this._parseConstant(scanner);
|
|
6208
|
-
};
|
|
6209
|
-
MacroParser._parseConstant = function _parseConstant(scanner) {
|
|
6210
|
-
if (BaseLexer.isAlpha(scanner.getCurCharCode())) {
|
|
6211
|
-
var id = scanner.scanWord();
|
|
6212
|
-
if (id.type === MacroParserKeyword.defined) {
|
|
6213
|
-
var withParen = scanner.peekNonSpace() === "(";
|
|
6214
|
-
var macro = scanner.scanWord();
|
|
6215
|
-
if (withParen) {
|
|
6216
|
-
scanner.scanToChar(")");
|
|
6217
|
-
scanner.advance(1);
|
|
6218
|
-
}
|
|
6219
|
-
return !!this._definedMacros.get(macro.lexeme);
|
|
6220
|
-
} else {
|
|
6221
|
-
var macro1 = this._definedMacros.get(id.lexeme);
|
|
6222
|
-
if (!macro1) {
|
|
6223
|
-
return false;
|
|
6224
|
-
}
|
|
6225
|
-
if (!macro1.body) {
|
|
6226
|
-
return true;
|
|
6227
|
-
}
|
|
6228
|
-
if (macro1.isFunction) {
|
|
6229
|
-
this._reportError(id.location, "invalid function macro usage", scanner.source, scanner.file);
|
|
6230
|
-
}
|
|
6231
|
-
var value = Number(macro1.body.lexeme);
|
|
6232
|
-
if (!Number.isInteger(value)) {
|
|
6233
|
-
this._reportError(id.location, "invalid const macro: " + id.lexeme, scanner.source, scanner.file);
|
|
6234
|
-
}
|
|
6235
|
-
return value;
|
|
6236
|
-
}
|
|
6237
|
-
} else if (BaseLexer.isDigit(scanner.getCurCharCode())) {
|
|
6238
|
-
var integer = scanner.scanInteger();
|
|
6239
|
-
return Number(integer.lexeme);
|
|
6240
|
-
} else {
|
|
6241
|
-
this._reportError(scanner.getShaderPosition(0), "invalid token: " + scanner.getCurChar(), scanner.source, scanner.file);
|
|
5720
|
+
/**
|
|
5721
|
+
* Backfill jump offset of an IF/ELIF instruction.
|
|
5722
|
+
* When onlyPlaceholder is true, only backfill if the current value is still -1
|
|
5723
|
+
*/ ShaderInstructionEncoder._backfillJump = function _backfillJump(inst, target, onlyPlaceholder) {
|
|
5724
|
+
if (onlyPlaceholder === void 0) onlyPlaceholder = false;
|
|
5725
|
+
var directive = inst[0];
|
|
5726
|
+
if (directive === ShaderPreprocessorDirective.IfDef || directive === ShaderPreprocessorDirective.IfNdef) {
|
|
5727
|
+
if (!onlyPlaceholder || inst[2] === -1) inst[2] = target;
|
|
5728
|
+
} else if (directive === ShaderPreprocessorDirective.IfCmp) {
|
|
5729
|
+
if (!onlyPlaceholder || inst[4] === -1) inst[4] = target;
|
|
5730
|
+
} else if (directive === ShaderPreprocessorDirective.IfExpr) {
|
|
5731
|
+
if (!onlyPlaceholder || inst[2] === -1) inst[2] = target;
|
|
5732
|
+
}
|
|
5733
|
+
};
|
|
5734
|
+
ShaderInstructionEncoder._stripLineComment = function _stripLineComment(s) {
|
|
5735
|
+
var idx = s.indexOf("//");
|
|
5736
|
+
return idx >= 0 ? s.substring(0, idx).trimEnd() : s;
|
|
5737
|
+
};
|
|
5738
|
+
ShaderInstructionEncoder._parseCondition = function _parseCondition(expr) {
|
|
5739
|
+
var ctx = {
|
|
5740
|
+
s: expr.trim(),
|
|
5741
|
+
i: 0
|
|
5742
|
+
};
|
|
5743
|
+
return ShaderInstructionEncoder._parseOr(ctx);
|
|
5744
|
+
};
|
|
5745
|
+
ShaderInstructionEncoder._skipWs = function _skipWs(ctx) {
|
|
5746
|
+
while(ctx.i < ctx.s.length && (ctx.s.charCodeAt(ctx.i) === 32 /* space */ || ctx.s.charCodeAt(ctx.i) === 9))ctx.i++;
|
|
5747
|
+
};
|
|
5748
|
+
ShaderInstructionEncoder._parseOr = function _parseOr(ctx) {
|
|
5749
|
+
var left = ShaderInstructionEncoder._parseAnd(ctx);
|
|
5750
|
+
ShaderInstructionEncoder._skipWs(ctx);
|
|
5751
|
+
while(ctx.i < ctx.s.length - 1 && ctx.s.charCodeAt(ctx.i) === 124 /* '|' */ && ctx.s.charCodeAt(ctx.i + 1) === 124 /* '|' */ ){
|
|
5752
|
+
ctx.i += 2;
|
|
5753
|
+
ShaderInstructionEncoder._skipWs(ctx);
|
|
5754
|
+
left = {
|
|
5755
|
+
t: "or",
|
|
5756
|
+
l: left,
|
|
5757
|
+
r: ShaderInstructionEncoder._parseAnd(ctx)
|
|
5758
|
+
};
|
|
5759
|
+
ShaderInstructionEncoder._skipWs(ctx);
|
|
5760
|
+
}
|
|
5761
|
+
return left;
|
|
5762
|
+
};
|
|
5763
|
+
ShaderInstructionEncoder._parseAnd = function _parseAnd(ctx) {
|
|
5764
|
+
var left = ShaderInstructionEncoder._parseUnary(ctx);
|
|
5765
|
+
ShaderInstructionEncoder._skipWs(ctx);
|
|
5766
|
+
while(ctx.i < ctx.s.length - 1 && ctx.s.charCodeAt(ctx.i) === 38 /* '&' */ && ctx.s.charCodeAt(ctx.i + 1) === 38 /* '&' */ ){
|
|
5767
|
+
ctx.i += 2;
|
|
5768
|
+
ShaderInstructionEncoder._skipWs(ctx);
|
|
5769
|
+
left = {
|
|
5770
|
+
t: "and",
|
|
5771
|
+
l: left,
|
|
5772
|
+
r: ShaderInstructionEncoder._parseUnary(ctx)
|
|
5773
|
+
};
|
|
5774
|
+
ShaderInstructionEncoder._skipWs(ctx);
|
|
5775
|
+
}
|
|
5776
|
+
return left;
|
|
5777
|
+
};
|
|
5778
|
+
ShaderInstructionEncoder._parseUnary = function _parseUnary(ctx) {
|
|
5779
|
+
ShaderInstructionEncoder._skipWs(ctx);
|
|
5780
|
+
if (ctx.s.charCodeAt(ctx.i) === 33 /* '!' */ ) {
|
|
5781
|
+
ctx.i++;
|
|
5782
|
+
ShaderInstructionEncoder._skipWs(ctx);
|
|
5783
|
+
return {
|
|
5784
|
+
t: "not",
|
|
5785
|
+
c: ShaderInstructionEncoder._parsePrimary(ctx)
|
|
5786
|
+
};
|
|
6242
5787
|
}
|
|
6243
|
-
|
|
6244
|
-
|
|
6245
|
-
|
|
6246
|
-
|
|
6247
|
-
|
|
6248
|
-
|
|
6249
|
-
|
|
6250
|
-
|
|
6251
|
-
|
|
6252
|
-
|
|
6253
|
-
|
|
6254
|
-
|
|
6255
|
-
|
|
6256
|
-
|
|
6257
|
-
|
|
6258
|
-
|
|
6259
|
-
|
|
6260
|
-
|
|
6261
|
-
|
|
6262
|
-
|
|
6263
|
-
|
|
6264
|
-
|
|
6265
|
-
|
|
6266
|
-
|
|
6267
|
-
|
|
6268
|
-
|
|
6269
|
-
|
|
5788
|
+
return ShaderInstructionEncoder._parsePrimary(ctx);
|
|
5789
|
+
};
|
|
5790
|
+
ShaderInstructionEncoder._parsePrimary = function _parsePrimary(ctx) {
|
|
5791
|
+
ShaderInstructionEncoder._skipWs(ctx);
|
|
5792
|
+
var s = ctx.s;
|
|
5793
|
+
// Parenthesized expression
|
|
5794
|
+
if (s.charCodeAt(ctx.i) === 40 /* '(' */ ) {
|
|
5795
|
+
ctx.i++;
|
|
5796
|
+
ShaderInstructionEncoder._skipWs(ctx);
|
|
5797
|
+
var inner = ShaderInstructionEncoder._parseOr(ctx);
|
|
5798
|
+
ShaderInstructionEncoder._skipWs(ctx);
|
|
5799
|
+
if (s.charCodeAt(ctx.i) === 41 /* ')' */ ) ctx.i++;
|
|
5800
|
+
return inner;
|
|
5801
|
+
}
|
|
5802
|
+
// defined(MACRO) or defined MACRO
|
|
5803
|
+
if (s.substring(ctx.i, ctx.i + 7) === "defined") {
|
|
5804
|
+
ctx.i += 7;
|
|
5805
|
+
ShaderInstructionEncoder._skipWs(ctx);
|
|
5806
|
+
var hasParen = s.charCodeAt(ctx.i) === 40; /* '(' */
|
|
5807
|
+
if (hasParen) ctx.i++;
|
|
5808
|
+
ShaderInstructionEncoder._skipWs(ctx);
|
|
5809
|
+
var name = ShaderInstructionEncoder._scanIdentifier(ctx);
|
|
5810
|
+
ShaderInstructionEncoder._skipWs(ctx);
|
|
5811
|
+
if (hasParen && s.charCodeAt(ctx.i) === 41 /* ')' */ ) ctx.i++;
|
|
5812
|
+
return {
|
|
5813
|
+
t: "def",
|
|
5814
|
+
m: name
|
|
5815
|
+
};
|
|
6270
5816
|
}
|
|
6271
|
-
|
|
6272
|
-
|
|
6273
|
-
|
|
6274
|
-
|
|
6275
|
-
|
|
6276
|
-
|
|
6277
|
-
|
|
6278
|
-
|
|
6279
|
-
|
|
6280
|
-
|
|
6281
|
-
|
|
6282
|
-
hasExpansion = false;
|
|
6283
|
-
var length = expandedBody.length;
|
|
6284
|
-
var i = 0;
|
|
6285
|
-
while(i < length){
|
|
6286
|
-
var charCode = expandedBody.charCodeAt(i);
|
|
6287
|
-
if (!BaseLexer.isAlpha(charCode)) {
|
|
6288
|
-
i++;
|
|
6289
|
-
continue;
|
|
6290
|
-
}
|
|
6291
|
-
var start = i;
|
|
6292
|
-
while(i < length && BaseLexer.isAlnum(expandedBody.charCodeAt(i))){
|
|
6293
|
-
i++;
|
|
6294
|
-
}
|
|
6295
|
-
var macroName = expandedBody.substring(start, i);
|
|
6296
|
-
var macro = this._definedMacros.get(macroName);
|
|
6297
|
-
if (!macro || visitedMacros[macroName] === currentVersionId) {
|
|
6298
|
-
continue;
|
|
6299
|
-
}
|
|
6300
|
-
// Prevent circular references
|
|
6301
|
-
visitedMacros[macroName] = currentVersionId;
|
|
6302
|
-
var replacement = void 0;
|
|
6303
|
-
var endIndex = void 0;
|
|
6304
|
-
if (!macro.isFunction) {
|
|
6305
|
-
var _macro_body;
|
|
6306
|
-
var _macro_body_lexeme;
|
|
6307
|
-
replacement = (_macro_body_lexeme = (_macro_body = macro.body) == null ? void 0 : _macro_body.lexeme) != null ? _macro_body_lexeme : "";
|
|
6308
|
-
endIndex = i;
|
|
6309
|
-
} else {
|
|
6310
|
-
var _this__parseMacroFunctionArgs = this._parseMacroFunctionArgs(expandedBody, start, macroName), args = _this__parseMacroFunctionArgs.args, newEndIndex = _this__parseMacroFunctionArgs.endIndex;
|
|
6311
|
-
replacement = macro.expandFunctionBody(args);
|
|
6312
|
-
endIndex = newEndIndex;
|
|
6313
|
-
}
|
|
6314
|
-
expandedBody = expandedBody.substring(0, start) + replacement + expandedBody.substring(endIndex);
|
|
6315
|
-
hasExpansion = true;
|
|
6316
|
-
break;
|
|
5817
|
+
// Numeric literal
|
|
5818
|
+
if (ctx.i < s.length && ShaderInstructionEncoder._isDigit(s.charCodeAt(ctx.i))) {
|
|
5819
|
+
var lhsNum = ShaderInstructionEncoder._scanNumber(ctx);
|
|
5820
|
+
ShaderInstructionEncoder._skipWs(ctx);
|
|
5821
|
+
var op = ShaderInstructionEncoder._scanOp(ctx);
|
|
5822
|
+
if (op) {
|
|
5823
|
+
ShaderInstructionEncoder._skipWs(ctx);
|
|
5824
|
+
return {
|
|
5825
|
+
t: "bool",
|
|
5826
|
+
v: ShaderInstructionEncoder._evalNumOp(lhsNum, op, ShaderInstructionEncoder._scanNumber(ctx))
|
|
5827
|
+
};
|
|
6317
5828
|
}
|
|
5829
|
+
return {
|
|
5830
|
+
t: "bool",
|
|
5831
|
+
v: lhsNum !== 0
|
|
5832
|
+
};
|
|
6318
5833
|
}
|
|
6319
|
-
|
|
6320
|
-
|
|
6321
|
-
|
|
6322
|
-
|
|
6323
|
-
|
|
6324
|
-
|
|
6325
|
-
|
|
6326
|
-
|
|
6327
|
-
|
|
5834
|
+
// Identifier — comparison or defined check
|
|
5835
|
+
var name1 = ShaderInstructionEncoder._scanIdentifier(ctx);
|
|
5836
|
+
if (!name1) return {
|
|
5837
|
+
t: "bool",
|
|
5838
|
+
v: false
|
|
5839
|
+
};
|
|
5840
|
+
ShaderInstructionEncoder._skipWs(ctx);
|
|
5841
|
+
var op1 = ShaderInstructionEncoder._scanOp(ctx);
|
|
5842
|
+
if (op1) {
|
|
5843
|
+
ShaderInstructionEncoder._skipWs(ctx);
|
|
5844
|
+
return {
|
|
5845
|
+
t: "cmp",
|
|
5846
|
+
m: name1,
|
|
5847
|
+
op: op1,
|
|
5848
|
+
v: ShaderInstructionEncoder._scanNumber(ctx)
|
|
5849
|
+
};
|
|
6328
5850
|
}
|
|
6329
|
-
var ret = this._parseDirectives(scanner);
|
|
6330
|
-
this._expandSegmentsStack.pop();
|
|
6331
5851
|
return {
|
|
6332
|
-
|
|
6333
|
-
|
|
6334
|
-
};
|
|
6335
|
-
};
|
|
6336
|
-
|
|
6337
|
-
|
|
6338
|
-
};
|
|
6339
|
-
|
|
6340
|
-
|
|
6341
|
-
|
|
6342
|
-
|
|
6343
|
-
|
|
6344
|
-
|
|
6345
|
-
|
|
6346
|
-
|
|
6347
|
-
|
|
6348
|
-
|
|
6349
|
-
|
|
6350
|
-
|
|
6351
|
-
|
|
6352
|
-
|
|
6353
|
-
|
|
6354
|
-
|
|
6355
|
-
|
|
6356
|
-
|
|
6357
|
-
|
|
6358
|
-
|
|
6359
|
-
|
|
6360
|
-
|
|
6361
|
-
|
|
6362
|
-
|
|
6363
|
-
|
|
6364
|
-
|
|
6365
|
-
|
|
6366
|
-
|
|
6367
|
-
|
|
6368
|
-
|
|
6369
|
-
|
|
6370
|
-
|
|
6371
|
-
|
|
6372
|
-
|
|
6373
|
-
|
|
6374
|
-
|
|
6375
|
-
|
|
6376
|
-
|
|
6377
|
-
|
|
6378
|
-
|
|
6379
|
-
|
|
6380
|
-
|
|
6381
|
-
|
|
6382
|
-
|
|
6383
|
-
|
|
6384
|
-
|
|
6385
|
-
|
|
6386
|
-
|
|
6387
|
-
|
|
6388
|
-
|
|
6389
|
-
|
|
6390
|
-
|
|
5852
|
+
t: "def",
|
|
5853
|
+
m: name1
|
|
5854
|
+
};
|
|
5855
|
+
};
|
|
5856
|
+
ShaderInstructionEncoder._isDigit = function _isDigit(charCode) {
|
|
5857
|
+
return charCode >= 48 /* '0' */ && charCode <= 57 /* '9' */ ;
|
|
5858
|
+
};
|
|
5859
|
+
ShaderInstructionEncoder._isAlnum = function _isAlnum(charCode) {
|
|
5860
|
+
return charCode >= 65 /* 'A' */ && charCode <= 90 || charCode >= 97 /* 'a' */ && charCode <= 122 || charCode >= 48 /* '0' */ && charCode <= 57 || charCode === 95 /* '_' */ ;
|
|
5861
|
+
};
|
|
5862
|
+
ShaderInstructionEncoder._scanIdentifier = function _scanIdentifier(ctx) {
|
|
5863
|
+
var start = ctx.i;
|
|
5864
|
+
while(ctx.i < ctx.s.length && ShaderInstructionEncoder._isAlnum(ctx.s.charCodeAt(ctx.i)))ctx.i++;
|
|
5865
|
+
return ctx.s.substring(start, ctx.i);
|
|
5866
|
+
};
|
|
5867
|
+
ShaderInstructionEncoder._scanNumber = function _scanNumber(ctx) {
|
|
5868
|
+
var start = ctx.i;
|
|
5869
|
+
if (ctx.s.charCodeAt(ctx.i) === 45 /* '-' */ ) ctx.i++;
|
|
5870
|
+
while(ctx.i < ctx.s.length && (ShaderInstructionEncoder._isDigit(ctx.s.charCodeAt(ctx.i)) || ctx.s.charCodeAt(ctx.i) === 46))ctx.i++;
|
|
5871
|
+
return Number(ctx.s.substring(start, ctx.i)) || 0;
|
|
5872
|
+
};
|
|
5873
|
+
ShaderInstructionEncoder._scanOp = function _scanOp(ctx) {
|
|
5874
|
+
var c = ctx.s.charCodeAt(ctx.i);
|
|
5875
|
+
var c2 = ctx.i + 1 < ctx.s.length ? ctx.s.charCodeAt(ctx.i + 1) : 0;
|
|
5876
|
+
if (c === 61 /* '=' */ && c2 === 61 /* '=' */ ) {
|
|
5877
|
+
ctx.i += 2;
|
|
5878
|
+
return "==";
|
|
5879
|
+
}
|
|
5880
|
+
if (c === 33 /* '!' */ && c2 === 61 /* '=' */ ) {
|
|
5881
|
+
ctx.i += 2;
|
|
5882
|
+
return "!=";
|
|
5883
|
+
}
|
|
5884
|
+
if (c === 62 /* '>' */ && c2 === 61 /* '=' */ ) {
|
|
5885
|
+
ctx.i += 2;
|
|
5886
|
+
return ">=";
|
|
5887
|
+
}
|
|
5888
|
+
if (c === 60 /* '<' */ && c2 === 61 /* '=' */ ) {
|
|
5889
|
+
ctx.i += 2;
|
|
5890
|
+
return "<=";
|
|
5891
|
+
}
|
|
5892
|
+
if (c === 62 /* '>' */ ) {
|
|
5893
|
+
ctx.i++;
|
|
5894
|
+
return ">";
|
|
5895
|
+
}
|
|
5896
|
+
if (c === 60 /* '<' */ ) {
|
|
5897
|
+
ctx.i++;
|
|
5898
|
+
return "<";
|
|
5899
|
+
}
|
|
5900
|
+
return "";
|
|
5901
|
+
};
|
|
5902
|
+
ShaderInstructionEncoder._evalNumOp = function _evalNumOp(lhs, op, rhs) {
|
|
5903
|
+
switch(op){
|
|
5904
|
+
case "==":
|
|
5905
|
+
return lhs === rhs;
|
|
5906
|
+
case "!=":
|
|
5907
|
+
return lhs !== rhs;
|
|
5908
|
+
case ">":
|
|
5909
|
+
return lhs > rhs;
|
|
5910
|
+
case "<":
|
|
5911
|
+
return lhs < rhs;
|
|
5912
|
+
case ">=":
|
|
5913
|
+
return lhs >= rhs;
|
|
5914
|
+
case "<=":
|
|
5915
|
+
return lhs <= rhs;
|
|
5916
|
+
default:
|
|
5917
|
+
return false;
|
|
6391
5918
|
}
|
|
6392
5919
|
};
|
|
6393
|
-
|
|
6394
|
-
return this.lexer.sourceMap.map(index);
|
|
6395
|
-
};
|
|
6396
|
-
return MacroParser;
|
|
5920
|
+
return ShaderInstructionEncoder;
|
|
6397
5921
|
}();
|
|
6398
|
-
|
|
6399
|
-
|
|
6400
|
-
[]
|
|
6401
|
-
];
|
|
6402
|
-
MacroParser._expandVisitedMacros = {};
|
|
6403
|
-
MacroParser._expandVersionId = 1;
|
|
6404
|
-
MacroParser._errors = [];
|
|
5922
|
+
ShaderInstructionEncoder._DIRECTIVE_RE = /^[ \t]*#[ \t]*(if|ifdef|ifndef|elif|else|endif|define|undef)\b(.*)/;
|
|
5923
|
+
ShaderInstructionEncoder._FUNC_MACRO_RE = /^(\w+)\(([^)]*)\)\s*(.*)/;
|
|
6405
5924
|
|
|
6406
5925
|
/**
|
|
6407
5926
|
* The [LALR1](https://web.stanford.edu/class/archive/cs/cs143/cs143.1128/handouts/140%20LALR%20Parsing.pdf) Parser generator
|
|
@@ -8847,14 +8366,69 @@ var ShaderLab = /*#__PURE__*/ function() {
|
|
|
8847
8366
|
Logger.info("[Task - Total compilation] cost time: " + (performance.now() - totalStartTime) + "ms");
|
|
8848
8367
|
ShaderLab._processingPassText = undefined;
|
|
8849
8368
|
this._logErrors(codeGen.errors);
|
|
8369
|
+
if (ret) {
|
|
8370
|
+
// Always parse instructions for the compiled GLSL
|
|
8371
|
+
ret.vertexShaderInstructions = ShaderInstructionEncoder.parse(ret.vertex);
|
|
8372
|
+
ret.fragmentShaderInstructions = ShaderInstructionEncoder.parse(ret.fragment);
|
|
8373
|
+
}
|
|
8850
8374
|
return ret;
|
|
8851
8375
|
};
|
|
8852
|
-
_proto.
|
|
8853
|
-
var
|
|
8854
|
-
var
|
|
8855
|
-
|
|
8856
|
-
|
|
8857
|
-
|
|
8376
|
+
_proto._precompile = function _precompile(sourceCode, platformTarget, basePath) {
|
|
8377
|
+
var _this = this;
|
|
8378
|
+
var shaderSource = this._parseShaderSource(sourceCode);
|
|
8379
|
+
var subShaders = shaderSource.subShaders.map(function(sub) {
|
|
8380
|
+
return {
|
|
8381
|
+
name: sub.name,
|
|
8382
|
+
tags: sub.tags,
|
|
8383
|
+
passes: sub.passes.map(function(pass) {
|
|
8384
|
+
if (pass.isUsePass) {
|
|
8385
|
+
return {
|
|
8386
|
+
name: pass.name,
|
|
8387
|
+
isUsePass: true,
|
|
8388
|
+
tags: pass.tags,
|
|
8389
|
+
renderStates: _this._serializeRenderStates(pass.renderStates)
|
|
8390
|
+
};
|
|
8391
|
+
}
|
|
8392
|
+
var programSource = _this._parseShaderPass(pass.contents, pass.vertexEntry, pass.fragmentEntry, platformTarget, basePath);
|
|
8393
|
+
if (!programSource) {
|
|
8394
|
+
throw new Error('Shader pass "' + shaderSource.name + "." + sub.name + "." + pass.name + '" precompile failed, please check the shader source code.');
|
|
8395
|
+
}
|
|
8396
|
+
return {
|
|
8397
|
+
name: pass.name,
|
|
8398
|
+
isUsePass: false,
|
|
8399
|
+
tags: pass.tags,
|
|
8400
|
+
renderStates: _this._serializeRenderStates(pass.renderStates),
|
|
8401
|
+
vertexShaderInstructions: programSource.vertexShaderInstructions,
|
|
8402
|
+
fragmentShaderInstructions: programSource.fragmentShaderInstructions
|
|
8403
|
+
};
|
|
8404
|
+
})
|
|
8405
|
+
};
|
|
8406
|
+
});
|
|
8407
|
+
return {
|
|
8408
|
+
name: shaderSource.name,
|
|
8409
|
+
platformTarget: platformTarget,
|
|
8410
|
+
subShaders: subShaders
|
|
8411
|
+
};
|
|
8412
|
+
};
|
|
8413
|
+
_proto._serializeRenderStates = function _serializeRenderStates(renderStates) {
|
|
8414
|
+
var constantMap = {};
|
|
8415
|
+
for(var key in renderStates.constantMap){
|
|
8416
|
+
var value = renderStates.constantMap[key];
|
|
8417
|
+
if (_instanceof(value, Color)) {
|
|
8418
|
+
constantMap[key] = [
|
|
8419
|
+
value.r,
|
|
8420
|
+
value.g,
|
|
8421
|
+
value.b,
|
|
8422
|
+
value.a
|
|
8423
|
+
];
|
|
8424
|
+
} else {
|
|
8425
|
+
constantMap[key] = value;
|
|
8426
|
+
}
|
|
8427
|
+
}
|
|
8428
|
+
return {
|
|
8429
|
+
constantMap: constantMap,
|
|
8430
|
+
variableMap: renderStates.variableMap
|
|
8431
|
+
};
|
|
8858
8432
|
};
|
|
8859
8433
|
/**
|
|
8860
8434
|
* @internal
|
|
@@ -8883,7 +8457,7 @@ ShaderLab._shaderPositionPool = ShaderLabUtils.createObjectPool(ShaderPosition);
|
|
|
8883
8457
|
ShaderLab._shaderRangePool = ShaderLabUtils.createObjectPool(ShaderRange);
|
|
8884
8458
|
|
|
8885
8459
|
//@ts-ignore
|
|
8886
|
-
var version = "2.0.0-alpha.
|
|
8460
|
+
var version = "2.0.0-alpha.26";
|
|
8887
8461
|
var mode = "Release";
|
|
8888
8462
|
mode = "Verbose";
|
|
8889
8463
|
console.log("Galacean Engine ShaderLab Version: " + version + " | Mode: " + mode);
|