@meimu/mutracer 0.3.0 → 0.3.1

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 (304) hide show
  1. package/CHANGELOG.md +222 -0
  2. package/LICENSES/FidelityFX-FSR.txt +19 -0
  3. package/LICENSES/pbrt-v4-Apache-2.0.txt +202 -0
  4. package/THIRD_PARTY_NOTICES.md +18 -4
  5. package/dist/assets/bvh.worker.js +1 -1
  6. package/dist/mutracer.umd.js +6260 -5580
  7. package/docs/api.md +45 -18
  8. package/docs/materials.md +4 -2
  9. package/docs/performance.md +7 -0
  10. package/docs/post-processing.md +62 -9
  11. package/docs/progressive-rendering.md +3 -0
  12. package/docs/sampling.md +4 -0
  13. package/docs/technical/acceleration.md +52 -0
  14. package/docs/technical/aovs.md +79 -0
  15. package/docs/technical/caustics.md +109 -0
  16. package/docs/technical/continuous-spectrum.md +29 -0
  17. package/docs/technical/display-upscale.md +82 -0
  18. package/docs/technical/openpbr.md +99 -0
  19. package/docs/technical/pbrt-import.md +168 -0
  20. package/docs/technical/tiling.md +74 -0
  21. package/docs/technical/webgl.md +53 -0
  22. package/docs/viewer.md +11 -1
  23. package/lib/Display.d.ts +19 -5
  24. package/lib/Display.js +10 -7
  25. package/lib/Display.js.map +1 -1
  26. package/lib/Engine.d.ts +2 -1
  27. package/lib/Engine.js +30 -2
  28. package/lib/Engine.js.map +1 -1
  29. package/lib/Render.d.ts +20 -11
  30. package/lib/Render.js +32 -7
  31. package/lib/Render.js.map +1 -1
  32. package/lib/main.d.ts +3 -1
  33. package/lib/main.js +1 -0
  34. package/lib/main.js.map +1 -1
  35. package/lib/oidn.d.ts +1 -1
  36. package/lib/renderer/AovPrimitiveCache.js +39 -8
  37. package/lib/renderer/AovPrimitiveCache.js.map +1 -1
  38. package/lib/renderer/DisplayPostProcess.d.ts +8 -3
  39. package/lib/renderer/DisplayPostProcess.js +51 -18
  40. package/lib/renderer/DisplayPostProcess.js.map +1 -1
  41. package/lib/renderer/MaterialData.js +7 -2
  42. package/lib/renderer/MaterialData.js.map +1 -1
  43. package/lib/renderer/RenderingPipeline.d.ts +7 -1
  44. package/lib/renderer/RenderingPipeline.js.map +1 -1
  45. package/lib/renderer/TileRender.d.ts +2 -2
  46. package/lib/renderer/TileRender.js +128 -7
  47. package/lib/renderer/TileRender.js.map +1 -1
  48. package/lib/renderer/WGPUAov.d.ts +6 -1
  49. package/lib/renderer/WGPUAov.js +108 -14
  50. package/lib/renderer/WGPUAov.js.map +1 -1
  51. package/lib/renderer/WGPUCanvasSurface.js +12 -1
  52. package/lib/renderer/WGPUCanvasSurface.js.map +1 -1
  53. package/lib/renderer/WGPUEnvMapDistribution.js +19 -19
  54. package/lib/renderer/WGPUFullQuadPass.js +3 -3
  55. package/lib/renderer/WGPURayTraceOutput.js +12 -12
  56. package/lib/renderer/WGPURayTracePass.d.ts +17 -4
  57. package/lib/renderer/WGPURayTracePass.js +194 -71
  58. package/lib/renderer/WGPURayTracePass.js.map +1 -1
  59. package/lib/renderer/WGPURenderingPipeline.js +46 -40
  60. package/lib/renderer/WGPURenderingPipeline.js.map +1 -1
  61. package/lib/renderer/WebGLAov.js +3 -3
  62. package/lib/renderer/WebGLAov.js.map +1 -1
  63. package/lib/renderer/WebGLFullQuadPass.d.ts +1 -1
  64. package/lib/renderer/WebGLFullQuadPass.js +8 -2
  65. package/lib/renderer/WebGLFullQuadPass.js.map +1 -1
  66. package/lib/renderer/WebGLJNLMDenoiser.js +66 -66
  67. package/lib/renderer/WebGLJNLMDenoiser.js.map +1 -1
  68. package/lib/renderer/WebGLRayTraceOutputPass.js +4 -4
  69. package/lib/renderer/WebGLRayTracePass.d.ts +14 -10
  70. package/lib/renderer/WebGLRayTracePass.js +115 -111
  71. package/lib/renderer/WebGLRayTracePass.js.map +1 -1
  72. package/lib/renderer/WebGLRenderingPipeline.js +10 -3
  73. package/lib/renderer/WebGLRenderingPipeline.js.map +1 -1
  74. package/lib/renderer/WebGLSkyBaker.js +57 -57
  75. package/lib/renderer/aov.d.ts +13 -1
  76. package/lib/renderer/aov.js +21 -2
  77. package/lib/renderer/aov.js.map +1 -1
  78. package/lib/renderer/aovDisplay.js +2 -2
  79. package/lib/renderer/aovDisplay.js.map +1 -1
  80. package/lib/renderer/binnedSahBvh.d.ts +2 -1
  81. package/lib/renderer/binnedSahBvh.js +24 -17
  82. package/lib/renderer/binnedSahBvh.js.map +1 -1
  83. package/lib/renderer/bvhAccel.d.ts +3 -1
  84. package/lib/renderer/bvhAccel.js +36 -6
  85. package/lib/renderer/bvhAccel.js.map +1 -1
  86. package/lib/renderer/cameraUniform.d.ts +1 -1
  87. package/lib/renderer/cameraUniform.js +6 -2
  88. package/lib/renderer/cameraUniform.js.map +1 -1
  89. package/lib/renderer/compactVertices.d.ts +14 -0
  90. package/lib/renderer/compactVertices.js +124 -0
  91. package/lib/renderer/compactVertices.js.map +1 -0
  92. package/lib/renderer/easu.d.ts +11 -0
  93. package/lib/renderer/easu.js +156 -0
  94. package/lib/renderer/easu.js.map +1 -0
  95. package/lib/renderer/geometryUpdateState.d.ts +1 -0
  96. package/lib/renderer/geometryUpdateState.js.map +1 -1
  97. package/lib/renderer/geometryUpdates.js +3 -2
  98. package/lib/renderer/geometryUpdates.js.map +1 -1
  99. package/lib/renderer/glsl/aovDisplay.frag.js +5 -5
  100. package/lib/renderer/glsl/aovReflectance.glsl.js +35 -35
  101. package/lib/renderer/glsl/aovReflectanceSamples.glsl.js +1 -1
  102. package/lib/renderer/glsl/aovTrace.frag.js +44 -36
  103. package/lib/renderer/glsl/aovTrace.frag.js.map +1 -1
  104. package/lib/renderer/glsl/chunks/cameraProjection.glsl.d.ts +2 -0
  105. package/lib/renderer/glsl/chunks/cameraProjection.glsl.js +16 -0
  106. package/lib/renderer/glsl/chunks/cameraProjection.glsl.js.map +1 -0
  107. package/lib/renderer/glsl/chunks/cameraRay.glsl.d.ts +1 -1
  108. package/lib/renderer/glsl/chunks/cameraRay.glsl.js +9 -16
  109. package/lib/renderer/glsl/chunks/cameraRay.glsl.js.map +1 -1
  110. package/lib/renderer/glsl/chunks/emissiveLight.glsl.js +8 -8
  111. package/lib/renderer/glsl/chunks/envMap.glsl.js +67 -67
  112. package/lib/renderer/glsl/chunks/intersect.glsl.js +390 -375
  113. package/lib/renderer/glsl/chunks/intersect.glsl.js.map +1 -1
  114. package/lib/renderer/glsl/chunks/materialBuffer.glsl.js +120 -120
  115. package/lib/renderer/glsl/chunks/openPbrBsdf.glsl.js +562 -562
  116. package/lib/renderer/glsl/chunks/rand.glsl.js +3 -3
  117. package/lib/renderer/glsl/chunks/random.glsl.js +4 -4
  118. package/lib/renderer/glsl/chunks/rayTraceCore.glsl.js +37 -35
  119. package/lib/renderer/glsl/chunks/rayTraceCore.glsl.js.map +1 -1
  120. package/lib/renderer/glsl/chunks/sampleLight.glsl.js +70 -74
  121. package/lib/renderer/glsl/chunks/sampleLight.glsl.js.map +1 -1
  122. package/lib/renderer/glsl/chunks/sampleMaterial.glsl.d.ts +1 -1
  123. package/lib/renderer/glsl/chunks/sampleMaterial.glsl.js +107 -88
  124. package/lib/renderer/glsl/chunks/sampleMaterial.glsl.js.map +1 -1
  125. package/lib/renderer/glsl/chunks/sampleShadowCatcher.glsl.js +11 -11
  126. package/lib/renderer/glsl/chunks/sampling.glsl.js +77 -77
  127. package/lib/renderer/glsl/chunks/sobol.glsl.js +70 -70
  128. package/lib/renderer/glsl/chunks/spectralPrefix.glsl.d.ts +6 -0
  129. package/lib/renderer/glsl/chunks/spectralPrefix.glsl.js +47 -0
  130. package/lib/renderer/glsl/chunks/spectralPrefix.glsl.js.map +1 -0
  131. package/lib/renderer/glsl/chunks/textureLinear.glsl.js +5 -5
  132. package/lib/renderer/glsl/chunks/uvProjection.glsl.js +11 -11
  133. package/lib/renderer/glsl/depthQuery.frag.js +12 -6
  134. package/lib/renderer/glsl/depthQuery.frag.js.map +1 -1
  135. package/lib/renderer/glsl/normalizeRayTraceOutput.frag.js +10 -10
  136. package/lib/renderer/glsl/rayTrace.frag.js +233 -170
  137. package/lib/renderer/glsl/rayTrace.frag.js.map +1 -1
  138. package/lib/renderer/glsl/shadowCatcher.frag.js +10 -9
  139. package/lib/renderer/glsl/shadowCatcher.frag.js.map +1 -1
  140. package/lib/renderer/glsl/webglPipeline.frag.js +58 -58
  141. package/lib/renderer/gpuMemory.js +1 -1
  142. package/lib/renderer/gpuMemory.js.map +1 -1
  143. package/lib/renderer/openPbrEnergyLut.d.ts +2 -1
  144. package/lib/renderer/openPbrEnergyLut.js +18 -1
  145. package/lib/renderer/openPbrEnergyLut.js.map +1 -1
  146. package/lib/renderer/pathLimits.d.ts +5 -4
  147. package/lib/renderer/pathLimits.js +6 -5
  148. package/lib/renderer/pathLimits.js.map +1 -1
  149. package/lib/renderer/prepareMeshBVH.d.ts +2 -0
  150. package/lib/renderer/prepareMeshBVH.js +5 -3
  151. package/lib/renderer/prepareMeshBVH.js.map +1 -1
  152. package/lib/renderer/progressiveScheduler.js +1 -1
  153. package/lib/renderer/progressiveScheduler.js.map +1 -1
  154. package/lib/renderer/renderPipeline.d.ts +4 -0
  155. package/lib/renderer/renderPipeline.js +1 -0
  156. package/lib/renderer/renderPipeline.js.map +1 -1
  157. package/lib/renderer/researchTransport.d.ts +1 -1
  158. package/lib/renderer/researchTransport.js.map +1 -1
  159. package/lib/renderer/sceneAssembly.d.ts +1 -1
  160. package/lib/renderer/sceneAssembly.js +4 -3
  161. package/lib/renderer/sceneAssembly.js.map +1 -1
  162. package/lib/renderer/sceneChangeDetector.d.ts +1 -1
  163. package/lib/renderer/sceneChangeDetector.js +3 -1
  164. package/lib/renderer/sceneChangeDetector.js.map +1 -1
  165. package/lib/renderer/sceneLayoutSchema.d.ts +1 -0
  166. package/lib/renderer/sceneLayoutSchema.js +2 -2
  167. package/lib/renderer/sceneLayoutSchema.js.map +1 -1
  168. package/lib/renderer/scenePreparation.d.ts +3 -2
  169. package/lib/renderer/scenePreparation.js +18 -2
  170. package/lib/renderer/scenePreparation.js.map +1 -1
  171. package/lib/renderer/scratchSampling.js +6 -6
  172. package/lib/renderer/spectrum.js +2 -2
  173. package/lib/renderer/staticBvhPreparation.d.ts +9 -0
  174. package/lib/renderer/staticBvhPreparation.js +8 -2
  175. package/lib/renderer/staticBvhPreparation.js.map +1 -1
  176. package/lib/renderer/surfaceHit.d.ts +10 -0
  177. package/lib/renderer/surfaceHit.js +22 -0
  178. package/lib/renderer/surfaceHit.js.map +1 -0
  179. package/lib/renderer/tangentRequirements.d.ts +2 -0
  180. package/lib/renderer/tangentRequirements.js +7 -0
  181. package/lib/renderer/tangentRequirements.js.map +1 -0
  182. package/lib/renderer/textureAtlas.d.ts +4 -0
  183. package/lib/renderer/textureAtlas.js +48 -2
  184. package/lib/renderer/textureAtlas.js.map +1 -1
  185. package/lib/renderer/webgl.js +4 -0
  186. package/lib/renderer/webgl.js.map +1 -1
  187. package/lib/renderer/webglVertexAttributes.d.ts +17 -0
  188. package/lib/renderer/webglVertexAttributes.js +44 -0
  189. package/lib/renderer/webglVertexAttributes.js.map +1 -0
  190. package/lib/renderer/wgpuBindlessSource.js +2 -2
  191. package/lib/renderer/wgpuMaterialConstants.js +4 -3
  192. package/lib/renderer/wgpuMaterialConstants.js.map +1 -1
  193. package/lib/renderer/wgpuSceneUniform.js +2 -2
  194. package/lib/renderer/wgpuSceneUniform.js.map +1 -1
  195. package/lib/renderer/wgpuShaderSource.d.ts +15 -0
  196. package/lib/renderer/wgpuShaderSource.js +1 -1
  197. package/lib/renderer/wgpuShaderSource.js.map +1 -1
  198. package/lib/renderer/wgsl/aovCompact.wgsl.d.ts +4 -0
  199. package/lib/renderer/wgsl/aovCompact.wgsl.js +26 -0
  200. package/lib/renderer/wgsl/aovCompact.wgsl.js.map +1 -0
  201. package/lib/renderer/wgsl/aovDisplay.wgsl.js +9 -9
  202. package/lib/renderer/wgsl/aovReflectance.wgsl.js +39 -39
  203. package/lib/renderer/wgsl/aovReflectanceSamples.wgsl.js +1 -1
  204. package/lib/renderer/wgsl/aovResolve.wgsl.d.ts +4 -0
  205. package/lib/renderer/wgsl/aovResolve.wgsl.js +21 -2
  206. package/lib/renderer/wgsl/aovResolve.wgsl.js.map +1 -1
  207. package/lib/renderer/wgsl/aovSnapshot.wgsl.js +2 -2
  208. package/lib/renderer/wgsl/aovSnapshot.wgsl.js.map +1 -1
  209. package/lib/renderer/wgsl/aovTrace.wgsl.js +31 -31
  210. package/lib/renderer/wgsl/aovTraceDisplay.wgsl.d.ts +2 -0
  211. package/lib/renderer/wgsl/aovTraceDisplay.wgsl.js +56 -0
  212. package/lib/renderer/wgsl/aovTraceDisplay.wgsl.js.map +1 -0
  213. package/lib/renderer/wgsl/bloom.wgsl.js +18 -18
  214. package/lib/renderer/wgsl/causticLight.compute.d.ts +1 -1
  215. package/lib/renderer/wgsl/causticLight.compute.js +121 -119
  216. package/lib/renderer/wgsl/causticLight.compute.js.map +1 -1
  217. package/lib/renderer/wgsl/chunks/background.wgsl.js +46 -46
  218. package/lib/renderer/wgsl/chunks/causticAdjoint.wgsl.js +4 -4
  219. package/lib/renderer/wgsl/chunks/causticAtomic.wgsl.js +3 -3
  220. package/lib/renderer/wgsl/chunks/caustics.wgsl.js +3 -3
  221. package/lib/renderer/wgsl/chunks/common.wgsl.js +4 -4
  222. package/lib/renderer/wgsl/chunks/envMap.wgsl.js +30 -30
  223. package/lib/renderer/wgsl/chunks/intersect.wgsl.d.ts +6 -2
  224. package/lib/renderer/wgsl/chunks/intersect.wgsl.js +550 -542
  225. package/lib/renderer/wgsl/chunks/intersect.wgsl.js.map +1 -1
  226. package/lib/renderer/wgsl/chunks/intersectionAlpha.wgsl.d.ts +1 -1
  227. package/lib/renderer/wgsl/chunks/intersectionAlpha.wgsl.js +18 -16
  228. package/lib/renderer/wgsl/chunks/intersectionAlpha.wgsl.js.map +1 -1
  229. package/lib/renderer/wgsl/chunks/materialBuffer.wgsl.d.ts +2 -1
  230. package/lib/renderer/wgsl/chunks/materialBuffer.wgsl.js +70 -69
  231. package/lib/renderer/wgsl/chunks/materialBuffer.wgsl.js.map +1 -1
  232. package/lib/renderer/wgsl/chunks/openPbrBsdf.wgsl.js +593 -593
  233. package/lib/renderer/wgsl/chunks/pdm_displacement.wgsl.js +118 -118
  234. package/lib/renderer/wgsl/chunks/rand.wgsl.js +3 -3
  235. package/lib/renderer/wgsl/chunks/rayTraceCore.wgsl.d.ts +4 -1
  236. package/lib/renderer/wgsl/chunks/rayTraceCore.wgsl.js +32 -26
  237. package/lib/renderer/wgsl/chunks/rayTraceCore.wgsl.js.map +1 -1
  238. package/lib/renderer/wgsl/chunks/sampleLight.wgsl.js +114 -114
  239. package/lib/renderer/wgsl/chunks/sampleMaterial.wgsl.d.ts +1 -1
  240. package/lib/renderer/wgsl/chunks/sampleMaterial.wgsl.js +159 -137
  241. package/lib/renderer/wgsl/chunks/sampleMaterial.wgsl.js.map +1 -1
  242. package/lib/renderer/wgsl/chunks/sampleShadowCatcher.wgsl.js +8 -8
  243. package/lib/renderer/wgsl/chunks/sampling.wgsl.js +74 -74
  244. package/lib/renderer/wgsl/chunks/sobol.wgsl.js +74 -74
  245. package/lib/renderer/wgsl/chunks/spectralPrefix.wgsl.d.ts +6 -0
  246. package/lib/renderer/wgsl/chunks/spectralPrefix.wgsl.js +66 -0
  247. package/lib/renderer/wgsl/chunks/spectralPrefix.wgsl.js.map +1 -0
  248. package/lib/renderer/wgsl/chunks/uvProjection.wgsl.js +11 -11
  249. package/lib/renderer/wgsl/chunks/vertexAttributes.wgsl.d.ts +2 -0
  250. package/lib/renderer/wgsl/chunks/vertexAttributes.wgsl.js +61 -0
  251. package/lib/renderer/wgsl/chunks/vertexAttributes.wgsl.js.map +1 -0
  252. package/lib/renderer/wgsl/compose.frag.wgsl.d.ts +2 -0
  253. package/lib/renderer/wgsl/compose.frag.wgsl.js +99 -97
  254. package/lib/renderer/wgsl/compose.frag.wgsl.js.map +1 -1
  255. package/lib/renderer/wgsl/customDenoise.wgsl.js +10 -10
  256. package/lib/renderer/wgsl/depthQuery.wgsl.d.ts +1 -1
  257. package/lib/renderer/wgsl/depthQuery.wgsl.js +11 -2
  258. package/lib/renderer/wgsl/depthQuery.wgsl.js.map +1 -1
  259. package/lib/renderer/wgsl/easu.wgsl.d.ts +2 -0
  260. package/lib/renderer/wgsl/easu.wgsl.js +80 -0
  261. package/lib/renderer/wgsl/easu.wgsl.js.map +1 -0
  262. package/lib/renderer/wgsl/easuDetail.wgsl.d.ts +21 -0
  263. package/lib/renderer/wgsl/easuDetail.wgsl.js +230 -0
  264. package/lib/renderer/wgsl/easuDetail.wgsl.js.map +1 -0
  265. package/lib/renderer/wgsl/jnlm.compute.js +74 -74
  266. package/lib/renderer/wgsl/jnlm.compute.js.map +1 -1
  267. package/lib/renderer/wgsl/offlineAdaptive.compute.js +26 -26
  268. package/lib/renderer/wgsl/oidnAuxiliary.wgsl.js +3 -3
  269. package/lib/renderer/wgsl/photonMap.compute.js +89 -89
  270. package/lib/renderer/wgsl/proceduralSky.compute.js +61 -61
  271. package/lib/renderer/wgsl/rayTrace.compute.d.ts +14 -0
  272. package/lib/renderer/wgsl/rayTrace.compute.js +395 -333
  273. package/lib/renderer/wgsl/rayTrace.compute.js.map +1 -1
  274. package/lib/scene/Scene.js.map +1 -1
  275. package/lib/settings/render.d.ts +11 -0
  276. package/lib/settings/render.js +1 -0
  277. package/lib/settings/render.js.map +1 -1
  278. package/lib/util/fromTHREE.js +21 -14
  279. package/lib/util/fromTHREE.js.map +1 -1
  280. package/lib/version.d.ts +1 -1
  281. package/lib/version.js +1 -1
  282. package/lib/version.js.map +1 -1
  283. package/package.json +5 -2
  284. package/lib/oidnBundledWeights.cdn.d.ts +0 -2
  285. package/lib/oidnBundledWeights.cdn.js +0 -5
  286. package/lib/oidnBundledWeights.cdn.js.map +0 -1
  287. package/lib/renderer/bvh.worker.d.ts +0 -1
  288. package/lib/renderer/bvh.worker.js +0 -16
  289. package/lib/renderer/bvh.worker.js.map +0 -1
  290. package/lib/renderer/bvhWorkerBuild.d.ts +0 -13
  291. package/lib/renderer/bvhWorkerBuild.js +0 -17
  292. package/lib/renderer/bvhWorkerBuild.js.map +0 -1
  293. package/lib/renderer/lightCore.d.ts +0 -12
  294. package/lib/renderer/lightCore.js +0 -13
  295. package/lib/renderer/lightCore.js.map +0 -1
  296. package/lib/renderer/materialCore.d.ts +0 -8
  297. package/lib/renderer/materialCore.js +0 -9
  298. package/lib/renderer/materialCore.js.map +0 -1
  299. package/lib/scene/PixelTexture.d.ts +0 -6
  300. package/lib/scene/PixelTexture.js +0 -10
  301. package/lib/scene/PixelTexture.js.map +0 -1
  302. package/lib/util/studioLighting.d.ts +0 -18
  303. package/lib/util/studioLighting.js +0 -36
  304. package/lib/util/studioLighting.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"Display.js","sourceRoot":"","sources":["../src/Display.ts"],"names":[],"mappings":"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","sourcesContent":["import {displayAovKind, validateAovDisplay, type AovIdComponent} from './renderer/aovDisplay.js';\nexport type {AovIdComponent} from './renderer/aovDisplay.js';\nimport {createCanvas} from './util/canvas.js';\nimport type Engine from './Engine.js';\nimport type Render from './Render.js';\nimport type { ToneMapping, DisplayChannel } from './renderer/RenderingPipeline.js';\nimport type { ColorRGB } from './types.js';\nimport { displaySettingsKey, displayFilterSettingsKey, applyDisplaySettings } from './settings/display.js';\n/** Display image channels. Default final. */\nexport type {DisplayChannel} from './renderer/RenderingPipeline.js';\n/** Image encoding options for Display.toBlob. */\nexport interface BlobOptions {\n /** Browser image MIME type. Default image/png. */ type?: string;\n /** Encoder quality in 0–1. Default undefined uses the browser default. */ quality?: number;\n}\n/** Optional shared display settings; defaults match Display. */\nexport interface DisplaySettings {\n /** Tone mapping transform. Default agx. */ toneMapping?: ToneMapping;\n /** Linear exposure multiplier. Default 1. */ toneMappingExposure?: number;\n /** Contrast multiplier. Default 1. */ contrast?: number;\n /** Saturation multiplier. Default 1. */ saturation?: number;\n /** White balance temperature shift in -1–1. Default 0. */ temperature?: number;\n /** Green/magenta tint in -1–1. Default 0. */ tint?: number;\n /** Vignette strength in 0–1. Default 0. */ vignette?: number;\n /** Bloom intensity; 0 disables it. Default 0. */ bloomIntensity?: number;\n /** Bloom luminance threshold. Default 1. */ bloomThreshold?: number;\n /** Bloom radius in 0–1. Default 0.6. */ bloomRadius?: number;\n /** Extended-range WebGPU presentation, ignored on WebGL. Default false. */ hdrOutputEnabled?: boolean;\n /** Display image channel. Default final. AOV channels require explicit Render.aovs. */ channel?: DisplayChannel;\n /** Finite float32 scene-unit depths mapped to black/white; 0 <= near < far. Default [0, 10]. */ aovDepthRange?: readonly [number, number];\n /** Finite positive float32 scene-unit half-range around the origin for position RGB. Default 1. */ aovPositionScale?: number;\n /** Finite positive float32 input-pixel displacement mapped to full motion brightness. Default 16. */ aovMotionScale?: number;\n /** Stable ID lane to colorize. Default object. */ aovIdComponent?: AovIdComponent;\n /** Linear shadow-catcher color. Default black. */ shadowCatcherColor?: ColorRGB;\n /** Shadow-catcher opacity multiplier. Default 1. */ shadowCatcherAlpha?: number;\n}\n/** Borrowed WebGPU images for one synchronous display pass. */\nexport interface PostProcessContext {\n /** Engine device; may change after recovery. */ device: GPUDevice;\n /** Record commands here; the library finishes and submits it. */ encoder: GPUCommandEncoder;\n /** Read-only composed display image, top row first; no additional color conversion. */ input: GPUTexture;\n /** Fully write this image. Same format and dimensions as input; supports render, storage and copy writes. */ output: GPUTexture;\n /** Actual render width. */ width: number;\n /** Actual render height. */ height: number;\n /** Selected complete render, including a selected fallback. */ render: Render;\n}\n/** Synchronous display pass. Images and encoder are borrowed only during the call; do not retain or destroy them. */\nexport type PostProcess = (context: PostProcessContext) => void;\n/** Canvas presentation and shared display settings; obtained from engine.display. */\nexport default class Display {\n /** Display canvas. Default the supplied Engine canvas, or a new canvas (OffscreenCanvas without document). */ readonly canvas: HTMLCanvasElement | OffscreenCanvas;\n /** Tone mapping transform. Default agx. */ toneMapping: ToneMapping = 'agx';\n /** Linear exposure multiplier. Default 1. */ toneMappingExposure = 1;\n /** Contrast multiplier. Default 1. */ contrast = 1;\n /** Saturation multiplier. Default 1. */ saturation = 1;\n /** White balance temperature shift in -1–1. Default 0. */ temperature = 0;\n /** Green/magenta tint in -1–1. Default 0. */ tint = 0;\n /** Vignette strength in 0–1. Default 0. */ vignette = 0;\n /** Bloom intensity; 0 disables it. Default 0. */ bloomIntensity = 0;\n /** Bloom luminance threshold. Default 1. */ bloomThreshold = 1;\n /** Bloom radius in 0–1. Default 0.6. */ bloomRadius = 0.6;\n /** Extended-range WebGPU presentation, ignored on WebGL. Default false. */ hdrOutputEnabled = false;\n /** Display image channel. Default final. AOV channels require explicit Render.aovs. */ channel: DisplayChannel = 'final';\n /** Finite float32 scene-unit depths mapped to black/white; 0 <= near < far. Default [0, 10]. */ aovDepthRange: readonly [number, number] = [0, 10];\n /** Finite positive float32 scene-unit half-range around the origin for position RGB. Default 1. */ aovPositionScale = 1;\n /** Finite positive float32 input-pixel displacement mapped to full motion brightness. Default 16. */ aovMotionScale = 16;\n /** Stable ID lane to colorize. Default object. */ aovIdComponent: AovIdComponent = 'object';\n /** Linear shadow-catcher color. Default black. */ shadowCatcherColor: ColorRGB = [0, 0, 0];\n /** Shadow-catcher opacity multiplier. Default 1. */ shadowCatcherAlpha = 1;\n private constructor(private readonly engine: Engine, canvas: HTMLCanvasElement | OffscreenCanvas) { this.canvas = canvas; }\n /** @internal */ static _create(engine: Engine, canvas: HTMLCanvasElement | OffscreenCanvas) { return new Display(engine, canvas); }\n /** Resizes the drawing buffer; scale-based renders resize at their next refine. */\n setSize(width: number, height: number) {\n if (!Number.isFinite(width) || !Number.isFinite(height) || width < 1 || height < 1) throw new Error('Display dimensions must be positive.');\n width = Math.round(width); height = Math.round(height);\n if (this.canvas.width !== width) this.canvas.width = width;\n if (this.canvas.height !== height) this.canvas.height = height;\n }\n private readonly _filterSettings = new WeakMap<Render, string>();\n private readonly settings = new WeakMap<Render, string>();\n /** @internal */ _configure(render: Render) {\n if (render._engine !== this.engine) throw new Error('Render belongs to another engine.');\n const target = render._output;\n if (!target) return;\n const kind = displayAovKind(this.channel);\n if (!kind && !['final','normal','albedo','shadow','shadowCatcher'].includes(this.channel)) throw new RangeError('Unknown display channel');\n if (kind && !render.aovs.includes(kind)) throw new Error(`AOV ${kind} is not enabled on the selected render`);\n validateAovDisplay({depthRange: this.aovDepthRange, positionScale: this.aovPositionScale, motionScale: this.aovMotionScale, idComponent: this.aovIdComponent});\n const key = displaySettingsKey(this);\n const filterKey = displayFilterSettingsKey(this);\n const previous = this.settings.get(render);\n if (previous !== key) {\n this.settings.set(render, key);\n if (previous !== undefined && this._filterSettings.get(render) !== filterKey) render._displayChanged();\n this._filterSettings.set(render, filterKey);\n }\n target.activate();\n applyDisplaySettings(this, target);\n }\n private readonly _postProcesses: {pass: PostProcess}[] = [];\n private _warnedPostProcess = false;\n /** Registers a display pass in order and returns an idempotent removal function. Default no passes. WebGPU only; WebGL skips passes with one warning. Runs after composition on every present/toBlob, without tracing or invalidating denoising. A thrown error discards the whole chain, presents the original image and emits engine error. */\n addPostProcess(pass: PostProcess): () => void {\n const entry = {pass};\n this._postProcesses.push(entry);\n if (this.engine.backend === 'webgl') this.warnPostProcess();\n return () => { const index = this._postProcesses.indexOf(entry); if (index >= 0) this._postProcesses.splice(index, 1); };\n }\n private warnPostProcess() {\n if (!this._warnedPostProcess) { this._warnedPostProcess = true; console.warn('Display post-processing requires WebGPU; passes are ignored on WebGL.'); }\n }\n private compose(render: Render) {\n if (render._engine !== this.engine) throw new Error('Render belongs to another engine.');\n const target = render._output;\n if (!target) return;\n const kind = displayAovKind(this.channel);\n if (!kind && !target.presentationComplete) return;\n if (kind && !render.aovs.includes(kind)) throw new Error(`AOV ${kind} is not enabled on the selected render`);\n if (kind && target.aovReady && !target.aovReady(kind)) return;\n this._configure(render);\n target.drawPostProcess();\n if (this._postProcesses.length && this.engine.backend === 'webgl') this.warnPostProcess();\n try { target.applyPostProcesses?.(this._postProcesses.map(entry => entry.pass), render); }\n catch (error) { this.engine._notifyError(error); }\n return target;\n }\n /** Presents a complete image or fallback. Keeps fallback visible until the first intermediate filter finishes. Does not trace. */\n present(render: Render): Render | undefined {\n if (render._engine !== this.engine) throw new Error('Render belongs to another engine.');\n const ready = this.channel === 'final' && render.fallback ? render._presentable : render._completeFor(this.channel);\n const fallback = render.fallback;\n const selected = ready ? render : fallback && (this.channel === 'final' ? fallback._presentable : fallback._completeFor(this.channel)) ? fallback : undefined;\n if (!selected) return;\n const target = this.compose(selected);\n if (!target) return;\n this.engine._present(target);\n return selected;\n }\n /** Encodes this render at its actual dimensions using these settings; leaves the display canvas unchanged. */\n async toBlob(render: Render, options: BlobOptions = {}): Promise<Blob> {\n const target = this.compose(render);\n if (!target) throw new Error('Render has no complete image.');\n const image = render._cropOutput(await target.readPresentation());\n const canvas = createCanvas(image.width, image.height, 'convertToBlob' in this.canvas);\n const context = canvas.getContext('2d') as CanvasRenderingContext2D | OffscreenCanvasRenderingContext2D | null;\n if (!context) throw new Error('The image encoding context is not available.');\n const bytes = new Uint8ClampedArray(image.data.length);\n for (let i = 0; i < bytes.length; i++) bytes[i] = Math.round(Math.min(1, Math.max(0, image.data[i])) * 255);\n context.putImageData(new ImageData(bytes, image.width, image.height), 0, 0);\n if ('convertToBlob' in canvas) return canvas.convertToBlob({type: options.type ?? 'image/png', quality: options.quality});\n return new Promise((resolve, reject) => canvas.toBlob(blob => blob ? resolve(blob) : reject(new Error('The image could not be encoded')), options.type ?? 'image/png', options.quality));\n }\n}\n"]}
1
+ {"version":3,"file":"Display.js","sourceRoot":"","sources":["../src/Display.ts"],"names":[],"mappings":"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","sourcesContent":["import {displayAovKind, validateAovDisplay, type AovIdComponent} from './renderer/aovDisplay.js';\nexport type {AovIdComponent} from './renderer/aovDisplay.js';\nimport {createCanvas} from './util/canvas.js';\nimport type Engine from './Engine.js';\nimport type Render from './Render.js';\nimport type { ToneMapping, DisplayChannel } from './renderer/RenderingPipeline.js';\nimport type { ColorRGB } from './types.js';\nimport { displaySettingsKey, displayFilterSettingsKey, applyDisplaySettings } from './settings/display.js';\n/** Display image channels. Default final. */\nexport type {DisplayChannel} from './renderer/RenderingPipeline.js';\n/** Image encoding options for Display.toBlob. */\nexport interface BlobOptions {\n /** Browser image MIME type. Default image/png. */ type?: string;\n /** Encoder quality in 0–1. Default undefined uses the browser default. */ quality?: number;\n}\n/** Optional shared display settings; defaults match Display. */\nexport interface DisplaySettings {\n /** Tone mapping transform. Default agx. */ toneMapping?: ToneMapping;\n /** Linear exposure multiplier. Default 1. */ toneMappingExposure?: number;\n /** Contrast multiplier. Default 1. */ contrast?: number;\n /** Saturation multiplier. Default 1. */ saturation?: number;\n /** White balance temperature shift in -1–1. Default 0. */ temperature?: number;\n /** Green/magenta tint in -1–1. Default 0. */ tint?: number;\n /** Vignette strength in 0–1. Default 0. */ vignette?: number;\n /** Bloom intensity; 0 disables it. Default 0. */ bloomIntensity?: number;\n /** Bloom luminance threshold. Default 1. */ bloomThreshold?: number;\n /** Bloom radius in 0–1. Default 0.6. */ bloomRadius?: number;\n /** Extended-range WebGPU presentation, ignored on WebGL. Default false. */ hdrOutputEnabled?: boolean;\n /** Display image channel. Default final. AOV channels require explicit Render.aovs. */ channel?: DisplayChannel;\n /** Finite float32 scene-unit depths mapped to black/white; 0 <= near < far. Default [0, 10]. */ aovDepthRange?: readonly [number, number];\n /** Finite positive float32 scene-unit half-range around the origin for position RGB. Default 1. */ aovPositionScale?: number;\n /** Finite positive float32 input-pixel displacement mapped to full motion brightness. Default 16. */ aovMotionScale?: number;\n /** Stable ID lane to colorize. Default object. */ aovIdComponent?: AovIdComponent;\n /** Linear shadow-catcher color. Default black. */ shadowCatcherColor?: ColorRGB;\n /** Shadow-catcher opacity multiplier. Default 1. */ shadowCatcherAlpha?: number;\n}\n/** Borrowed WebGPU images for one synchronous display pass. */\nexport interface PostProcessContext {\n /** Engine device; may change after recovery. */ device: GPUDevice;\n /** Record commands here; the library finishes and submits it. */ encoder: GPUCommandEncoder;\n /** Read-only composed display image, top row first; no additional color conversion. */ input: GPUTexture;\n /** Fully write this image. Same format as input; dimensions follow outputSize; supports render, storage and copy writes. */ output: GPUTexture;\n /** Actual render width; pass dimensions are input.width and output.width. */ width: number;\n /** Actual render height; pass dimensions are input.height and output.height. */ height: number;\n /** Selected complete render, including a selected fallback. */ render: Render;\n}\n/** Optional dimensions for a display pass. */\nexport interface PostProcessOptions {\n /** Output dimensions per invocation, bounded by maxTextureDimension2D. Default undefined preserves input size. Display is the current canvas size, including during export. */\n outputSize?: (input: {width: number; height: number}, display: {width: number; height: number}) => {width: number; height: number};\n}\n/** Synchronous display pass. Images and encoder are borrowed only during the call; do not retain or destroy them. */\nexport type PostProcess = (context: PostProcessContext) => void;\n/** Canvas presentation and shared display settings; obtained from engine.display. */\nexport default class Display {\n /** Display canvas. Default the supplied Engine canvas, or a new canvas (OffscreenCanvas without document). */ readonly canvas: HTMLCanvasElement | OffscreenCanvas;\n /** Tone mapping transform. Default agx. */ toneMapping: ToneMapping = 'agx';\n /** Linear exposure multiplier. Default 1. */ toneMappingExposure = 1;\n /** Contrast multiplier. Default 1. */ contrast = 1;\n /** Saturation multiplier. Default 1. */ saturation = 1;\n /** White balance temperature shift in -1–1. Default 0. */ temperature = 0;\n /** Green/magenta tint in -1–1. Default 0. */ tint = 0;\n /** Vignette strength in 0–1. Default 0. */ vignette = 0;\n /** Bloom intensity; 0 disables it. Default 0. */ bloomIntensity = 0;\n /** Bloom luminance threshold. Default 1. */ bloomThreshold = 1;\n /** Bloom radius in 0–1. Default 0.6. */ bloomRadius = 0.6;\n /** Extended-range WebGPU presentation, ignored on WebGL. Default false. */ hdrOutputEnabled = false;\n /** Display image channel. Default final. AOV channels require explicit Render.aovs. */ channel: DisplayChannel = 'final';\n /** Finite float32 scene-unit depths mapped to black/white; 0 <= near < far. Default [0, 10]. */ aovDepthRange: readonly [number, number] = [0, 10];\n /** Finite positive float32 scene-unit half-range around the origin for position RGB. Default 1. */ aovPositionScale = 1;\n /** Finite positive float32 input-pixel displacement mapped to full motion brightness. Default 16. */ aovMotionScale = 16;\n /** Stable ID lane to colorize. Default object. */ aovIdComponent: AovIdComponent = 'object';\n /** Linear shadow-catcher color. Default black. */ shadowCatcherColor: ColorRGB = [0, 0, 0];\n /** Shadow-catcher opacity multiplier. Default 1. */ shadowCatcherAlpha = 1;\n private constructor(private readonly engine: Engine, canvas: HTMLCanvasElement | OffscreenCanvas) { this.canvas = canvas; }\n /** @internal */ static _create(engine: Engine, canvas: HTMLCanvasElement | OffscreenCanvas) { return new Display(engine, canvas); }\n /** Resizes the drawing buffer; scale-based renders resize at their next refine. */\n setSize(width: number, height: number) {\n if (!Number.isFinite(width) || !Number.isFinite(height) || width < 1 || height < 1) throw new Error('Display dimensions must be positive.');\n width = Math.round(width); height = Math.round(height);\n if (this.canvas.width !== width) this.canvas.width = width;\n if (this.canvas.height !== height) this.canvas.height = height;\n }\n private readonly _filterSettings = new WeakMap<Render, string>();\n private readonly settings = new WeakMap<Render, string>();\n /** @internal */ _configure(render: Render) {\n if (render._engine !== this.engine) throw new Error('Render belongs to another engine.');\n const target = render._output;\n if (!target) return;\n const kind = displayAovKind(this.channel);\n if (!kind && !['final','normal','albedo','shadow','shadowCatcher'].includes(this.channel)) throw new RangeError('Unknown display channel');\n if (kind && !render.aovs.includes(kind)) throw new Error(`AOV ${kind} is not enabled on the selected render`);\n validateAovDisplay({depthRange: this.aovDepthRange, positionScale: this.aovPositionScale, motionScale: this.aovMotionScale, idComponent: this.aovIdComponent});\n const key = displaySettingsKey(this);\n const filterKey = displayFilterSettingsKey(this);\n const previous = this.settings.get(render);\n if (previous !== key) {\n this.settings.set(render, key);\n if (previous !== undefined && this._filterSettings.get(render) !== filterKey) render._displayChanged();\n this._filterSettings.set(render, filterKey);\n }\n target.activate();\n applyDisplaySettings(this, target);\n }\n private readonly _postProcesses: {pass: PostProcess; options: PostProcessOptions}[] = [];\n private _warnedPostProcess = false;\n /** Registers a display pass in order and returns an idempotent removal function. Default no passes. WebGPU only; WebGL skips passes with one warning. Runs after composition on every present/toBlob, without tracing or invalidating denoising. A thrown error discards the whole chain, presents the original image and emits engine error. */\n addPostProcess(pass: PostProcess, options: PostProcessOptions = {}): () => void {\n const entry = {pass, options: {...options}};\n this._postProcesses.push(entry);\n if (this.engine.backend === 'webgl') this.warnPostProcess();\n return () => { const index = this._postProcesses.indexOf(entry); if (index >= 0) this._postProcesses.splice(index, 1); };\n }\n private warnPostProcess() {\n if (!this._warnedPostProcess) { this._warnedPostProcess = true; console.warn('Display post-processing requires WebGPU; passes are ignored on WebGL.'); }\n }\n private compose(render: Render, exporting = false) {\n if (render._engine !== this.engine) throw new Error('Render belongs to another engine.');\n const target = render._output;\n if (!target) return;\n const kind = displayAovKind(this.channel);\n if (!kind && !target.presentationComplete) return;\n if (kind && !render.aovs.includes(kind)) throw new Error(`AOV ${kind} is not enabled on the selected render`);\n if (kind && target.aovReady && !target.aovReady(kind)) return;\n this._configure(render);\n target.drawPostProcess();\n if (this._postProcesses.length && this.engine.backend === 'webgl') this.warnPostProcess();\n try { target.applyPostProcesses?.(this._postProcesses.map(entry => entry.pass), render, this._postProcesses.map(entry => entry.options), exporting ? render._exportCrop : undefined); }\n catch (error) {\n // Preserve the pre-chain export crop even when a callback or size fails.\n target.applyPostProcesses?.([], render, [], exporting ? render._exportCrop : undefined);\n this.engine._notifyError(error);\n }\n return target;\n }\n /** Presents a complete image or fallback. Keeps fallback visible until the first intermediate filter finishes. Does not trace. */\n present(render: Render): Render | undefined {\n if (render._engine !== this.engine) throw new Error('Render belongs to another engine.');\n const ready = this.channel === 'final' && render.fallback ? render._presentable : render._completeFor(this.channel);\n const fallback = render.fallback;\n const selected = ready ? render : fallback && (this.channel === 'final' ? fallback._presentable : fallback._completeFor(this.channel)) ? fallback : undefined;\n if (!selected) return;\n const target = this.compose(selected);\n if (!target) return;\n this.engine._present(target);\n return selected;\n }\n /** Encodes the display chain at its final dimensions (default render dimensions), cropping fixed renders before passes using these settings; leaves the display canvas unchanged. */\n async toBlob(render: Render, options: BlobOptions = {}): Promise<Blob> {\n const target = this.compose(render, true);\n if (!target) throw new Error('Render has no complete image.');\n const presentation = await target.readPresentation();\n const image = this.engine.backend === 'webgpu' ? presentation : render._cropOutput(presentation);\n const canvas = createCanvas(image.width, image.height, 'convertToBlob' in this.canvas);\n const context = canvas.getContext('2d') as CanvasRenderingContext2D | OffscreenCanvasRenderingContext2D | null;\n if (!context) throw new Error('The image encoding context is not available.');\n const bytes = new Uint8ClampedArray(image.data.length);\n for (let i = 0; i < bytes.length; i++) bytes[i] = Math.round(Math.min(1, Math.max(0, image.data[i])) * 255);\n context.putImageData(new ImageData(bytes, image.width, image.height), 0, 0);\n if ('convertToBlob' in canvas) return canvas.convertToBlob({type: options.type ?? 'image/png', quality: options.quality});\n return new Promise((resolve, reject) => canvas.toBlob(blob => blob ? resolve(blob) : reject(new Error('The image could not be encoded')), options.type ?? 'image/png', options.quality));\n }\n}\n"]}
package/lib/Engine.d.ts CHANGED
@@ -118,6 +118,7 @@ export default class Engine {
118
118
  private _pendingBackground;
119
119
  private _disposed;
120
120
  private _readingDepth;
121
+ private _surfaceQuery?;
121
122
  private _renders;
122
123
  private _targetCounter;
123
124
  private _presented?;
@@ -134,7 +135,7 @@ export default class Engine {
134
135
  /** Initializes once; concurrent/repeated calls share the result. */
135
136
  init(): Promise<EngineInfo>;
136
137
  /** Initialization info. Default undefined until init resolves. */ get info(): EngineInfo | undefined;
137
- /** Active backend. Default undefined until initialization completes. */ get backend(): "webgpu" | "webgl" | undefined;
138
+ /** Active backend. Default undefined until initialization completes. */ get backend(): "webgl" | "webgpu" | undefined;
138
139
  /** GPU device. Default undefined before initialization and on WebGL. */ get device(): GPUDevice | undefined;
139
140
  /** Subscribes to shared progress/errors/device loss; returns unsubscribe. */
140
141
  on<K extends keyof EngineEvents>(event: K, listener: (value: EngineEvents[K]) => void): () => void;
package/lib/Engine.js CHANGED
@@ -81,6 +81,8 @@ export default class Engine {
81
81
  _lastBudget = -1;
82
82
  _shaderProgress = '';
83
83
  _events = new Events();
84
+ /** @internal Optional viewer-owned persistent BLAS cache. */
85
+ _bvhCache;
84
86
  _pipeline;
85
87
  _webglRenderer;
86
88
  _gpuDevice;
@@ -121,6 +123,7 @@ export default class Engine {
121
123
  _pendingBackground = true;
122
124
  _disposed = false;
123
125
  _readingDepth = false;
126
+ _surfaceQuery;
124
127
  _renders = new Set();
125
128
  _targetCounter = 0;
126
129
  _presented;
@@ -308,7 +311,7 @@ export default class Engine {
308
311
  config,
309
312
  ...config,
310
313
  builder: this.bvhBuilder === 'tinybvh' && !this._tinyBvhUnavailable ? 'tinybvh' : 'builtin',
311
- useWorker, workerPool: this._bvhWorkerPool, isCancelled,
314
+ useWorker, workerPool: this._bvhWorkerPool, isCancelled, cache: this._bvhCache,
312
315
  rebuild: false, onProgress: options.onProgress
313
316
  });
314
317
  if (isCancelled())
@@ -571,11 +574,36 @@ export default class Engine {
571
574
  try {
572
575
  const camera = cameraSnapshot(this._committedCamera);
573
576
  camera.aspect ??= this.display.canvas.width / this.display.canvas.height;
574
- const result = await this._pipeline.readDepthSamples(camera, area);
577
+ const pending = this._pipeline.readDepthSamples(camera, area);
578
+ this._surfaceQuery = pending;
579
+ const result = await pending;
575
580
  return this._disposed ? undefined : result;
576
581
  }
577
582
  finally {
578
583
  this._readingDepth = false;
584
+ this._surfaceQuery = undefined;
585
+ }
586
+ }
587
+ /** @internal Viewer GPU picking; undefined means unavailable/stale, null means background. */
588
+ async _pick(x, y) {
589
+ packDepthSampleArea({ x, y, size: 0 }, 1);
590
+ while (this._surfaceQuery)
591
+ await this._surfaceQuery.catch(() => { });
592
+ if (!this._ready || !this._committedCamera)
593
+ return;
594
+ const scene = this._sceneRevision, revision = this._cameraRevision;
595
+ const camera = cameraSnapshot(this._committedCamera);
596
+ camera.aspect ??= this.display.canvas.width / this.display.canvas.height;
597
+ this._readingDepth = true;
598
+ try {
599
+ const pending = this._pipeline.pickSurface?.(camera, x, y);
600
+ this._surfaceQuery = pending;
601
+ const result = await pending;
602
+ return this._ready && scene === this._sceneRevision && revision === this._cameraRevision ? result : undefined;
603
+ }
604
+ finally {
605
+ this._readingDepth = false;
606
+ this._surfaceQuery = undefined;
579
607
  }
580
608
  }
581
609
  /** Releases all renders, shared resources, CPU workers and owned denoisers. */
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}\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"]}
1
+ {"version":3,"file":"Engine.js","sourceRoot":"","sources":["../src/Engine.ts"],"names":[],"mappings":"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","sourcesContent":["import type {SurfaceHit} from './renderer/surfaceHit.js';\nimport 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, type StaticBvhCache } 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 /** @internal Optional viewer-owned persistent BLAS cache. */\n _bvhCache?: StaticBvhCache;\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 _surfaceQuery?: Promise<unknown>;\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, cache: this._bvhCache,\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 pending = this._pipeline!.readDepthSamples(camera, area);\n this._surfaceQuery = pending;\n const result = await pending;\n return this._disposed ? undefined : result;\n }\n finally { this._readingDepth = false; this._surfaceQuery = undefined; }\n }\n /** @internal Viewer GPU picking; undefined means unavailable/stale, null means background. */\n async _pick(x: number, y: number): Promise<SurfaceHit | null | undefined> {\n packDepthSampleArea({x, y, size: 0}, 1);\n while (this._surfaceQuery) await this._surfaceQuery.catch(() => {});\n if (!this._ready || !this._committedCamera) return;\n const scene = this._sceneRevision, revision = this._cameraRevision;\n const camera = cameraSnapshot(this._committedCamera);\n camera.aspect ??= this.display.canvas.width / this.display.canvas.height;\n this._readingDepth = true;\n try {\n const pending = this._pipeline!.pickSurface?.(camera, x, y);\n this._surfaceQuery = pending;\n const result = await pending;\n return this._ready && scene === this._sceneRevision && revision === this._cameraRevision ? result : undefined;\n } finally {this._readingDepth = false; this._surfaceQuery = undefined;}\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"]}