@meimu/mutracer 0.2.0 → 0.3.0

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 (211) hide show
  1. package/README.md +3 -0
  2. package/dist/assets/bvh.worker.js +1 -1
  3. package/dist/mutracer.umd.js +8949 -7915
  4. package/docs/api.md +42 -21
  5. package/docs/caustics.md +80 -0
  6. package/docs/materials.md +5 -4
  7. package/docs/progressive-rendering.md +50 -9
  8. package/docs/technical/continuous-spectrum.md +93 -0
  9. package/docs/updates.md +3 -1
  10. package/docs/viewer-checklist.md +65 -0
  11. package/docs/viewer.md +7 -5
  12. package/lib/Display.js +1 -1
  13. package/lib/Display.js.map +1 -1
  14. package/lib/Engine.d.ts +2 -0
  15. package/lib/Engine.js +47 -12
  16. package/lib/Engine.js.map +1 -1
  17. package/lib/Render.d.ts +61 -13
  18. package/lib/Render.js +169 -19
  19. package/lib/Render.js.map +1 -1
  20. package/lib/RenderLoop.d.ts +7 -3
  21. package/lib/RenderLoop.js +68 -44
  22. package/lib/RenderLoop.js.map +1 -1
  23. package/lib/main.d.ts +1 -1
  24. package/lib/main.js.map +1 -1
  25. package/lib/oidn.d.ts +1 -1
  26. package/lib/oidnBundledWeights.cdn.d.ts +2 -2
  27. package/lib/renderer/GPUTraceQueue.d.ts +2 -1
  28. package/lib/renderer/GPUTraceQueue.js +3 -1
  29. package/lib/renderer/GPUTraceQueue.js.map +1 -1
  30. package/lib/renderer/RenderingPipeline.d.ts +4 -0
  31. package/lib/renderer/RenderingPipeline.js.map +1 -1
  32. package/lib/renderer/WGPUCausticLightPass.d.ts +48 -0
  33. package/lib/renderer/WGPUCausticLightPass.js +217 -0
  34. package/lib/renderer/WGPUCausticLightPass.js.map +1 -0
  35. package/lib/renderer/WGPUEnvMapDistribution.js +18 -18
  36. package/lib/renderer/WGPUFullQuadPass.js +3 -3
  37. package/lib/renderer/WGPUPhotonMap.d.ts +37 -0
  38. package/lib/renderer/WGPUPhotonMap.js +191 -0
  39. package/lib/renderer/WGPUPhotonMap.js.map +1 -0
  40. package/lib/renderer/WGPURayTraceOutput.d.ts +13 -1
  41. package/lib/renderer/WGPURayTraceOutput.js +122 -28
  42. package/lib/renderer/WGPURayTraceOutput.js.map +1 -1
  43. package/lib/renderer/WGPURayTracePass.d.ts +48 -17
  44. package/lib/renderer/WGPURayTracePass.js +538 -340
  45. package/lib/renderer/WGPURayTracePass.js.map +1 -1
  46. package/lib/renderer/WGPURenderingPipeline.js +83 -47
  47. package/lib/renderer/WGPURenderingPipeline.js.map +1 -1
  48. package/lib/renderer/WebGLFullQuadPass.d.ts +2 -1
  49. package/lib/renderer/WebGLFullQuadPass.js +4 -0
  50. package/lib/renderer/WebGLFullQuadPass.js.map +1 -1
  51. package/lib/renderer/WebGLJNLMDenoiser.js +66 -66
  52. package/lib/renderer/WebGLRayTraceOutputPass.js +4 -4
  53. package/lib/renderer/WebGLRayTracePass.d.ts +6 -1
  54. package/lib/renderer/WebGLRayTracePass.js +43 -6
  55. package/lib/renderer/WebGLRayTracePass.js.map +1 -1
  56. package/lib/renderer/WebGLRenderingPipeline.js +10 -14
  57. package/lib/renderer/WebGLRenderingPipeline.js.map +1 -1
  58. package/lib/renderer/WebGLSkyBaker.js +60 -60
  59. package/lib/renderer/accumulationTarget.d.ts +2 -1
  60. package/lib/renderer/accumulationTarget.js.map +1 -1
  61. package/lib/renderer/causticDiagnostics.d.ts +31 -0
  62. package/lib/renderer/causticDiagnostics.js +5 -0
  63. package/lib/renderer/causticDiagnostics.js.map +1 -0
  64. package/lib/renderer/causticEmission.d.ts +10 -0
  65. package/lib/renderer/causticEmission.js +40 -0
  66. package/lib/renderer/causticEmission.js.map +1 -0
  67. package/lib/renderer/causticUniform.d.ts +12 -0
  68. package/lib/renderer/causticUniform.js +22 -0
  69. package/lib/renderer/causticUniform.js.map +1 -0
  70. package/lib/renderer/caustics.d.ts +16 -0
  71. package/lib/renderer/caustics.js +93 -0
  72. package/lib/renderer/caustics.js.map +1 -0
  73. package/lib/renderer/glsl/aovDisplay.frag.js +5 -5
  74. package/lib/renderer/glsl/aovReflectance.glsl.js +53 -53
  75. package/lib/renderer/glsl/aovReflectanceSamples.glsl.js +1 -1
  76. package/lib/renderer/glsl/aovTrace.frag.js +33 -33
  77. package/lib/renderer/glsl/chunks/cameraRay.glsl.js +9 -9
  78. package/lib/renderer/glsl/chunks/emissiveLight.glsl.d.ts +2 -0
  79. package/lib/renderer/glsl/chunks/emissiveLight.glsl.js +35 -0
  80. package/lib/renderer/glsl/chunks/emissiveLight.glsl.js.map +1 -0
  81. package/lib/renderer/glsl/chunks/envMap.glsl.js +73 -73
  82. package/lib/renderer/glsl/chunks/intersect.glsl.js +426 -428
  83. package/lib/renderer/glsl/chunks/intersect.glsl.js.map +1 -1
  84. package/lib/renderer/glsl/chunks/materialBuffer.glsl.d.ts +1 -0
  85. package/lib/renderer/glsl/chunks/materialBuffer.glsl.js +156 -153
  86. package/lib/renderer/glsl/chunks/materialBuffer.glsl.js.map +1 -1
  87. package/lib/renderer/glsl/chunks/openPbrBsdf.glsl.js +771 -771
  88. package/lib/renderer/glsl/chunks/rand.glsl.js +3 -3
  89. package/lib/renderer/glsl/chunks/random.glsl.js +6 -6
  90. package/lib/renderer/glsl/chunks/rayTraceCore.glsl.d.ts +1 -0
  91. package/lib/renderer/glsl/chunks/rayTraceCore.glsl.js +68 -63
  92. package/lib/renderer/glsl/chunks/rayTraceCore.glsl.js.map +1 -1
  93. package/lib/renderer/glsl/chunks/sampleLight.glsl.js +94 -76
  94. package/lib/renderer/glsl/chunks/sampleLight.glsl.js.map +1 -1
  95. package/lib/renderer/glsl/chunks/sampleMaterial.glsl.d.ts +1 -0
  96. package/lib/renderer/glsl/chunks/sampleMaterial.glsl.js +140 -117
  97. package/lib/renderer/glsl/chunks/sampleMaterial.glsl.js.map +1 -1
  98. package/lib/renderer/glsl/chunks/sampleShadowCatcher.glsl.js +14 -14
  99. package/lib/renderer/glsl/chunks/sampling.glsl.js +89 -92
  100. package/lib/renderer/glsl/chunks/sampling.glsl.js.map +1 -1
  101. package/lib/renderer/glsl/chunks/sobol.glsl.js +79 -79
  102. package/lib/renderer/glsl/chunks/textureLinear.glsl.js +5 -5
  103. package/lib/renderer/glsl/chunks/uvProjection.glsl.js +11 -11
  104. package/lib/renderer/glsl/depthQuery.frag.js +2 -2
  105. package/lib/renderer/glsl/normalizeRayTraceOutput.frag.js +10 -10
  106. package/lib/renderer/glsl/rayTrace.frag.d.ts +1 -1
  107. package/lib/renderer/glsl/rayTrace.frag.js +260 -237
  108. package/lib/renderer/glsl/rayTrace.frag.js.map +1 -1
  109. package/lib/renderer/glsl/shadowCatcher.frag.js +26 -26
  110. package/lib/renderer/glsl/shadowCatcher.frag.js.map +1 -1
  111. package/lib/renderer/glsl/webglPipeline.frag.js +59 -59
  112. package/lib/renderer/lightSampling.d.ts +3 -2
  113. package/lib/renderer/lightSampling.js +14 -8
  114. package/lib/renderer/lightSampling.js.map +1 -1
  115. package/lib/renderer/progressiveScheduler.js +4 -3
  116. package/lib/renderer/progressiveScheduler.js.map +1 -1
  117. package/lib/renderer/renderPipeline.d.ts +1 -0
  118. package/lib/renderer/renderPipeline.js.map +1 -1
  119. package/lib/renderer/researchTransport.d.ts +31 -0
  120. package/lib/renderer/researchTransport.js +5 -0
  121. package/lib/renderer/researchTransport.js.map +1 -0
  122. package/lib/renderer/sceneLayoutSchema.d.ts +1 -0
  123. package/lib/renderer/sceneLayoutSchema.js +2 -2
  124. package/lib/renderer/sceneLayoutSchema.js.map +1 -1
  125. package/lib/renderer/scratchSampling.js +6 -6
  126. package/lib/renderer/spectrum.d.ts +21 -0
  127. package/lib/renderer/spectrum.js +154 -0
  128. package/lib/renderer/spectrum.js.map +1 -0
  129. package/lib/renderer/webglLightSampling.d.ts +39 -0
  130. package/lib/renderer/webglLightSampling.js +15 -0
  131. package/lib/renderer/webglLightSampling.js.map +1 -0
  132. package/lib/renderer/wgpuBindlessSource.js +3 -3
  133. package/lib/renderer/wgpuShaderSource.d.ts +7 -0
  134. package/lib/renderer/wgpuShaderSource.js +2 -0
  135. package/lib/renderer/wgpuShaderSource.js.map +1 -1
  136. package/lib/renderer/wgsl/aovDisplay.wgsl.js +9 -9
  137. package/lib/renderer/wgsl/aovReflectance.wgsl.js +55 -55
  138. package/lib/renderer/wgsl/aovReflectanceSamples.wgsl.js +1 -1
  139. package/lib/renderer/wgsl/aovResolve.wgsl.js +2 -2
  140. package/lib/renderer/wgsl/aovSnapshot.wgsl.js +1 -1
  141. package/lib/renderer/wgsl/aovTrace.wgsl.js +33 -33
  142. package/lib/renderer/wgsl/bloom.wgsl.js +18 -18
  143. package/lib/renderer/wgsl/causticLight.compute.d.ts +6 -0
  144. package/lib/renderer/wgsl/causticLight.compute.js +537 -0
  145. package/lib/renderer/wgsl/causticLight.compute.js.map +1 -0
  146. package/lib/renderer/wgsl/chunks/background.wgsl.d.ts +2 -0
  147. package/lib/renderer/wgsl/chunks/background.wgsl.js +102 -0
  148. package/lib/renderer/wgsl/chunks/background.wgsl.js.map +1 -0
  149. package/lib/renderer/wgsl/chunks/causticAdjoint.wgsl.d.ts +2 -0
  150. package/lib/renderer/wgsl/chunks/causticAdjoint.wgsl.js +12 -0
  151. package/lib/renderer/wgsl/chunks/causticAdjoint.wgsl.js.map +1 -0
  152. package/lib/renderer/wgsl/chunks/causticAtomic.wgsl.d.ts +2 -0
  153. package/lib/renderer/wgsl/chunks/causticAtomic.wgsl.js +16 -0
  154. package/lib/renderer/wgsl/chunks/causticAtomic.wgsl.js.map +1 -0
  155. package/lib/renderer/wgsl/chunks/caustics.wgsl.d.ts +1 -0
  156. package/lib/renderer/wgsl/chunks/caustics.wgsl.js +62 -0
  157. package/lib/renderer/wgsl/chunks/caustics.wgsl.js.map +1 -0
  158. package/lib/renderer/wgsl/chunks/common.wgsl.js +4 -4
  159. package/lib/renderer/wgsl/chunks/envMap.wgsl.js +37 -37
  160. package/lib/renderer/wgsl/chunks/intersect.wgsl.js +598 -592
  161. package/lib/renderer/wgsl/chunks/intersect.wgsl.js.map +1 -1
  162. package/lib/renderer/wgsl/chunks/intersectionAlpha.wgsl.js +14 -14
  163. package/lib/renderer/wgsl/chunks/materialBuffer.wgsl.d.ts +2 -1
  164. package/lib/renderer/wgsl/chunks/materialBuffer.wgsl.js +75 -73
  165. package/lib/renderer/wgsl/chunks/materialBuffer.wgsl.js.map +1 -1
  166. package/lib/renderer/wgsl/chunks/openPbrBsdf.wgsl.js +794 -794
  167. package/lib/renderer/wgsl/chunks/pdm_displacement.wgsl.js +139 -139
  168. package/lib/renderer/wgsl/chunks/rand.wgsl.js +3 -3
  169. package/lib/renderer/wgsl/chunks/rayTraceCore.wgsl.d.ts +2 -1
  170. package/lib/renderer/wgsl/chunks/rayTraceCore.wgsl.js +35 -25
  171. package/lib/renderer/wgsl/chunks/rayTraceCore.wgsl.js.map +1 -1
  172. package/lib/renderer/wgsl/chunks/sampleLight.wgsl.d.ts +1 -1
  173. package/lib/renderer/wgsl/chunks/sampleLight.wgsl.js +142 -138
  174. package/lib/renderer/wgsl/chunks/sampleLight.wgsl.js.map +1 -1
  175. package/lib/renderer/wgsl/chunks/sampleMaterial.wgsl.d.ts +1 -1
  176. package/lib/renderer/wgsl/chunks/sampleMaterial.wgsl.js +204 -187
  177. package/lib/renderer/wgsl/chunks/sampleMaterial.wgsl.js.map +1 -1
  178. package/lib/renderer/wgsl/chunks/sampleShadowCatcher.wgsl.d.ts +1 -1
  179. package/lib/renderer/wgsl/chunks/sampleShadowCatcher.wgsl.js +11 -11
  180. package/lib/renderer/wgsl/chunks/sampleShadowCatcher.wgsl.js.map +1 -1
  181. package/lib/renderer/wgsl/chunks/sampling.wgsl.d.ts +1 -1
  182. package/lib/renderer/wgsl/chunks/sampling.wgsl.js +89 -93
  183. package/lib/renderer/wgsl/chunks/sampling.wgsl.js.map +1 -1
  184. package/lib/renderer/wgsl/chunks/sobol.wgsl.js +83 -83
  185. package/lib/renderer/wgsl/chunks/uvProjection.wgsl.js +11 -11
  186. package/lib/renderer/wgsl/compose.frag.wgsl.js +98 -98
  187. package/lib/renderer/wgsl/customDenoise.wgsl.js +10 -10
  188. package/lib/renderer/wgsl/depthQuery.wgsl.js +2 -2
  189. package/lib/renderer/wgsl/jnlm.compute.js +74 -74
  190. package/lib/renderer/wgsl/offlineAdaptive.compute.js +25 -25
  191. package/lib/renderer/wgsl/oidnAuxiliary.wgsl.js +3 -3
  192. package/lib/renderer/wgsl/photonMap.compute.d.ts +29 -0
  193. package/lib/renderer/wgsl/photonMap.compute.js +352 -0
  194. package/lib/renderer/wgsl/photonMap.compute.js.map +1 -0
  195. package/lib/renderer/wgsl/proceduralSky.compute.js +64 -64
  196. package/lib/renderer/wgsl/rayTrace.compute.d.ts +9 -1
  197. package/lib/renderer/wgsl/rayTrace.compute.js +448 -522
  198. package/lib/renderer/wgsl/rayTrace.compute.js.map +1 -1
  199. package/lib/scene/MaterialState.d.ts +2 -2
  200. package/lib/scene/MaterialState.js +2 -2
  201. package/lib/scene/MaterialState.js.map +1 -1
  202. package/lib/settings/render.d.ts +11 -0
  203. package/lib/settings/render.js +1 -0
  204. package/lib/settings/render.js.map +1 -1
  205. package/lib/util/fromTHREE.js +2 -2
  206. package/lib/util/fromTHREE.js.map +1 -1
  207. package/lib/version.d.ts +1 -1
  208. package/lib/version.js +1 -1
  209. package/lib/version.js.map +1 -1
  210. package/llms.txt +2 -1
  211. package/package.json +3 -3
package/lib/Engine.js CHANGED
@@ -17,6 +17,7 @@ import { packDepthSampleArea } from './renderer/depthQuery.js';
17
17
  import { makeWGPURenderTargets } from './renderer/WGPURenderingPipeline.js';
18
18
  import { makeWebGLRenderTargets } from './renderer/WebGLRenderingPipeline.js';
19
19
  import { WebGLDevice as WebGLRenderer } from './renderer/webgl.js';
20
+ const CANCELLED_DENOISE_GRACE_MS = 10000;
20
21
  const sharedDevices = new Map();
21
22
  async function sharedDevice(gpu, mode) {
22
23
  let request = sharedDevices.get(mode);
@@ -69,6 +70,8 @@ export default class Engine {
69
70
  _bvhWorkerPool;
70
71
  _bvhPreparationRevision = 0;
71
72
  _bvhPreparation;
73
+ _bvhPreparationController;
74
+ _bvhFailedRevision = -1;
72
75
  _bvhPreparationTail = Promise.resolve();
73
76
  _tinyBvhUnavailable = false;
74
77
  _bvhWorkerUnavailable = false;
@@ -199,8 +202,11 @@ export default class Engine {
199
202
  resetTiming = changes.meshes === 'full' || this.scene !== this._sourceScene || force;
200
203
  if (changes.meshes !== 'none' || changes.lights || changes.background || this.scene !== this._sourceScene || force) {
201
204
  this._committedScene = this._snapshot.capture(this.scene, changes);
202
- if (changes.meshes === 'full' || force || this.scene !== this._sourceScene)
205
+ // Preparing meshes the next upload replaces would only delay that upload.
206
+ if (changes.meshes === 'full' || force || this.scene !== this._sourceScene) {
203
207
  this._pendingMeshes = 'full';
208
+ this._bvhPreparationController?.abort();
209
+ }
204
210
  else if (changes.meshes === 'incremental' && this._pendingMeshes !== 'full')
205
211
  this._pendingMeshes = 'incremental';
206
212
  for (const mesh of changes.transforms)
@@ -243,11 +249,23 @@ export default class Engine {
243
249
  return;
244
250
  const scene = this._committedScene ?? { meshes: [], lights: [] };
245
251
  if (this._needsBVHPreparation(scene.meshes)) {
246
- const task = this.prepare(scene);
252
+ const controller = this._bvhPreparationController = new AbortController();
253
+ const task = this.prepare(scene, { signal: controller.signal, onProgress: progress => {
254
+ if (this._bvhPreparationController === controller)
255
+ this._events.emit('progress', { stage: 'bvh', progress });
256
+ } });
247
257
  this._bvhPreparation = task;
248
- void task.then(() => { if (this._bvhPreparation === task)
249
- this._bvhPreparation = undefined; this._upload(); }, error => { if (this._bvhPreparation === task)
250
- this._bvhPreparation = undefined; this._notifyError(error); });
258
+ const finished = () => { if (this._bvhPreparation === task)
259
+ this._bvhPreparation = undefined; };
260
+ void task.then(() => { finished(); this._upload(); }, error => {
261
+ finished();
262
+ // Upload without prepared BVHs instead of retrying the same failure every frame.
263
+ if (!controller.signal.aborted) {
264
+ this._bvhFailedRevision = this._sceneRevision;
265
+ this._notifyError(error);
266
+ }
267
+ this._upload();
268
+ });
251
269
  return;
252
270
  }
253
271
  const budgetChanged = pipeline.setTextureAtlasBudget(this._lastBudget >= 0 ? this._lastBudget : textureBudget(this));
@@ -291,11 +309,7 @@ export default class Engine {
291
309
  ...config,
292
310
  builder: this.bvhBuilder === 'tinybvh' && !this._tinyBvhUnavailable ? 'tinybvh' : 'builtin',
293
311
  useWorker, workerPool: this._bvhWorkerPool, isCancelled,
294
- rebuild: false, onProgress: progress => {
295
- if (this._bvhPreparation === preparation)
296
- this._events.emit('progress', { stage: 'bvh', progress });
297
- options.onProgress?.(progress);
298
- }
312
+ rebuild: false, onProgress: options.onProgress
299
313
  });
300
314
  if (isCancelled())
301
315
  return;
@@ -331,6 +345,8 @@ export default class Engine {
331
345
  _needsBVHPreparation(meshes) {
332
346
  if (this._bvhPreparation)
333
347
  return true;
348
+ if (this._bvhFailedRevision === this._sceneRevision)
349
+ return false;
334
350
  if ((this.bvhBuilder !== 'tinybvh' || this._tinyBvhUnavailable) &&
335
351
  (!canUseBvhWorker() || this._bvhWorkerUnavailable)) {
336
352
  return meshes.some(mesh => !!getGeometryBvh(getPreparedMeshGeometry(mesh)) && meshNeedsStaticBvh(mesh, this._bvhConfig()));
@@ -568,6 +584,7 @@ export default class Engine {
568
584
  return;
569
585
  this._disposed = true;
570
586
  this._bvhPreparationRevision++;
587
+ this._bvhPreparationController?.abort();
571
588
  this._lossController?.abort(new Error('Engine is disposed.'));
572
589
  this._lossController = undefined;
573
590
  this._contextRestore?.reject(new Error('Engine is disposed.'));
@@ -601,6 +618,7 @@ export default class Engine {
601
618
  /** @internal */ _createTarget() { return this._pipeline?.createTarget(`render-${++this._targetCounter}`); }
602
619
  /** @internal */ _releaseTarget(target) { if (this._presented === target)
603
620
  this._presented = undefined; this._pipeline?.releaseTarget(target); }
621
+ /** @internal */ _isPresented(target) { return !!target && this._presented === target; }
604
622
  /** @internal */ _present(target) { target.activate(); target.present(); this._presented = target; }
605
623
  /** @internal */ _notifyError(value) {
606
624
  const error = value instanceof Error ? value : new Error(String(value));
@@ -701,11 +719,28 @@ export default class Engine {
701
719
  await denoiser.prepare?.({ device, width, height });
702
720
  this._customPrepared.set(denoiser, { device, width, height });
703
721
  }
704
- /** @internal */ _enqueueDenoise(work) {
722
+ /** @internal A cancelled job loses its lease if it does not settle within the grace period. */ _enqueueDenoise(work, signal) {
705
723
  const task = this._denoiseTail.then(async () => {
706
724
  const device = this._gpuDevice, generation = this._deviceRevision;
725
+ let settle;
707
726
  try {
708
- return await work();
727
+ if (!signal)
728
+ return await work();
729
+ const abandoned = new Promise(resolve => {
730
+ const expire = () => setTimeout(() => {
731
+ console.warn('A cancelled denoiser did not settle; continuing without it.');
732
+ resolve(undefined);
733
+ }, CANCELLED_DENOISE_GRACE_MS);
734
+ const running = work().finally(() => { clearTimeout(timer); signal.removeEventListener('abort', onAbort); });
735
+ let timer;
736
+ const onAbort = () => { timer = expire(); };
737
+ if (signal.aborted)
738
+ onAbort();
739
+ else
740
+ signal.addEventListener('abort', onAbort, { once: true });
741
+ settle = running;
742
+ });
743
+ return await Promise.race([settle, abandoned]);
709
744
  }
710
745
  finally {
711
746
  // Cancelling tiled OIDN stops future tiles, not the commands already
package/lib/Engine.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"Engine.js","sourceRoot":"","sources":["../src/Engine.ts"],"names":[],"mappings":"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","sourcesContent":["import InstancedMesh from './scene/InstancedMesh.js';\nimport { bvhConfig, engineSettingsKey, workerCount, textureBudget } from './settings/engine.js';\nimport {createCanvas} from './util/canvas.js';\nimport Camera from './scene/Camera.js';\nimport {getRecommendedDeviceDescriptor, validateDevice} from './renderer/deviceRequirements.js';\nimport {probeBindless, resourceTableFeature, type MaterialTextureSelection} from './renderer/wgpuBindless.js';\nimport { cameraSnapshot } from './renderer/cameraSnapshot.js';\nimport type { Scene } from './scene/Scene.js';\nimport type Mesh from './scene/Mesh.js';\nimport type Geometry from './scene/Geometry.js';\nimport Display from './Display.js';\nimport type Render from './Render.js';\nimport { Events } from './util/events.js';\nimport { SceneChangeDetector, snapshotFields, snapshotsEqual } from './renderer/sceneChangeDetector.js';\nimport { CommittedScene } from './renderer/committedScene.js';\nimport { validateSceneLights } from './renderer/lightsUtil.js';\nimport { ensureMeshGeometryAttributes, meshNeedsStaticBvh, getPreparedMeshGeometry } from './renderer/prepareMeshBVH.js';\nimport { getGeometryBvh, type BvhBuildConfig } from './renderer/geometryBvh.js';\nimport { prepareStaticBvhs } from './renderer/staticBvhPreparation.js';\nimport { canUseBvhWorker, BvhWorkerPool, resolveBvhWorkerCount } from './renderer/bvhWorkerClient.js';\nimport { DEFAULT_MAX_TEXTURE_ARRAY_BYTES } from './renderer/MaterialTable.js';\nimport { packDepthSampleArea, type DepthSampleArea } from './renderer/depthQuery.js';\nimport { makeWGPURenderTargets } from './renderer/WGPURenderingPipeline.js';\nimport { makeWebGLRenderTargets } from './renderer/WebGLRenderingPipeline.js';\nimport { WebGLDevice as WebGLRenderer } from './renderer/webgl.js';\nimport type { RenderPipeline, RenderTarget } from './renderer/renderPipeline.js';\nimport type { RenderingDiagnostics } from './renderer/RenderingPipeline.js';\nimport type { TinyBvhLayout } from './tinybvh/TinyBvhBuilder.js';\nimport type {OwnedDenoiser} from './renderer/ownedDenoiser.js';\nimport type {Denoiser} from './Render.js';\nexport type { DepthSampleArea } from './renderer/depthQuery.js';\n\n/** BLAS implementation; default builtin. */\nexport type BVHBuilder = 'tinybvh' | 'builtin';\n/** Optional CPU preparation settings. */\nexport interface PrepareOptions {\n /** Completed BLAS fraction 0–1. Default undefined. */ onProgress?: (progress: number) => void;\n /** Cancels preparation. Default undefined. */ signal?: AbortSignal;\n}\n/** Engine construction settings. */\nexport interface EngineParams {\n /** Default display canvas. Default a new HTML canvas, or OffscreenCanvas without document. */ canvas?: HTMLCanvasElement | OffscreenCanvas;\n /** Backend selection. Default auto, with WebGL fallback. webgpu requires WebGPU. */ backend?: 'auto' | 'webgpu' | 'webgl';\n /** Caller-owned WebGPU device. Default undefined uses a shared device. Implies webgpu; incompatible with webgl. */ device?: GPUDevice;\n /** Material texture bindings. Default atlas; auto tries WebGPU bindless textures and falls back to atlas when unavailable. Fixed at construction. */ textureBinding?: 'atlas' | 'auto';\n}\n/** Material-atlas device limits. */\nexport interface TextureAtlasLimits { maxTextureArrayLayers: number; maxTextureDimension2D: number; }\n/** Initialization result. */\nexport interface EngineInfo {\n backend: 'webgpu' | 'webgl'; adapterName: string; webgpuFallbackReason?: string; limits: TextureAtlasLimits;\n}\n/** Device and target diagnostics; Per-target GPU bytes exclude shared scene, temporary passes and driver costs. */\nexport interface EngineDiagnostics extends RenderingDiagnostics {\n backend: 'webgpu' | 'webgl' | undefined; adapterName: string;\n width: number; height: number; lastError?: string; webgpuFallbackReason?: string;\n}\ninterface EngineEvents {\n progress: { stage: 'device' | 'bvh' | 'shaders'; progress: number };\n error: Error;\n devicelost: { reason: string; recovering: boolean };\n}\ninterface SharedDevice {device: GPUDevice; adapterInfo?: GPUAdapterInfo; fallbackReason?: string;}\nconst sharedDevices = new Map<string, Promise<SharedDevice>>();\nasync function sharedDevice(gpu: GPU, mode: 'atlas' | 'auto'): Promise<SharedDevice> {\n let request = sharedDevices.get(mode);\n if (!request) {\n request = (async () => {\n let adapter = await gpu.requestAdapter({powerPreference: 'high-performance'}) ?? await gpu.requestAdapter();\n if (!adapter) throw new Error('No WebGPU adapter is available');\n const descriptor = getRecommendedDeviceDescriptor(adapter);\n const support = mode === 'auto' ? resourceTableFeature(adapter.features) : undefined;\n let device: GPUDevice, fallbackReason: string | undefined;\n try {\n device = await adapter.requestDevice(support ? {...descriptor, requiredFeatures: [...descriptor.requiredFeatures ?? [], support.feature]} : descriptor);\n } catch (error) {\n if (!support) throw error;\n fallbackReason = error instanceof Error ? error.message : String(error);\n const retry = await gpu.requestAdapter({powerPreference: 'high-performance'}) ?? await gpu.requestAdapter();\n if (!retry) throw new Error('No WebGPU adapter is available for atlas fallback');\n device = await retry.requestDevice(getRecommendedDeviceDescriptor(retry));\n adapter = retry;\n }\n const current = request;\n void device.lost.then(() => { if (sharedDevices.get(mode) === current) sharedDevices.delete(mode); });\n return {device, adapterInfo: (adapter as GPUAdapter & {info?: GPUAdapterInfo}).info, fallbackReason};\n })();\n sharedDevices.set(mode, request);\n const current = request;\n void request.catch(() => { if (sharedDevices.get(mode) === current) sharedDevices.delete(mode); });\n }\n return request;\n}\n\n/** Shared device, committed scene/camera, CPU preparation and denoiser ownership. */\nexport default class Engine {\n /** Source scene, accepted only by update(). Default undefined. */ scene: Scene | undefined;\n /** Source camera, accepted only by update(). Default undefined. */ camera: Camera | undefined;\n /** Default canvas and display settings. */ readonly display: Display;\n /** Static BLAS builder. Default builtin. */ bvhBuilder: BVHBuilder = 'builtin';\n /** Static BLAS layout. Default bvh2; dynamic geometry uses bvh2. */ bvhLayout: TinyBvhLayout = 'bvh2';\n /** Enable TinyBVH spatial splits. Default false. */ bvhSpatialSplits = false;\n /** Material texture budget in bytes. Default 384 MiB. */ textureAtlasBudgetBytes = DEFAULT_MAX_TEXTURE_ARRAY_BYTES;\n /** Maximum CPU BVH workers. Default auto (hardware concurrency minus one, clamped 1–4). */\n get bvhWorkerCount(): number | 'auto' { return this._bvhWorkerCount; }\n set bvhWorkerCount(count: number | 'auto') { resolveBvhWorkerCount(count); this._bvhWorkerCount = count; }\n private _bvhWorkerCount: number | 'auto' = 'auto';\n private _bvhWorkerPool?: BvhWorkerPool;\n private _bvhPreparationRevision = 0;\n private _bvhPreparation?: Promise<void>;\n private _bvhPreparationTail: Promise<unknown> = Promise.resolve();\n private _tinyBvhUnavailable = false;\n private _bvhWorkerUnavailable = false;\n private _bvhPreparedGeometry = new WeakMap<Mesh, [Geometry, number]>();\n private _lastBvhBuild?: { geometryCount: number; bvhTimeMs: number };\n private _lastBvhSettings = '';\n private _lastBudget = -1;\n private _shaderProgress = '';\n private _events = new Events<EngineEvents>();\n private _pipeline?: RenderPipeline;\n private _webglRenderer?: WebGLRenderer;\n private _gpuDevice?: GPUDevice;\n private _suppliedDevice?: GPUDevice;\n private readonly _ownsDeviceSelection: boolean;\n private _deviceRevision = 0;\n private _lossController?: AbortController;\n private _deviceLossError?: Error;\n private _webglListening = false;\n private _webglLost = false;\n private _recoverWebGL = false;\n private _contextRestore?: {promise: Promise<void>; resolve: () => void; reject: (error: Error) => void};\n private _gpuAdapterInfo?: GPUAdapterInfo;\n private _backendChoice: NonNullable<EngineParams['backend']>;\n private readonly _textureBinding: 'atlas' | 'auto';\n private _initPromise?: Promise<EngineInfo>;\n private _info?: EngineInfo;\n private _pipelineInitError?: Error;\n private _webgpuFallbackReason?: string;\n private _reportedErrors = new WeakSet<Error>();\n private _loggedErrorMessages = new Set<string>();\n private _sceneChangeDetector: SceneChangeDetector;\n private _snapshot = new CommittedScene();\n private _sourceScene?: Scene;\n private _committedScene?: Scene;\n private _sourceCamera?: Camera;\n private _committedCamera?: Camera;\n private _cameraFields: unknown[] = [];\n private _sceneRevision = 0;\n private _cameraRevision = 0;\n private _uploadedRevision = -1;\n private _pendingMeshes: 'none' | 'incremental' | 'full' = 'full';\n private _pendingTransforms = new Set<Mesh>();\n private _pendingColors = new Set<InstancedMesh>();\n private _pendingGeometries = new Set<Geometry>();\n private _pendingMaterials = new Set<import('./scene/OpenPBRMaterial.js').default>();\n private _pendingLights = true;\n private _pendingBackground = true;\n private _disposed = false;\n private _readingDepth = false;\n private _renders = new Set<Render>();\n private _targetCounter = 0;\n private _presented?: RenderTarget;\n private _denoisers = new Set<OwnedDenoiser>();\n private _denoiserCache = new Map<string, {references: number; value?: OwnedDenoiser; pending?: Promise<OwnedDenoiser>}>();\n private _denoiserEntries = new WeakMap<OwnedDenoiser, {key: string; references: number; value?: OwnedDenoiser; pending?: Promise<OwnedDenoiser>}>();\n private _weights = new Map<string, Promise<ArrayBuffer>>();\n private _customPrepared = new WeakMap<Denoiser, {device: GPUDevice; width: number; height: number}>();\n private _denoiseTail: Promise<unknown> = Promise.resolve();\n private _lastError: Error | undefined;\n /** Most recent synchronous engine/render failure. Default undefined. */\n get lastError() { return this._lastError; }\n /** @internal */ _setRenderError(error?: Error) { this._lastError = error ?? this._pipelineInitError; }\n\n constructor(params: EngineParams = {}) {\n if (params.device && params.backend === 'webgl') throw new Error('A supplied GPUDevice cannot use the webgl backend.');\n this._suppliedDevice = params.device;\n this._textureBinding = params.textureBinding ?? 'atlas';\n this._ownsDeviceSelection = !params.device;\n this._backendChoice = params.device ? 'webgpu' : params.backend ?? 'auto';\n this._sceneChangeDetector = new SceneChangeDetector();\n this.display = Display._create(this, params.canvas ?? createCanvas());\n }\n /** Initializes once; concurrent/repeated calls share the result. */\n init(): Promise<EngineInfo> {\n return this._initPromise ??= (async () => {\n if (this._disposed) throw new Error('Engine is disposed.');\n if (this._pipelineInitError && !this._ownsDeviceSelection) throw this._pipelineInitError;\n const revision = this._deviceRevision;\n if (this._contextRestore) await this._contextRestore.promise;\n if (this._disposed) throw new Error('Engine is disposed.');\n await this._initPipeline(this._backendChoice !== 'webgl' && !this._recoverWebGL);\n if (revision !== this._deviceRevision) throw this._deviceLossError;\n if (this._pipelineInitError) throw this._pipelineInitError;\n if (this._disposed) { this._pipeline?.dispose(); throw new Error('Engine is disposed.'); }\n const gl = this._webglRenderer?.gl, limits = this._gpuDevice?.limits;\n this._info = { backend: this._gpuDevice ? 'webgpu' : 'webgl', adapterName: this._adapterName(), webgpuFallbackReason: this._webgpuFallbackReason,\n limits: { maxTextureArrayLayers: limits?.maxTextureArrayLayers ?? gl?.getParameter(gl.MAX_ARRAY_TEXTURE_LAYERS), maxTextureDimension2D: limits?.maxTextureDimension2D ?? gl?.getParameter(gl.MAX_TEXTURE_SIZE) } };\n this._upload();\n return this._info;\n })();\n }\n /** Initialization info. Default undefined until init resolves. */ get info() { return this._info; }\n /** Active backend. Default undefined until initialization completes. */ get backend() { return this._info?.backend; }\n /** GPU device. Default undefined before initialization and on WebGL. */ get device() { return this._gpuDevice; }\n /** Subscribes to shared progress/errors/device loss; returns unsubscribe. */\n on<K extends keyof EngineEvents>(event: K, listener: (value: EngineEvents[K]) => void): () => void { return this._events.on(event, listener); }\n\n /** The sole external edit detection/commit point. Returns whether inputs changed. */\n update(): boolean {\n if (this._disposed) throw new Error('Engine is disposed.');\n this._lastError = this._pipelineInitError;\n let changed = false, resetTiming = false;\n const cameraFields = this.camera ? snapshotFields(this.camera) : [];\n if (this.camera !== this._sourceCamera || !snapshotsEqual(cameraFields, this._cameraFields)) {\n this._sourceCamera = this.camera; this._cameraFields = cameraFields;\n this._committedCamera = this.camera ? cameraSnapshot(this.camera) : undefined; this._cameraRevision++; changed = true;\n }\n const bvhSettings = engineSettingsKey(this, 'bvh');\n const force = bvhSettings !== this._lastBvhSettings || textureBudget(this) !== this._lastBudget;\n if (this.scene !== this._sourceScene || force) this._sceneChangeDetector.reset();\n if (this.scene) {\n validateSceneLights(this.scene.lights, error => this._notifyError(error));\n ensureMeshGeometryAttributes(this.scene.meshes);\n const changes = this._sceneChangeDetector.detect(this.scene);\n resetTiming = changes.meshes === 'full' || this.scene !== this._sourceScene || force;\n if (changes.meshes !== 'none' || changes.lights || changes.background || this.scene !== this._sourceScene || force) {\n this._committedScene = this._snapshot.capture(this.scene, changes);\n if (changes.meshes === 'full' || force || this.scene !== this._sourceScene) this._pendingMeshes = 'full';\n else if (changes.meshes === 'incremental' && this._pendingMeshes !== 'full') this._pendingMeshes = 'incremental';\n for (const mesh of changes.transforms) this._pendingTransforms.add(this._snapshot.mirror(mesh));\n for (const mesh of changes.colors) this._pendingColors.add(this._snapshot.mirror(mesh));\n for (const geometry of changes.geometries) this._pendingGeometries.add(this._snapshot.mirror(geometry));\n for (const material of changes.materials) this._pendingMaterials.add(this._snapshot.mirror(material));\n this._pendingLights ||= changes.lights;\n this._pendingBackground ||= changes.background;\n this._sceneRevision++; changed = true;\n }\n this._sceneChangeDetector.commit();\n } else if (this._sourceScene) { this._committedScene = undefined; this._pendingMeshes = 'full'; this._pendingLights = true; this._pendingBackground = true; this._sceneRevision++; changed = true; }\n this._sourceScene = this.scene; this._lastBvhSettings = bvhSettings; this._lastBudget = textureBudget(this);\n if (!this._pipeline) void this.init().catch(() => {});\n if (changed) for (const render of this._renders) render._inputsChanged(resetTiming);\n this._upload();\n return changed;\n }\n private _upload() {\n const pipeline = this._pipeline;\n if (!pipeline || this._disposed || this._bvhPreparation || this._uploadedRevision === this._sceneRevision) return;\n const scene = this._committedScene ?? { meshes: [], lights: [] };\n if (this._needsBVHPreparation(scene.meshes)) {\n const task = this.prepare(scene); this._bvhPreparation = task;\n void task.then(() => { if (this._bvhPreparation === task) this._bvhPreparation = undefined; this._upload(); }, error => { if (this._bvhPreparation === task) this._bvhPreparation = undefined; this._notifyError(error); });\n return;\n }\n const budgetChanged = pipeline.setTextureAtlasBudget(this._lastBudget >= 0 ? this._lastBudget : textureBudget(this));\n if (this._pendingMeshes !== 'none' || budgetChanged) pipeline.setMeshes(scene.meshes, this._pendingMeshes === 'full' || budgetChanged ? undefined : {\n transforms: [...this._pendingTransforms], colors: [...this._pendingColors], geometries: [...this._pendingGeometries], materials: [...this._pendingMaterials]\n });\n if (this._pendingLights) pipeline.setLights(scene.lights);\n if (this._pendingBackground) pipeline.setBackground(scene.background);\n this._pendingMeshes = 'none'; this._pendingLights = false; this._pendingBackground = false;\n this._pendingTransforms.clear(); this._pendingColors.clear(); this._pendingGeometries.clear(); this._pendingMaterials.clear();\n this._uploadedRevision = this._sceneRevision;\n }\n private _bvhConfig(): BvhBuildConfig { return bvhConfig(this); }\n /** Builds static CPU BVHs for this scene without replacing GPU inputs. Options default undefined. */\n prepare(scene: Scene, options: PrepareOptions = {}): Promise<void> {\n const revision = this._bvhPreparationRevision;\n const preparation = this._bvhPreparationTail.then(async () => {\n const isCancelled = () => revision !== this._bvhPreparationRevision || options.signal?.aborted === true;\n if (isCancelled()) return;\n const meshes = scene.meshes;\n const useWorker = canUseBvhWorker() && !this._bvhWorkerUnavailable;\n if (useWorker) {\n const count = workerCount(this);\n if (this._bvhWorkerPool?.size !== count) {\n this._bvhWorkerPool?.dispose();\n this._bvhWorkerPool = new BvhWorkerPool(count);\n }\n }\n const config = this._bvhConfig();\n const result = await prepareStaticBvhs(meshes, {\n config,\n ...config,\n builder: this.bvhBuilder === 'tinybvh' && !this._tinyBvhUnavailable ? 'tinybvh' : 'builtin',\n useWorker, workerPool: this._bvhWorkerPool, isCancelled,\n rebuild: false, onProgress: progress => {\n if (this._bvhPreparation === preparation) this._events.emit('progress', {stage: 'bvh', progress});\n options.onProgress?.(progress);\n }\n });\n if (isCancelled()) return;\n if (result.workerUnavailable && !this._bvhWorkerUnavailable) {\n this._bvhWorkerUnavailable = true;\n this._bvhWorkerPool?.dispose();\n this._bvhWorkerPool = undefined;\n console.warn('BVH preparation failed; falling back to the calling-thread BVH builder.');\n }\n if (result.tinyBvhUnavailable && !this._tinyBvhUnavailable) {\n this._tinyBvhUnavailable = true;\n console.warn('BVH preparation failed; falling back to the built-in BVH builder.');\n }\n result.failedMeshes.forEach(mesh => {\n this._bvhPreparedGeometry.set(mesh, [mesh.geometry, mesh.geometry.version]);\n });\n\n this._lastBvhBuild = { geometryCount: result.geometryCount, bvhTimeMs: result.bvhTimeMs };\n });\n this._bvhPreparationTail = preparation.catch(() => undefined);\n const signal = options.signal;\n if (!signal) return preparation;\n return new Promise<void>((resolve, reject) => {\n const aborted = () => reject(signal.reason ?? new DOMException('BVH preparation aborted', 'AbortError'));\n if (signal.aborted) { aborted(); return; }\n signal.addEventListener('abort', aborted, { once: true });\n preparation.then(resolve, reject).finally(() => signal.removeEventListener('abort', aborted));\n });\n }\n\n private _needsBVHPreparation(meshes: Mesh[]) {\n if (this._bvhPreparation) return true;\n if ((this.bvhBuilder !== 'tinybvh' || this._tinyBvhUnavailable) &&\n (!canUseBvhWorker() || this._bvhWorkerUnavailable)) {\n return meshes.some(mesh => !!getGeometryBvh(getPreparedMeshGeometry(mesh)) && meshNeedsStaticBvh(mesh, this._bvhConfig()));\n }\n return meshes.some((mesh) => {\n const prepared = this._bvhPreparedGeometry.get(mesh);\n const attempted = prepared?.[0] === mesh.geometry &&\n prepared[1] === mesh.geometry.version;\n return !attempted && meshNeedsStaticBvh(mesh, this._bvhConfig());\n });\n }\n\n private async _initPipeline(preferWebGPU: boolean) {\n let gpuCreated = false;\n try {\n\n this._events.emit('progress', {stage: 'device', progress: 0});\n this._pipelineInitError = undefined;\n if (preferWebGPU && (this._suppliedDevice || (typeof navigator !== 'undefined' && navigator.gpu))) {\n try {\n const gpu = typeof navigator !== 'undefined' ? navigator.gpu : undefined;\n const shared = this._suppliedDevice ? undefined : await sharedDevice(gpu!, this._textureBinding);\n const gpuDevice = this._suppliedDevice ?? shared!.device;\n const gpuAdapterInfo = this._suppliedDevice\n ? (gpuDevice as GPUDevice & {adapterInfo?: GPUAdapterInfo}).adapterInfo : shared?.adapterInfo;\n const materialTextures: MaterialTextureSelection = {requested: this._textureBinding};\n if (this._textureBinding === 'auto') {\n const support = resourceTableFeature(gpuDevice.features);\n materialTextures.fallbackReason = shared?.fallbackReason ?? (support ? await probeBindless(gpuDevice, support) : 'Resource-table feature is not enabled on this device.');\n if (!materialTextures.fallbackReason) materialTextures.support = support;\n }\n if (this._disposed) return;\n validateDevice(gpuDevice);\n this._gpuAdapterInfo = gpuAdapterInfo ?? undefined;\n this._gpuDevice = gpuDevice;\n this._pipeline = makeWGPURenderTargets(this.display.canvas, gpuDevice, {\n presentationFormat: gpu?.getPreferredCanvasFormat() ?? 'bgra8unorm', materialTextures\n });\n this._watchDevice(gpuDevice);\n gpuCreated = true;\n } catch (e) {\n if (this._backendChoice === 'webgpu') throw e;\n this._webgpuFallbackReason = e instanceof Error ? e.message : String(e);\n this._gpuDevice = undefined;\n this._gpuAdapterInfo = undefined;\n }\n }\n if (!gpuCreated) {\n if (this._backendChoice === 'webgpu') throw new Error('WebGPU is not available in this environment');\n if (preferWebGPU && !this._webgpuFallbackReason) {\n this._webgpuFallbackReason = 'WebGPU is not available in this environment';\n }\n this._webglRenderer = new WebGLRenderer({\n canvas: this.display.canvas,\n alpha: true,\n depth: true,\n stencil: false,\n antialias: false,\n pixelRatio: 1,\n preserveDrawingBuffer: true,\n // PENDING\n premultipliedAlpha: false,\n parallelShaderCompile: true,\n powerPreference: 'high-performance'\n });\n\n this._pipeline = makeWebGLRenderTargets(this._webglRenderer);\n if (!this._webglListening) {\n this._webglListening = true;\n this.display.canvas.addEventListener('webglcontextlost', this._onContextLost);\n this.display.canvas.addEventListener('webglcontextrestored', this._onContextRestored);\n }\n this._recoverWebGL = false;\n }\n\n\n } catch (error) {\n this._pipelineInitError = error instanceof Error ? error : new Error(String(error));\n this._lastError = this._pipelineInitError;\n this._notifyError(this._pipelineInitError);\n } finally {\n\n this._events.emit('progress', {stage: 'device', progress: 1});\n }\n }\n\n private _onContextLost = (event: Event) => {\n event.preventDefault();\n if (this._disposed || this._webglLost) return;\n this._webglLost = true; this._recoverWebGL = true;\n let resolve!: () => void, reject!: (error: Error) => void;\n const promise = new Promise<void>((done, fail) => {resolve = done; reject = fail;});\n void promise.catch(() => {});\n this._contextRestore = {promise, resolve, reject};\n const error = new Error(`WebGL context lost: ${(event as WebGLContextEvent).statusMessage || 'context is unavailable'}`);\n this._invalidateDevice(error, true);\n this._events.emit('devicelost', {reason: 'webglcontextlost', recovering: true});\n };\n private _onContextRestored = () => {\n if (this._disposed || !this._webglLost) return;\n this._webglLost = false;\n const restore = this._contextRestore; this._contextRestore = undefined; restore?.resolve();\n };\n private _watchDevice(device: GPUDevice) {\n void device.lost.then(info => {\n if (this._disposed || this._gpuDevice !== device) return;\n const recovering = this._ownsDeviceSelection;\n const error = new Error(`WebGPU device lost (${info.reason}): ${info.message || 'device is unavailable'}`);\n this._invalidateDevice(error, recovering);\n this._events.emit('devicelost', {reason: info.reason, recovering});\n if (!recovering) this._notifyError(error);\n });\n }\n private _invalidateDevice(error: Error, recovering: boolean) {\n this._deviceLossError = error; this._deviceRevision++;\n this._lossController?.abort(error); this._lossController = undefined;\n for (const render of this._renders) render._deviceLost(recovering);\n this._pipeline?.dispose(); this._pipeline = undefined;\n this._webglRenderer?.dispose(); this._webglRenderer = undefined;\n this._gpuDevice = undefined; this._gpuAdapterInfo = undefined;\n this._info = undefined; this._initPromise = undefined;\n this._pipelineInitError = recovering ? undefined : error; this._lastError = error;\n this._presented = undefined; this._shaderProgress = '';\n this._uploadedRevision = -1; this._pendingMeshes = 'full'; this._pendingLights = true; this._pendingBackground = true;\n this._sceneRevision++;\n this._customPrepared = new WeakMap();\n for (const filter of [...this._denoisers]) {\n const entry = this._denoiserEntries.get(filter); if (entry) entry.references = 1;\n this._releaseDenoiser(filter);\n }\n this._denoiserCache.clear();\n }\n /** Replaces a caller-owned device after validation. Only available on engines\n * constructed with device; the next update/refine uploads the committed scene.\n */\n async setDevice(device: GPUDevice): Promise<void> {\n if (this._disposed) throw new Error('Engine is disposed.');\n if (this._ownsDeviceSelection) throw new Error('setDevice requires an engine constructed with device.');\n try { validateDevice(device); }\n catch (error) {this._lastError = this._notifyError(error); throw error;}\n if (this._gpuDevice === device && !this._pipelineInitError) return;\n this._invalidateDevice(new Error('WebGPU device replaced during converge.'), true);\n this._suppliedDevice = device;\n }\n /** @internal Device loss rejects pending waits without relying on driver completion. */\n _awaitDevice<T>(work: Promise<T>): Promise<T> {\n const signal = (this._lossController ??= new AbortController()).signal;\n return new Promise((resolve, reject) => {\n const lost = () => reject(signal.reason);\n signal.addEventListener('abort', lost, {once: true});\n work.then(resolve, reject).finally(() => signal.removeEventListener('abort', lost));\n });\n }\n /** @internal */ get _deviceGeneration() { return this._deviceRevision; }\n /** @internal */ get _lostError() { return this._deviceLossError; }\n\n private _adapterName() {\n if (this._gpuAdapterInfo) return this._gpuAdapterInfo.description || this._gpuAdapterInfo.vendor || 'WebGPU';\n const gl = this._webglRenderer?.gl, extension = gl?.getExtension('WEBGL_debug_renderer_info');\n return extension && gl ? gl.getParameter(extension.UNMASKED_RENDERER_WEBGL) : this._webglRenderer ? 'WebGL 2' : this._gpuDevice ? 'WebGPU' : '';\n }\n /** @internal */ _reportShaderProgress() {\n const compilation = this._pipeline?.getDiagnostics().shaderCompilation;\n if (!compilation) return;\n const key = `${compilation.status}/${compilation.completedPipelineCount}/${compilation.pipelineCount}`;\n if (key === this._shaderProgress) return;\n this._shaderProgress = key;\n this._events.emit('progress', {stage: 'shaders', progress: compilation.pipelineCount ? compilation.completedPipelineCount / compilation.pipelineCount : 1});\n }\n /** Current shared preparation and resident target statistics. Default undefined before any work. */\n getDiagnostics(): EngineDiagnostics | undefined {\n if (!this._pipeline && !this._lastBvhBuild) return;\n const values = this._pipeline?.getDiagnostics();\n const materialTextures = values?.materialTextures ?? (this._pipeline ? {\n requested: this._textureBinding, active: 'atlas' as const,\n fallbackReason: this._textureBinding === 'auto' ? 'Bindless textures require a supported WebGPU device.' : undefined,\n textureCount: values?.textureAtlas?.textureCount ?? 0, estimatedBytes: values?.textureAtlas?.estimatedBytes ?? 0,\n scale: values?.textureAtlas?.scale ?? 1, metadataBytes: 0, resourceTableCapacity: 0, retiredBytes: 0\n } : undefined);\n return { ...values, materialTextures, bvh: {...values?.bvh, lastBuild: this._lastBvhBuild}, backend: this.backend, adapterName: this._adapterName(), width: this.display.canvas.width, height: this.display.canvas.height,\n lastError: this.lastError?.message, webgpuFallbackReason: this._webgpuFallbackReason,\n presentedTarget: this._presented?.label, presentedComplete: this._presented?.presentationComplete ?? false };\n }\n /** Queries a 7×7 depth grid using the committed engine camera. Default undefined until GPU data is ready. */\n async readDepthSamples(area: DepthSampleArea): Promise<Float32Array | undefined> {\n packDepthSampleArea(area, 1);\n if (!this._ready || !this._committedCamera || this._readingDepth) return;\n this._readingDepth = true;\n try {\n const camera = cameraSnapshot(this._committedCamera);\n camera.aspect ??= this.display.canvas.width / this.display.canvas.height;\n const result = await this._pipeline!.readDepthSamples(camera, area);\n return this._disposed ? undefined : result;\n }\n finally { this._readingDepth = false; }\n }\n /** Releases all renders, shared resources, CPU workers and owned denoisers. */\n dispose() {\n if (this._disposed) return;\n this._disposed = true; this._bvhPreparationRevision++;\n this._lossController?.abort(new Error('Engine is disposed.')); this._lossController = undefined;\n this._contextRestore?.reject(new Error('Engine is disposed.')); this._contextRestore = undefined;\n if (this._webglListening) {\n this.display.canvas.removeEventListener('webglcontextlost', this._onContextLost);\n this.display.canvas.removeEventListener('webglcontextrestored', this._onContextRestored);\n }\n for (const render of [...this._renders]) render.dispose();\n this._pipeline?.dispose(); this._pipeline = undefined; this._webglRenderer?.dispose(); this._bvhWorkerPool?.dispose();\n for (const denoiser of [...this._denoisers]) { const entry = this._denoiserEntries.get(denoiser); if (entry) entry.references = 1; this._releaseDenoiser(denoiser); }\n this._denoiserCache.clear();\n this._weights.clear(); this._events.clear();\n }\n /** @internal */ get _initializationError() { return this._pipelineInitError; }\n /** @internal */ get _ready() { return !!this._pipeline && this._uploadedRevision === this._sceneRevision && !!this._committedScene && !!this._committedCamera && !this._disposed; }\n /** @internal */ get _inputs() { return {scene: this._sceneRevision, camera: this._cameraRevision, value: this._committedCamera}; }\n /** @internal */ _register(render: Render) { if (this._disposed) throw new Error('Engine is disposed.'); this._renders.add(render); }\n /** @internal */ _unregister(render: Render) { this._renders.delete(render); }\n /** @internal */ _createTarget() { return this._pipeline?.createTarget(`render-${++this._targetCounter}`); }\n /** @internal */ _releaseTarget(target: RenderTarget) { if (this._presented === target) this._presented = undefined; this._pipeline?.releaseTarget(target); }\n /** @internal */ _present(target: RenderTarget) { target.activate(); target.present(); this._presented = target; }\n /** @internal */ _notifyError(value: unknown): Error {\n const error = value instanceof Error ? value : new Error(String(value));\n if (!this._loggedErrorMessages.has(error.message)) { this._loggedErrorMessages.add(error.message); console.error(`Path tracing failed: ${error.message}`, error); }\n if (!this._reportedErrors.has(error)) { this._reportedErrors.add(error); this._events.emit('error', error); }\n return error;\n }\n /** @internal */ _getWeights(url: string, load: () => Promise<ArrayBuffer>) {\n let pending = this._weights.get(url);\n if (!pending) { pending = load(); this._weights.set(url, pending); void pending.catch(() => { if (this._weights.get(url) === pending) this._weights.delete(url); }); }\n return pending;\n }\n /** @internal */ _retainDenoiser<T extends OwnedDenoiser>(key: string, create: () => T): T {\n let entry = this._denoiserCache.get(key);\n if (!entry?.value) {\n const value = this._ownDenoiser(create());\n const next = {key, references: 0, value};\n this._denoiserCache.set(key, next); this._denoiserEntries.set(value, next); entry = next;\n }\n entry.references++; return entry.value as T;\n }\n /** @internal */ async _acquireDenoiser(key: string, create: () => Promise<Extract<OwnedDenoiser, {kind: 'oidn'}>>): Promise<Extract<OwnedDenoiser, {kind: 'oidn'}>> {\n let entry = this._denoiserCache.get(key);\n if (!entry) {\n const next: {key: string; references: number; value?: OwnedDenoiser; pending?: Promise<OwnedDenoiser>} = {key, references: 0};\n const revision = this._deviceRevision;\n next.pending = create().then(filter => {\n if (revision !== this._deviceRevision) { this._disposeDenoiser(filter); throw this._deviceLossError; }\n next.value = this._ownDenoiser(filter); this._denoiserEntries.set(filter, next); return filter; });\n this._denoiserCache.set(key, next); entry = next;\n }\n entry.references++;\n try { return (entry.value ?? await entry.pending!) as Extract<OwnedDenoiser, {kind: 'oidn'}>; }\n catch (error) { entry.references--; if (this._denoiserCache.get(key) === entry) this._denoiserCache.delete(key); throw error; }\n }\n /** @internal */ _ownDenoiser<T extends OwnedDenoiser>(denoiser: T): T {\n if (this._disposed) { this._disposeDenoiser(denoiser); throw new Error('Engine is disposed.'); }\n this._denoisers.add(denoiser); return denoiser;\n }\n /** @internal */ _releaseDenoiser(denoiser: OwnedDenoiser) {\n const entry = this._denoiserEntries.get(denoiser);\n if (entry && --entry.references > 0) return;\n if (entry && this._denoiserCache.get(entry.key) === entry) this._denoiserCache.delete(entry.key);\n this._denoiserEntries.delete(denoiser);\n if (!this._denoisers.delete(denoiser)) return;\n this._disposeDenoiser(denoiser);\n }\n private _disposeDenoiser(denoiser: OwnedDenoiser) {\n if (denoiser.kind === 'oidn') { denoiser.denoiser.auxiliaryDenoisers?.albedo.dispose(); denoiser.denoiser.auxiliaryDenoisers?.normal.dispose(); }\n denoiser.denoiser.dispose();\n }\n /** @internal Called only while holding the shared inference lease. */\n async _prepareCustomDenoiser(denoiser: Denoiser, width: number, height: number) {\n const device = this.device;\n if (!device) throw new Error('Custom denoising requires WebGPU.');\n const previous = this._customPrepared.get(denoiser);\n if (previous?.device === device && previous.width === width && previous.height === height) return;\n await denoiser.prepare?.({device, width, height});\n this._customPrepared.set(denoiser, {device, width, height});\n }\n /** @internal */ _enqueueDenoise<T>(work: () => Promise<T>): Promise<T> {\n const task = this._denoiseTail.then(async () => {\n const device = this._gpuDevice, generation = this._deviceRevision;\n try { return await work(); }\n finally {\n // Cancelling tiled OIDN stops future tiles, not the commands already\n // submitted. Keep the shared scratch lease until those commands finish\n // so rapid edits cannot pile up inference or resize its inputs in flight.\n // A lost/disposed device must release the lease without waiting for a\n // queue that may never complete.\n if (device && device === this._gpuDevice && generation === this._deviceRevision && !this._disposed) {\n await this._awaitDevice(device.queue.onSubmittedWorkDone()).catch(() => {});\n }\n }\n });\n this._denoiseTail = task.catch(() => {}); return task;\n }\n}\n"]}
1
+ {"version":3,"file":"Engine.js","sourceRoot":"","sources":["../src/Engine.ts"],"names":[],"mappings":"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","sourcesContent":["import InstancedMesh from './scene/InstancedMesh.js';\nimport { bvhConfig, engineSettingsKey, workerCount, textureBudget } from './settings/engine.js';\nimport {createCanvas} from './util/canvas.js';\nimport Camera from './scene/Camera.js';\nimport {getRecommendedDeviceDescriptor, validateDevice} from './renderer/deviceRequirements.js';\nimport {probeBindless, resourceTableFeature, type MaterialTextureSelection} from './renderer/wgpuBindless.js';\nimport { cameraSnapshot } from './renderer/cameraSnapshot.js';\nimport type { Scene } from './scene/Scene.js';\nimport type Mesh from './scene/Mesh.js';\nimport type Geometry from './scene/Geometry.js';\nimport Display from './Display.js';\nimport type Render from './Render.js';\nimport { Events } from './util/events.js';\nimport { SceneChangeDetector, snapshotFields, snapshotsEqual } from './renderer/sceneChangeDetector.js';\nimport { CommittedScene } from './renderer/committedScene.js';\nimport { validateSceneLights } from './renderer/lightsUtil.js';\nimport { ensureMeshGeometryAttributes, meshNeedsStaticBvh, getPreparedMeshGeometry } from './renderer/prepareMeshBVH.js';\nimport { getGeometryBvh, type BvhBuildConfig } from './renderer/geometryBvh.js';\nimport { prepareStaticBvhs } from './renderer/staticBvhPreparation.js';\nimport { canUseBvhWorker, BvhWorkerPool, resolveBvhWorkerCount } from './renderer/bvhWorkerClient.js';\nimport { DEFAULT_MAX_TEXTURE_ARRAY_BYTES } from './renderer/MaterialTable.js';\nimport { packDepthSampleArea, type DepthSampleArea } from './renderer/depthQuery.js';\nimport { makeWGPURenderTargets } from './renderer/WGPURenderingPipeline.js';\nimport { makeWebGLRenderTargets } from './renderer/WebGLRenderingPipeline.js';\nimport { WebGLDevice as WebGLRenderer } from './renderer/webgl.js';\nimport type { RenderPipeline, RenderTarget } from './renderer/renderPipeline.js';\nimport type { RenderingDiagnostics } from './renderer/RenderingPipeline.js';\nimport type { TinyBvhLayout } from './tinybvh/TinyBvhBuilder.js';\nimport type {OwnedDenoiser} from './renderer/ownedDenoiser.js';\nimport type {Denoiser} from './Render.js';\nexport type { DepthSampleArea } from './renderer/depthQuery.js';\n\n/** BLAS implementation; default builtin. */\nexport type BVHBuilder = 'tinybvh' | 'builtin';\n/** Optional CPU preparation settings. */\nexport interface PrepareOptions {\n /** Completed BLAS fraction 0–1. Default undefined. */ onProgress?: (progress: number) => void;\n /** Cancels preparation. Default undefined. */ signal?: AbortSignal;\n}\n/** Engine construction settings. */\nexport interface EngineParams {\n /** Default display canvas. Default a new HTML canvas, or OffscreenCanvas without document. */ canvas?: HTMLCanvasElement | OffscreenCanvas;\n /** Backend selection. Default auto, with WebGL fallback. webgpu requires WebGPU. */ backend?: 'auto' | 'webgpu' | 'webgl';\n /** Caller-owned WebGPU device. Default undefined uses a shared device. Implies webgpu; incompatible with webgl. */ device?: GPUDevice;\n /** Material texture bindings. Default atlas; auto tries WebGPU bindless textures and falls back to atlas when unavailable. Fixed at construction. */ textureBinding?: 'atlas' | 'auto';\n}\n/** Material-atlas device limits. */\nexport interface TextureAtlasLimits { maxTextureArrayLayers: number; maxTextureDimension2D: number; }\n/** Initialization result. */\nexport interface EngineInfo {\n backend: 'webgpu' | 'webgl'; adapterName: string; webgpuFallbackReason?: string; limits: TextureAtlasLimits;\n}\n/** Device and target diagnostics; Per-target GPU bytes exclude shared scene, temporary passes and driver costs. */\nexport interface EngineDiagnostics extends RenderingDiagnostics {\n backend: 'webgpu' | 'webgl' | undefined; adapterName: string;\n width: number; height: number; lastError?: string; webgpuFallbackReason?: string;\n}\ninterface EngineEvents {\n progress: { stage: 'device' | 'bvh' | 'shaders'; progress: number };\n error: Error;\n devicelost: { reason: string; recovering: boolean };\n}\nconst CANCELLED_DENOISE_GRACE_MS = 10000;\ninterface SharedDevice {device: GPUDevice; adapterInfo?: GPUAdapterInfo; fallbackReason?: string;}\nconst sharedDevices = new Map<string, Promise<SharedDevice>>();\nasync function sharedDevice(gpu: GPU, mode: 'atlas' | 'auto'): Promise<SharedDevice> {\n let request = sharedDevices.get(mode);\n if (!request) {\n request = (async () => {\n let adapter = await gpu.requestAdapter({powerPreference: 'high-performance'}) ?? await gpu.requestAdapter();\n if (!adapter) throw new Error('No WebGPU adapter is available');\n const descriptor = getRecommendedDeviceDescriptor(adapter);\n const support = mode === 'auto' ? resourceTableFeature(adapter.features) : undefined;\n let device: GPUDevice, fallbackReason: string | undefined;\n try {\n device = await adapter.requestDevice(support ? {...descriptor, requiredFeatures: [...descriptor.requiredFeatures ?? [], support.feature]} : descriptor);\n } catch (error) {\n if (!support) throw error;\n fallbackReason = error instanceof Error ? error.message : String(error);\n const retry = await gpu.requestAdapter({powerPreference: 'high-performance'}) ?? await gpu.requestAdapter();\n if (!retry) throw new Error('No WebGPU adapter is available for atlas fallback');\n device = await retry.requestDevice(getRecommendedDeviceDescriptor(retry));\n adapter = retry;\n }\n const current = request;\n void device.lost.then(() => { if (sharedDevices.get(mode) === current) sharedDevices.delete(mode); });\n return {device, adapterInfo: (adapter as GPUAdapter & {info?: GPUAdapterInfo}).info, fallbackReason};\n })();\n sharedDevices.set(mode, request);\n const current = request;\n void request.catch(() => { if (sharedDevices.get(mode) === current) sharedDevices.delete(mode); });\n }\n return request;\n}\n\n/** Shared device, committed scene/camera, CPU preparation and denoiser ownership. */\nexport default class Engine {\n /** Source scene, accepted only by update(). Default undefined. */ scene: Scene | undefined;\n /** Source camera, accepted only by update(). Default undefined. */ camera: Camera | undefined;\n /** Default canvas and display settings. */ readonly display: Display;\n /** Static BLAS builder. Default builtin. */ bvhBuilder: BVHBuilder = 'builtin';\n /** Static BLAS layout. Default bvh2; dynamic geometry uses bvh2. */ bvhLayout: TinyBvhLayout = 'bvh2';\n /** Enable TinyBVH spatial splits. Default false. */ bvhSpatialSplits = false;\n /** Material texture budget in bytes. Default 384 MiB. */ textureAtlasBudgetBytes = DEFAULT_MAX_TEXTURE_ARRAY_BYTES;\n /** Maximum CPU BVH workers. Default auto (hardware concurrency minus one, clamped 1–4). */\n get bvhWorkerCount(): number | 'auto' { return this._bvhWorkerCount; }\n set bvhWorkerCount(count: number | 'auto') { resolveBvhWorkerCount(count); this._bvhWorkerCount = count; }\n private _bvhWorkerCount: number | 'auto' = 'auto';\n private _bvhWorkerPool?: BvhWorkerPool;\n private _bvhPreparationRevision = 0;\n private _bvhPreparation?: Promise<void>;\n private _bvhPreparationController?: AbortController;\n private _bvhFailedRevision = -1;\n private _bvhPreparationTail: Promise<unknown> = Promise.resolve();\n private _tinyBvhUnavailable = false;\n private _bvhWorkerUnavailable = false;\n private _bvhPreparedGeometry = new WeakMap<Mesh, [Geometry, number]>();\n private _lastBvhBuild?: { geometryCount: number; bvhTimeMs: number };\n private _lastBvhSettings = '';\n private _lastBudget = -1;\n private _shaderProgress = '';\n private _events = new Events<EngineEvents>();\n private _pipeline?: RenderPipeline;\n private _webglRenderer?: WebGLRenderer;\n private _gpuDevice?: GPUDevice;\n private _suppliedDevice?: GPUDevice;\n private readonly _ownsDeviceSelection: boolean;\n private _deviceRevision = 0;\n private _lossController?: AbortController;\n private _deviceLossError?: Error;\n private _webglListening = false;\n private _webglLost = false;\n private _recoverWebGL = false;\n private _contextRestore?: {promise: Promise<void>; resolve: () => void; reject: (error: Error) => void};\n private _gpuAdapterInfo?: GPUAdapterInfo;\n private _backendChoice: NonNullable<EngineParams['backend']>;\n private readonly _textureBinding: 'atlas' | 'auto';\n private _initPromise?: Promise<EngineInfo>;\n private _info?: EngineInfo;\n private _pipelineInitError?: Error;\n private _webgpuFallbackReason?: string;\n private _reportedErrors = new WeakSet<Error>();\n private _loggedErrorMessages = new Set<string>();\n private _sceneChangeDetector: SceneChangeDetector;\n private _snapshot = new CommittedScene();\n private _sourceScene?: Scene;\n private _committedScene?: Scene;\n private _sourceCamera?: Camera;\n private _committedCamera?: Camera;\n private _cameraFields: unknown[] = [];\n private _sceneRevision = 0;\n private _cameraRevision = 0;\n private _uploadedRevision = -1;\n private _pendingMeshes: 'none' | 'incremental' | 'full' = 'full';\n private _pendingTransforms = new Set<Mesh>();\n private _pendingColors = new Set<InstancedMesh>();\n private _pendingGeometries = new Set<Geometry>();\n private _pendingMaterials = new Set<import('./scene/OpenPBRMaterial.js').default>();\n private _pendingLights = true;\n private _pendingBackground = true;\n private _disposed = false;\n private _readingDepth = false;\n private _renders = new Set<Render>();\n private _targetCounter = 0;\n private _presented?: RenderTarget;\n private _denoisers = new Set<OwnedDenoiser>();\n private _denoiserCache = new Map<string, {references: number; value?: OwnedDenoiser; pending?: Promise<OwnedDenoiser>}>();\n private _denoiserEntries = new WeakMap<OwnedDenoiser, {key: string; references: number; value?: OwnedDenoiser; pending?: Promise<OwnedDenoiser>}>();\n private _weights = new Map<string, Promise<ArrayBuffer>>();\n private _customPrepared = new WeakMap<Denoiser, {device: GPUDevice; width: number; height: number}>();\n private _denoiseTail: Promise<unknown> = Promise.resolve();\n private _lastError: Error | undefined;\n /** Most recent synchronous engine/render failure. Default undefined. */\n get lastError() { return this._lastError; }\n /** @internal */ _setRenderError(error?: Error) { this._lastError = error ?? this._pipelineInitError; }\n\n constructor(params: EngineParams = {}) {\n if (params.device && params.backend === 'webgl') throw new Error('A supplied GPUDevice cannot use the webgl backend.');\n this._suppliedDevice = params.device;\n this._textureBinding = params.textureBinding ?? 'atlas';\n this._ownsDeviceSelection = !params.device;\n this._backendChoice = params.device ? 'webgpu' : params.backend ?? 'auto';\n this._sceneChangeDetector = new SceneChangeDetector();\n this.display = Display._create(this, params.canvas ?? createCanvas());\n }\n /** Initializes once; concurrent/repeated calls share the result. */\n init(): Promise<EngineInfo> {\n return this._initPromise ??= (async () => {\n if (this._disposed) throw new Error('Engine is disposed.');\n if (this._pipelineInitError && !this._ownsDeviceSelection) throw this._pipelineInitError;\n const revision = this._deviceRevision;\n if (this._contextRestore) await this._contextRestore.promise;\n if (this._disposed) throw new Error('Engine is disposed.');\n await this._initPipeline(this._backendChoice !== 'webgl' && !this._recoverWebGL);\n if (revision !== this._deviceRevision) throw this._deviceLossError;\n if (this._pipelineInitError) throw this._pipelineInitError;\n if (this._disposed) { this._pipeline?.dispose(); throw new Error('Engine is disposed.'); }\n const gl = this._webglRenderer?.gl, limits = this._gpuDevice?.limits;\n this._info = { backend: this._gpuDevice ? 'webgpu' : 'webgl', adapterName: this._adapterName(), webgpuFallbackReason: this._webgpuFallbackReason,\n limits: { maxTextureArrayLayers: limits?.maxTextureArrayLayers ?? gl?.getParameter(gl.MAX_ARRAY_TEXTURE_LAYERS), maxTextureDimension2D: limits?.maxTextureDimension2D ?? gl?.getParameter(gl.MAX_TEXTURE_SIZE) } };\n this._upload();\n return this._info;\n })();\n }\n /** Initialization info. Default undefined until init resolves. */ get info() { return this._info; }\n /** Active backend. Default undefined until initialization completes. */ get backend() { return this._info?.backend; }\n /** GPU device. Default undefined before initialization and on WebGL. */ get device() { return this._gpuDevice; }\n /** Subscribes to shared progress/errors/device loss; returns unsubscribe. */\n on<K extends keyof EngineEvents>(event: K, listener: (value: EngineEvents[K]) => void): () => void { return this._events.on(event, listener); }\n\n /** The sole external edit detection/commit point. Returns whether inputs changed. */\n update(): boolean {\n if (this._disposed) throw new Error('Engine is disposed.');\n this._lastError = this._pipelineInitError;\n let changed = false, resetTiming = false;\n const cameraFields = this.camera ? snapshotFields(this.camera) : [];\n if (this.camera !== this._sourceCamera || !snapshotsEqual(cameraFields, this._cameraFields)) {\n this._sourceCamera = this.camera; this._cameraFields = cameraFields;\n this._committedCamera = this.camera ? cameraSnapshot(this.camera) : undefined; this._cameraRevision++; changed = true;\n }\n const bvhSettings = engineSettingsKey(this, 'bvh');\n const force = bvhSettings !== this._lastBvhSettings || textureBudget(this) !== this._lastBudget;\n if (this.scene !== this._sourceScene || force) this._sceneChangeDetector.reset();\n if (this.scene) {\n validateSceneLights(this.scene.lights, error => this._notifyError(error));\n ensureMeshGeometryAttributes(this.scene.meshes);\n const changes = this._sceneChangeDetector.detect(this.scene);\n resetTiming = changes.meshes === 'full' || this.scene !== this._sourceScene || force;\n if (changes.meshes !== 'none' || changes.lights || changes.background || this.scene !== this._sourceScene || force) {\n this._committedScene = this._snapshot.capture(this.scene, changes);\n // Preparing meshes the next upload replaces would only delay that upload.\n if (changes.meshes === 'full' || force || this.scene !== this._sourceScene) { this._pendingMeshes = 'full'; this._bvhPreparationController?.abort(); }\n else if (changes.meshes === 'incremental' && this._pendingMeshes !== 'full') this._pendingMeshes = 'incremental';\n for (const mesh of changes.transforms) this._pendingTransforms.add(this._snapshot.mirror(mesh));\n for (const mesh of changes.colors) this._pendingColors.add(this._snapshot.mirror(mesh));\n for (const geometry of changes.geometries) this._pendingGeometries.add(this._snapshot.mirror(geometry));\n for (const material of changes.materials) this._pendingMaterials.add(this._snapshot.mirror(material));\n this._pendingLights ||= changes.lights;\n this._pendingBackground ||= changes.background;\n this._sceneRevision++; changed = true;\n }\n this._sceneChangeDetector.commit();\n } else if (this._sourceScene) { this._committedScene = undefined; this._pendingMeshes = 'full'; this._pendingLights = true; this._pendingBackground = true; this._sceneRevision++; changed = true; }\n this._sourceScene = this.scene; this._lastBvhSettings = bvhSettings; this._lastBudget = textureBudget(this);\n if (!this._pipeline) void this.init().catch(() => {});\n if (changed) for (const render of this._renders) render._inputsChanged(resetTiming);\n this._upload();\n return changed;\n }\n private _upload() {\n const pipeline = this._pipeline;\n if (!pipeline || this._disposed || this._bvhPreparation || this._uploadedRevision === this._sceneRevision) return;\n const scene = this._committedScene ?? { meshes: [], lights: [] };\n if (this._needsBVHPreparation(scene.meshes)) {\n const controller = this._bvhPreparationController = new AbortController();\n const task = this.prepare(scene, {signal: controller.signal, onProgress: progress => {\n if (this._bvhPreparationController === controller) this._events.emit('progress', {stage: 'bvh', progress});\n }});\n this._bvhPreparation = task;\n const finished = () => { if (this._bvhPreparation === task) this._bvhPreparation = undefined; };\n void task.then(() => { finished(); this._upload(); }, error => {\n finished();\n // Upload without prepared BVHs instead of retrying the same failure every frame.\n if (!controller.signal.aborted) { this._bvhFailedRevision = this._sceneRevision; this._notifyError(error); }\n this._upload();\n });\n return;\n }\n const budgetChanged = pipeline.setTextureAtlasBudget(this._lastBudget >= 0 ? this._lastBudget : textureBudget(this));\n if (this._pendingMeshes !== 'none' || budgetChanged) pipeline.setMeshes(scene.meshes, this._pendingMeshes === 'full' || budgetChanged ? undefined : {\n transforms: [...this._pendingTransforms], colors: [...this._pendingColors], geometries: [...this._pendingGeometries], materials: [...this._pendingMaterials]\n });\n if (this._pendingLights) pipeline.setLights(scene.lights);\n if (this._pendingBackground) pipeline.setBackground(scene.background);\n this._pendingMeshes = 'none'; this._pendingLights = false; this._pendingBackground = false;\n this._pendingTransforms.clear(); this._pendingColors.clear(); this._pendingGeometries.clear(); this._pendingMaterials.clear();\n this._uploadedRevision = this._sceneRevision;\n }\n private _bvhConfig(): BvhBuildConfig { return bvhConfig(this); }\n /** Builds static CPU BVHs for this scene without replacing GPU inputs. Options default undefined. */\n prepare(scene: Scene, options: PrepareOptions = {}): Promise<void> {\n const revision = this._bvhPreparationRevision;\n const preparation = this._bvhPreparationTail.then(async () => {\n const isCancelled = () => revision !== this._bvhPreparationRevision || options.signal?.aborted === true;\n if (isCancelled()) return;\n const meshes = scene.meshes;\n const useWorker = canUseBvhWorker() && !this._bvhWorkerUnavailable;\n if (useWorker) {\n const count = workerCount(this);\n if (this._bvhWorkerPool?.size !== count) {\n this._bvhWorkerPool?.dispose();\n this._bvhWorkerPool = new BvhWorkerPool(count);\n }\n }\n const config = this._bvhConfig();\n const result = await prepareStaticBvhs(meshes, {\n config,\n ...config,\n builder: this.bvhBuilder === 'tinybvh' && !this._tinyBvhUnavailable ? 'tinybvh' : 'builtin',\n useWorker, workerPool: this._bvhWorkerPool, isCancelled,\n rebuild: false, onProgress: options.onProgress\n });\n if (isCancelled()) return;\n if (result.workerUnavailable && !this._bvhWorkerUnavailable) {\n this._bvhWorkerUnavailable = true;\n this._bvhWorkerPool?.dispose();\n this._bvhWorkerPool = undefined;\n console.warn('BVH preparation failed; falling back to the calling-thread BVH builder.');\n }\n if (result.tinyBvhUnavailable && !this._tinyBvhUnavailable) {\n this._tinyBvhUnavailable = true;\n console.warn('BVH preparation failed; falling back to the built-in BVH builder.');\n }\n result.failedMeshes.forEach(mesh => {\n this._bvhPreparedGeometry.set(mesh, [mesh.geometry, mesh.geometry.version]);\n });\n\n this._lastBvhBuild = { geometryCount: result.geometryCount, bvhTimeMs: result.bvhTimeMs };\n });\n this._bvhPreparationTail = preparation.catch(() => undefined);\n const signal = options.signal;\n if (!signal) return preparation;\n return new Promise<void>((resolve, reject) => {\n const aborted = () => reject(signal.reason ?? new DOMException('BVH preparation aborted', 'AbortError'));\n if (signal.aborted) { aborted(); return; }\n signal.addEventListener('abort', aborted, { once: true });\n preparation.then(resolve, reject).finally(() => signal.removeEventListener('abort', aborted));\n });\n }\n\n private _needsBVHPreparation(meshes: Mesh[]) {\n if (this._bvhPreparation) return true;\n if (this._bvhFailedRevision === this._sceneRevision) return false;\n if ((this.bvhBuilder !== 'tinybvh' || this._tinyBvhUnavailable) &&\n (!canUseBvhWorker() || this._bvhWorkerUnavailable)) {\n return meshes.some(mesh => !!getGeometryBvh(getPreparedMeshGeometry(mesh)) && meshNeedsStaticBvh(mesh, this._bvhConfig()));\n }\n return meshes.some((mesh) => {\n const prepared = this._bvhPreparedGeometry.get(mesh);\n const attempted = prepared?.[0] === mesh.geometry &&\n prepared[1] === mesh.geometry.version;\n return !attempted && meshNeedsStaticBvh(mesh, this._bvhConfig());\n });\n }\n\n private async _initPipeline(preferWebGPU: boolean) {\n let gpuCreated = false;\n try {\n\n this._events.emit('progress', {stage: 'device', progress: 0});\n this._pipelineInitError = undefined;\n if (preferWebGPU && (this._suppliedDevice || (typeof navigator !== 'undefined' && navigator.gpu))) {\n try {\n const gpu = typeof navigator !== 'undefined' ? navigator.gpu : undefined;\n const shared = this._suppliedDevice ? undefined : await sharedDevice(gpu!, this._textureBinding);\n const gpuDevice = this._suppliedDevice ?? shared!.device;\n const gpuAdapterInfo = this._suppliedDevice\n ? (gpuDevice as GPUDevice & {adapterInfo?: GPUAdapterInfo}).adapterInfo : shared?.adapterInfo;\n const materialTextures: MaterialTextureSelection = {requested: this._textureBinding};\n if (this._textureBinding === 'auto') {\n const support = resourceTableFeature(gpuDevice.features);\n materialTextures.fallbackReason = shared?.fallbackReason ?? (support ? await probeBindless(gpuDevice, support) : 'Resource-table feature is not enabled on this device.');\n if (!materialTextures.fallbackReason) materialTextures.support = support;\n }\n if (this._disposed) return;\n validateDevice(gpuDevice);\n this._gpuAdapterInfo = gpuAdapterInfo ?? undefined;\n this._gpuDevice = gpuDevice;\n this._pipeline = makeWGPURenderTargets(this.display.canvas, gpuDevice, {\n presentationFormat: gpu?.getPreferredCanvasFormat() ?? 'bgra8unorm', materialTextures\n });\n this._watchDevice(gpuDevice);\n gpuCreated = true;\n } catch (e) {\n if (this._backendChoice === 'webgpu') throw e;\n this._webgpuFallbackReason = e instanceof Error ? e.message : String(e);\n this._gpuDevice = undefined;\n this._gpuAdapterInfo = undefined;\n }\n }\n if (!gpuCreated) {\n if (this._backendChoice === 'webgpu') throw new Error('WebGPU is not available in this environment');\n if (preferWebGPU && !this._webgpuFallbackReason) {\n this._webgpuFallbackReason = 'WebGPU is not available in this environment';\n }\n this._webglRenderer = new WebGLRenderer({\n canvas: this.display.canvas,\n alpha: true,\n depth: true,\n stencil: false,\n antialias: false,\n pixelRatio: 1,\n preserveDrawingBuffer: true,\n // PENDING\n premultipliedAlpha: false,\n parallelShaderCompile: true,\n powerPreference: 'high-performance'\n });\n\n this._pipeline = makeWebGLRenderTargets(this._webglRenderer);\n if (!this._webglListening) {\n this._webglListening = true;\n this.display.canvas.addEventListener('webglcontextlost', this._onContextLost);\n this.display.canvas.addEventListener('webglcontextrestored', this._onContextRestored);\n }\n this._recoverWebGL = false;\n }\n\n\n } catch (error) {\n this._pipelineInitError = error instanceof Error ? error : new Error(String(error));\n this._lastError = this._pipelineInitError;\n this._notifyError(this._pipelineInitError);\n } finally {\n\n this._events.emit('progress', {stage: 'device', progress: 1});\n }\n }\n\n private _onContextLost = (event: Event) => {\n event.preventDefault();\n if (this._disposed || this._webglLost) return;\n this._webglLost = true; this._recoverWebGL = true;\n let resolve!: () => void, reject!: (error: Error) => void;\n const promise = new Promise<void>((done, fail) => {resolve = done; reject = fail;});\n void promise.catch(() => {});\n this._contextRestore = {promise, resolve, reject};\n const error = new Error(`WebGL context lost: ${(event as WebGLContextEvent).statusMessage || 'context is unavailable'}`);\n this._invalidateDevice(error, true);\n this._events.emit('devicelost', {reason: 'webglcontextlost', recovering: true});\n };\n private _onContextRestored = () => {\n if (this._disposed || !this._webglLost) return;\n this._webglLost = false;\n const restore = this._contextRestore; this._contextRestore = undefined; restore?.resolve();\n };\n private _watchDevice(device: GPUDevice) {\n void device.lost.then(info => {\n if (this._disposed || this._gpuDevice !== device) return;\n const recovering = this._ownsDeviceSelection;\n const error = new Error(`WebGPU device lost (${info.reason}): ${info.message || 'device is unavailable'}`);\n this._invalidateDevice(error, recovering);\n this._events.emit('devicelost', {reason: info.reason, recovering});\n if (!recovering) this._notifyError(error);\n });\n }\n private _invalidateDevice(error: Error, recovering: boolean) {\n this._deviceLossError = error; this._deviceRevision++;\n this._lossController?.abort(error); this._lossController = undefined;\n for (const render of this._renders) render._deviceLost(recovering);\n this._pipeline?.dispose(); this._pipeline = undefined;\n this._webglRenderer?.dispose(); this._webglRenderer = undefined;\n this._gpuDevice = undefined; this._gpuAdapterInfo = undefined;\n this._info = undefined; this._initPromise = undefined;\n this._pipelineInitError = recovering ? undefined : error; this._lastError = error;\n this._presented = undefined; this._shaderProgress = '';\n this._uploadedRevision = -1; this._pendingMeshes = 'full'; this._pendingLights = true; this._pendingBackground = true;\n this._sceneRevision++;\n this._customPrepared = new WeakMap();\n for (const filter of [...this._denoisers]) {\n const entry = this._denoiserEntries.get(filter); if (entry) entry.references = 1;\n this._releaseDenoiser(filter);\n }\n this._denoiserCache.clear();\n }\n /** Replaces a caller-owned device after validation. Only available on engines\n * constructed with device; the next update/refine uploads the committed scene.\n */\n async setDevice(device: GPUDevice): Promise<void> {\n if (this._disposed) throw new Error('Engine is disposed.');\n if (this._ownsDeviceSelection) throw new Error('setDevice requires an engine constructed with device.');\n try { validateDevice(device); }\n catch (error) {this._lastError = this._notifyError(error); throw error;}\n if (this._gpuDevice === device && !this._pipelineInitError) return;\n this._invalidateDevice(new Error('WebGPU device replaced during converge.'), true);\n this._suppliedDevice = device;\n }\n /** @internal Device loss rejects pending waits without relying on driver completion. */\n _awaitDevice<T>(work: Promise<T>): Promise<T> {\n const signal = (this._lossController ??= new AbortController()).signal;\n return new Promise((resolve, reject) => {\n const lost = () => reject(signal.reason);\n signal.addEventListener('abort', lost, {once: true});\n work.then(resolve, reject).finally(() => signal.removeEventListener('abort', lost));\n });\n }\n /** @internal */ get _deviceGeneration() { return this._deviceRevision; }\n /** @internal */ get _lostError() { return this._deviceLossError; }\n\n private _adapterName() {\n if (this._gpuAdapterInfo) return this._gpuAdapterInfo.description || this._gpuAdapterInfo.vendor || 'WebGPU';\n const gl = this._webglRenderer?.gl, extension = gl?.getExtension('WEBGL_debug_renderer_info');\n return extension && gl ? gl.getParameter(extension.UNMASKED_RENDERER_WEBGL) : this._webglRenderer ? 'WebGL 2' : this._gpuDevice ? 'WebGPU' : '';\n }\n /** @internal */ _reportShaderProgress() {\n const compilation = this._pipeline?.getDiagnostics().shaderCompilation;\n if (!compilation) return;\n const key = `${compilation.status}/${compilation.completedPipelineCount}/${compilation.pipelineCount}`;\n if (key === this._shaderProgress) return;\n this._shaderProgress = key;\n this._events.emit('progress', {stage: 'shaders', progress: compilation.pipelineCount ? compilation.completedPipelineCount / compilation.pipelineCount : 1});\n }\n /** Current shared preparation and resident target statistics. Default undefined before any work. */\n getDiagnostics(): EngineDiagnostics | undefined {\n if (!this._pipeline && !this._lastBvhBuild) return;\n const values = this._pipeline?.getDiagnostics();\n const materialTextures = values?.materialTextures ?? (this._pipeline ? {\n requested: this._textureBinding, active: 'atlas' as const,\n fallbackReason: this._textureBinding === 'auto' ? 'Bindless textures require a supported WebGPU device.' : undefined,\n textureCount: values?.textureAtlas?.textureCount ?? 0, estimatedBytes: values?.textureAtlas?.estimatedBytes ?? 0,\n scale: values?.textureAtlas?.scale ?? 1, metadataBytes: 0, resourceTableCapacity: 0, retiredBytes: 0\n } : undefined);\n return { ...values, materialTextures, bvh: {...values?.bvh, lastBuild: this._lastBvhBuild}, backend: this.backend, adapterName: this._adapterName(), width: this.display.canvas.width, height: this.display.canvas.height,\n lastError: this.lastError?.message, webgpuFallbackReason: this._webgpuFallbackReason,\n presentedTarget: this._presented?.label, presentedComplete: this._presented?.presentationComplete ?? false };\n }\n /** Queries a 7×7 depth grid using the committed engine camera. Default undefined until GPU data is ready. */\n async readDepthSamples(area: DepthSampleArea): Promise<Float32Array | undefined> {\n packDepthSampleArea(area, 1);\n if (!this._ready || !this._committedCamera || this._readingDepth) return;\n this._readingDepth = true;\n try {\n const camera = cameraSnapshot(this._committedCamera);\n camera.aspect ??= this.display.canvas.width / this.display.canvas.height;\n const result = await this._pipeline!.readDepthSamples(camera, area);\n return this._disposed ? undefined : result;\n }\n finally { this._readingDepth = false; }\n }\n /** Releases all renders, shared resources, CPU workers and owned denoisers. */\n dispose() {\n if (this._disposed) return;\n this._disposed = true; this._bvhPreparationRevision++; this._bvhPreparationController?.abort();\n this._lossController?.abort(new Error('Engine is disposed.')); this._lossController = undefined;\n this._contextRestore?.reject(new Error('Engine is disposed.')); this._contextRestore = undefined;\n if (this._webglListening) {\n this.display.canvas.removeEventListener('webglcontextlost', this._onContextLost);\n this.display.canvas.removeEventListener('webglcontextrestored', this._onContextRestored);\n }\n for (const render of [...this._renders]) render.dispose();\n this._pipeline?.dispose(); this._pipeline = undefined; this._webglRenderer?.dispose(); this._bvhWorkerPool?.dispose();\n for (const denoiser of [...this._denoisers]) { const entry = this._denoiserEntries.get(denoiser); if (entry) entry.references = 1; this._releaseDenoiser(denoiser); }\n this._denoiserCache.clear();\n this._weights.clear(); this._events.clear();\n }\n /** @internal */ get _initializationError() { return this._pipelineInitError; }\n /** @internal */ get _ready() { return !!this._pipeline && this._uploadedRevision === this._sceneRevision && !!this._committedScene && !!this._committedCamera && !this._disposed; }\n /** @internal */ get _inputs() { return {scene: this._sceneRevision, camera: this._cameraRevision, value: this._committedCamera}; }\n /** @internal */ _register(render: Render) { if (this._disposed) throw new Error('Engine is disposed.'); this._renders.add(render); }\n /** @internal */ _unregister(render: Render) { this._renders.delete(render); }\n /** @internal */ _createTarget() { return this._pipeline?.createTarget(`render-${++this._targetCounter}`); }\n /** @internal */ _releaseTarget(target: RenderTarget) { if (this._presented === target) this._presented = undefined; this._pipeline?.releaseTarget(target); }\n /** @internal */ _isPresented(target: RenderTarget | undefined) { return !!target && this._presented === target; }\n /** @internal */ _present(target: RenderTarget) { target.activate(); target.present(); this._presented = target; }\n /** @internal */ _notifyError(value: unknown): Error {\n const error = value instanceof Error ? value : new Error(String(value));\n if (!this._loggedErrorMessages.has(error.message)) { this._loggedErrorMessages.add(error.message); console.error(`Path tracing failed: ${error.message}`, error); }\n if (!this._reportedErrors.has(error)) { this._reportedErrors.add(error); this._events.emit('error', error); }\n return error;\n }\n /** @internal */ _getWeights(url: string, load: () => Promise<ArrayBuffer>) {\n let pending = this._weights.get(url);\n if (!pending) { pending = load(); this._weights.set(url, pending); void pending.catch(() => { if (this._weights.get(url) === pending) this._weights.delete(url); }); }\n return pending;\n }\n /** @internal */ _retainDenoiser<T extends OwnedDenoiser>(key: string, create: () => T): T {\n let entry = this._denoiserCache.get(key);\n if (!entry?.value) {\n const value = this._ownDenoiser(create());\n const next = {key, references: 0, value};\n this._denoiserCache.set(key, next); this._denoiserEntries.set(value, next); entry = next;\n }\n entry.references++; return entry.value as T;\n }\n /** @internal */ async _acquireDenoiser(key: string, create: () => Promise<Extract<OwnedDenoiser, {kind: 'oidn'}>>): Promise<Extract<OwnedDenoiser, {kind: 'oidn'}>> {\n let entry = this._denoiserCache.get(key);\n if (!entry) {\n const next: {key: string; references: number; value?: OwnedDenoiser; pending?: Promise<OwnedDenoiser>} = {key, references: 0};\n const revision = this._deviceRevision;\n next.pending = create().then(filter => {\n if (revision !== this._deviceRevision) { this._disposeDenoiser(filter); throw this._deviceLossError; }\n next.value = this._ownDenoiser(filter); this._denoiserEntries.set(filter, next); return filter; });\n this._denoiserCache.set(key, next); entry = next;\n }\n entry.references++;\n try { return (entry.value ?? await entry.pending!) as Extract<OwnedDenoiser, {kind: 'oidn'}>; }\n catch (error) { entry.references--; if (this._denoiserCache.get(key) === entry) this._denoiserCache.delete(key); throw error; }\n }\n /** @internal */ _ownDenoiser<T extends OwnedDenoiser>(denoiser: T): T {\n if (this._disposed) { this._disposeDenoiser(denoiser); throw new Error('Engine is disposed.'); }\n this._denoisers.add(denoiser); return denoiser;\n }\n /** @internal */ _releaseDenoiser(denoiser: OwnedDenoiser) {\n const entry = this._denoiserEntries.get(denoiser);\n if (entry && --entry.references > 0) return;\n if (entry && this._denoiserCache.get(entry.key) === entry) this._denoiserCache.delete(entry.key);\n this._denoiserEntries.delete(denoiser);\n if (!this._denoisers.delete(denoiser)) return;\n this._disposeDenoiser(denoiser);\n }\n private _disposeDenoiser(denoiser: OwnedDenoiser) {\n if (denoiser.kind === 'oidn') { denoiser.denoiser.auxiliaryDenoisers?.albedo.dispose(); denoiser.denoiser.auxiliaryDenoisers?.normal.dispose(); }\n denoiser.denoiser.dispose();\n }\n /** @internal Called only while holding the shared inference lease. */\n async _prepareCustomDenoiser(denoiser: Denoiser, width: number, height: number) {\n const device = this.device;\n if (!device) throw new Error('Custom denoising requires WebGPU.');\n const previous = this._customPrepared.get(denoiser);\n if (previous?.device === device && previous.width === width && previous.height === height) return;\n await denoiser.prepare?.({device, width, height});\n this._customPrepared.set(denoiser, {device, width, height});\n }\n /** @internal A cancelled job loses its lease if it does not settle within the grace period. */ _enqueueDenoise<T>(work: () => Promise<T>, signal?: AbortSignal): Promise<T | undefined> {\n const task = this._denoiseTail.then(async () => {\n const device = this._gpuDevice, generation = this._deviceRevision;\n let settle: Promise<T> | undefined;\n try {\n if (!signal) return await work();\n const abandoned = new Promise<undefined>(resolve => {\n const expire = () => setTimeout(() => {\n console.warn('A cancelled denoiser did not settle; continuing without it.');\n resolve(undefined);\n }, CANCELLED_DENOISE_GRACE_MS);\n const running = work().finally(() => { clearTimeout(timer); signal.removeEventListener('abort', onAbort); });\n let timer: ReturnType<typeof setTimeout> | undefined;\n const onAbort = () => { timer = expire(); };\n if (signal.aborted) onAbort(); else signal.addEventListener('abort', onAbort, {once: true});\n settle = running;\n });\n return await Promise.race([settle!, abandoned]);\n }\n finally {\n // Cancelling tiled OIDN stops future tiles, not the commands already\n // submitted. Keep the shared scratch lease until those commands finish\n // so rapid edits cannot pile up inference or resize its inputs in flight.\n // A lost/disposed device must release the lease without waiting for a\n // queue that may never complete.\n if (device && device === this._gpuDevice && generation === this._deviceRevision && !this._disposed) {\n await this._awaitDevice(device.queue.onSubmittedWorkDone()).catch(() => {});\n }\n }\n });\n this._denoiseTail = task.catch(() => {}); return task;\n }\n}\n"]}