@luma.gl/engine 9.3.0-alpha.10 → 9.3.0-alpha.11

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 (46) hide show
  1. package/dist/animation-loop/make-animation-loop.d.ts.map +1 -1
  2. package/dist/animation-loop/make-animation-loop.js +1 -0
  3. package/dist/animation-loop/make-animation-loop.js.map +1 -1
  4. package/dist/debug/debug-framebuffer.d.ts +9 -4
  5. package/dist/debug/debug-framebuffer.d.ts.map +1 -1
  6. package/dist/debug/debug-framebuffer.js +91 -45
  7. package/dist/debug/debug-framebuffer.js.map +1 -1
  8. package/dist/dist.dev.js +191 -117
  9. package/dist/dist.min.js +30 -30
  10. package/dist/dynamic-texture/dynamic-texture.d.ts.map +1 -1
  11. package/dist/dynamic-texture/dynamic-texture.js +3 -1
  12. package/dist/dynamic-texture/dynamic-texture.js.map +1 -1
  13. package/dist/dynamic-texture/texture-data.js +2 -2
  14. package/dist/dynamic-texture/texture-data.js.map +1 -1
  15. package/dist/geometries/cube-geometry.js +7 -7
  16. package/dist/geometries/cube-geometry.js.map +1 -1
  17. package/dist/geometries/ico-sphere-geometry.js +3 -1
  18. package/dist/geometries/ico-sphere-geometry.js.map +1 -1
  19. package/dist/geometry/gpu-geometry.d.ts.map +1 -1
  20. package/dist/geometry/gpu-geometry.js +3 -0
  21. package/dist/geometry/gpu-geometry.js.map +1 -1
  22. package/dist/index.cjs +167 -99
  23. package/dist/index.cjs.map +3 -3
  24. package/dist/model/model.d.ts.map +1 -1
  25. package/dist/model/model.js +43 -32
  26. package/dist/model/model.js.map +1 -1
  27. package/dist/models/billboard-texture-model.js +3 -3
  28. package/dist/models/light-model-utils.js +1 -1
  29. package/dist/passes/get-fragment-shader.js +4 -4
  30. package/dist/shader-inputs.d.ts.map +1 -1
  31. package/dist/shader-inputs.js +20 -23
  32. package/dist/shader-inputs.js.map +1 -1
  33. package/package.json +2 -2
  34. package/src/animation-loop/make-animation-loop.ts +1 -0
  35. package/src/debug/debug-framebuffer.ts +139 -61
  36. package/src/dynamic-texture/dynamic-texture.ts +3 -5
  37. package/src/dynamic-texture/texture-data.ts +2 -2
  38. package/src/dynamic-texture/texture-data.ts.disabled +1 -1
  39. package/src/geometries/cube-geometry.ts +7 -7
  40. package/src/geometries/ico-sphere-geometry.ts +3 -1
  41. package/src/geometry/gpu-geometry.ts +3 -0
  42. package/src/model/model.ts +46 -34
  43. package/src/models/billboard-texture-model.ts +3 -3
  44. package/src/models/light-model-utils.ts +1 -1
  45. package/src/passes/get-fragment-shader.ts +4 -4
  46. package/src/shader-inputs.ts +32 -41
package/dist/dist.dev.js CHANGED
@@ -726,13 +726,13 @@ var __exports__ = (() => {
726
726
  if (!this.device || !canvasContext) {
727
727
  throw new Error("loop");
728
728
  }
729
- const canvas2 = canvasContext?.canvas;
729
+ const canvas = canvasContext?.canvas;
730
730
  const useDevicePixels = canvasContext.props.useDevicePixels;
731
731
  this.animationProps = {
732
732
  animationLoop: this,
733
733
  device: this.device,
734
734
  canvasContext,
735
- canvas: canvas2,
735
+ canvas,
736
736
  // @ts-expect-error Deprecated
737
737
  useDevicePixels,
738
738
  timeline: this.timeline,
@@ -934,6 +934,7 @@ var __exports__ = (() => {
934
934
  renderLoop = new AnimationLoopTemplateCtor(animationProps);
935
935
  return await renderLoop?.onInitialize(animationProps);
936
936
  } catch (error) {
937
+ console.error(error);
937
938
  setError(animationProps.animationLoop.device, error);
938
939
  return null;
939
940
  }
@@ -950,9 +951,9 @@ var __exports__ = (() => {
950
951
  if (!device) {
951
952
  return;
952
953
  }
953
- const canvas2 = device.getDefaultCanvasContext().canvas;
954
- if (canvas2 instanceof HTMLCanvasElement) {
955
- canvas2.style.overflow = "visible";
954
+ const canvas = device.getDefaultCanvasContext().canvas;
955
+ if (canvas instanceof HTMLCanvasElement) {
956
+ canvas.style.overflow = "visible";
956
957
  let errorDiv = document.getElementById("animation-loop-error");
957
958
  errorDiv?.remove();
958
959
  errorDiv = document.createElement("h1");
@@ -963,7 +964,7 @@ var __exports__ = (() => {
963
964
  errorDiv.style.left = "10px";
964
965
  errorDiv.style.color = "black";
965
966
  errorDiv.style.backgroundColor = "red";
966
- canvas2.parentElement?.appendChild(errorDiv);
967
+ canvas.parentElement?.appendChild(errorDiv);
967
968
  }
968
969
  }
969
970
  function clearError(device) {
@@ -1070,6 +1071,9 @@ var __exports__ = (() => {
1070
1071
  case "TEXCOORD_0":
1071
1072
  name = "texCoords";
1072
1073
  break;
1074
+ case "TEXCOORD_1":
1075
+ name = "texCoords1";
1076
+ break;
1073
1077
  case "COLOR_0":
1074
1078
  name = "colors";
1075
1079
  break;
@@ -1114,47 +1118,103 @@ var __exports__ = (() => {
1114
1118
  }
1115
1119
 
1116
1120
  // src/debug/debug-framebuffer.ts
1117
- var canvas = null;
1118
- var ctx = null;
1119
- function debugFramebuffer(fbo, {
1120
- id,
1121
- minimap,
1122
- opaque,
1123
- top = "0",
1124
- left = "0",
1125
- rgbaScale = 1
1126
- }) {
1127
- if (!canvas) {
1128
- canvas = document.createElement("canvas");
1129
- canvas.id = id;
1130
- canvas.title = id;
1131
- canvas.style.zIndex = "100";
1132
- canvas.style.position = "absolute";
1133
- canvas.style.top = top;
1134
- canvas.style.left = left;
1135
- canvas.style.border = "blue 5px solid";
1136
- canvas.style.transform = "scaleY(-1)";
1137
- document.body.appendChild(canvas);
1138
- ctx = canvas.getContext("2d");
1139
- }
1140
- if (canvas.width !== fbo.width || canvas.height !== fbo.height) {
1141
- canvas.width = fbo.width / 2;
1142
- canvas.height = fbo.height / 2;
1143
- canvas.style.width = "400px";
1144
- canvas.style.height = "400px";
1145
- }
1146
- const color = fbo.device.readPixelsToArrayWebGL(fbo);
1147
- const imageData = ctx?.createImageData(fbo.width, fbo.height);
1148
- if (imageData) {
1149
- const offset = 0;
1150
- for (let i = 0; i < color.length; i += 4) {
1151
- imageData.data[offset + i + 0] = color[i + 0] * rgbaScale;
1152
- imageData.data[offset + i + 1] = color[i + 1] * rgbaScale;
1153
- imageData.data[offset + i + 2] = color[i + 2] * rgbaScale;
1154
- imageData.data[offset + i + 3] = opaque ? 255 : color[i + 3] * rgbaScale;
1155
- }
1156
- ctx?.putImageData(imageData, 0, 0);
1121
+ var DEBUG_FRAMEBUFFER_STATE_KEY = "__debugFramebufferState";
1122
+ var DEFAULT_MARGIN_PX = 8;
1123
+ function debugFramebuffer(renderPass, source3, options) {
1124
+ if (renderPass.device.type !== "webgl") {
1125
+ return;
1126
+ }
1127
+ const state = getDebugFramebufferState(renderPass.device);
1128
+ if (state.flushing) {
1129
+ return;
1130
+ }
1131
+ if (isDefaultRenderPass(renderPass)) {
1132
+ flushDebugFramebuffers(renderPass, options, state);
1133
+ return;
1134
+ }
1135
+ if (source3 && isFramebuffer(source3) && source3.handle !== null) {
1136
+ if (!state.queuedFramebuffers.includes(source3)) {
1137
+ state.queuedFramebuffers.push(source3);
1138
+ }
1139
+ }
1140
+ }
1141
+ function flushDebugFramebuffers(renderPass, options, state) {
1142
+ if (state.queuedFramebuffers.length === 0) {
1143
+ return;
1144
+ }
1145
+ const webglDevice = renderPass.device;
1146
+ const { gl } = webglDevice;
1147
+ const previousReadFramebuffer = gl.getParameter(gl.READ_FRAMEBUFFER_BINDING);
1148
+ const previousDrawFramebuffer = gl.getParameter(gl.DRAW_FRAMEBUFFER_BINDING);
1149
+ const [targetWidth, targetHeight] = renderPass.device.getDefaultCanvasContext().getDrawingBufferSize();
1150
+ let topPx = parseCssPixel(options.top, DEFAULT_MARGIN_PX);
1151
+ const leftPx = parseCssPixel(options.left, DEFAULT_MARGIN_PX);
1152
+ state.flushing = true;
1153
+ try {
1154
+ for (const framebuffer of state.queuedFramebuffers) {
1155
+ const [targetX0, targetY0, targetX1, targetY1, previewHeight] = getOverlayRect({
1156
+ framebuffer,
1157
+ targetWidth,
1158
+ targetHeight,
1159
+ topPx,
1160
+ leftPx,
1161
+ minimap: options.minimap
1162
+ });
1163
+ gl.bindFramebuffer(gl.READ_FRAMEBUFFER, framebuffer.handle);
1164
+ gl.bindFramebuffer(gl.DRAW_FRAMEBUFFER, null);
1165
+ gl.blitFramebuffer(
1166
+ 0,
1167
+ 0,
1168
+ framebuffer.width,
1169
+ framebuffer.height,
1170
+ targetX0,
1171
+ targetY0,
1172
+ targetX1,
1173
+ targetY1,
1174
+ gl.COLOR_BUFFER_BIT,
1175
+ gl.NEAREST
1176
+ );
1177
+ topPx += previewHeight + DEFAULT_MARGIN_PX;
1178
+ }
1179
+ } finally {
1180
+ gl.bindFramebuffer(gl.READ_FRAMEBUFFER, previousReadFramebuffer);
1181
+ gl.bindFramebuffer(gl.DRAW_FRAMEBUFFER, previousDrawFramebuffer);
1182
+ state.flushing = false;
1183
+ }
1184
+ }
1185
+ function getOverlayRect(options) {
1186
+ const { framebuffer, targetWidth, targetHeight, topPx, leftPx, minimap } = options;
1187
+ const maxWidth = minimap ? Math.max(Math.floor(targetWidth / 4), 1) : targetWidth;
1188
+ const maxHeight = minimap ? Math.max(Math.floor(targetHeight / 4), 1) : targetHeight;
1189
+ const scale2 = Math.min(maxWidth / framebuffer.width, maxHeight / framebuffer.height);
1190
+ const previewWidth = Math.max(Math.floor(framebuffer.width * scale2), 1);
1191
+ const previewHeight = Math.max(Math.floor(framebuffer.height * scale2), 1);
1192
+ const targetX0 = leftPx;
1193
+ const targetY0 = Math.max(targetHeight - topPx - previewHeight, 0);
1194
+ const targetX1 = targetX0 + previewWidth;
1195
+ const targetY1 = targetY0 + previewHeight;
1196
+ return [targetX0, targetY0, targetX1, targetY1, previewHeight];
1197
+ }
1198
+ function getDebugFramebufferState(device) {
1199
+ device.userData[DEBUG_FRAMEBUFFER_STATE_KEY] ||= {
1200
+ flushing: false,
1201
+ queuedFramebuffers: []
1202
+ };
1203
+ return device.userData[DEBUG_FRAMEBUFFER_STATE_KEY];
1204
+ }
1205
+ function isFramebuffer(value) {
1206
+ return "colorAttachments" in value;
1207
+ }
1208
+ function isDefaultRenderPass(renderPass) {
1209
+ const framebuffer = renderPass.props.framebuffer;
1210
+ return !framebuffer || framebuffer.handle === null;
1211
+ }
1212
+ function parseCssPixel(value, defaultValue) {
1213
+ if (!value) {
1214
+ return defaultValue;
1157
1215
  }
1216
+ const parsedValue = Number.parseInt(value, 10);
1217
+ return Number.isFinite(parsedValue) ? parsedValue : defaultValue;
1158
1218
  }
1159
1219
 
1160
1220
  // src/utils/deep-equal.ts
@@ -1371,12 +1431,11 @@ var __exports__ = (() => {
1371
1431
  this.moduleUniforms = {};
1372
1432
  this.moduleBindings = {};
1373
1433
  for (const [name, module] of Object.entries(modules)) {
1374
- if (!module) {
1375
- continue;
1376
- }
1377
- this._addModule(module);
1378
- if (module.name && name !== module.name && !this.options.disableWarnings) {
1379
- import_core5.log.warn(`Module name: ${name} vs ${module.name}`)();
1434
+ if (module) {
1435
+ this._addModule(module);
1436
+ if (module.name && name !== module.name && !this.options.disableWarnings) {
1437
+ import_core5.log.warn(`Module name: ${name} vs ${module.name}`)();
1438
+ }
1380
1439
  }
1381
1440
  }
1382
1441
  }
@@ -1395,21 +1454,21 @@ var __exports__ = (() => {
1395
1454
  if (!this.options.disableWarnings) {
1396
1455
  import_core5.log.warn(`Module ${name} not found`)();
1397
1456
  }
1398
- continue;
1457
+ } else {
1458
+ const oldUniforms = this.moduleUniforms[moduleName];
1459
+ const oldBindings = this.moduleBindings[moduleName];
1460
+ const uniformsAndBindings = module.getUniforms?.(moduleProps, oldUniforms) || moduleProps;
1461
+ const { uniforms, bindings } = splitUniformsAndBindings(
1462
+ uniformsAndBindings,
1463
+ module.uniformTypes
1464
+ );
1465
+ this.moduleUniforms[moduleName] = mergeModuleUniforms(
1466
+ oldUniforms,
1467
+ uniforms,
1468
+ module.uniformTypes
1469
+ );
1470
+ this.moduleBindings[moduleName] = { ...oldBindings, ...bindings };
1399
1471
  }
1400
- const oldUniforms = this.moduleUniforms[moduleName];
1401
- const oldBindings = this.moduleBindings[moduleName];
1402
- const uniformsAndBindings = module.getUniforms?.(moduleProps, oldUniforms) || moduleProps;
1403
- const { uniforms, bindings } = splitUniformsAndBindings(
1404
- uniformsAndBindings,
1405
- module.uniformTypes
1406
- );
1407
- this.moduleUniforms[moduleName] = mergeModuleUniforms(
1408
- oldUniforms,
1409
- uniforms,
1410
- module.uniformTypes
1411
- );
1412
- this.moduleBindings[moduleName] = { ...oldBindings, ...bindings };
1413
1472
  }
1414
1473
  }
1415
1474
  /**
@@ -1458,10 +1517,9 @@ var __exports__ = (() => {
1458
1517
  function mergeModuleUniforms(currentUniforms = {}, nextUniforms = {}, uniformTypes2 = {}) {
1459
1518
  const mergedUniforms = { ...currentUniforms };
1460
1519
  for (const [key, value] of Object.entries(nextUniforms)) {
1461
- if (value === void 0) {
1462
- continue;
1520
+ if (value !== void 0) {
1521
+ mergedUniforms[key] = mergeModuleUniformValue(currentUniforms[key], value, uniformTypes2[key]);
1463
1522
  }
1464
- mergedUniforms[key] = mergeModuleUniformValue(currentUniforms[key], value, uniformTypes2[key]);
1465
1523
  }
1466
1524
  return mergedUniforms;
1467
1525
  }
@@ -1477,14 +1535,13 @@ var __exports__ = (() => {
1477
1535
  const mergedArray = currentArray.slice();
1478
1536
  for (let index = 0; index < nextValue.length; index++) {
1479
1537
  const elementValue = nextValue[index];
1480
- if (elementValue === void 0) {
1481
- continue;
1538
+ if (elementValue !== void 0) {
1539
+ mergedArray[index] = mergeModuleUniformValue(
1540
+ currentArray[index],
1541
+ elementValue,
1542
+ uniformType[0]
1543
+ );
1482
1544
  }
1483
- mergedArray[index] = mergeModuleUniformValue(
1484
- currentArray[index],
1485
- elementValue,
1486
- uniformType[0]
1487
- );
1488
1545
  }
1489
1546
  return mergedArray;
1490
1547
  }
@@ -1495,10 +1552,9 @@ var __exports__ = (() => {
1495
1552
  const currentObject = isPlainUniformObject(currentValue) ? currentValue : {};
1496
1553
  const mergedObject = { ...currentObject };
1497
1554
  for (const [key, value] of Object.entries(nextValue)) {
1498
- if (value === void 0) {
1499
- continue;
1555
+ if (value !== void 0) {
1556
+ mergedObject[key] = mergeModuleUniformValue(currentObject[key], value, uniformStruct[key]);
1500
1557
  }
1501
- mergedObject[key] = mergeModuleUniformValue(currentObject[key], value, uniformStruct[key]);
1502
1558
  }
1503
1559
  return mergedObject;
1504
1560
  }
@@ -1741,7 +1797,9 @@ var __exports__ = (() => {
1741
1797
  return "DynamicTexture";
1742
1798
  }
1743
1799
  toString() {
1744
- return `DynamicTexture:"${this.id}":${this.texture.width}x${this.texture.height}px:(${this.isReady ? "ready" : "loading..."})`;
1800
+ const width = this._texture?.width ?? this.props.width ?? "?";
1801
+ const height = this._texture?.height ?? this.props.height ?? "?";
1802
+ return `DynamicTexture:"${this.id}":${width}x${height}px:(${this.isReady ? "ready" : "loading..."})`;
1745
1803
  }
1746
1804
  constructor(device, props) {
1747
1805
  this.device = device;
@@ -2185,6 +2243,7 @@ var __exports__ = (() => {
2185
2243
  // src/model/model.ts
2186
2244
  var LOG_DRAW_PRIORITY = 2;
2187
2245
  var LOG_DRAW_TIMEOUT = 1e4;
2246
+ var PIPELINE_INITIALIZATION_FAILED = "render pipeline initialization failed";
2188
2247
  var _Model = class {
2189
2248
  /** Device that created this model */
2190
2249
  device;
@@ -2398,35 +2457,45 @@ var __exports__ = (() => {
2398
2457
  renderPass.popDebugGroup();
2399
2458
  }
2400
2459
  let drawSuccess;
2460
+ let pipelineErrored = this.pipeline.isErrored;
2401
2461
  try {
2402
2462
  renderPass.pushDebugGroup(`${this}.draw(${renderPass})`);
2403
2463
  this._logDrawCallStart();
2404
2464
  this.pipeline = this._updatePipeline();
2405
- const syncBindings = this._getBindings();
2406
- const syncBindGroups = this._getBindGroups();
2407
- const { indexBuffer } = this.vertexArray;
2408
- const indexCount = indexBuffer ? indexBuffer.byteLength / (indexBuffer.indexType === "uint32" ? 4 : 2) : void 0;
2409
- drawSuccess = this.pipeline.draw({
2410
- renderPass,
2411
- vertexArray: this.vertexArray,
2412
- isInstanced: this.isInstanced,
2413
- vertexCount: this.vertexCount,
2414
- instanceCount: this.instanceCount,
2415
- indexCount,
2416
- transformFeedback: this.transformFeedback || void 0,
2417
- // Pipelines may be shared across models when caching is enabled, so bindings
2418
- // and WebGL uniforms must be supplied on every draw instead of being stored
2419
- // on the pipeline instance.
2420
- bindings: syncBindings,
2421
- bindGroups: syncBindGroups,
2422
- _bindGroupCacheKeys: this._getBindGroupCacheKeys(),
2423
- uniforms: this.props.uniforms,
2424
- // WebGL shares underlying cached pipelines even for models that have different parameters and topology,
2425
- // so we must provide our unique parameters to each draw
2426
- // (In WebGPU most parameters are encoded in the pipeline and cannot be changed per draw call)
2427
- parameters: this.parameters,
2428
- topology: this.topology
2429
- });
2465
+ pipelineErrored = this.pipeline.isErrored;
2466
+ if (pipelineErrored) {
2467
+ import_core8.log.info(
2468
+ LOG_DRAW_PRIORITY,
2469
+ `>>> DRAWING ABORTED ${this.id}: ${PIPELINE_INITIALIZATION_FAILED}`
2470
+ )();
2471
+ drawSuccess = false;
2472
+ } else {
2473
+ const syncBindings = this._getBindings();
2474
+ const syncBindGroups = this._getBindGroups();
2475
+ const { indexBuffer } = this.vertexArray;
2476
+ const indexCount = indexBuffer ? indexBuffer.byteLength / (indexBuffer.indexType === "uint32" ? 4 : 2) : void 0;
2477
+ drawSuccess = this.pipeline.draw({
2478
+ renderPass,
2479
+ vertexArray: this.vertexArray,
2480
+ isInstanced: this.isInstanced,
2481
+ vertexCount: this.vertexCount,
2482
+ instanceCount: this.instanceCount,
2483
+ indexCount,
2484
+ transformFeedback: this.transformFeedback || void 0,
2485
+ // Pipelines may be shared across models when caching is enabled, so bindings
2486
+ // and WebGL uniforms must be supplied on every draw instead of being stored
2487
+ // on the pipeline instance.
2488
+ bindings: syncBindings,
2489
+ bindGroups: syncBindGroups,
2490
+ _bindGroupCacheKeys: this._getBindGroupCacheKeys(),
2491
+ uniforms: this.props.uniforms,
2492
+ // WebGL shares underlying cached pipelines even for models that have different parameters and topology,
2493
+ // so we must provide our unique parameters to each draw
2494
+ // (In WebGPU most parameters are encoded in the pipeline and cannot be changed per draw call)
2495
+ parameters: this.parameters,
2496
+ topology: this.topology
2497
+ });
2498
+ }
2430
2499
  } finally {
2431
2500
  renderPass.popDebugGroup();
2432
2501
  this._logDrawCallEnd();
@@ -2435,6 +2504,8 @@ var __exports__ = (() => {
2435
2504
  if (drawSuccess) {
2436
2505
  this._lastDrawTimestamp = this.device.timestamp;
2437
2506
  this._needsRedraw = false;
2507
+ } else if (pipelineErrored) {
2508
+ this._needsRedraw = PIPELINE_INITIALIZATION_FAILED;
2438
2509
  } else {
2439
2510
  this._needsRedraw = "waiting for resource initialization";
2440
2511
  }
@@ -2803,9 +2874,10 @@ var __exports__ = (() => {
2803
2874
  return;
2804
2875
  }
2805
2876
  const framebuffer = renderPass.props.framebuffer;
2806
- if (framebuffer) {
2807
- debugFramebuffer(framebuffer, { id: framebuffer.id, minimap: true });
2808
- }
2877
+ debugFramebuffer(renderPass, framebuffer, {
2878
+ id: framebuffer?.id || `${this.id}-framebuffer`,
2879
+ minimap: true
2880
+ });
2809
2881
  }
2810
2882
  _getAttributeDebugTable() {
2811
2883
  const table = {};
@@ -3468,12 +3540,12 @@ ${props.source}` };
3468
3540
  };
3469
3541
  var BACKGROUND_FS_WGSL = (
3470
3542
  /* wgsl */
3471
- `@group(0) @binding(0) var backgroundTexture: texture_2d<f32>;
3472
- @group(0) @binding(1) var backgroundTextureSampler: sampler;
3543
+ `@group(0) @binding(auto) var backgroundTexture: texture_2d<f32>;
3544
+ @group(0) @binding(auto) var backgroundTextureSampler: sampler;
3473
3545
  struct backgroundUniforms {
3474
3546
  scale: vec2<f32>,
3475
3547
  };
3476
- @group(0) @binding(2) var<uniform> background: backgroundUniforms;
3548
+ @group(0) @binding(auto) var<uniform> background: backgroundUniforms;
3477
3549
 
3478
3550
  fn billboardTexture_getTextureUV(uv: vec2<f32>) -> vec2<f32> {
3479
3551
  let scale: vec2<f32> = background.scale;
@@ -6016,7 +6088,7 @@ void main(void) {
6016
6088
  viewProjectionMatrix: mat4x4<f32>,
6017
6089
  };
6018
6090
 
6019
- @binding(0) @group(0) var<uniform> lightMarker : lightMarkerUniforms;
6091
+ @group(0) @binding(auto) var<uniform> lightMarker : lightMarkerUniforms;
6020
6092
 
6021
6093
  struct VertexInputs {
6022
6094
  @location(0) positions : vec3<f32>,
@@ -7235,7 +7307,9 @@ void main(void) {
7235
7307
  ym /= len;
7236
7308
  zm /= len;
7237
7309
  positions.push(xm, ym, zm);
7238
- return pointMemo[key] = positions.length / 3 - 1;
7310
+ const pointIndex = positions.length / 3 - 1;
7311
+ pointMemo[key] = pointIndex;
7312
+ return pointIndex;
7239
7313
  };
7240
7314
  })();
7241
7315
  for (let i = 0; i < iterations; i++) {
@@ -7602,8 +7676,8 @@ void main(void) {
7602
7676
  function getFilterShaderWGSL(func) {
7603
7677
  return (
7604
7678
  /* wgsl */
7605
- `@group(0) @binding(0) var sourceTexture: texture_2d<f32>;
7606
- @group(0) @binding(2) var sourceTextureSampler: sampler;
7679
+ `@group(0) @binding(auto) var sourceTexture: texture_2d<f32>;
7680
+ @group(0) @binding(auto) var sourceTextureSampler: sampler;
7607
7681
 
7608
7682
  @fragment
7609
7683
  fn fragmentMain(inputs: FragmentInputs) -> @location(0) vec4f {
@@ -7620,8 +7694,8 @@ fn fragmentMain(inputs: FragmentInputs) -> @location(0) vec4f {
7620
7694
  function getSamplerShaderWGSL(func) {
7621
7695
  return (
7622
7696
  /* wgsl */
7623
- `@group(0) @binding(0) var sourceTexture: texture_2d<f32>;
7624
- @group(0) @binding(2) var sourceTextureSampler: sampler;
7697
+ `@group(0) @binding(auto) var sourceTexture: texture_2d<f32>;
7698
+ @group(0) @binding(auto) var sourceTextureSampler: sampler;
7625
7699
 
7626
7700
  @fragment
7627
7701
  fn fragmentMain(inputs: FragmentInputs) -> @location(0) vec4f {