@deck.gl/aggregation-layers 9.0.0-alpha.7 → 9.0.0-beta.2

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.
Files changed (78) hide show
  1. package/dist/dist.dev.js +3345 -340
  2. package/dist/es5/aggregation-layer.js +3 -1
  3. package/dist/es5/aggregation-layer.js.map +1 -1
  4. package/dist/es5/contour-layer/contour-layer.js +2 -2
  5. package/dist/es5/contour-layer/contour-layer.js.map +1 -1
  6. package/dist/es5/gpu-grid-layer/gpu-grid-layer.js +1 -1
  7. package/dist/es5/gpu-grid-layer/gpu-grid-layer.js.map +1 -1
  8. package/dist/es5/grid-layer/grid-layer.js +2 -2
  9. package/dist/es5/grid-layer/grid-layer.js.map +1 -1
  10. package/dist/es5/heatmap-layer/heatmap-layer-utils.js +0 -15
  11. package/dist/es5/heatmap-layer/heatmap-layer-utils.js.map +1 -1
  12. package/dist/es5/heatmap-layer/heatmap-layer.js +103 -97
  13. package/dist/es5/heatmap-layer/heatmap-layer.js.map +1 -1
  14. package/dist/es5/heatmap-layer/max-vs.glsl.js +1 -1
  15. package/dist/es5/heatmap-layer/triangle-layer-fragment.glsl.js +1 -1
  16. package/dist/es5/heatmap-layer/triangle-layer.js +26 -27
  17. package/dist/es5/heatmap-layer/triangle-layer.js.map +1 -1
  18. package/dist/es5/heatmap-layer/weights-vs.glsl.js +1 -1
  19. package/dist/es5/screen-grid-layer/screen-grid-layer.js +1 -1
  20. package/dist/es5/screen-grid-layer/screen-grid-layer.js.map +1 -1
  21. package/dist/es5/utils/cpu-aggregator.js.map +1 -1
  22. package/dist/es5/utils/resource-utils.js +0 -2
  23. package/dist/es5/utils/resource-utils.js.map +1 -1
  24. package/dist/esm/aggregation-layer.js +3 -1
  25. package/dist/esm/aggregation-layer.js.map +1 -1
  26. package/dist/esm/contour-layer/contour-layer.js +2 -2
  27. package/dist/esm/contour-layer/contour-layer.js.map +1 -1
  28. package/dist/esm/gpu-grid-layer/gpu-grid-layer.js +1 -1
  29. package/dist/esm/gpu-grid-layer/gpu-grid-layer.js.map +1 -1
  30. package/dist/esm/grid-layer/grid-layer.js +2 -2
  31. package/dist/esm/grid-layer/grid-layer.js.map +1 -1
  32. package/dist/esm/heatmap-layer/heatmap-layer-utils.js +0 -13
  33. package/dist/esm/heatmap-layer/heatmap-layer-utils.js.map +1 -1
  34. package/dist/esm/heatmap-layer/heatmap-layer.js +99 -87
  35. package/dist/esm/heatmap-layer/heatmap-layer.js.map +1 -1
  36. package/dist/esm/heatmap-layer/max-vs.glsl.js +11 -5
  37. package/dist/esm/heatmap-layer/max-vs.glsl.js.map +1 -1
  38. package/dist/esm/heatmap-layer/triangle-layer-fragment.glsl.js +2 -2
  39. package/dist/esm/heatmap-layer/triangle-layer-fragment.glsl.js.map +1 -1
  40. package/dist/esm/heatmap-layer/triangle-layer.js +21 -23
  41. package/dist/esm/heatmap-layer/triangle-layer.js.map +1 -1
  42. package/dist/esm/heatmap-layer/weights-vs.glsl.js +4 -2
  43. package/dist/esm/heatmap-layer/weights-vs.glsl.js.map +1 -1
  44. package/dist/esm/screen-grid-layer/screen-grid-layer.js +1 -1
  45. package/dist/esm/screen-grid-layer/screen-grid-layer.js.map +1 -1
  46. package/dist/esm/utils/cpu-aggregator.js.map +1 -1
  47. package/dist/esm/utils/resource-utils.js +0 -1
  48. package/dist/esm/utils/resource-utils.js.map +1 -1
  49. package/dist.min.js +85 -75
  50. package/package.json +7 -7
  51. package/src/aggregation-layer.ts +3 -1
  52. package/src/contour-layer/contour-layer.ts +3 -3
  53. package/src/gpu-grid-layer/gpu-grid-layer.ts +1 -1
  54. package/src/grid-layer/grid-layer.ts +4 -2
  55. package/src/heatmap-layer/heatmap-layer-utils.ts +0 -23
  56. package/src/heatmap-layer/heatmap-layer.ts +87 -105
  57. package/src/heatmap-layer/max-vs.glsl.ts +11 -5
  58. package/src/heatmap-layer/triangle-layer-fragment.glsl.ts +2 -2
  59. package/src/heatmap-layer/triangle-layer.ts +17 -24
  60. package/src/heatmap-layer/weights-vs.glsl.ts +4 -2
  61. package/src/screen-grid-layer/screen-grid-layer.ts +1 -1
  62. package/src/utils/cpu-aggregator.ts +1 -1
  63. package/src/utils/resource-utils.ts +2 -8
  64. package/typed/aggregation-layer.d.ts.map +1 -1
  65. package/typed/contour-layer/contour-layer.d.ts.map +1 -1
  66. package/typed/grid-layer/grid-layer.d.ts.map +1 -1
  67. package/typed/heatmap-layer/heatmap-layer-utils.d.ts +0 -9
  68. package/typed/heatmap-layer/heatmap-layer-utils.d.ts.map +1 -1
  69. package/typed/heatmap-layer/heatmap-layer.d.ts +4 -4
  70. package/typed/heatmap-layer/heatmap-layer.d.ts.map +1 -1
  71. package/typed/heatmap-layer/max-vs.glsl.d.ts +1 -1
  72. package/typed/heatmap-layer/max-vs.glsl.d.ts.map +1 -1
  73. package/typed/heatmap-layer/triangle-layer-fragment.glsl.d.ts +1 -1
  74. package/typed/heatmap-layer/triangle-layer.d.ts +10 -2
  75. package/typed/heatmap-layer/triangle-layer.d.ts.map +1 -1
  76. package/typed/heatmap-layer/weights-vs.glsl.d.ts +1 -1
  77. package/typed/heatmap-layer/weights-vs.glsl.d.ts.map +1 -1
  78. package/typed/utils/resource-utils.d.ts.map +1 -1
package/dist/dist.dev.js CHANGED
@@ -1377,7 +1377,7 @@ ${moduleSource}
1377
1377
  }
1378
1378
  function getShaderName(shader) {
1379
1379
  let defaultName = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : "unnamed";
1380
- const SHADER_NAME_REGEXP = /#define[\s*]SHADER_NAME[\s*]([A-Za-z0-9_-]+)[\s*]/;
1380
+ const SHADER_NAME_REGEXP = /#define[^\S\r\n]*SHADER_NAME[^\S\r\n]*([A-Za-z0-9_-]+)\s*/;
1381
1381
  const match = SHADER_NAME_REGEXP.exec(shader);
1382
1382
  return match ? match[1] : defaultName;
1383
1383
  }
@@ -1831,6 +1831,2779 @@ void main() {
1831
1831
  }
1832
1832
  }
1833
1833
 
1834
+ // ../../node_modules/@luma.gl/shadertools/dist/libs/wgsl-reflect/wgsl_reflect.module.js
1835
+ var ParseContext = class {
1836
+ constructor() {
1837
+ this.constants = /* @__PURE__ */ new Map();
1838
+ this.aliases = /* @__PURE__ */ new Map();
1839
+ this.structs = /* @__PURE__ */ new Map();
1840
+ }
1841
+ };
1842
+ var Node = class {
1843
+ constructor() {
1844
+ }
1845
+ get isAstNode() {
1846
+ return true;
1847
+ }
1848
+ get astNodeType() {
1849
+ return "";
1850
+ }
1851
+ evaluate(context) {
1852
+ throw new Error("Cannot evaluate node");
1853
+ }
1854
+ evaluateString(context) {
1855
+ return this.evaluate(context).toString();
1856
+ }
1857
+ };
1858
+ var Statement = class extends Node {
1859
+ constructor() {
1860
+ super();
1861
+ }
1862
+ };
1863
+ var Function = class extends Statement {
1864
+ constructor(name, args, returnType, body) {
1865
+ super();
1866
+ this.name = name;
1867
+ this.args = args;
1868
+ this.returnType = returnType;
1869
+ this.body = body;
1870
+ }
1871
+ get astNodeType() {
1872
+ return "function";
1873
+ }
1874
+ };
1875
+ var StaticAssert = class extends Statement {
1876
+ constructor(expression) {
1877
+ super();
1878
+ this.expression = expression;
1879
+ }
1880
+ get astNodeType() {
1881
+ return "staticAssert";
1882
+ }
1883
+ };
1884
+ var While = class extends Statement {
1885
+ constructor(condition, body) {
1886
+ super();
1887
+ this.condition = condition;
1888
+ this.body = body;
1889
+ }
1890
+ get astNodeType() {
1891
+ return "while";
1892
+ }
1893
+ };
1894
+ var Continuing = class extends Statement {
1895
+ constructor(body) {
1896
+ super();
1897
+ this.body = body;
1898
+ }
1899
+ get astNodeType() {
1900
+ return "continuing";
1901
+ }
1902
+ };
1903
+ var For = class extends Statement {
1904
+ constructor(init, condition, increment, body) {
1905
+ super();
1906
+ this.init = init;
1907
+ this.condition = condition;
1908
+ this.increment = increment;
1909
+ this.body = body;
1910
+ }
1911
+ get astNodeType() {
1912
+ return "for";
1913
+ }
1914
+ };
1915
+ var Var = class extends Statement {
1916
+ constructor(name, type, storage, access, value) {
1917
+ super();
1918
+ this.name = name;
1919
+ this.type = type;
1920
+ this.storage = storage;
1921
+ this.access = access;
1922
+ this.value = value;
1923
+ }
1924
+ get astNodeType() {
1925
+ return "var";
1926
+ }
1927
+ };
1928
+ var Override = class extends Statement {
1929
+ constructor(name, type, value) {
1930
+ super();
1931
+ this.name = name;
1932
+ this.type = type;
1933
+ this.value = value;
1934
+ }
1935
+ get astNodeType() {
1936
+ return "override";
1937
+ }
1938
+ };
1939
+ var Let = class extends Statement {
1940
+ constructor(name, type, storage, access, value) {
1941
+ super();
1942
+ this.name = name;
1943
+ this.type = type;
1944
+ this.storage = storage;
1945
+ this.access = access;
1946
+ this.value = value;
1947
+ }
1948
+ get astNodeType() {
1949
+ return "let";
1950
+ }
1951
+ };
1952
+ var Const = class extends Statement {
1953
+ constructor(name, type, storage, access, value) {
1954
+ super();
1955
+ this.name = name;
1956
+ this.type = type;
1957
+ this.storage = storage;
1958
+ this.access = access;
1959
+ this.value = value;
1960
+ }
1961
+ get astNodeType() {
1962
+ return "const";
1963
+ }
1964
+ evaluate(context) {
1965
+ return this.value.evaluate(context);
1966
+ }
1967
+ };
1968
+ var IncrementOperator;
1969
+ (function(IncrementOperator2) {
1970
+ IncrementOperator2["increment"] = "++";
1971
+ IncrementOperator2["decrement"] = "--";
1972
+ })(IncrementOperator || (IncrementOperator = {}));
1973
+ (function(IncrementOperator2) {
1974
+ function parse(val) {
1975
+ const key = val;
1976
+ if (key == "parse")
1977
+ throw new Error("Invalid value for IncrementOperator");
1978
+ return IncrementOperator2[key];
1979
+ }
1980
+ IncrementOperator2.parse = parse;
1981
+ })(IncrementOperator || (IncrementOperator = {}));
1982
+ var Increment = class extends Statement {
1983
+ constructor(operator, variable) {
1984
+ super();
1985
+ this.operator = operator;
1986
+ this.variable = variable;
1987
+ }
1988
+ get astNodeType() {
1989
+ return "increment";
1990
+ }
1991
+ };
1992
+ var AssignOperator;
1993
+ (function(AssignOperator2) {
1994
+ AssignOperator2["assign"] = "=";
1995
+ AssignOperator2["addAssign"] = "+=";
1996
+ AssignOperator2["subtractAssin"] = "-=";
1997
+ AssignOperator2["multiplyAssign"] = "*=";
1998
+ AssignOperator2["divideAssign"] = "/=";
1999
+ AssignOperator2["moduloAssign"] = "%=";
2000
+ AssignOperator2["andAssign"] = "&=";
2001
+ AssignOperator2["orAssign"] = "|=";
2002
+ AssignOperator2["xorAssign"] = "^=";
2003
+ AssignOperator2["shiftLeftAssign"] = "<<=";
2004
+ AssignOperator2["shiftRightAssign"] = ">>=";
2005
+ })(AssignOperator || (AssignOperator = {}));
2006
+ (function(AssignOperator2) {
2007
+ function parse(val) {
2008
+ const key = val;
2009
+ if (key == "parse")
2010
+ throw new Error("Invalid value for AssignOperator");
2011
+ return AssignOperator2[key];
2012
+ }
2013
+ AssignOperator2.parse = parse;
2014
+ })(AssignOperator || (AssignOperator = {}));
2015
+ var Assign = class extends Statement {
2016
+ constructor(operator, variable, value) {
2017
+ super();
2018
+ this.operator = operator;
2019
+ this.variable = variable;
2020
+ this.value = value;
2021
+ }
2022
+ get astNodeType() {
2023
+ return "assign";
2024
+ }
2025
+ };
2026
+ var Call = class extends Statement {
2027
+ constructor(name, args) {
2028
+ super();
2029
+ this.name = name;
2030
+ this.args = args;
2031
+ }
2032
+ get astNodeType() {
2033
+ return "call";
2034
+ }
2035
+ };
2036
+ var Loop = class extends Statement {
2037
+ constructor(body, continuing) {
2038
+ super();
2039
+ this.body = body;
2040
+ this.continuing = continuing;
2041
+ }
2042
+ get astNodeType() {
2043
+ return "loop";
2044
+ }
2045
+ };
2046
+ var Switch = class extends Statement {
2047
+ constructor(condition, body) {
2048
+ super();
2049
+ this.condition = condition;
2050
+ this.body = body;
2051
+ }
2052
+ get astNodeType() {
2053
+ return "body";
2054
+ }
2055
+ };
2056
+ var If = class extends Statement {
2057
+ constructor(condition, body, elseif, _else) {
2058
+ super();
2059
+ this.condition = condition;
2060
+ this.body = body;
2061
+ this.elseif = elseif;
2062
+ this.else = _else;
2063
+ }
2064
+ get astNodeType() {
2065
+ return "if";
2066
+ }
2067
+ };
2068
+ var Return = class extends Statement {
2069
+ constructor(value) {
2070
+ super();
2071
+ this.value = value;
2072
+ }
2073
+ get astNodeType() {
2074
+ return "return";
2075
+ }
2076
+ };
2077
+ var Enable = class extends Statement {
2078
+ constructor(name) {
2079
+ super();
2080
+ this.name = name;
2081
+ }
2082
+ get astNodeType() {
2083
+ return "enable";
2084
+ }
2085
+ };
2086
+ var Alias = class extends Statement {
2087
+ constructor(name, type) {
2088
+ super();
2089
+ this.name = name;
2090
+ this.type = type;
2091
+ }
2092
+ get astNodeType() {
2093
+ return "alias";
2094
+ }
2095
+ };
2096
+ var Discard = class extends Statement {
2097
+ constructor() {
2098
+ super();
2099
+ }
2100
+ get astNodeType() {
2101
+ return "discard";
2102
+ }
2103
+ };
2104
+ var Break = class extends Statement {
2105
+ constructor() {
2106
+ super();
2107
+ }
2108
+ get astNodeType() {
2109
+ return "break";
2110
+ }
2111
+ };
2112
+ var Continue = class extends Statement {
2113
+ constructor() {
2114
+ super();
2115
+ }
2116
+ get astNodeType() {
2117
+ return "continue";
2118
+ }
2119
+ };
2120
+ var Type = class extends Statement {
2121
+ constructor(name) {
2122
+ super();
2123
+ this.name = name;
2124
+ }
2125
+ get astNodeType() {
2126
+ return "type";
2127
+ }
2128
+ get isStruct() {
2129
+ return false;
2130
+ }
2131
+ get isArray() {
2132
+ return false;
2133
+ }
2134
+ };
2135
+ var Struct = class extends Type {
2136
+ constructor(name, members) {
2137
+ super(name);
2138
+ this.members = members;
2139
+ }
2140
+ get astNodeType() {
2141
+ return "struct";
2142
+ }
2143
+ get isStruct() {
2144
+ return true;
2145
+ }
2146
+ getMemberIndex(name) {
2147
+ for (let i = 0; i < this.members.length; i++) {
2148
+ if (this.members[i].name == name)
2149
+ return i;
2150
+ }
2151
+ return -1;
2152
+ }
2153
+ };
2154
+ var TemplateType = class extends Type {
2155
+ constructor(name, format, access) {
2156
+ super(name);
2157
+ this.format = format;
2158
+ this.access = access;
2159
+ }
2160
+ get astNodeType() {
2161
+ return "template";
2162
+ }
2163
+ };
2164
+ var PointerType = class extends Type {
2165
+ constructor(name, storage, type, access) {
2166
+ super(name);
2167
+ this.storage = storage;
2168
+ this.type = type;
2169
+ this.access = access;
2170
+ }
2171
+ get astNodeType() {
2172
+ return "pointer";
2173
+ }
2174
+ };
2175
+ var ArrayType = class extends Type {
2176
+ constructor(name, attributes, format, count) {
2177
+ super(name);
2178
+ this.attributes = attributes;
2179
+ this.format = format;
2180
+ this.count = count;
2181
+ }
2182
+ get astNodeType() {
2183
+ return "array";
2184
+ }
2185
+ get isArray() {
2186
+ return true;
2187
+ }
2188
+ };
2189
+ var SamplerType = class extends Type {
2190
+ constructor(name, format, access) {
2191
+ super(name);
2192
+ this.format = format;
2193
+ this.access = access;
2194
+ }
2195
+ get astNodeType() {
2196
+ return "sampler";
2197
+ }
2198
+ };
2199
+ var Expression = class extends Node {
2200
+ constructor() {
2201
+ super();
2202
+ }
2203
+ };
2204
+ var StringExpr = class extends Expression {
2205
+ constructor(value) {
2206
+ super();
2207
+ this.value = value;
2208
+ }
2209
+ get astNodeType() {
2210
+ return "stringExpr";
2211
+ }
2212
+ toString() {
2213
+ return this.value;
2214
+ }
2215
+ evaluateString() {
2216
+ return this.value;
2217
+ }
2218
+ };
2219
+ var CreateExpr = class extends Expression {
2220
+ constructor(type, args) {
2221
+ super();
2222
+ this.type = type;
2223
+ this.args = args;
2224
+ }
2225
+ get astNodeType() {
2226
+ return "createExpr";
2227
+ }
2228
+ };
2229
+ var CallExpr = class extends Expression {
2230
+ constructor(name, args) {
2231
+ super();
2232
+ this.name = name;
2233
+ this.args = args;
2234
+ }
2235
+ get astNodeType() {
2236
+ return "callExpr";
2237
+ }
2238
+ evaluate(context) {
2239
+ switch (this.name) {
2240
+ case "abs":
2241
+ return Math.abs(this.args[0].evaluate(context));
2242
+ case "acos":
2243
+ return Math.acos(this.args[0].evaluate(context));
2244
+ case "acosh":
2245
+ return Math.acosh(this.args[0].evaluate(context));
2246
+ case "asin":
2247
+ return Math.asin(this.args[0].evaluate(context));
2248
+ case "asinh":
2249
+ return Math.asinh(this.args[0].evaluate(context));
2250
+ case "atan":
2251
+ return Math.atan(this.args[0].evaluate(context));
2252
+ case "atan2":
2253
+ return Math.atan2(this.args[0].evaluate(context), this.args[1].evaluate(context));
2254
+ case "atanh":
2255
+ return Math.atanh(this.args[0].evaluate(context));
2256
+ case "ceil":
2257
+ return Math.ceil(this.args[0].evaluate(context));
2258
+ case "clamp":
2259
+ return Math.min(Math.max(this.args[0].evaluate(context), this.args[1].evaluate(context)), this.args[2].evaluate(context));
2260
+ case "cos":
2261
+ return Math.cos(this.args[0].evaluate(context));
2262
+ case "degrees":
2263
+ return this.args[0].evaluate(context) * 180 / Math.PI;
2264
+ case "distance":
2265
+ return Math.sqrt(Math.pow(this.args[0].evaluate(context) - this.args[1].evaluate(context), 2));
2266
+ case "dot":
2267
+ case "exp":
2268
+ return Math.exp(this.args[0].evaluate(context));
2269
+ case "exp2":
2270
+ return Math.pow(2, this.args[0].evaluate(context));
2271
+ case "floor":
2272
+ return Math.floor(this.args[0].evaluate(context));
2273
+ case "fma":
2274
+ return this.args[0].evaluate(context) * this.args[1].evaluate(context) + this.args[2].evaluate(context);
2275
+ case "fract":
2276
+ return this.args[0].evaluate(context) - Math.floor(this.args[0].evaluate(context));
2277
+ case "inverseSqrt":
2278
+ return 1 / Math.sqrt(this.args[0].evaluate(context));
2279
+ case "log":
2280
+ return Math.log(this.args[0].evaluate(context));
2281
+ case "log2":
2282
+ return Math.log2(this.args[0].evaluate(context));
2283
+ case "max":
2284
+ return Math.max(this.args[0].evaluate(context), this.args[1].evaluate(context));
2285
+ case "min":
2286
+ return Math.min(this.args[0].evaluate(context), this.args[1].evaluate(context));
2287
+ case "mix":
2288
+ return this.args[0].evaluate(context) * (1 - this.args[2].evaluate(context)) + this.args[1].evaluate(context) * this.args[2].evaluate(context);
2289
+ case "modf":
2290
+ return this.args[0].evaluate(context) - Math.floor(this.args[0].evaluate(context));
2291
+ case "pow":
2292
+ return Math.pow(this.args[0].evaluate(context), this.args[1].evaluate(context));
2293
+ case "radians":
2294
+ return this.args[0].evaluate(context) * Math.PI / 180;
2295
+ case "round":
2296
+ return Math.round(this.args[0].evaluate(context));
2297
+ case "sign":
2298
+ return Math.sign(this.args[0].evaluate(context));
2299
+ case "sin":
2300
+ return Math.sin(this.args[0].evaluate(context));
2301
+ case "sinh":
2302
+ return Math.sinh(this.args[0].evaluate(context));
2303
+ case "saturate":
2304
+ return Math.min(Math.max(this.args[0].evaluate(context), 0), 1);
2305
+ case "smoothstep":
2306
+ return this.args[0].evaluate(context) * this.args[0].evaluate(context) * (3 - 2 * this.args[0].evaluate(context));
2307
+ case "sqrt":
2308
+ return Math.sqrt(this.args[0].evaluate(context));
2309
+ case "step":
2310
+ return this.args[0].evaluate(context) < this.args[1].evaluate(context) ? 0 : 1;
2311
+ case "tan":
2312
+ return Math.tan(this.args[0].evaluate(context));
2313
+ case "tanh":
2314
+ return Math.tanh(this.args[0].evaluate(context));
2315
+ case "trunc":
2316
+ return Math.trunc(this.args[0].evaluate(context));
2317
+ default:
2318
+ throw new Error("Non const function: " + this.name);
2319
+ }
2320
+ }
2321
+ };
2322
+ var VariableExpr = class extends Expression {
2323
+ constructor(name) {
2324
+ super();
2325
+ this.name = name;
2326
+ }
2327
+ get astNodeType() {
2328
+ return "varExpr";
2329
+ }
2330
+ };
2331
+ var ConstExpr = class extends Expression {
2332
+ constructor(name, initializer) {
2333
+ super();
2334
+ this.name = name;
2335
+ this.initializer = initializer;
2336
+ }
2337
+ get astNodeType() {
2338
+ return "constExpr";
2339
+ }
2340
+ evaluate(context) {
2341
+ var _a2, _b;
2342
+ if (this.initializer instanceof CreateExpr) {
2343
+ const property = (_a2 = this.postfix) === null || _a2 === void 0 ? void 0 : _a2.evaluateString(context);
2344
+ const type = (_b = this.initializer.type) === null || _b === void 0 ? void 0 : _b.name;
2345
+ const struct = context.structs.get(type);
2346
+ const memberIndex = struct === null || struct === void 0 ? void 0 : struct.getMemberIndex(property);
2347
+ if (memberIndex != -1) {
2348
+ const value = this.initializer.args[memberIndex].evaluate(context);
2349
+ return value;
2350
+ }
2351
+ console.log(memberIndex);
2352
+ }
2353
+ return this.initializer.evaluate(context);
2354
+ }
2355
+ };
2356
+ var LiteralExpr = class extends Expression {
2357
+ constructor(value) {
2358
+ super();
2359
+ this.value = value;
2360
+ }
2361
+ get astNodeType() {
2362
+ return "literalExpr";
2363
+ }
2364
+ evaluate() {
2365
+ return this.value;
2366
+ }
2367
+ };
2368
+ var BitcastExpr = class extends Expression {
2369
+ constructor(type, value) {
2370
+ super();
2371
+ this.type = type;
2372
+ this.value = value;
2373
+ }
2374
+ get astNodeType() {
2375
+ return "bitcastExpr";
2376
+ }
2377
+ };
2378
+ var TypecastExpr = class extends Expression {
2379
+ constructor(type, args) {
2380
+ super();
2381
+ this.type = type;
2382
+ this.args = args;
2383
+ }
2384
+ get astNodeType() {
2385
+ return "typecastExpr";
2386
+ }
2387
+ evaluate(context) {
2388
+ return this.args[0].evaluate(context);
2389
+ }
2390
+ };
2391
+ var GroupingExpr = class extends Expression {
2392
+ constructor(contents) {
2393
+ super();
2394
+ this.contents = contents;
2395
+ }
2396
+ get astNodeType() {
2397
+ return "groupExpr";
2398
+ }
2399
+ evaluate(context) {
2400
+ return this.contents[0].evaluate(context);
2401
+ }
2402
+ };
2403
+ var Operator = class extends Expression {
2404
+ constructor() {
2405
+ super();
2406
+ }
2407
+ };
2408
+ var UnaryOperator = class extends Operator {
2409
+ constructor(operator, right) {
2410
+ super();
2411
+ this.operator = operator;
2412
+ this.right = right;
2413
+ }
2414
+ get astNodeType() {
2415
+ return "unaryOp";
2416
+ }
2417
+ evaluate(context) {
2418
+ switch (this.operator) {
2419
+ case "+":
2420
+ return this.right.evaluate(context);
2421
+ case "-":
2422
+ return -this.right.evaluate(context);
2423
+ case "!":
2424
+ return this.right.evaluate(context) ? 0 : 1;
2425
+ case "~":
2426
+ return ~this.right.evaluate(context);
2427
+ default:
2428
+ throw new Error("Unknown unary operator: " + this.operator);
2429
+ }
2430
+ }
2431
+ };
2432
+ var BinaryOperator = class extends Operator {
2433
+ constructor(operator, left, right) {
2434
+ super();
2435
+ this.operator = operator;
2436
+ this.left = left;
2437
+ this.right = right;
2438
+ }
2439
+ get astNodeType() {
2440
+ return "binaryOp";
2441
+ }
2442
+ evaluate(context) {
2443
+ switch (this.operator) {
2444
+ case "+":
2445
+ return this.left.evaluate(context) + this.right.evaluate(context);
2446
+ case "-":
2447
+ return this.left.evaluate(context) - this.right.evaluate(context);
2448
+ case "*":
2449
+ return this.left.evaluate(context) * this.right.evaluate(context);
2450
+ case "/":
2451
+ return this.left.evaluate(context) / this.right.evaluate(context);
2452
+ case "%":
2453
+ return this.left.evaluate(context) % this.right.evaluate(context);
2454
+ case "==":
2455
+ return this.left.evaluate(context) == this.right.evaluate(context) ? 1 : 0;
2456
+ case "!=":
2457
+ return this.left.evaluate(context) != this.right.evaluate(context) ? 1 : 0;
2458
+ case "<":
2459
+ return this.left.evaluate(context) < this.right.evaluate(context) ? 1 : 0;
2460
+ case ">":
2461
+ return this.left.evaluate(context) > this.right.evaluate(context) ? 1 : 0;
2462
+ case "<=":
2463
+ return this.left.evaluate(context) <= this.right.evaluate(context) ? 1 : 0;
2464
+ case ">=":
2465
+ return this.left.evaluate(context) >= this.right.evaluate(context) ? 1 : 0;
2466
+ case "&&":
2467
+ return this.left.evaluate(context) && this.right.evaluate(context) ? 1 : 0;
2468
+ case "||":
2469
+ return this.left.evaluate(context) || this.right.evaluate(context) ? 1 : 0;
2470
+ default:
2471
+ throw new Error(`Unknown operator ${this.operator}`);
2472
+ }
2473
+ }
2474
+ };
2475
+ var SwitchCase = class extends Node {
2476
+ constructor() {
2477
+ super();
2478
+ }
2479
+ };
2480
+ var Case = class extends SwitchCase {
2481
+ constructor(selector, body) {
2482
+ super();
2483
+ this.selector = selector;
2484
+ this.body = body;
2485
+ }
2486
+ get astNodeType() {
2487
+ return "case";
2488
+ }
2489
+ };
2490
+ var Default = class extends SwitchCase {
2491
+ constructor(body) {
2492
+ super();
2493
+ this.body = body;
2494
+ }
2495
+ get astNodeType() {
2496
+ return "default";
2497
+ }
2498
+ };
2499
+ var Argument = class extends Node {
2500
+ constructor(name, type, attributes) {
2501
+ super();
2502
+ this.name = name;
2503
+ this.type = type;
2504
+ this.attributes = attributes;
2505
+ }
2506
+ get astNodeType() {
2507
+ return "argument";
2508
+ }
2509
+ };
2510
+ var ElseIf = class extends Node {
2511
+ constructor(condition, body) {
2512
+ super();
2513
+ this.condition = condition;
2514
+ this.body = body;
2515
+ }
2516
+ get astNodeType() {
2517
+ return "elseif";
2518
+ }
2519
+ };
2520
+ var Member = class extends Node {
2521
+ constructor(name, type, attributes) {
2522
+ super();
2523
+ this.name = name;
2524
+ this.type = type;
2525
+ this.attributes = attributes;
2526
+ }
2527
+ get astNodeType() {
2528
+ return "member";
2529
+ }
2530
+ };
2531
+ var Attribute = class extends Node {
2532
+ constructor(name, value) {
2533
+ super();
2534
+ this.name = name;
2535
+ this.value = value;
2536
+ }
2537
+ get astNodeType() {
2538
+ return "attribute";
2539
+ }
2540
+ };
2541
+ var _a;
2542
+ var TokenClass;
2543
+ (function(TokenClass2) {
2544
+ TokenClass2[TokenClass2["token"] = 0] = "token";
2545
+ TokenClass2[TokenClass2["keyword"] = 1] = "keyword";
2546
+ TokenClass2[TokenClass2["reserved"] = 2] = "reserved";
2547
+ })(TokenClass || (TokenClass = {}));
2548
+ var TokenType = class {
2549
+ constructor(name, type, rule) {
2550
+ this.name = name;
2551
+ this.type = type;
2552
+ this.rule = rule;
2553
+ }
2554
+ toString() {
2555
+ return this.name;
2556
+ }
2557
+ };
2558
+ var TokenTypes = class {
2559
+ };
2560
+ _a = TokenTypes;
2561
+ TokenTypes.none = new TokenType("", TokenClass.reserved, "");
2562
+ TokenTypes.eof = new TokenType("EOF", TokenClass.token, "");
2563
+ TokenTypes.reserved = {
2564
+ asm: new TokenType("asm", TokenClass.reserved, "asm"),
2565
+ bf16: new TokenType("bf16", TokenClass.reserved, "bf16"),
2566
+ do: new TokenType("do", TokenClass.reserved, "do"),
2567
+ enum: new TokenType("enum", TokenClass.reserved, "enum"),
2568
+ f16: new TokenType("f16", TokenClass.reserved, "f16"),
2569
+ f64: new TokenType("f64", TokenClass.reserved, "f64"),
2570
+ handle: new TokenType("handle", TokenClass.reserved, "handle"),
2571
+ i8: new TokenType("i8", TokenClass.reserved, "i8"),
2572
+ i16: new TokenType("i16", TokenClass.reserved, "i16"),
2573
+ i64: new TokenType("i64", TokenClass.reserved, "i64"),
2574
+ mat: new TokenType("mat", TokenClass.reserved, "mat"),
2575
+ premerge: new TokenType("premerge", TokenClass.reserved, "premerge"),
2576
+ regardless: new TokenType("regardless", TokenClass.reserved, "regardless"),
2577
+ typedef: new TokenType("typedef", TokenClass.reserved, "typedef"),
2578
+ u8: new TokenType("u8", TokenClass.reserved, "u8"),
2579
+ u16: new TokenType("u16", TokenClass.reserved, "u16"),
2580
+ u64: new TokenType("u64", TokenClass.reserved, "u64"),
2581
+ unless: new TokenType("unless", TokenClass.reserved, "unless"),
2582
+ using: new TokenType("using", TokenClass.reserved, "using"),
2583
+ vec: new TokenType("vec", TokenClass.reserved, "vec"),
2584
+ void: new TokenType("void", TokenClass.reserved, "void")
2585
+ };
2586
+ TokenTypes.keywords = {
2587
+ array: new TokenType("array", TokenClass.keyword, "array"),
2588
+ atomic: new TokenType("atomic", TokenClass.keyword, "atomic"),
2589
+ bool: new TokenType("bool", TokenClass.keyword, "bool"),
2590
+ f32: new TokenType("f32", TokenClass.keyword, "f32"),
2591
+ i32: new TokenType("i32", TokenClass.keyword, "i32"),
2592
+ mat2x2: new TokenType("mat2x2", TokenClass.keyword, "mat2x2"),
2593
+ mat2x3: new TokenType("mat2x3", TokenClass.keyword, "mat2x3"),
2594
+ mat2x4: new TokenType("mat2x4", TokenClass.keyword, "mat2x4"),
2595
+ mat3x2: new TokenType("mat3x2", TokenClass.keyword, "mat3x2"),
2596
+ mat3x3: new TokenType("mat3x3", TokenClass.keyword, "mat3x3"),
2597
+ mat3x4: new TokenType("mat3x4", TokenClass.keyword, "mat3x4"),
2598
+ mat4x2: new TokenType("mat4x2", TokenClass.keyword, "mat4x2"),
2599
+ mat4x3: new TokenType("mat4x3", TokenClass.keyword, "mat4x3"),
2600
+ mat4x4: new TokenType("mat4x4", TokenClass.keyword, "mat4x4"),
2601
+ ptr: new TokenType("ptr", TokenClass.keyword, "ptr"),
2602
+ sampler: new TokenType("sampler", TokenClass.keyword, "sampler"),
2603
+ sampler_comparison: new TokenType("sampler_comparison", TokenClass.keyword, "sampler_comparison"),
2604
+ struct: new TokenType("struct", TokenClass.keyword, "struct"),
2605
+ texture_1d: new TokenType("texture_1d", TokenClass.keyword, "texture_1d"),
2606
+ texture_2d: new TokenType("texture_2d", TokenClass.keyword, "texture_2d"),
2607
+ texture_2d_array: new TokenType("texture_2d_array", TokenClass.keyword, "texture_2d_array"),
2608
+ texture_3d: new TokenType("texture_3d", TokenClass.keyword, "texture_3d"),
2609
+ texture_cube: new TokenType("texture_cube", TokenClass.keyword, "texture_cube"),
2610
+ texture_cube_array: new TokenType("texture_cube_array", TokenClass.keyword, "texture_cube_array"),
2611
+ texture_multisampled_2d: new TokenType("texture_multisampled_2d", TokenClass.keyword, "texture_multisampled_2d"),
2612
+ texture_storage_1d: new TokenType("texture_storage_1d", TokenClass.keyword, "texture_storage_1d"),
2613
+ texture_storage_2d: new TokenType("texture_storage_2d", TokenClass.keyword, "texture_storage_2d"),
2614
+ texture_storage_2d_array: new TokenType("texture_storage_2d_array", TokenClass.keyword, "texture_storage_2d_array"),
2615
+ texture_storage_3d: new TokenType("texture_storage_3d", TokenClass.keyword, "texture_storage_3d"),
2616
+ texture_depth_2d: new TokenType("texture_depth_2d", TokenClass.keyword, "texture_depth_2d"),
2617
+ texture_depth_2d_array: new TokenType("texture_depth_2d_array", TokenClass.keyword, "texture_depth_2d_array"),
2618
+ texture_depth_cube: new TokenType("texture_depth_cube", TokenClass.keyword, "texture_depth_cube"),
2619
+ texture_depth_cube_array: new TokenType("texture_depth_cube_array", TokenClass.keyword, "texture_depth_cube_array"),
2620
+ texture_depth_multisampled_2d: new TokenType("texture_depth_multisampled_2d", TokenClass.keyword, "texture_depth_multisampled_2d"),
2621
+ texture_external: new TokenType("texture_external", TokenClass.keyword, "texture_external"),
2622
+ u32: new TokenType("u32", TokenClass.keyword, "u32"),
2623
+ vec2: new TokenType("vec2", TokenClass.keyword, "vec2"),
2624
+ vec3: new TokenType("vec3", TokenClass.keyword, "vec3"),
2625
+ vec4: new TokenType("vec4", TokenClass.keyword, "vec4"),
2626
+ bitcast: new TokenType("bitcast", TokenClass.keyword, "bitcast"),
2627
+ block: new TokenType("block", TokenClass.keyword, "block"),
2628
+ break: new TokenType("break", TokenClass.keyword, "break"),
2629
+ case: new TokenType("case", TokenClass.keyword, "case"),
2630
+ continue: new TokenType("continue", TokenClass.keyword, "continue"),
2631
+ continuing: new TokenType("continuing", TokenClass.keyword, "continuing"),
2632
+ default: new TokenType("default", TokenClass.keyword, "default"),
2633
+ discard: new TokenType("discard", TokenClass.keyword, "discard"),
2634
+ else: new TokenType("else", TokenClass.keyword, "else"),
2635
+ enable: new TokenType("enable", TokenClass.keyword, "enable"),
2636
+ fallthrough: new TokenType("fallthrough", TokenClass.keyword, "fallthrough"),
2637
+ false: new TokenType("false", TokenClass.keyword, "false"),
2638
+ fn: new TokenType("fn", TokenClass.keyword, "fn"),
2639
+ for: new TokenType("for", TokenClass.keyword, "for"),
2640
+ function: new TokenType("function", TokenClass.keyword, "function"),
2641
+ if: new TokenType("if", TokenClass.keyword, "if"),
2642
+ let: new TokenType("let", TokenClass.keyword, "let"),
2643
+ const: new TokenType("const", TokenClass.keyword, "const"),
2644
+ loop: new TokenType("loop", TokenClass.keyword, "loop"),
2645
+ while: new TokenType("while", TokenClass.keyword, "while"),
2646
+ private: new TokenType("private", TokenClass.keyword, "private"),
2647
+ read: new TokenType("read", TokenClass.keyword, "read"),
2648
+ read_write: new TokenType("read_write", TokenClass.keyword, "read_write"),
2649
+ return: new TokenType("return", TokenClass.keyword, "return"),
2650
+ storage: new TokenType("storage", TokenClass.keyword, "storage"),
2651
+ switch: new TokenType("switch", TokenClass.keyword, "switch"),
2652
+ true: new TokenType("true", TokenClass.keyword, "true"),
2653
+ alias: new TokenType("alias", TokenClass.keyword, "alias"),
2654
+ type: new TokenType("type", TokenClass.keyword, "type"),
2655
+ uniform: new TokenType("uniform", TokenClass.keyword, "uniform"),
2656
+ var: new TokenType("var", TokenClass.keyword, "var"),
2657
+ override: new TokenType("override", TokenClass.keyword, "override"),
2658
+ workgroup: new TokenType("workgroup", TokenClass.keyword, "workgroup"),
2659
+ write: new TokenType("write", TokenClass.keyword, "write"),
2660
+ r8unorm: new TokenType("r8unorm", TokenClass.keyword, "r8unorm"),
2661
+ r8snorm: new TokenType("r8snorm", TokenClass.keyword, "r8snorm"),
2662
+ r8uint: new TokenType("r8uint", TokenClass.keyword, "r8uint"),
2663
+ r8sint: new TokenType("r8sint", TokenClass.keyword, "r8sint"),
2664
+ r16uint: new TokenType("r16uint", TokenClass.keyword, "r16uint"),
2665
+ r16sint: new TokenType("r16sint", TokenClass.keyword, "r16sint"),
2666
+ r16float: new TokenType("r16float", TokenClass.keyword, "r16float"),
2667
+ rg8unorm: new TokenType("rg8unorm", TokenClass.keyword, "rg8unorm"),
2668
+ rg8snorm: new TokenType("rg8snorm", TokenClass.keyword, "rg8snorm"),
2669
+ rg8uint: new TokenType("rg8uint", TokenClass.keyword, "rg8uint"),
2670
+ rg8sint: new TokenType("rg8sint", TokenClass.keyword, "rg8sint"),
2671
+ r32uint: new TokenType("r32uint", TokenClass.keyword, "r32uint"),
2672
+ r32sint: new TokenType("r32sint", TokenClass.keyword, "r32sint"),
2673
+ r32float: new TokenType("r32float", TokenClass.keyword, "r32float"),
2674
+ rg16uint: new TokenType("rg16uint", TokenClass.keyword, "rg16uint"),
2675
+ rg16sint: new TokenType("rg16sint", TokenClass.keyword, "rg16sint"),
2676
+ rg16float: new TokenType("rg16float", TokenClass.keyword, "rg16float"),
2677
+ rgba8unorm: new TokenType("rgba8unorm", TokenClass.keyword, "rgba8unorm"),
2678
+ rgba8unorm_srgb: new TokenType("rgba8unorm_srgb", TokenClass.keyword, "rgba8unorm_srgb"),
2679
+ rgba8snorm: new TokenType("rgba8snorm", TokenClass.keyword, "rgba8snorm"),
2680
+ rgba8uint: new TokenType("rgba8uint", TokenClass.keyword, "rgba8uint"),
2681
+ rgba8sint: new TokenType("rgba8sint", TokenClass.keyword, "rgba8sint"),
2682
+ bgra8unorm: new TokenType("bgra8unorm", TokenClass.keyword, "bgra8unorm"),
2683
+ bgra8unorm_srgb: new TokenType("bgra8unorm_srgb", TokenClass.keyword, "bgra8unorm_srgb"),
2684
+ rgb10a2unorm: new TokenType("rgb10a2unorm", TokenClass.keyword, "rgb10a2unorm"),
2685
+ rg11b10float: new TokenType("rg11b10float", TokenClass.keyword, "rg11b10float"),
2686
+ rg32uint: new TokenType("rg32uint", TokenClass.keyword, "rg32uint"),
2687
+ rg32sint: new TokenType("rg32sint", TokenClass.keyword, "rg32sint"),
2688
+ rg32float: new TokenType("rg32float", TokenClass.keyword, "rg32float"),
2689
+ rgba16uint: new TokenType("rgba16uint", TokenClass.keyword, "rgba16uint"),
2690
+ rgba16sint: new TokenType("rgba16sint", TokenClass.keyword, "rgba16sint"),
2691
+ rgba16float: new TokenType("rgba16float", TokenClass.keyword, "rgba16float"),
2692
+ rgba32uint: new TokenType("rgba32uint", TokenClass.keyword, "rgba32uint"),
2693
+ rgba32sint: new TokenType("rgba32sint", TokenClass.keyword, "rgba32sint"),
2694
+ rgba32float: new TokenType("rgba32float", TokenClass.keyword, "rgba32float"),
2695
+ static_assert: new TokenType("static_assert", TokenClass.keyword, "static_assert")
2696
+ };
2697
+ TokenTypes.tokens = {
2698
+ decimal_float_literal: new TokenType("decimal_float_literal", TokenClass.token, /((-?[0-9]*\.[0-9]+|-?[0-9]+\.[0-9]*)((e|E)(\+|-)?[0-9]+)?f?)|(-?[0-9]+(e|E)(\+|-)?[0-9]+f?)|([0-9]+f)/),
2699
+ hex_float_literal: new TokenType("hex_float_literal", TokenClass.token, /-?0x((([0-9a-fA-F]*\.[0-9a-fA-F]+|[0-9a-fA-F]+\.[0-9a-fA-F]*)((p|P)(\+|-)?[0-9]+f?)?)|([0-9a-fA-F]+(p|P)(\+|-)?[0-9]+f?))/),
2700
+ int_literal: new TokenType("int_literal", TokenClass.token, /-?0x[0-9a-fA-F]+|0i?|-?[1-9][0-9]*i?/),
2701
+ uint_literal: new TokenType("uint_literal", TokenClass.token, /0x[0-9a-fA-F]+u|0u|[1-9][0-9]*u/),
2702
+ ident: new TokenType("ident", TokenClass.token, /[a-zA-Z][0-9a-zA-Z_]*/),
2703
+ and: new TokenType("and", TokenClass.token, "&"),
2704
+ and_and: new TokenType("and_and", TokenClass.token, "&&"),
2705
+ arrow: new TokenType("arrow ", TokenClass.token, "->"),
2706
+ attr: new TokenType("attr", TokenClass.token, "@"),
2707
+ attr_left: new TokenType("attr_left", TokenClass.token, "[["),
2708
+ attr_right: new TokenType("attr_right", TokenClass.token, "]]"),
2709
+ forward_slash: new TokenType("forward_slash", TokenClass.token, "/"),
2710
+ bang: new TokenType("bang", TokenClass.token, "!"),
2711
+ bracket_left: new TokenType("bracket_left", TokenClass.token, "["),
2712
+ bracket_right: new TokenType("bracket_right", TokenClass.token, "]"),
2713
+ brace_left: new TokenType("brace_left", TokenClass.token, "{"),
2714
+ brace_right: new TokenType("brace_right", TokenClass.token, "}"),
2715
+ colon: new TokenType("colon", TokenClass.token, ":"),
2716
+ comma: new TokenType("comma", TokenClass.token, ","),
2717
+ equal: new TokenType("equal", TokenClass.token, "="),
2718
+ equal_equal: new TokenType("equal_equal", TokenClass.token, "=="),
2719
+ not_equal: new TokenType("not_equal", TokenClass.token, "!="),
2720
+ greater_than: new TokenType("greater_than", TokenClass.token, ">"),
2721
+ greater_than_equal: new TokenType("greater_than_equal", TokenClass.token, ">="),
2722
+ shift_right: new TokenType("shift_right", TokenClass.token, ">>"),
2723
+ less_than: new TokenType("less_than", TokenClass.token, "<"),
2724
+ less_than_equal: new TokenType("less_than_equal", TokenClass.token, "<="),
2725
+ shift_left: new TokenType("shift_left", TokenClass.token, "<<"),
2726
+ modulo: new TokenType("modulo", TokenClass.token, "%"),
2727
+ minus: new TokenType("minus", TokenClass.token, "-"),
2728
+ minus_minus: new TokenType("minus_minus", TokenClass.token, "--"),
2729
+ period: new TokenType("period", TokenClass.token, "."),
2730
+ plus: new TokenType("plus", TokenClass.token, "+"),
2731
+ plus_plus: new TokenType("plus_plus", TokenClass.token, "++"),
2732
+ or: new TokenType("or", TokenClass.token, "|"),
2733
+ or_or: new TokenType("or_or", TokenClass.token, "||"),
2734
+ paren_left: new TokenType("paren_left", TokenClass.token, "("),
2735
+ paren_right: new TokenType("paren_right", TokenClass.token, ")"),
2736
+ semicolon: new TokenType("semicolon", TokenClass.token, ";"),
2737
+ star: new TokenType("star", TokenClass.token, "*"),
2738
+ tilde: new TokenType("tilde", TokenClass.token, "~"),
2739
+ underscore: new TokenType("underscore", TokenClass.token, "_"),
2740
+ xor: new TokenType("xor", TokenClass.token, "^"),
2741
+ plus_equal: new TokenType("plus_equal", TokenClass.token, "+="),
2742
+ minus_equal: new TokenType("minus_equal", TokenClass.token, "-="),
2743
+ times_equal: new TokenType("times_equal", TokenClass.token, "*="),
2744
+ division_equal: new TokenType("division_equal", TokenClass.token, "/="),
2745
+ modulo_equal: new TokenType("modulo_equal", TokenClass.token, "%="),
2746
+ and_equal: new TokenType("and_equal", TokenClass.token, "&="),
2747
+ or_equal: new TokenType("or_equal", TokenClass.token, "|="),
2748
+ xor_equal: new TokenType("xor_equal", TokenClass.token, "^="),
2749
+ shift_right_equal: new TokenType("shift_right_equal", TokenClass.token, ">>="),
2750
+ shift_left_equal: new TokenType("shift_left_equal", TokenClass.token, "<<=")
2751
+ };
2752
+ TokenTypes.storage_class = [_a.keywords.function, _a.keywords.private, _a.keywords.workgroup, _a.keywords.uniform, _a.keywords.storage];
2753
+ TokenTypes.access_mode = [_a.keywords.read, _a.keywords.write, _a.keywords.read_write];
2754
+ TokenTypes.sampler_type = [_a.keywords.sampler, _a.keywords.sampler_comparison];
2755
+ TokenTypes.sampled_texture_type = [_a.keywords.texture_1d, _a.keywords.texture_2d, _a.keywords.texture_2d_array, _a.keywords.texture_3d, _a.keywords.texture_cube, _a.keywords.texture_cube_array];
2756
+ TokenTypes.multisampled_texture_type = [_a.keywords.texture_multisampled_2d];
2757
+ TokenTypes.storage_texture_type = [_a.keywords.texture_storage_1d, _a.keywords.texture_storage_2d, _a.keywords.texture_storage_2d_array, _a.keywords.texture_storage_3d];
2758
+ TokenTypes.depth_texture_type = [_a.keywords.texture_depth_2d, _a.keywords.texture_depth_2d_array, _a.keywords.texture_depth_cube, _a.keywords.texture_depth_cube_array, _a.keywords.texture_depth_multisampled_2d];
2759
+ TokenTypes.texture_external_type = [_a.keywords.texture_external];
2760
+ TokenTypes.any_texture_type = [..._a.sampled_texture_type, ..._a.multisampled_texture_type, ..._a.storage_texture_type, ..._a.depth_texture_type, ..._a.texture_external_type];
2761
+ TokenTypes.texel_format = [_a.keywords.r8unorm, _a.keywords.r8snorm, _a.keywords.r8uint, _a.keywords.r8sint, _a.keywords.r16uint, _a.keywords.r16sint, _a.keywords.r16float, _a.keywords.rg8unorm, _a.keywords.rg8snorm, _a.keywords.rg8uint, _a.keywords.rg8sint, _a.keywords.r32uint, _a.keywords.r32sint, _a.keywords.r32float, _a.keywords.rg16uint, _a.keywords.rg16sint, _a.keywords.rg16float, _a.keywords.rgba8unorm, _a.keywords.rgba8unorm_srgb, _a.keywords.rgba8snorm, _a.keywords.rgba8uint, _a.keywords.rgba8sint, _a.keywords.bgra8unorm, _a.keywords.bgra8unorm_srgb, _a.keywords.rgb10a2unorm, _a.keywords.rg11b10float, _a.keywords.rg32uint, _a.keywords.rg32sint, _a.keywords.rg32float, _a.keywords.rgba16uint, _a.keywords.rgba16sint, _a.keywords.rgba16float, _a.keywords.rgba32uint, _a.keywords.rgba32sint, _a.keywords.rgba32float];
2762
+ TokenTypes.const_literal = [_a.tokens.int_literal, _a.tokens.uint_literal, _a.tokens.decimal_float_literal, _a.tokens.hex_float_literal, _a.keywords.true, _a.keywords.false];
2763
+ TokenTypes.literal_or_ident = [_a.tokens.ident, _a.tokens.int_literal, _a.tokens.uint_literal, _a.tokens.decimal_float_literal, _a.tokens.hex_float_literal];
2764
+ TokenTypes.element_count_expression = [_a.tokens.int_literal, _a.tokens.uint_literal, _a.tokens.ident];
2765
+ TokenTypes.template_types = [_a.keywords.vec2, _a.keywords.vec3, _a.keywords.vec4, _a.keywords.mat2x2, _a.keywords.mat2x3, _a.keywords.mat2x4, _a.keywords.mat3x2, _a.keywords.mat3x3, _a.keywords.mat3x4, _a.keywords.mat4x2, _a.keywords.mat4x3, _a.keywords.mat4x4, _a.keywords.atomic, _a.keywords.bitcast, ..._a.any_texture_type];
2766
+ TokenTypes.attribute_name = [_a.tokens.ident, _a.keywords.block];
2767
+ TokenTypes.assignment_operators = [_a.tokens.equal, _a.tokens.plus_equal, _a.tokens.minus_equal, _a.tokens.times_equal, _a.tokens.division_equal, _a.tokens.modulo_equal, _a.tokens.and_equal, _a.tokens.or_equal, _a.tokens.xor_equal, _a.tokens.shift_right_equal, _a.tokens.shift_left_equal];
2768
+ TokenTypes.increment_operators = [_a.tokens.plus_plus, _a.tokens.minus_minus];
2769
+ var Token = class {
2770
+ constructor(type, lexeme, line) {
2771
+ this.type = type;
2772
+ this.lexeme = lexeme;
2773
+ this.line = line;
2774
+ }
2775
+ toString() {
2776
+ return this.lexeme;
2777
+ }
2778
+ isTemplateType() {
2779
+ return TokenTypes.template_types.indexOf(this.type) != -1;
2780
+ }
2781
+ isArrayType() {
2782
+ return this.type == TokenTypes.keywords.array;
2783
+ }
2784
+ isArrayOrTemplateType() {
2785
+ return this.isArrayType() || this.isTemplateType();
2786
+ }
2787
+ };
2788
+ var WgslScanner = class {
2789
+ constructor(source) {
2790
+ this._tokens = [];
2791
+ this._start = 0;
2792
+ this._current = 0;
2793
+ this._line = 1;
2794
+ this._source = source !== null && source !== void 0 ? source : "";
2795
+ }
2796
+ scanTokens() {
2797
+ while (!this._isAtEnd()) {
2798
+ this._start = this._current;
2799
+ if (!this.scanToken())
2800
+ throw `Invalid syntax at line ${this._line}`;
2801
+ }
2802
+ this._tokens.push(new Token(TokenTypes.eof, "", this._line));
2803
+ return this._tokens;
2804
+ }
2805
+ scanToken() {
2806
+ let lexeme = this._advance();
2807
+ if (lexeme == "\n") {
2808
+ this._line++;
2809
+ return true;
2810
+ }
2811
+ if (this._isWhitespace(lexeme)) {
2812
+ return true;
2813
+ }
2814
+ if (lexeme == "/") {
2815
+ if (this._peekAhead() == "/") {
2816
+ while (lexeme != "\n") {
2817
+ if (this._isAtEnd())
2818
+ return true;
2819
+ lexeme = this._advance();
2820
+ }
2821
+ this._line++;
2822
+ return true;
2823
+ } else if (this._peekAhead() == "*") {
2824
+ this._advance();
2825
+ let commentLevel = 1;
2826
+ while (commentLevel > 0) {
2827
+ if (this._isAtEnd())
2828
+ return true;
2829
+ lexeme = this._advance();
2830
+ if (lexeme == "\n") {
2831
+ this._line++;
2832
+ } else if (lexeme == "*") {
2833
+ if (this._peekAhead() == "/") {
2834
+ this._advance();
2835
+ commentLevel--;
2836
+ if (commentLevel == 0) {
2837
+ return true;
2838
+ }
2839
+ }
2840
+ } else if (lexeme == "/") {
2841
+ if (this._peekAhead() == "*") {
2842
+ this._advance();
2843
+ commentLevel++;
2844
+ }
2845
+ }
2846
+ }
2847
+ return true;
2848
+ }
2849
+ }
2850
+ let matchType = TokenTypes.none;
2851
+ for (; ; ) {
2852
+ let matchedType = this._findType(lexeme);
2853
+ const nextLexeme = this._peekAhead();
2854
+ if (lexeme == ">" && (nextLexeme == ">" || nextLexeme == "=")) {
2855
+ let foundLessThan = false;
2856
+ let ti = this._tokens.length - 1;
2857
+ for (let count = 0; count < 5 && ti >= 0; ++count, --ti) {
2858
+ if (this._tokens[ti].type === TokenTypes.tokens.less_than) {
2859
+ if (ti > 0 && this._tokens[ti - 1].isArrayOrTemplateType()) {
2860
+ foundLessThan = true;
2861
+ }
2862
+ break;
2863
+ }
2864
+ }
2865
+ if (foundLessThan) {
2866
+ this._addToken(matchedType);
2867
+ return true;
2868
+ }
2869
+ }
2870
+ if (matchedType === TokenTypes.none) {
2871
+ let lookAheadLexeme = lexeme;
2872
+ let lookAhead = 0;
2873
+ const maxLookAhead = 2;
2874
+ for (let li = 0; li < maxLookAhead; ++li) {
2875
+ lookAheadLexeme += this._peekAhead(li);
2876
+ matchedType = this._findType(lookAheadLexeme);
2877
+ if (matchedType !== TokenTypes.none) {
2878
+ lookAhead = li;
2879
+ break;
2880
+ }
2881
+ }
2882
+ if (matchedType === TokenTypes.none) {
2883
+ if (matchType === TokenTypes.none)
2884
+ return false;
2885
+ this._current--;
2886
+ this._addToken(matchType);
2887
+ return true;
2888
+ }
2889
+ lexeme = lookAheadLexeme;
2890
+ this._current += lookAhead + 1;
2891
+ }
2892
+ matchType = matchedType;
2893
+ if (this._isAtEnd())
2894
+ break;
2895
+ lexeme += this._advance();
2896
+ }
2897
+ if (matchType === TokenTypes.none)
2898
+ return false;
2899
+ this._addToken(matchType);
2900
+ return true;
2901
+ }
2902
+ _findType(lexeme) {
2903
+ for (const name in TokenTypes.keywords) {
2904
+ const type = TokenTypes.keywords[name];
2905
+ if (this._match(lexeme, type.rule)) {
2906
+ return type;
2907
+ }
2908
+ }
2909
+ for (const name in TokenTypes.tokens) {
2910
+ const type = TokenTypes.tokens[name];
2911
+ if (this._match(lexeme, type.rule)) {
2912
+ return type;
2913
+ }
2914
+ }
2915
+ return TokenTypes.none;
2916
+ }
2917
+ _match(lexeme, rule) {
2918
+ if (typeof rule === "string") {
2919
+ if (rule == lexeme) {
2920
+ return true;
2921
+ }
2922
+ } else {
2923
+ const match = rule.exec(lexeme);
2924
+ if (match && match.index == 0 && match[0] == lexeme)
2925
+ return true;
2926
+ }
2927
+ return false;
2928
+ }
2929
+ _isAtEnd() {
2930
+ return this._current >= this._source.length;
2931
+ }
2932
+ _isWhitespace(c) {
2933
+ return c == " " || c == " " || c == "\r";
2934
+ }
2935
+ _advance() {
2936
+ let amount = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : 0;
2937
+ let c = this._source[this._current];
2938
+ amount = amount || 0;
2939
+ amount++;
2940
+ this._current += amount;
2941
+ return c;
2942
+ }
2943
+ _peekAhead() {
2944
+ let offset = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : 0;
2945
+ offset = offset || 0;
2946
+ if (this._current + offset >= this._source.length)
2947
+ return "\0";
2948
+ return this._source[this._current + offset];
2949
+ }
2950
+ _addToken(type) {
2951
+ const text = this._source.substring(this._start, this._current);
2952
+ this._tokens.push(new Token(type, text, this._line));
2953
+ }
2954
+ };
2955
+ var WgslParser = class {
2956
+ constructor() {
2957
+ this._tokens = [];
2958
+ this._current = 0;
2959
+ this._context = new ParseContext();
2960
+ }
2961
+ parse(tokensOrCode) {
2962
+ this._initialize(tokensOrCode);
2963
+ let statements = [];
2964
+ while (!this._isAtEnd()) {
2965
+ const statement = this._global_decl_or_directive();
2966
+ if (!statement)
2967
+ break;
2968
+ statements.push(statement);
2969
+ }
2970
+ return statements;
2971
+ }
2972
+ _initialize(tokensOrCode) {
2973
+ if (tokensOrCode) {
2974
+ if (typeof tokensOrCode == "string") {
2975
+ const scanner = new WgslScanner(tokensOrCode);
2976
+ this._tokens = scanner.scanTokens();
2977
+ } else {
2978
+ this._tokens = tokensOrCode;
2979
+ }
2980
+ } else {
2981
+ this._tokens = [];
2982
+ }
2983
+ this._current = 0;
2984
+ }
2985
+ _error(token, message2) {
2986
+ console.error(token, message2);
2987
+ return {
2988
+ token,
2989
+ message: message2,
2990
+ toString: function() {
2991
+ return `${message2}`;
2992
+ }
2993
+ };
2994
+ }
2995
+ _isAtEnd() {
2996
+ return this._current >= this._tokens.length || this._peek().type == TokenTypes.eof;
2997
+ }
2998
+ _match(types) {
2999
+ if (types instanceof TokenType) {
3000
+ if (this._check(types)) {
3001
+ this._advance();
3002
+ return true;
3003
+ }
3004
+ return false;
3005
+ }
3006
+ for (let i = 0, l = types.length; i < l; ++i) {
3007
+ const type = types[i];
3008
+ if (this._check(type)) {
3009
+ this._advance();
3010
+ return true;
3011
+ }
3012
+ }
3013
+ return false;
3014
+ }
3015
+ _consume(types, message2) {
3016
+ if (this._check(types))
3017
+ return this._advance();
3018
+ throw this._error(this._peek(), message2);
3019
+ }
3020
+ _check(types) {
3021
+ if (this._isAtEnd())
3022
+ return false;
3023
+ const tk = this._peek();
3024
+ if (types instanceof Array) {
3025
+ let t = tk.type;
3026
+ let index2 = types.indexOf(t);
3027
+ return index2 != -1;
3028
+ }
3029
+ return tk.type == types;
3030
+ }
3031
+ _advance() {
3032
+ if (!this._isAtEnd())
3033
+ this._current++;
3034
+ return this._previous();
3035
+ }
3036
+ _peek() {
3037
+ return this._tokens[this._current];
3038
+ }
3039
+ _previous() {
3040
+ return this._tokens[this._current - 1];
3041
+ }
3042
+ _global_decl_or_directive() {
3043
+ while (this._match(TokenTypes.tokens.semicolon) && !this._isAtEnd())
3044
+ ;
3045
+ if (this._match(TokenTypes.keywords.alias)) {
3046
+ const type = this._type_alias();
3047
+ this._consume(TokenTypes.tokens.semicolon, "Expected ';'");
3048
+ return type;
3049
+ }
3050
+ if (this._match(TokenTypes.keywords.enable)) {
3051
+ const enable2 = this._enable_directive();
3052
+ this._consume(TokenTypes.tokens.semicolon, "Expected ';'");
3053
+ return enable2;
3054
+ }
3055
+ const attrs = this._attribute();
3056
+ if (this._check(TokenTypes.keywords.var)) {
3057
+ const _var = this._global_variable_decl();
3058
+ if (_var != null)
3059
+ _var.attributes = attrs;
3060
+ this._consume(TokenTypes.tokens.semicolon, "Expected ';'.");
3061
+ return _var;
3062
+ }
3063
+ if (this._check(TokenTypes.keywords.override)) {
3064
+ const _override = this._override_variable_decl();
3065
+ if (_override != null)
3066
+ _override.attributes = attrs;
3067
+ this._consume(TokenTypes.tokens.semicolon, "Expected ';'.");
3068
+ return _override;
3069
+ }
3070
+ if (this._check(TokenTypes.keywords.let)) {
3071
+ const _let = this._global_let_decl();
3072
+ if (_let != null)
3073
+ _let.attributes = attrs;
3074
+ this._consume(TokenTypes.tokens.semicolon, "Expected ';'.");
3075
+ return _let;
3076
+ }
3077
+ if (this._check(TokenTypes.keywords.const)) {
3078
+ const _const = this._global_const_decl();
3079
+ if (_const != null)
3080
+ _const.attributes = attrs;
3081
+ this._consume(TokenTypes.tokens.semicolon, "Expected ';'.");
3082
+ return _const;
3083
+ }
3084
+ if (this._check(TokenTypes.keywords.struct)) {
3085
+ const _struct = this._struct_decl();
3086
+ if (_struct != null)
3087
+ _struct.attributes = attrs;
3088
+ return _struct;
3089
+ }
3090
+ if (this._check(TokenTypes.keywords.fn)) {
3091
+ const _fn = this._function_decl();
3092
+ if (_fn != null)
3093
+ _fn.attributes = attrs;
3094
+ return _fn;
3095
+ }
3096
+ return null;
3097
+ }
3098
+ _function_decl() {
3099
+ if (!this._match(TokenTypes.keywords.fn))
3100
+ return null;
3101
+ const name = this._consume(TokenTypes.tokens.ident, "Expected function name.").toString();
3102
+ this._consume(TokenTypes.tokens.paren_left, "Expected '(' for function arguments.");
3103
+ const args = [];
3104
+ if (!this._check(TokenTypes.tokens.paren_right)) {
3105
+ do {
3106
+ if (this._check(TokenTypes.tokens.paren_right))
3107
+ break;
3108
+ const argAttrs = this._attribute();
3109
+ const name2 = this._consume(TokenTypes.tokens.ident, "Expected argument name.").toString();
3110
+ this._consume(TokenTypes.tokens.colon, "Expected ':' for argument type.");
3111
+ const typeAttrs = this._attribute();
3112
+ const type = this._type_decl();
3113
+ if (type != null) {
3114
+ type.attributes = typeAttrs;
3115
+ args.push(new Argument(name2, type, argAttrs));
3116
+ }
3117
+ } while (this._match(TokenTypes.tokens.comma));
3118
+ }
3119
+ this._consume(TokenTypes.tokens.paren_right, "Expected ')' after function arguments.");
3120
+ let _return = null;
3121
+ if (this._match(TokenTypes.tokens.arrow)) {
3122
+ const attrs = this._attribute();
3123
+ _return = this._type_decl();
3124
+ if (_return != null)
3125
+ _return.attributes = attrs;
3126
+ }
3127
+ const body = this._compound_statement();
3128
+ return new Function(name, args, _return, body);
3129
+ }
3130
+ _compound_statement() {
3131
+ const statements = [];
3132
+ this._consume(TokenTypes.tokens.brace_left, "Expected '{' for block.");
3133
+ while (!this._check(TokenTypes.tokens.brace_right)) {
3134
+ const statement = this._statement();
3135
+ if (statement !== null)
3136
+ statements.push(statement);
3137
+ }
3138
+ this._consume(TokenTypes.tokens.brace_right, "Expected '}' for block.");
3139
+ return statements;
3140
+ }
3141
+ _statement() {
3142
+ while (this._match(TokenTypes.tokens.semicolon) && !this._isAtEnd())
3143
+ ;
3144
+ if (this._check(TokenTypes.keywords.if))
3145
+ return this._if_statement();
3146
+ if (this._check(TokenTypes.keywords.switch))
3147
+ return this._switch_statement();
3148
+ if (this._check(TokenTypes.keywords.loop))
3149
+ return this._loop_statement();
3150
+ if (this._check(TokenTypes.keywords.for))
3151
+ return this._for_statement();
3152
+ if (this._check(TokenTypes.keywords.while))
3153
+ return this._while_statement();
3154
+ if (this._check(TokenTypes.keywords.continuing))
3155
+ return this._continuing_statement();
3156
+ if (this._check(TokenTypes.keywords.static_assert))
3157
+ return this._static_assert_statement();
3158
+ if (this._check(TokenTypes.tokens.brace_left))
3159
+ return this._compound_statement();
3160
+ let result = null;
3161
+ if (this._check(TokenTypes.keywords.return))
3162
+ result = this._return_statement();
3163
+ else if (this._check([TokenTypes.keywords.var, TokenTypes.keywords.let, TokenTypes.keywords.const]))
3164
+ result = this._variable_statement();
3165
+ else if (this._match(TokenTypes.keywords.discard))
3166
+ result = new Discard();
3167
+ else if (this._match(TokenTypes.keywords.break))
3168
+ result = new Break();
3169
+ else if (this._match(TokenTypes.keywords.continue))
3170
+ result = new Continue();
3171
+ else
3172
+ result = this._increment_decrement_statement() || this._func_call_statement() || this._assignment_statement();
3173
+ if (result != null)
3174
+ this._consume(TokenTypes.tokens.semicolon, "Expected ';' after statement.");
3175
+ return result;
3176
+ }
3177
+ _static_assert_statement() {
3178
+ if (!this._match(TokenTypes.keywords.static_assert))
3179
+ return null;
3180
+ let expression = this._optional_paren_expression();
3181
+ return new StaticAssert(expression);
3182
+ }
3183
+ _while_statement() {
3184
+ if (!this._match(TokenTypes.keywords.while))
3185
+ return null;
3186
+ let condition = this._optional_paren_expression();
3187
+ const block = this._compound_statement();
3188
+ return new While(condition, block);
3189
+ }
3190
+ _continuing_statement() {
3191
+ if (!this._match(TokenTypes.keywords.continuing))
3192
+ return null;
3193
+ const block = this._compound_statement();
3194
+ return new Continuing(block);
3195
+ }
3196
+ _for_statement() {
3197
+ if (!this._match(TokenTypes.keywords.for))
3198
+ return null;
3199
+ this._consume(TokenTypes.tokens.paren_left, "Expected '('.");
3200
+ const init = !this._check(TokenTypes.tokens.semicolon) ? this._for_init() : null;
3201
+ this._consume(TokenTypes.tokens.semicolon, "Expected ';'.");
3202
+ const condition = !this._check(TokenTypes.tokens.semicolon) ? this._short_circuit_or_expression() : null;
3203
+ this._consume(TokenTypes.tokens.semicolon, "Expected ';'.");
3204
+ const increment = !this._check(TokenTypes.tokens.paren_right) ? this._for_increment() : null;
3205
+ this._consume(TokenTypes.tokens.paren_right, "Expected ')'.");
3206
+ const body = this._compound_statement();
3207
+ return new For(init, condition, increment, body);
3208
+ }
3209
+ _for_init() {
3210
+ return this._variable_statement() || this._func_call_statement() || this._assignment_statement();
3211
+ }
3212
+ _for_increment() {
3213
+ return this._func_call_statement() || this._increment_decrement_statement() || this._assignment_statement();
3214
+ }
3215
+ _variable_statement() {
3216
+ if (this._check(TokenTypes.keywords.var)) {
3217
+ const _var = this._variable_decl();
3218
+ if (_var === null)
3219
+ throw this._error(this._peek(), "Variable declaration expected.");
3220
+ let value = null;
3221
+ if (this._match(TokenTypes.tokens.equal))
3222
+ value = this._short_circuit_or_expression();
3223
+ return new Var(_var.name, _var.type, _var.storage, _var.access, value);
3224
+ }
3225
+ if (this._match(TokenTypes.keywords.let)) {
3226
+ const name = this._consume(TokenTypes.tokens.ident, "Expected name for let.").toString();
3227
+ let type = null;
3228
+ if (this._match(TokenTypes.tokens.colon)) {
3229
+ const typeAttrs = this._attribute();
3230
+ type = this._type_decl();
3231
+ if (type != null)
3232
+ type.attributes = typeAttrs;
3233
+ }
3234
+ this._consume(TokenTypes.tokens.equal, "Expected '=' for let.");
3235
+ const value = this._short_circuit_or_expression();
3236
+ return new Let(name, type, null, null, value);
3237
+ }
3238
+ if (this._match(TokenTypes.keywords.const)) {
3239
+ const name = this._consume(TokenTypes.tokens.ident, "Expected name for const.").toString();
3240
+ let type = null;
3241
+ if (this._match(TokenTypes.tokens.colon)) {
3242
+ const typeAttrs = this._attribute();
3243
+ type = this._type_decl();
3244
+ if (type != null)
3245
+ type.attributes = typeAttrs;
3246
+ }
3247
+ this._consume(TokenTypes.tokens.equal, "Expected '=' for const.");
3248
+ const value = this._short_circuit_or_expression();
3249
+ return new Const(name, type, null, null, value);
3250
+ }
3251
+ return null;
3252
+ }
3253
+ _increment_decrement_statement() {
3254
+ const savedPos = this._current;
3255
+ const _var = this._unary_expression();
3256
+ if (_var == null)
3257
+ return null;
3258
+ if (!this._check(TokenTypes.increment_operators)) {
3259
+ this._current = savedPos;
3260
+ return null;
3261
+ }
3262
+ const token = this._consume(TokenTypes.increment_operators, "Expected increment operator");
3263
+ return new Increment(token.type === TokenTypes.tokens.plus_plus ? IncrementOperator.increment : IncrementOperator.decrement, _var);
3264
+ }
3265
+ _assignment_statement() {
3266
+ let _var = null;
3267
+ if (this._check(TokenTypes.tokens.brace_right))
3268
+ return null;
3269
+ let isUnderscore = this._match(TokenTypes.tokens.underscore);
3270
+ if (!isUnderscore)
3271
+ _var = this._unary_expression();
3272
+ if (!isUnderscore && _var == null)
3273
+ return null;
3274
+ const type = this._consume(TokenTypes.assignment_operators, "Expected assignment operator.");
3275
+ const value = this._short_circuit_or_expression();
3276
+ return new Assign(AssignOperator.parse(type.lexeme), _var, value);
3277
+ }
3278
+ _func_call_statement() {
3279
+ if (!this._check(TokenTypes.tokens.ident))
3280
+ return null;
3281
+ const savedPos = this._current;
3282
+ const name = this._consume(TokenTypes.tokens.ident, "Expected function name.");
3283
+ const args = this._argument_expression_list();
3284
+ if (args === null) {
3285
+ this._current = savedPos;
3286
+ return null;
3287
+ }
3288
+ return new Call(name.lexeme, args);
3289
+ }
3290
+ _loop_statement() {
3291
+ if (!this._match(TokenTypes.keywords.loop))
3292
+ return null;
3293
+ this._consume(TokenTypes.tokens.brace_left, "Expected '{' for loop.");
3294
+ const statements = [];
3295
+ let statement = this._statement();
3296
+ while (statement !== null) {
3297
+ if (Array.isArray(statement)) {
3298
+ for (let s of statement) {
3299
+ statements.push(s);
3300
+ }
3301
+ } else {
3302
+ statements.push(statement);
3303
+ }
3304
+ statement = this._statement();
3305
+ }
3306
+ let continuing = null;
3307
+ if (this._match(TokenTypes.keywords.continuing))
3308
+ continuing = this._compound_statement();
3309
+ this._consume(TokenTypes.tokens.brace_right, "Expected '}' for loop.");
3310
+ return new Loop(statements, continuing);
3311
+ }
3312
+ _switch_statement() {
3313
+ if (!this._match(TokenTypes.keywords.switch))
3314
+ return null;
3315
+ const condition = this._optional_paren_expression();
3316
+ this._consume(TokenTypes.tokens.brace_left, "Expected '{' for switch.");
3317
+ const body = this._switch_body();
3318
+ if (body == null || body.length == 0)
3319
+ throw this._error(this._previous(), "Expected 'case' or 'default'.");
3320
+ this._consume(TokenTypes.tokens.brace_right, "Expected '}' for switch.");
3321
+ return new Switch(condition, body);
3322
+ }
3323
+ _switch_body() {
3324
+ const cases = [];
3325
+ if (this._match(TokenTypes.keywords.case)) {
3326
+ const selector = this._case_selectors();
3327
+ this._match(TokenTypes.tokens.colon);
3328
+ this._consume(TokenTypes.tokens.brace_left, "Exected '{' for switch case.");
3329
+ const body = this._case_body();
3330
+ this._consume(TokenTypes.tokens.brace_right, "Exected '}' for switch case.");
3331
+ cases.push(new Case(selector, body));
3332
+ }
3333
+ if (this._match(TokenTypes.keywords.default)) {
3334
+ this._match(TokenTypes.tokens.colon);
3335
+ this._consume(TokenTypes.tokens.brace_left, "Exected '{' for switch default.");
3336
+ const body = this._case_body();
3337
+ this._consume(TokenTypes.tokens.brace_right, "Exected '}' for switch default.");
3338
+ cases.push(new Default(body));
3339
+ }
3340
+ if (this._check([TokenTypes.keywords.default, TokenTypes.keywords.case])) {
3341
+ const _cases = this._switch_body();
3342
+ cases.push(_cases[0]);
3343
+ }
3344
+ return cases;
3345
+ }
3346
+ _case_selectors() {
3347
+ var _a2, _b, _c, _d;
3348
+ const selectors = [(_b = (_a2 = this._shift_expression()) === null || _a2 === void 0 ? void 0 : _a2.evaluate(this._context).toString()) !== null && _b !== void 0 ? _b : ""];
3349
+ while (this._match(TokenTypes.tokens.comma)) {
3350
+ selectors.push((_d = (_c = this._shift_expression()) === null || _c === void 0 ? void 0 : _c.evaluate(this._context).toString()) !== null && _d !== void 0 ? _d : "");
3351
+ }
3352
+ return selectors;
3353
+ }
3354
+ _case_body() {
3355
+ if (this._match(TokenTypes.keywords.fallthrough)) {
3356
+ this._consume(TokenTypes.tokens.semicolon, "Expected ';'");
3357
+ return [];
3358
+ }
3359
+ let statement = this._statement();
3360
+ if (statement == null)
3361
+ return [];
3362
+ if (!(statement instanceof Array)) {
3363
+ statement = [statement];
3364
+ }
3365
+ const nextStatement = this._case_body();
3366
+ if (nextStatement.length == 0)
3367
+ return statement;
3368
+ return [...statement, nextStatement[0]];
3369
+ }
3370
+ _if_statement() {
3371
+ if (!this._match(TokenTypes.keywords.if))
3372
+ return null;
3373
+ const condition = this._optional_paren_expression();
3374
+ const block = this._compound_statement();
3375
+ let elseif = [];
3376
+ if (this._match_elseif()) {
3377
+ elseif = this._elseif_statement(elseif);
3378
+ }
3379
+ let _else = null;
3380
+ if (this._match(TokenTypes.keywords.else))
3381
+ _else = this._compound_statement();
3382
+ return new If(condition, block, elseif, _else);
3383
+ }
3384
+ _match_elseif() {
3385
+ if (this._tokens[this._current].type === TokenTypes.keywords.else && this._tokens[this._current + 1].type === TokenTypes.keywords.if) {
3386
+ this._advance();
3387
+ this._advance();
3388
+ return true;
3389
+ }
3390
+ return false;
3391
+ }
3392
+ _elseif_statement() {
3393
+ let elseif = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : [];
3394
+ const condition = this._optional_paren_expression();
3395
+ const block = this._compound_statement();
3396
+ elseif.push(new ElseIf(condition, block));
3397
+ if (this._match_elseif()) {
3398
+ this._elseif_statement(elseif);
3399
+ }
3400
+ return elseif;
3401
+ }
3402
+ _return_statement() {
3403
+ if (!this._match(TokenTypes.keywords.return))
3404
+ return null;
3405
+ const value = this._short_circuit_or_expression();
3406
+ return new Return(value);
3407
+ }
3408
+ _short_circuit_or_expression() {
3409
+ let expr = this._short_circuit_and_expr();
3410
+ while (this._match(TokenTypes.tokens.or_or)) {
3411
+ expr = new BinaryOperator(this._previous().toString(), expr, this._short_circuit_and_expr());
3412
+ }
3413
+ return expr;
3414
+ }
3415
+ _short_circuit_and_expr() {
3416
+ let expr = this._inclusive_or_expression();
3417
+ while (this._match(TokenTypes.tokens.and_and)) {
3418
+ expr = new BinaryOperator(this._previous().toString(), expr, this._inclusive_or_expression());
3419
+ }
3420
+ return expr;
3421
+ }
3422
+ _inclusive_or_expression() {
3423
+ let expr = this._exclusive_or_expression();
3424
+ while (this._match(TokenTypes.tokens.or)) {
3425
+ expr = new BinaryOperator(this._previous().toString(), expr, this._exclusive_or_expression());
3426
+ }
3427
+ return expr;
3428
+ }
3429
+ _exclusive_or_expression() {
3430
+ let expr = this._and_expression();
3431
+ while (this._match(TokenTypes.tokens.xor)) {
3432
+ expr = new BinaryOperator(this._previous().toString(), expr, this._and_expression());
3433
+ }
3434
+ return expr;
3435
+ }
3436
+ _and_expression() {
3437
+ let expr = this._equality_expression();
3438
+ while (this._match(TokenTypes.tokens.and)) {
3439
+ expr = new BinaryOperator(this._previous().toString(), expr, this._equality_expression());
3440
+ }
3441
+ return expr;
3442
+ }
3443
+ _equality_expression() {
3444
+ const expr = this._relational_expression();
3445
+ if (this._match([TokenTypes.tokens.equal_equal, TokenTypes.tokens.not_equal])) {
3446
+ return new BinaryOperator(this._previous().toString(), expr, this._relational_expression());
3447
+ }
3448
+ return expr;
3449
+ }
3450
+ _relational_expression() {
3451
+ let expr = this._shift_expression();
3452
+ while (this._match([TokenTypes.tokens.less_than, TokenTypes.tokens.greater_than, TokenTypes.tokens.less_than_equal, TokenTypes.tokens.greater_than_equal])) {
3453
+ expr = new BinaryOperator(this._previous().toString(), expr, this._shift_expression());
3454
+ }
3455
+ return expr;
3456
+ }
3457
+ _shift_expression() {
3458
+ let expr = this._additive_expression();
3459
+ while (this._match([TokenTypes.tokens.shift_left, TokenTypes.tokens.shift_right])) {
3460
+ expr = new BinaryOperator(this._previous().toString(), expr, this._additive_expression());
3461
+ }
3462
+ return expr;
3463
+ }
3464
+ _additive_expression() {
3465
+ let expr = this._multiplicative_expression();
3466
+ while (this._match([TokenTypes.tokens.plus, TokenTypes.tokens.minus])) {
3467
+ expr = new BinaryOperator(this._previous().toString(), expr, this._multiplicative_expression());
3468
+ }
3469
+ return expr;
3470
+ }
3471
+ _multiplicative_expression() {
3472
+ let expr = this._unary_expression();
3473
+ while (this._match([TokenTypes.tokens.star, TokenTypes.tokens.forward_slash, TokenTypes.tokens.modulo])) {
3474
+ expr = new BinaryOperator(this._previous().toString(), expr, this._unary_expression());
3475
+ }
3476
+ return expr;
3477
+ }
3478
+ _unary_expression() {
3479
+ if (this._match([TokenTypes.tokens.minus, TokenTypes.tokens.bang, TokenTypes.tokens.tilde, TokenTypes.tokens.star, TokenTypes.tokens.and])) {
3480
+ return new UnaryOperator(this._previous().toString(), this._unary_expression());
3481
+ }
3482
+ return this._singular_expression();
3483
+ }
3484
+ _singular_expression() {
3485
+ const expr = this._primary_expression();
3486
+ const p = this._postfix_expression();
3487
+ if (p)
3488
+ expr.postfix = p;
3489
+ return expr;
3490
+ }
3491
+ _postfix_expression() {
3492
+ if (this._match(TokenTypes.tokens.bracket_left)) {
3493
+ const expr = this._short_circuit_or_expression();
3494
+ this._consume(TokenTypes.tokens.bracket_right, "Expected ']'.");
3495
+ const p = this._postfix_expression();
3496
+ if (p)
3497
+ expr.postfix = p;
3498
+ return expr;
3499
+ }
3500
+ if (this._match(TokenTypes.tokens.period)) {
3501
+ const name = this._consume(TokenTypes.tokens.ident, "Expected member name.");
3502
+ const p = this._postfix_expression();
3503
+ const expr = new StringExpr(name.lexeme);
3504
+ if (p)
3505
+ expr.postfix = p;
3506
+ return expr;
3507
+ }
3508
+ return null;
3509
+ }
3510
+ _getStruct(name) {
3511
+ if (this._context.aliases.has(name)) {
3512
+ const alias = this._context.aliases.get(name).type;
3513
+ return alias;
3514
+ }
3515
+ if (this._context.structs.has(name)) {
3516
+ const struct = this._context.structs.get(name);
3517
+ return struct;
3518
+ }
3519
+ return null;
3520
+ }
3521
+ _primary_expression() {
3522
+ if (this._match(TokenTypes.tokens.ident)) {
3523
+ const name = this._previous().toString();
3524
+ if (this._check(TokenTypes.tokens.paren_left)) {
3525
+ const args2 = this._argument_expression_list();
3526
+ const struct = this._getStruct(name);
3527
+ if (struct != null) {
3528
+ return new CreateExpr(struct, args2);
3529
+ }
3530
+ return new CallExpr(name, args2);
3531
+ }
3532
+ if (this._context.constants.has(name)) {
3533
+ const c = this._context.constants.get(name);
3534
+ return new ConstExpr(name, c.value);
3535
+ }
3536
+ return new VariableExpr(name);
3537
+ }
3538
+ if (this._match(TokenTypes.const_literal)) {
3539
+ return new LiteralExpr(parseFloat(this._previous().toString()));
3540
+ }
3541
+ if (this._check(TokenTypes.tokens.paren_left)) {
3542
+ return this._paren_expression();
3543
+ }
3544
+ if (this._match(TokenTypes.keywords.bitcast)) {
3545
+ this._consume(TokenTypes.tokens.less_than, "Expected '<'.");
3546
+ const type2 = this._type_decl();
3547
+ this._consume(TokenTypes.tokens.greater_than, "Expected '>'.");
3548
+ const value = this._paren_expression();
3549
+ return new BitcastExpr(type2, value);
3550
+ }
3551
+ const type = this._type_decl();
3552
+ const args = this._argument_expression_list();
3553
+ return new TypecastExpr(type, args);
3554
+ }
3555
+ _argument_expression_list() {
3556
+ if (!this._match(TokenTypes.tokens.paren_left))
3557
+ return null;
3558
+ const args = [];
3559
+ do {
3560
+ if (this._check(TokenTypes.tokens.paren_right))
3561
+ break;
3562
+ const arg = this._short_circuit_or_expression();
3563
+ args.push(arg);
3564
+ } while (this._match(TokenTypes.tokens.comma));
3565
+ this._consume(TokenTypes.tokens.paren_right, "Expected ')' for agument list");
3566
+ return args;
3567
+ }
3568
+ _optional_paren_expression() {
3569
+ this._match(TokenTypes.tokens.paren_left);
3570
+ const expr = this._short_circuit_or_expression();
3571
+ this._match(TokenTypes.tokens.paren_right);
3572
+ return new GroupingExpr([expr]);
3573
+ }
3574
+ _paren_expression() {
3575
+ this._consume(TokenTypes.tokens.paren_left, "Expected '('.");
3576
+ const expr = this._short_circuit_or_expression();
3577
+ this._consume(TokenTypes.tokens.paren_right, "Expected ')'.");
3578
+ return new GroupingExpr([expr]);
3579
+ }
3580
+ _struct_decl() {
3581
+ if (!this._match(TokenTypes.keywords.struct))
3582
+ return null;
3583
+ const name = this._consume(TokenTypes.tokens.ident, "Expected name for struct.").toString();
3584
+ this._consume(TokenTypes.tokens.brace_left, "Expected '{' for struct body.");
3585
+ const members = [];
3586
+ while (!this._check(TokenTypes.tokens.brace_right)) {
3587
+ const memberAttrs = this._attribute();
3588
+ const memberName = this._consume(TokenTypes.tokens.ident, "Expected variable name.").toString();
3589
+ this._consume(TokenTypes.tokens.colon, "Expected ':' for struct member type.");
3590
+ const typeAttrs = this._attribute();
3591
+ const memberType = this._type_decl();
3592
+ if (memberType != null)
3593
+ memberType.attributes = typeAttrs;
3594
+ if (!this._check(TokenTypes.tokens.brace_right))
3595
+ this._consume(TokenTypes.tokens.comma, "Expected ',' for struct member.");
3596
+ else
3597
+ this._match(TokenTypes.tokens.comma);
3598
+ members.push(new Member(memberName, memberType, memberAttrs));
3599
+ }
3600
+ this._consume(TokenTypes.tokens.brace_right, "Expected '}' after struct body.");
3601
+ const structNode = new Struct(name, members);
3602
+ this._context.structs.set(name, structNode);
3603
+ return structNode;
3604
+ }
3605
+ _global_variable_decl() {
3606
+ const _var = this._variable_decl();
3607
+ if (_var && this._match(TokenTypes.tokens.equal))
3608
+ _var.value = this._const_expression();
3609
+ return _var;
3610
+ }
3611
+ _override_variable_decl() {
3612
+ const _override = this._override_decl();
3613
+ if (_override && this._match(TokenTypes.tokens.equal))
3614
+ _override.value = this._const_expression();
3615
+ return _override;
3616
+ }
3617
+ _global_const_decl() {
3618
+ if (!this._match(TokenTypes.keywords.const))
3619
+ return null;
3620
+ const name = this._consume(TokenTypes.tokens.ident, "Expected variable name");
3621
+ let type = null;
3622
+ if (this._match(TokenTypes.tokens.colon)) {
3623
+ const attrs = this._attribute();
3624
+ type = this._type_decl();
3625
+ if (type != null)
3626
+ type.attributes = attrs;
3627
+ }
3628
+ let value = null;
3629
+ if (this._match(TokenTypes.tokens.equal)) {
3630
+ const valueExpr = this._short_circuit_or_expression();
3631
+ if (valueExpr instanceof CreateExpr) {
3632
+ value = valueExpr;
3633
+ } else if (valueExpr instanceof ConstExpr && valueExpr.initializer instanceof CreateExpr) {
3634
+ value = valueExpr.initializer;
3635
+ } else {
3636
+ try {
3637
+ const constValue = valueExpr.evaluate(this._context);
3638
+ value = new LiteralExpr(constValue);
3639
+ } catch (_a2) {
3640
+ value = valueExpr;
3641
+ }
3642
+ }
3643
+ }
3644
+ const c = new Const(name.toString(), type, "", "", value);
3645
+ this._context.constants.set(c.name, c);
3646
+ return c;
3647
+ }
3648
+ _global_let_decl() {
3649
+ if (!this._match(TokenTypes.keywords.let))
3650
+ return null;
3651
+ const name = this._consume(TokenTypes.tokens.ident, "Expected variable name");
3652
+ let type = null;
3653
+ if (this._match(TokenTypes.tokens.colon)) {
3654
+ const attrs = this._attribute();
3655
+ type = this._type_decl();
3656
+ if (type != null)
3657
+ type.attributes = attrs;
3658
+ }
3659
+ let value = null;
3660
+ if (this._match(TokenTypes.tokens.equal)) {
3661
+ value = this._const_expression();
3662
+ }
3663
+ return new Let(name.toString(), type, "", "", value);
3664
+ }
3665
+ _const_expression() {
3666
+ if (this._match(TokenTypes.const_literal))
3667
+ return new StringExpr(this._previous().toString());
3668
+ const type = this._type_decl();
3669
+ this._consume(TokenTypes.tokens.paren_left, "Expected '('.");
3670
+ let args = [];
3671
+ while (!this._check(TokenTypes.tokens.paren_right)) {
3672
+ args.push(this._const_expression());
3673
+ if (!this._check(TokenTypes.tokens.comma))
3674
+ break;
3675
+ this._advance();
3676
+ }
3677
+ this._consume(TokenTypes.tokens.paren_right, "Expected ')'.");
3678
+ return new CreateExpr(type, args);
3679
+ }
3680
+ _variable_decl() {
3681
+ if (!this._match(TokenTypes.keywords.var))
3682
+ return null;
3683
+ let storage = "";
3684
+ let access = "";
3685
+ if (this._match(TokenTypes.tokens.less_than)) {
3686
+ storage = this._consume(TokenTypes.storage_class, "Expected storage_class.").toString();
3687
+ if (this._match(TokenTypes.tokens.comma))
3688
+ access = this._consume(TokenTypes.access_mode, "Expected access_mode.").toString();
3689
+ this._consume(TokenTypes.tokens.greater_than, "Expected '>'.");
3690
+ }
3691
+ const name = this._consume(TokenTypes.tokens.ident, "Expected variable name");
3692
+ let type = null;
3693
+ if (this._match(TokenTypes.tokens.colon)) {
3694
+ const attrs = this._attribute();
3695
+ type = this._type_decl();
3696
+ if (type != null)
3697
+ type.attributes = attrs;
3698
+ }
3699
+ return new Var(name.toString(), type, storage, access, null);
3700
+ }
3701
+ _override_decl() {
3702
+ if (!this._match(TokenTypes.keywords.override))
3703
+ return null;
3704
+ const name = this._consume(TokenTypes.tokens.ident, "Expected variable name");
3705
+ let type = null;
3706
+ if (this._match(TokenTypes.tokens.colon)) {
3707
+ const attrs = this._attribute();
3708
+ type = this._type_decl();
3709
+ if (type != null)
3710
+ type.attributes = attrs;
3711
+ }
3712
+ return new Override(name.toString(), type, null);
3713
+ }
3714
+ _enable_directive() {
3715
+ const name = this._consume(TokenTypes.tokens.ident, "identity expected.");
3716
+ return new Enable(name.toString());
3717
+ }
3718
+ _type_alias() {
3719
+ const name = this._consume(TokenTypes.tokens.ident, "identity expected.");
3720
+ this._consume(TokenTypes.tokens.equal, "Expected '=' for type alias.");
3721
+ let aliasType = this._type_decl();
3722
+ if (aliasType === null) {
3723
+ throw this._error(this._peek(), "Expected Type for Alias.");
3724
+ }
3725
+ if (this._context.aliases.has(aliasType.name)) {
3726
+ aliasType = this._context.aliases.get(aliasType.name).type;
3727
+ }
3728
+ const aliasNode = new Alias(name.toString(), aliasType);
3729
+ this._context.aliases.set(aliasNode.name, aliasNode);
3730
+ return aliasNode;
3731
+ }
3732
+ _type_decl() {
3733
+ if (this._check([TokenTypes.tokens.ident, ...TokenTypes.texel_format, TokenTypes.keywords.bool, TokenTypes.keywords.f32, TokenTypes.keywords.i32, TokenTypes.keywords.u32])) {
3734
+ const type2 = this._advance();
3735
+ const typeName = type2.toString();
3736
+ if (this._context.structs.has(typeName)) {
3737
+ return this._context.structs.get(typeName);
3738
+ }
3739
+ if (this._context.aliases.has(typeName)) {
3740
+ return this._context.aliases.get(typeName).type;
3741
+ }
3742
+ return new Type(type2.toString());
3743
+ }
3744
+ let type = this._texture_sampler_types();
3745
+ if (type)
3746
+ return type;
3747
+ if (this._check(TokenTypes.template_types)) {
3748
+ let type2 = this._advance().toString();
3749
+ let format = null;
3750
+ let access = null;
3751
+ if (this._match(TokenTypes.tokens.less_than)) {
3752
+ format = this._type_decl();
3753
+ access = null;
3754
+ if (this._match(TokenTypes.tokens.comma))
3755
+ access = this._consume(TokenTypes.access_mode, "Expected access_mode for pointer").toString();
3756
+ this._consume(TokenTypes.tokens.greater_than, "Expected '>' for type.");
3757
+ }
3758
+ return new TemplateType(type2, format, access);
3759
+ }
3760
+ if (this._match(TokenTypes.keywords.ptr)) {
3761
+ let pointer = this._previous().toString();
3762
+ this._consume(TokenTypes.tokens.less_than, "Expected '<' for pointer.");
3763
+ const storage = this._consume(TokenTypes.storage_class, "Expected storage_class for pointer");
3764
+ this._consume(TokenTypes.tokens.comma, "Expected ',' for pointer.");
3765
+ const decl = this._type_decl();
3766
+ let access = null;
3767
+ if (this._match(TokenTypes.tokens.comma))
3768
+ access = this._consume(TokenTypes.access_mode, "Expected access_mode for pointer").toString();
3769
+ this._consume(TokenTypes.tokens.greater_than, "Expected '>' for pointer.");
3770
+ return new PointerType(pointer, storage.toString(), decl, access);
3771
+ }
3772
+ const attrs = this._attribute();
3773
+ if (this._match(TokenTypes.keywords.array)) {
3774
+ let format = null;
3775
+ let countInt = -1;
3776
+ const array = this._previous();
3777
+ if (this._match(TokenTypes.tokens.less_than)) {
3778
+ format = this._type_decl();
3779
+ if (this._context.aliases.has(format.name)) {
3780
+ format = this._context.aliases.get(format.name).type;
3781
+ }
3782
+ let count = "";
3783
+ if (this._match(TokenTypes.tokens.comma)) {
3784
+ let c = this._shift_expression();
3785
+ count = c.evaluate(this._context).toString();
3786
+ }
3787
+ this._consume(TokenTypes.tokens.greater_than, "Expected '>' for array.");
3788
+ countInt = count ? parseInt(count) : 0;
3789
+ }
3790
+ return new ArrayType(array.toString(), attrs, format, countInt);
3791
+ }
3792
+ return null;
3793
+ }
3794
+ _texture_sampler_types() {
3795
+ if (this._match(TokenTypes.sampler_type))
3796
+ return new SamplerType(this._previous().toString(), null, null);
3797
+ if (this._match(TokenTypes.depth_texture_type))
3798
+ return new SamplerType(this._previous().toString(), null, null);
3799
+ if (this._match(TokenTypes.sampled_texture_type) || this._match(TokenTypes.multisampled_texture_type)) {
3800
+ const sampler = this._previous();
3801
+ this._consume(TokenTypes.tokens.less_than, "Expected '<' for sampler type.");
3802
+ const format = this._type_decl();
3803
+ this._consume(TokenTypes.tokens.greater_than, "Expected '>' for sampler type.");
3804
+ return new SamplerType(sampler.toString(), format, null);
3805
+ }
3806
+ if (this._match(TokenTypes.storage_texture_type)) {
3807
+ const sampler = this._previous();
3808
+ this._consume(TokenTypes.tokens.less_than, "Expected '<' for sampler type.");
3809
+ const format = this._consume(TokenTypes.texel_format, "Invalid texel format.").toString();
3810
+ this._consume(TokenTypes.tokens.comma, "Expected ',' after texel format.");
3811
+ const access = this._consume(TokenTypes.access_mode, "Expected access mode for storage texture type.").toString();
3812
+ this._consume(TokenTypes.tokens.greater_than, "Expected '>' for sampler type.");
3813
+ return new SamplerType(sampler.toString(), format, access);
3814
+ }
3815
+ return null;
3816
+ }
3817
+ _attribute() {
3818
+ let attributes = [];
3819
+ while (this._match(TokenTypes.tokens.attr)) {
3820
+ const name = this._consume(TokenTypes.attribute_name, "Expected attribute name");
3821
+ const attr = new Attribute(name.toString(), null);
3822
+ if (this._match(TokenTypes.tokens.paren_left)) {
3823
+ attr.value = this._consume(TokenTypes.literal_or_ident, "Expected attribute value").toString();
3824
+ if (this._check(TokenTypes.tokens.comma)) {
3825
+ this._advance();
3826
+ do {
3827
+ const v = this._consume(TokenTypes.literal_or_ident, "Expected attribute value").toString();
3828
+ if (!(attr.value instanceof Array)) {
3829
+ attr.value = [attr.value];
3830
+ }
3831
+ attr.value.push(v);
3832
+ } while (this._match(TokenTypes.tokens.comma));
3833
+ }
3834
+ this._consume(TokenTypes.tokens.paren_right, "Expected ')'");
3835
+ }
3836
+ attributes.push(attr);
3837
+ }
3838
+ while (this._match(TokenTypes.tokens.attr_left)) {
3839
+ if (!this._check(TokenTypes.tokens.attr_right)) {
3840
+ do {
3841
+ const name = this._consume(TokenTypes.attribute_name, "Expected attribute name");
3842
+ const attr = new Attribute(name.toString(), null);
3843
+ if (this._match(TokenTypes.tokens.paren_left)) {
3844
+ attr.value = [this._consume(TokenTypes.literal_or_ident, "Expected attribute value").toString()];
3845
+ if (this._check(TokenTypes.tokens.comma)) {
3846
+ this._advance();
3847
+ do {
3848
+ const v = this._consume(TokenTypes.literal_or_ident, "Expected attribute value").toString();
3849
+ attr.value.push(v);
3850
+ } while (this._match(TokenTypes.tokens.comma));
3851
+ }
3852
+ this._consume(TokenTypes.tokens.paren_right, "Expected ')'");
3853
+ }
3854
+ attributes.push(attr);
3855
+ } while (this._match(TokenTypes.tokens.comma));
3856
+ }
3857
+ this._consume(TokenTypes.tokens.attr_right, "Expected ']]' after attribute declarations");
3858
+ }
3859
+ if (attributes.length == 0)
3860
+ return null;
3861
+ return attributes;
3862
+ }
3863
+ };
3864
+ var TypeInfo = class {
3865
+ constructor(name, attributes) {
3866
+ this.name = name;
3867
+ this.attributes = attributes;
3868
+ this.size = 0;
3869
+ }
3870
+ get isArray() {
3871
+ return false;
3872
+ }
3873
+ get isStruct() {
3874
+ return false;
3875
+ }
3876
+ get isTemplate() {
3877
+ return false;
3878
+ }
3879
+ };
3880
+ var MemberInfo = class {
3881
+ constructor(name, type, attributes) {
3882
+ this.name = name;
3883
+ this.type = type;
3884
+ this.attributes = attributes;
3885
+ this.offset = 0;
3886
+ this.size = 0;
3887
+ }
3888
+ get isArray() {
3889
+ return this.type.isArray;
3890
+ }
3891
+ get isStruct() {
3892
+ return this.type.isStruct;
3893
+ }
3894
+ get isTemplate() {
3895
+ return this.type.isTemplate;
3896
+ }
3897
+ get align() {
3898
+ return this.type.isStruct ? this.type.align : 0;
3899
+ }
3900
+ get members() {
3901
+ return this.type.isStruct ? this.type.members : null;
3902
+ }
3903
+ get format() {
3904
+ return this.type.isArray ? this.type.format : this.type.isTemplate ? this.type.format : null;
3905
+ }
3906
+ get count() {
3907
+ return this.type.isArray ? this.type.count : 0;
3908
+ }
3909
+ get stride() {
3910
+ return this.type.isArray ? this.type.stride : this.size;
3911
+ }
3912
+ };
3913
+ var StructInfo = class extends TypeInfo {
3914
+ constructor(name, attributes) {
3915
+ super(name, attributes);
3916
+ this.members = [];
3917
+ this.align = 0;
3918
+ }
3919
+ get isStruct() {
3920
+ return true;
3921
+ }
3922
+ };
3923
+ var ArrayInfo = class extends TypeInfo {
3924
+ constructor(name, attributes) {
3925
+ super(name, attributes);
3926
+ this.count = 0;
3927
+ this.stride = 0;
3928
+ }
3929
+ get isArray() {
3930
+ return true;
3931
+ }
3932
+ };
3933
+ var TemplateInfo = class extends TypeInfo {
3934
+ constructor(name, format, attributes, access) {
3935
+ super(name, attributes);
3936
+ this.format = format;
3937
+ this.access = access;
3938
+ }
3939
+ get isTemplate() {
3940
+ return true;
3941
+ }
3942
+ };
3943
+ var ResourceType;
3944
+ (function(ResourceType2) {
3945
+ ResourceType2[ResourceType2["Uniform"] = 0] = "Uniform";
3946
+ ResourceType2[ResourceType2["Storage"] = 1] = "Storage";
3947
+ ResourceType2[ResourceType2["Texture"] = 2] = "Texture";
3948
+ ResourceType2[ResourceType2["Sampler"] = 3] = "Sampler";
3949
+ ResourceType2[ResourceType2["StorageTexture"] = 4] = "StorageTexture";
3950
+ })(ResourceType || (ResourceType = {}));
3951
+ var VariableInfo = class {
3952
+ constructor(name, type, group, binding, attributes, resourceType, access) {
3953
+ this.name = name;
3954
+ this.type = type;
3955
+ this.group = group;
3956
+ this.binding = binding;
3957
+ this.attributes = attributes;
3958
+ this.resourceType = resourceType;
3959
+ this.access = access;
3960
+ }
3961
+ get isArray() {
3962
+ return this.type.isArray;
3963
+ }
3964
+ get isStruct() {
3965
+ return this.type.isStruct;
3966
+ }
3967
+ get isTemplate() {
3968
+ return this.type.isTemplate;
3969
+ }
3970
+ get size() {
3971
+ return this.type.size;
3972
+ }
3973
+ get align() {
3974
+ return this.type.isStruct ? this.type.align : 0;
3975
+ }
3976
+ get members() {
3977
+ return this.type.isStruct ? this.type.members : null;
3978
+ }
3979
+ get format() {
3980
+ return this.type.isArray ? this.type.format : this.type.isTemplate ? this.type.format : null;
3981
+ }
3982
+ get count() {
3983
+ return this.type.isArray ? this.type.count : 0;
3984
+ }
3985
+ get stride() {
3986
+ return this.type.isArray ? this.type.stride : this.size;
3987
+ }
3988
+ };
3989
+ var AliasInfo = class {
3990
+ constructor(name, type) {
3991
+ this.name = name;
3992
+ this.type = type;
3993
+ }
3994
+ };
3995
+ var _TypeSize = class {
3996
+ constructor(align, size) {
3997
+ this.align = align;
3998
+ this.size = size;
3999
+ }
4000
+ };
4001
+ var InputInfo = class {
4002
+ constructor(name, type, locationType, location) {
4003
+ this.name = name;
4004
+ this.type = type;
4005
+ this.locationType = locationType;
4006
+ this.location = location;
4007
+ this.interpolation = null;
4008
+ }
4009
+ };
4010
+ var OutputInfo = class {
4011
+ constructor(name, type, locationType, location) {
4012
+ this.name = name;
4013
+ this.type = type;
4014
+ this.locationType = locationType;
4015
+ this.location = location;
4016
+ }
4017
+ };
4018
+ var FunctionInfo = class {
4019
+ constructor(name) {
4020
+ let stage = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : null;
4021
+ this.stage = null;
4022
+ this.inputs = [];
4023
+ this.outputs = [];
4024
+ this.name = name;
4025
+ this.stage = stage;
4026
+ }
4027
+ };
4028
+ var EntryFunctions = class {
4029
+ constructor() {
4030
+ this.vertex = [];
4031
+ this.fragment = [];
4032
+ this.compute = [];
4033
+ }
4034
+ };
4035
+ var OverrideInfo = class {
4036
+ constructor(name, type, attributes, id) {
4037
+ this.name = name;
4038
+ this.type = type;
4039
+ this.attributes = attributes;
4040
+ this.id = id;
4041
+ }
4042
+ };
4043
+ var WgslReflect = class {
4044
+ constructor(code) {
4045
+ this.uniforms = [];
4046
+ this.storage = [];
4047
+ this.textures = [];
4048
+ this.samplers = [];
4049
+ this.aliases = [];
4050
+ this.overrides = [];
4051
+ this.structs = [];
4052
+ this.entry = new EntryFunctions();
4053
+ this._types = /* @__PURE__ */ new Map();
4054
+ if (code) {
4055
+ this.update(code);
4056
+ }
4057
+ }
4058
+ _isStorageTexture(type) {
4059
+ return type.name == "texture_storage_1d" || type.name == "texture_storage_2d" || type.name == "texture_storage_2d_array" || type.name == "texture_storage_3d";
4060
+ }
4061
+ update(code) {
4062
+ const parser = new WgslParser();
4063
+ const ast = parser.parse(code);
4064
+ for (const node of ast) {
4065
+ if (node instanceof Struct) {
4066
+ const info = this._getTypeInfo(node, null);
4067
+ if (info instanceof StructInfo) {
4068
+ this.structs.push(info);
4069
+ }
4070
+ continue;
4071
+ }
4072
+ if (node instanceof Alias) {
4073
+ this.aliases.push(this._getAliasInfo(node));
4074
+ continue;
4075
+ }
4076
+ if (node instanceof Override) {
4077
+ const v = node;
4078
+ const id = this._getAttributeNum(v.attributes, "id", 0);
4079
+ const type = v.type != null ? this._getTypeInfo(v.type, v.attributes) : null;
4080
+ this.overrides.push(new OverrideInfo(v.name, type, v.attributes, id));
4081
+ continue;
4082
+ }
4083
+ if (this._isUniformVar(node)) {
4084
+ const v = node;
4085
+ const g = this._getAttributeNum(v.attributes, "group", 0);
4086
+ const b = this._getAttributeNum(v.attributes, "binding", 0);
4087
+ const type = this._getTypeInfo(v.type, v.attributes);
4088
+ const varInfo = new VariableInfo(v.name, type, g, b, v.attributes, ResourceType.Uniform, v.access);
4089
+ this.uniforms.push(varInfo);
4090
+ continue;
4091
+ }
4092
+ if (this._isStorageVar(node)) {
4093
+ const v = node;
4094
+ const g = this._getAttributeNum(v.attributes, "group", 0);
4095
+ const b = this._getAttributeNum(v.attributes, "binding", 0);
4096
+ const type = this._getTypeInfo(v.type, v.attributes);
4097
+ const isStorageTexture = this._isStorageTexture(type);
4098
+ const varInfo = new VariableInfo(v.name, type, g, b, v.attributes, isStorageTexture ? ResourceType.StorageTexture : ResourceType.Storage, v.access);
4099
+ this.storage.push(varInfo);
4100
+ continue;
4101
+ }
4102
+ if (this._isTextureVar(node)) {
4103
+ const v = node;
4104
+ const g = this._getAttributeNum(v.attributes, "group", 0);
4105
+ const b = this._getAttributeNum(v.attributes, "binding", 0);
4106
+ const type = this._getTypeInfo(v.type, v.attributes);
4107
+ const isStorageTexture = this._isStorageTexture(type);
4108
+ const varInfo = new VariableInfo(v.name, type, g, b, v.attributes, isStorageTexture ? ResourceType.StorageTexture : ResourceType.Texture, v.access);
4109
+ if (isStorageTexture) {
4110
+ this.storage.push(varInfo);
4111
+ } else {
4112
+ this.textures.push(varInfo);
4113
+ }
4114
+ continue;
4115
+ }
4116
+ if (this._isSamplerVar(node)) {
4117
+ const v = node;
4118
+ const g = this._getAttributeNum(v.attributes, "group", 0);
4119
+ const b = this._getAttributeNum(v.attributes, "binding", 0);
4120
+ const type = this._getTypeInfo(v.type, v.attributes);
4121
+ const varInfo = new VariableInfo(v.name, type, g, b, v.attributes, ResourceType.Sampler, v.access);
4122
+ this.samplers.push(varInfo);
4123
+ continue;
4124
+ }
4125
+ if (node instanceof Function) {
4126
+ const vertexStage = this._getAttribute(node, "vertex");
4127
+ const fragmentStage = this._getAttribute(node, "fragment");
4128
+ const computeStage = this._getAttribute(node, "compute");
4129
+ const stage = vertexStage || fragmentStage || computeStage;
4130
+ if (stage) {
4131
+ const fn = new FunctionInfo(node.name, stage.name);
4132
+ fn.inputs = this._getInputs(node.args);
4133
+ fn.outputs = this._getOutputs(node.returnType);
4134
+ this.entry[stage.name].push(fn);
4135
+ }
4136
+ continue;
4137
+ }
4138
+ }
4139
+ }
4140
+ getBindGroups() {
4141
+ const groups = [];
4142
+ function _makeRoom(group, binding) {
4143
+ if (group >= groups.length)
4144
+ groups.length = group + 1;
4145
+ if (groups[group] === void 0)
4146
+ groups[group] = [];
4147
+ if (binding >= groups[group].length)
4148
+ groups[group].length = binding + 1;
4149
+ }
4150
+ for (const u of this.uniforms) {
4151
+ _makeRoom(u.group, u.binding);
4152
+ const group = groups[u.group];
4153
+ group[u.binding] = u;
4154
+ }
4155
+ for (const u of this.storage) {
4156
+ _makeRoom(u.group, u.binding);
4157
+ const group = groups[u.group];
4158
+ group[u.binding] = u;
4159
+ }
4160
+ for (const t of this.textures) {
4161
+ _makeRoom(t.group, t.binding);
4162
+ const group = groups[t.group];
4163
+ group[t.binding] = t;
4164
+ }
4165
+ for (const t of this.samplers) {
4166
+ _makeRoom(t.group, t.binding);
4167
+ const group = groups[t.group];
4168
+ group[t.binding] = t;
4169
+ }
4170
+ return groups;
4171
+ }
4172
+ _getOutputs(type) {
4173
+ let outputs = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : void 0;
4174
+ if (outputs === void 0)
4175
+ outputs = [];
4176
+ if (type instanceof Struct) {
4177
+ this._getStructOutputs(type, outputs);
4178
+ } else {
4179
+ const output = this._getOutputInfo(type);
4180
+ if (output !== null)
4181
+ outputs.push(output);
4182
+ }
4183
+ return outputs;
4184
+ }
4185
+ _getStructOutputs(struct, outputs) {
4186
+ for (const m of struct.members) {
4187
+ if (m.type instanceof Struct) {
4188
+ this._getStructOutputs(m.type, outputs);
4189
+ } else {
4190
+ const location = this._getAttribute(m, "location") || this._getAttribute(m, "builtin");
4191
+ if (location !== null) {
4192
+ const typeInfo = this._getTypeInfo(m.type, m.type.attributes);
4193
+ const locationValue = this._parseInt(location.value);
4194
+ const info = new OutputInfo(m.name, typeInfo, location.name, locationValue);
4195
+ outputs.push(info);
4196
+ }
4197
+ }
4198
+ }
4199
+ }
4200
+ _getOutputInfo(type) {
4201
+ const location = this._getAttribute(type, "location") || this._getAttribute(type, "builtin");
4202
+ if (location !== null) {
4203
+ const typeInfo = this._getTypeInfo(type, type.attributes);
4204
+ const locationValue = this._parseInt(location.value);
4205
+ const info = new OutputInfo("", typeInfo, location.name, locationValue);
4206
+ return info;
4207
+ }
4208
+ return null;
4209
+ }
4210
+ _getInputs(args) {
4211
+ let inputs = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : void 0;
4212
+ if (inputs === void 0)
4213
+ inputs = [];
4214
+ for (const arg of args) {
4215
+ if (arg.type instanceof Struct) {
4216
+ this._getStructInputs(arg.type, inputs);
4217
+ } else {
4218
+ const input = this._getInputInfo(arg);
4219
+ if (input !== null)
4220
+ inputs.push(input);
4221
+ }
4222
+ }
4223
+ return inputs;
4224
+ }
4225
+ _getStructInputs(struct, inputs) {
4226
+ for (const m of struct.members) {
4227
+ if (m.type instanceof Struct) {
4228
+ this._getStructInputs(m.type, inputs);
4229
+ } else {
4230
+ const input = this._getInputInfo(m);
4231
+ if (input !== null)
4232
+ inputs.push(input);
4233
+ }
4234
+ }
4235
+ }
4236
+ _getInputInfo(node) {
4237
+ const location = this._getAttribute(node, "location") || this._getAttribute(node, "builtin");
4238
+ if (location !== null) {
4239
+ const interpolation = this._getAttribute(node, "interpolation");
4240
+ const type = this._getTypeInfo(node.type, node.attributes);
4241
+ const locationValue = this._parseInt(location.value);
4242
+ const info = new InputInfo(node.name, type, location.name, locationValue);
4243
+ if (interpolation !== null) {
4244
+ info.interpolation = this._parseString(interpolation.value);
4245
+ }
4246
+ return info;
4247
+ }
4248
+ return null;
4249
+ }
4250
+ _parseString(s) {
4251
+ if (s instanceof Array) {
4252
+ s = s[0];
4253
+ }
4254
+ return s;
4255
+ }
4256
+ _parseInt(s) {
4257
+ if (s instanceof Array) {
4258
+ s = s[0];
4259
+ }
4260
+ const n = parseInt(s);
4261
+ return isNaN(n) ? s : n;
4262
+ }
4263
+ _getAlias(name) {
4264
+ for (const a of this.aliases) {
4265
+ if (a.name == name)
4266
+ return a.type;
4267
+ }
4268
+ return null;
4269
+ }
4270
+ _getAliasInfo(node) {
4271
+ return new AliasInfo(node.name, this._getTypeInfo(node.type, null));
4272
+ }
4273
+ _getTypeInfo(type, attributes) {
4274
+ if (this._types.has(type)) {
4275
+ return this._types.get(type);
4276
+ }
4277
+ if (type instanceof ArrayType) {
4278
+ const a = type;
4279
+ const t = this._getTypeInfo(a.format, a.attributes);
4280
+ const info2 = new ArrayInfo(a.name, attributes);
4281
+ info2.format = t;
4282
+ info2.count = a.count;
4283
+ this._types.set(type, info2);
4284
+ this._updateTypeInfo(info2);
4285
+ return info2;
4286
+ }
4287
+ if (type instanceof Struct) {
4288
+ const s = type;
4289
+ const info2 = new StructInfo(s.name, attributes);
4290
+ for (const m of s.members) {
4291
+ const t = this._getTypeInfo(m.type, m.attributes);
4292
+ info2.members.push(new MemberInfo(m.name, t, m.attributes));
4293
+ }
4294
+ this._types.set(type, info2);
4295
+ this._updateTypeInfo(info2);
4296
+ return info2;
4297
+ }
4298
+ if (type instanceof SamplerType) {
4299
+ const s = type;
4300
+ const formatIsType = s.format instanceof Type;
4301
+ const format = s.format ? formatIsType ? this._getTypeInfo(s.format, null) : new TypeInfo(s.format, null) : null;
4302
+ const info2 = new TemplateInfo(s.name, format, attributes, s.access);
4303
+ this._types.set(type, info2);
4304
+ this._updateTypeInfo(info2);
4305
+ return info2;
4306
+ }
4307
+ if (type instanceof TemplateType) {
4308
+ const t = type;
4309
+ const format = t.format ? this._getTypeInfo(t.format, null) : null;
4310
+ const info2 = new TemplateInfo(t.name, format, attributes, t.access);
4311
+ this._types.set(type, info2);
4312
+ this._updateTypeInfo(info2);
4313
+ return info2;
4314
+ }
4315
+ const info = new TypeInfo(type.name, attributes);
4316
+ this._types.set(type, info);
4317
+ this._updateTypeInfo(info);
4318
+ return info;
4319
+ }
4320
+ _updateTypeInfo(type) {
4321
+ var _a2, _b;
4322
+ const typeSize = this._getTypeSize(type);
4323
+ type.size = (_a2 = typeSize === null || typeSize === void 0 ? void 0 : typeSize.size) !== null && _a2 !== void 0 ? _a2 : 0;
4324
+ if (type instanceof ArrayInfo) {
4325
+ const formatInfo = this._getTypeSize(type["format"]);
4326
+ type.stride = (_b = formatInfo === null || formatInfo === void 0 ? void 0 : formatInfo.size) !== null && _b !== void 0 ? _b : 0;
4327
+ this._updateTypeInfo(type["format"]);
4328
+ }
4329
+ if (type instanceof StructInfo) {
4330
+ this._updateStructInfo(type);
4331
+ }
4332
+ }
4333
+ _updateStructInfo(struct) {
4334
+ var _a2;
4335
+ let offset = 0;
4336
+ let lastSize = 0;
4337
+ let lastOffset = 0;
4338
+ let structAlign = 0;
4339
+ for (let mi = 0, ml = struct.members.length; mi < ml; ++mi) {
4340
+ const member = struct.members[mi];
4341
+ const sizeInfo = this._getTypeSize(member);
4342
+ if (!sizeInfo)
4343
+ continue;
4344
+ (_a2 = this._getAlias(member.type.name)) !== null && _a2 !== void 0 ? _a2 : member.type;
4345
+ const align = sizeInfo.align;
4346
+ const size = sizeInfo.size;
4347
+ offset = this._roundUp(align, offset + lastSize);
4348
+ lastSize = size;
4349
+ lastOffset = offset;
4350
+ structAlign = Math.max(structAlign, align);
4351
+ member.offset = offset;
4352
+ member.size = size;
4353
+ this._updateTypeInfo(member.type);
4354
+ }
4355
+ struct.size = this._roundUp(structAlign, lastOffset + lastSize);
4356
+ struct.align = structAlign;
4357
+ }
4358
+ _getTypeSize(type) {
4359
+ var _a2;
4360
+ if (type === null || type === void 0)
4361
+ return null;
4362
+ const explicitSize = this._getAttributeNum(type.attributes, "size", 0);
4363
+ const explicitAlign = this._getAttributeNum(type.attributes, "align", 0);
4364
+ if (type instanceof MemberInfo)
4365
+ type = type.type;
4366
+ if (type instanceof TypeInfo) {
4367
+ const alias = this._getAlias(type.name);
4368
+ if (alias !== null) {
4369
+ type = alias;
4370
+ }
4371
+ }
4372
+ {
4373
+ const info = WgslReflect._typeInfo[type.name];
4374
+ if (info !== void 0) {
4375
+ const divisor = type["format"] === "f16" ? 2 : 1;
4376
+ return new _TypeSize(Math.max(explicitAlign, info.align / divisor), Math.max(explicitSize, info.size / divisor));
4377
+ }
4378
+ }
4379
+ {
4380
+ const info = WgslReflect._typeInfo[type.name.substring(0, type.name.length - 1)];
4381
+ if (info) {
4382
+ const divisor = type.name[type.name.length - 1] === "h" ? 2 : 1;
4383
+ return new _TypeSize(Math.max(explicitAlign, info.align / divisor), Math.max(explicitSize, info.size / divisor));
4384
+ }
4385
+ }
4386
+ if (type instanceof ArrayInfo) {
4387
+ let arrayType = type;
4388
+ let align = 8;
4389
+ let size = 8;
4390
+ const E = this._getTypeSize(arrayType.format);
4391
+ if (E !== null) {
4392
+ size = E.size;
4393
+ align = E.align;
4394
+ }
4395
+ const N = arrayType.count;
4396
+ const stride = this._getAttributeNum((_a2 = type === null || type === void 0 ? void 0 : type.attributes) !== null && _a2 !== void 0 ? _a2 : null, "stride", this._roundUp(align, size));
4397
+ size = N * stride;
4398
+ if (explicitSize)
4399
+ size = explicitSize;
4400
+ return new _TypeSize(Math.max(explicitAlign, align), Math.max(explicitSize, size));
4401
+ }
4402
+ if (type instanceof StructInfo) {
4403
+ let align = 0;
4404
+ let size = 0;
4405
+ let offset = 0;
4406
+ let lastSize = 0;
4407
+ let lastOffset = 0;
4408
+ for (const m of type.members) {
4409
+ const mi = this._getTypeSize(m.type);
4410
+ if (mi !== null) {
4411
+ align = Math.max(mi.align, align);
4412
+ offset = this._roundUp(mi.align, offset + lastSize);
4413
+ lastSize = mi.size;
4414
+ lastOffset = offset;
4415
+ }
4416
+ }
4417
+ size = this._roundUp(align, lastOffset + lastSize);
4418
+ return new _TypeSize(Math.max(explicitAlign, align), Math.max(explicitSize, size));
4419
+ }
4420
+ return null;
4421
+ }
4422
+ _isUniformVar(node) {
4423
+ return node instanceof Var && node.storage == "uniform";
4424
+ }
4425
+ _isStorageVar(node) {
4426
+ return node instanceof Var && node.storage == "storage";
4427
+ }
4428
+ _isTextureVar(node) {
4429
+ return node instanceof Var && node.type !== null && WgslReflect._textureTypes.indexOf(node.type.name) != -1;
4430
+ }
4431
+ _isSamplerVar(node) {
4432
+ return node instanceof Var && node.type !== null && WgslReflect._samplerTypes.indexOf(node.type.name) != -1;
4433
+ }
4434
+ _getAttribute(node, name) {
4435
+ const obj = node;
4436
+ if (!obj || !obj["attributes"])
4437
+ return null;
4438
+ const attrs = obj["attributes"];
4439
+ for (let a of attrs) {
4440
+ if (a.name == name)
4441
+ return a;
4442
+ }
4443
+ return null;
4444
+ }
4445
+ _getAttributeNum(attributes, name, defaultValue) {
4446
+ if (attributes === null)
4447
+ return defaultValue;
4448
+ for (let a of attributes) {
4449
+ if (a.name == name) {
4450
+ let v = a !== null && a.value !== null ? a.value : defaultValue;
4451
+ if (v instanceof Array) {
4452
+ v = v[0];
4453
+ }
4454
+ if (typeof v === "number") {
4455
+ return v;
4456
+ }
4457
+ if (typeof v === "string") {
4458
+ return parseInt(v);
4459
+ }
4460
+ return defaultValue;
4461
+ }
4462
+ }
4463
+ return defaultValue;
4464
+ }
4465
+ _roundUp(k, n) {
4466
+ return Math.ceil(n / k) * k;
4467
+ }
4468
+ };
4469
+ WgslReflect._typeInfo = {
4470
+ f16: {
4471
+ align: 2,
4472
+ size: 2
4473
+ },
4474
+ i32: {
4475
+ align: 4,
4476
+ size: 4
4477
+ },
4478
+ u32: {
4479
+ align: 4,
4480
+ size: 4
4481
+ },
4482
+ f32: {
4483
+ align: 4,
4484
+ size: 4
4485
+ },
4486
+ atomic: {
4487
+ align: 4,
4488
+ size: 4
4489
+ },
4490
+ vec2: {
4491
+ align: 8,
4492
+ size: 8
4493
+ },
4494
+ vec3: {
4495
+ align: 16,
4496
+ size: 12
4497
+ },
4498
+ vec4: {
4499
+ align: 16,
4500
+ size: 16
4501
+ },
4502
+ mat2x2: {
4503
+ align: 8,
4504
+ size: 16
4505
+ },
4506
+ mat3x2: {
4507
+ align: 8,
4508
+ size: 24
4509
+ },
4510
+ mat4x2: {
4511
+ align: 8,
4512
+ size: 32
4513
+ },
4514
+ mat2x3: {
4515
+ align: 16,
4516
+ size: 32
4517
+ },
4518
+ mat3x3: {
4519
+ align: 16,
4520
+ size: 48
4521
+ },
4522
+ mat4x3: {
4523
+ align: 16,
4524
+ size: 64
4525
+ },
4526
+ mat2x4: {
4527
+ align: 16,
4528
+ size: 32
4529
+ },
4530
+ mat3x4: {
4531
+ align: 16,
4532
+ size: 48
4533
+ },
4534
+ mat4x4: {
4535
+ align: 16,
4536
+ size: 64
4537
+ }
4538
+ };
4539
+ WgslReflect._textureTypes = TokenTypes.any_texture_type.map((t) => {
4540
+ return t.name;
4541
+ });
4542
+ WgslReflect._samplerTypes = TokenTypes.sampler_type.map((t) => {
4543
+ return t.name;
4544
+ });
4545
+
4546
+ // ../../node_modules/@luma.gl/shadertools/dist/lib/wgsl/get-shader-layout-wgsl.js
4547
+ function getShaderLayoutFromWGSL(source) {
4548
+ const shaderLayout = {
4549
+ attributes: [],
4550
+ bindings: []
4551
+ };
4552
+ const parsedWGSL = parseWGSL(source);
4553
+ for (const uniform of parsedWGSL.uniforms) {
4554
+ const members = [];
4555
+ for (const member of uniform.type.members) {
4556
+ members.push({
4557
+ name: member.name,
4558
+ type: getType(member.type)
4559
+ });
4560
+ }
4561
+ shaderLayout.bindings.push({
4562
+ type: "uniform",
4563
+ name: uniform.name,
4564
+ location: uniform.binding,
4565
+ group: uniform.group,
4566
+ members
4567
+ });
4568
+ }
4569
+ const vertex = parsedWGSL.entry.vertex[0];
4570
+ const attributeCount = vertex.inputs.length;
4571
+ for (let i = 0; i < attributeCount; i++) {
4572
+ const wgslAttribute = vertex.inputs[i];
4573
+ if (wgslAttribute.locationType === "location") {
4574
+ const type = getType(wgslAttribute.type);
4575
+ shaderLayout.attributes.push({
4576
+ name: wgslAttribute.name,
4577
+ location: wgslAttribute.location,
4578
+ type
4579
+ });
4580
+ }
4581
+ }
4582
+ return shaderLayout;
4583
+ }
4584
+ function getType(type) {
4585
+ return type.format ? `${type.name}<${type.format.name}>` : type.name;
4586
+ }
4587
+ function parseWGSL(source) {
4588
+ try {
4589
+ return new WgslReflect(source);
4590
+ } catch (error2) {
4591
+ if (error2 instanceof Error) {
4592
+ throw error2;
4593
+ }
4594
+ let message2 = "WGSL parse error";
4595
+ if (typeof error2 === "object" && error2 !== null && error2 !== void 0 && error2.message) {
4596
+ message2 += `: ${error2.message} `;
4597
+ }
4598
+ if (typeof error2 === "object" && error2 !== null && error2 !== void 0 && error2.token) {
4599
+ message2 += error2.token.line || "";
4600
+ }
4601
+ throw new Error(message2, {
4602
+ cause: error2
4603
+ });
4604
+ }
4605
+ }
4606
+
1834
4607
  // ../../node_modules/@luma.gl/shadertools/dist/modules-webgl1/math/fp64/fp64-utils.js
1835
4608
  function fp64ify(a) {
1836
4609
  let out = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : [];
@@ -2313,10 +5086,17 @@ vec2 sqrt_fp64(vec2 a) {
2313
5086
  };
2314
5087
 
2315
5088
  // ../../node_modules/@luma.gl/engine/dist/debug/debug-shader-layout.js
2316
- function getDebugTableForShaderLayout(layout) {
2317
- let name = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : "";
5089
+ function getDebugTableForShaderLayout(layout, name) {
5090
+ var _layout$varyings;
2318
5091
  const table = {};
2319
- const header = `Shader Layout for ${name}`;
5092
+ const header = "Values";
5093
+ if (layout.attributes.length === 0 && !((_layout$varyings = layout.varyings) !== null && _layout$varyings !== void 0 && _layout$varyings.length)) {
5094
+ return {
5095
+ "No attributes or varyings": {
5096
+ [header]: "N/A"
5097
+ }
5098
+ };
5099
+ }
2320
5100
  for (const attributeDeclaration of layout.attributes) {
2321
5101
  if (attributeDeclaration) {
2322
5102
  const glslDeclaration = `${attributeDeclaration.location} ${attributeDeclaration.name}: ${attributeDeclaration.type}`;
@@ -2334,6 +5114,49 @@ vec2 sqrt_fp64(vec2 a) {
2334
5114
  return table;
2335
5115
  }
2336
5116
 
5117
+ // ../../node_modules/@luma.gl/engine/dist/debug/debug-framebuffer.js
5118
+ var canvas = null;
5119
+ var ctx = null;
5120
+ function debugFramebuffer(fbo, _ref) {
5121
+ let {
5122
+ id,
5123
+ minimap,
5124
+ opaque,
5125
+ top = "0",
5126
+ left = "0",
5127
+ rgbaScale = 1
5128
+ } = _ref;
5129
+ if (!canvas) {
5130
+ canvas = document.createElement("canvas");
5131
+ canvas.id = id;
5132
+ canvas.title = id;
5133
+ canvas.style.zIndex = "100";
5134
+ canvas.style.position = "absolute";
5135
+ canvas.style.top = top;
5136
+ canvas.style.left = left;
5137
+ canvas.style.border = "blue 1px solid";
5138
+ canvas.style.transform = "scaleY(-1)";
5139
+ document.body.appendChild(canvas);
5140
+ ctx = canvas.getContext("2d");
5141
+ }
5142
+ if (canvas.width !== fbo.width || canvas.height !== fbo.height) {
5143
+ canvas.width = fbo.width / 2;
5144
+ canvas.height = fbo.height / 2;
5145
+ canvas.style.width = "400px";
5146
+ canvas.style.height = "400px";
5147
+ }
5148
+ const color = fbo.device.readPixelsToArrayWebGL(fbo);
5149
+ const imageData = ctx.createImageData(fbo.width, fbo.height);
5150
+ const offset = 0;
5151
+ for (let i = 0; i < color.length; i += 4) {
5152
+ imageData.data[offset + i + 0] = color[i + 0] * rgbaScale;
5153
+ imageData.data[offset + i + 1] = color[i + 1] * rgbaScale;
5154
+ imageData.data[offset + i + 2] = color[i + 2] * rgbaScale;
5155
+ imageData.data[offset + i + 3] = opaque ? 255 : color[i + 3] * rgbaScale;
5156
+ }
5157
+ ctx.putImageData(imageData, 0, 0);
5158
+ }
5159
+
2337
5160
  // ../../node_modules/@luma.gl/engine/dist/model/model.js
2338
5161
  var LOG_DRAW_PRIORITY = 2;
2339
5162
  var LOG_DRAW_TIMEOUT = 1e4;
@@ -2368,6 +5191,7 @@ vec2 sqrt_fp64(vec2 a) {
2368
5191
  this.props = void 0;
2369
5192
  this._lastLogTime = 0;
2370
5193
  this._logOpen = false;
5194
+ this._drawCount = 0;
2371
5195
  this.props = {
2372
5196
  ...Model.defaultProps,
2373
5197
  ...props
@@ -2378,6 +5202,19 @@ vec2 sqrt_fp64(vec2 a) {
2378
5202
  Object.assign(this.userData, props.userData);
2379
5203
  const moduleMap = Object.fromEntries(((_this$props$modules = this.props.modules) === null || _this$props$modules === void 0 ? void 0 : _this$props$modules.map((module) => [module.name, module])) || []);
2380
5204
  this.setShaderInputs(props.shaderInputs || new ShaderInputs(moduleMap));
5205
+ const isWebGPU = this.device.info.type === "webgpu";
5206
+ if (this.props.source) {
5207
+ if (isWebGPU) {
5208
+ var _this$props;
5209
+ (_this$props = this.props).shaderLayout || (_this$props.shaderLayout = getShaderLayoutFromWGSL(this.props.source));
5210
+ }
5211
+ this.props.fs = this.props.source;
5212
+ this.props.vs = this.props.source;
5213
+ }
5214
+ if (isWebGPU && typeof this.props.vs !== "string") {
5215
+ var _this$props2;
5216
+ (_this$props2 = this.props).shaderLayout || (_this$props2.shaderLayout = getShaderLayoutFromWGSL(this.props.vs.wgsl));
5217
+ }
2381
5218
  const platformInfo = getPlatformInfo(device);
2382
5219
  const modules = (((_this$props$modules2 = this.props.modules) === null || _this$props$modules2 === void 0 ? void 0 : _this$props$modules2.length) > 0 ? this.props.modules : (_this$shaderInputs = this.shaderInputs) === null || _this$shaderInputs === void 0 ? void 0 : _this$shaderInputs.getModules()) || [];
2383
5220
  const {
@@ -2465,6 +5302,7 @@ vec2 sqrt_fp64(vec2 a) {
2465
5302
  } finally {
2466
5303
  this._logDrawCallEnd();
2467
5304
  }
5305
+ this._logFramebuffer(renderPass);
2468
5306
  }
2469
5307
  setGeometry(geometry) {
2470
5308
  const gpuGeometry = geometry && makeGPUGeometry(this.device, geometry);
@@ -2476,9 +5314,18 @@ vec2 sqrt_fp64(vec2 a) {
2476
5314
  return gpuGeometry;
2477
5315
  }
2478
5316
  _setGeometryAttributes(gpuGeometry) {
5317
+ const attributes = {
5318
+ ...gpuGeometry.attributes
5319
+ };
5320
+ for (const [attributeName] of Object.entries(attributes)) {
5321
+ if (!this.pipeline.shaderLayout.attributes.find((layout) => layout.name === attributeName) && attributeName !== "positions") {
5322
+ delete attributes[attributeName];
5323
+ }
5324
+ }
2479
5325
  this.vertexCount = gpuGeometry.vertexCount;
2480
- this.setAttributes(gpuGeometry.attributes, "ignore-unknown");
2481
5326
  this.setIndexBuffer(gpuGeometry.indices);
5327
+ this.setAttributes(gpuGeometry.attributes, "ignore-unknown");
5328
+ this.setAttributes(attributes);
2482
5329
  }
2483
5330
  setTopology(topology) {
2484
5331
  if (topology !== this.topology) {
@@ -2517,6 +5364,18 @@ vec2 sqrt_fp64(vec2 a) {
2517
5364
  this.bindings[`${moduleName}Uniforms`] = uniformBuffer;
2518
5365
  }
2519
5366
  }
5367
+ setShaderModuleProps(props) {
5368
+ const uniforms = this._getModuleUniforms(props);
5369
+ const keys = Object.keys(uniforms).filter((k) => {
5370
+ const uniform = uniforms[k];
5371
+ return !(0, import_core5.isNumberArray)(uniform) && typeof uniform !== "number" && typeof uniform !== "boolean";
5372
+ });
5373
+ const bindings = {};
5374
+ for (const k of keys) {
5375
+ bindings[k] = uniforms[k];
5376
+ delete uniforms[k];
5377
+ }
5378
+ }
2520
5379
  updateShaderInputs() {
2521
5380
  this._uniformStore.setUniforms(this.shaderInputs.getUniformValues());
2522
5381
  }
@@ -2547,13 +5406,12 @@ vec2 sqrt_fp64(vec2 a) {
2547
5406
  import_core5.log.warn(`Model:${this.id} setAttributes() - indexBuffer should be set using setIndexBuffer()`)();
2548
5407
  }
2549
5408
  for (const [bufferName, buffer] of Object.entries(buffers)) {
2550
- var _bufferLayout$attribu;
2551
- const bufferLayout = this.bufferLayout.find((layout) => layout.name === bufferName);
5409
+ const bufferLayout = this.bufferLayout.find((layout) => getAttributeNames(layout).includes(bufferName));
2552
5410
  if (!bufferLayout) {
2553
5411
  import_core5.log.warn(`Model(${this.id}): Missing layout for buffer "${bufferName}".`)();
2554
5412
  continue;
2555
5413
  }
2556
- const attributeNames = bufferLayout.attributes ? (_bufferLayout$attribu = bufferLayout.attributes) === null || _bufferLayout$attribu === void 0 ? void 0 : _bufferLayout$attribu.map((layout) => layout.attribute) : [bufferLayout.name];
5414
+ const attributeNames = getAttributeNames(bufferLayout);
2557
5415
  let set = false;
2558
5416
  for (const attributeName of attributeNames) {
2559
5417
  const attributeInfo = this._attributeInfos[attributeName];
@@ -2586,21 +5444,23 @@ vec2 sqrt_fp64(vec2 a) {
2586
5444
  import_core5.log.log(1, `Model ${this.id}: Recreating pipeline because "${this._pipelineNeedsUpdate}".`)();
2587
5445
  }
2588
5446
  this._pipelineNeedsUpdate = false;
5447
+ const vs = this.device.createShader({
5448
+ id: `${this.id}-vertex`,
5449
+ stage: "vertex",
5450
+ source: this.vs
5451
+ });
5452
+ const fs = this.fs ? this.device.createShader({
5453
+ id: `${this.id}-fragment`,
5454
+ stage: "fragment",
5455
+ source: this.fs
5456
+ }) : null;
2589
5457
  this.pipeline = this.device.createRenderPipeline({
2590
5458
  ...this.props,
2591
5459
  bufferLayout: this.bufferLayout,
2592
5460
  topology: this.topology,
2593
5461
  parameters: this.parameters,
2594
- vs: this.device.createShader({
2595
- id: "{$this.id}-vertex",
2596
- stage: "vertex",
2597
- source: this.vs
2598
- }),
2599
- fs: this.fs ? this.device.createShader({
2600
- id: "{$this.id}-fragment",
2601
- stage: "fragment",
2602
- source: this.fs
2603
- }) : null
5462
+ vs,
5463
+ fs
2604
5464
  });
2605
5465
  this._attributeInfos = (0, import_core6.getAttributeInfosFromLayouts)(this.pipeline.shaderLayout, this.bufferLayout);
2606
5466
  }
@@ -2608,8 +5468,8 @@ vec2 sqrt_fp64(vec2 a) {
2608
5468
  }
2609
5469
  _logDrawCallStart() {
2610
5470
  const logDrawTimeout = import_core5.log.level > 3 ? 0 : LOG_DRAW_TIMEOUT;
2611
- if (Date.now() - this._lastLogTime < logDrawTimeout) {
2612
- return void 0;
5471
+ if (import_core5.log.level < 2 || Date.now() - this._lastLogTime < logDrawTimeout) {
5472
+ return;
2613
5473
  }
2614
5474
  this._lastLogTime = Date.now();
2615
5475
  this._logOpen = true;
@@ -2619,7 +5479,7 @@ vec2 sqrt_fp64(vec2 a) {
2619
5479
  }
2620
5480
  _logDrawCallEnd() {
2621
5481
  if (this._logOpen) {
2622
- const shaderLayoutTable = getDebugTableForShaderLayout(this.pipeline.shaderLayout);
5482
+ const shaderLayoutTable = getDebugTableForShaderLayout(this.pipeline.shaderLayout, this.id);
2623
5483
  import_core5.log.table(LOG_DRAW_PRIORITY, shaderLayoutTable)();
2624
5484
  const uniformTable = this.shaderInputs.getDebugTable();
2625
5485
  for (const [name, value] of Object.entries(this.uniforms)) {
@@ -2628,13 +5488,58 @@ vec2 sqrt_fp64(vec2 a) {
2628
5488
  };
2629
5489
  }
2630
5490
  import_core5.log.table(LOG_DRAW_PRIORITY, uniformTable)();
5491
+ const attributeTable = this._getAttributeDebugTable();
5492
+ import_core5.log.table(LOG_DRAW_PRIORITY, this._attributeInfos)();
5493
+ import_core5.log.table(LOG_DRAW_PRIORITY, attributeTable)();
2631
5494
  import_core5.log.groupEnd(LOG_DRAW_PRIORITY)();
2632
5495
  this._logOpen = false;
2633
5496
  }
2634
5497
  }
5498
+ _logFramebuffer(renderPass) {
5499
+ const debugFramebuffers = import_core5.log.get("framebuffer");
5500
+ this._drawCount++;
5501
+ if (!debugFramebuffers || this._drawCount++ > 3 && this._drawCount % 60) {
5502
+ return;
5503
+ }
5504
+ const framebuffer = renderPass.props.framebuffer;
5505
+ if (framebuffer) {
5506
+ debugFramebuffer(framebuffer, {
5507
+ id: framebuffer.id,
5508
+ minimap: true
5509
+ });
5510
+ }
5511
+ }
5512
+ _getAttributeDebugTable() {
5513
+ const table = {};
5514
+ for (const [name, attributeInfo] of Object.entries(this._attributeInfos)) {
5515
+ table[attributeInfo.location] = {
5516
+ name,
5517
+ type: attributeInfo.shaderType,
5518
+ values: this._getBufferOrConstantValues(this.vertexArray.attributes[attributeInfo.location], attributeInfo.bufferDataType)
5519
+ };
5520
+ }
5521
+ if (this.vertexArray.indexBuffer) {
5522
+ const {
5523
+ indexBuffer
5524
+ } = this.vertexArray;
5525
+ const values = indexBuffer.indexType === "uint32" ? new Uint32Array(indexBuffer.debugData) : new Uint16Array(indexBuffer.debugData);
5526
+ table.indices = {
5527
+ name: "indices",
5528
+ type: indexBuffer.indexType,
5529
+ values: values.toString()
5530
+ };
5531
+ }
5532
+ return table;
5533
+ }
5534
+ _getBufferOrConstantValues(attribute, dataType) {
5535
+ const TypedArrayConstructor = (0, import_core4.getTypedArrayFromDataType)(dataType);
5536
+ const typedArray = attribute instanceof import_core4.Buffer ? new TypedArrayConstructor(attribute.debugData) : attribute;
5537
+ return typedArray.toString();
5538
+ }
2635
5539
  };
2636
5540
  Model.defaultProps = {
2637
5541
  ...import_core4.RenderPipeline.defaultProps,
5542
+ source: null,
2638
5543
  vs: null,
2639
5544
  fs: null,
2640
5545
  id: "unnamed",
@@ -2674,6 +5579,10 @@ vec2 sqrt_fp64(vec2 a) {
2674
5579
  features: device.features
2675
5580
  };
2676
5581
  }
5582
+ function getAttributeNames(bufferLayout) {
5583
+ var _bufferLayout$attribu;
5584
+ return bufferLayout.attributes ? (_bufferLayout$attribu = bufferLayout.attributes) === null || _bufferLayout$attribu === void 0 ? void 0 : _bufferLayout$attribu.map((layout) => layout.attribute) : [bufferLayout.name];
5585
+ }
2677
5586
 
2678
5587
  // ../../node_modules/@luma.gl/engine/dist/transform/texture-transform.js
2679
5588
  var FS_OUTPUT_VARIABLE = "transform_output";
@@ -2914,7 +5823,7 @@ vec2 sqrt_fp64(vec2 a) {
2914
5823
  var CUBE_POSITIONS = new Float32Array([-1, -1, 1, 1, -1, 1, 1, 1, 1, -1, 1, 1, -1, -1, -1, -1, 1, -1, 1, 1, -1, 1, -1, -1, -1, 1, -1, -1, 1, 1, 1, 1, 1, 1, 1, -1, -1, -1, -1, 1, -1, -1, 1, -1, 1, -1, -1, 1, 1, -1, -1, 1, 1, -1, 1, 1, 1, 1, -1, 1, -1, -1, -1, -1, -1, 1, -1, 1, 1, -1, 1, -1]);
2915
5824
  var CUBE_NORMALS = new Float32Array([0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, -1, 0, 0, -1, 0, 0, -1, 0, 0, -1, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, -1, 0, 0, -1, 0, 0, -1, 0, 0, -1, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, -1, 0, 0, -1, 0, 0, -1, 0, 0, -1, 0, 0]);
2916
5825
  var CUBE_TEX_COORDS = new Float32Array([0, 0, 1, 0, 1, 1, 0, 1, 1, 0, 1, 1, 0, 1, 0, 0, 0, 1, 0, 0, 1, 0, 1, 1, 1, 1, 0, 1, 0, 0, 1, 0, 1, 0, 1, 1, 0, 1, 0, 0, 0, 0, 1, 0, 1, 1, 0, 1]);
2917
- var CUBE_NON_INDEXED_POSITIONS = new Float32Array([1, -1, 1, 1, -1, -1, 1, 1, -1, -1, -1, 1, 1, -1, -1, 1, 1, -1, 1, 1, -1, -1, -1, 1, 1, 1, 1, 1, 1, -1, 1, 1, 1, -1, -1, 1, 1, 1, -1, 1, 1, 1, 1, 1, 1, -1, -1, 1, -1, 1, 1, 1, 1, 1, 1, 1, 1, 1, -1, 1, -1, 1, -1, 1, -1, 1, 1, 1, 1, 1, -1, 1, -1, -1, 1, 1, -1, 1, 1, 1, -1, 1, -1, 1, -1, -1, -1, 1, -1, -1, 1, 1, -1, 1, -1, 1, 1, 1, 1, 1, -1, 1, 1, 1, -1, -1, 1, 1, -1, -1, 1, 1, 1, -1, 1, 1, 1, 1, 1, 1, 1, -1, -1, 1, -1, -1, -1, 1, -1, 1, -1, 1, 1, 1, -1, 1, 1, -1, -1, 1, -1, 1, -1, 1]);
5826
+ var CUBE_NON_INDEXED_POSITIONS = new Float32Array([1, -1, 1, -1, -1, 1, -1, -1, -1, 1, -1, -1, 1, -1, 1, -1, -1, -1, 1, 1, 1, 1, -1, 1, 1, -1, -1, 1, 1, -1, 1, 1, 1, 1, -1, -1, -1, 1, 1, 1, 1, 1, 1, 1, -1, -1, 1, -1, -1, 1, 1, 1, 1, -1, -1, -1, 1, -1, 1, 1, -1, 1, -1, -1, -1, -1, -1, -1, 1, -1, 1, -1, 1, 1, 1, -1, 1, 1, -1, -1, 1, -1, -1, 1, 1, -1, 1, 1, 1, 1, 1, -1, -1, -1, -1, -1, -1, 1, -1, 1, 1, -1, 1, -1, -1, -1, 1, -1]);
2918
5827
  var CUBE_NON_INDEXED_TEX_COORDS = new Float32Array([1, 1, 0, 1, 0, 0, 1, 0, 1, 1, 0, 0, 1, 1, 0, 1, 0, 0, 1, 0, 1, 1, 0, 0, 1, 1, 0, 1, 0, 0, 1, 0, 1, 1, 0, 0, 1, 1, 0, 1, 0, 0, 1, 0, 1, 1, 0, 0, 1, 1, 0, 1, 0, 0, 0, 0, 1, 0, 1, 1, 1, 1, 0, 1, 0, 0, 1, 0, 1, 1, 0, 0]);
2919
5828
  var CUBE_NON_INDEXED_COLORS = new Float32Array([1, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 0, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 0, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 0, 1, 0, 0, 1, 1, 0, 1, 1, 1, 0, 1, 0, 1, 0, 0, 0, 1, 0, 0, 1, 1, 0, 1, 0, 1, 1, 1, 1, 1, 0, 1, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0, 1, 1, 1, 0, 1, 1, 0, 0, 1, 0, 1, 0, 1]);
2920
5829
  var ATTRIBUTES = {
@@ -2933,7 +5842,7 @@ vec2 sqrt_fp64(vec2 a) {
2933
5842
  };
2934
5843
  var NON_INDEXED_ATTRIBUTES = {
2935
5844
  POSITION: {
2936
- size: 4,
5845
+ size: 3,
2937
5846
  value: CUBE_NON_INDEXED_POSITIONS
2938
5847
  },
2939
5848
  TEXCOORD_0: {
@@ -2984,7 +5893,7 @@ vec2 sqrt_fp64(vec2 a) {
2984
5893
  }
2985
5894
 
2986
5895
  // ../../node_modules/@luma.gl/webgl/dist/adapter/webgl-device.js
2987
- var import_core34 = __toESM(require_core2(), 1);
5896
+ var import_core36 = __toESM(require_core2(), 1);
2988
5897
 
2989
5898
  // ../../node_modules/@probe.gl/env/dist/lib/is-electron.js
2990
5899
  function isElectron(mockUserAgent) {
@@ -4321,14 +7230,14 @@ vec2 sqrt_fp64(vec2 a) {
4321
7230
  onContextLost: () => console.error("WebGL context lost"),
4322
7231
  onContextRestored: () => console.info("WebGL context restored")
4323
7232
  };
4324
- function createBrowserContext(canvas, props) {
7233
+ function createBrowserContext(canvas2, props) {
4325
7234
  props = {
4326
7235
  ...DEFAULT_CONTEXT_PROPS,
4327
7236
  ...props
4328
7237
  };
4329
7238
  let errorMessage = null;
4330
7239
  const onCreateError = (error2) => errorMessage = error2.statusMessage || errorMessage;
4331
- canvas.addEventListener("webglcontextcreationerror", onCreateError, false);
7240
+ canvas2.addEventListener("webglcontextcreationerror", onCreateError, false);
4332
7241
  let gl = null;
4333
7242
  if (props.type === "webgl2") {
4334
7243
  props = {
@@ -4343,12 +7252,12 @@ vec2 sqrt_fp64(vec2 a) {
4343
7252
  };
4344
7253
  }
4345
7254
  if (!gl && props.webgl2) {
4346
- gl = canvas.getContext("webgl2", props);
7255
+ gl = canvas2.getContext("webgl2", props);
4347
7256
  }
4348
7257
  if (!gl && props.webgl1) {
4349
- gl = canvas.getContext("webgl", props);
7258
+ gl = canvas2.getContext("webgl", props);
4350
7259
  }
4351
- canvas.removeEventListener("webglcontextcreationerror", onCreateError, false);
7260
+ canvas2.removeEventListener("webglcontextcreationerror", onCreateError, false);
4352
7261
  if (!gl) {
4353
7262
  throw new Error(`Failed to create ${props.webgl2 && !props.webgl1 ? "WebGL2" : "WebGL"} context: ${errorMessage || "Unknown error"}`);
4354
7263
  }
@@ -4356,13 +7265,13 @@ vec2 sqrt_fp64(vec2 a) {
4356
7265
  const {
4357
7266
  onContextLost
4358
7267
  } = props;
4359
- canvas.addEventListener("webglcontextlost", (event) => onContextLost(event), false);
7268
+ canvas2.addEventListener("webglcontextlost", (event) => onContextLost(event), false);
4360
7269
  }
4361
7270
  if (props.onContextRestored) {
4362
7271
  const {
4363
7272
  onContextRestored
4364
7273
  } = props;
4365
- canvas.addEventListener("webglcontextrestored", (event) => onContextRestored(event), false);
7274
+ canvas2.addEventListener("webglcontextrestored", (event) => onContextRestored(event), false);
4366
7275
  }
4367
7276
  return gl;
4368
7277
  }
@@ -5824,7 +8733,6 @@ void main(void) {}`;
5824
8733
 
5825
8734
  // ../../node_modules/@luma.gl/webgl/dist/adapter/resources/webgl-buffer.js
5826
8735
  var import_core15 = __toESM(require_core2(), 1);
5827
- var DEBUG_DATA_LENGTH = 10;
5828
8736
  var WEBGLBuffer = class extends import_core15.Buffer {
5829
8737
  constructor(device) {
5830
8738
  let props = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : {};
@@ -5838,7 +8746,6 @@ void main(void) {}`;
5838
8746
  this.glIndexType = 5123;
5839
8747
  this.byteLength = void 0;
5840
8748
  this.bytesUsed = void 0;
5841
- this.debugData = null;
5842
8749
  this.device = device;
5843
8750
  this.gl = this.device.gl;
5844
8751
  this.gl2 = this.device.gl2;
@@ -5851,7 +8758,6 @@ void main(void) {}`;
5851
8758
  this.glTarget = getWebGLTarget(this.props.usage);
5852
8759
  this.glUsage = getWebGLUsage(this.props.usage);
5853
8760
  this.glIndexType = this.props.indexType === "uint32" ? 5125 : 5123;
5854
- this.debugData = null;
5855
8761
  if (props.data) {
5856
8762
  this._initWithData(props.data, props.byteOffset, props.byteLength);
5857
8763
  } else {
@@ -5861,17 +8767,15 @@ void main(void) {}`;
5861
8767
  _initWithData(data) {
5862
8768
  let byteOffset = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : 0;
5863
8769
  let byteLength = arguments.length > 2 && arguments[2] !== void 0 ? arguments[2] : data.byteLength + byteOffset;
5864
- (0, import_core15.assert)(ArrayBuffer.isView(data));
5865
- const glTarget = this._getWriteTarget();
8770
+ const glTarget = this.glTarget;
5866
8771
  this.gl.bindBuffer(glTarget, this.handle);
5867
8772
  this.gl.bufferData(glTarget, byteLength, this.glUsage);
5868
8773
  this.gl.bufferSubData(glTarget, byteOffset, data);
5869
8774
  this.gl.bindBuffer(glTarget, null);
5870
- this.debugData = data.slice(0, DEBUG_DATA_LENGTH);
5871
8775
  this.bytesUsed = byteLength;
5872
8776
  this.byteLength = byteLength;
8777
+ this._setDebugData(data, byteOffset, byteLength);
5873
8778
  this.trackAllocatedMemory(byteLength);
5874
- return this;
5875
8779
  }
5876
8780
  _initWithByteLength(byteLength) {
5877
8781
  (0, import_core15.assert)(byteLength >= 0);
@@ -5879,13 +8783,14 @@ void main(void) {}`;
5879
8783
  if (byteLength === 0) {
5880
8784
  data = new Float32Array(0);
5881
8785
  }
5882
- const glTarget = this._getWriteTarget();
8786
+ const glTarget = this.glTarget;
5883
8787
  this.gl.bindBuffer(glTarget, this.handle);
5884
8788
  this.gl.bufferData(glTarget, data, this.glUsage);
5885
8789
  this.gl.bindBuffer(glTarget, null);
5886
- this.debugData = null;
5887
8790
  this.bytesUsed = byteLength;
5888
8791
  this.byteLength = byteLength;
8792
+ this._setDebugData(null, 0, byteLength);
8793
+ this.trackAllocatedMemory(byteLength);
5889
8794
  return this;
5890
8795
  }
5891
8796
  destroy() {
@@ -5910,29 +8815,27 @@ void main(void) {}`;
5910
8815
  this.gl.bufferSubData(glTarget, byteOffset, data);
5911
8816
  }
5912
8817
  this.gl.bindBuffer(glTarget, null);
8818
+ this._setDebugData(data, byteOffset, data.byteLength);
5913
8819
  }
5914
8820
  async readAsync() {
8821
+ let byteOffset = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : 0;
8822
+ let byteLength = arguments.length > 1 ? arguments[1] : void 0;
8823
+ return this.readSyncWebGL2(byteOffset, byteLength);
8824
+ }
8825
+ readSyncWebGL2() {
5915
8826
  var _byteLength;
5916
8827
  let byteOffset = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : 0;
5917
8828
  let byteLength = arguments.length > 1 ? arguments[1] : void 0;
5918
8829
  this.device.assertWebGL2();
5919
- byteLength = (_byteLength = byteLength) !== null && _byteLength !== void 0 ? _byteLength : this.byteLength;
8830
+ byteLength = (_byteLength = byteLength) !== null && _byteLength !== void 0 ? _byteLength : this.byteLength - byteOffset;
5920
8831
  const data = new Uint8Array(byteLength);
5921
8832
  const dstOffset = 0;
5922
8833
  this.gl.bindBuffer(36662, this.handle);
5923
8834
  this.gl2.getBufferSubData(36662, byteOffset, data, dstOffset, byteLength);
5924
8835
  this.gl.bindBuffer(36662, null);
8836
+ this._setDebugData(data, byteOffset, byteLength);
5925
8837
  return data;
5926
8838
  }
5927
- _invalidateDebugData() {
5928
- this.debugData = null;
5929
- }
5930
- _getWriteTarget() {
5931
- return this.glTarget;
5932
- }
5933
- _getReadTarget() {
5934
- return this.glTarget;
5935
- }
5936
8839
  };
5937
8840
  function getWebGLTarget(usage) {
5938
8841
  if (usage & import_core15.Buffer.INDEX) {
@@ -7145,9 +10048,12 @@ void main(void) {}`;
7145
10048
  const sizeChanged = size[0] !== this.presentationSize[0] || size[1] !== this.presentationSize[1];
7146
10049
  if (sizeChanged) {
7147
10050
  this.presentationSize = size;
10051
+ this.resize();
7148
10052
  }
7149
10053
  }
7150
10054
  resize(options) {
10055
+ if (!this.device.gl)
10056
+ return;
7151
10057
  if (this.canvas) {
7152
10058
  const devicePixelRatio = this.getDevicePixelRatio(options === null || options === void 0 ? void 0 : options.useDevicePixels);
7153
10059
  this.setDevicePixelRatio(devicePixelRatio, options);
@@ -7537,6 +10443,30 @@ ${source2}`;
7537
10443
  var import_core27 = __toESM(require_core2(), 1);
7538
10444
 
7539
10445
  // ../../node_modules/@luma.gl/webgl/dist/classic/typed-array-utils.js
10446
+ var ERR_TYPE_DEDUCTION = "Failed to deduce GL constant from typed array";
10447
+ function getGLTypeFromTypedArray(arrayOrType) {
10448
+ const type = ArrayBuffer.isView(arrayOrType) ? arrayOrType.constructor : arrayOrType;
10449
+ switch (type) {
10450
+ case Float32Array:
10451
+ return 5126;
10452
+ case Uint16Array:
10453
+ return 5123;
10454
+ case Uint32Array:
10455
+ return 5125;
10456
+ case Uint8Array:
10457
+ return 5121;
10458
+ case Uint8ClampedArray:
10459
+ return 5121;
10460
+ case Int8Array:
10461
+ return 5120;
10462
+ case Int16Array:
10463
+ return 5122;
10464
+ case Int32Array:
10465
+ return 5124;
10466
+ default:
10467
+ throw new Error(ERR_TYPE_DEDUCTION);
10468
+ }
10469
+ }
7540
10470
  function getTypedArrayFromGLType(glType, options) {
7541
10471
  const {
7542
10472
  clamped = true
@@ -7582,13 +10512,13 @@ ${source2}`;
7582
10512
  };
7583
10513
  var Accessor = class {
7584
10514
  static getBytesPerElement(accessor) {
7585
- const ArrayType = getTypedArrayFromGLType(accessor.type || 5126);
7586
- return ArrayType.BYTES_PER_ELEMENT;
10515
+ const ArrayType2 = getTypedArrayFromGLType(accessor.type || 5126);
10516
+ return ArrayType2.BYTES_PER_ELEMENT;
7587
10517
  }
7588
10518
  static getBytesPerVertex(accessor) {
7589
10519
  (0, import_core27.assert)(accessor.size);
7590
- const ArrayType = getTypedArrayFromGLType(accessor.type || 5126);
7591
- return ArrayType.BYTES_PER_ELEMENT * accessor.size;
10520
+ const ArrayType2 = getTypedArrayFromGLType(accessor.type || 5126);
10521
+ return ArrayType2.BYTES_PER_ELEMENT * accessor.size;
7592
10522
  }
7593
10523
  static resolve() {
7594
10524
  for (var _len = arguments.length, accessors = new Array(_len), _key = 0; _key < _len; _key++) {
@@ -8157,6 +11087,13 @@ ${source2}`;
8157
11087
  this._compileAndLink();
8158
11088
  this.introspectedLayout = getShaderLayout(this.device.gl, this.handle);
8159
11089
  this.shaderLayout = (0, import_core29.mergeShaderLayout)(this.introspectedLayout, props.shaderLayout);
11090
+ switch (this.props.topology) {
11091
+ case "triangle-fan-webgl":
11092
+ case "line-loop-webgl":
11093
+ import_core28.log.warn(`Primitive topology ${this.props.topology} is deprecated and will be removed in v9.1`);
11094
+ break;
11095
+ default:
11096
+ }
8160
11097
  }
8161
11098
  destroy() {
8162
11099
  if (this.handle) {
@@ -8872,27 +11809,192 @@ ${source2}`;
8872
11809
  this.gl2.bindBufferBase(35982, Number(bufferIndex), null);
8873
11810
  }
8874
11811
  }
8875
- _bindBuffer(index2, buffer) {
8876
- let byteOffset = arguments.length > 2 && arguments[2] !== void 0 ? arguments[2] : 0;
8877
- let byteLength = arguments.length > 3 ? arguments[3] : void 0;
8878
- const handle = buffer && buffer.handle;
8879
- if (!handle || byteLength === void 0) {
8880
- this.gl2.bindBufferBase(35982, index2, handle);
8881
- } else {
8882
- this.gl2.bindBufferRange(35982, index2, handle, byteOffset, byteLength);
8883
- }
11812
+ _bindBuffer(index2, buffer) {
11813
+ let byteOffset = arguments.length > 2 && arguments[2] !== void 0 ? arguments[2] : 0;
11814
+ let byteLength = arguments.length > 3 ? arguments[3] : void 0;
11815
+ const handle = buffer && buffer.handle;
11816
+ if (!handle || byteLength === void 0) {
11817
+ this.gl2.bindBufferBase(35982, index2, handle);
11818
+ } else {
11819
+ this.gl2.bindBufferRange(35982, index2, handle, byteOffset, byteLength);
11820
+ }
11821
+ }
11822
+ };
11823
+ function isIndex(value) {
11824
+ if (typeof value === "number") {
11825
+ return Number.isInteger(value);
11826
+ }
11827
+ return /^\d+$/.test(value);
11828
+ }
11829
+
11830
+ // ../../node_modules/@luma.gl/webgl/dist/classic/copy-and-blit.js
11831
+ var import_core35 = __toESM(require_core2(), 1);
11832
+
11833
+ // ../../node_modules/@luma.gl/webgl/dist/classic/format-utils.js
11834
+ var import_core34 = __toESM(require_core2(), 1);
11835
+ function glFormatToComponents(format) {
11836
+ switch (format) {
11837
+ case 6406:
11838
+ case 33326:
11839
+ case 6403:
11840
+ return 1;
11841
+ case 33328:
11842
+ case 33319:
11843
+ return 2;
11844
+ case 6407:
11845
+ case 34837:
11846
+ return 3;
11847
+ case 6408:
11848
+ case 34836:
11849
+ return 4;
11850
+ default:
11851
+ (0, import_core34.assert)(false);
11852
+ return 0;
11853
+ }
11854
+ }
11855
+ function glTypeToBytes(type) {
11856
+ switch (type) {
11857
+ case 5121:
11858
+ return 1;
11859
+ case 33635:
11860
+ case 32819:
11861
+ case 32820:
11862
+ return 2;
11863
+ case 5126:
11864
+ return 4;
11865
+ default:
11866
+ (0, import_core34.assert)(false);
11867
+ return 0;
11868
+ }
11869
+ }
11870
+
11871
+ // ../../node_modules/@luma.gl/webgl/dist/classic/copy-and-blit.js
11872
+ function readPixelsToArray(source, options) {
11873
+ var _framebuffer$colorAtt;
11874
+ const {
11875
+ sourceX = 0,
11876
+ sourceY = 0,
11877
+ sourceFormat = 6408,
11878
+ sourceAttachment = 36064
11879
+ } = options || {};
11880
+ let {
11881
+ target = null,
11882
+ sourceWidth,
11883
+ sourceHeight,
11884
+ sourceType
11885
+ } = options || {};
11886
+ const {
11887
+ framebuffer,
11888
+ deleteFramebuffer
11889
+ } = getFramebuffer2(source);
11890
+ (0, import_core35.assert)(framebuffer);
11891
+ const {
11892
+ gl,
11893
+ handle
11894
+ } = framebuffer;
11895
+ sourceWidth = sourceWidth || framebuffer.width;
11896
+ sourceHeight = sourceHeight || framebuffer.height;
11897
+ const attachment = sourceAttachment - 36064;
11898
+ sourceType = sourceType || ((_framebuffer$colorAtt = framebuffer.colorAttachments[attachment]) === null || _framebuffer$colorAtt === void 0 ? void 0 : _framebuffer$colorAtt.type) || 5121;
11899
+ target = getPixelArray(target, sourceType, sourceFormat, sourceWidth, sourceHeight);
11900
+ sourceType = sourceType || getGLTypeFromTypedArray(target);
11901
+ const prevHandle = gl.bindFramebuffer(36160, handle);
11902
+ gl.readPixels(sourceX, sourceY, sourceWidth, sourceHeight, sourceFormat, sourceType, target);
11903
+ gl.bindFramebuffer(36160, prevHandle || null);
11904
+ if (deleteFramebuffer) {
11905
+ framebuffer.destroy();
11906
+ }
11907
+ return target;
11908
+ }
11909
+ function readPixelsToBuffer(source, options) {
11910
+ const {
11911
+ target,
11912
+ sourceX = 0,
11913
+ sourceY = 0,
11914
+ sourceFormat = 6408,
11915
+ targetByteOffset = 0
11916
+ } = options || {};
11917
+ let {
11918
+ sourceWidth,
11919
+ sourceHeight,
11920
+ sourceType
11921
+ } = options || {};
11922
+ const {
11923
+ framebuffer,
11924
+ deleteFramebuffer
11925
+ } = getFramebuffer2(source);
11926
+ (0, import_core35.assert)(framebuffer);
11927
+ sourceWidth = sourceWidth || framebuffer.width;
11928
+ sourceHeight = sourceHeight || framebuffer.height;
11929
+ const webglFramebuffer = framebuffer;
11930
+ sourceType = sourceType || 5121;
11931
+ let webglBufferTarget = target;
11932
+ if (!webglBufferTarget) {
11933
+ const components = glFormatToComponents(sourceFormat);
11934
+ const byteCount = glTypeToBytes(sourceType);
11935
+ const byteLength = targetByteOffset + sourceWidth * sourceHeight * components * byteCount;
11936
+ webglBufferTarget = webglFramebuffer.device.createBuffer({
11937
+ byteLength
11938
+ });
11939
+ }
11940
+ const commandEncoder = source.device.createCommandEncoder();
11941
+ commandEncoder.copyTextureToBuffer({
11942
+ source,
11943
+ width: sourceWidth,
11944
+ height: sourceHeight,
11945
+ origin: [sourceX, sourceY],
11946
+ destination: webglBufferTarget,
11947
+ byteOffset: targetByteOffset
11948
+ });
11949
+ commandEncoder.destroy();
11950
+ if (deleteFramebuffer) {
11951
+ framebuffer.destroy();
11952
+ }
11953
+ return webglBufferTarget;
11954
+ }
11955
+ function getFramebuffer2(source) {
11956
+ if (!(source instanceof import_core35.Framebuffer)) {
11957
+ return {
11958
+ framebuffer: toFramebuffer(source),
11959
+ deleteFramebuffer: true
11960
+ };
8884
11961
  }
8885
- };
8886
- function isIndex(value) {
8887
- if (typeof value === "number") {
8888
- return Number.isInteger(value);
11962
+ return {
11963
+ framebuffer: source,
11964
+ deleteFramebuffer: false
11965
+ };
11966
+ }
11967
+ function toFramebuffer(texture, props) {
11968
+ const {
11969
+ device,
11970
+ width,
11971
+ height,
11972
+ id
11973
+ } = texture;
11974
+ const framebuffer = device.createFramebuffer({
11975
+ ...props,
11976
+ id: `framebuffer-for-${id}`,
11977
+ width,
11978
+ height,
11979
+ colorAttachments: [texture]
11980
+ });
11981
+ return framebuffer;
11982
+ }
11983
+ function getPixelArray(pixelArray, type, format, width, height) {
11984
+ if (pixelArray) {
11985
+ return pixelArray;
8889
11986
  }
8890
- return /^\d+$/.test(value);
11987
+ type = type || 5121;
11988
+ const ArrayType2 = getTypedArrayFromGLType(type, {
11989
+ clamped: false
11990
+ });
11991
+ const components = glFormatToComponents(format);
11992
+ return new ArrayType2(width * height * components);
8891
11993
  }
8892
11994
 
8893
11995
  // ../../node_modules/@luma.gl/webgl/dist/adapter/webgl-device.js
8894
11996
  var LOG_LEVEL2 = 1;
8895
- var WebGLDevice = class extends import_core34.Device {
11997
+ var WebGLDevice = class extends import_core36.Device {
8896
11998
  static isSupported() {
8897
11999
  return typeof WebGLRenderingContext !== "undefined" || isHeadlessGLRegistered();
8898
12000
  }
@@ -8908,7 +12010,7 @@ ${source2}`;
8908
12010
  if (gl instanceof WebGLDevice) {
8909
12011
  return gl;
8910
12012
  }
8911
- if ((gl === null || gl === void 0 ? void 0 : gl.device) instanceof import_core34.Device) {
12013
+ if ((gl === null || gl === void 0 ? void 0 : gl.device) instanceof import_core36.Device) {
8912
12014
  return gl.device;
8913
12015
  }
8914
12016
  if (!isWebGL3(gl)) {
@@ -8920,35 +12022,35 @@ ${source2}`;
8920
12022
  }
8921
12023
  static async create() {
8922
12024
  let props = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : {};
8923
- import_core34.log.groupCollapsed(LOG_LEVEL2, "WebGLDevice created")();
12025
+ import_core36.log.groupCollapsed(LOG_LEVEL2, "WebGLDevice created")();
8924
12026
  if (typeof props.canvas === "string") {
8925
- await import_core34.CanvasContext.pageLoaded;
12027
+ await import_core36.CanvasContext.pageLoaded;
8926
12028
  }
8927
- if (import_core34.log.get("debug") || props.debug) {
12029
+ if (import_core36.log.get("debug") || props.debug) {
8928
12030
  await loadWebGLDeveloperTools();
8929
12031
  }
8930
12032
  const {
8931
12033
  spector: spector2
8932
12034
  } = props;
8933
- if (import_core34.log.get("spector") || spector2) {
12035
+ if (import_core36.log.get("spector") || spector2) {
8934
12036
  await loadSpectorJS();
8935
12037
  }
8936
- import_core34.log.probe(LOG_LEVEL2 + 1, "DOM is loaded")();
12038
+ import_core36.log.probe(LOG_LEVEL2 + 1, "DOM is loaded")();
8937
12039
  if (props.gl && props.gl.device) {
8938
12040
  return WebGLDevice.attach(props.gl);
8939
12041
  }
8940
12042
  const device = new WebGLDevice(props);
8941
12043
  const message2 = `Created ${device.info.type}${device.debug ? " debug" : ""} context: ${device.info.vendor}, ${device.info.renderer} for canvas: ${device.canvasContext.id}`;
8942
- import_core34.log.probe(LOG_LEVEL2, message2)();
8943
- import_core34.log.table(LOG_LEVEL2, device.info)();
8944
- import_core34.log.groupEnd(LOG_LEVEL2)();
12044
+ import_core36.log.probe(LOG_LEVEL2, message2)();
12045
+ import_core36.log.table(LOG_LEVEL2, device.info)();
12046
+ import_core36.log.groupEnd(LOG_LEVEL2)();
8945
12047
  return device;
8946
12048
  }
8947
12049
  constructor(props) {
8948
- var _props$gl;
12050
+ var _props$gl, _props$gl2;
8949
12051
  super({
8950
12052
  ...props,
8951
- id: props.id || (0, import_core34.uid)("webgl-device")
12053
+ id: props.id || (0, import_core36.uid)("webgl-device")
8952
12054
  });
8953
12055
  this.info = void 0;
8954
12056
  this.canvasContext = void 0;
@@ -8977,7 +12079,11 @@ ${source2}`;
8977
12079
  if (device) {
8978
12080
  throw new Error(`WebGL context already attached to device ${device.id}`);
8979
12081
  }
8980
- this.canvasContext = new WebGLCanvasContext(this, props);
12082
+ const canvas2 = props.canvas || ((_props$gl2 = props.gl) === null || _props$gl2 === void 0 ? void 0 : _props$gl2.canvas);
12083
+ this.canvasContext = new WebGLCanvasContext(this, {
12084
+ ...props,
12085
+ canvas: canvas2
12086
+ });
8981
12087
  this.lost = new Promise((resolve) => {
8982
12088
  this._resolveContextLost = resolve;
8983
12089
  });
@@ -9005,6 +12111,7 @@ ${source2}`;
9005
12111
  this.gl2 = this.gl;
9006
12112
  this.isWebGL2 = isWebGL22(this.gl);
9007
12113
  this.isWebGL1 = !this.isWebGL2;
12114
+ this.canvasContext.resize();
9008
12115
  this.info = getDeviceInfo(this.gl);
9009
12116
  this.gl.device = this;
9010
12117
  this.gl._version = this.isWebGL2 ? 2 : 1;
@@ -9020,7 +12127,7 @@ ${source2}`;
9020
12127
  for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
9021
12128
  args[_key] = arguments[_key];
9022
12129
  }
9023
- return import_core34.log.log(1, ...args)();
12130
+ return import_core36.log.log(1, ...args)();
9024
12131
  }
9025
12132
  });
9026
12133
  if (isBrowser() && props.debug) {
@@ -9031,14 +12138,14 @@ ${source2}`;
9031
12138
  });
9032
12139
  this.gl2 = this.gl;
9033
12140
  this.debug = true;
9034
- import_core34.log.level = Math.max(import_core34.log.level, 1);
9035
- import_core34.log.warn("WebGL debug mode activated. Performance reduced.")();
12141
+ import_core36.log.level = Math.max(import_core36.log.level, 1);
12142
+ import_core36.log.warn("WebGL debug mode activated. Performance reduced.")();
9036
12143
  }
9037
12144
  if (isBrowser() && props.spector) {
9038
- const canvas = this.handle.canvas || props.canvas;
12145
+ const canvas3 = this.handle.canvas || props.canvas;
9039
12146
  this.spector = initializeSpectorJS({
9040
12147
  ...this.props,
9041
- canvas
12148
+ canvas: canvas3
9042
12149
  });
9043
12150
  }
9044
12151
  }
@@ -9123,6 +12230,12 @@ ${source2}`;
9123
12230
  (_this$renderPass = this.renderPass) === null || _this$renderPass === void 0 ? void 0 : _this$renderPass.end();
9124
12231
  this.renderPass = null;
9125
12232
  }
12233
+ readPixelsToArrayWebGL(source, options) {
12234
+ return readPixelsToArray(source, options);
12235
+ }
12236
+ readPixelsToBufferWebGL2(source, options) {
12237
+ return readPixelsToBuffer(source, options);
12238
+ }
9126
12239
  get webglLimits() {
9127
12240
  this._webglLimits = this._webglLimits || getWebGLLimits(this.gl);
9128
12241
  return this._webglLimits;
@@ -9164,7 +12277,7 @@ ${source2}`;
9164
12277
  this._constants = this._constants || new Array(this.limits.maxVertexAttributes).fill(null);
9165
12278
  const currentConstant = this._constants[location];
9166
12279
  if (currentConstant && compareConstantArrayValues2(currentConstant, constant)) {
9167
- import_core34.log.info(1, `setConstantAttribute(${location}) could have been skipped, value unchanged`)();
12280
+ import_core36.log.info(1, `setConstantAttribute(${location}) could have been skipped, value unchanged`)();
9168
12281
  }
9169
12282
  this._constants[location] = constant;
9170
12283
  switch (constant.constructor) {
@@ -9178,7 +12291,7 @@ ${source2}`;
9178
12291
  setConstantUintArray(this, location, constant);
9179
12292
  break;
9180
12293
  default:
9181
- (0, import_core34.assert)(false);
12294
+ (0, import_core36.assert)(false);
9182
12295
  }
9183
12296
  }
9184
12297
  };
@@ -9213,7 +12326,7 @@ ${source2}`;
9213
12326
  device.gl.vertexAttrib4fv(location, array);
9214
12327
  break;
9215
12328
  default:
9216
- (0, import_core34.assert)(false);
12329
+ (0, import_core36.assert)(false);
9217
12330
  }
9218
12331
  }
9219
12332
  function setConstantIntArray(device, location, array) {
@@ -9239,7 +12352,7 @@ ${source2}`;
9239
12352
  }
9240
12353
 
9241
12354
  // ../../node_modules/@luma.gl/webgl/dist/classic/clear.js
9242
- var import_core35 = __toESM(require_core2(), 1);
12355
+ var import_core37 = __toESM(require_core2(), 1);
9243
12356
  var GL_DEPTH_BUFFER_BIT2 = 256;
9244
12357
  var GL_STENCIL_BUFFER_BIT2 = 1024;
9245
12358
  var GL_COLOR_BUFFER_BIT2 = 16384;
@@ -9275,128 +12388,12 @@ ${source2}`;
9275
12388
  parameters.clearStencil = depth;
9276
12389
  }
9277
12390
  }
9278
- (0, import_core35.assert)(clearFlags !== 0, ERR_ARGUMENTS);
12391
+ (0, import_core37.assert)(clearFlags !== 0, ERR_ARGUMENTS);
9279
12392
  withGLParameters(device.gl, parameters, () => {
9280
12393
  device.gl.clear(clearFlags);
9281
12394
  });
9282
12395
  }
9283
12396
 
9284
- // ../../node_modules/@luma.gl/webgl/dist/classic/copy-and-blit.js
9285
- var import_core37 = __toESM(require_core2(), 1);
9286
-
9287
- // ../../node_modules/@luma.gl/webgl/dist/classic/format-utils.js
9288
- var import_core36 = __toESM(require_core2(), 1);
9289
- function glFormatToComponents(format) {
9290
- switch (format) {
9291
- case 6406:
9292
- case 33326:
9293
- case 6403:
9294
- return 1;
9295
- case 33328:
9296
- case 33319:
9297
- return 2;
9298
- case 6407:
9299
- case 34837:
9300
- return 3;
9301
- case 6408:
9302
- case 34836:
9303
- return 4;
9304
- default:
9305
- (0, import_core36.assert)(false);
9306
- return 0;
9307
- }
9308
- }
9309
- function glTypeToBytes(type) {
9310
- switch (type) {
9311
- case 5121:
9312
- return 1;
9313
- case 33635:
9314
- case 32819:
9315
- case 32820:
9316
- return 2;
9317
- case 5126:
9318
- return 4;
9319
- default:
9320
- (0, import_core36.assert)(false);
9321
- return 0;
9322
- }
9323
- }
9324
-
9325
- // ../../node_modules/@luma.gl/webgl/dist/classic/copy-and-blit.js
9326
- function readPixelsToBuffer(source, options) {
9327
- const {
9328
- sourceX = 0,
9329
- sourceY = 0,
9330
- sourceFormat = 6408,
9331
- targetByteOffset = 0
9332
- } = options || {};
9333
- let {
9334
- target,
9335
- sourceWidth,
9336
- sourceHeight,
9337
- sourceType
9338
- } = options || {};
9339
- const {
9340
- framebuffer,
9341
- deleteFramebuffer
9342
- } = getFramebuffer2(source);
9343
- (0, import_core37.assert)(framebuffer);
9344
- sourceWidth = sourceWidth || framebuffer.width;
9345
- sourceHeight = sourceHeight || framebuffer.height;
9346
- const webglFramebuffer = framebuffer;
9347
- sourceType = sourceType || 5121;
9348
- if (!target) {
9349
- const components = glFormatToComponents(sourceFormat);
9350
- const byteCount = glTypeToBytes(sourceType);
9351
- const byteLength = targetByteOffset + sourceWidth * sourceHeight * components * byteCount;
9352
- target = webglFramebuffer.device.createBuffer({
9353
- byteLength
9354
- });
9355
- }
9356
- const commandEncoder = source.device.createCommandEncoder();
9357
- commandEncoder.copyTextureToBuffer({
9358
- source,
9359
- width: sourceWidth,
9360
- height: sourceHeight,
9361
- origin: [sourceX, sourceY],
9362
- destination: target,
9363
- byteOffset: targetByteOffset
9364
- });
9365
- commandEncoder.destroy();
9366
- if (deleteFramebuffer) {
9367
- framebuffer.destroy();
9368
- }
9369
- return target;
9370
- }
9371
- function getFramebuffer2(source) {
9372
- if (!(source instanceof import_core37.Framebuffer)) {
9373
- return {
9374
- framebuffer: toFramebuffer(source),
9375
- deleteFramebuffer: true
9376
- };
9377
- }
9378
- return {
9379
- framebuffer: source,
9380
- deleteFramebuffer: false
9381
- };
9382
- }
9383
- function toFramebuffer(texture, props) {
9384
- const {
9385
- device,
9386
- width,
9387
- height,
9388
- id
9389
- } = texture;
9390
- const framebuffer = device.createFramebuffer({
9391
- ...props,
9392
- id: `framebuffer-for-${id}`,
9393
- width,
9394
- height,
9395
- colorAttachments: [texture]
9396
- });
9397
- return framebuffer;
9398
- }
9399
-
9400
12397
  // src/utils/gpu-grid-aggregation/gpu-grid-aggregator.ts
9401
12398
  var import_core38 = __toESM(require_core());
9402
12399
 
@@ -9663,7 +12660,6 @@ void main()
9663
12660
  width = 1,
9664
12661
  height = 1,
9665
12662
  data = null,
9666
- unpackFlipY = true,
9667
12663
  parameters = DEFAULT_PARAMETERS
9668
12664
  } = opts;
9669
12665
  const texture = device.createTexture({
@@ -10325,12 +13321,12 @@ void main()
10325
13321
 
10326
13322
  // src/utils/color-utils.ts
10327
13323
  var defaultColorRange = [[255, 255, 178], [254, 217, 118], [254, 178, 76], [253, 141, 60], [240, 59, 32], [189, 0, 38]];
10328
- function colorRangeToFlatArray(colorRange, normalize = false, ArrayType = Float32Array) {
13324
+ function colorRangeToFlatArray(colorRange, normalize = false, ArrayType2 = Float32Array) {
10329
13325
  let flatArray;
10330
13326
  if (Number.isFinite(colorRange[0])) {
10331
- flatArray = new ArrayType(colorRange);
13327
+ flatArray = new ArrayType2(colorRange);
10332
13328
  } else {
10333
- flatArray = new ArrayType(colorRange.length * 4);
13329
+ flatArray = new ArrayType2(colorRange.length * 4);
10334
13330
  let index2 = 0;
10335
13331
  for (let i = 0; i < colorRange.length; i++) {
10336
13332
  const color = colorRange[i];
@@ -10668,7 +13664,9 @@ void main(void) {
10668
13664
  const moduleSettings = Object.assign(Object.create(this.props), {
10669
13665
  viewport,
10670
13666
  mousePosition,
10671
- pickingActive: 0,
13667
+ picking: {
13668
+ isActive: 0
13669
+ },
10672
13670
  devicePixelRatio: device.canvasContext.cssToDeviceRatio()
10673
13671
  });
10674
13672
  return moduleSettings;
@@ -11452,7 +14450,7 @@ void main(void) {
11452
14450
  type: "accessor",
11453
14451
  value: 1
11454
14452
  },
11455
- gpuAggregation: true,
14453
+ gpuAggregation: false,
11456
14454
  aggregation: "SUM"
11457
14455
  };
11458
14456
  var POSITION_ATTRIBUTE_NAME = "positions";
@@ -13115,7 +16113,7 @@ void main(void) {
13115
16113
  type: "accessor",
13116
16114
  value: 1
13117
16115
  },
13118
- gpuAggregation: true,
16116
+ gpuAggregation: false,
13119
16117
  aggregation: "SUM",
13120
16118
  contours: {
13121
16119
  type: "object",
@@ -13332,7 +16330,7 @@ void main(void) {
13332
16330
  aggregationData
13333
16331
  } = count;
13334
16332
  if (!aggregationData) {
13335
- aggregationData = count.aggregationBuffer.getData();
16333
+ aggregationData = count.aggregationBuffer.readSyncWebGL2();
13336
16334
  count.aggregationData = aggregationData;
13337
16335
  }
13338
16336
  const {
@@ -13750,7 +16748,7 @@ void main(void) {
13750
16748
  dimensions: DIMENSIONS3
13751
16749
  });
13752
16750
  this.setState({
13753
- gpuAggregation: true,
16751
+ gpuAggregation: false,
13754
16752
  projectPoints: false,
13755
16753
  isSupported,
13756
16754
  weights: {
@@ -14063,14 +17061,14 @@ void main(void) {
14063
17061
  var GridLayer = class extends import_core52.CompositeLayer {
14064
17062
  initializeState() {
14065
17063
  this.state = {
14066
- useGPUAggregation: true
17064
+ useGPUAggregation: false
14067
17065
  };
14068
17066
  }
14069
17067
  updateState({
14070
17068
  props
14071
17069
  }) {
14072
17070
  this.setState({
14073
- useGPUAggregation: this.canUseGPUAggregation(props)
17071
+ useGPUAggregation: false
14074
17072
  });
14075
17073
  }
14076
17074
  renderLayers() {
@@ -14166,18 +17164,6 @@ void main(void) {
14166
17164
  const [xMin, yMin, xMax, yMax] = bounds;
14167
17165
  return [(point[0] - xMin) / (xMax - xMin), (point[1] - yMin) / (yMax - yMin)];
14168
17166
  }
14169
- function getTextureParams({
14170
- device,
14171
- floatTargetSupport
14172
- }) {
14173
- return floatTargetSupport ? {
14174
- format: device.info.type === "webgl2" ? 34836 : 6408,
14175
- type: 5126
14176
- } : {
14177
- format: 6408,
14178
- type: 5121
14179
- };
14180
- }
14181
17167
 
14182
17168
  // src/heatmap-layer/heatmap-layer.ts
14183
17169
  var import_core54 = __toESM(require_core());
@@ -14225,7 +17211,7 @@ void main(void) {
14225
17211
  precision highp float;
14226
17212
 
14227
17213
  uniform float opacity;
14228
- uniform sampler2D texture;
17214
+ uniform sampler2D weightsTexture;
14229
17215
  uniform sampler2D colorTexture;
14230
17216
  uniform float aggregationMode;
14231
17217
 
@@ -14243,7 +17229,7 @@ vec4 getLinearColor(float value) {
14243
17229
  }
14244
17230
 
14245
17231
  void main(void) {
14246
- vec4 weights = texture(texture, vTexCoords);
17232
+ vec4 weights = texture(weightsTexture, vTexCoords);
14247
17233
  float weight = weights.r;
14248
17234
 
14249
17235
  if (aggregationMode > 0.5) {
@@ -14273,32 +17259,36 @@ void main(void) {
14273
17259
  initializeState({
14274
17260
  device
14275
17261
  }) {
14276
- const attributeManager = this.getAttributeManager();
14277
- attributeManager.add({
14278
- positions: {
14279
- size: 3,
14280
- noAlloc: true
14281
- },
14282
- texCoords: {
14283
- size: 2,
14284
- noAlloc: true
14285
- }
14286
- });
14287
17262
  this.setState({
14288
17263
  model: this._getModel(device)
14289
17264
  });
14290
17265
  }
14291
17266
  _getModel(device) {
14292
17267
  const {
14293
- vertexCount
17268
+ vertexCount,
17269
+ data,
17270
+ weightsTexture,
17271
+ maxTexture,
17272
+ colorTexture
14294
17273
  } = this.props;
14295
17274
  return new Model(device, {
14296
17275
  ...this.getShaders(),
14297
17276
  id: this.props.id,
14298
- geometry: new Geometry({
14299
- topology: "triangle-fan-webgl",
14300
- vertexCount
14301
- })
17277
+ bindings: {
17278
+ weightsTexture,
17279
+ maxTexture,
17280
+ colorTexture
17281
+ },
17282
+ attributes: data.attributes,
17283
+ bufferLayout: [{
17284
+ name: "positions",
17285
+ format: "float32x3"
17286
+ }, {
17287
+ name: "texCoords",
17288
+ format: "float32x2"
17289
+ }],
17290
+ topology: "triangle-fan-webgl",
17291
+ vertexCount
14302
17292
  });
14303
17293
  }
14304
17294
  draw({
@@ -14308,9 +17298,6 @@ void main(void) {
14308
17298
  model
14309
17299
  } = this.state;
14310
17300
  const {
14311
- texture,
14312
- maxTexture,
14313
- colorTexture,
14314
17301
  intensity,
14315
17302
  threshold: threshold2,
14316
17303
  aggregationMode,
@@ -14318,9 +17305,6 @@ void main(void) {
14318
17305
  } = this.props;
14319
17306
  model.setUniforms({
14320
17307
  ...uniforms,
14321
- texture,
14322
- maxTexture,
14323
- colorTexture,
14324
17308
  intensity,
14325
17309
  threshold: threshold2,
14326
17310
  aggregationMode,
@@ -14341,18 +17325,20 @@ uniform float radiusPixels;
14341
17325
  uniform float textureWidth;
14342
17326
  uniform vec4 commonBounds;
14343
17327
  uniform float weightsScale;
17328
+
14344
17329
  void main()
14345
17330
  {
14346
17331
  weightsTexture = vec4(weights * weightsScale, 0., 0., 1.);
14347
17332
 
14348
- float radiusTexels = project_pixel_size(radiusPixels) * textureWidth / (commonBounds.z - commonBounds.x);
17333
+ float radiusTexels = project_pixel_size(radiusPixels) * textureWidth / (commonBounds.z - commonBounds.x);
14349
17334
  gl_PointSize = radiusTexels * 2.;
14350
17335
 
14351
17336
  vec3 commonPosition = project_position(positions, positions64Low);
14352
17337
 
14353
- // map xy from commonBounds to [-1, 1]
17338
+ // // map xy from commonBounds to [-1, 1]
14354
17339
  gl_Position.xy = (commonPosition.xy - commonBounds.xy) / (commonBounds.zw - commonBounds.xy) ;
14355
17340
  gl_Position.xy = (gl_Position.xy * 2.) - (1.);
17341
+ gl_Position.w = 1.0;
14356
17342
  }
14357
17343
  `;
14358
17344
 
@@ -14380,15 +17366,21 @@ void main()
14380
17366
 
14381
17367
  // src/heatmap-layer/max-vs.glsl.ts
14382
17368
  var max_vs_glsl_default = `#version 300 es
14383
- in vec4 inTexture;
17369
+ uniform sampler2D inTexture;
17370
+ uniform float textureSize;
14384
17371
  out vec4 outTexture;
14385
17372
 
14386
17373
  void main()
14387
17374
  {
14388
- outTexture = inTexture;
14389
- gl_Position = vec4(0, 0, 0, 1.);
14390
- // Enforce default value for ANGLE issue (https://bugs.chromium.org/p/angleproject/issues/detail?id=3941)
14391
- gl_PointSize = 1.0;
17375
+ // Sample every pixel in texture
17376
+ int yIndex = gl_VertexID / int(textureSize);
17377
+ int xIndex = gl_VertexID - (yIndex * int(textureSize));
17378
+ vec2 uv = (0.5 + vec2(float(xIndex), float(yIndex))) / textureSize;
17379
+ outTexture = texture(inTexture, uv);
17380
+
17381
+ gl_Position = vec4(0.0, 0.0, 0.0, 1.0);
17382
+ // Enforce default value for ANGLE issue (https://bugs.chromium.org/p/angleproject/issues/detail?id=3941)
17383
+ gl_PointSize = 1.0;
14392
17384
  }
14393
17385
  `;
14394
17386
 
@@ -14408,8 +17400,8 @@ void main() {
14408
17400
  format: "rgba8unorm",
14409
17401
  mipmaps: false,
14410
17402
  sampler: {
14411
- minFilter: "nearest",
14412
- magFilter: "nearest",
17403
+ minFilter: "linear",
17404
+ magFilter: "linear",
14413
17405
  addressModeU: "clamp-to-edge",
14414
17406
  addressModeV: "clamp-to-edge"
14415
17407
  }
@@ -14564,7 +17556,7 @@ void main() {
14564
17556
  maxTexture: maxWeightsTexture,
14565
17557
  colorTexture,
14566
17558
  aggregationMode: AGGREGATION_MODE[aggregation] || 0,
14567
- texture: weightsTexture,
17559
+ weightsTexture,
14568
17560
  intensity,
14569
17561
  threshold: threshold2,
14570
17562
  colorDomain
@@ -14620,21 +17612,20 @@ void main() {
14620
17612
  _createTextures() {
14621
17613
  const {
14622
17614
  textureSize,
14623
- format,
14624
- type
17615
+ format
14625
17616
  } = this.state;
14626
17617
  this.setState({
14627
17618
  weightsTexture: this.context.device.createTexture({
17619
+ ...TEXTURE_PROPS,
14628
17620
  width: textureSize,
14629
17621
  height: textureSize,
14630
- format,
14631
- type,
14632
- ...TEXTURE_PROPS
17622
+ format
14633
17623
  }),
14634
17624
  maxWeightsTexture: this.context.device.createTexture({
14635
- format,
14636
- type,
14637
- ...TEXTURE_PROPS
17625
+ ...TEXTURE_PROPS,
17626
+ width: 1,
17627
+ height: 1,
17628
+ format
14638
17629
  })
14639
17630
  });
14640
17631
  }
@@ -14664,43 +17655,40 @@ void main() {
14664
17655
  } = this.props;
14665
17656
  const textureSize = Math.min(weightsTextureSize, device.limits.maxTextureDimension2D);
14666
17657
  const floatTargetSupport = FLOAT_TARGET_FEATURES.every((feature) => device.features.has(feature));
14667
- const {
14668
- format,
14669
- type
14670
- } = getTextureParams({
14671
- device,
14672
- floatTargetSupport
14673
- });
17658
+ const format = floatTargetSupport ? "rgba32float" : "rgba8unorm";
14674
17659
  const weightsScale = floatTargetSupport ? 1 : 1 / 255;
14675
17660
  this.setState({
14676
17661
  textureSize,
14677
17662
  format,
14678
- type,
14679
17663
  weightsScale
14680
17664
  });
14681
17665
  if (!floatTargetSupport) {
14682
- import_core54.log.warn(`HeatmapLayer: ${this.id} rendering to float texture not supported, fallingback to low precession format`)();
17666
+ import_core54.log.warn(`HeatmapLayer: ${this.id} rendering to float texture not supported, falling back to low precision format`)();
14683
17667
  }
14684
17668
  }
14685
- getShaders(type) {
14686
- return super.getShaders(type === "max-weights-transform" ? {
14687
- vs: max_vs_glsl_default,
14688
- _fs: max_fs_glsl_default
14689
- } : {
14690
- vs: weights_vs_glsl_default,
14691
- _fs: weights_fs_glsl_default
14692
- });
14693
- }
14694
- _createWeightsTransform(shaders = {}) {
17669
+ _createWeightsTransform(shaders) {
14695
17670
  let {
14696
17671
  weightsTransform
14697
17672
  } = this.state;
14698
- weightsTransform?.delete();
17673
+ const {
17674
+ weightsTexture
17675
+ } = this.state;
17676
+ const attributeManager = this.getAttributeManager();
17677
+ weightsTransform?.destroy();
14699
17678
  weightsTransform = new TextureTransform(this.context.device, {
14700
17679
  id: `${this.id}-weights-transform`,
17680
+ bufferLayout: attributeManager.getBufferLayouts(),
14701
17681
  vertexCount: 1,
14702
- targetTexture: this.state.weightsTexture,
14703
- targetTextureVarying: "weightsTexture",
17682
+ targetTexture: weightsTexture,
17683
+ parameters: {
17684
+ depthWriteEnabled: false,
17685
+ blendColorOperation: "add",
17686
+ blendColorSrcFactor: "one",
17687
+ blendColorDstFactor: "one",
17688
+ blendAlphaSrcFactor: "one",
17689
+ blendAlphaDstFactor: "one"
17690
+ },
17691
+ topology: "point-list",
14704
17692
  ...shaders
14705
17693
  });
14706
17694
  this.setState({
@@ -14709,57 +17697,75 @@ void main() {
14709
17697
  }
14710
17698
  _setupResources() {
14711
17699
  this._createTextures();
17700
+ const {
17701
+ device
17702
+ } = this.context;
14712
17703
  const {
14713
17704
  textureSize,
14714
17705
  weightsTexture,
14715
17706
  maxWeightsTexture
14716
17707
  } = this.state;
14717
- const weightsTransformShaders = this.getShaders("weights-transform");
17708
+ const weightsTransformShaders = this.getShaders({
17709
+ vs: weights_vs_glsl_default,
17710
+ fs: weights_fs_glsl_default
17711
+ });
14718
17712
  this._createWeightsTransform(weightsTransformShaders);
14719
- const maxWeightsTransformShaders = this.getShaders("max-weights-transform");
14720
- const maxWeightTransform = new TextureTransform(this.context.device, {
17713
+ const maxWeightsTransformShaders = this.getShaders({
17714
+ vs: max_vs_glsl_default,
17715
+ fs: max_fs_glsl_default
17716
+ });
17717
+ const maxWeightTransform = new TextureTransform(device, {
14721
17718
  id: `${this.id}-max-weights-transform`,
14722
- _sourceTextures: {
17719
+ bindings: {
14723
17720
  inTexture: weightsTexture
14724
17721
  },
14725
- _targetTexture: maxWeightsTexture,
14726
- _targetTextureVarying: "outTexture",
17722
+ uniforms: {
17723
+ textureSize
17724
+ },
17725
+ targetTexture: maxWeightsTexture,
14727
17726
  ...maxWeightsTransformShaders,
14728
- elementCount: textureSize * textureSize
17727
+ vertexCount: textureSize * textureSize,
17728
+ topology: "point-list",
17729
+ parameters: {
17730
+ depthWriteEnabled: false,
17731
+ blendColorOperation: "max",
17732
+ blendAlphaOperation: "max",
17733
+ blendColorSrcFactor: "one",
17734
+ blendColorDstFactor: "one",
17735
+ blendAlphaSrcFactor: "one",
17736
+ blendAlphaDstFactor: "one"
17737
+ }
14729
17738
  });
14730
17739
  this.setState({
14731
17740
  weightsTexture,
14732
17741
  maxWeightsTexture,
14733
17742
  maxWeightTransform,
14734
17743
  zoom: null,
14735
- triPositionBuffer: this.context.device.createBuffer({
14736
- byteLength: 48,
14737
- accessor: {
14738
- size: 3
14739
- }
17744
+ triPositionBuffer: device.createBuffer({
17745
+ byteLength: 48
14740
17746
  }),
14741
- triTexCoordBuffer: this.context.device.createBuffer({
14742
- byteLength: 48,
14743
- accessor: {
14744
- size: 2
14745
- }
17747
+ triTexCoordBuffer: device.createBuffer({
17748
+ byteLength: 48
14746
17749
  })
14747
17750
  });
14748
17751
  }
14749
17752
  updateShaders(shaderOptions) {
14750
- this._createWeightsTransform(shaderOptions);
17753
+ this._createWeightsTransform({
17754
+ vs: weights_vs_glsl_default,
17755
+ fs: weights_fs_glsl_default,
17756
+ ...shaderOptions
17757
+ });
14751
17758
  }
14752
17759
  _updateMaxWeightValue() {
14753
17760
  const {
14754
- maxWeightTransform
17761
+ maxWeightTransform,
17762
+ textureSize
14755
17763
  } = this.state;
14756
17764
  maxWeightTransform.run({
14757
17765
  parameters: {
14758
- blend: true,
14759
- depthTest: false,
14760
- blendFunc: [1, 1],
14761
- blendEquation: 32776
14762
- }
17766
+ viewport: [0, 0, 1, 1]
17767
+ },
17768
+ clearColor: [0, 0, 0, 0]
14763
17769
  });
14764
17770
  }
14765
17771
  _updateBounds(forceUpdate = false) {
@@ -14812,17 +17818,17 @@ void main() {
14812
17818
  colorTexture
14813
17819
  } = this.state;
14814
17820
  const colors = colorRangeToFlatArray(colorRange, false, Uint8Array);
14815
- if (colorTexture) {
14816
- colorTexture.setImageData({
14817
- data: colors,
14818
- width: colorRange.length
17821
+ if (colorTexture && colorTexture?.width === colorRange.length) {
17822
+ colorTexture.setSubImageData({
17823
+ data: colors
14819
17824
  });
14820
17825
  } else {
17826
+ colorTexture?.destroy();
14821
17827
  colorTexture = this.context.device.createTexture({
17828
+ ...TEXTURE_PROPS,
14822
17829
  data: colors,
14823
17830
  width: colorRange.length,
14824
- height: 1,
14825
- ...TEXTURE_PROPS
17831
+ height: 1
14826
17832
  });
14827
17833
  }
14828
17834
  this.setState({
@@ -14854,30 +17860,29 @@ void main() {
14854
17860
  } else {
14855
17861
  this.state.colorDomain = colorDomain || DEFAULT_COLOR_DOMAIN;
14856
17862
  }
17863
+ const attributeManager = this.getAttributeManager();
17864
+ const attributes = attributeManager.getAttributes();
17865
+ const moduleSettings = this.getModuleSettings();
17866
+ const positions = attributes.positions.buffer;
14857
17867
  const uniforms = {
14858
17868
  radiusPixels,
14859
17869
  commonBounds,
14860
17870
  textureWidth: textureSize,
14861
17871
  weightsScale
14862
17872
  };
14863
- weightsTransform.update({
14864
- elementCount: this.getNumInstances()
17873
+ const weights = attributes.weights.buffer;
17874
+ weightsTransform.model.setAttributes({
17875
+ positions,
17876
+ weights
14865
17877
  });
14866
- withGLParameters(this.context.gl, {
17878
+ weightsTransform.model.setVertexCount(this.getNumInstances());
17879
+ weightsTransform.model.setUniforms(uniforms);
17880
+ weightsTransform.model.updateModuleSettings(moduleSettings);
17881
+ weightsTransform.run({
17882
+ parameters: {
17883
+ viewport: [0, 0, textureSize, textureSize]
17884
+ },
14867
17885
  clearColor: [0, 0, 0, 0]
14868
- }, () => {
14869
- weightsTransform.run({
14870
- uniforms,
14871
- parameters: {
14872
- blend: true,
14873
- depthTest: false,
14874
- blendFunc: [1, 1],
14875
- blendEquation: 32774
14876
- },
14877
- clearRenderTarget: true,
14878
- attributes: this.getAttributes(),
14879
- moduleSettings: this.getModuleSettings()
14880
- });
14881
17886
  });
14882
17887
  this._updateMaxWeightValue();
14883
17888
  }