@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":"WGPUAov.js","sourceRoot":"","sources":["../../src/renderer/WGPUAov.ts"],"names":[],"mappings":"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","sourcesContent":["import {aovDisplayShader} from './wgsl/aovDisplay.wgsl.js';\nimport {packAovDisplay, type AovDisplayOptions} from './aovDisplay.js';\nimport {aovSnapshotShader, aovSnapshotBinding, AOV_SNAPSHOT_BATCH_SIZE} from './wgsl/aovSnapshot.wgsl.js';\nimport {AovHistory, AOV_KINDS, AOV_LAYOUT, aovMask, type AovKind, type AovFrameSnapshot} from './aov.js';\n/** One target's optional AOV allocations and accepted frame history. */\nexport class WGPUAov {\n readonly history = new AovHistory();\n width = 0; height = 0; samples = 0; centerReady = false;\n accumulation?: GPUBuffer; center?: GPUBuffer; previousCenter?: GPUBuffer; scene?: GPUBuffer;\n frame?: AovFrameSnapshot;\n private displayPipeline?: GPUComputePipeline;\n private displayTexture?: GPUTexture;\n private readonly resolvePipelines = new Map<string, GPUComputePipeline>();\n private scenePrimitives?: Uint32Array;\n private scenePrimitiveOffset = 0;\n private snapshotGeneration = 0;\n private readonly snapshotPool = new Map<AovKind, GPUBuffer>();\n private readonly snapshotLeases = new WeakMap<GPUBuffer, {kind: AovKind; generation: number}>();\n private readonly snapshotBuffers = new Set<GPUBuffer>();\n constructor(readonly device: GPUDevice) {}\n reset() {\n if (this.centerReady && this.center && this.previousCenter) {\n const encoder=this.device.createCommandEncoder();encoder.copyBufferToBuffer(this.center,0,this.previousCenter,0,this.center.size);this.device.queue.submit([encoder.finish()]);\n }\n this.samples = 0; this.centerReady = false; this.frame = undefined; }\n resize(width: number, height: number) {\n if (width === this.width && height === this.height) return;\n if (width*height*AOV_LAYOUT.accumulatedBytes>this.device.limits.maxStorageBufferBindingSize || width*height*AOV_LAYOUT.accumulatedBytes>this.device.limits.maxBufferSize) throw new RangeError('AOV accumulation exceeds device buffer limits');\n this.dispose(); this.history.clear(); this.reset(); this.width = width; this.height = height;\n const usage = GPUBufferUsage.STORAGE | GPUBufferUsage.COPY_DST | GPUBufferUsage.COPY_SRC;\n this.accumulation = this.device.createBuffer({label: 'AOV accumulation', size: width * height * AOV_LAYOUT.accumulatedBytes, usage});\n this.previousCenter = this.device.createBuffer({label: 'Previous AOV center', size: width*height*AOV_LAYOUT.centerBytes, usage});\n this.center = this.device.createBuffer({label: 'AOV center', size: width * height * AOV_LAYOUT.centerBytes, usage});\n }\n setScene(words: Uint32Array, primitiveIds?: Uint32Array) {\n const bytes = words.byteLength + (primitiveIds?.byteLength ?? 0);\n if (bytes > this.device.limits.maxStorageBufferBindingSize) throw new RangeError('AOV scene metadata exceeds device storage binding limit');\n let replaced = false;\n if (!this.scene || this.scene.size < bytes) {\n this.scene?.destroy();\n this.scene = this.device.createBuffer({label: 'AOV identities/history', size: Math.max(16, bytes), usage: GPUBufferUsage.STORAGE | GPUBufferUsage.COPY_DST});\n replaced = true;\n }\n this.device.queue.writeBuffer(this.scene, 0, words);\n // Primitive-cache arrays are immutable. Camera, material and rigid edits\n // update only the prefix; topology/storage replacements change the tail's\n // identity, and instance/material counts can move its byte offset.\n if (primitiveIds && (replaced || this.scenePrimitives !== primitiveIds || this.scenePrimitiveOffset !== words.byteLength)) {\n this.device.queue.writeBuffer(this.scene, words.byteLength, primitiveIds);\n }\n this.scenePrimitives = primitiveIds; this.scenePrimitiveOffset = words.byteLength;\n }\n get bytes() { return (this.accumulation?.size ?? 0) + (this.center?.size ?? 0) + (this.previousCenter?.size ?? 0) + (this.scene?.size ?? 0) + (this.displayTexture ? this.width*this.height*8 : 0) + [...this.snapshotBuffers].reduce((bytes, buffer) => bytes + buffer.size, 0); }\n snapshot(kinds: readonly AovKind[]): Partial<Record<AovKind,GPUBuffer>> {\n if(!this.accumulation || !this.center || !this.samples) throw new Error('AOV output is not ready');\n const device = this.device;\n aovMask(kinds);\n const unique = AOV_KINDS.filter(kind => kinds.includes(kind));\n const batches: {kinds: AovKind[]; pipeline: GPUComputePipeline}[] = [];\n for (let offset = 0; offset < unique.length; offset += AOV_SNAPSHOT_BATCH_SIZE) {\n const batch = unique.slice(offset, offset + AOV_SNAPSHOT_BATCH_SIZE), key = batch.join(',');\n let pipeline = this.resolvePipelines.get(key);\n if (!pipeline) {\n pipeline = device.createComputePipeline({label: 'AOV snapshot', layout: 'auto',\n compute: {module: device.createShaderModule({code: aovSnapshotShader(batch)}), entryPoint: 'main'}});\n this.resolvePipelines.set(key, pipeline);\n }\n batches.push({kinds: batch, pipeline});\n }\n const buffers: Partial<Record<AovKind, GPUBuffer>> = {};\n if (!batches.length) return buffers;\n const parameters = device.createBuffer({size: 16, usage: GPUBufferUsage.UNIFORM, mappedAtCreation: true});\n new Uint32Array(parameters.getMappedRange()).set([this.width, this.height, this.samples, 0]); parameters.unmap();\n try {\n const encoder = device.createCommandEncoder({label: 'AOV snapshot'}), pass = encoder.beginComputePass();\n for (const {kinds: batch, pipeline} of batches) {\n const entries: GPUBindGroupEntry[] = [\n {binding: 0, resource: {buffer: this.accumulation}},\n {binding: 1, resource: {buffer: this.center}},\n {binding: 3, resource: {buffer: parameters}}\n ];\n batch.forEach((kind, index) => {\n const buffer = this.snapshotPool.get(kind) ?? device.createBuffer({label: `Custom ${kind} input`, size: this.width * this.height * 16,\n usage: GPUBufferUsage.STORAGE | GPUBufferUsage.COPY_SRC | GPUBufferUsage.COPY_DST});\n this.snapshotPool.delete(kind);\n this.snapshotLeases.set(buffer, {kind, generation: this.snapshotGeneration});\n this.snapshotBuffers.add(buffer);\n buffers[kind] = buffer;\n entries.push({binding: aovSnapshotBinding(index), resource: {buffer}});\n });\n pass.setPipeline(pipeline);\n pass.setBindGroup(0, device.createBindGroup({layout: pipeline.getBindGroupLayout(0), entries}));\n pass.dispatchWorkgroups(Math.ceil(this.width / 8), Math.ceil(this.height / 8));\n }\n pass.end(); device.queue.submit([encoder.finish()]);\n return buffers;\n } catch (error) {\n // Nothing was submitted, so these unfinished outputs can be retired now.\n Object.values(buffers).forEach(buffer => {\n if (buffer) {this.snapshotLeases.delete(buffer); this.snapshotBuffers.delete(buffer); buffer.destroy();}\n });\n throw error;\n } finally { parameters.destroy(); }\n }\n // Call only after the consumer and its queued GPU work have finished. Each\n // in-flight denoiser owns separate outputs, including cancelled jobs whose\n // callbacks have not settled. Keep at most one reusable buffer per kind.\n releaseSnapshot(buffers: Partial<Record<AovKind, GPUBuffer>>) {\n for (const buffer of Object.values(buffers)) {\n if (!buffer) continue;\n const lease = this.snapshotLeases.get(buffer);\n if (!lease) continue;\n this.snapshotLeases.delete(buffer);\n if (lease.generation === this.snapshotGeneration && !this.snapshotPool.has(lease.kind)) {\n this.snapshotPool.set(lease.kind, buffer);\n } else { this.snapshotBuffers.delete(buffer); buffer.destroy(); }\n }\n }\n visualize(kind: AovKind, options: AovDisplayOptions, linear: boolean): GPUTexture {\n if(!this.accumulation || !this.center || !this.samples) throw new Error('AOV output is not ready');\n const device=this.device;\n this.displayPipeline ??= device.createComputePipeline({label:'AOV visualization',layout:'auto',compute:{module:device.createShaderModule({code:aovDisplayShader('rgba16float')}),entryPoint:'main'}});\n if(!this.displayTexture || this.displayTexture.width!==this.width || this.displayTexture.height!==this.height){\n this.displayTexture?.destroy();\n this.displayTexture=device.createTexture({label:'AOV display image',size:[this.width,this.height],format:'rgba16float',usage:GPUTextureUsage.STORAGE_BINDING|GPUTextureUsage.TEXTURE_BINDING|GPUTextureUsage.COPY_SRC});\n }\n const words=packAovDisplay(this.width,this.height,this.samples,kind,options,linear);\n const parameters=device.createBuffer({size:48,usage:GPUBufferUsage.UNIFORM,mappedAtCreation:true});new Uint32Array(parameters.getMappedRange()).set(words);parameters.unmap();\n const group=device.createBindGroup({layout:this.displayPipeline.getBindGroupLayout(0),entries:[{binding:0,resource:{buffer:this.accumulation}},{binding:1,resource:{buffer:this.center}},{binding:2,resource:this.displayTexture.createView()},{binding:3,resource:{buffer:parameters}}]});\n const encoder=device.createCommandEncoder(),pass=encoder.beginComputePass();pass.setPipeline(this.displayPipeline);pass.setBindGroup(0,group);pass.dispatchWorkgroups(Math.ceil(this.width/8),Math.ceil(this.height/8));pass.end();device.queue.submit([encoder.finish()]);parameters.destroy();\n return this.displayTexture;\n }\n async read(kind: AovKind) {\n const center = kind === 'id' || kind === 'motion';\n const source = center ? this.center! : this.accumulation!;\n const staging = this.device.createBuffer({size: source.size, usage: GPUBufferUsage.MAP_READ | GPUBufferUsage.COPY_DST});\n try {\n const encoder = this.device.createCommandEncoder(); encoder.copyBufferToBuffer(source, 0, staging, 0, source.size);\n this.device.queue.submit([encoder.finish()]); await staging.mapAsync(GPUMapMode.READ);\n const f = new Float32Array(staging.getMappedRange()), u = new Uint32Array(f.buffer);\n const data = kind === 'id' ? new Uint32Array(this.width*this.height*4) : new Float32Array(this.width*this.height*4);\n for (let y = 0; y < this.height; y++) for (let x = 0; x < this.width; x++) {\n const target = (y * this.width + x) * 4;\n // Tracing uses OpenGL camera coordinates; API images are top row first.\n const pixel = ((this.height-1-y)*this.width+x), o = pixel * (center ? 8 : 16);\n if (kind === 'id') data.set(u.subarray(o, o+4), target);\n else if (kind === 'motion') data.set([f[o+4],f[o+5],0,f[o+7]], target);\n else {\n const hits = f[o+7], coverage = hits / Math.max(1, this.samples), inv = hits > 0 ? 1 / hits : 0;\n if (kind === 'depth') data.set([f[o]*inv, 0, 0, coverage], target);\n else if (kind === 'position') data.set([f[o+4]*inv, f[o+5]*inv, f[o+6]*inv, coverage], target);\n else if (kind === 'roughness') data.set([f[o+1]*inv, f[o+2]*inv, f[o+3]*inv, coverage], target);\n else { const offset = kind === 'diffuseAlbedo' ? o+8 : o+12, valid = f[offset+3];\n const scale = valid > 0 ? 1/valid : 0;\n data.set([f[offset]*scale, f[offset+1]*scale, f[offset+2]*scale, valid / Math.max(1,this.samples)], target); }\n }\n }\n return {width: this.width, height: this.height, data};\n } finally { if (staging.mapState === 'mapped') staging.unmap(); staging.destroy(); }\n }\n dispose() {\n const texture=this.displayTexture;this.displayTexture=undefined;\n this.scenePrimitives = undefined; this.scenePrimitiveOffset = 0;\n this.snapshotGeneration++;\n const pooled = [...this.snapshotPool.values()]; this.snapshotPool.clear();\n pooled.forEach(buffer => this.snapshotBuffers.delete(buffer));\n const buffers=[this.accumulation,this.center,this.scene,this.previousCenter,...pooled];\n this.accumulation=this.center=this.scene=this.previousCenter=undefined;\n void this.device.queue.onSubmittedWorkDone().catch(()=>undefined).then(()=>{texture?.destroy();buffers.forEach(buffer=>buffer?.destroy());});\n }\n}\n"]}
1
+ {"version":3,"file":"WGPUAov.js","sourceRoot":"","sources":["../../src/renderer/WGPUAov.ts"],"names":[],"mappings":"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","sourcesContent":["import {textureBytes} from './gpuMemory.js';\nimport {compactAovResolveCode} from './wgsl/aovCompact.wgsl.js';\nimport {aovBorrowDepthShader, aovBorrowReflectanceShader} from './wgsl/aovResolve.wgsl.js';\nimport {aovDisplayShader} from './wgsl/aovDisplay.wgsl.js';\nimport {packAovDisplay, type AovDisplayOptions} from './aovDisplay.js';\nimport {aovSnapshotShader, aovSnapshotBinding, AOV_SNAPSHOT_BATCH_SIZE} from './wgsl/aovSnapshot.wgsl.js';\nimport {AovHistory, AOV_KINDS, AOV_LAYOUT, aovLaneKind, aovMask, type AovKind, type AovFrameSnapshot} from './aov.js';\n/** @internal Content revision of each borrowed AOV texture; changes whenever it is re-resolved. */\nexport const borrowedAovRevision = new WeakMap<GPUTexture, number>();\n/** One target's optional AOV allocations and accepted frame history. */\nexport class WGPUAov {\n readonly history = new AovHistory();\n width = 0; height = 0; samples = 0; centerReady = false; compact = false;\n private revision = 0;\n private readonly borrowed = new Map<AovKind, {image: GPUTexture; pipeline: GPUComputePipeline | GPURenderPipeline; samples: number; revision: number}>();\n accumulation?: GPUBuffer; center?: GPUBuffer; previousCenter?: GPUBuffer; scene?: GPUBuffer;\n frame?: AovFrameSnapshot;\n private displayPipeline?: GPUComputePipeline;\n private displayTexture?: GPUTexture;\n private readonly resolvePipelines = new Map<string, GPUComputePipeline>();\n private scenePrimitives?: Uint32Array;\n private scenePrimitiveOffset = 0;\n private snapshotGeneration = 0;\n private readonly snapshotPool = new Map<AovKind, GPUBuffer>();\n private readonly snapshotLeases = new WeakMap<GPUBuffer, {kind: AovKind; generation: number}>();\n private readonly snapshotBuffers = new Set<GPUBuffer>();\n constructor(readonly device: GPUDevice) {}\n private resolveCode(code: string) {\n return this.compact ? compactAovResolveCode(code) : code;\n }\n reset() {\n this.revision++;\n if (!this.compact && this.centerReady && this.center && this.previousCenter) {\n const encoder=this.device.createCommandEncoder();encoder.copyBufferToBuffer(this.center,0,this.previousCenter,0,this.center.size);this.device.queue.submit([encoder.finish()]);\n }\n this.samples = 0; this.centerReady = false; this.frame = undefined; }\n resize(width: number, height: number, compact = false) {\n if (width === this.width && height === this.height && compact === this.compact) return;\n const stride = compact ? 24 : AOV_LAYOUT.accumulatedBytes;\n if (width*height*stride>this.device.limits.maxStorageBufferBindingSize || width*height*stride>this.device.limits.maxBufferSize) throw new RangeError('AOV accumulation exceeds device buffer limits');\n this.dispose(); this.history.clear(); this.reset(); this.width = width; this.height = height; this.compact = compact; this.displayPipeline = undefined;\n const usage = GPUBufferUsage.STORAGE | GPUBufferUsage.COPY_DST | GPUBufferUsage.COPY_SRC;\n this.accumulation = this.device.createBuffer({label: 'AOV accumulation', size: width * height * stride, usage});\n this.previousCenter = this.device.createBuffer({label: 'Previous AOV center', size: compact ? 32 : width*height*AOV_LAYOUT.centerBytes, usage});\n this.center = this.device.createBuffer({label: 'AOV center', size: compact ? 32 : width * height * AOV_LAYOUT.centerBytes, usage});\n }\n setScene(words: Uint32Array, primitiveIds?: Uint32Array) {\n const bytes = words.byteLength + (primitiveIds?.byteLength ?? 0);\n if (bytes > this.device.limits.maxStorageBufferBindingSize) throw new RangeError('AOV scene metadata exceeds device storage binding limit');\n let replaced = false;\n if (!this.scene || this.scene.size < bytes) {\n this.scene?.destroy();\n this.scene = this.device.createBuffer({label: 'AOV identities/history', size: Math.max(16, bytes), usage: GPUBufferUsage.STORAGE | GPUBufferUsage.COPY_DST});\n replaced = true;\n }\n this.device.queue.writeBuffer(this.scene, 0, words);\n // Primitive-cache arrays are immutable. Camera, material and rigid edits\n // update only the prefix; topology/storage replacements change the tail's\n // identity, and instance/material counts can move its byte offset.\n if (primitiveIds && (replaced || this.scenePrimitives !== primitiveIds || this.scenePrimitiveOffset !== words.byteLength)) {\n this.device.queue.writeBuffer(this.scene, words.byteLength, primitiveIds);\n }\n this.scenePrimitives = primitiveIds; this.scenePrimitiveOffset = words.byteLength;\n }\n get bytes() { return (this.accumulation?.size ?? 0) + (this.center?.size ?? 0) + (this.previousCenter?.size ?? 0) + (this.scene?.size ?? 0) + (this.displayTexture ? this.width*this.height*8 : 0) + [...this.borrowed.values()].reduce((bytes, entry) => bytes + textureBytes(entry.image), 0) + [...this.snapshotBuffers].reduce((bytes, buffer) => bytes + buffer.size, 0); }\n snapshot(kinds: readonly AovKind[]): Partial<Record<AovKind,GPUBuffer>> {\n if(!this.accumulation || !this.center || !this.samples) throw new Error('AOV output is not ready');\n const device = this.device;\n aovMask(kinds);\n const unique = AOV_KINDS.filter(kind => kinds.includes(kind));\n const batches: {kinds: AovKind[]; pipeline: GPUComputePipeline}[] = [];\n for (let offset = 0; offset < unique.length; offset += AOV_SNAPSHOT_BATCH_SIZE) {\n const batch = unique.slice(offset, offset + AOV_SNAPSHOT_BATCH_SIZE), key = `${this.compact}:${batch.join(',')}`;\n let pipeline = this.resolvePipelines.get(key);\n if (!pipeline) {\n pipeline = device.createComputePipeline({label: 'AOV snapshot', layout: 'auto',\n compute: {module: device.createShaderModule({code: this.resolveCode(aovSnapshotShader(batch))}), entryPoint: 'main', ...(this.compact ? {constants: {AOV_COMPACT: 1}} : {})}});\n this.resolvePipelines.set(key, pipeline);\n }\n batches.push({kinds: batch, pipeline});\n }\n const buffers: Partial<Record<AovKind, GPUBuffer>> = {};\n if (!batches.length) return buffers;\n const parameters = device.createBuffer({size: 16, usage: GPUBufferUsage.UNIFORM, mappedAtCreation: true});\n new Uint32Array(parameters.getMappedRange()).set([this.width, this.height, this.samples, 0]); parameters.unmap();\n try {\n const encoder = device.createCommandEncoder({label: 'AOV snapshot'}), pass = encoder.beginComputePass();\n for (const {kinds: batch, pipeline} of batches) {\n const entries: GPUBindGroupEntry[] = [\n {binding: 0, resource: {buffer: this.accumulation}},\n {binding: 1, resource: {buffer: this.center}},\n {binding: 3, resource: {buffer: parameters}}\n ];\n batch.forEach((kind, index) => {\n const buffer = this.snapshotPool.get(kind) ?? device.createBuffer({label: `Custom ${kind} input`, size: this.width * this.height * 16,\n usage: GPUBufferUsage.STORAGE | GPUBufferUsage.COPY_SRC | GPUBufferUsage.COPY_DST});\n this.snapshotPool.delete(kind);\n this.snapshotLeases.set(buffer, {kind, generation: this.snapshotGeneration});\n this.snapshotBuffers.add(buffer);\n buffers[kind] = buffer;\n entries.push({binding: aovSnapshotBinding(index), resource: {buffer}});\n });\n pass.setPipeline(pipeline);\n pass.setBindGroup(0, device.createBindGroup({layout: pipeline.getBindGroupLayout(0), entries}));\n pass.dispatchWorkgroups(Math.ceil(this.width / 8), Math.ceil(this.height / 8));\n }\n pass.end(); device.queue.submit([encoder.finish()]);\n return buffers;\n } catch (error) {\n // Nothing was submitted, so these unfinished outputs can be retired now.\n Object.values(buffers).forEach(buffer => {\n if (buffer) {this.snapshotLeases.delete(buffer); this.snapshotBuffers.delete(buffer); buffer.destroy();}\n });\n throw error;\n } finally { parameters.destroy(); }\n }\n // Call only after the consumer and its queued GPU work have finished. Each\n // in-flight denoiser owns separate outputs, including cancelled jobs whose\n // callbacks have not settled. Keep at most one reusable buffer per kind.\n releaseSnapshot(buffers: Partial<Record<AovKind, GPUBuffer>>) {\n for (const buffer of Object.values(buffers)) {\n if (!buffer) continue;\n const lease = this.snapshotLeases.get(buffer);\n if (!lease) continue;\n this.snapshotLeases.delete(buffer);\n if (lease.generation === this.snapshotGeneration && !this.snapshotPool.has(lease.kind)) {\n this.snapshotPool.set(lease.kind, buffer);\n } else { this.snapshotBuffers.delete(buffer); buffer.destroy(); }\n }\n }\n visualize(kind: AovKind, options: AovDisplayOptions, linear: boolean): GPUTexture {\n if(!this.accumulation || !this.center || !this.samples) throw new Error('AOV output is not ready');\n const device=this.device;\n this.displayPipeline ??= device.createComputePipeline({label:'AOV visualization',layout:'auto',compute:{module:device.createShaderModule({code:this.resolveCode(aovDisplayShader('rgba16float'))}),entryPoint:'main',...(this.compact ? {constants:{AOV_COMPACT:1}} : {})}});\n if(!this.displayTexture || this.displayTexture.width!==this.width || this.displayTexture.height!==this.height){\n this.displayTexture?.destroy();\n this.displayTexture=device.createTexture({label:'AOV display image',size:[this.width,this.height],format:'rgba16float',usage:GPUTextureUsage.STORAGE_BINDING|GPUTextureUsage.TEXTURE_BINDING|GPUTextureUsage.COPY_SRC});\n }\n const words=packAovDisplay(this.width,this.height,this.samples,kind,options,linear);\n const parameters=device.createBuffer({size:48,usage:GPUBufferUsage.UNIFORM,mappedAtCreation:true});new Uint32Array(parameters.getMappedRange()).set(words);parameters.unmap();\n const group=device.createBindGroup({layout:this.displayPipeline.getBindGroupLayout(0),entries:[{binding:0,resource:{buffer:this.accumulation}},{binding:1,resource:{buffer:this.center}},{binding:2,resource:this.displayTexture.createView()},{binding:3,resource:{buffer:parameters}}]});\n const encoder=device.createCommandEncoder(),pass=encoder.beginComputePass();pass.setPipeline(this.displayPipeline);pass.setBindGroup(0,group);pass.dispatchWorkgroups(Math.ceil(this.width/8),Math.ceil(this.height/8));pass.end();device.queue.submit([encoder.finish()]);parameters.destroy();\n return this.displayTexture;\n }\n texture(kind: 'depth' | 'diffuseColor' | 'specularColor'): GPUTexture | undefined {\n if (!this.samples || !this.accumulation || !this.center) return;\n const device = this.device;\n let entry = this.borrowed.get(kind);\n if (!entry) {\n // Reflectance in [0,1] is stored sRGB-encoded in 8 bits (decoded on load), halving its memory\n // with fine steps for dark albedo; depth keeps float32 precision.\n const depth = kind === 'depth', format: GPUTextureFormat = depth ? 'rg32float' : 'rgba8unorm-srgb';\n const constants = this.compact ? {constants: {AOV_COMPACT: 1}} : {};\n let pipeline: GPUComputePipeline | GPURenderPipeline;\n if (depth) {\n pipeline = device.createComputePipeline({label: `Borrow ${kind}`, layout: 'auto', compute: {\n module: device.createShaderModule({code:this.resolveCode(aovBorrowDepthShader)}), entryPoint: 'main', ...constants}});\n } else {\n const module = device.createShaderModule({code:this.resolveCode(aovBorrowReflectanceShader)});\n pipeline = device.createRenderPipeline({label: `Borrow ${kind}`, layout: 'auto', vertex: {module, entryPoint: 'vertex', ...constants},\n fragment: {module, entryPoint: 'fragment', targets: [{format}], ...constants}});\n }\n const image = device.createTexture({label: `Borrow ${kind}`, size: [this.width,this.height], format,\n usage: (depth ? GPUTextureUsage.STORAGE_BINDING : GPUTextureUsage.RENDER_ATTACHMENT) | GPUTextureUsage.TEXTURE_BINDING | GPUTextureUsage.COPY_SRC});\n entry = {image, pipeline, samples: -1, revision: -1}; this.borrowed.set(kind, entry);\n }\n if (entry.samples !== this.samples || entry.revision !== this.revision) {\n const parameters = device.createBuffer({size:16,usage:GPUBufferUsage.UNIFORM,mappedAtCreation:true});\n new Uint32Array(parameters.getMappedRange()).set([this.width,this.height,this.samples,aovLaneKind(kind)]); parameters.unmap();\n const encoder = device.createCommandEncoder();\n const entries: GPUBindGroupEntry[] = [{binding:0,resource:{buffer:this.accumulation}},{binding:1,resource:{buffer:this.center}},{binding:3,resource:{buffer:parameters}}];\n if (kind === 'depth') {\n const pipeline = entry.pipeline as GPUComputePipeline;\n const group = device.createBindGroup({layout:pipeline.getBindGroupLayout(0),entries:[...entries,{binding:2,resource:entry.image.createView()}]});\n const pass = encoder.beginComputePass({label:`Resolve ${kind}`});\n pass.setPipeline(pipeline);pass.setBindGroup(0,group);pass.dispatchWorkgroups(Math.ceil(this.width/8),Math.ceil(this.height/8));pass.end();\n } else {\n const pipeline = entry.pipeline as GPURenderPipeline;\n const group = device.createBindGroup({layout:pipeline.getBindGroupLayout(0),entries});\n const pass = encoder.beginRenderPass({label:`Resolve ${kind}`,colorAttachments:[{view:entry.image.createView(),loadOp:'clear',storeOp:'store'}]});\n pass.setPipeline(pipeline);pass.setBindGroup(0,group);pass.draw(3);pass.end();\n }\n device.queue.submit([encoder.finish()]);parameters.destroy();entry.samples=this.samples;entry.revision=this.revision;\n borrowedAovRevision.set(entry.image, (borrowedAovRevision.get(entry.image) ?? 0) + 1);\n }\n return entry.image;\n }\n async read(kind: AovKind) {\n if (this.compact) {\n const buffers = this.snapshot([kind]), source = buffers[kind]!;\n const staging = this.device.createBuffer({size: source.size, usage: GPUBufferUsage.MAP_READ | GPUBufferUsage.COPY_DST});\n try {\n const encoder = this.device.createCommandEncoder();encoder.copyBufferToBuffer(source,0,staging,0,source.size);\n this.device.queue.submit([encoder.finish()]);await staging.mapAsync(GPUMapMode.READ);\n return {width:this.width,height:this.height,data:new Float32Array(staging.getMappedRange().slice(0))};\n } finally {\n if(staging.mapState==='mapped')staging.unmap();staging.destroy();\n this.snapshotLeases.delete(source);this.snapshotBuffers.delete(source);source.destroy();\n }\n }\n const center = kind === 'id' || kind === 'motion';\n const source = center ? this.center! : this.accumulation!;\n const staging = this.device.createBuffer({size: source.size, usage: GPUBufferUsage.MAP_READ | GPUBufferUsage.COPY_DST});\n try {\n const encoder = this.device.createCommandEncoder(); encoder.copyBufferToBuffer(source, 0, staging, 0, source.size);\n this.device.queue.submit([encoder.finish()]); await staging.mapAsync(GPUMapMode.READ);\n const f = new Float32Array(staging.getMappedRange()), u = new Uint32Array(f.buffer);\n const data = kind === 'id' ? new Uint32Array(this.width*this.height*4) : new Float32Array(this.width*this.height*4);\n for (let y = 0; y < this.height; y++) for (let x = 0; x < this.width; x++) {\n const target = (y * this.width + x) * 4;\n // Tracing uses OpenGL camera coordinates; API images are top row first.\n const pixel = ((this.height-1-y)*this.width+x), o = pixel * (center ? 8 : 16);\n if (kind === 'id') data.set(u.subarray(o, o+4), target);\n else if (kind === 'motion') data.set([f[o+4],f[o+5],0,f[o+7]], target);\n else {\n const hits = f[o+7], coverage = hits / Math.max(1, this.samples), inv = hits > 0 ? 1 / hits : 0;\n if (kind === 'depth') data.set([f[o]*inv, 0, 0, coverage], target);\n else if (kind === 'position') data.set([f[o+4]*inv, f[o+5]*inv, f[o+6]*inv, coverage], target);\n else if (kind === 'roughness') data.set([f[o+1]*inv, f[o+2]*inv, f[o+3]*inv, coverage], target);\n else { const offset = aovLaneKind(kind) === 3 ? o+8 : o+12, valid = f[offset+3];\n const scale = valid > 0 ? 1/valid : 0;\n data.set([f[offset]*scale, f[offset+1]*scale, f[offset+2]*scale, valid / Math.max(1,this.samples)], target); }\n }\n }\n return {width: this.width, height: this.height, data};\n } finally { if (staging.mapState === 'mapped') staging.unmap(); staging.destroy(); }\n }\n dispose() {\n const borrowed = [...this.borrowed.values()];this.borrowed.clear();\n const texture=this.displayTexture;this.displayTexture=undefined;\n this.scenePrimitives = undefined; this.scenePrimitiveOffset = 0;\n this.snapshotGeneration++;\n const pooled = [...this.snapshotPool.values()]; this.snapshotPool.clear();\n pooled.forEach(buffer => this.snapshotBuffers.delete(buffer));\n const buffers=[this.accumulation,this.center,this.scene,this.previousCenter,...pooled];\n this.accumulation=this.center=this.scene=this.previousCenter=undefined;\n void this.device.queue.onSubmittedWorkDone().catch(()=>undefined).then(()=>{borrowed.forEach(entry=>entry.image.destroy());texture?.destroy();buffers.forEach(buffer=>buffer?.destroy());});\n }\n}\n"]}
@@ -1,4 +1,9 @@
1
1
  import { createCanvas } from '../util/canvas.js';
2
+ // A canvas returns the same context to every engine, and engine disposal defers
3
+ // releasing its surface until submitted GPU work finishes. Only the surface that
4
+ // configured the context last may unconfigure it, so a later engine on the same
5
+ // canvas keeps presenting.
6
+ const owners = new WeakMap();
2
7
  /** One canvas surface; composing or exporting an image never reconfigures it. */
3
8
  export class WGPUCanvasSurface {
4
9
  device;
@@ -11,6 +16,7 @@ export class WGPUCanvasSurface {
11
16
  this.standardFormat = standardFormat;
12
17
  this.context = canvas.getContext('webgpu');
13
18
  this.context.configure({ device, format: standardFormat, alphaMode: 'premultiplied' });
19
+ owners.set(this.context, this);
14
20
  }
15
21
  get format() { return this.hdr ? 'rgba16float' : this.standardFormat; }
16
22
  get supportsHDR() {
@@ -43,6 +49,11 @@ export class WGPUCanvasSurface {
43
49
  ? { device: this.device, format: 'rgba16float', alphaMode: 'premultiplied', colorSpace: 'srgb', toneMapping: { mode: 'extended' } }
44
50
  : { device: this.device, format: this.standardFormat, alphaMode: 'premultiplied' });
45
51
  }
46
- dispose() { this.context.unconfigure?.(); }
52
+ dispose() {
53
+ if (owners.get(this.context) !== this)
54
+ return;
55
+ owners.delete(this.context);
56
+ this.context.unconfigure?.();
57
+ }
47
58
  }
48
59
  //# sourceMappingURL=WGPUCanvasSurface.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"WGPUCanvasSurface.js","sourceRoot":"","sources":["../../src/renderer/WGPUCanvasSurface.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,YAAY,EAAC,MAAM,mBAAmB,CAAC;AAG/C,iFAAiF;AACjF,MAAM,OAAO,iBAAiB;IAI8C;IAAoC;IAHrG,OAAO,CAAqB;IACrC,GAAG,GAAG,KAAK,CAAC;IACJ,aAAa,CAAW;IAChC,YAAY,MAA2C,EAAmB,MAAiB,EAAmB,cAAgC;QAApE,WAAM,GAAN,MAAM,CAAW;QAAmB,mBAAc,GAAd,cAAc,CAAkB;QAC5I,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC,UAAU,CAAC,QAAQ,CAAwB,CAAC;QAClE,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,EAAC,MAAM,EAAE,MAAM,EAAE,cAAc,EAAE,SAAS,EAAE,eAAe,EAAC,CAAC,CAAC;IACvF,CAAC;IACD,IAAI,MAAM,KAAI,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,aAAsB,CAAC,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC,CAAA,CAAC;IAC9E,IAAI,WAAW;QACb,IAAI,IAAI,CAAC,aAAa,KAAK,SAAS;YAAE,OAAO,IAAI,CAAC,aAAa,CAAC;QAChE,IAAI,CAAC,aAAa,GAAG,KAAK,CAAC;QAC3B,IAAI,KAAK,GAA8B,IAAI,CAAC;QAC5C,IAAI,CAAC;YACH,KAAK,GAAG,YAAY,EAAE,CAAC,UAAU,CAAC,QAAQ,CAA8B,CAAC;YACzE,IAAI,CAAC,KAAK;gBAAE,OAAO,KAAK,CAAC;YACzB,KAAK,CAAC,SAAS,CAAC,EAAC,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,aAAa,EAAE,SAAS,EAAE,eAAe,EAAE,UAAU,EAAE,MAAM,EAAE,WAAW,EAAE,EAAC,IAAI,EAAE,UAAU,EAAC,EAAqB,CAAC,CAAC;YACnK,MAAM,OAAO,GAAG,KAAK,CAAC,gBAAgB,EAAE,EAAE,CAAC;YAC3C,IAAI,CAAC,aAAa,GAAG,OAAO,EAAE,MAAM,KAAK,aAAa,IAAI,OAAO,CAAC,WAAW,EAAE,IAAI,KAAK,UAAU,CAAC;QACrG,CAAC;QAAC,MAAM,CAAC;YAAA,IAAI,CAAC,aAAa,GAAG,KAAK,CAAC;QAAA,CAAC;gBAC7B,CAAC;YAAA,KAAK,EAAE,WAAW,EAAE,EAAE,CAAC;QAAA,CAAC;QACjC,OAAO,IAAI,CAAC,aAAa,CAAC;IAC5B,CAAC;IACD,SAAS,CAAC,OAAgB;QACxB,MAAM,MAAM,GAAG,OAAO,IAAI,IAAI,CAAC,WAAW,CAAC;QAC3C,IAAI,MAAM,KAAK,IAAI,CAAC,GAAG;YAAE,OAAO;QAChC,IAAI,CAAC,GAAG,GAAG,MAAM,CAAC;QAClB,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,MAAM;YAC3B,CAAC,CAAC,EAAC,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,aAAa,EAAE,SAAS,EAAE,eAAe,EAAE,UAAU,EAAE,MAAM,EAAE,WAAW,EAAE,EAAC,IAAI,EAAE,UAAU,EAAC,EAAqB;YACnJ,CAAC,CAAC,EAAC,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,CAAC,cAAc,EAAE,SAAS,EAAE,eAAe,EAAC,CAAC,CAAC;IACtF,CAAC;IACD,OAAO,KAAI,IAAI,CAAC,OAAO,CAAC,WAAW,EAAE,EAAE,CAAC,CAAA,CAAC;CAC1C","sourcesContent":["import {createCanvas} from '../util/canvas.js';\ntype HDRConfiguration = GPUCanvasConfiguration & {toneMapping: {mode: 'extended'}};\ntype InspectableContext = GPUCanvasContext & {getConfiguration?: () => GPUCanvasConfiguration & {toneMapping?: {mode?: string}}};\n/** One canvas surface; composing or exporting an image never reconfigures it. */\nexport class WGPUCanvasSurface {\n readonly context: InspectableContext;\n hdr = false;\n private compatibleHDR?: boolean;\n constructor(canvas: HTMLCanvasElement | OffscreenCanvas, private readonly device: GPUDevice, private readonly standardFormat: GPUTextureFormat) {\n this.context = canvas.getContext('webgpu')! as InspectableContext;\n this.context.configure({device, format: standardFormat, alphaMode: 'premultiplied'});\n }\n get format() {return this.hdr ? 'rgba16float' as const : this.standardFormat;}\n get supportsHDR() {\n if (this.compatibleHDR !== undefined) return this.compatibleHDR;\n this.compatibleHDR = false;\n let probe: InspectableContext | null = null;\n try {\n probe = createCanvas().getContext('webgpu') as InspectableContext | null;\n if (!probe) return false;\n probe.configure({device: this.device, format: 'rgba16float', alphaMode: 'premultiplied', colorSpace: 'srgb', toneMapping: {mode: 'extended'}} as HDRConfiguration);\n const applied = probe.getConfiguration?.();\n this.compatibleHDR = applied?.format === 'rgba16float' && applied.toneMapping?.mode === 'extended';\n } catch {this.compatibleHDR = false;}\n finally {probe?.unconfigure?.();}\n return this.compatibleHDR;\n }\n configure(enabled: boolean) {\n const active = enabled && this.supportsHDR;\n if (active === this.hdr) return;\n this.hdr = active;\n this.context.configure(active\n ? {device: this.device, format: 'rgba16float', alphaMode: 'premultiplied', colorSpace: 'srgb', toneMapping: {mode: 'extended'}} as HDRConfiguration\n : {device: this.device, format: this.standardFormat, alphaMode: 'premultiplied'});\n }\n dispose() {this.context.unconfigure?.();}\n}\n"]}
1
+ {"version":3,"file":"WGPUCanvasSurface.js","sourceRoot":"","sources":["../../src/renderer/WGPUCanvasSurface.ts"],"names":[],"mappings":"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","sourcesContent":["import {createCanvas} from '../util/canvas.js';\ntype HDRConfiguration = GPUCanvasConfiguration & {toneMapping: {mode: 'extended'}};\ntype InspectableContext = GPUCanvasContext & {getConfiguration?: () => GPUCanvasConfiguration & {toneMapping?: {mode?: string}}};\n// A canvas returns the same context to every engine, and engine disposal defers\n// releasing its surface until submitted GPU work finishes. Only the surface that\n// configured the context last may unconfigure it, so a later engine on the same\n// canvas keeps presenting.\nconst owners = new WeakMap<GPUCanvasContext, WGPUCanvasSurface>();\n/** One canvas surface; composing or exporting an image never reconfigures it. */\nexport class WGPUCanvasSurface {\n readonly context: InspectableContext;\n hdr = false;\n private compatibleHDR?: boolean;\n constructor(canvas: HTMLCanvasElement | OffscreenCanvas, private readonly device: GPUDevice, private readonly standardFormat: GPUTextureFormat) {\n this.context = canvas.getContext('webgpu')! as InspectableContext;\n this.context.configure({device, format: standardFormat, alphaMode: 'premultiplied'});\n owners.set(this.context, this);\n }\n get format() {return this.hdr ? 'rgba16float' as const : this.standardFormat;}\n get supportsHDR() {\n if (this.compatibleHDR !== undefined) return this.compatibleHDR;\n this.compatibleHDR = false;\n let probe: InspectableContext | null = null;\n try {\n probe = createCanvas().getContext('webgpu') as InspectableContext | null;\n if (!probe) return false;\n probe.configure({device: this.device, format: 'rgba16float', alphaMode: 'premultiplied', colorSpace: 'srgb', toneMapping: {mode: 'extended'}} as HDRConfiguration);\n const applied = probe.getConfiguration?.();\n this.compatibleHDR = applied?.format === 'rgba16float' && applied.toneMapping?.mode === 'extended';\n } catch {this.compatibleHDR = false;}\n finally {probe?.unconfigure?.();}\n return this.compatibleHDR;\n }\n configure(enabled: boolean) {\n const active = enabled && this.supportsHDR;\n if (active === this.hdr) return;\n this.hdr = active;\n this.context.configure(active\n ? {device: this.device, format: 'rgba16float', alphaMode: 'premultiplied', colorSpace: 'srgb', toneMapping: {mode: 'extended'}} as HDRConfiguration\n : {device: this.device, format: this.standardFormat, alphaMode: 'premultiplied'});\n }\n dispose() {\n if (owners.get(this.context) !== this) return;\n owners.delete(this.context);\n this.context.unconfigure?.();\n }\n}\n"]}
@@ -5,27 +5,27 @@ const distributionWGSL = /* wgsl */ `
5
5
  @group(0) @binding(2) var<storage, read_write> rows: array<vec2f>;
6
6
  @group(0) @binding(3) var output: texture_storage_2d<rg32float, write>;
7
7
  var<workgroup> scan: array<f32, 256>;
8
- var<workgroup> tw: f32;
8
+ var<workgroup> uZ: f32;
9
9
 
10
- fn iU(pT: u32) {
10
+ fn jA(nZ: u32) {
11
11
  workgroupBarrier();
12
12
  for (var offset = 1u; offset < 256u; offset *= 2u) {
13
13
  var previous = 0.0;
14
- if (pT >= offset) { previous = scan[pT - offset]; }
14
+ if (nZ >= offset) { previous = scan[nZ - offset]; }
15
15
  workgroupBarrier();
16
- scan[pT] += previous;
16
+ scan[nZ] += previous;
17
17
  workgroupBarrier();
18
18
  }
19
19
  }
20
20
 
21
21
  @compute @workgroup_size(256)
22
- fn scanRows(@builtin(workgroup_id) group: vec3u, @builtin(local_invocation_index) pT: u32) {
22
+ fn scanRows(@builtin(workgroup_id) group: vec3u, @builtin(local_invocation_index) nZ: u32) {
23
23
  let size = textureDimensions(radiance);
24
24
  let y = group.x;
25
- if (pT == 0u) { tw = 0.0; }
25
+ if (nZ == 0u) { uZ = 0.0; }
26
26
  workgroupBarrier();
27
27
  for (var start = 0u; start < size.x; start += 256u) {
28
- let x = start + pT;
28
+ let x = start + nZ;
29
29
  var weight = 0.0;
30
30
  if (x < size.x) {
31
31
 
@@ -38,30 +38,30 @@ maximum = max(maximum, dot(textureLoad(radiance, p, 0).rgb, vec3f(0.2126, 0.7152
38
38
  }
39
39
  weight = max(maximum, 1e-12) * sin(3.141592653589793 * (f32(y) + 0.5) / f32(size.y));
40
40
  }
41
- scan[pT] = weight / f32(size.x);
42
- iU(pT);
43
- if (x < size.x) { pixels[y * size.x + x] = vec2f(tw + scan[pT], weight); }
41
+ scan[nZ] = weight / f32(size.x);
42
+ jA(nZ);
43
+ if (x < size.x) { pixels[y * size.x + x] = vec2f(uZ + scan[nZ], weight); }
44
44
  workgroupBarrier();
45
- if (pT == 0u) { tw += scan[255]; }
45
+ if (nZ == 0u) { uZ += scan[255]; }
46
46
  workgroupBarrier();
47
47
  }
48
- if (pT == 0u) { rows[y] = vec2f(0.0, tw); }
48
+ if (nZ == 0u) { rows[y] = vec2f(0.0, uZ); }
49
49
  }
50
50
 
51
51
  @compute @workgroup_size(256)
52
- fn scanMarginal(@builtin(local_invocation_index) pT: u32) {
52
+ fn scanMarginal(@builtin(local_invocation_index) nZ: u32) {
53
53
  let height = textureDimensions(radiance).y;
54
- if (pT == 0u) { tw = 0.0; }
54
+ if (nZ == 0u) { uZ = 0.0; }
55
55
  workgroupBarrier();
56
56
  for (var start = 0u; start < height; start += 256u) {
57
- let y = start + pT;
57
+ let y = start + nZ;
58
58
  var integral = 0.0;
59
59
  if (y < height) { integral = rows[y].y; }
60
- scan[pT] = integral / f32(height);
61
- iU(pT);
62
- if (y < height) { rows[y].x = tw + scan[pT]; }
60
+ scan[nZ] = integral / f32(height);
61
+ jA(nZ);
62
+ if (y < height) { rows[y].x = uZ + scan[nZ]; }
63
63
  workgroupBarrier();
64
- if (pT == 0u) { tw += scan[255]; }
64
+ if (nZ == 0u) { uZ += scan[255]; }
65
65
  workgroupBarrier();
66
66
  }
67
67
  }
@@ -274,7 +274,7 @@ ${hasInputs
274
274
  ${this._uniforms
275
275
  .map((uniform, idx) => `@group(${hasInputs ? 1 : 0}) @binding(${idx}) var<uniform> ${uniform.label}: ${uniform.type};`)
276
276
  .join('\n')}
277
- struct pV {
277
+ struct qZ {
278
278
  ${this._outputs
279
279
  .map((name, idx) => `@location(${idx}) ${name}: vec4f,`)
280
280
  .join('\n')}
@@ -284,10 +284,10 @@ ${this._fsDefine ?? ''}
284
284
  @fragment
285
285
  fn main(
286
286
  @builtin(position) coord: vec4f
287
- ) -> pV {
287
+ ) -> qZ {
288
288
  let uv = vec2i(floor(coord.xy));
289
289
  let uv2 = coord.xy / viewportSize;
290
- var output: pV;
290
+ var output: qZ;
291
291
  ${this._fsMain}
292
292
  return output;
293
293
  }
@@ -19,14 +19,14 @@ ${caustics ? /* wgsl */ `@group(0) @binding(4) var<storage, read> causticBuffer:
19
19
  override outputWidth: f32;
20
20
  override outputHeight: f32;
21
21
 
22
- struct pV {
22
+ struct qZ {
23
23
  ${layers ? `@location(0) foreground: vec4f,
24
24
  @location(1) catcherBackground: vec4f` : `@location(0) color: vec4f,
25
25
  @location(1) normal: vec4f,
26
26
  @location(2) albedo: vec4f${catcher ? ',\n @location(3) shadowCatcher: vec4f' : ''}`}
27
27
  }
28
28
  @fragment
29
- fn main(@builtin(position) coord: vec4f) -> pV {
29
+ fn main(@builtin(position) coord: vec4f) -> qZ {
30
30
  let size = vec2u(u32(outputWidth), u32(outputHeight));
31
31
  let pixel = vec2u(u32(coord.x), size.y - u32(coord.y) - 1u);
32
32
  var idx = pixel.x + pixel.y * size.x;
@@ -40,12 +40,12 @@ let nearest = min(
40
40
  ((pixel + grid / 2u) / grid) * grid,
41
41
  ((size - vec2u(1u)) / grid) * grid
42
42
  );
43
- let tZ = nearest.x + nearest.y * size.x;
44
- if (normalBuffer[tZ].a > 0.0) {
45
- idx = tZ;
43
+ let vI = nearest.x + nearest.y * size.x;
44
+ if (normalBuffer[vI].a > 0.0) {
45
+ idx = vI;
46
46
  }
47
47
  }
48
- var output: pV;
48
+ var output: qZ;
49
49
  if (normalBuffer[idx].a <= 0.0) {
50
50
  ${layers ? `output.foreground = vec4f(0.0);
51
51
  output.catcherBackground = vec4f(0.0);` : `output.color = vec4f(0.0);
@@ -65,22 +65,22 @@ let hit = albedo.a;
65
65
  let total = max(normal.a, 1.0);
66
66
  ${layers ? `
67
67
  let shadow = shadowCatcherBuffer[idx];
68
- let iT = max(hit - shadow.mask.b, 0.0);
68
+ let jz = max(hit - shadow.mask.b, 0.0);
69
69
 
70
70
 
71
71
  output.foreground = vec4f(
72
72
  (color.rgb - shadow.background.rgb)
73
- / select(total, iT, iT > 0.0),
73
+ / select(total, jz, jz > 0.0),
74
74
  clamp((color.a - shadow.mask.g) / total, 0.0, 1.0)
75
75
  );
76
76
  output.catcherBackground = shadow.background / total;
77
77
  ` : `output.color = vec4f(
78
78
 
79
79
 
80
- vec3f(fo(color.r,normal.a,hit,1.0,true),
81
- fo(color.g,normal.a,hit,1.0,true),
82
- fo(color.b,normal.a,hit,1.0,true)),
83
- fo(color.a,normal.a,hit,1.0,false)
80
+ vec3f(fF(color.r,normal.a,hit,1.0,true),
81
+ fF(color.g,normal.a,hit,1.0,true),
82
+ fF(color.b,normal.a,hit,1.0,true)),
83
+ fF(color.a,normal.a,hit,1.0,false)
84
84
  );
85
85
 
86
86
  output.normal = vec4f(0.0);
@@ -1,3 +1,4 @@
1
+ import { type SurfaceHit } from './surfaceHit.js';
1
2
  import { WGPUAov } from './WGPUAov.js';
2
3
  import { type AovKind } from './aov.js';
3
4
  import { type MaterialTextureSelection } from './wgpuBindless.js';
@@ -149,6 +150,7 @@ declare class WGPURayTracePass {
149
150
  private _clamping?;
150
151
  private _transmissiveAlphaMin;
151
152
  private _viewProjInv;
153
+ private _projectionInv;
152
154
  private _cameraWorld;
153
155
  private _apertureRadius;
154
156
  private _focusDistance;
@@ -160,7 +162,8 @@ declare class WGPURayTracePass {
160
162
  private _depthTracePipeline?;
161
163
  private _depthPipeline?;
162
164
  private _shaderCache;
163
- private _debugBVHBuffer?;
165
+ private _bvhCPU?;
166
+ private _bvhDataBytes;
164
167
  private _bakePipelineConstants;
165
168
  constructor(device: GPUDevice, _textureSelection?: MaterialTextureSelection);
166
169
  getOutputBuffer(): {
@@ -198,9 +201,14 @@ declare class WGPURayTracePass {
198
201
  private _pumpCompiles;
199
202
  private _requestQueuedCompile;
200
203
  private _prepareAovPipelines;
201
- prepareAovs(kinds: readonly AovKind[]): boolean;
202
- renderAovs(state: WGPUAov, camera: Camera, samples: number, cap: number, kinds: readonly AovKind[]): boolean;
203
- readDepthSamples(area: DepthSampleArea, aspect?: number): Promise<Float32Array | undefined>;
204
+ prepareAovs(kinds: readonly AovKind[], compact?: boolean): boolean;
205
+ renderAovs(state: WGPUAov, camera: Camera, samples: number, cap: number, kinds: readonly AovKind[], resolution?: {
206
+ width: number;
207
+ height: number;
208
+ }): boolean;
209
+ pickSurface(x: number, y: number, aspect?: number): Promise<SurfaceHit | null | undefined>;
210
+ readDepthSamples(area: DepthSampleArea, aspect?: number): Promise<Float32Array<ArrayBufferLike> | undefined>;
211
+ private _readDepthSamples;
204
212
  /** Whether the latest request waits on GPU work that will settle on its own. */
205
213
  isCompilingShader(): boolean;
206
214
  isPipelineReady(): boolean;
@@ -266,6 +274,7 @@ declare class WGPURayTracePass {
266
274
  height: number;
267
275
  data: Float32Array;
268
276
  }): void;
277
+ private _shareSpectralPrefix;
269
278
  setQuality(options: {
270
279
  bounces: number;
271
280
  bevel: boolean;
@@ -287,8 +296,12 @@ declare class WGPURayTracePass {
287
296
  private _updateLightSamplingData;
288
297
  /** Uploads the combined TLAS/BLAS buffer and the instance records. */
289
298
  private _uploadBVH;
299
+ private _uploadBVHBlocks;
300
+ private _writeBVH;
290
301
  private _updateMeshData;
291
302
  private _updateMaterialConstants;
303
+ private _packTriangleMaterials;
304
+ private _refreshTriangleMaterials;
292
305
  private _updateGeometryData;
293
306
  private _updateMaterialData;
294
307
  /** Rebuilds only instance acceleration data for a cached mesh subset. */