@meimu/mutracer 0.1.5 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (526) hide show
  1. package/LICENSES/Classroom-CC0.txt +121 -0
  2. package/README.md +7 -7
  3. package/THIRD_PARTY_NOTICES.md +13 -8
  4. package/dist/assets/bvh.worker.js +1 -1
  5. package/dist/mutracer.umd.js +10407 -8353
  6. package/docs/api.md +200 -10
  7. package/docs/denoising.md +30 -15
  8. package/docs/materials.md +1 -1
  9. package/docs/performance.md +5 -2
  10. package/docs/progressive-rendering.md +32 -1
  11. package/docs/threejs.md +14 -5
  12. package/docs/updates.md +44 -2
  13. package/docs/viewer.md +11 -6
  14. package/lib/Display.d.ts +13 -2
  15. package/lib/Display.js +27 -6
  16. package/lib/Display.js.map +1 -1
  17. package/lib/Engine.d.ts +2 -0
  18. package/lib/Engine.js +52 -25
  19. package/lib/Engine.js.map +1 -1
  20. package/lib/Render.d.ts +44 -9
  21. package/lib/Render.js +115 -17
  22. package/lib/Render.js.map +1 -1
  23. package/lib/RenderLoop.d.ts +7 -1
  24. package/lib/RenderLoop.js +94 -13
  25. package/lib/RenderLoop.js.map +1 -1
  26. package/lib/main.d.ts +6 -3
  27. package/lib/main.js +1 -0
  28. package/lib/main.js.map +1 -1
  29. package/lib/math/access.d.ts +4 -0
  30. package/lib/math/access.js +10 -0
  31. package/lib/math/access.js.map +1 -0
  32. package/lib/math/mat3.d.ts +4 -0
  33. package/lib/math/mat3.js +54 -0
  34. package/lib/math/mat3.js.map +1 -0
  35. package/lib/math/mat4.d.ts +19 -0
  36. package/lib/math/mat4.js +413 -0
  37. package/lib/math/mat4.js.map +1 -0
  38. package/lib/math/storage.d.ts +6 -0
  39. package/lib/math/storage.js +22 -0
  40. package/lib/math/storage.js.map +1 -0
  41. package/lib/math/types.d.ts +3 -0
  42. package/lib/math/types.js +2 -0
  43. package/lib/math/types.js.map +1 -0
  44. package/lib/math/vec2.d.ts +13 -0
  45. package/lib/math/vec2.js +52 -0
  46. package/lib/math/vec2.js.map +1 -0
  47. package/lib/math/vec3.d.ts +23 -0
  48. package/lib/math/vec3.js +139 -0
  49. package/lib/math/vec3.js.map +1 -0
  50. package/lib/math.d.ts +5 -17
  51. package/lib/math.js +5 -55
  52. package/lib/math.js.map +1 -1
  53. package/lib/oidn.d.ts +1 -1
  54. package/lib/oidn.js +4 -2
  55. package/lib/oidn.js.map +1 -1
  56. package/lib/oidnBundledWeights.cdn.d.ts +2 -2
  57. package/lib/renderer/AovPrimitiveCache.d.ts +10 -0
  58. package/lib/renderer/AovPrimitiveCache.js +48 -0
  59. package/lib/renderer/AovPrimitiveCache.js.map +1 -0
  60. package/lib/renderer/Box3.d.ts +5 -0
  61. package/lib/renderer/Box3.js +9 -0
  62. package/lib/renderer/Box3.js.map +1 -0
  63. package/lib/renderer/GPUTraceQueue.d.ts +10 -0
  64. package/lib/renderer/GPUTraceQueue.js +31 -0
  65. package/lib/renderer/GPUTraceQueue.js.map +1 -0
  66. package/lib/renderer/MaterialData.d.ts +15 -0
  67. package/lib/renderer/MaterialData.js +61 -0
  68. package/lib/renderer/MaterialData.js.map +1 -0
  69. package/lib/renderer/MaterialTable.d.ts +11 -98
  70. package/lib/renderer/MaterialTable.js +34 -412
  71. package/lib/renderer/MaterialTable.js.map +1 -1
  72. package/lib/renderer/RenderingPipeline.d.ts +32 -13
  73. package/lib/renderer/RenderingPipeline.js +1 -17
  74. package/lib/renderer/RenderingPipeline.js.map +1 -1
  75. package/lib/renderer/TileRender.d.ts +0 -1
  76. package/lib/renderer/TileRender.js +14 -1
  77. package/lib/renderer/TileRender.js.map +1 -1
  78. package/lib/renderer/WGPUAov.d.ts +39 -0
  79. package/lib/renderer/WGPUAov.js +239 -0
  80. package/lib/renderer/WGPUAov.js.map +1 -0
  81. package/lib/renderer/WGPUBindlessMaterialData.d.ts +17 -0
  82. package/lib/renderer/WGPUBindlessMaterialData.js +48 -0
  83. package/lib/renderer/WGPUBindlessMaterialData.js.map +1 -0
  84. package/lib/renderer/WGPUBindlessTextures.d.ts +47 -0
  85. package/lib/renderer/WGPUBindlessTextures.js +180 -0
  86. package/lib/renderer/WGPUBindlessTextures.js.map +1 -0
  87. package/lib/renderer/WGPUBloomPass.js +17 -97
  88. package/lib/renderer/WGPUBloomPass.js.map +1 -1
  89. package/lib/renderer/WGPUComputePass.d.ts +1 -1
  90. package/lib/renderer/WGPUComputePass.js.map +1 -1
  91. package/lib/renderer/WGPUEnvMapDistribution.d.ts +12 -0
  92. package/lib/renderer/WGPUEnvMapDistribution.js +150 -0
  93. package/lib/renderer/WGPUEnvMapDistribution.js.map +1 -0
  94. package/lib/renderer/WGPUFullQuadPass.js +10 -9
  95. package/lib/renderer/WGPUFullQuadPass.js.map +1 -1
  96. package/lib/renderer/WGPUJNLMDenoiser.d.ts +1 -20
  97. package/lib/renderer/WGPUJNLMDenoiser.js +4 -267
  98. package/lib/renderer/WGPUJNLMDenoiser.js.map +1 -1
  99. package/lib/renderer/WGPURayTraceOutput.js +26 -17
  100. package/lib/renderer/WGPURayTraceOutput.js.map +1 -1
  101. package/lib/renderer/WGPURayTracePass.d.ts +36 -40
  102. package/lib/renderer/WGPURayTracePass.js +399 -550
  103. package/lib/renderer/WGPURayTracePass.js.map +1 -1
  104. package/lib/renderer/WGPURenderingPipeline.d.ts +5 -3
  105. package/lib/renderer/WGPURenderingPipeline.js +239 -60
  106. package/lib/renderer/WGPURenderingPipeline.js.map +1 -1
  107. package/lib/renderer/WGPUShaderCache.d.ts +2 -2
  108. package/lib/renderer/WGPUShaderCache.js +10 -5
  109. package/lib/renderer/WGPUShaderCache.js.map +1 -1
  110. package/lib/renderer/WGPUShaderCapabilities.d.ts +10 -0
  111. package/lib/renderer/WGPUShaderCapabilities.js +54 -0
  112. package/lib/renderer/WGPUShaderCapabilities.js.map +1 -0
  113. package/lib/renderer/WGPUSkyBaker.d.ts +13 -0
  114. package/lib/renderer/WGPUSkyBaker.js +85 -0
  115. package/lib/renderer/WGPUSkyBaker.js.map +1 -0
  116. package/lib/renderer/WebGLAov.d.ts +41 -0
  117. package/lib/renderer/WebGLAov.js +106 -0
  118. package/lib/renderer/WebGLAov.js.map +1 -0
  119. package/lib/renderer/WebGLFullQuadPass.d.ts +5 -3
  120. package/lib/renderer/WebGLFullQuadPass.js +18 -2
  121. package/lib/renderer/WebGLFullQuadPass.js.map +1 -1
  122. package/lib/renderer/WebGLJNLMDenoiser.d.ts +1 -1
  123. package/lib/renderer/WebGLJNLMDenoiser.js +83 -74
  124. package/lib/renderer/WebGLJNLMDenoiser.js.map +1 -1
  125. package/lib/renderer/WebGLRayTraceOutputPass.js +7 -4
  126. package/lib/renderer/WebGLRayTraceOutputPass.js.map +1 -1
  127. package/lib/renderer/WebGLRayTracePass.d.ts +12 -2
  128. package/lib/renderer/WebGLRayTracePass.js +82 -7
  129. package/lib/renderer/WebGLRayTracePass.js.map +1 -1
  130. package/lib/renderer/WebGLRenderingPipeline.js +116 -8
  131. package/lib/renderer/WebGLRenderingPipeline.js.map +1 -1
  132. package/lib/renderer/WebGLSkyBaker.d.ts +39 -0
  133. package/lib/renderer/WebGLSkyBaker.js +422 -0
  134. package/lib/renderer/WebGLSkyBaker.js.map +1 -0
  135. package/lib/renderer/WebGLSkySource.d.ts +9 -0
  136. package/lib/renderer/WebGLSkySource.js +28 -0
  137. package/lib/renderer/WebGLSkySource.js.map +1 -0
  138. package/lib/renderer/accumulationTarget.d.ts +5 -0
  139. package/lib/renderer/accumulationTarget.js.map +1 -1
  140. package/lib/renderer/aov.d.ts +42 -0
  141. package/lib/renderer/aov.js +50 -0
  142. package/lib/renderer/aov.js.map +1 -0
  143. package/lib/renderer/aovDisplay.d.ts +14 -0
  144. package/lib/renderer/aovDisplay.js +32 -0
  145. package/lib/renderer/aovDisplay.js.map +1 -0
  146. package/lib/renderer/aovScene.d.ts +21 -0
  147. package/lib/renderer/aovScene.js +139 -0
  148. package/lib/renderer/aovScene.js.map +1 -0
  149. package/lib/renderer/binnedSahBvh.js +2 -1
  150. package/lib/renderer/binnedSahBvh.js.map +1 -1
  151. package/lib/renderer/bvhAccel.d.ts +20 -10
  152. package/lib/renderer/bvhAccel.js +168 -58
  153. package/lib/renderer/bvhAccel.js.map +1 -1
  154. package/lib/renderer/bvhWorkerBuild.d.ts +1 -0
  155. package/lib/renderer/cameraSnapshot.js +2 -1
  156. package/lib/renderer/cameraSnapshot.js.map +1 -1
  157. package/lib/renderer/cameraUniform.d.ts +2 -0
  158. package/lib/renderer/cameraUniform.js +12 -0
  159. package/lib/renderer/cameraUniform.js.map +1 -0
  160. package/lib/renderer/committedScene.js +4 -0
  161. package/lib/renderer/committedScene.js.map +1 -1
  162. package/lib/renderer/denoiser.d.ts +3 -11
  163. package/lib/renderer/denoiser.js.map +1 -1
  164. package/lib/renderer/depthQuery.js +4 -1
  165. package/lib/renderer/depthQuery.js.map +1 -1
  166. package/lib/renderer/displacementPreparation.d.ts +11 -0
  167. package/lib/renderer/displacementPreparation.js +351 -0
  168. package/lib/renderer/displacementPreparation.js.map +1 -0
  169. package/lib/renderer/displacementRange.d.ts +1 -0
  170. package/lib/renderer/displacementRange.js +9 -0
  171. package/lib/renderer/displacementRange.js.map +1 -0
  172. package/lib/renderer/displayParityDiagnostics.d.ts +11 -0
  173. package/lib/renderer/displayParityDiagnostics.js +2 -0
  174. package/lib/renderer/displayParityDiagnostics.js.map +1 -0
  175. package/lib/renderer/envMapCreation.d.ts +9 -8
  176. package/lib/renderer/envMapCreation.js +36 -12
  177. package/lib/renderer/envMapCreation.js.map +1 -1
  178. package/lib/renderer/envMapDistribution.d.ts +12 -2
  179. package/lib/renderer/envMapDistribution.js +43 -34
  180. package/lib/renderer/envMapDistribution.js.map +1 -1
  181. package/lib/renderer/geometryBvhBounds.d.ts +4 -0
  182. package/lib/renderer/geometryBvhBounds.js +82 -0
  183. package/lib/renderer/geometryBvhBounds.js.map +1 -0
  184. package/lib/renderer/geometryUpdateState.d.ts +32 -0
  185. package/lib/renderer/geometryUpdateState.js +2 -0
  186. package/lib/renderer/geometryUpdateState.js.map +1 -0
  187. package/lib/renderer/geometryUpdates.d.ts +17 -9
  188. package/lib/renderer/geometryUpdates.js +92 -33
  189. package/lib/renderer/geometryUpdates.js.map +1 -1
  190. package/lib/renderer/glsl/aovDisplay.frag.d.ts +3 -0
  191. package/lib/renderer/glsl/aovDisplay.frag.js +54 -0
  192. package/lib/renderer/glsl/aovDisplay.frag.js.map +1 -0
  193. package/lib/renderer/glsl/aovReflectance.glsl.d.ts +2 -0
  194. package/lib/renderer/glsl/aovReflectance.glsl.js +87 -0
  195. package/lib/renderer/glsl/aovReflectance.glsl.js.map +1 -0
  196. package/lib/renderer/glsl/aovReflectanceSamples.glsl.d.ts +2 -0
  197. package/lib/renderer/glsl/aovReflectanceSamples.glsl.js +135 -0
  198. package/lib/renderer/glsl/aovReflectanceSamples.glsl.js.map +1 -0
  199. package/lib/renderer/glsl/aovTrace.frag.d.ts +2 -0
  200. package/lib/renderer/glsl/aovTrace.frag.js +121 -0
  201. package/lib/renderer/glsl/aovTrace.frag.js.map +1 -0
  202. package/lib/renderer/glsl/chunks/cameraRay.glsl.js +12 -12
  203. package/lib/renderer/glsl/chunks/envMap.glsl.js +80 -74
  204. package/lib/renderer/glsl/chunks/envMap.glsl.js.map +1 -1
  205. package/lib/renderer/glsl/chunks/intersect.glsl.js +429 -429
  206. package/lib/renderer/glsl/chunks/materialBuffer.glsl.js +144 -144
  207. package/lib/renderer/glsl/chunks/materialBuffer.glsl.js.map +1 -1
  208. package/lib/renderer/glsl/chunks/openPbrBsdf.glsl.js +801 -801
  209. package/lib/renderer/glsl/chunks/rand.glsl.js +3 -3
  210. package/lib/renderer/glsl/chunks/random.glsl.js +6 -6
  211. package/lib/renderer/glsl/chunks/rayTraceCore.glsl.js +49 -49
  212. package/lib/renderer/glsl/chunks/rayTraceCore.glsl.js.map +1 -1
  213. package/lib/renderer/glsl/chunks/sampleLight.glsl.js +80 -80
  214. package/lib/renderer/glsl/chunks/sampleMaterial.glsl.js +102 -102
  215. package/lib/renderer/glsl/chunks/sampleShadowCatcher.glsl.js +20 -17
  216. package/lib/renderer/glsl/chunks/sampleShadowCatcher.glsl.js.map +1 -1
  217. package/lib/renderer/glsl/chunks/sampling.glsl.js +93 -93
  218. package/lib/renderer/glsl/chunks/sobol.glsl.js +79 -79
  219. package/lib/renderer/glsl/chunks/textureLinear.glsl.js +5 -5
  220. package/lib/renderer/glsl/chunks/uvProjection.glsl.js +12 -12
  221. package/lib/renderer/glsl/chunks/uvProjection.glsl.js.map +1 -1
  222. package/lib/renderer/glsl/depthQuery.frag.js +7 -7
  223. package/lib/renderer/glsl/normalizeRayTraceOutput.frag.js +17 -9
  224. package/lib/renderer/glsl/normalizeRayTraceOutput.frag.js.map +1 -1
  225. package/lib/renderer/glsl/rayTrace.frag.js +191 -191
  226. package/lib/renderer/glsl/shadowCatcher.frag.js +25 -20
  227. package/lib/renderer/glsl/shadowCatcher.frag.js.map +1 -1
  228. package/lib/renderer/glsl/webglPipeline.frag.js +65 -60
  229. package/lib/renderer/glsl/webglPipeline.frag.js.map +1 -1
  230. package/lib/renderer/lightConstants.d.ts +10 -0
  231. package/lib/renderer/lightConstants.js +11 -0
  232. package/lib/renderer/lightConstants.js.map +1 -0
  233. package/lib/renderer/lightCore.d.ts +12 -0
  234. package/lib/renderer/lightCore.js +13 -0
  235. package/lib/renderer/lightCore.js.map +1 -0
  236. package/lib/renderer/lightSampling.d.ts +20 -17
  237. package/lib/renderer/lightSampling.js +123 -56
  238. package/lib/renderer/lightSampling.js.map +1 -1
  239. package/lib/renderer/lightsData.d.ts +21 -0
  240. package/lib/renderer/lightsData.js +192 -0
  241. package/lib/renderer/lightsData.js.map +1 -0
  242. package/lib/renderer/lightsUtil.d.ts +3 -26
  243. package/lib/renderer/lightsUtil.js +3 -153
  244. package/lib/renderer/lightsUtil.js.map +1 -1
  245. package/lib/renderer/materialBufferData.d.ts +70 -0
  246. package/lib/renderer/materialBufferData.js +2 -0
  247. package/lib/renderer/materialBufferData.js.map +1 -0
  248. package/lib/renderer/materialConstants.d.ts +11 -0
  249. package/lib/renderer/materialConstants.js +11 -0
  250. package/lib/renderer/materialConstants.js.map +1 -1
  251. package/lib/renderer/materialCore.d.ts +8 -0
  252. package/lib/renderer/materialCore.js +9 -0
  253. package/lib/renderer/materialCore.js.map +1 -0
  254. package/lib/renderer/materialEmission.d.ts +2 -2
  255. package/lib/renderer/materialEmission.js +3 -3
  256. package/lib/renderer/materialEmission.js.map +1 -1
  257. package/lib/renderer/materialLayout.d.ts +2 -101
  258. package/lib/renderer/materialLayout.js +110 -172
  259. package/lib/renderer/materialLayout.js.map +1 -1
  260. package/lib/renderer/materialLayoutSchema.d.ts +26 -0
  261. package/lib/renderer/materialLayoutSchema.js +172 -0
  262. package/lib/renderer/materialLayoutSchema.js.map +1 -0
  263. package/lib/renderer/materialParams.d.ts +69 -0
  264. package/lib/renderer/materialParams.js +272 -0
  265. package/lib/renderer/materialParams.js.map +1 -0
  266. package/lib/renderer/materialTextureSlots.d.ts +14 -324
  267. package/lib/renderer/materialTextureSlots.js +21 -8
  268. package/lib/renderer/materialTextureSlots.js.map +1 -1
  269. package/lib/renderer/materialTextures.d.ts +6 -0
  270. package/lib/renderer/{texturesFromMaterials.js → materialTextures.js} +1 -2
  271. package/lib/renderer/materialTextures.js.map +1 -0
  272. package/lib/renderer/mergeMeshesToGeometry.js +6 -147
  273. package/lib/renderer/mergeMeshesToGeometry.js.map +1 -1
  274. package/lib/renderer/meshInstances.d.ts +4 -21
  275. package/lib/renderer/meshInstances.js +10 -56
  276. package/lib/renderer/meshInstances.js.map +1 -1
  277. package/lib/renderer/oidnNetwork.d.ts +2 -2
  278. package/lib/renderer/oidnNetwork.js +1 -1
  279. package/lib/renderer/oidnNetwork.js.map +1 -1
  280. package/lib/renderer/openPbrEnergyLut.js +850 -846
  281. package/lib/renderer/openPbrEnergyLut.js.map +1 -1
  282. package/lib/renderer/ownedDenoiser.d.ts +9 -0
  283. package/lib/renderer/ownedDenoiser.js +2 -0
  284. package/lib/renderer/ownedDenoiser.js.map +1 -0
  285. package/lib/renderer/packedMeshInstances.d.ts +23 -0
  286. package/lib/renderer/packedMeshInstances.js +80 -0
  287. package/lib/renderer/packedMeshInstances.js.map +1 -0
  288. package/lib/renderer/prepareMeshBVH.d.ts +12 -47
  289. package/lib/renderer/prepareMeshBVH.js +21 -642
  290. package/lib/renderer/prepareMeshBVH.js.map +1 -1
  291. package/lib/renderer/proceduralEnvironmentPower.d.ts +3 -0
  292. package/lib/renderer/proceduralEnvironmentPower.js +8 -0
  293. package/lib/renderer/proceduralEnvironmentPower.js.map +1 -0
  294. package/lib/renderer/progressiveScheduler.d.ts +1 -0
  295. package/lib/renderer/progressiveScheduler.js +3 -0
  296. package/lib/renderer/progressiveScheduler.js.map +1 -1
  297. package/lib/renderer/renderPipeline.d.ts +3 -1
  298. package/lib/renderer/renderPipeline.js.map +1 -1
  299. package/lib/renderer/renderingLimits.d.ts +9 -0
  300. package/lib/renderer/renderingLimits.js +18 -0
  301. package/lib/renderer/renderingLimits.js.map +1 -0
  302. package/lib/renderer/sceneAssembly.d.ts +73 -0
  303. package/lib/renderer/sceneAssembly.js +109 -0
  304. package/lib/renderer/sceneAssembly.js.map +1 -0
  305. package/lib/renderer/sceneChangeCore.d.ts +39 -0
  306. package/lib/renderer/sceneChangeCore.js +307 -0
  307. package/lib/renderer/sceneChangeCore.js.map +1 -0
  308. package/lib/renderer/sceneChangeDetector.d.ts +3 -6
  309. package/lib/renderer/sceneChangeDetector.js +24 -150
  310. package/lib/renderer/sceneChangeDetector.js.map +1 -1
  311. package/lib/renderer/sceneLayoutSchema.d.ts +118 -0
  312. package/lib/renderer/sceneLayoutSchema.js +111 -0
  313. package/lib/renderer/sceneLayoutSchema.js.map +1 -0
  314. package/lib/renderer/sceneLightChanges.d.ts +3 -3
  315. package/lib/renderer/sceneLightChanges.js.map +1 -1
  316. package/lib/renderer/scenePreparation.d.ts +55 -0
  317. package/lib/renderer/scenePreparation.js +360 -0
  318. package/lib/renderer/scenePreparation.js.map +1 -0
  319. package/lib/renderer/scratchSampling.js +18 -18
  320. package/lib/renderer/scratchSampling.js.map +1 -1
  321. package/lib/renderer/shader.d.ts +2 -0
  322. package/lib/renderer/shader.js +2 -0
  323. package/lib/renderer/shader.js.map +1 -1
  324. package/lib/renderer/shaderCapabilities.d.ts +23 -0
  325. package/lib/renderer/shaderCapabilities.js +55 -0
  326. package/lib/renderer/shaderCapabilities.js.map +1 -0
  327. package/lib/renderer/shaderCapacity.d.ts +2 -0
  328. package/lib/renderer/shaderCapacity.js +5 -0
  329. package/lib/renderer/shaderCapacity.js.map +1 -0
  330. package/lib/renderer/skyModel.d.ts +9 -0
  331. package/lib/renderer/skyModel.js +10 -0
  332. package/lib/renderer/skyModel.js.map +1 -0
  333. package/lib/renderer/textureAtlas.d.ts +60 -0
  334. package/lib/renderer/textureAtlas.js +145 -0
  335. package/lib/renderer/textureAtlas.js.map +1 -0
  336. package/lib/renderer/textureAtlasPixels.d.ts +7 -0
  337. package/lib/renderer/textureAtlasPixels.js +68 -0
  338. package/lib/renderer/textureAtlasPixels.js.map +1 -0
  339. package/lib/renderer/util.d.ts +1 -1
  340. package/lib/renderer/util.js.map +1 -1
  341. package/lib/renderer/webgl.d.ts +9 -2
  342. package/lib/renderer/webgl.js +54 -9
  343. package/lib/renderer/webgl.js.map +1 -1
  344. package/lib/renderer/wgpuBindless.d.ts +26 -0
  345. package/lib/renderer/wgpuBindless.js +95 -0
  346. package/lib/renderer/wgpuBindless.js.map +1 -0
  347. package/lib/renderer/wgpuBindlessSource.d.ts +2 -0
  348. package/lib/renderer/wgpuBindlessSource.js +51 -0
  349. package/lib/renderer/wgpuBindlessSource.js.map +1 -0
  350. package/lib/renderer/wgpuMaterialConstants.d.ts +4 -0
  351. package/lib/renderer/wgpuMaterialConstants.js +52 -0
  352. package/lib/renderer/wgpuMaterialConstants.js.map +1 -0
  353. package/lib/renderer/wgpuSceneUniform.d.ts +42 -0
  354. package/lib/renderer/wgpuSceneUniform.js +125 -0
  355. package/lib/renderer/wgpuSceneUniform.js.map +1 -0
  356. package/lib/renderer/wgpuShaderSource.d.ts +15 -0
  357. package/lib/renderer/wgpuShaderSource.js +31 -0
  358. package/lib/renderer/wgpuShaderSource.js.map +1 -0
  359. package/lib/renderer/wgsl/aovDisplay.wgsl.d.ts +1 -0
  360. package/lib/renderer/wgsl/aovDisplay.wgsl.js +70 -0
  361. package/lib/renderer/wgsl/aovDisplay.wgsl.js.map +1 -0
  362. package/lib/renderer/wgsl/aovReflectance.wgsl.d.ts +2 -0
  363. package/lib/renderer/wgsl/aovReflectance.wgsl.js +98 -0
  364. package/lib/renderer/wgsl/aovReflectance.wgsl.js.map +1 -0
  365. package/lib/renderer/wgsl/aovReflectanceSamples.wgsl.d.ts +2 -0
  366. package/lib/renderer/wgsl/aovReflectanceSamples.wgsl.js +135 -0
  367. package/lib/renderer/wgsl/aovReflectanceSamples.wgsl.js.map +1 -0
  368. package/lib/renderer/wgsl/aovResolve.wgsl.d.ts +5 -0
  369. package/lib/renderer/wgsl/aovResolve.wgsl.js +38 -0
  370. package/lib/renderer/wgsl/aovResolve.wgsl.js.map +1 -0
  371. package/lib/renderer/wgsl/aovSnapshot.wgsl.d.ts +4 -0
  372. package/lib/renderer/wgsl/aovSnapshot.wgsl.js +21 -0
  373. package/lib/renderer/wgsl/aovSnapshot.wgsl.js.map +1 -0
  374. package/lib/renderer/wgsl/aovTrace.wgsl.d.ts +2 -0
  375. package/lib/renderer/wgsl/aovTrace.wgsl.js +115 -0
  376. package/lib/renderer/wgsl/aovTrace.wgsl.js.map +1 -0
  377. package/lib/renderer/wgsl/bloom.wgsl.d.ts +13 -0
  378. package/lib/renderer/wgsl/bloom.wgsl.js +92 -0
  379. package/lib/renderer/wgsl/bloom.wgsl.js.map +1 -0
  380. package/lib/renderer/wgsl/chunks/common.wgsl.js +4 -4
  381. package/lib/renderer/wgsl/chunks/envMap.wgsl.d.ts +1 -1
  382. package/lib/renderer/wgsl/chunks/envMap.wgsl.js +43 -37
  383. package/lib/renderer/wgsl/chunks/envMap.wgsl.js.map +1 -1
  384. package/lib/renderer/wgsl/chunks/intersect.wgsl.d.ts +13 -1
  385. package/lib/renderer/wgsl/chunks/intersect.wgsl.js +742 -705
  386. package/lib/renderer/wgsl/chunks/intersect.wgsl.js.map +1 -1
  387. package/lib/renderer/wgsl/chunks/intersectionAlpha.wgsl.js +16 -16
  388. package/lib/renderer/wgsl/chunks/intersectionAlpha.wgsl.js.map +1 -1
  389. package/lib/renderer/wgsl/chunks/materialBuffer.wgsl.d.ts +3 -1
  390. package/lib/renderer/wgsl/chunks/materialBuffer.wgsl.js +84 -82
  391. package/lib/renderer/wgsl/chunks/materialBuffer.wgsl.js.map +1 -1
  392. package/lib/renderer/wgsl/chunks/openPbrBsdf.wgsl.js +855 -857
  393. package/lib/renderer/wgsl/chunks/openPbrBsdf.wgsl.js.map +1 -1
  394. package/lib/renderer/wgsl/chunks/pdm_displacement.wgsl.js +139 -139
  395. package/lib/renderer/wgsl/chunks/rand.wgsl.js +3 -3
  396. package/lib/renderer/wgsl/chunks/rayTraceCore.wgsl.d.ts +2 -1
  397. package/lib/renderer/wgsl/chunks/rayTraceCore.wgsl.js +42 -32
  398. package/lib/renderer/wgsl/chunks/rayTraceCore.wgsl.js.map +1 -1
  399. package/lib/renderer/wgsl/chunks/sampleLight.wgsl.d.ts +1 -1
  400. package/lib/renderer/wgsl/chunks/sampleLight.wgsl.js +152 -148
  401. package/lib/renderer/wgsl/chunks/sampleLight.wgsl.js.map +1 -1
  402. package/lib/renderer/wgsl/chunks/sampleMaterial.wgsl.js +239 -232
  403. package/lib/renderer/wgsl/chunks/sampleMaterial.wgsl.js.map +1 -1
  404. package/lib/renderer/wgsl/chunks/sampleShadowCatcher.wgsl.d.ts +1 -1
  405. package/lib/renderer/wgsl/chunks/sampleShadowCatcher.wgsl.js +26 -13
  406. package/lib/renderer/wgsl/chunks/sampleShadowCatcher.wgsl.js.map +1 -1
  407. package/lib/renderer/wgsl/chunks/sampling.wgsl.js +91 -91
  408. package/lib/renderer/wgsl/chunks/shadowCatcherAccumulation.wgsl.d.ts +1 -1
  409. package/lib/renderer/wgsl/chunks/shadowCatcherAccumulation.wgsl.js +1 -0
  410. package/lib/renderer/wgsl/chunks/shadowCatcherAccumulation.wgsl.js.map +1 -1
  411. package/lib/renderer/wgsl/chunks/sobol.wgsl.js +83 -83
  412. package/lib/renderer/wgsl/chunks/uvProjection.wgsl.js +12 -12
  413. package/lib/renderer/wgsl/chunks/uvProjection.wgsl.js.map +1 -1
  414. package/lib/renderer/wgsl/compose.frag.wgsl.d.ts +8 -3
  415. package/lib/renderer/wgsl/compose.frag.wgsl.js +143 -118
  416. package/lib/renderer/wgsl/compose.frag.wgsl.js.map +1 -1
  417. package/lib/renderer/wgsl/customDenoise.wgsl.js +10 -10
  418. package/lib/renderer/wgsl/depthQuery.wgsl.js +7 -7
  419. package/lib/renderer/wgsl/jnlm.compute.d.ts +25 -0
  420. package/lib/renderer/wgsl/jnlm.compute.js +315 -0
  421. package/lib/renderer/wgsl/jnlm.compute.js.map +1 -0
  422. package/lib/renderer/wgsl/offlineAdaptive.compute.js +28 -28
  423. package/lib/renderer/wgsl/oidnAuxiliary.wgsl.d.ts +1 -0
  424. package/lib/renderer/wgsl/oidnAuxiliary.wgsl.js +17 -0
  425. package/lib/renderer/wgsl/oidnAuxiliary.wgsl.js.map +1 -0
  426. package/lib/renderer/wgsl/proceduralSky.compute.d.ts +1 -0
  427. package/lib/renderer/wgsl/proceduralSky.compute.js +198 -0
  428. package/lib/renderer/wgsl/proceduralSky.compute.js.map +1 -0
  429. package/lib/renderer/wgsl/rayTrace.compute.d.ts +17 -1
  430. package/lib/renderer/wgsl/rayTrace.compute.js +612 -393
  431. package/lib/renderer/wgsl/rayTrace.compute.js.map +1 -1
  432. package/lib/scene/Camera.js +7 -3
  433. package/lib/scene/Camera.js.map +1 -1
  434. package/lib/scene/EnvironmentLight.d.ts +5 -9
  435. package/lib/scene/EnvironmentLight.js +4 -14
  436. package/lib/scene/EnvironmentLight.js.map +1 -1
  437. package/lib/scene/EnvironmentLightState.d.ts +18 -0
  438. package/lib/scene/EnvironmentLightState.js +19 -0
  439. package/lib/scene/EnvironmentLightState.js.map +1 -0
  440. package/lib/scene/Geometry.d.ts +12 -6
  441. package/lib/scene/Geometry.js +37 -13
  442. package/lib/scene/Geometry.js.map +1 -1
  443. package/lib/scene/InstanceState.d.ts +39 -0
  444. package/lib/scene/InstanceState.js +77 -0
  445. package/lib/scene/InstanceState.js.map +1 -0
  446. package/lib/scene/InstancedMesh.d.ts +1 -1
  447. package/lib/scene/InstancedMesh.js +3 -0
  448. package/lib/scene/InstancedMesh.js.map +1 -1
  449. package/lib/scene/MaterialState.d.ts +209 -0
  450. package/lib/scene/MaterialState.js +231 -0
  451. package/lib/scene/MaterialState.js.map +1 -0
  452. package/lib/scene/Mesh.d.ts +4 -6
  453. package/lib/scene/Mesh.js +3 -11
  454. package/lib/scene/Mesh.js.map +1 -1
  455. package/lib/scene/MeshState.d.ts +20 -0
  456. package/lib/scene/MeshState.js +35 -0
  457. package/lib/scene/MeshState.js.map +1 -0
  458. package/lib/scene/OpenPBRMaterial.d.ts +6 -168
  459. package/lib/scene/OpenPBRMaterial.js +5 -223
  460. package/lib/scene/OpenPBRMaterial.js.map +1 -1
  461. package/lib/scene/PixelTexture.d.ts +6 -0
  462. package/lib/scene/PixelTexture.js +10 -0
  463. package/lib/scene/PixelTexture.js.map +1 -0
  464. package/lib/scene/ProceduralSky.d.ts +24 -0
  465. package/lib/scene/ProceduralSky.js +40 -0
  466. package/lib/scene/ProceduralSky.js.map +1 -0
  467. package/lib/scene/RectLight.d.ts +2 -13
  468. package/lib/scene/RectLight.js +3 -21
  469. package/lib/scene/RectLight.js.map +1 -1
  470. package/lib/scene/RectLightState.d.ts +31 -0
  471. package/lib/scene/RectLightState.js +26 -0
  472. package/lib/scene/RectLightState.js.map +1 -0
  473. package/lib/scene/Scene.d.ts +15 -4
  474. package/lib/scene/Scene.js.map +1 -1
  475. package/lib/scene/SceneNode.js +7 -6
  476. package/lib/scene/SceneNode.js.map +1 -1
  477. package/lib/scene/Texture.d.ts +10 -41
  478. package/lib/scene/Texture.js +4 -33
  479. package/lib/scene/Texture.js.map +1 -1
  480. package/lib/scene/TextureState.d.ts +35 -0
  481. package/lib/scene/TextureState.js +35 -0
  482. package/lib/scene/TextureState.js.map +1 -0
  483. package/lib/scene/attributeData.d.ts +4 -0
  484. package/lib/scene/attributeData.js +10 -0
  485. package/lib/scene/attributeData.js.map +1 -0
  486. package/lib/scene/lightState.d.ts +8 -0
  487. package/lib/scene/lightState.js +2 -0
  488. package/lib/scene/lightState.js.map +1 -0
  489. package/lib/scene/openPbrSchema.d.ts +7 -12
  490. package/lib/scene/openPbrSchema.js +273 -28
  491. package/lib/scene/openPbrSchema.js.map +1 -1
  492. package/lib/scene/skyParameters.d.ts +20 -0
  493. package/lib/scene/skyParameters.js +28 -0
  494. package/lib/scene/skyParameters.js.map +1 -0
  495. package/lib/scene/textureData.d.ts +9 -0
  496. package/lib/scene/textureData.js +2 -0
  497. package/lib/scene/textureData.js.map +1 -0
  498. package/lib/scene/texturePixels.d.ts +6 -0
  499. package/lib/scene/texturePixels.js +10 -0
  500. package/lib/scene/texturePixels.js.map +1 -0
  501. package/lib/settings/display.d.ts +33 -0
  502. package/lib/settings/display.js +7 -0
  503. package/lib/settings/display.js.map +1 -1
  504. package/lib/settings/render.d.ts +25 -3
  505. package/lib/settings/render.js +3 -1
  506. package/lib/settings/render.js.map +1 -1
  507. package/lib/tinybvh/tinybvh.wasm +0 -0
  508. package/lib/util/commonGeometry.js +7 -7
  509. package/lib/util/commonGeometry.js.map +1 -1
  510. package/lib/util/fromTHREE.d.ts +4 -1
  511. package/lib/util/fromTHREE.js +18 -5
  512. package/lib/util/fromTHREE.js.map +1 -1
  513. package/lib/util/geometry.js +42 -29
  514. package/lib/util/geometry.js.map +1 -1
  515. package/lib/util/loadRGBE.js +3 -4
  516. package/lib/util/loadRGBE.js.map +1 -1
  517. package/lib/util/studioLighting.d.ts +18 -0
  518. package/lib/util/studioLighting.js +36 -0
  519. package/lib/util/studioLighting.js.map +1 -0
  520. package/lib/version.d.ts +1 -1
  521. package/lib/version.js +1 -1
  522. package/lib/version.js.map +1 -1
  523. package/llms.txt +4 -0
  524. package/package.json +31 -5
  525. package/lib/renderer/texturesFromMaterials.d.ts +0 -6
  526. package/lib/renderer/texturesFromMaterials.js.map +0 -1
@@ -1,3 +1,6 @@
1
+ import { displayAovKind, DEFAULT_AOV_DISPLAY } from './aovDisplay.js';
2
+ import { WebGLAov } from './WebGLAov.js';
3
+ import { aovMask } from './aov.js';
1
4
  import { scheduleFrame } from '../util/frame.js';
2
5
  import { WebGLScratchCopy } from './WebGLScratchCopy.js';
3
6
  import { ScratchPool } from './ScratchPool.js';
@@ -6,7 +9,7 @@ import { readRgbaPixels } from './WebGLReadback.js';
6
9
  import { vec3 } from '../math.js';
7
10
  import halton from './halton.js';
8
11
  import { makeTileRender } from './TileRender.js';
9
- import { constants } from './webgl.js';
12
+ import { constants, Texture2D } from './webgl.js';
10
13
  import { WebGLFullQuadPass } from './WebGLFullQuadPass.js';
11
14
  import WebGLRayTracePass from './WebGLRayTracePass.js';
12
15
  import { WebGLRayTraceOutputPass } from './WebGLRayTraceOutputPass.js';
@@ -22,10 +25,13 @@ const wavelengths = [650, 510, 475];
22
25
  */
23
26
  function makeWebGLAccumulationTarget(renderer, rayTracePass, scratch) {
24
27
  let sampleRenderedCallback = (_sampleCount, _isFirstFrame, _frameTime) => { };
25
- let allowMultipleSamplesPerFrame = false;
28
+ let batchSamples = false;
26
29
  let offlineSamplesPerBatch = 0;
27
30
  let deferPostProcess = false;
28
31
  let sampleSequenceOffset = 0;
32
+ const aov = new WebGLAov(renderer);
33
+ let aovCamera;
34
+ let displayTrace;
29
35
  let sampleCount = 0;
30
36
  let elapsedFrameTime = 32;
31
37
  let elapsedTileTime;
@@ -55,6 +61,7 @@ function makeWebGLAccumulationTarget(renderer, rayTracePass, scratch) {
55
61
  let tint = 0;
56
62
  let vignette = 0;
57
63
  let output = 'final';
64
+ let aovDisplayOptions = DEFAULT_AOV_DISPLAY;
58
65
  let pageLeaveTime = performance.now();
59
66
  let pageInvisibleTime = 0;
60
67
  const shadowCatcherColor = vec3.create();
@@ -133,6 +140,16 @@ function makeWebGLAccumulationTarget(renderer, rayTracePass, scratch) {
133
140
  resolvedSamples = sampleCount;
134
141
  resolvedHasShadowCatcher = rayTracePass.hasShadowCatcher();
135
142
  }
143
+ const aovKind = displayAovKind(output);
144
+ if (aovKind && sampleCount === 0) {
145
+ if (!execution?.aovs?.includes(aovKind))
146
+ throw new Error(`AOV ${aovKind} is not enabled`);
147
+ if (!aov.samples)
148
+ return;
149
+ presentationTexture = copy.copy(aov.visualize(aovKind, aovDisplayOptions), renderWidth, renderHeight, presentationTexture);
150
+ presentationDenoised = false;
151
+ return;
152
+ }
136
153
  if (resolvedSamples === 0)
137
154
  return;
138
155
  if (resolve) {
@@ -155,6 +172,7 @@ function makeWebGLAccumulationTarget(renderer, rayTracePass, scratch) {
155
172
  bloomState.settings = bloomSettings;
156
173
  bloomPass.setBrightThreshold(bloomThreshold);
157
174
  bloomPass.setRadius(bloomRadius);
175
+ displayTrace?.push('Bloom:SceneLinear');
158
176
  bloomPass.createPass(colorTexture);
159
177
  }
160
178
  else if (bloomEnabled && sampleCount < 10) {
@@ -165,6 +183,7 @@ function makeWebGLAccumulationTarget(renderer, rayTracePass, scratch) {
165
183
  shadowCatcherEnabled: +resolvedHasShadowCatcher,
166
184
  outputMode: output === 'shadow' ? 1 : 0
167
185
  });
186
+ displayTrace?.push('Compose:DisplayEncoded');
168
187
  composePass.createPass({
169
188
  colorTex: colorTexture,
170
189
  foregroundTex: rayTraceOutputPass.getOutput('foreground'),
@@ -189,16 +208,23 @@ function makeWebGLAccumulationTarget(renderer, rayTracePass, scratch) {
189
208
  shadowCatcher: rayTraceOutputPass.getOutput('shadowCatcher'),
190
209
  strength: pendingDenoiser.strength,
191
210
  shape: pendingDenoiser.shape
192
- });
211
+ }, displayTrace);
193
212
  denoisedTexture = copy.copy(filtered, renderWidth, renderHeight, denoisedTexture);
194
213
  denoiseValid = true;
195
214
  pendingDenoiser = undefined;
196
215
  }
197
216
  let displayTexture = (output === 'final' && denoiseValid && denoisedTexture) || composePass.getOutput('color');
198
- if (output === 'normal' || output === 'albedo') {
217
+ if (aovKind) {
218
+ if (!execution?.aovs?.includes(aovKind))
219
+ throw new Error(`AOV ${aovKind} is not enabled`);
220
+ displayTexture = aov.visualize(aovKind, aovDisplayOptions);
221
+ }
222
+ else if (output === 'normal' || output === 'albedo') {
223
+ displayTrace?.push('AOV:Raw');
199
224
  displayTexture = rayTraceOutputPass.getOutput(output);
200
225
  }
201
226
  else if (output === 'shadowCatcher') {
227
+ displayTrace?.push('AOV:Raw');
202
228
  displayTexture = rayTraceOutputPass.getOutput('shadowCatcher');
203
229
  }
204
230
  presentationTexture = copy.copy(displayTexture, renderWidth, renderHeight, presentationTexture);
@@ -228,7 +254,14 @@ function makeWebGLAccumulationTarget(renderer, rayTracePass, scratch) {
228
254
  return true;
229
255
  }
230
256
  rayTracePass.setCamera(camera);
257
+ aovCamera = camera;
258
+ if (!rayTracePass.preparePrograms())
259
+ return true;
231
260
  const resetAccumulation = isFirstFrame;
261
+ if (resetAccumulation)
262
+ aov.reset();
263
+ if (execution?.aovs?.length && !rayTracePass.prepareAovs(aov, camera, renderWidth, renderHeight, execution.aovs))
264
+ return true;
232
265
  if (resetAccumulation) {
233
266
  tileTimingGeneration++;
234
267
  elapsedTileTime = undefined;
@@ -252,7 +285,7 @@ function makeWebGLAccumulationTarget(renderer, rayTracePass, scratch) {
252
285
  if (offlineSamplesPerBatch > 0 && tile.isFirstTile && tile.isLastTile) {
253
286
  tile.samplesPerFrame = offlineSamplesPerBatch;
254
287
  }
255
- else if (!allowMultipleSamplesPerFrame ||
288
+ else if (!batchSamples ||
256
289
  !(tile.isFirstTile && tile.isLastTile)) {
257
290
  tile.samplesPerFrame = 1;
258
291
  }
@@ -267,6 +300,10 @@ function makeWebGLAccumulationTarget(renderer, rayTracePass, scratch) {
267
300
  if (tile.isLastTile)
268
301
  sampleCount++;
269
302
  }
303
+ if (sampleCount !== frameSampleCount) {
304
+ if (execution?.aovs?.length)
305
+ rayTracePass.renderAovs(aov, camera, renderWidth, renderHeight, Math.max(sampleCount, aov.samples), execution.aovSamples ?? 16, execution.aovs, sampleSequenceOffset);
306
+ }
270
307
  if (sampleCount !== frameSampleCount && (!deferPostProcess || sampleCount >= maxSamples)) {
271
308
  drawPostProcess(sampleCount >= maxSamples, true);
272
309
  }
@@ -334,9 +371,25 @@ function makeWebGLAccumulationTarget(renderer, rayTracePass, scratch) {
334
371
  invalidateDenoisedOutput() { pendingDenoiser = undefined; denoiseValid = false; preserveDenoisedOutput = false; },
335
372
  synchronizeBackground() { },
336
373
  configure(settings) {
337
- execution = { ...settings };
374
+ if (settings.aovs?.length && (!Number.isInteger(settings.aovSamples ?? 16) || (settings.aovSamples ?? 16) < 1))
375
+ throw new RangeError('aovSamples must be a positive integer');
376
+ const previousMask = aovMask(execution?.aovs ?? []), nextMask = aovMask(settings.aovs ?? []);
377
+ if (previousMask !== nextMask || execution?.aovSamples !== settings.aovSamples)
378
+ aov.samples = 0;
379
+ execution = { ...settings, aovs: [...(settings.aovs ?? [])] };
380
+ // A reduced preview set can retire the previously displayed AOV before
381
+ // Display applies its next channel after tracing.
382
+ const displayedAov = displayAovKind(output);
383
+ if (displayedAov && !settings.aovs?.includes(displayedAov))
384
+ output = 'final';
385
+ if (previousMask && !nextMask) {
386
+ aov.dispose();
387
+ aov.history.clear();
388
+ aov.width = aov.height = 0;
389
+ aov.reset();
390
+ }
338
391
  maxTimePerTile = Math.max(1, settings.timeBudgetMs);
339
- allowMultipleSamplesPerFrame = settings.allowMultipleSamplesPerFrame;
392
+ batchSamples = settings.batchSamples;
340
393
  tileRender.setDesiredMsPerTile(maxTimePerTile);
341
394
  tileRender.setMaxTiles(settings.maxTiles);
342
395
  },
@@ -358,12 +411,13 @@ function makeWebGLAccumulationTarget(renderer, rayTracePass, scratch) {
358
411
  getMemory() {
359
412
  return {
360
413
  width: renderWidth, height: renderHeight,
361
- bytes: rayTracePass.getTargetMemoryBytes(targetKey)
414
+ bytes: aov.bytes + rayTracePass.getTargetMemoryBytes(targetKey)
362
415
  + rayTraceOutputPass.getMemoryBytes() + (presentationTexture?.getMemoryBytes() ?? 0) + (denoisedTexture?.getMemoryBytes() ?? 0)
363
416
  };
364
417
  },
365
418
  isFirstFrame: () => isFirstFrame,
366
419
  restartSamples(_preserveTemporalHistory = false) {
420
+ aov.reset();
367
421
  tileRender.reset();
368
422
  isFirstFrame = true;
369
423
  sampleCount = 0;
@@ -377,6 +431,8 @@ function makeWebGLAccumulationTarget(renderer, rayTracePass, scratch) {
377
431
  }
378
432
  if (isFirstFrame || sampleCount < 1)
379
433
  return Promise.resolve(false);
434
+ if (output !== 'final' && output !== 'shadow')
435
+ return Promise.resolve(true);
380
436
  pendingDenoiser = filter.denoiser;
381
437
  drawPostProcess(true);
382
438
  return Promise.resolve(true);
@@ -441,6 +497,35 @@ function makeWebGLAccumulationTarget(renderer, rayTracePass, scratch) {
441
497
  return undefined;
442
498
  },
443
499
  getTotalSamplesRendered: () => sampleCount,
500
+ /** @internal */
501
+ _displayParity() {
502
+ return {
503
+ record(trace) { displayTrace = trace; },
504
+ load(input) {
505
+ setSize(input.width, input.height);
506
+ denoiseValid = false;
507
+ pendingDenoiser = undefined;
508
+ const texture = (data) => {
509
+ const t = new Texture2D({ width: input.width, height: input.height,
510
+ source: { data, width: input.width, height: input.height }, type: constants.FLOAT,
511
+ minFilter: constants.NEAREST, magFilter: constants.NEAREST });
512
+ return t;
513
+ };
514
+ const shadow = Float32Array.from({ length: input.width * input.height * 4 }, (_, i) => i % 4 === 3 ? input.moments[Math.floor(i / 4) * 4 + 2] : input.shadow[Math.floor(i / 4) * 8 + i % 4]);
515
+ const background = Float32Array.from(shadow, (_, i) => input.shadow[Math.floor(i / 4) * 8 + 4 + i % 4]);
516
+ const inputs = { color: texture(input.color), albedo: texture(input.albedo), normal: texture(input.normal),
517
+ moments: texture(Float32Array.from(input.moments, (v, i) => i % 4 === 2 ? input.samples : v)),
518
+ shadowCatcher: texture(shadow), catcherBackground: texture(background), catcherMoments: texture(input.moments) };
519
+ rayTracePass._loadDiagnosticAccumulation(inputs, input.catcher);
520
+ sampleCount = resolvedSamples = input.samples;
521
+ resolvedHasShadowCatcher = input.catcher;
522
+ isFirstFrame = false;
523
+ rayTraceOutputPass.setSize(renderWidth, renderHeight);
524
+ rayTraceOutputPass.setSampleCount(sampleCount);
525
+ rayTraceOutputPass.createPass(rayTracePass);
526
+ }
527
+ };
528
+ },
444
529
  getDiagnostics: () => ({ ...rayTracePass.getDiagnostics(), shaderCompilation: renderer.getShaderCompilationDiagnostics() }),
445
530
  flushDiagnostics: async () => { },
446
531
  setShadowCatcherParams(color, alpha) {
@@ -468,6 +553,7 @@ function makeWebGLAccumulationTarget(renderer, rayTracePass, scratch) {
468
553
  setOnSampleRendered(cb) {
469
554
  sampleRenderedCallback = cb;
470
555
  },
556
+ setAovDisplayOptions(options) { aovDisplayOptions = { ...options, depthRange: [...options.depthRange] }; },
471
557
  setOutput(nextOutput) {
472
558
  if (output === nextOutput)
473
559
  return false;
@@ -481,6 +567,27 @@ function makeWebGLAccumulationTarget(renderer, rayTracePass, scratch) {
481
567
  const width = presentationTexture.width, height = presentationTexture.height;
482
568
  return { width, height, data: readRgbaPixels(renderer.gl, width, height, presentationTexture.isByteEncoded) };
483
569
  },
570
+ aovReady(kind) { return !!execution?.aovs?.includes(kind) && aov.samples > 0; },
571
+ getAovSamples() { return aov.samples; },
572
+ restartAovs() { aov.reset(); },
573
+ refineAovs(camera, samples = sampleCount) {
574
+ if (samples < 1 || !execution?.aovs?.length)
575
+ return true;
576
+ rayTracePass.setCamera(camera);
577
+ aovCamera = camera;
578
+ return rayTracePass.renderAovs(aov, camera, renderWidth, renderHeight, samples, execution.aovSamples ?? 16, execution.aovs, sampleSequenceOffset);
579
+ },
580
+ async readAov(kind) {
581
+ if (!execution?.aovs?.includes(kind) || !aovCamera || (sampleCount < 1 && aov.samples < 1))
582
+ throw new Error('AOV output is not ready');
583
+ rayTracePass.setCamera(aovCamera);
584
+ while (!rayTracePass.renderAovs(aov, aovCamera, renderWidth, renderHeight, Math.max(sampleCount, aov.samples), execution.aovSamples ?? 16, execution.aovs, sampleSequenceOffset)) {
585
+ if (disposed || renderer.gl.isContextLost())
586
+ throw new Error('AOV compilation was interrupted');
587
+ await new Promise(resolve => scheduleFrame(() => resolve()));
588
+ }
589
+ return aov.read(kind);
590
+ },
484
591
  async readOutput(kind) {
485
592
  if (kind === 'denoised' && (!denoisedTexture || !denoiseValid))
486
593
  kind = 'hdr';
@@ -494,6 +601,7 @@ function makeWebGLAccumulationTarget(renderer, rayTracePass, scratch) {
494
601
  disposed = true;
495
602
  if (typeof document !== 'undefined')
496
603
  document.removeEventListener('visibilitychange', onVisibilityChange);
604
+ aov.dispose();
497
605
  rayTracePass.releaseTarget(targetKey);
498
606
  rayTraceOutputPass.dispose();
499
607
  presentationTexture?.dispose(renderer.gl);
@@ -1 +1 @@
1
- {"version":3,"file":"WebGLRenderingPipeline.js","sourceRoot":"","sources":["../../src/renderer/WebGLRenderingPipeline.ts"],"names":[],"mappings":"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","sourcesContent":["import {scheduleFrame} from '../util/frame.js';\nimport type {DenoiserHandle} from './denoiser.js';\nimport { WebGLScratchCopy } from './WebGLScratchCopy.js';\nimport { ScratchPool } from './ScratchPool.js';\nimport { makeRenderPipeline, type TraceSettings, type RenderPipeline } from './renderPipeline.js';\nimport type { TargetPipeline } from './accumulationTarget.js';\nimport { readRgbaPixels } from './WebGLReadback.js';\n// Portions adapted from ray-tracing-renderer@0.10.15\n// (https://github.com/hoverinc/ray-tracing-renderer).\n// Copyright (c) 2019 HOVER, MIT license; see LICENSES/RayTracingRenderer-MIT.txt.\n\nimport Camera from '../scene/Camera.js';\nimport { ColorRGB } from '../types.js';\nimport { vec3 } from '../math.js';\nimport halton from './halton.js';\nimport { makeTileRender } from './TileRender.js';\nimport {\n DisplayChannel,\n ToneMappingParams\n} from './RenderingPipeline.js';\nimport { constants, WebGLDevice, Texture2D } from './webgl.js';\nimport { WebGLFullQuadPass } from './WebGLFullQuadPass.js';\nimport WebGLRayTracePass from './WebGLRayTracePass.js';\nimport { WebGLRayTraceOutputPass } from './WebGLRayTraceOutputPass.js';\nimport WebGLBloomPass from './WebGLBloomPass.js';\nimport {\n composeFragment,\n outputFragment\n} from './glsl/webglPipeline.frag.js';\nimport { type JNLMDenoiser } from './jnlm.js';\nimport { WebGLJNLMDenoisePass } from './WebGLJNLMDenoiser.js';\n\nconst wavelengths = [650, 510, 475];\n\n/**\n * WebGL 2.0 counterpart of WGPURenderingPipeline.\n *\n * The frame is encoded as a fixed pass sequence. Each pass owns explicit\n * textures/FBOs, so no compositor graph or node lifecycle participates here.\n */\nfunction makeWebGLAccumulationTarget(renderer: WebGLDevice, rayTracePass: WebGLRayTracePass, scratch: ScratchPool) {\n let sampleRenderedCallback = (\n _sampleCount: number,\n _isFirstFrame: boolean,\n _frameTime: number\n ) => { };\n let allowMultipleSamplesPerFrame = false;\n let offlineSamplesPerBatch = 0;\n let deferPostProcess = false;\n let sampleSequenceOffset = 0;\n let sampleCount = 0;\n let elapsedFrameTime = 32;\n let elapsedTileTime: number | undefined;\n let tileTimingGeneration = 0;\n let isFirstFrame = true;\n let renderFailed = false;\n let disposed = false;\n let renderWidth = 1;\n let renderHeight = 1;\n let screenWidth = 1;\n let screenHeight = 1;\n\n const targetKey = {};\n let execution: TraceSettings | undefined;\n\n let resolvedSamples = 0;\n let resolvedHasShadowCatcher = false;\n let presentationTexture: Texture2D | undefined;\n let presentationDenoised = false;\n\n let maxTimePerTile = 21;\n\n let bloomIntensity = 0;\n let bloomThreshold = 1;\n let bloomRadius = 0.6;\n let exposure = 1;\n let toneMappingMode = 0;\n let contrast = 1;\n let saturation = 1;\n let temperature = 0;\n let tint = 0;\n let vignette = 0;\n let output: DisplayChannel = 'final';\n let pageLeaveTime = performance.now();\n let pageInvisibleTime = 0;\n const shadowCatcherColor = vec3.create();\n let shadowCatcherAlpha = 1;\n\n // Preview frames have a different resolution, bounce limit, and timing\n // target. Keep their measurements out of the full-resolution estimator so\n // returning from preview does not split a 4K sample into hundreds of tiles.\n const tileRender = makeTileRender(renderer.gl);\n tileRender.setDesiredMsPerTile(maxTimePerTile);\n\n const rayTraceOutputPass = new WebGLRayTraceOutputPass(renderer);\n let bloomPass: WebGLBloomPass | undefined;\n\n const composePass = scratch.get('composePass', () => new WebGLFullQuadPass<\n 'colorTex' | 'foregroundTex' | 'catcherBackgroundTex' | 'shadowCatcherTex' | 'bloomTex',\n 'color'\n >('compose', renderer, {\n shader: composeFragment,\n outputs: ['color'],\n outputParams: { color: { type: constants.UNSIGNED_BYTE } }\n }));\n composePass.setUniforms({\n exposure,\n shadowCatcherColor,\n shadowCatcherAlpha,\n shadowCatcherEnabled: 0,\n bloomIntensity: 0,\n toneMappingMode,\n contrast,\n saturation,\n temperature,\n tint,\n vignette,\n outputMode: 0,\n sRGBOutput: 1\n });\n\n const outputPass = scratch.get('outputPass', () => new WebGLFullQuadPass<\n 'colorTex' | 'colorDenoisedTex',\n 'color'\n >('output', renderer, { shader: outputFragment, outputs: ['color'] }));\n outputPass.setRenderToScreen();\n const copy = scratch.get('image copy', () => new WebGLScratchCopy(renderer));\n const rawReadFrameBuffer = copy.readFrameBuffer;\n\n // Built-in JNLM denoising. WebGL runs it synchronously inside the\n // post-process, between composition and output.\n let jnlmPass: WebGLJNLMDenoisePass | undefined;\n let pendingDenoiser: JNLMDenoiser | undefined;\n let denoisedTexture: Texture2D | undefined;\n let denoiseValid = false;\n // Keep the last denoised image visible while while-converging batches\n // accumulate (see RenderingPipeline.setPreserveDenoisedOutput).\n let preserveDenoisedOutput = false;\n\n function updateSeed(useJitter: boolean) {\n const sequenceSample = sampleCount + sampleSequenceOffset;\n const jitterX = useJitter ? halton(sequenceSample, 2) - 0.5 : 0;\n const jitterY = useJitter ? halton(sequenceSample, 3) - 0.5 : 0;\n rayTracePass.setJitter(jitterX / renderWidth, jitterY / renderHeight);\n }\n\n function traceSample(\n clear: boolean,\n tile: { x: number; y: number; width: number; height: number }\n ) {\n rayTracePass.setSampleCount(sampleCount + sampleSequenceOffset);\n rayTracePass.setSampleSequenceOffset(sampleSequenceOffset);\n updateSeed(true);\n if (rayTracePass.hasDispersion()) {\n if (execution?.dispersionWavelengths === 1) {\n // A positive wavelength enables stochastic hero-wavelength sampling\n // in the shader. Preview traces one random RGB channel per pixel.\n rayTracePass.setWavelength(wavelengths[0]);\n rayTracePass.createPass(clear, tile);\n } else {\n wavelengths.forEach((wavelength, index) => {\n rayTracePass.setWavelength(wavelength);\n rayTracePass.createPass(clear && index === 0, tile, index > 0);\n });\n }\n } else {\n rayTracePass.setWavelength(0);\n rayTracePass.createPass(clear, tile);\n }\n }\n\n function drawPostProcess(_forceNeedsDenoise = false, resolve = false) {\n if (resolve) { resolvedSamples = sampleCount; resolvedHasShadowCatcher = rayTracePass.hasShadowCatcher(); }\n if (resolvedSamples === 0) return;\n if (resolve) {\n rayTraceOutputPass.setSampleCount(sampleCount);\n rayTraceOutputPass.createPass(rayTracePass);\n }\n\n composePass.setSize(renderWidth, renderHeight);\n composePass.setUniforms({ exposure, toneMappingMode, contrast, saturation, temperature, tint, vignette, shadowCatcherColor, shadowCatcherAlpha });\n const colorTexture = rayTraceOutputPass.getOutput('color');\n const bloomEnabled = bloomIntensity > 0;\n const samplesSkipped = sampleCount < 10 || sampleCount % 10 > 0;\n const bloomState = scratch.get('bloom state', () => ({ owner: undefined as object | undefined, settings: '', dispose() { } }));\n const bloomSettings = `${bloomThreshold}/${bloomRadius}`;\n const needsUpdateBloom = bloomEnabled && sampleCount >= 10 && (!samplesSkipped || bloomState.owner !== targetKey || bloomState.settings !== bloomSettings);\n let currentBloomIntensity = bloomIntensity;\n if (needsUpdateBloom) {\n bloomPass ||= scratch.get('bloom', () => new WebGLBloomPass(renderer));\n bloomPass.setSize(renderWidth, renderHeight);\n bloomState.owner = targetKey; bloomState.settings = bloomSettings;\n bloomPass.setBrightThreshold(bloomThreshold);\n bloomPass.setRadius(bloomRadius);\n bloomPass.createPass(colorTexture);\n } else if (bloomEnabled && sampleCount < 10) {\n currentBloomIntensity = 0;\n }\n\n composePass.setUniforms({\n bloomIntensity: currentBloomIntensity,\n shadowCatcherEnabled: +resolvedHasShadowCatcher,\n outputMode: output === 'shadow' ? 1 : 0\n });\n composePass.createPass({\n colorTex: colorTexture,\n foregroundTex: rayTraceOutputPass.getOutput('foreground'),\n catcherBackgroundTex: rayTraceOutputPass.getOutput('catcherBackground'),\n shadowCatcherTex: rayTraceOutputPass.getOutput('shadowCatcher'),\n bloomTex:\n bloomEnabled && bloomPass\n ? bloomPass.getOutput()\n : renderer.emptyTexture\n });\n\n if (pendingDenoiser) {\n jnlmPass ??= scratch.get('jnlm', () => new WebGLJNLMDenoisePass(renderer));\n const filtered = jnlmPass.render({\n width: renderWidth,\n height: renderHeight,\n moments: rayTracePass.getOutput('moments'),\n catcherMoments: rayTracePass.hasShadowCatcher()\n ? rayTracePass.getOutput('catcherMoments')\n : undefined,\n color: composePass.getOutput('color'),\n albedo: rayTraceOutputPass.getOutput('albedo'),\n normal: rayTraceOutputPass.getOutput('normal'),\n shadowCatcher: rayTraceOutputPass.getOutput('shadowCatcher'),\n strength: pendingDenoiser.strength,\n shape: pendingDenoiser.shape\n });\n denoisedTexture = copy.copy(filtered, renderWidth, renderHeight, denoisedTexture); denoiseValid = true;\n pendingDenoiser = undefined;\n }\n\n let displayTexture =\n (output === 'final' && denoiseValid && denoisedTexture) || composePass.getOutput('color');\n if (output === 'normal' || output === 'albedo') {\n displayTexture = rayTraceOutputPass.getOutput(output);\n } else if (output === 'shadowCatcher') {\n displayTexture = rayTraceOutputPass.getOutput('shadowCatcher');\n }\n presentationTexture = copy.copy(displayTexture, renderWidth, renderHeight, presentationTexture);\n presentationDenoised = output === 'final' && denoiseValid && !!denoisedTexture;\n\n }\n\n function startRecordFrameTime(collectTileTiming: boolean) {\n const start = performance.now();\n const generation = tileTimingGeneration;\n const timedTileRender = tileRender;\n scheduleFrame(() => {\n elapsedFrameTime = Math.max(\n performance.now() - start - pageInvisibleTime,\n pageInvisibleTime > 0 ? 16 : 8\n );\n pageInvisibleTime = 0;\n if (\n generation === tileTimingGeneration &&\n timedTileRender === tileRender && !isFirstFrame\n ) {\n elapsedTileTime = collectTileTiming && renderer.isAllProgramCompiled()\n ? elapsedFrameTime : undefined;\n }\n });\n }\n\n function trace(camera: Camera, maxSamples: number) {\n if (rayTracePass.isInvalid() || renderFailed) return false;\n if (!renderer.isAllProgramCompiled()) {\n isFirstFrame = true;\n sampleCount = 0;\n tileRender.reset();\n return true;\n }\n\n rayTracePass.setCamera(camera);\n const resetAccumulation = isFirstFrame;\n if (resetAccumulation) {\n tileTimingGeneration++;\n elapsedTileTime = undefined;\n rayTracePass.setCamera(camera);\n tileRender.reset();\n sampleCount = 0;\n isFirstFrame = false;\n }\n if (sampleCount >= maxSamples) {\n drawPostProcess(true);\n return false;\n }\n // New samples make the denoised image stale.\n if (!preserveDenoisedOutput || resetAccumulation) denoiseValid = false;\n\n // The first draw after an update lazily prepares scene data and shaders.\n // Keep its wall time for reporting, but not for estimating tile throughput.\n startRecordFrameTime(!resetAccumulation);\n const frameSampleCount = sampleCount;\n let tile = tileRender.nextTile(elapsedTileTime);\n if (offlineSamplesPerBatch > 0 && tile.isFirstTile && tile.isLastTile) {\n tile.samplesPerFrame = offlineSamplesPerBatch;\n } else if (\n !allowMultipleSamplesPerFrame ||\n !(tile.isFirstTile && tile.isLastTile)\n ) {\n tile.samplesPerFrame = 1;\n }\n\n try {\n for (let i = 0;i < tile.samplesPerFrame && sampleCount < maxSamples;i++) {\n traceSample(sampleCount === 0 && tile.isFirstTile, {\n x: tile.x,\n y: tile.y,\n width: tile.tileWidth,\n height: tile.tileHeight\n });\n if (tile.isLastTile) sampleCount++;\n }\n if (sampleCount !== frameSampleCount && (!deferPostProcess || sampleCount >= maxSamples)) {\n drawPostProcess(sampleCount >= maxSamples, true);\n }\n } catch (error) {\n console.error(error);\n renderFailed = true;\n return false;\n }\n\n if (sampleCount !== frameSampleCount) {\n sampleRenderedCallback(\n sampleCount,\n frameSampleCount === 0,\n elapsedFrameTime\n );\n\n }\n return !renderer.isAllProgramCompiled();\n }\n\n function applyRenderResolution() {\n rayTracePass.useTarget(targetKey);\n const scale = 1;\n const nextWidth = Math.max(1, Math.round(screenWidth * scale));\n const nextHeight = Math.max(1, Math.round(screenHeight * scale));\n rayTracePass.setSize(nextWidth, nextHeight, screenWidth / screenHeight);\n if (nextWidth === renderWidth && nextHeight === renderHeight) return;\n renderWidth = nextWidth;\n renderHeight = nextHeight;\n tileRender.setSize(renderWidth, renderHeight);\n rayTraceOutputPass.setSize(renderWidth, renderHeight);\n composePass.setSize(renderWidth, renderHeight);\n bloomPass?.setSize(renderWidth, renderHeight);\n sampleCount = 0;\n resolvedSamples = 0;\n isFirstFrame = true;\n\n }\n\n function setSize(width: number, height: number) {\n width = Math.max(1, width);\n height = Math.max(1, height);\n if (width === screenWidth && height === screenHeight) return;\n screenWidth = width;\n screenHeight = height;\n\n outputPass.setSize(screenWidth, screenHeight);\n applyRenderResolution();\n sampleCount = 0;\n isFirstFrame = true;\n }\n\n function onVisibilityChange() {\n if (document.hidden) pageLeaveTime = performance.now();\n else pageInvisibleTime = performance.now() - pageLeaveTime;\n }\n if (typeof document !== 'undefined') document.addEventListener('visibilitychange', onVisibilityChange);\n\n function activate() {\n rayTracePass.useTarget(targetKey);\n rayTracePass.setSize(renderWidth, renderHeight, screenWidth / screenHeight);\n if (execution) {\n rayTracePass.setQuality(execution);\n rayTracePass.setClamping(execution.clamping);\n rayTracePass.setTransmissiveOutputAlphaMin(execution.transmissiveOutputAlphaMin);\n rayTracePass.setBevelSamples(execution.bevelSamples);\n rayTracePass.setSamplingPattern(execution.samplingPattern, execution.maxSamples);\n }\n }\n\n return {\n invalidateDenoisedOutput() { pendingDenoiser = undefined; denoiseValid = false; preserveDenoisedOutput = false; },\n synchronizeBackground() { },\n configure(settings: TraceSettings) {\n execution = { ...settings };\n maxTimePerTile = Math.max(1, settings.timeBudgetMs);\n allowMultipleSamplesPerFrame = settings.allowMultipleSamplesPerFrame;\n tileRender.setDesiredMsPerTile(maxTimePerTile);\n tileRender.setMaxTiles(settings.maxTiles);\n },\n activate,\n canCompleteSampleWithin(timeBudgetMs: number) { return elapsedFrameTime <= timeBudgetMs; },\n getOutputTexture() { return undefined; },\n applyPostProcesses() {},\n get presentationComplete() { return !!presentationTexture; },\n get presentationDenoised() { return presentationDenoised; },\n present() {\n if (!presentationTexture) return;\n {\n\n outputPass.setSize(renderer.canvas.width, renderer.canvas.height);\n }\n outputPass.setUniform('denoisedPercent', 0);\n outputPass.createPass({ colorTex: presentationTexture, colorDenoisedTex: presentationTexture });\n },\n getMemory() {\n return {\n width: renderWidth, height: renderHeight,\n bytes: rayTracePass.getTargetMemoryBytes(targetKey)\n + rayTraceOutputPass.getMemoryBytes() + (presentationTexture?.getMemoryBytes() ?? 0) + (denoisedTexture?.getMemoryBytes() ?? 0)\n };\n },\n isFirstFrame: () => isFirstFrame,\n restartSamples(_preserveTemporalHistory = false) {\n tileRender.reset();\n isFirstFrame = true;\n sampleCount = 0;\n denoiseValid = false;\n preserveDenoisedOutput = false;\n },\n /** Denoises the current image. WebGL only supports the built-in JNLM filter. */\n performDenoise(filter: DenoiserHandle): Promise<boolean> {\n if (filter.kind !== 'jnlm') {\n return Promise.reject(new Error('This denoiser requires WebGPU.'));\n }\n if (isFirstFrame || sampleCount < 1) return Promise.resolve(false);\n pendingDenoiser = filter.denoiser;\n drawPostProcess(true);\n return Promise.resolve(true);\n },\n cancelDenoise() {\n pendingDenoiser = undefined;\n },\n setPreserveDenoisedOutput(preserve: boolean) {\n preserveDenoisedOutput = preserve;\n },\n trace,\n drawPostProcess: () => drawPostProcess(true),\n setSize,\n setToneMappingParams(params: ToneMappingParams) {\n const nextExposure = params.exposure ?? 1;\n const nextToneMappingMode = {\n agx: 0,\n aces: 1,\n cineon: 2,\n reinhard: 3,\n linear: 4\n }[params.toneMapping ?? 'agx'] ?? 0;\n const nextContrast = params.contrast ?? 1;\n const nextSaturation = params.saturation ?? 1;\n const nextTemperature = params.temperature ?? 0;\n const nextTint = params.tint ?? 0;\n const nextVignette = params.vignette ?? 0;\n if (\n nextExposure === exposure &&\n nextToneMappingMode === toneMappingMode &&\n nextContrast === contrast &&\n nextSaturation === saturation &&\n nextTemperature === temperature &&\n nextTint === tint &&\n nextVignette === vignette\n ) return false;\n exposure = nextExposure;\n toneMappingMode = nextToneMappingMode;\n contrast = nextContrast;\n saturation = nextSaturation;\n temperature = nextTemperature;\n tint = nextTint;\n vignette = nextVignette;\n composePass.setUniforms({\n exposure,\n toneMappingMode,\n contrast,\n saturation,\n temperature,\n tint,\n vignette\n });\n return true;\n },\n setOfflineRenderOptions(options) {\n offlineSamplesPerBatch = Math.max(0, Math.round(options.samplesPerBatch));\n deferPostProcess = options.deferPostProcess;\n sampleSequenceOffset = Math.max(\n 0,\n Math.round(options.sampleSequenceOffset)\n );\n },\n setVarianceMoments(_enabled: boolean) { },\n setAdaptiveSamplingTargets(_targets) { },\n async prepareOfflineAdaptiveSampling(_options) {\n return undefined;\n },\n getTotalSamplesRendered: () => sampleCount,\n getDiagnostics: () => ({ ...rayTracePass.getDiagnostics(), shaderCompilation: renderer.getShaderCompilationDiagnostics() }),\n flushDiagnostics: async () => { },\n setShadowCatcherParams(color: ColorRGB, alpha: number) {\n const changed =\n color[0] !== shadowCatcherColor[0] ||\n color[1] !== shadowCatcherColor[1] ||\n color[2] !== shadowCatcherColor[2] ||\n alpha !== shadowCatcherAlpha;\n if (changed) {\n vec3.copy(shadowCatcherColor, color);\n shadowCatcherAlpha = alpha;\n composePass.setUniform('shadowCatcherColor', color);\n composePass.setUniform('shadowCatcherAlpha', alpha);\n }\n return changed;\n },\n setBloomParams({ intensity, threshold, radius }) {\n const changed =\n intensity !== bloomIntensity ||\n threshold !== bloomThreshold ||\n radius !== bloomRadius;\n bloomIntensity = intensity;\n bloomThreshold = threshold;\n bloomRadius = radius;\n return changed;\n },\n setOnSampleRendered(cb) {\n sampleRenderedCallback = cb;\n },\n\n setOutput(nextOutput: DisplayChannel) {\n if (output === nextOutput) return false;\n output = nextOutput;\n return true;\n },\n async readPresentation() {\n if (!presentationTexture) throw new Error('Render has no complete image.');\n rawReadFrameBuffer.bind(renderer, [presentationTexture]);\n const width = presentationTexture.width, height = presentationTexture.height;\n return { width, height, data: readRgbaPixels(renderer.gl, width, height, presentationTexture.isByteEncoded) };\n },\n async readOutput(kind) {\n if (kind === 'denoised' && (!denoisedTexture || !denoiseValid)) kind = 'hdr';\n const texture = kind === 'denoised' ? denoisedTexture! : rayTraceOutputPass.getOutput(kind === 'hdr' ? 'color' : kind);\n rawReadFrameBuffer.bind(renderer, [texture]);\n return { data: readRgbaPixels(renderer.gl, renderWidth, renderHeight, kind === 'albedo' || kind === 'normal'), width: renderWidth, height: renderHeight };\n },\n dispose() {\n if (disposed) return; disposed = true;\n if (typeof document !== 'undefined') document.removeEventListener('visibilitychange', onVisibilityChange);\n\n rayTracePass.releaseTarget(targetKey);\n rayTraceOutputPass.dispose();\n presentationTexture?.dispose(renderer.gl);\n denoisedTexture?.dispose(renderer.gl);\n }\n } satisfies TargetPipeline;\n}\n\n/** Independent render targets, without preview or presentation policy. */\nexport function makeWebGLRenderTargets(renderer: WebGLDevice): RenderPipeline {\n const rayTracePass = new WebGLRayTracePass(renderer);\n const scratch = new ScratchPool();\n return makeRenderPipeline(rayTracePass, () => makeWebGLAccumulationTarget(renderer, rayTracePass, scratch), true, scratch);\n}\n"]}
1
+ {"version":3,"file":"WebGLRenderingPipeline.js","sourceRoot":"","sources":["../../src/renderer/WebGLRenderingPipeline.ts"],"names":[],"mappings":"AACA,OAAO,EAAC,cAAc,EAAE,mBAAmB,EAAyB,MAAM,iBAAiB,CAAC;AAC5F,OAAO,EAAC,QAAQ,EAAC,MAAM,eAAe,CAAC;AACvC,OAAO,EAAC,OAAO,EAAC,MAAM,UAAU,CAAC;AACjC,OAAO,EAAC,aAAa,EAAC,MAAM,kBAAkB,CAAC;AAE/C,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AACzD,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAC/C,OAAO,EAAE,kBAAkB,EAA2C,MAAM,qBAAqB,CAAC;AAElG,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAOpD,OAAO,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AAClC,OAAO,MAAM,MAAM,aAAa,CAAC;AACjC,OAAO,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAKjD,OAAO,EAAE,SAAS,EAAe,SAAS,EAAE,MAAM,YAAY,CAAC;AAC/D,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAC3D,OAAO,iBAAiB,MAAM,wBAAwB,CAAC;AACvD,OAAO,EAAE,uBAAuB,EAAE,MAAM,8BAA8B,CAAC;AACvE,OAAO,cAAc,MAAM,qBAAqB,CAAC;AACjD,OAAO,EACL,eAAe,EACf,cAAc,EACf,MAAM,8BAA8B,CAAC;AAEtC,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAE9D,MAAM,WAAW,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC;AAEpC;;;;;GAKG;AACH,SAAS,2BAA2B,CAAC,QAAqB,EAAE,YAA+B,EAAE,OAAoB;IAC/G,IAAI,sBAAsB,GAAG,CAC3B,YAAoB,EACpB,aAAsB,EACtB,UAAkB,EAClB,EAAE,GAAG,CAAC,CAAC;IACT,IAAI,YAAY,GAAG,KAAK,CAAC;IACzB,IAAI,sBAAsB,GAAG,CAAC,CAAC;IAC/B,IAAI,gBAAgB,GAAG,KAAK,CAAC;IAC7B,IAAI,oBAAoB,GAAG,CAAC,CAAC;IAC7B,MAAM,GAAG,GAAC,IAAI,QAAQ,CAAC,QAAQ,CAAC,CAAC;IACjC,IAAI,SAA6B,CAAC;IAClC,IAAI,YAAkC,CAAC;IACvC,IAAI,WAAW,GAAG,CAAC,CAAC;IACpB,IAAI,gBAAgB,GAAG,EAAE,CAAC;IAC1B,IAAI,eAAmC,CAAC;IACxC,IAAI,oBAAoB,GAAG,CAAC,CAAC;IAC7B,IAAI,YAAY,GAAG,IAAI,CAAC;IACxB,IAAI,YAAY,GAAG,KAAK,CAAC;IACzB,IAAI,QAAQ,GAAG,KAAK,CAAC;IACrB,IAAI,WAAW,GAAG,CAAC,CAAC;IACpB,IAAI,YAAY,GAAG,CAAC,CAAC;IACrB,IAAI,WAAW,GAAG,CAAC,CAAC;IACpB,IAAI,YAAY,GAAG,CAAC,CAAC;IAErB,MAAM,SAAS,GAAG,EAAE,CAAC;IACrB,IAAI,SAAoC,CAAC;IAEzC,IAAI,eAAe,GAAG,CAAC,CAAC;IACxB,IAAI,wBAAwB,GAAG,KAAK,CAAC;IACrC,IAAI,mBAA0C,CAAC;IAC/C,IAAI,oBAAoB,GAAG,KAAK,CAAC;IAEjC,IAAI,cAAc,GAAG,EAAE,CAAC;IAExB,IAAI,cAAc,GAAG,CAAC,CAAC;IACvB,IAAI,cAAc,GAAG,CAAC,CAAC;IACvB,IAAI,WAAW,GAAG,GAAG,CAAC;IACtB,IAAI,QAAQ,GAAG,CAAC,CAAC;IACjB,IAAI,eAAe,GAAG,CAAC,CAAC;IACxB,IAAI,QAAQ,GAAG,CAAC,CAAC;IACjB,IAAI,UAAU,GAAG,CAAC,CAAC;IACnB,IAAI,WAAW,GAAG,CAAC,CAAC;IACpB,IAAI,IAAI,GAAG,CAAC,CAAC;IACb,IAAI,QAAQ,GAAG,CAAC,CAAC;IACjB,IAAI,MAAM,GAAmB,OAAO,CAAC;IACrC,IAAI,iBAAiB,GAAsB,mBAAmB,CAAC;IAC/D,IAAI,aAAa,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC;IACtC,IAAI,iBAAiB,GAAG,CAAC,CAAC;IAC1B,MAAM,kBAAkB,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC;IACzC,IAAI,kBAAkB,GAAG,CAAC,CAAC;IAE3B,uEAAuE;IACvE,0EAA0E;IAC1E,4EAA4E;IAC5E,MAAM,UAAU,GAAG,cAAc,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;IAC/C,UAAU,CAAC,mBAAmB,CAAC,cAAc,CAAC,CAAC;IAE/C,MAAM,kBAAkB,GAAG,IAAI,uBAAuB,CAAC,QAAQ,CAAC,CAAC;IACjE,IAAI,SAAqC,CAAC;IAE1C,MAAM,WAAW,GAAG,OAAO,CAAC,GAAG,CAAC,aAAa,EAAE,GAAG,EAAE,CAAC,IAAI,iBAAiB,CAGxE,SAAS,EAAE,QAAQ,EAAE;QACrB,MAAM,EAAE,eAAe;QACvB,OAAO,EAAE,CAAC,OAAO,CAAC;QAClB,YAAY,EAAE,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,SAAS,CAAC,aAAa,EAAE,EAAE;KAC3D,CAAC,CAAC,CAAC;IACJ,WAAW,CAAC,WAAW,CAAC;QACtB,QAAQ;QACR,kBAAkB;QAClB,kBAAkB;QAClB,oBAAoB,EAAE,CAAC;QACvB,cAAc,EAAE,CAAC;QACjB,eAAe;QACf,QAAQ;QACR,UAAU;QACV,WAAW;QACX,IAAI;QACJ,QAAQ;QACR,UAAU,EAAE,CAAC;QACb,UAAU,EAAE,CAAC;KACd,CAAC,CAAC;IAEH,MAAM,UAAU,GAAG,OAAO,CAAC,GAAG,CAAC,YAAY,EAAE,GAAG,EAAE,CAAC,IAAI,iBAAiB,CAGtE,QAAQ,EAAE,QAAQ,EAAE,EAAE,MAAM,EAAE,cAAc,EAAE,OAAO,EAAE,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC;IACvE,UAAU,CAAC,iBAAiB,EAAE,CAAC;IAC/B,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,YAAY,EAAE,GAAG,EAAE,CAAC,IAAI,gBAAgB,CAAC,QAAQ,CAAC,CAAC,CAAC;IAC7E,MAAM,kBAAkB,GAAG,IAAI,CAAC,eAAe,CAAC;IAEhD,kEAAkE;IAClE,gDAAgD;IAChD,IAAI,QAA0C,CAAC;IAC/C,IAAI,eAAyC,CAAC;IAC9C,IAAI,eAAsC,CAAC;IAC3C,IAAI,YAAY,GAAG,KAAK,CAAC;IACzB,sEAAsE;IACtE,gEAAgE;IAChE,IAAI,sBAAsB,GAAG,KAAK,CAAC;IAEnC,SAAS,UAAU,CAAC,SAAkB;QACpC,MAAM,cAAc,GAAG,WAAW,GAAG,oBAAoB,CAAC;QAC1D,MAAM,OAAO,GAAG,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,cAAc,EAAE,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QAChE,MAAM,OAAO,GAAG,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,cAAc,EAAE,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QAChE,YAAY,CAAC,SAAS,CAAC,OAAO,GAAG,WAAW,EAAE,OAAO,GAAG,YAAY,CAAC,CAAC;IACxE,CAAC;IAED,SAAS,WAAW,CAClB,KAAc,EACd,IAA6D;QAE7D,YAAY,CAAC,cAAc,CAAC,WAAW,GAAG,oBAAoB,CAAC,CAAC;QAChE,YAAY,CAAC,uBAAuB,CAAC,oBAAoB,CAAC,CAAC;QAC3D,UAAU,CAAC,IAAI,CAAC,CAAC;QACjB,IAAI,YAAY,CAAC,aAAa,EAAE,EAAE,CAAC;YACjC,IAAI,SAAS,EAAE,qBAAqB,KAAK,CAAC,EAAE,CAAC;gBAC3C,oEAAoE;gBACpE,kEAAkE;gBAClE,YAAY,CAAC,aAAa,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC;gBAC3C,YAAY,CAAC,UAAU,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;YACvC,CAAC;iBAAM,CAAC;gBACN,WAAW,CAAC,OAAO,CAAC,CAAC,UAAU,EAAE,KAAK,EAAE,EAAE;oBACxC,YAAY,CAAC,aAAa,CAAC,UAAU,CAAC,CAAC;oBACvC,YAAY,CAAC,UAAU,CAAC,KAAK,IAAI,KAAK,KAAK,CAAC,EAAE,IAAI,EAAE,KAAK,GAAG,CAAC,CAAC,CAAC;gBACjE,CAAC,CAAC,CAAC;YACL,CAAC;QACH,CAAC;aAAM,CAAC;YACN,YAAY,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC;YAC9B,YAAY,CAAC,UAAU,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;QACvC,CAAC;IACH,CAAC;IAED,SAAS,eAAe,CAAC,kBAAkB,GAAG,KAAK,EAAE,OAAO,GAAG,KAAK;QAClE,IAAI,OAAO,EAAE,CAAC;YAAC,eAAe,GAAG,WAAW,CAAC;YAAC,wBAAwB,GAAG,YAAY,CAAC,gBAAgB,EAAE,CAAC;QAAC,CAAC;QAC3G,MAAM,OAAO,GAAG,cAAc,CAAC,MAAM,CAAC,CAAC;QACvC,IAAI,OAAO,IAAI,WAAW,KAAK,CAAC,EAAE,CAAC;YACjC,IAAI,CAAC,SAAS,EAAE,IAAI,EAAE,QAAQ,CAAC,OAAO,CAAC;gBAAE,MAAM,IAAI,KAAK,CAAC,OAAO,OAAO,iBAAiB,CAAC,CAAC;YAC1F,IAAI,CAAC,GAAG,CAAC,OAAO;gBAAE,OAAO;YACzB,mBAAmB,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,OAAO,EAAC,iBAAiB,CAAC,EAAE,WAAW,EAAE,YAAY,EAAE,mBAAmB,CAAC,CAAC;YAC1H,oBAAoB,GAAG,KAAK,CAAC;YAC7B,OAAO;QACT,CAAC;QACD,IAAI,eAAe,KAAK,CAAC;YAAE,OAAO;QAClC,IAAI,OAAO,EAAE,CAAC;YACZ,kBAAkB,CAAC,cAAc,CAAC,WAAW,CAAC,CAAC;YAC/C,kBAAkB,CAAC,UAAU,CAAC,YAAY,CAAC,CAAC;QAC9C,CAAC;QAED,WAAW,CAAC,OAAO,CAAC,WAAW,EAAE,YAAY,CAAC,CAAC;QAC/C,WAAW,CAAC,WAAW,CAAC,EAAE,QAAQ,EAAE,eAAe,EAAE,QAAQ,EAAE,UAAU,EAAE,WAAW,EAAE,IAAI,EAAE,QAAQ,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,CAAC,CAAC;QAClJ,MAAM,YAAY,GAAG,kBAAkB,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;QAC3D,MAAM,YAAY,GAAG,cAAc,GAAG,CAAC,CAAC;QACxC,MAAM,cAAc,GAAG,WAAW,GAAG,EAAE,IAAI,WAAW,GAAG,EAAE,GAAG,CAAC,CAAC;QAChE,MAAM,UAAU,GAAG,OAAO,CAAC,GAAG,CAAC,aAAa,EAAE,GAAG,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,SAA+B,EAAE,QAAQ,EAAE,EAAE,EAAE,OAAO,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC;QAC/H,MAAM,aAAa,GAAG,GAAG,cAAc,IAAI,WAAW,EAAE,CAAC;QACzD,MAAM,gBAAgB,GAAG,YAAY,IAAI,WAAW,IAAI,EAAE,IAAI,CAAC,CAAC,cAAc,IAAI,UAAU,CAAC,KAAK,KAAK,SAAS,IAAI,UAAU,CAAC,QAAQ,KAAK,aAAa,CAAC,CAAC;QAC3J,IAAI,qBAAqB,GAAG,cAAc,CAAC;QAC3C,IAAI,gBAAgB,EAAE,CAAC;YACrB,SAAS,KAAK,OAAO,CAAC,GAAG,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC,IAAI,cAAc,CAAC,QAAQ,CAAC,CAAC,CAAC;YACvE,SAAS,CAAC,OAAO,CAAC,WAAW,EAAE,YAAY,CAAC,CAAC;YAC7C,UAAU,CAAC,KAAK,GAAG,SAAS,CAAC;YAAC,UAAU,CAAC,QAAQ,GAAG,aAAa,CAAC;YAClE,SAAS,CAAC,kBAAkB,CAAC,cAAc,CAAC,CAAC;YAC7C,SAAS,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC;YACjC,YAAY,EAAE,IAAI,CAAC,mBAAmB,CAAC,CAAC;YACxC,SAAS,CAAC,UAAU,CAAC,YAAY,CAAC,CAAC;QACrC,CAAC;aAAM,IAAI,YAAY,IAAI,WAAW,GAAG,EAAE,EAAE,CAAC;YAC5C,qBAAqB,GAAG,CAAC,CAAC;QAC5B,CAAC;QAED,WAAW,CAAC,WAAW,CAAC;YACtB,cAAc,EAAE,qBAAqB;YACrC,oBAAoB,EAAE,CAAC,wBAAwB;YAC/C,UAAU,EAAE,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;SACxC,CAAC,CAAC;QACH,YAAY,EAAE,IAAI,CAAC,wBAAwB,CAAC,CAAC;QAC7C,WAAW,CAAC,UAAU,CAAC;YACrB,QAAQ,EAAE,YAAY;YACtB,aAAa,EAAE,kBAAkB,CAAC,SAAS,CAAC,YAAY,CAAC;YACzD,oBAAoB,EAAE,kBAAkB,CAAC,SAAS,CAAC,mBAAmB,CAAC;YACvE,gBAAgB,EAAE,kBAAkB,CAAC,SAAS,CAAC,eAAe,CAAC;YAC/D,QAAQ,EACN,YAAY,IAAI,SAAS;gBACvB,CAAC,CAAC,SAAS,CAAC,SAAS,EAAE;gBACvB,CAAC,CAAC,QAAQ,CAAC,YAAY;SAC5B,CAAC,CAAC;QAEH,IAAI,eAAe,EAAE,CAAC;YACpB,QAAQ,KAAK,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,GAAG,EAAE,CAAC,IAAI,oBAAoB,CAAC,QAAQ,CAAC,CAAC,CAAC;YAC3E,MAAM,QAAQ,GAAG,QAAQ,CAAC,MAAM,CAAC;gBAC/B,KAAK,EAAE,WAAW;gBAClB,MAAM,EAAE,YAAY;gBACpB,OAAO,EAAE,YAAY,CAAC,SAAS,CAAC,SAAS,CAAC;gBAC1C,cAAc,EAAE,YAAY,CAAC,gBAAgB,EAAE;oBAC7C,CAAC,CAAC,YAAY,CAAC,SAAS,CAAC,gBAAgB,CAAC;oBAC1C,CAAC,CAAC,SAAS;gBACb,KAAK,EAAE,WAAW,CAAC,SAAS,CAAC,OAAO,CAAC;gBACrC,MAAM,EAAE,kBAAkB,CAAC,SAAS,CAAC,QAAQ,CAAC;gBAC9C,MAAM,EAAE,kBAAkB,CAAC,SAAS,CAAC,QAAQ,CAAC;gBAC9C,aAAa,EAAE,kBAAkB,CAAC,SAAS,CAAC,eAAe,CAAC;gBAC5D,QAAQ,EAAE,eAAe,CAAC,QAAQ;gBAClC,KAAK,EAAE,eAAe,CAAC,KAAK;aAC7B,EAAE,YAAY,CAAC,CAAC;YACjB,eAAe,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,WAAW,EAAE,YAAY,EAAE,eAAe,CAAC,CAAC;YAAC,YAAY,GAAG,IAAI,CAAC;YACvG,eAAe,GAAG,SAAS,CAAC;QAC9B,CAAC;QAED,IAAI,cAAc,GAChB,CAAC,MAAM,KAAK,OAAO,IAAI,YAAY,IAAI,eAAe,CAAC,IAAI,WAAW,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;QAC5F,IAAI,OAAO,EAAE,CAAC;YACZ,IAAI,CAAC,SAAS,EAAE,IAAI,EAAE,QAAQ,CAAC,OAAO,CAAC;gBAAE,MAAM,IAAI,KAAK,CAAC,OAAO,OAAO,iBAAiB,CAAC,CAAC;YAC1F,cAAc,GAAG,GAAG,CAAC,SAAS,CAAC,OAAO,EAAC,iBAAiB,CAAC,CAAC;QAC5D,CAAC;aAAM,IAAI,MAAM,KAAK,QAAQ,IAAI,MAAM,KAAK,QAAQ,EAAE,CAAC;YACtD,YAAY,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC;YAC9B,cAAc,GAAG,kBAAkB,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;QACxD,CAAC;aAAM,IAAI,MAAM,KAAK,eAAe,EAAE,CAAC;YACtC,YAAY,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC;YAC9B,cAAc,GAAG,kBAAkB,CAAC,SAAS,CAAC,eAAe,CAAC,CAAC;QACjE,CAAC;QACD,mBAAmB,GAAG,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,WAAW,EAAE,YAAY,EAAE,mBAAmB,CAAC,CAAC;QAChG,oBAAoB,GAAG,MAAM,KAAK,OAAO,IAAI,YAAY,IAAI,CAAC,CAAC,eAAe,CAAC;IAEjF,CAAC;IAED,SAAS,oBAAoB,CAAC,iBAA0B;QACtD,MAAM,KAAK,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC;QAChC,MAAM,UAAU,GAAG,oBAAoB,CAAC;QACxC,MAAM,eAAe,GAAG,UAAU,CAAC;QACnC,aAAa,CAAC,GAAG,EAAE;YACjB,gBAAgB,GAAG,IAAI,CAAC,GAAG,CACzB,WAAW,CAAC,GAAG,EAAE,GAAG,KAAK,GAAG,iBAAiB,EAC7C,iBAAiB,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAC/B,CAAC;YACF,iBAAiB,GAAG,CAAC,CAAC;YACtB,IACE,UAAU,KAAK,oBAAoB;gBACnC,eAAe,KAAK,UAAU,IAAI,CAAC,YAAY,EAC/C,CAAC;gBACD,eAAe,GAAG,iBAAiB,IAAI,QAAQ,CAAC,oBAAoB,EAAE;oBACpE,CAAC,CAAC,gBAAgB,CAAC,CAAC,CAAC,SAAS,CAAC;YACnC,CAAC;QACH,CAAC,CAAC,CAAC;IACL,CAAC;IAED,SAAS,KAAK,CAAC,MAAc,EAAE,UAAkB;QAC/C,IAAI,YAAY,CAAC,SAAS,EAAE,IAAI,YAAY;YAAE,OAAO,KAAK,CAAC;QAC3D,IAAI,CAAC,QAAQ,CAAC,oBAAoB,EAAE,EAAE,CAAC;YACrC,YAAY,GAAG,IAAI,CAAC;YACpB,WAAW,GAAG,CAAC,CAAC;YAChB,UAAU,CAAC,KAAK,EAAE,CAAC;YACnB,OAAO,IAAI,CAAC;QACd,CAAC;QAED,YAAY,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;QAC/B,SAAS,GAAC,MAAM,CAAC;QACjB,IAAI,CAAC,YAAY,CAAC,eAAe,EAAE;YAAE,OAAO,IAAI,CAAC;QACjD,MAAM,iBAAiB,GAAG,YAAY,CAAC;QACvC,IAAG,iBAAiB;YAAE,GAAG,CAAC,KAAK,EAAE,CAAC;QAClC,IAAI,SAAS,EAAE,IAAI,EAAE,MAAM,IAAI,CAAC,YAAY,CAAC,WAAW,CAAC,GAAG,EAAC,MAAM,EAAC,WAAW,EAAC,YAAY,EAAC,SAAS,CAAC,IAAI,CAAC;YAAE,OAAO,IAAI,CAAC;QAC1H,IAAI,iBAAiB,EAAE,CAAC;YACtB,oBAAoB,EAAE,CAAC;YACvB,eAAe,GAAG,SAAS,CAAC;YAC5B,YAAY,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;YAC/B,UAAU,CAAC,KAAK,EAAE,CAAC;YACnB,WAAW,GAAG,CAAC,CAAC;YAChB,YAAY,GAAG,KAAK,CAAC;QACvB,CAAC;QACD,IAAI,WAAW,IAAI,UAAU,EAAE,CAAC;YAC9B,eAAe,CAAC,IAAI,CAAC,CAAC;YACtB,OAAO,KAAK,CAAC;QACf,CAAC;QACD,6CAA6C;QAC7C,IAAI,CAAC,sBAAsB,IAAI,iBAAiB;YAAE,YAAY,GAAG,KAAK,CAAC;QAEvE,yEAAyE;QACzE,4EAA4E;QAC5E,oBAAoB,CAAC,CAAC,iBAAiB,CAAC,CAAC;QACzC,MAAM,gBAAgB,GAAG,WAAW,CAAC;QACrC,IAAI,IAAI,GAAG,UAAU,CAAC,QAAQ,CAAC,eAAe,CAAC,CAAC;QAChD,IAAI,sBAAsB,GAAG,CAAC,IAAI,IAAI,CAAC,WAAW,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;YACtE,IAAI,CAAC,eAAe,GAAG,sBAAsB,CAAC;QAChD,CAAC;aAAM,IACL,CAAC,YAAY;YACb,CAAC,CAAC,IAAI,CAAC,WAAW,IAAI,IAAI,CAAC,UAAU,CAAC,EACtC,CAAC;YACD,IAAI,CAAC,eAAe,GAAG,CAAC,CAAC;QAC3B,CAAC;QAED,IAAI,CAAC;YACH,KAAK,IAAI,CAAC,GAAG,CAAC,EAAC,CAAC,GAAG,IAAI,CAAC,eAAe,IAAI,WAAW,GAAG,UAAU,EAAC,CAAC,EAAE,EAAE,CAAC;gBACxE,WAAW,CAAC,WAAW,KAAK,CAAC,IAAI,IAAI,CAAC,WAAW,EAAE;oBACjD,CAAC,EAAE,IAAI,CAAC,CAAC;oBACT,CAAC,EAAE,IAAI,CAAC,CAAC;oBACT,KAAK,EAAE,IAAI,CAAC,SAAS;oBACrB,MAAM,EAAE,IAAI,CAAC,UAAU;iBACxB,CAAC,CAAC;gBACH,IAAI,IAAI,CAAC,UAAU;oBAAE,WAAW,EAAE,CAAC;YACrC,CAAC;YACD,IAAG,WAAW,KAAG,gBAAgB,EAAC,CAAC;gBACnC,IAAG,SAAS,EAAE,IAAI,EAAE,MAAM;oBAAE,YAAY,CAAC,UAAU,CAAC,GAAG,EAAC,MAAM,EAAC,WAAW,EAAC,YAAY,EAAC,IAAI,CAAC,GAAG,CAAC,WAAW,EAAC,GAAG,CAAC,OAAO,CAAC,EAAC,SAAS,CAAC,UAAU,IAAI,EAAE,EAAC,SAAS,CAAC,IAAI,EAAC,oBAAoB,CAAC,CAAC;YAC1L,CAAC;YACD,IAAI,WAAW,KAAK,gBAAgB,IAAI,CAAC,CAAC,gBAAgB,IAAI,WAAW,IAAI,UAAU,CAAC,EAAE,CAAC;gBACzF,eAAe,CAAC,WAAW,IAAI,UAAU,EAAE,IAAI,CAAC,CAAC;YACnD,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;YACrB,YAAY,GAAG,IAAI,CAAC;YACpB,OAAO,KAAK,CAAC;QACf,CAAC;QAED,IAAI,WAAW,KAAK,gBAAgB,EAAE,CAAC;YACrC,sBAAsB,CACpB,WAAW,EACX,gBAAgB,KAAK,CAAC,EACtB,gBAAgB,CACjB,CAAC;QAEJ,CAAC;QACD,OAAO,CAAC,QAAQ,CAAC,oBAAoB,EAAE,CAAC;IAC1C,CAAC;IAED,SAAS,qBAAqB;QAC5B,YAAY,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;QAClC,MAAM,KAAK,GAAG,CAAC,CAAC;QAChB,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,WAAW,GAAG,KAAK,CAAC,CAAC,CAAC;QAC/D,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,YAAY,GAAG,KAAK,CAAC,CAAC,CAAC;QACjE,YAAY,CAAC,OAAO,CAAC,SAAS,EAAE,UAAU,EAAE,WAAW,GAAG,YAAY,CAAC,CAAC;QACxE,IAAI,SAAS,KAAK,WAAW,IAAI,UAAU,KAAK,YAAY;YAAE,OAAO;QACrE,WAAW,GAAG,SAAS,CAAC;QACxB,YAAY,GAAG,UAAU,CAAC;QAC1B,UAAU,CAAC,OAAO,CAAC,WAAW,EAAE,YAAY,CAAC,CAAC;QAC9C,kBAAkB,CAAC,OAAO,CAAC,WAAW,EAAE,YAAY,CAAC,CAAC;QACtD,WAAW,CAAC,OAAO,CAAC,WAAW,EAAE,YAAY,CAAC,CAAC;QAC/C,SAAS,EAAE,OAAO,CAAC,WAAW,EAAE,YAAY,CAAC,CAAC;QAC9C,WAAW,GAAG,CAAC,CAAC;QAChB,eAAe,GAAG,CAAC,CAAC;QACpB,YAAY,GAAG,IAAI,CAAC;IAEtB,CAAC;IAED,SAAS,OAAO,CAAC,KAAa,EAAE,MAAc;QAC5C,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;QAC3B,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC;QAC7B,IAAI,KAAK,KAAK,WAAW,IAAI,MAAM,KAAK,YAAY;YAAE,OAAO;QAC7D,WAAW,GAAG,KAAK,CAAC;QACpB,YAAY,GAAG,MAAM,CAAC;QAEtB,UAAU,CAAC,OAAO,CAAC,WAAW,EAAE,YAAY,CAAC,CAAC;QAC9C,qBAAqB,EAAE,CAAC;QACxB,WAAW,GAAG,CAAC,CAAC;QAChB,YAAY,GAAG,IAAI,CAAC;IACtB,CAAC;IAED,SAAS,kBAAkB;QACzB,IAAI,QAAQ,CAAC,MAAM;YAAE,aAAa,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC;;YAClD,iBAAiB,GAAG,WAAW,CAAC,GAAG,EAAE,GAAG,aAAa,CAAC;IAC7D,CAAC;IACD,IAAI,OAAO,QAAQ,KAAK,WAAW;QAAE,QAAQ,CAAC,gBAAgB,CAAC,kBAAkB,EAAE,kBAAkB,CAAC,CAAC;IAEvG,SAAS,QAAQ;QACf,YAAY,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;QAClC,YAAY,CAAC,OAAO,CAAC,WAAW,EAAE,YAAY,EAAE,WAAW,GAAG,YAAY,CAAC,CAAC;QAC5E,IAAI,SAAS,EAAE,CAAC;YACd,YAAY,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC;YACnC,YAAY,CAAC,WAAW,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;YAC7C,YAAY,CAAC,6BAA6B,CAAC,SAAS,CAAC,0BAA0B,CAAC,CAAC;YACjF,YAAY,CAAC,eAAe,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC;YACrD,YAAY,CAAC,kBAAkB,CAAC,SAAS,CAAC,eAAe,EAAE,SAAS,CAAC,UAAU,CAAC,CAAC;QACnF,CAAC;IACH,CAAC;IAED,OAAO;QACL,wBAAwB,KAAK,eAAe,GAAG,SAAS,CAAC,CAAC,YAAY,GAAG,KAAK,CAAC,CAAC,sBAAsB,GAAG,KAAK,CAAC,CAAC,CAAC;QACjH,qBAAqB,KAAK,CAAC;QAC3B,SAAS,CAAC,QAAuB;YAC/B,IAAG,QAAQ,CAAC,IAAI,EAAE,MAAM,IAAI,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC,QAAQ,CAAC,UAAU,IAAI,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,UAAU,IAAI,EAAE,CAAC,GAAC,CAAC,CAAC;gBAAE,MAAM,IAAI,UAAU,CAAC,uCAAuC,CAAC,CAAC;YAC3K,MAAM,YAAY,GAAG,OAAO,CAAC,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,EAAE,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC;YAC7F,IAAI,YAAY,KAAK,QAAQ,IAAI,SAAS,EAAE,UAAU,KAAK,QAAQ,CAAC,UAAU;gBAAE,GAAG,CAAC,OAAO,GAAG,CAAC,CAAC;YAChG,SAAS,GAAG,EAAE,GAAG,QAAQ,EAAE,IAAI,EAAE,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC;YAC9D,uEAAuE;YACvE,kDAAkD;YAClD,MAAM,YAAY,GAAG,cAAc,CAAC,MAAM,CAAC,CAAC;YAC5C,IAAI,YAAY,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC,YAAY,CAAC;gBAAE,MAAM,GAAG,OAAO,CAAC;YAC7E,IAAG,YAAY,IAAI,CAAC,QAAQ,EAAC,CAAC;gBAAA,GAAG,CAAC,OAAO,EAAE,CAAC;gBAAA,GAAG,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;gBAAA,GAAG,CAAC,KAAK,GAAC,GAAG,CAAC,MAAM,GAAC,CAAC,CAAC;gBAAA,GAAG,CAAC,KAAK,EAAE,CAAC;YAAA,CAAC;YACpG,cAAc,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,QAAQ,CAAC,YAAY,CAAC,CAAC;YACpD,YAAY,GAAG,QAAQ,CAAC,YAAY,CAAC;YACrC,UAAU,CAAC,mBAAmB,CAAC,cAAc,CAAC,CAAC;YAC/C,UAAU,CAAC,WAAW,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;QAC5C,CAAC;QACD,QAAQ;QACR,uBAAuB,CAAC,YAAoB,IAAI,OAAO,gBAAgB,IAAI,YAAY,CAAC,CAAC,CAAC;QAC1F,gBAAgB,KAAK,OAAO,SAAS,CAAC,CAAC,CAAC;QACxC,kBAAkB,KAAI,CAAC;QACvB,IAAI,oBAAoB,KAAK,OAAO,CAAC,CAAC,mBAAmB,CAAC,CAAC,CAAC;QAC5D,IAAI,oBAAoB,KAAK,OAAO,oBAAoB,CAAC,CAAC,CAAC;QAC3D,OAAO;YACL,IAAI,CAAC,mBAAmB;gBAAE,OAAO;YACjC,CAAC;gBAEC,UAAU,CAAC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;YACpE,CAAC;YACD,UAAU,CAAC,UAAU,CAAC,iBAAiB,EAAE,CAAC,CAAC,CAAC;YAC5C,UAAU,CAAC,UAAU,CAAC,EAAE,QAAQ,EAAE,mBAAmB,EAAE,gBAAgB,EAAE,mBAAmB,EAAE,CAAC,CAAC;QAClG,CAAC;QACD,SAAS;YACP,OAAO;gBACL,KAAK,EAAE,WAAW,EAAE,MAAM,EAAE,YAAY;gBACxC,KAAK,EAAE,GAAG,CAAC,KAAK,GAAG,YAAY,CAAC,oBAAoB,CAAC,SAAS,CAAC;sBAC3D,kBAAkB,CAAC,cAAc,EAAE,GAAG,CAAC,mBAAmB,EAAE,cAAc,EAAE,IAAI,CAAC,CAAC,GAAG,CAAC,eAAe,EAAE,cAAc,EAAE,IAAI,CAAC,CAAC;aAClI,CAAC;QACJ,CAAC;QACD,YAAY,EAAE,GAAG,EAAE,CAAC,YAAY;QAChC,cAAc,CAAC,wBAAwB,GAAG,KAAK;YAC7C,GAAG,CAAC,KAAK,EAAE,CAAC;YACZ,UAAU,CAAC,KAAK,EAAE,CAAC;YACnB,YAAY,GAAG,IAAI,CAAC;YACpB,WAAW,GAAG,CAAC,CAAC;YAChB,YAAY,GAAG,KAAK,CAAC;YACrB,sBAAsB,GAAG,KAAK,CAAC;QACjC,CAAC;QACD,gFAAgF;QAChF,cAAc,CAAC,MAAsB;YACnC,IAAI,MAAM,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;gBAC3B,OAAO,OAAO,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,gCAAgC,CAAC,CAAC,CAAC;YACrE,CAAC;YACD,IAAI,YAAY,IAAI,WAAW,GAAG,CAAC;gBAAE,OAAO,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;YACnE,IAAI,MAAM,KAAK,OAAO,IAAI,MAAM,KAAK,QAAQ;gBAAE,OAAO,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;YAC5E,eAAe,GAAG,MAAM,CAAC,QAAQ,CAAC;YAClC,eAAe,CAAC,IAAI,CAAC,CAAC;YACtB,OAAO,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QAC/B,CAAC;QACD,aAAa;YACX,eAAe,GAAG,SAAS,CAAC;QAC9B,CAAC;QACD,yBAAyB,CAAC,QAAiB;YACzC,sBAAsB,GAAG,QAAQ,CAAC;QACpC,CAAC;QACD,KAAK;QACL,eAAe,EAAE,GAAG,EAAE,CAAC,eAAe,CAAC,IAAI,CAAC;QAC5C,OAAO;QACP,oBAAoB,CAAC,MAAyB;YAC5C,MAAM,YAAY,GAAG,MAAM,CAAC,QAAQ,IAAI,CAAC,CAAC;YAC1C,MAAM,mBAAmB,GAAG;gBAC1B,GAAG,EAAE,CAAC;gBACN,IAAI,EAAE,CAAC;gBACP,MAAM,EAAE,CAAC;gBACT,QAAQ,EAAE,CAAC;gBACX,MAAM,EAAE,CAAC;aACV,CAAC,MAAM,CAAC,WAAW,IAAI,KAAK,CAAC,IAAI,CAAC,CAAC;YACpC,MAAM,YAAY,GAAG,MAAM,CAAC,QAAQ,IAAI,CAAC,CAAC;YAC1C,MAAM,cAAc,GAAG,MAAM,CAAC,UAAU,IAAI,CAAC,CAAC;YAC9C,MAAM,eAAe,GAAG,MAAM,CAAC,WAAW,IAAI,CAAC,CAAC;YAChD,MAAM,QAAQ,GAAG,MAAM,CAAC,IAAI,IAAI,CAAC,CAAC;YAClC,MAAM,YAAY,GAAG,MAAM,CAAC,QAAQ,IAAI,CAAC,CAAC;YAC1C,IACE,YAAY,KAAK,QAAQ;gBACzB,mBAAmB,KAAK,eAAe;gBACvC,YAAY,KAAK,QAAQ;gBACzB,cAAc,KAAK,UAAU;gBAC7B,eAAe,KAAK,WAAW;gBAC/B,QAAQ,KAAK,IAAI;gBACjB,YAAY,KAAK,QAAQ;gBACzB,OAAO,KAAK,CAAC;YACf,QAAQ,GAAG,YAAY,CAAC;YACxB,eAAe,GAAG,mBAAmB,CAAC;YACtC,QAAQ,GAAG,YAAY,CAAC;YACxB,UAAU,GAAG,cAAc,CAAC;YAC5B,WAAW,GAAG,eAAe,CAAC;YAC9B,IAAI,GAAG,QAAQ,CAAC;YAChB,QAAQ,GAAG,YAAY,CAAC;YACxB,WAAW,CAAC,WAAW,CAAC;gBACtB,QAAQ;gBACR,eAAe;gBACf,QAAQ;gBACR,UAAU;gBACV,WAAW;gBACX,IAAI;gBACJ,QAAQ;aACT,CAAC,CAAC;YACH,OAAO,IAAI,CAAC;QACd,CAAC;QACD,uBAAuB,CAAC,OAAO;YAC7B,sBAAsB,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC,CAAC;YAC1E,gBAAgB,GAAG,OAAO,CAAC,gBAAgB,CAAC;YAC5C,oBAAoB,GAAG,IAAI,CAAC,GAAG,CAC7B,CAAC,EACD,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,oBAAoB,CAAC,CACzC,CAAC;QACJ,CAAC;QACD,kBAAkB,CAAC,QAAiB,IAAI,CAAC;QACzC,0BAA0B,CAAC,QAAQ,IAAI,CAAC;QACxC,KAAK,CAAC,8BAA8B,CAAC,QAAQ;YAC3C,OAAO,SAAS,CAAC;QACnB,CAAC;QACD,uBAAuB,EAAE,GAAG,EAAE,CAAC,WAAW;QAC1C,gBAAgB;QAChB,cAAc;YACZ,OAAO;gBACL,MAAM,CAAC,KAAgB,IAAI,YAAY,GAAG,KAAK,CAAC,CAAC,CAAC;gBAClD,IAAI,CAAC,KAAgC;oBACnC,OAAO,CAAC,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC;oBACnC,YAAY,GAAG,KAAK,CAAC;oBAAC,eAAe,GAAG,SAAS,CAAC;oBAClD,MAAM,OAAO,GAAG,CAAC,IAAkB,EAAE,EAAE;wBACrC,MAAM,CAAC,GAAG,IAAI,SAAS,CAAC,EAAC,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,CAAC,MAAM;4BAC/D,MAAM,EAAE,EAAC,IAAI,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,CAAC,MAAM,EAAC,EAAE,IAAI,EAAE,SAAS,CAAC,KAAK;4BAC/E,SAAS,EAAE,SAAS,CAAC,OAAO,EAAE,SAAS,EAAE,SAAS,CAAC,OAAO,EAAC,CAAC,CAAC;wBAC/D,OAAO,CAAC,CAAC;oBACX,CAAC,CAAC;oBACF,MAAM,MAAM,GAAG,YAAY,CAAC,IAAI,CAAC,EAAC,MAAM,EAAE,KAAK,CAAC,KAAK,GAAG,KAAK,CAAC,MAAM,GAAG,CAAC,EAAC,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAClF,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;oBACxG,MAAM,UAAU,GAAG,YAAY,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;oBACxG,MAAM,MAAM,GAAG,EAAC,KAAK,EAAE,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC;wBACvG,OAAO,EAAE,OAAO,CAAC,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;wBAC7F,aAAa,EAAE,OAAO,CAAC,MAAM,CAAC,EAAE,iBAAiB,EAAE,OAAO,CAAC,UAAU,CAAC,EAAE,cAAc,EAAE,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,EAAC,CAAC;oBAClH,YAAY,CAAC,2BAA2B,CAAC,MAAM,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC;oBAChE,WAAW,GAAG,eAAe,GAAG,KAAK,CAAC,OAAO,CAAC;oBAC9C,wBAAwB,GAAG,KAAK,CAAC,OAAO,CAAC;oBAAC,YAAY,GAAG,KAAK,CAAC;oBAC/D,kBAAkB,CAAC,OAAO,CAAC,WAAW,EAAE,YAAY,CAAC,CAAC;oBACtD,kBAAkB,CAAC,cAAc,CAAC,WAAW,CAAC,CAAC;oBAC/C,kBAAkB,CAAC,UAAU,CAAC,YAAY,CAAC,CAAC;gBAC9C,CAAC;aACF,CAAC;QACJ,CAAC;QACD,cAAc,EAAE,GAAG,EAAE,CAAC,CAAC,EAAE,GAAG,YAAY,CAAC,cAAc,EAAE,EAAE,iBAAiB,EAAE,QAAQ,CAAC,+BAA+B,EAAE,EAAE,CAAC;QAC3H,gBAAgB,EAAE,KAAK,IAAI,EAAE,GAAG,CAAC;QACjC,sBAAsB,CAAC,KAAe,EAAE,KAAa;YACnD,MAAM,OAAO,GACX,KAAK,CAAC,CAAC,CAAC,KAAK,kBAAkB,CAAC,CAAC,CAAC;gBAClC,KAAK,CAAC,CAAC,CAAC,KAAK,kBAAkB,CAAC,CAAC,CAAC;gBAClC,KAAK,CAAC,CAAC,CAAC,KAAK,kBAAkB,CAAC,CAAC,CAAC;gBAClC,KAAK,KAAK,kBAAkB,CAAC;YAC/B,IAAI,OAAO,EAAE,CAAC;gBACZ,IAAI,CAAC,IAAI,CAAC,kBAAkB,EAAE,KAAK,CAAC,CAAC;gBACrC,kBAAkB,GAAG,KAAK,CAAC;gBAC3B,WAAW,CAAC,UAAU,CAAC,oBAAoB,EAAE,KAAK,CAAC,CAAC;gBACpD,WAAW,CAAC,UAAU,CAAC,oBAAoB,EAAE,KAAK,CAAC,CAAC;YACtD,CAAC;YACD,OAAO,OAAO,CAAC;QACjB,CAAC;QACD,cAAc,CAAC,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,EAAE;YAC7C,MAAM,OAAO,GACX,SAAS,KAAK,cAAc;gBAC5B,SAAS,KAAK,cAAc;gBAC5B,MAAM,KAAK,WAAW,CAAC;YACzB,cAAc,GAAG,SAAS,CAAC;YAC3B,cAAc,GAAG,SAAS,CAAC;YAC3B,WAAW,GAAG,MAAM,CAAC;YACrB,OAAO,OAAO,CAAC;QACjB,CAAC;QACD,mBAAmB,CAAC,EAAE;YACpB,sBAAsB,GAAG,EAAE,CAAC;QAC9B,CAAC;QAED,oBAAoB,CAAC,OAA0B,IAAI,iBAAiB,GAAC,EAAC,GAAG,OAAO,EAAC,UAAU,EAAC,CAAC,GAAG,OAAO,CAAC,UAAU,CAAC,EAAC,CAAC,CAAC,CAAC;QACvH,SAAS,CAAC,UAA0B;YAClC,IAAI,MAAM,KAAK,UAAU;gBAAE,OAAO,KAAK,CAAC;YACxC,MAAM,GAAG,UAAU,CAAC;YACpB,OAAO,IAAI,CAAC;QACd,CAAC;QACD,KAAK,CAAC,gBAAgB;YACpB,IAAI,CAAC,mBAAmB;gBAAE,MAAM,IAAI,KAAK,CAAC,+BAA+B,CAAC,CAAC;YAC3E,kBAAkB,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC,mBAAmB,CAAC,CAAC,CAAC;YACzD,MAAM,KAAK,GAAG,mBAAmB,CAAC,KAAK,EAAE,MAAM,GAAG,mBAAmB,CAAC,MAAM,CAAC;YAC7E,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,cAAc,CAAC,QAAQ,CAAC,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,mBAAmB,CAAC,aAAa,CAAC,EAAE,CAAC;QAChH,CAAC;QACD,QAAQ,CAAC,IAAI,IAAI,OAAO,CAAC,CAAC,SAAS,EAAE,IAAI,EAAE,QAAQ,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC,OAAO,GAAG,CAAC,CAAC,CAAC,CAAC;QAC/E,aAAa,KAAK,OAAO,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC;QACvC,WAAW,KAAK,GAAG,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;QAC9B,UAAU,CAAC,MAAM,EAAE,OAAO,GAAG,WAAW;YACtC,IAAI,OAAO,GAAG,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,EAAE,MAAM;gBAAE,OAAO,IAAI,CAAC;YACzD,YAAY,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;YAAC,SAAS,GAAG,MAAM,CAAC;YACnD,OAAO,YAAY,CAAC,UAAU,CAAC,GAAG,EAAC,MAAM,EAAC,WAAW,EAAC,YAAY,EAAC,OAAO,EAAC,SAAS,CAAC,UAAU,IAAI,EAAE,EAAC,SAAS,CAAC,IAAI,EAAC,oBAAoB,CAAC,CAAC;QAC7I,CAAC;QACD,KAAK,CAAC,OAAO,CAAC,IAAI;YAChB,IAAG,CAAC,SAAS,EAAE,IAAI,EAAE,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,IAAI,CAAC,WAAW,GAAC,CAAC,IAAI,GAAG,CAAC,OAAO,GAAC,CAAC,CAAC;gBAAE,MAAM,IAAI,KAAK,CAAC,yBAAyB,CAAC,CAAC;YAClI,YAAY,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;YAClC,OAAO,CAAC,YAAY,CAAC,UAAU,CAAC,GAAG,EAAC,SAAS,EAAC,WAAW,EAAC,YAAY,EAAC,IAAI,CAAC,GAAG,CAAC,WAAW,EAAC,GAAG,CAAC,OAAO,CAAC,EAAC,SAAS,CAAC,UAAU,IAAI,EAAE,EAAC,SAAS,CAAC,IAAI,EAAC,oBAAoB,CAAC,EAAE,CAAC;gBACzK,IAAI,QAAQ,IAAI,QAAQ,CAAC,EAAE,CAAC,aAAa,EAAE;oBAAE,MAAM,IAAI,KAAK,CAAC,iCAAiC,CAAC,CAAC;gBAChG,MAAM,IAAI,OAAO,CAAO,OAAO,CAAC,EAAE,CAAC,aAAa,CAAC,GAAG,EAAE,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;YACrE,CAAC;YACD,OAAO,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACxB,CAAC;QACD,KAAK,CAAC,UAAU,CAAC,IAAI;YACnB,IAAI,IAAI,KAAK,UAAU,IAAI,CAAC,CAAC,eAAe,IAAI,CAAC,YAAY,CAAC;gBAAE,IAAI,GAAG,KAAK,CAAC;YAC7E,MAAM,OAAO,GAAG,IAAI,KAAK,UAAU,CAAC,CAAC,CAAC,eAAgB,CAAC,CAAC,CAAC,kBAAkB,CAAC,SAAS,CAAC,IAAI,KAAK,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;YACvH,kBAAkB,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC;YAC7C,OAAO,EAAE,IAAI,EAAE,cAAc,CAAC,QAAQ,CAAC,EAAE,EAAE,WAAW,EAAE,YAAY,EAAE,IAAI,KAAK,QAAQ,IAAI,IAAI,KAAK,QAAQ,CAAC,EAAE,KAAK,EAAE,WAAW,EAAE,MAAM,EAAE,YAAY,EAAE,CAAC;QAC5J,CAAC;QACD,OAAO;YACL,IAAI,QAAQ;gBAAE,OAAO;YAAC,QAAQ,GAAG,IAAI,CAAC;YACtC,IAAI,OAAO,QAAQ,KAAK,WAAW;gBAAE,QAAQ,CAAC,mBAAmB,CAAC,kBAAkB,EAAE,kBAAkB,CAAC,CAAC;YAE1G,GAAG,CAAC,OAAO,EAAE,CAAC;YACd,YAAY,CAAC,aAAa,CAAC,SAAS,CAAC,CAAC;YACtC,kBAAkB,CAAC,OAAO,EAAE,CAAC;YAC7B,mBAAmB,EAAE,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;YAC1C,eAAe,EAAE,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;QACxC,CAAC;KAC6C,CAAC;AACnD,CAAC;AAED,0EAA0E;AAC1E,MAAM,UAAU,sBAAsB,CAAC,QAAqB;IAC1D,MAAM,YAAY,GAAG,IAAI,iBAAiB,CAAC,QAAQ,CAAC,CAAC;IACrD,MAAM,OAAO,GAAG,IAAI,WAAW,EAAE,CAAC;IAClC,OAAO,kBAAkB,CAAC,YAAY,EAAE,GAAG,EAAE,CAAC,2BAA2B,CAAC,QAAQ,EAAE,YAAY,EAAE,OAAO,CAAC,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC;AAC7H,CAAC","sourcesContent":["import type {DisplayParityAccumulation, DisplayParityTarget} from './displayParityDiagnostics.js';\nimport {displayAovKind, DEFAULT_AOV_DISPLAY, type AovDisplayOptions} from './aovDisplay.js';\nimport {WebGLAov} from './WebGLAov.js';\nimport {aovMask} from './aov.js';\nimport {scheduleFrame} from '../util/frame.js';\nimport type {DenoiserHandle} from './denoiser.js';\nimport { WebGLScratchCopy } from './WebGLScratchCopy.js';\nimport { ScratchPool } from './ScratchPool.js';\nimport { makeRenderPipeline, type TraceSettings, type RenderPipeline } from './renderPipeline.js';\nimport type { TargetPipeline } from './accumulationTarget.js';\nimport { readRgbaPixels } from './WebGLReadback.js';\n// Portions adapted from ray-tracing-renderer@0.10.15\n// (https://github.com/hoverinc/ray-tracing-renderer).\n// Copyright (c) 2019 HOVER, MIT license; see LICENSES/RayTracingRenderer-MIT.txt.\n\nimport Camera from '../scene/Camera.js';\nimport type { ColorRGB } from '../types.js';\nimport { vec3 } from '../math.js';\nimport halton from './halton.js';\nimport { makeTileRender } from './TileRender.js';\nimport type {\n DisplayChannel,\n ToneMappingParams\n} from './RenderingPipeline.js';\nimport { constants, WebGLDevice, Texture2D } from './webgl.js';\nimport { WebGLFullQuadPass } from './WebGLFullQuadPass.js';\nimport WebGLRayTracePass from './WebGLRayTracePass.js';\nimport { WebGLRayTraceOutputPass } from './WebGLRayTraceOutputPass.js';\nimport WebGLBloomPass from './WebGLBloomPass.js';\nimport {\n composeFragment,\n outputFragment\n} from './glsl/webglPipeline.frag.js';\nimport { type JNLMDenoiser } from './jnlm.js';\nimport { WebGLJNLMDenoisePass } from './WebGLJNLMDenoiser.js';\n\nconst wavelengths = [650, 510, 475];\n\n/**\n * WebGL 2.0 counterpart of WGPURenderingPipeline.\n *\n * The frame is encoded as a fixed pass sequence. Each pass owns explicit\n * textures/FBOs, so no compositor graph or node lifecycle participates here.\n */\nfunction makeWebGLAccumulationTarget(renderer: WebGLDevice, rayTracePass: WebGLRayTracePass, scratch: ScratchPool) {\n let sampleRenderedCallback = (\n _sampleCount: number,\n _isFirstFrame: boolean,\n _frameTime: number\n ) => { };\n let batchSamples = false;\n let offlineSamplesPerBatch = 0;\n let deferPostProcess = false;\n let sampleSequenceOffset = 0;\n const aov=new WebGLAov(renderer);\n let aovCamera: Camera | undefined;\n let displayTrace: string[] | undefined;\n let sampleCount = 0;\n let elapsedFrameTime = 32;\n let elapsedTileTime: number | undefined;\n let tileTimingGeneration = 0;\n let isFirstFrame = true;\n let renderFailed = false;\n let disposed = false;\n let renderWidth = 1;\n let renderHeight = 1;\n let screenWidth = 1;\n let screenHeight = 1;\n\n const targetKey = {};\n let execution: TraceSettings | undefined;\n\n let resolvedSamples = 0;\n let resolvedHasShadowCatcher = false;\n let presentationTexture: Texture2D | undefined;\n let presentationDenoised = false;\n\n let maxTimePerTile = 21;\n\n let bloomIntensity = 0;\n let bloomThreshold = 1;\n let bloomRadius = 0.6;\n let exposure = 1;\n let toneMappingMode = 0;\n let contrast = 1;\n let saturation = 1;\n let temperature = 0;\n let tint = 0;\n let vignette = 0;\n let output: DisplayChannel = 'final';\n let aovDisplayOptions: AovDisplayOptions = DEFAULT_AOV_DISPLAY;\n let pageLeaveTime = performance.now();\n let pageInvisibleTime = 0;\n const shadowCatcherColor = vec3.create();\n let shadowCatcherAlpha = 1;\n\n // Preview frames have a different resolution, bounce limit, and timing\n // target. Keep their measurements out of the full-resolution estimator so\n // returning from preview does not split a 4K sample into hundreds of tiles.\n const tileRender = makeTileRender(renderer.gl);\n tileRender.setDesiredMsPerTile(maxTimePerTile);\n\n const rayTraceOutputPass = new WebGLRayTraceOutputPass(renderer);\n let bloomPass: WebGLBloomPass | undefined;\n\n const composePass = scratch.get('composePass', () => new WebGLFullQuadPass<\n 'colorTex' | 'foregroundTex' | 'catcherBackgroundTex' | 'shadowCatcherTex' | 'bloomTex',\n 'color'\n >('compose', renderer, {\n shader: composeFragment,\n outputs: ['color'],\n outputParams: { color: { type: constants.UNSIGNED_BYTE } }\n }));\n composePass.setUniforms({\n exposure,\n shadowCatcherColor,\n shadowCatcherAlpha,\n shadowCatcherEnabled: 0,\n bloomIntensity: 0,\n toneMappingMode,\n contrast,\n saturation,\n temperature,\n tint,\n vignette,\n outputMode: 0,\n sRGBOutput: 1\n });\n\n const outputPass = scratch.get('outputPass', () => new WebGLFullQuadPass<\n 'colorTex' | 'colorDenoisedTex',\n 'color'\n >('output', renderer, { shader: outputFragment, outputs: ['color'] }));\n outputPass.setRenderToScreen();\n const copy = scratch.get('image copy', () => new WebGLScratchCopy(renderer));\n const rawReadFrameBuffer = copy.readFrameBuffer;\n\n // Built-in JNLM denoising. WebGL runs it synchronously inside the\n // post-process, between composition and output.\n let jnlmPass: WebGLJNLMDenoisePass | undefined;\n let pendingDenoiser: JNLMDenoiser | undefined;\n let denoisedTexture: Texture2D | undefined;\n let denoiseValid = false;\n // Keep the last denoised image visible while while-converging batches\n // accumulate (see RenderingPipeline.setPreserveDenoisedOutput).\n let preserveDenoisedOutput = false;\n\n function updateSeed(useJitter: boolean) {\n const sequenceSample = sampleCount + sampleSequenceOffset;\n const jitterX = useJitter ? halton(sequenceSample, 2) - 0.5 : 0;\n const jitterY = useJitter ? halton(sequenceSample, 3) - 0.5 : 0;\n rayTracePass.setJitter(jitterX / renderWidth, jitterY / renderHeight);\n }\n\n function traceSample(\n clear: boolean,\n tile: { x: number; y: number; width: number; height: number }\n ) {\n rayTracePass.setSampleCount(sampleCount + sampleSequenceOffset);\n rayTracePass.setSampleSequenceOffset(sampleSequenceOffset);\n updateSeed(true);\n if (rayTracePass.hasDispersion()) {\n if (execution?.dispersionWavelengths === 1) {\n // A positive wavelength enables stochastic hero-wavelength sampling\n // in the shader. Preview traces one random RGB channel per pixel.\n rayTracePass.setWavelength(wavelengths[0]);\n rayTracePass.createPass(clear, tile);\n } else {\n wavelengths.forEach((wavelength, index) => {\n rayTracePass.setWavelength(wavelength);\n rayTracePass.createPass(clear && index === 0, tile, index > 0);\n });\n }\n } else {\n rayTracePass.setWavelength(0);\n rayTracePass.createPass(clear, tile);\n }\n }\n\n function drawPostProcess(_forceNeedsDenoise = false, resolve = false) {\n if (resolve) { resolvedSamples = sampleCount; resolvedHasShadowCatcher = rayTracePass.hasShadowCatcher(); }\n const aovKind = displayAovKind(output);\n if (aovKind && sampleCount === 0) {\n if (!execution?.aovs?.includes(aovKind)) throw new Error(`AOV ${aovKind} is not enabled`);\n if (!aov.samples) return;\n presentationTexture = copy.copy(aov.visualize(aovKind,aovDisplayOptions), renderWidth, renderHeight, presentationTexture);\n presentationDenoised = false;\n return;\n }\n if (resolvedSamples === 0) return;\n if (resolve) {\n rayTraceOutputPass.setSampleCount(sampleCount);\n rayTraceOutputPass.createPass(rayTracePass);\n }\n\n composePass.setSize(renderWidth, renderHeight);\n composePass.setUniforms({ exposure, toneMappingMode, contrast, saturation, temperature, tint, vignette, shadowCatcherColor, shadowCatcherAlpha });\n const colorTexture = rayTraceOutputPass.getOutput('color');\n const bloomEnabled = bloomIntensity > 0;\n const samplesSkipped = sampleCount < 10 || sampleCount % 10 > 0;\n const bloomState = scratch.get('bloom state', () => ({ owner: undefined as object | undefined, settings: '', dispose() { } }));\n const bloomSettings = `${bloomThreshold}/${bloomRadius}`;\n const needsUpdateBloom = bloomEnabled && sampleCount >= 10 && (!samplesSkipped || bloomState.owner !== targetKey || bloomState.settings !== bloomSettings);\n let currentBloomIntensity = bloomIntensity;\n if (needsUpdateBloom) {\n bloomPass ||= scratch.get('bloom', () => new WebGLBloomPass(renderer));\n bloomPass.setSize(renderWidth, renderHeight);\n bloomState.owner = targetKey; bloomState.settings = bloomSettings;\n bloomPass.setBrightThreshold(bloomThreshold);\n bloomPass.setRadius(bloomRadius);\n displayTrace?.push('Bloom:SceneLinear');\n bloomPass.createPass(colorTexture);\n } else if (bloomEnabled && sampleCount < 10) {\n currentBloomIntensity = 0;\n }\n\n composePass.setUniforms({\n bloomIntensity: currentBloomIntensity,\n shadowCatcherEnabled: +resolvedHasShadowCatcher,\n outputMode: output === 'shadow' ? 1 : 0\n });\n displayTrace?.push('Compose:DisplayEncoded');\n composePass.createPass({\n colorTex: colorTexture,\n foregroundTex: rayTraceOutputPass.getOutput('foreground'),\n catcherBackgroundTex: rayTraceOutputPass.getOutput('catcherBackground'),\n shadowCatcherTex: rayTraceOutputPass.getOutput('shadowCatcher'),\n bloomTex:\n bloomEnabled && bloomPass\n ? bloomPass.getOutput()\n : renderer.emptyTexture\n });\n\n if (pendingDenoiser) {\n jnlmPass ??= scratch.get('jnlm', () => new WebGLJNLMDenoisePass(renderer));\n const filtered = jnlmPass.render({\n width: renderWidth,\n height: renderHeight,\n moments: rayTracePass.getOutput('moments'),\n catcherMoments: rayTracePass.hasShadowCatcher()\n ? rayTracePass.getOutput('catcherMoments')\n : undefined,\n color: composePass.getOutput('color'),\n albedo: rayTraceOutputPass.getOutput('albedo'),\n normal: rayTraceOutputPass.getOutput('normal'),\n shadowCatcher: rayTraceOutputPass.getOutput('shadowCatcher'),\n strength: pendingDenoiser.strength,\n shape: pendingDenoiser.shape\n }, displayTrace);\n denoisedTexture = copy.copy(filtered, renderWidth, renderHeight, denoisedTexture); denoiseValid = true;\n pendingDenoiser = undefined;\n }\n\n let displayTexture =\n (output === 'final' && denoiseValid && denoisedTexture) || composePass.getOutput('color');\n if (aovKind) {\n if (!execution?.aovs?.includes(aovKind)) throw new Error(`AOV ${aovKind} is not enabled`);\n displayTexture = aov.visualize(aovKind,aovDisplayOptions);\n } else if (output === 'normal' || output === 'albedo') {\n displayTrace?.push('AOV:Raw');\n displayTexture = rayTraceOutputPass.getOutput(output);\n } else if (output === 'shadowCatcher') {\n displayTrace?.push('AOV:Raw');\n displayTexture = rayTraceOutputPass.getOutput('shadowCatcher');\n }\n presentationTexture = copy.copy(displayTexture, renderWidth, renderHeight, presentationTexture);\n presentationDenoised = output === 'final' && denoiseValid && !!denoisedTexture;\n\n }\n\n function startRecordFrameTime(collectTileTiming: boolean) {\n const start = performance.now();\n const generation = tileTimingGeneration;\n const timedTileRender = tileRender;\n scheduleFrame(() => {\n elapsedFrameTime = Math.max(\n performance.now() - start - pageInvisibleTime,\n pageInvisibleTime > 0 ? 16 : 8\n );\n pageInvisibleTime = 0;\n if (\n generation === tileTimingGeneration &&\n timedTileRender === tileRender && !isFirstFrame\n ) {\n elapsedTileTime = collectTileTiming && renderer.isAllProgramCompiled()\n ? elapsedFrameTime : undefined;\n }\n });\n }\n\n function trace(camera: Camera, maxSamples: number) {\n if (rayTracePass.isInvalid() || renderFailed) return false;\n if (!renderer.isAllProgramCompiled()) {\n isFirstFrame = true;\n sampleCount = 0;\n tileRender.reset();\n return true;\n }\n\n rayTracePass.setCamera(camera);\n aovCamera=camera;\n if (!rayTracePass.preparePrograms()) return true;\n const resetAccumulation = isFirstFrame;\n if(resetAccumulation) aov.reset();\n if (execution?.aovs?.length && !rayTracePass.prepareAovs(aov,camera,renderWidth,renderHeight,execution.aovs)) return true;\n if (resetAccumulation) {\n tileTimingGeneration++;\n elapsedTileTime = undefined;\n rayTracePass.setCamera(camera);\n tileRender.reset();\n sampleCount = 0;\n isFirstFrame = false;\n }\n if (sampleCount >= maxSamples) {\n drawPostProcess(true);\n return false;\n }\n // New samples make the denoised image stale.\n if (!preserveDenoisedOutput || resetAccumulation) denoiseValid = false;\n\n // The first draw after an update lazily prepares scene data and shaders.\n // Keep its wall time for reporting, but not for estimating tile throughput.\n startRecordFrameTime(!resetAccumulation);\n const frameSampleCount = sampleCount;\n let tile = tileRender.nextTile(elapsedTileTime);\n if (offlineSamplesPerBatch > 0 && tile.isFirstTile && tile.isLastTile) {\n tile.samplesPerFrame = offlineSamplesPerBatch;\n } else if (\n !batchSamples ||\n !(tile.isFirstTile && tile.isLastTile)\n ) {\n tile.samplesPerFrame = 1;\n }\n\n try {\n for (let i = 0;i < tile.samplesPerFrame && sampleCount < maxSamples;i++) {\n traceSample(sampleCount === 0 && tile.isFirstTile, {\n x: tile.x,\n y: tile.y,\n width: tile.tileWidth,\n height: tile.tileHeight\n });\n if (tile.isLastTile) sampleCount++;\n }\n if(sampleCount!==frameSampleCount){\n if(execution?.aovs?.length) rayTracePass.renderAovs(aov,camera,renderWidth,renderHeight,Math.max(sampleCount,aov.samples),execution.aovSamples ?? 16,execution.aovs,sampleSequenceOffset);\n }\n if (sampleCount !== frameSampleCount && (!deferPostProcess || sampleCount >= maxSamples)) {\n drawPostProcess(sampleCount >= maxSamples, true);\n }\n } catch (error) {\n console.error(error);\n renderFailed = true;\n return false;\n }\n\n if (sampleCount !== frameSampleCount) {\n sampleRenderedCallback(\n sampleCount,\n frameSampleCount === 0,\n elapsedFrameTime\n );\n\n }\n return !renderer.isAllProgramCompiled();\n }\n\n function applyRenderResolution() {\n rayTracePass.useTarget(targetKey);\n const scale = 1;\n const nextWidth = Math.max(1, Math.round(screenWidth * scale));\n const nextHeight = Math.max(1, Math.round(screenHeight * scale));\n rayTracePass.setSize(nextWidth, nextHeight, screenWidth / screenHeight);\n if (nextWidth === renderWidth && nextHeight === renderHeight) return;\n renderWidth = nextWidth;\n renderHeight = nextHeight;\n tileRender.setSize(renderWidth, renderHeight);\n rayTraceOutputPass.setSize(renderWidth, renderHeight);\n composePass.setSize(renderWidth, renderHeight);\n bloomPass?.setSize(renderWidth, renderHeight);\n sampleCount = 0;\n resolvedSamples = 0;\n isFirstFrame = true;\n\n }\n\n function setSize(width: number, height: number) {\n width = Math.max(1, width);\n height = Math.max(1, height);\n if (width === screenWidth && height === screenHeight) return;\n screenWidth = width;\n screenHeight = height;\n\n outputPass.setSize(screenWidth, screenHeight);\n applyRenderResolution();\n sampleCount = 0;\n isFirstFrame = true;\n }\n\n function onVisibilityChange() {\n if (document.hidden) pageLeaveTime = performance.now();\n else pageInvisibleTime = performance.now() - pageLeaveTime;\n }\n if (typeof document !== 'undefined') document.addEventListener('visibilitychange', onVisibilityChange);\n\n function activate() {\n rayTracePass.useTarget(targetKey);\n rayTracePass.setSize(renderWidth, renderHeight, screenWidth / screenHeight);\n if (execution) {\n rayTracePass.setQuality(execution);\n rayTracePass.setClamping(execution.clamping);\n rayTracePass.setTransmissiveOutputAlphaMin(execution.transmissiveOutputAlphaMin);\n rayTracePass.setBevelSamples(execution.bevelSamples);\n rayTracePass.setSamplingPattern(execution.samplingPattern, execution.maxSamples);\n }\n }\n\n return {\n invalidateDenoisedOutput() { pendingDenoiser = undefined; denoiseValid = false; preserveDenoisedOutput = false; },\n synchronizeBackground() { },\n configure(settings: TraceSettings) {\n if(settings.aovs?.length && (!Number.isInteger(settings.aovSamples ?? 16) || (settings.aovSamples ?? 16)<1)) throw new RangeError('aovSamples must be a positive integer');\n const previousMask = aovMask(execution?.aovs ?? []), nextMask = aovMask(settings.aovs ?? []);\n if (previousMask !== nextMask || execution?.aovSamples !== settings.aovSamples) aov.samples = 0;\n execution = { ...settings, aovs: [...(settings.aovs ?? [])] };\n // A reduced preview set can retire the previously displayed AOV before\n // Display applies its next channel after tracing.\n const displayedAov = displayAovKind(output);\n if (displayedAov && !settings.aovs?.includes(displayedAov)) output = 'final';\n if(previousMask && !nextMask){aov.dispose();aov.history.clear();aov.width=aov.height=0;aov.reset();}\n maxTimePerTile = Math.max(1, settings.timeBudgetMs);\n batchSamples = settings.batchSamples;\n tileRender.setDesiredMsPerTile(maxTimePerTile);\n tileRender.setMaxTiles(settings.maxTiles);\n },\n activate,\n canCompleteSampleWithin(timeBudgetMs: number) { return elapsedFrameTime <= timeBudgetMs; },\n getOutputTexture() { return undefined; },\n applyPostProcesses() {},\n get presentationComplete() { return !!presentationTexture; },\n get presentationDenoised() { return presentationDenoised; },\n present() {\n if (!presentationTexture) return;\n {\n\n outputPass.setSize(renderer.canvas.width, renderer.canvas.height);\n }\n outputPass.setUniform('denoisedPercent', 0);\n outputPass.createPass({ colorTex: presentationTexture, colorDenoisedTex: presentationTexture });\n },\n getMemory() {\n return {\n width: renderWidth, height: renderHeight,\n bytes: aov.bytes + rayTracePass.getTargetMemoryBytes(targetKey)\n + rayTraceOutputPass.getMemoryBytes() + (presentationTexture?.getMemoryBytes() ?? 0) + (denoisedTexture?.getMemoryBytes() ?? 0)\n };\n },\n isFirstFrame: () => isFirstFrame,\n restartSamples(_preserveTemporalHistory = false) {\n aov.reset();\n tileRender.reset();\n isFirstFrame = true;\n sampleCount = 0;\n denoiseValid = false;\n preserveDenoisedOutput = false;\n },\n /** Denoises the current image. WebGL only supports the built-in JNLM filter. */\n performDenoise(filter: DenoiserHandle): Promise<boolean> {\n if (filter.kind !== 'jnlm') {\n return Promise.reject(new Error('This denoiser requires WebGPU.'));\n }\n if (isFirstFrame || sampleCount < 1) return Promise.resolve(false);\n if (output !== 'final' && output !== 'shadow') return Promise.resolve(true);\n pendingDenoiser = filter.denoiser;\n drawPostProcess(true);\n return Promise.resolve(true);\n },\n cancelDenoise() {\n pendingDenoiser = undefined;\n },\n setPreserveDenoisedOutput(preserve: boolean) {\n preserveDenoisedOutput = preserve;\n },\n trace,\n drawPostProcess: () => drawPostProcess(true),\n setSize,\n setToneMappingParams(params: ToneMappingParams) {\n const nextExposure = params.exposure ?? 1;\n const nextToneMappingMode = {\n agx: 0,\n aces: 1,\n cineon: 2,\n reinhard: 3,\n linear: 4\n }[params.toneMapping ?? 'agx'] ?? 0;\n const nextContrast = params.contrast ?? 1;\n const nextSaturation = params.saturation ?? 1;\n const nextTemperature = params.temperature ?? 0;\n const nextTint = params.tint ?? 0;\n const nextVignette = params.vignette ?? 0;\n if (\n nextExposure === exposure &&\n nextToneMappingMode === toneMappingMode &&\n nextContrast === contrast &&\n nextSaturation === saturation &&\n nextTemperature === temperature &&\n nextTint === tint &&\n nextVignette === vignette\n ) return false;\n exposure = nextExposure;\n toneMappingMode = nextToneMappingMode;\n contrast = nextContrast;\n saturation = nextSaturation;\n temperature = nextTemperature;\n tint = nextTint;\n vignette = nextVignette;\n composePass.setUniforms({\n exposure,\n toneMappingMode,\n contrast,\n saturation,\n temperature,\n tint,\n vignette\n });\n return true;\n },\n setOfflineRenderOptions(options) {\n offlineSamplesPerBatch = Math.max(0, Math.round(options.samplesPerBatch));\n deferPostProcess = options.deferPostProcess;\n sampleSequenceOffset = Math.max(\n 0,\n Math.round(options.sampleSequenceOffset)\n );\n },\n setVarianceMoments(_enabled: boolean) { },\n setAdaptiveSamplingTargets(_targets) { },\n async prepareOfflineAdaptiveSampling(_options) {\n return undefined;\n },\n getTotalSamplesRendered: () => sampleCount,\n /** @internal */\n _displayParity() {\n return {\n record(trace?: string[]) { displayTrace = trace; },\n load(input: DisplayParityAccumulation) {\n setSize(input.width, input.height);\n denoiseValid = false; pendingDenoiser = undefined;\n const texture = (data: Float32Array) => {\n const t = new Texture2D({width: input.width, height: input.height,\n source: {data, width: input.width, height: input.height}, type: constants.FLOAT,\n minFilter: constants.NEAREST, magFilter: constants.NEAREST});\n return t;\n };\n const shadow = Float32Array.from({length: input.width * input.height * 4}, (_, i) =>\n i % 4 === 3 ? input.moments[Math.floor(i / 4) * 4 + 2] : input.shadow[Math.floor(i / 4) * 8 + i % 4]);\n const background = Float32Array.from(shadow, (_, i) => input.shadow[Math.floor(i / 4) * 8 + 4 + i % 4]);\n const inputs = {color: texture(input.color), albedo: texture(input.albedo), normal: texture(input.normal),\n moments: texture(Float32Array.from(input.moments, (v, i) => i % 4 === 2 ? input.samples : v)),\n shadowCatcher: texture(shadow), catcherBackground: texture(background), catcherMoments: texture(input.moments)};\n rayTracePass._loadDiagnosticAccumulation(inputs, input.catcher);\n sampleCount = resolvedSamples = input.samples;\n resolvedHasShadowCatcher = input.catcher; isFirstFrame = false;\n rayTraceOutputPass.setSize(renderWidth, renderHeight);\n rayTraceOutputPass.setSampleCount(sampleCount);\n rayTraceOutputPass.createPass(rayTracePass);\n }\n };\n },\n getDiagnostics: () => ({ ...rayTracePass.getDiagnostics(), shaderCompilation: renderer.getShaderCompilationDiagnostics() }),\n flushDiagnostics: async () => { },\n setShadowCatcherParams(color: ColorRGB, alpha: number) {\n const changed =\n color[0] !== shadowCatcherColor[0] ||\n color[1] !== shadowCatcherColor[1] ||\n color[2] !== shadowCatcherColor[2] ||\n alpha !== shadowCatcherAlpha;\n if (changed) {\n vec3.copy(shadowCatcherColor, color);\n shadowCatcherAlpha = alpha;\n composePass.setUniform('shadowCatcherColor', color);\n composePass.setUniform('shadowCatcherAlpha', alpha);\n }\n return changed;\n },\n setBloomParams({ intensity, threshold, radius }) {\n const changed =\n intensity !== bloomIntensity ||\n threshold !== bloomThreshold ||\n radius !== bloomRadius;\n bloomIntensity = intensity;\n bloomThreshold = threshold;\n bloomRadius = radius;\n return changed;\n },\n setOnSampleRendered(cb) {\n sampleRenderedCallback = cb;\n },\n\n setAovDisplayOptions(options: AovDisplayOptions) { aovDisplayOptions={...options,depthRange:[...options.depthRange]}; },\n setOutput(nextOutput: DisplayChannel) {\n if (output === nextOutput) return false;\n output = nextOutput;\n return true;\n },\n async readPresentation() {\n if (!presentationTexture) throw new Error('Render has no complete image.');\n rawReadFrameBuffer.bind(renderer, [presentationTexture]);\n const width = presentationTexture.width, height = presentationTexture.height;\n return { width, height, data: readRgbaPixels(renderer.gl, width, height, presentationTexture.isByteEncoded) };\n },\n aovReady(kind) { return !!execution?.aovs?.includes(kind) && aov.samples > 0; },\n getAovSamples() { return aov.samples; },\n restartAovs() { aov.reset(); },\n refineAovs(camera, samples = sampleCount) {\n if (samples < 1 || !execution?.aovs?.length) return true;\n rayTracePass.setCamera(camera); aovCamera = camera;\n return rayTracePass.renderAovs(aov,camera,renderWidth,renderHeight,samples,execution.aovSamples ?? 16,execution.aovs,sampleSequenceOffset);\n },\n async readAov(kind) {\n if(!execution?.aovs?.includes(kind) || !aovCamera || (sampleCount<1 && aov.samples<1)) throw new Error('AOV output is not ready');\n rayTracePass.setCamera(aovCamera);\n while (!rayTracePass.renderAovs(aov,aovCamera,renderWidth,renderHeight,Math.max(sampleCount,aov.samples),execution.aovSamples ?? 16,execution.aovs,sampleSequenceOffset)) {\n if (disposed || renderer.gl.isContextLost()) throw new Error('AOV compilation was interrupted');\n await new Promise<void>(resolve => scheduleFrame(() => resolve()));\n }\n return aov.read(kind);\n },\n async readOutput(kind) {\n if (kind === 'denoised' && (!denoisedTexture || !denoiseValid)) kind = 'hdr';\n const texture = kind === 'denoised' ? denoisedTexture! : rayTraceOutputPass.getOutput(kind === 'hdr' ? 'color' : kind);\n rawReadFrameBuffer.bind(renderer, [texture]);\n return { data: readRgbaPixels(renderer.gl, renderWidth, renderHeight, kind === 'albedo' || kind === 'normal'), width: renderWidth, height: renderHeight };\n },\n dispose() {\n if (disposed) return; disposed = true;\n if (typeof document !== 'undefined') document.removeEventListener('visibilitychange', onVisibilityChange);\n\n aov.dispose();\n rayTracePass.releaseTarget(targetKey);\n rayTraceOutputPass.dispose();\n presentationTexture?.dispose(renderer.gl);\n denoisedTexture?.dispose(renderer.gl);\n }\n } satisfies TargetPipeline & DisplayParityTarget;\n}\n\n/** Independent render targets, without preview or presentation policy. */\nexport function makeWebGLRenderTargets(renderer: WebGLDevice): RenderPipeline {\n const rayTracePass = new WebGLRayTracePass(renderer);\n const scratch = new ScratchPool();\n return makeRenderPipeline(rayTracePass, () => makeWebGLAccumulationTarget(renderer, rayTracePass, scratch), true, scratch);\n}\n"]}
@@ -0,0 +1,39 @@
1
+ /**
2
+ * Physically based clear sky for the viewer's default environment, baked on
3
+ * the GPU into an equirectangular radiance map.
4
+ *
5
+ * Integrates single scattering through a spherical Rayleigh, Mie and ozone
6
+ * atmosphere and adds multiple scattering with the isotropic approximation
7
+ * of Hillaire, "A Scalable and Production Ready Sky and Atmosphere Rendering
8
+ * Technique" (EGSR 2020). Coefficients are the Earth defaults from Bruneton,
9
+ * "Precomputed Atmospheric Scattering" (2008/2017). Formulas only; no code is
10
+ * taken from either reference.
11
+ *
12
+ * WebGL 2 passes: transmittance table, multiple scattering by altitude, a
13
+ * sky-view table by elevation and azimuth relative to the sun, irradiance and
14
+ * exposure, then the map itself with an anti-aliased, limb-darkened sun disk.
15
+ * Distances are in kilometers so float32 keeps the horizon precise.
16
+ */
17
+ export interface SkyData {
18
+ data: Float32Array;
19
+ width: number;
20
+ height: number;
21
+ }
22
+ /** Bakes skies with its own WebGL 2 context; requires float render targets. */
23
+ export declare class WebGLSkyBaker {
24
+ private readonly gl;
25
+ private readonly programs;
26
+ private readonly targets;
27
+ private map?;
28
+ constructor();
29
+ /** Clear sky at a local solar time, in hours. */
30
+ bake(hours: number, width?: number, height?: number): SkyData;
31
+ dispose(): void;
32
+ private program;
33
+ private target;
34
+ private release;
35
+ private uniform;
36
+ private bind;
37
+ private draw;
38
+ private read;
39
+ }