@meimu/mutracer 0.2.0 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (211) hide show
  1. package/README.md +3 -0
  2. package/dist/assets/bvh.worker.js +1 -1
  3. package/dist/mutracer.umd.js +8949 -7915
  4. package/docs/api.md +42 -21
  5. package/docs/caustics.md +80 -0
  6. package/docs/materials.md +5 -4
  7. package/docs/progressive-rendering.md +50 -9
  8. package/docs/technical/continuous-spectrum.md +93 -0
  9. package/docs/updates.md +3 -1
  10. package/docs/viewer-checklist.md +65 -0
  11. package/docs/viewer.md +7 -5
  12. package/lib/Display.js +1 -1
  13. package/lib/Display.js.map +1 -1
  14. package/lib/Engine.d.ts +2 -0
  15. package/lib/Engine.js +47 -12
  16. package/lib/Engine.js.map +1 -1
  17. package/lib/Render.d.ts +61 -13
  18. package/lib/Render.js +169 -19
  19. package/lib/Render.js.map +1 -1
  20. package/lib/RenderLoop.d.ts +7 -3
  21. package/lib/RenderLoop.js +68 -44
  22. package/lib/RenderLoop.js.map +1 -1
  23. package/lib/main.d.ts +1 -1
  24. package/lib/main.js.map +1 -1
  25. package/lib/oidn.d.ts +1 -1
  26. package/lib/oidnBundledWeights.cdn.d.ts +2 -2
  27. package/lib/renderer/GPUTraceQueue.d.ts +2 -1
  28. package/lib/renderer/GPUTraceQueue.js +3 -1
  29. package/lib/renderer/GPUTraceQueue.js.map +1 -1
  30. package/lib/renderer/RenderingPipeline.d.ts +4 -0
  31. package/lib/renderer/RenderingPipeline.js.map +1 -1
  32. package/lib/renderer/WGPUCausticLightPass.d.ts +48 -0
  33. package/lib/renderer/WGPUCausticLightPass.js +217 -0
  34. package/lib/renderer/WGPUCausticLightPass.js.map +1 -0
  35. package/lib/renderer/WGPUEnvMapDistribution.js +18 -18
  36. package/lib/renderer/WGPUFullQuadPass.js +3 -3
  37. package/lib/renderer/WGPUPhotonMap.d.ts +37 -0
  38. package/lib/renderer/WGPUPhotonMap.js +191 -0
  39. package/lib/renderer/WGPUPhotonMap.js.map +1 -0
  40. package/lib/renderer/WGPURayTraceOutput.d.ts +13 -1
  41. package/lib/renderer/WGPURayTraceOutput.js +122 -28
  42. package/lib/renderer/WGPURayTraceOutput.js.map +1 -1
  43. package/lib/renderer/WGPURayTracePass.d.ts +48 -17
  44. package/lib/renderer/WGPURayTracePass.js +538 -340
  45. package/lib/renderer/WGPURayTracePass.js.map +1 -1
  46. package/lib/renderer/WGPURenderingPipeline.js +83 -47
  47. package/lib/renderer/WGPURenderingPipeline.js.map +1 -1
  48. package/lib/renderer/WebGLFullQuadPass.d.ts +2 -1
  49. package/lib/renderer/WebGLFullQuadPass.js +4 -0
  50. package/lib/renderer/WebGLFullQuadPass.js.map +1 -1
  51. package/lib/renderer/WebGLJNLMDenoiser.js +66 -66
  52. package/lib/renderer/WebGLRayTraceOutputPass.js +4 -4
  53. package/lib/renderer/WebGLRayTracePass.d.ts +6 -1
  54. package/lib/renderer/WebGLRayTracePass.js +43 -6
  55. package/lib/renderer/WebGLRayTracePass.js.map +1 -1
  56. package/lib/renderer/WebGLRenderingPipeline.js +10 -14
  57. package/lib/renderer/WebGLRenderingPipeline.js.map +1 -1
  58. package/lib/renderer/WebGLSkyBaker.js +60 -60
  59. package/lib/renderer/accumulationTarget.d.ts +2 -1
  60. package/lib/renderer/accumulationTarget.js.map +1 -1
  61. package/lib/renderer/causticDiagnostics.d.ts +31 -0
  62. package/lib/renderer/causticDiagnostics.js +5 -0
  63. package/lib/renderer/causticDiagnostics.js.map +1 -0
  64. package/lib/renderer/causticEmission.d.ts +10 -0
  65. package/lib/renderer/causticEmission.js +40 -0
  66. package/lib/renderer/causticEmission.js.map +1 -0
  67. package/lib/renderer/causticUniform.d.ts +12 -0
  68. package/lib/renderer/causticUniform.js +22 -0
  69. package/lib/renderer/causticUniform.js.map +1 -0
  70. package/lib/renderer/caustics.d.ts +16 -0
  71. package/lib/renderer/caustics.js +93 -0
  72. package/lib/renderer/caustics.js.map +1 -0
  73. package/lib/renderer/glsl/aovDisplay.frag.js +5 -5
  74. package/lib/renderer/glsl/aovReflectance.glsl.js +53 -53
  75. package/lib/renderer/glsl/aovReflectanceSamples.glsl.js +1 -1
  76. package/lib/renderer/glsl/aovTrace.frag.js +33 -33
  77. package/lib/renderer/glsl/chunks/cameraRay.glsl.js +9 -9
  78. package/lib/renderer/glsl/chunks/emissiveLight.glsl.d.ts +2 -0
  79. package/lib/renderer/glsl/chunks/emissiveLight.glsl.js +35 -0
  80. package/lib/renderer/glsl/chunks/emissiveLight.glsl.js.map +1 -0
  81. package/lib/renderer/glsl/chunks/envMap.glsl.js +73 -73
  82. package/lib/renderer/glsl/chunks/intersect.glsl.js +426 -428
  83. package/lib/renderer/glsl/chunks/intersect.glsl.js.map +1 -1
  84. package/lib/renderer/glsl/chunks/materialBuffer.glsl.d.ts +1 -0
  85. package/lib/renderer/glsl/chunks/materialBuffer.glsl.js +156 -153
  86. package/lib/renderer/glsl/chunks/materialBuffer.glsl.js.map +1 -1
  87. package/lib/renderer/glsl/chunks/openPbrBsdf.glsl.js +771 -771
  88. package/lib/renderer/glsl/chunks/rand.glsl.js +3 -3
  89. package/lib/renderer/glsl/chunks/random.glsl.js +6 -6
  90. package/lib/renderer/glsl/chunks/rayTraceCore.glsl.d.ts +1 -0
  91. package/lib/renderer/glsl/chunks/rayTraceCore.glsl.js +68 -63
  92. package/lib/renderer/glsl/chunks/rayTraceCore.glsl.js.map +1 -1
  93. package/lib/renderer/glsl/chunks/sampleLight.glsl.js +94 -76
  94. package/lib/renderer/glsl/chunks/sampleLight.glsl.js.map +1 -1
  95. package/lib/renderer/glsl/chunks/sampleMaterial.glsl.d.ts +1 -0
  96. package/lib/renderer/glsl/chunks/sampleMaterial.glsl.js +140 -117
  97. package/lib/renderer/glsl/chunks/sampleMaterial.glsl.js.map +1 -1
  98. package/lib/renderer/glsl/chunks/sampleShadowCatcher.glsl.js +14 -14
  99. package/lib/renderer/glsl/chunks/sampling.glsl.js +89 -92
  100. package/lib/renderer/glsl/chunks/sampling.glsl.js.map +1 -1
  101. package/lib/renderer/glsl/chunks/sobol.glsl.js +79 -79
  102. package/lib/renderer/glsl/chunks/textureLinear.glsl.js +5 -5
  103. package/lib/renderer/glsl/chunks/uvProjection.glsl.js +11 -11
  104. package/lib/renderer/glsl/depthQuery.frag.js +2 -2
  105. package/lib/renderer/glsl/normalizeRayTraceOutput.frag.js +10 -10
  106. package/lib/renderer/glsl/rayTrace.frag.d.ts +1 -1
  107. package/lib/renderer/glsl/rayTrace.frag.js +260 -237
  108. package/lib/renderer/glsl/rayTrace.frag.js.map +1 -1
  109. package/lib/renderer/glsl/shadowCatcher.frag.js +26 -26
  110. package/lib/renderer/glsl/shadowCatcher.frag.js.map +1 -1
  111. package/lib/renderer/glsl/webglPipeline.frag.js +59 -59
  112. package/lib/renderer/lightSampling.d.ts +3 -2
  113. package/lib/renderer/lightSampling.js +14 -8
  114. package/lib/renderer/lightSampling.js.map +1 -1
  115. package/lib/renderer/progressiveScheduler.js +4 -3
  116. package/lib/renderer/progressiveScheduler.js.map +1 -1
  117. package/lib/renderer/renderPipeline.d.ts +1 -0
  118. package/lib/renderer/renderPipeline.js.map +1 -1
  119. package/lib/renderer/researchTransport.d.ts +31 -0
  120. package/lib/renderer/researchTransport.js +5 -0
  121. package/lib/renderer/researchTransport.js.map +1 -0
  122. package/lib/renderer/sceneLayoutSchema.d.ts +1 -0
  123. package/lib/renderer/sceneLayoutSchema.js +2 -2
  124. package/lib/renderer/sceneLayoutSchema.js.map +1 -1
  125. package/lib/renderer/scratchSampling.js +6 -6
  126. package/lib/renderer/spectrum.d.ts +21 -0
  127. package/lib/renderer/spectrum.js +154 -0
  128. package/lib/renderer/spectrum.js.map +1 -0
  129. package/lib/renderer/webglLightSampling.d.ts +39 -0
  130. package/lib/renderer/webglLightSampling.js +15 -0
  131. package/lib/renderer/webglLightSampling.js.map +1 -0
  132. package/lib/renderer/wgpuBindlessSource.js +3 -3
  133. package/lib/renderer/wgpuShaderSource.d.ts +7 -0
  134. package/lib/renderer/wgpuShaderSource.js +2 -0
  135. package/lib/renderer/wgpuShaderSource.js.map +1 -1
  136. package/lib/renderer/wgsl/aovDisplay.wgsl.js +9 -9
  137. package/lib/renderer/wgsl/aovReflectance.wgsl.js +55 -55
  138. package/lib/renderer/wgsl/aovReflectanceSamples.wgsl.js +1 -1
  139. package/lib/renderer/wgsl/aovResolve.wgsl.js +2 -2
  140. package/lib/renderer/wgsl/aovSnapshot.wgsl.js +1 -1
  141. package/lib/renderer/wgsl/aovTrace.wgsl.js +33 -33
  142. package/lib/renderer/wgsl/bloom.wgsl.js +18 -18
  143. package/lib/renderer/wgsl/causticLight.compute.d.ts +6 -0
  144. package/lib/renderer/wgsl/causticLight.compute.js +537 -0
  145. package/lib/renderer/wgsl/causticLight.compute.js.map +1 -0
  146. package/lib/renderer/wgsl/chunks/background.wgsl.d.ts +2 -0
  147. package/lib/renderer/wgsl/chunks/background.wgsl.js +102 -0
  148. package/lib/renderer/wgsl/chunks/background.wgsl.js.map +1 -0
  149. package/lib/renderer/wgsl/chunks/causticAdjoint.wgsl.d.ts +2 -0
  150. package/lib/renderer/wgsl/chunks/causticAdjoint.wgsl.js +12 -0
  151. package/lib/renderer/wgsl/chunks/causticAdjoint.wgsl.js.map +1 -0
  152. package/lib/renderer/wgsl/chunks/causticAtomic.wgsl.d.ts +2 -0
  153. package/lib/renderer/wgsl/chunks/causticAtomic.wgsl.js +16 -0
  154. package/lib/renderer/wgsl/chunks/causticAtomic.wgsl.js.map +1 -0
  155. package/lib/renderer/wgsl/chunks/caustics.wgsl.d.ts +1 -0
  156. package/lib/renderer/wgsl/chunks/caustics.wgsl.js +62 -0
  157. package/lib/renderer/wgsl/chunks/caustics.wgsl.js.map +1 -0
  158. package/lib/renderer/wgsl/chunks/common.wgsl.js +4 -4
  159. package/lib/renderer/wgsl/chunks/envMap.wgsl.js +37 -37
  160. package/lib/renderer/wgsl/chunks/intersect.wgsl.js +598 -592
  161. package/lib/renderer/wgsl/chunks/intersect.wgsl.js.map +1 -1
  162. package/lib/renderer/wgsl/chunks/intersectionAlpha.wgsl.js +14 -14
  163. package/lib/renderer/wgsl/chunks/materialBuffer.wgsl.d.ts +2 -1
  164. package/lib/renderer/wgsl/chunks/materialBuffer.wgsl.js +75 -73
  165. package/lib/renderer/wgsl/chunks/materialBuffer.wgsl.js.map +1 -1
  166. package/lib/renderer/wgsl/chunks/openPbrBsdf.wgsl.js +794 -794
  167. package/lib/renderer/wgsl/chunks/pdm_displacement.wgsl.js +139 -139
  168. package/lib/renderer/wgsl/chunks/rand.wgsl.js +3 -3
  169. package/lib/renderer/wgsl/chunks/rayTraceCore.wgsl.d.ts +2 -1
  170. package/lib/renderer/wgsl/chunks/rayTraceCore.wgsl.js +35 -25
  171. package/lib/renderer/wgsl/chunks/rayTraceCore.wgsl.js.map +1 -1
  172. package/lib/renderer/wgsl/chunks/sampleLight.wgsl.d.ts +1 -1
  173. package/lib/renderer/wgsl/chunks/sampleLight.wgsl.js +142 -138
  174. package/lib/renderer/wgsl/chunks/sampleLight.wgsl.js.map +1 -1
  175. package/lib/renderer/wgsl/chunks/sampleMaterial.wgsl.d.ts +1 -1
  176. package/lib/renderer/wgsl/chunks/sampleMaterial.wgsl.js +204 -187
  177. package/lib/renderer/wgsl/chunks/sampleMaterial.wgsl.js.map +1 -1
  178. package/lib/renderer/wgsl/chunks/sampleShadowCatcher.wgsl.d.ts +1 -1
  179. package/lib/renderer/wgsl/chunks/sampleShadowCatcher.wgsl.js +11 -11
  180. package/lib/renderer/wgsl/chunks/sampleShadowCatcher.wgsl.js.map +1 -1
  181. package/lib/renderer/wgsl/chunks/sampling.wgsl.d.ts +1 -1
  182. package/lib/renderer/wgsl/chunks/sampling.wgsl.js +89 -93
  183. package/lib/renderer/wgsl/chunks/sampling.wgsl.js.map +1 -1
  184. package/lib/renderer/wgsl/chunks/sobol.wgsl.js +83 -83
  185. package/lib/renderer/wgsl/chunks/uvProjection.wgsl.js +11 -11
  186. package/lib/renderer/wgsl/compose.frag.wgsl.js +98 -98
  187. package/lib/renderer/wgsl/customDenoise.wgsl.js +10 -10
  188. package/lib/renderer/wgsl/depthQuery.wgsl.js +2 -2
  189. package/lib/renderer/wgsl/jnlm.compute.js +74 -74
  190. package/lib/renderer/wgsl/offlineAdaptive.compute.js +25 -25
  191. package/lib/renderer/wgsl/oidnAuxiliary.wgsl.js +3 -3
  192. package/lib/renderer/wgsl/photonMap.compute.d.ts +29 -0
  193. package/lib/renderer/wgsl/photonMap.compute.js +352 -0
  194. package/lib/renderer/wgsl/photonMap.compute.js.map +1 -0
  195. package/lib/renderer/wgsl/proceduralSky.compute.js +64 -64
  196. package/lib/renderer/wgsl/rayTrace.compute.d.ts +9 -1
  197. package/lib/renderer/wgsl/rayTrace.compute.js +448 -522
  198. package/lib/renderer/wgsl/rayTrace.compute.js.map +1 -1
  199. package/lib/scene/MaterialState.d.ts +2 -2
  200. package/lib/scene/MaterialState.js +2 -2
  201. package/lib/scene/MaterialState.js.map +1 -1
  202. package/lib/settings/render.d.ts +11 -0
  203. package/lib/settings/render.js +1 -0
  204. package/lib/settings/render.js.map +1 -1
  205. package/lib/util/fromTHREE.js +2 -2
  206. package/lib/util/fromTHREE.js.map +1 -1
  207. package/lib/version.d.ts +1 -1
  208. package/lib/version.js +1 -1
  209. package/lib/version.js.map +1 -1
  210. package/llms.txt +2 -1
  211. package/package.json +3 -3
@@ -1 +1 @@
1
- {"version":3,"file":"lightSampling.js","sourceRoot":"","sources":["../../src/renderer/lightSampling.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,aAAa,EAAC,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAC;AACpE,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AACzD,OAAO,EAAE,iBAAiB,EAAE,qBAAqB,EAAE,MAAM,oBAAoB,CAAC;AAC9E,OAAO,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,oBAAoB,EAAE,6BAA6B,EAAE,MAAM,iBAAiB,CAAC;AAC9I,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAC1D,OAAO,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAC5E,OAAO,EAA2B,IAAI,EAAE,MAAM,YAAY,CAAC;AAU3D,OAAO,EAAE,8BAA8B,EAAE,MAAM,qBAAqB,CAAC;AACrE,cAAc,qBAAqB,CAAC;AAqCpC,MAAM,qBAAqB,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAU,CAAC;AAEhE,MAAM,UAAU,cAAc,CAA8B,KAAQ;IAClE,OAAO,IAAI,CAAC,GAAG,CACb,KAAK,CAAC,CAAC,CAAC,GAAG,qBAAqB,CAAC,CAAC,CAAC;QACjC,KAAK,CAAC,CAAC,CAAC,GAAG,qBAAqB,CAAC,CAAC,CAAC;QACnC,KAAK,CAAC,CAAC,CAAC,GAAG,qBAAqB,CAAC,CAAC,CAAC,EACrC,CAAC,CACF,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,0BAA0B,CAAC,KAAoB;IAC7D,MAAM,gBAAgB,GAAG,cAAc,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,KAAK,CAAC,SAAS,CAAC;IACvE,IAAI,CAAC,CAAC,gBAAgB,GAAG,CAAC,CAAC;QAAE,OAAO,CAAC,CAAC;IACtC,IAAI,KAAK,CAAC,IAAI,KAAK,WAAW,EAAE,CAAC;QAC/B,OAAO,gBAAgB,GAAG,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,gBAAgB,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC;IAC3E,CAAC;IACD,IAAI,KAAK,CAAC,IAAI,KAAK,aAAa,EAAE,CAAC;QACjC,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,gBAAgB,GAAG,CAAC,GAAG,IAAI,CAAC,EAAE,CAAC;QAC9D,OAAO,gBAAgB,GAAG,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,kBAAkB,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC;IAC7E,CAAC;IACD,IAAI,KAAK,CAAC,IAAI,KAAK,WAAW,EAAE,CAAC;QAC/B,MAAM,iBAAiB,GACrB,cAAc,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,oBAAoB,CAAC,KAAK,CAAC,CAAC;QAC5D,uEAAuE;QACvE,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACvB,OAAO,gBAAgB;gBACrB,CAAC,GAAG,IAAI,CAAC,EAAE;gBACX,6BAA6B,CAAC,KAAK,CAAC,CAAC;QACzC,CAAC;QACD,OAAO,CACL,iBAAiB;YACjB,IAAI,CAAC,EAAE;YACP,gBAAgB,CAAC,KAAK,CAAC;YACvB,6BAA6B,CAAC,KAAK,CAAC,CACrC,CAAC;IACJ,CAAC;IACD,0EAA0E;IAC1E,mEAAmE;IACnE,OAAO,gBAAgB,GAAG,CAAC,GAAG,IAAI,CAAC,EAAE,CAAC;AACxC,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,gBAAwB,EAAE,MAAc;IAC1E,IAAI,gBAAgB,IAAI,MAAM;QAAE,OAAO,CAAC,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,EAAE,CAAC,CAAC;IACzD,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAC3B,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,GAAG,MAAM,GAAG,MAAM,GAAG,CAAC,gBAAgB,GAAG,gBAAgB,CAAC,CAAC,CACzE,CAAC;IACF,OAAO,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,EAAE,GAAG,CAAC,CAAC,GAAG,WAAW,CAAC,EAAE,IAAI,CAAC,CAAC;AAC7D,CAAC;AAED,oFAAoF;AACpF,MAAM,UAAU,eAAe,CAAC,MAAuB,EAAE,UAAU,GAAG,CAAC;IACrE,MAAM,OAAO,GAAG,IAAI,UAAU,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;IACvD,MAAM,QAAQ,GAAiB,EAAE,CAAC;IAClC,MAAM,OAAO,GAAG,IAAI,GAAG,EAAsB,CAAC;IAC9C,MAAM,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE;QAC9B,IAAI,KAAK,CAAC,IAAI,KAAK,WAAW,IAAI,CAAC,KAAK,CAAC,UAAU;YAAE,OAAO;QAC5D,IAAI,YAAY,GAAG,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;QACjD,IAAI,YAAY,IAAI,IAAI,EAAE,CAAC;YACzB,YAAY,GAAG,QAAQ,CAAC,MAAM,CAAC;YAC/B,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,UAAU,EAAE,YAAY,CAAC,CAAC;YAC5C,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;QAClC,CAAC;QACD,OAAO,CAAC,KAAK,CAAC,GAAG,UAAU,GAAG,YAAY,GAAG,CAAC,CAAC,GAAG,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;IACjE,CAAC,CAAC,CAAC;IACH,MAAM,IAAI,GAAG,IAAI,YAAY,CAAC,QAAQ,CAAC,MAAM,GAAG,GAAG,GAAG,GAAG,CAAC,CAAC;IAC3D,QAAQ,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE,KAAK,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,EAAE,KAAK,GAAG,GAAG,GAAG,GAAG,CAAC,CAAC,CAAC;IAChF,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,UAAU,EAAE,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;AACxD,CAAC;AAED,yEAAyE;AACzE,MAAM,iBAAiB,GAAG,IAAI,OAAO,EAAkB,CAAC;AAExD,MAAM,UAAU,wBAAwB,CAA+B,KAAS;IAC9E,IAAI,CAAC,KAAK,EAAE,IAAI,IAAI,CAAC,KAAK,CAAC,KAAK,IAAI,CAAC,KAAK,CAAC,MAAM;QAAE,OAAO,CAAC,CAAC;IAC5D,MAAM,MAAM,GAAG,iBAAiB,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;IAC5C,IAAI,MAAM,KAAK,SAAS;QAAE,OAAO,MAAM,CAAC;IACxC,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,KAAK,CAAC;IACtC,MAAM,KAAK,GAAG,gBAAgB,CAAC,IAAI,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC;IACpD,iBAAiB,CAAC,GAAG,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;IACpC,OAAO,KAAK,CAAC;AACf,CAAC;AAED,iFAAiF;AACjF,MAAM,OAAO,iBAAiB;IAC5B,KAAK,GAAG,CAAC,CAAC;IACV,WAAW,GAAG,IAAI,WAAW,CAAC,CAAC,CAAC,CAAC;IACjC,aAAa,GAAG,IAAI,WAAW,CAAC,CAAC,CAAC,CAAC;IACnC,OAAO,GAAG,IAAI,YAAY,CAAC,CAAC,CAAC,CAAC;IAC9B,OAAO,CAAC,QAAgB;QACtB,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC;QACf,IAAI,IAAI,CAAC,OAAO,CAAC,MAAM,GAAG,QAAQ,EAAE,CAAC;YACnC,IAAI,CAAC,WAAW,GAAG,IAAI,WAAW,CAAC,QAAQ,CAAC,CAAC;YAC7C,IAAI,CAAC,aAAa,GAAG,IAAI,WAAW,CAAC,QAAQ,CAAC,CAAC;YAC/C,IAAI,CAAC,OAAO,GAAG,IAAI,YAAY,CAAC,QAAQ,CAAC,CAAC;QAC5C,CAAC;IACH,CAAC;IACD,IAAI,CAAC,UAAkB,EAAE,WAAmB,EAAE,MAAc;QAC1D,IAAI,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC;YAAE,OAAO;QAC/C,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,EAAE,CAAC;QACvB,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,GAAG,UAAU,CAAC;QAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,GAAG,WAAW,CAAC;QAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC;IAClG,CAAC;CACF;AAED,uFAAuF;AACvF,MAAM,UAAU,oBAAoB,CAAC,MAA8C;IACjF,IAAI,MAAyB,CAAC;IAC9B,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC;QAAE,MAAM,GAAG,MAAM,CAAC;SACvC,CAAC;QACJ,MAAM,GAAG,IAAI,iBAAiB,EAAE,CAAC;QAAC,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QAChE,KAAK,MAAM,KAAK,IAAI,MAAM;YAAE,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,UAAU,EAAE,KAAK,CAAC,WAAW,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC;IAC7F,CAAC;IACD,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC;IAC3B,IAAI,WAAW,GAAG,CAAC,CAAC;IACpB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,EAAE,CAAC,EAAE;QAAE,WAAW,IAAI,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;IACjE,IAAI,CAAC,KAAK,IAAI,CAAC,CAAC,WAAW,GAAG,CAAC,CAAC;QAAE,OAAO,EAAE,OAAO,EAAE,IAAI,WAAW,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,YAAY,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,CAAC,EAAE,CAAC;IACpH,MAAM,IAAI,GAAG,IAAI,YAAY,CAAC,KAAK,CAAC,CAAC;IACrC,MAAM,MAAM,GAAG,IAAI,YAAY,CAAC,KAAK,CAAC,CAAC;IACvC,MAAM,KAAK,GAAG,IAAI,WAAW,CAAC,KAAK,CAAC,EAAE,KAAK,GAAG,IAAI,WAAW,CAAC,KAAK,CAAC,CAAC;IACrE,IAAI,UAAU,GAAG,CAAC,EAAE,UAAU,GAAG,CAAC,CAAC;IACnC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,EAAE,CAAC,EAAE,EAAE,CAAC;QAC/B,IAAI,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,WAAW,CAAC;QAC1C,MAAM,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC;QAC5B,IAAI,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC;YAAE,KAAK,CAAC,UAAU,EAAE,CAAC,GAAG,CAAC,CAAC;;YAAM,KAAK,CAAC,UAAU,EAAE,CAAC,GAAG,CAAC,CAAC;IAC3E,CAAC;IACD,MAAM,MAAM,GAAG,IAAI,WAAW,CAAC,KAAK,GAAG,EAAE,CAAC,CAAC;IAC3C,MAAM,MAAM,GAAG,IAAI,YAAY,CAAC,MAAM,CAAC,EAAE,IAAI,GAAG,IAAI,UAAU,CAAC,MAAM,CAAC,CAAC;IACvE,OAAO,UAAU,IAAI,UAAU,EAAE,CAAC;QAChC,MAAM,GAAG,GAAG,KAAK,CAAC,EAAE,UAAU,CAAC,GAAG,CAAC,EAAE,IAAI,GAAG,KAAK,CAAC,EAAE,UAAU,CAAC,GAAG,CAAC,CAAC;QACpE,MAAM,CAAC,GAAG,GAAG,CAAC,CAAC,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC;QAAC,IAAI,CAAC,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC;QACxD,MAAM,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAC9C,IAAI,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC;YAAE,KAAK,CAAC,UAAU,EAAE,CAAC,GAAG,IAAI,CAAC;;YAAM,KAAK,CAAC,UAAU,EAAE,CAAC,GAAG,IAAI,CAAC;IACpF,CAAC;IACD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,UAAU,EAAE,CAAC,EAAE,EAAE,CAAC;QAAC,MAAM,KAAK,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;QAAC,MAAM,CAAC,KAAK,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC;QAAC,IAAI,CAAC,KAAK,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,KAAK,CAAC;IAAC,CAAC;IACpH,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,UAAU,EAAE,CAAC,EAAE,EAAE,CAAC;QAAC,MAAM,KAAK,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;QAAC,MAAM,CAAC,KAAK,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC;QAAC,IAAI,CAAC,KAAK,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,KAAK,CAAC;IAAC,CAAC;IACpH,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,EAAE,CAAC,EAAE,EAAE,CAAC;QAAC,IAAI,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC;QAAC,IAAI,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,MAAM,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC;IAAC,CAAC;IACvH,OAAO,EAAE,OAAO,EAAE,IAAI,WAAW,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,CAAC;AACjE,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,iCAAiC,CAC/C,OAA0B,EAC1B,OAAO,GAAG,IAAI,iBAAiB,EAAE;IAEjC,IAAI,QAAQ,GAAG,CAAC,CAAC;IACjB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,OAAO,CAAC,KAAK,EAAE,CAAC,EAAE,EAAE,CAAC;QACvC,IAAI,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,KAAK,8BAA8B;YAAE,QAAQ,EAAE,CAAC;IAC5E,CAAC;IACD,IAAI,CAAC,QAAQ;QAAE,OAAO,SAAS,CAAC;IAChC,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,KAAK,GAAG,QAAQ,CAAC,CAAC;IAC1C,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,OAAO,CAAC,KAAK,EAAE,CAAC,EAAE,EAAE,CAAC;QACvC,IAAI,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,KAAK,8BAA8B,EAAE,CAAC;YAC9D,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC,aAAa,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC;QACrF,CAAC;IACH,CAAC;IACD,OAAO,oBAAoB,CAAC,OAAO,CAAC,CAAC;AACvC,CAAC;AAED,SAAS,qBAAqB,CAAC,QAAkB,EAAE,OAAoB,EAAE,cAAsB,EAAE,aAAqB;IACpH,0EAA0E;IAC1E,OAAO,kBAAkB,CAAC,QAAQ,EAAE,OAAO,CAAC,cAAc,CAAC,EAAE,aAAa,CAAC,CAAC;AAC9E,CAAC;AAED,MAAM,UAAU,wBAAwB,CACtC,QAA+B,EAC/B,SAA4B;IAE5B,MAAM,SAAS,GAAuB,EAAE,CAAC;IACzC,MAAM,KAAK,GAAG,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,IAAI,CAAC,MAAM,EAAE,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC;IAC5D,MAAM,KAAK,GAAG,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,IAAI,CAAC,MAAM,EAAE,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC;IAC5D,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC;IAC5B,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC;IAC5B,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC;IAE5B,KAAK,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,eAAe,EAAE,IAAI,QAAQ,EAAE,CAAC;QAC3D,2EAA2E;QAC3E,4EAA4E;QAC5E,MAAM,kBAAkB,GAAa,EAAE,CAAC;QACxC,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,eAAe,CAAC,MAAM,CAAC,EAAE,KAAK,EAAE,EAAE,CAAC;YACzE,MAAM,QAAQ,GAAG,SAAS,CAAC,eAAe,CAAC,KAAK,CAAC,IAAI,eAAe,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;YAC9E,kBAAkB,CAAC,IAAI,CAAC,CAAC,QAAQ,IAAI,QAAQ,CAAC,aAAa,IAAI,QAAQ,CAAC,KAAK;gBAC3E,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC,gBAAgB,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;QACtD,CAAC;QACD,MAAM,MAAM,GAAG,IAAI,YAAY,CAAC,EAAE,CAAC,EAAE,MAAM,GAAG,aAAa,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QAC5E,KAAK,IAAI,QAAQ,GAAG,CAAC,EAAE,QAAQ,GAAG,iBAAiB,CAAC,IAAI,CAAC,EAAE,QAAQ,EAAE,EAAE,CAAC;YACtE,qBAAqB,CAAC,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;YACtD,MAAM,OAAO,GAAG,QAAQ,CAAC,UAAU,CAAC;YACpC,MAAM,SAAS,GAAG,QAAQ,CAAC,QAAQ,CAAC,KAAK,CAAC;YAC1C,MAAM,GAAG,GAAG,QAAQ,CAAC,EAAE,EAAE,KAAK,CAAC;YAC/B,MAAM,YAAY,GAAG,QAAQ,CAAC,GAAG,EAAE,KAAK,IAAI,GAAG,CAAC;YAChD,KAAK,IAAI,cAAc,GAAG,CAAC,EAAE,cAAc,GAAG,eAAe,CAAC,OAAO,CAAC,EAAE,cAAc,IAAI,CAAC,EAAE,CAAC;gBAC5F,MAAM,kBAAkB,GAAG,qBAAqB,CAAC,QAAQ,EAAE,OAAO,EAAE,cAAc,EAAE,eAAe,CAAC,MAAM,CAAC,CAAC;gBAC5G,MAAM,aAAa,GAAG,eAAe,CAAC,kBAAkB,CAAC,IAAI,eAAe,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;gBACrF,MAAM,iBAAiB,GAAG,kBAAkB,CAAC,kBAAkB,CAAC,CAAC;gBACjE,IAAI,CAAC,CAAC,iBAAiB,GAAG,IAAI,CAAC;oBAAE,SAAS;gBAE1C,MAAM,eAAe,GAAG;oBACtB,cAAc,CAAC,OAAO,EAAE,cAAc,CAAC;oBACvC,cAAc,CAAC,OAAO,EAAE,cAAc,GAAG,CAAC,CAAC;oBAC3C,cAAc,CAAC,OAAO,EAAE,cAAc,GAAG,CAAC,CAAC;iBAC5C,CAAC;gBACF,KAAK,IAAI,MAAM,GAAG,CAAC,EAAE,MAAM,GAAG,CAAC,EAAE,MAAM,EAAE,EAAE,CAAC;oBAC1C,MAAM,MAAM,GAAG,eAAe,CAAC,MAAM,CAAC,CAAC;oBACvC,IAAI,CAAC,GAAG,CACN,KAAK,CAAC,MAAM,CAAC,EACb,SAAS,CAAC,MAAM,GAAG,QAAQ,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAC9C,SAAS,CAAC,MAAM,GAAG,QAAQ,CAAC,QAAQ,CAAC,QAAQ,GAAG,CAAC,CAAC,EAClD,SAAS,CAAC,MAAM,GAAG,QAAQ,CAAC,QAAQ,CAAC,QAAQ,GAAG,CAAC,CAAC,CACnD,CAAC;oBACF,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,KAAK,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC,CAAC;gBAC3D,CAAC;gBACD,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;gBACpC,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;gBACpC,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;gBAChC,MAAM,IAAI,GAAG,GAAG,GAAG,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;gBACtC,IAAI,CAAC,CAAC,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC;oBAAE,SAAS;gBAEjD,MAAM,WAAW,GAAG,eAAe,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CACjD,GAAG;oBACD,CAAC,CAAC,CAAC,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC,EAAE,GAAG,CAAC,MAAM,GAAG,CAAC,GAAG,CAAC,CAAC,CAAqB;oBAC5D,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAqB,CAC/B,CAAC;gBACF,MAAM,oBAAoB,GAAG,eAAe,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAC1D,YAAY;oBACV,CAAC,CAAC,CAAC,YAAY,CAAC,MAAM,GAAG,CAAC,CAAC,EAAE,YAAY,CAAC,MAAM,GAAG,CAAC,GAAG,CAAC,CAAC,CAAqB;oBAC9E,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAqB,CAC/B,CAAC;gBACF,SAAS,CAAC,IAAI,CAAC;oBACb,EAAE,EAAE,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;oBACxB,EAAE,EAAE,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;oBACxB,EAAE,EAAE,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;oBACxB,GAAG,EAAE,WAAW,CAAC,CAAC,CAAC;oBACnB,GAAG,EAAE,WAAW,CAAC,CAAC,CAAC;oBACnB,GAAG,EAAE,WAAW,CAAC,CAAC,CAAC;oBACnB,YAAY,EAAE,oBAAoB,CAAC,CAAC,CAAC;oBACrC,YAAY,EAAE,oBAAoB,CAAC,CAAC,CAAC;oBACrC,YAAY,EAAE,oBAAoB,CAAC,CAAC,CAAC;oBACrC,aAAa;oBACb,IAAI;oBACJ,iBAAiB;oBACjB,YAAY,EAAE,CAAC;iBAChB,CAAC,CAAC;YACL,CAAC;QACH,CAAC;IACH,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,SAAS,iBAAiB,CAAC,IAAkB,EAAE,MAAc,EAAE,KAAmB;IAChF,iFAAiF;IACjF,IAAI,IAAI,CAAC,MAAM,KAAK,KAAK,CAAC,MAAM,EAAE,CAAC;QAAA,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;QAAC,OAAO;IAAA,CAAC;IACpE,IAAI,CAAC,MAAM,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;IAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;IAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;AACpF,CAAC;AACD,MAAM,UAAU,qBAAqB,CAAC,SAA6B,EAAE,OAAqB,IAAI,YAAY,CAAC,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,MAAM,EAAE,CAAC,CAAC,GAAG,EAAE,CAAC;IAC5I,SAAS,CAAC,OAAO,CAAC,CAAC,QAAQ,EAAE,KAAK,EAAE,EAAE;QACpC,MAAM,MAAM,GAAG,KAAK,GAAG,EAAE,CAAC;QAC1B,iBAAiB,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,CAAC,CAAC;QAC7C,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,GAAG,QAAQ,CAAC,YAAY,CAAC;QACzC,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,CAAC,EAAE,QAAQ,CAAC,EAAE,CAAC,CAAC;QACjD,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,GAAG,QAAQ,CAAC,IAAI,CAAC;QACjC,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,CAAC,EAAE,QAAQ,CAAC,EAAE,CAAC,CAAC;QACjD,IAAI,CAAC,MAAM,GAAG,EAAE,CAAC,GAAG,QAAQ,CAAC,aAAa,CAAC;QAC3C,IAAI,CAAC,MAAM,GAAG,EAAE,CAAC,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;QAAC,IAAI,CAAC,MAAM,GAAG,EAAE,CAAC,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;QACzE,IAAI,CAAC,MAAM,GAAG,EAAE,CAAC,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;QAAC,IAAI,CAAC,MAAM,GAAG,EAAE,CAAC,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;QACzE,IAAI,CAAC,MAAM,GAAG,EAAE,CAAC,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;QAAC,IAAI,CAAC,MAAM,GAAG,EAAE,CAAC,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;QACzE,IAAI,CAAC,MAAM,GAAG,EAAE,CAAC,GAAG,QAAQ,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;QAAC,IAAI,CAAC,MAAM,GAAG,EAAE,CAAC,GAAG,QAAQ,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;QAC3F,IAAI,CAAC,MAAM,GAAG,EAAE,CAAC,GAAG,QAAQ,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;QAAC,IAAI,CAAC,MAAM,GAAG,EAAE,CAAC,GAAG,QAAQ,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;QAC3F,IAAI,CAAC,MAAM,GAAG,EAAE,CAAC,GAAG,QAAQ,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;QAAC,IAAI,CAAC,MAAM,GAAG,EAAE,CAAC,GAAG,QAAQ,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;IAC7F,CAAC,CAAC,CAAC;IACH,OAAO,IAAI,CAAC;AACd,CAAC;AAMD,uEAAuE;AACvE,qEAAqE;AACrE,MAAM,gBAAgB,GAAG,IAAI,OAAO,EAA4D,CAAC;AAEjG,gFAAgF;AAChF,MAAM,OAAO,qBAAqB;IAChC,gBAAgB,gBAAgB,CAAC,GAAG,CAAC,IAAI,EAAE,IAAI,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC;IACpD,UAAU,GAAuB,EAAE,CAAC;IAC5C,OAAO,CAAC,QAA+B,EAAE,SAA4B;QACnE,MAAM,cAAc,GAAG,gBAAgB,CAAC,GAAG,CAAC,IAAI,CAAE,CAAC;QACnD,IAAI,CAAC,UAAU,CAAC,MAAM,GAAG,CAAC,CAAC;QAC3B,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;YAC/B,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,eAAe,EAAE,GAAG,OAAO,CAAC;YACpD,MAAM,QAAQ,GAAG,CAAC,KAAa,EAAE,EAAE;gBACjC,MAAM,CAAC,GAAG,SAAS,CAAC,KAAK,CAAC,CAAC;gBAC3B,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,CAAC,aAAa,IAAI,cAAc,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC;YAC3F,CAAC,CAAC;YACF,MAAM,eAAe,GAAG,IAAI,CAAC,YAAY,EAAE,iBAAiB,IAAI,CAAC,CAAC;YAClE,MAAM,aAAa,GAAG,iBAAiB,CAAC,IAAI,CAAC,CAAC;YAC9C,MAAM,kBAAkB,GAAG,IAAI,CAAC,YAAY,EAAE,UAAU,CAAC;YACzD,IAAI,MAAM,GAAG,cAAc,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;YACtC,IAAI,CAAC,MAAM,IAAI,MAAM,CAAC,QAAQ,KAAK,QAAQ,IAAI,MAAM,CAAC,OAAO,KAAK,QAAQ,CAAC,OAAO,IAAI,MAAM,CAAC,eAAe,KAAK,eAAe,IAAI,MAAM,CAAC,aAAa,KAAK,aAAa,IAAI,MAAM,CAAC,kBAAkB,KAAK,kBAAkB;gBAC5N,MAAM,CAAC,OAAO,CAAC,MAAM,KAAK,eAAe,CAAC,MAAM,IAAI,eAAe,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,CAAC,EAAE,EAAE,CACpF,MAAO,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,KAAK,IAAI,MAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,KAAK,QAAQ,CAAC,KAAK,CAAC,CAAC;gBAC1E,iBAAiB,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC;gBACzC,MAAM,GAAG,EAAE,QAAQ,EAAE,OAAO,EAAE,QAAQ,CAAC,OAAO,EAAE,eAAe,EAAE,aAAa,EAAE,kBAAkB,EAAE,MAAM,EAAE,cAAc,CAAC,IAAI,CAAC;oBAC9H,OAAO,EAAE,eAAe,CAAC,KAAK,EAAE,EAAE,QAAQ,EAAE,eAAe,CAAC,GAAG,CAAC,QAAQ,CAAC;oBACzE,SAAS,EAAE,wBAAwB,CAAC,CAAC,OAAO,CAAC,EAAE,SAAS,CAAC,EAAE,CAAC;gBAC9D,cAAc,CAAC,GAAG,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;YACnC,CAAC;iBAAM,CAAC;gBACN,KAAK,MAAM,QAAQ,IAAI,MAAM,CAAC,SAAS,EAAE,CAAC;oBACxC,MAAM,CAAC,GAAG,SAAS,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAC;oBAC5C,QAAQ,CAAC,iBAAiB,GAAG,cAAc,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC,CAAC;gBACnE,CAAC;YACH,CAAC;YACD,KAAK,MAAM,QAAQ,IAAI,MAAM,CAAC,SAAS;gBAAE,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAC1E,CAAC;QACD,OAAO,IAAI,CAAC,UAAU,CAAC;IACzB,CAAC;CACF;AAED,SAAS,cAAc,CAAC,IAAU,IAAkB,OAAO,aAAa,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;AAC3F,SAAS,iBAAiB,CAAC,IAAU,EAAE,QAAsB;IAC3D,MAAM,MAAM,GAAG,aAAa,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IAC7C,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,EAAE;QAAE,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC;YAAE,OAAO,IAAI,CAAC;IAC5F,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,gBAAgB,CAAC,IAA6C,EAAE,KAAa,EAAE,MAAc;IACpG,IAAI,IAAI,YAAY,UAAU;QAAE,OAAO,sBAAsB,CAAC,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,GAAG,GAAG,CAAC,CAAC;IAC5F,IAAI,IAAI,YAAY,iBAAiB;QAAE,OAAO,sBAAsB,CAAC,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,GAAG,GAAG,CAAC,CAAC;IACnG,IAAI,IAAI,YAAY,YAAY;QAAE,OAAO,sBAAsB,CAAC,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC;IACxF,OAAO,sBAAsB,CAAC,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC;AACxD,CAAC;AAED,SAAS,sBAAsB,CAAoD,IAAO,EAAE,KAAa,EAAE,MAAc,EAAE,KAAa;IACtI,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,GAAG,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IAC/E,IAAI,iBAAiB,GAAG,CAAC,CAAC;IAC1B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QAChC,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC,GAAG,MAAM,CAAC,CAAC;QACxD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,EAAE,CAAC,EAAE,EAAE,CAAC;YAC/B,MAAM,MAAM,GAAG,CAAC,CAAC,GAAG,KAAK,GAAG,CAAC,CAAC,GAAG,QAAQ,CAAC;YAC1C,iBAAiB;gBACf,cAAc,CAAC;oBACb,UAAU,CAAC,IAAI,EAAE,MAAM,CAAC,GAAG,KAAK;oBAChC,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,QAAQ,GAAG,CAAC,CAAC,CAAC,GAAG,KAAK;oBAC5D,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,QAAQ,GAAG,CAAC,CAAC,CAAC,GAAG,KAAK;iBAC7D,CAAC,GAAG,QAAQ,CAAC;QAClB,CAAC;IACH,CAAC;IACD,OAAO,iBAAiB,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,EAAE,CAAC,GAAG,CAAC,KAAK,GAAG,MAAM,CAAC,CAAC;AACxE,CAAC","sourcesContent":["import {matrixStorage} from '../math/storage.js';\nimport { pixelLength, pixelValue } from '../scene/texturePixels.js';\nimport { materialEmission } from './materialEmission.js';\nimport { meshInstanceCount, meshInstanceTransform } from './meshInstances.js';\nimport { getRectLightArea, getSphereLightArea, getSpotLightArea, getSpotLightRadiance, getSpotLightShapingFluxFactor } from './lightsData.js';\nimport { localMaterialIndex } from './materialIndices.js';\nimport { attributeLength, attributeValue } from '../scene/attributeData.js';\nimport { type TexturePixelSource, vec3 } from '../math.js';\nimport DirectionalLight from '../scene/DirectionalLight.js';\nimport Geometry from '../scene/Geometry.js';\nimport type Mesh from '../scene/MeshState.js';\nimport type RectLight from '../scene/RectLightState.js';\nimport SphereLight from '../scene/SphereLight.js';\nimport SpotLight from '../scene/SpotLight.js';\nimport IESProfile from '../scene/IESProfile.js';\nimport type OpenPBRMaterial from '../scene/MaterialState.js';\n\nimport { LIGHT_CHOICE_EMISSIVE_TRIANGLE } from './lightConstants.js';\nexport * from './lightConstants.js';\ntype AnalyticLight = DirectionalLight | SphereLight | SpotLight | RectLight;\n\nexport interface EmissiveTriangle {\n p0: Float32Array;\n p1: Float32Array;\n p2: Float32Array;\n uv0: [number, number];\n uv1: [number, number];\n uv2: [number, number];\n secondaryUv0: [number, number];\n secondaryUv1: [number, number];\n secondaryUv2: [number, number];\n materialIndex: number;\n area: number;\n samplingLuminance: number;\n selectionPmf: number;\n}\n\nexport interface EmissiveMeshBinding {\n mesh: Mesh;\n geometry: Geometry;\n materialIndices: number[];\n}\n\nexport interface LightChoiceInput {\n sourceType: number;\n sourceIndex: number;\n weight: number;\n}\n\nexport interface LightSamplingDistribution {\n choices: Uint32Array;\n pmfs: Float32Array;\n totalWeight: number;\n}\n\nconst luminanceCoefficients = [0.2126, 0.7152, 0.0722] as const;\n\nexport function colorLuminance<T extends ArrayLike<number>>(color: T) {\n return Math.max(\n color[0] * luminanceCoefficients[0] +\n color[1] * luminanceCoefficients[1] +\n color[2] * luminanceCoefficients[2],\n 0\n );\n}\n\nexport function estimateAnalyticLightPower(light: AnalyticLight) {\n const emittedLuminance = colorLuminance(light.color) * light.intensity;\n if (!(emittedLuminance > 0)) return 0;\n if (light.type === 'RectLight') {\n return emittedLuminance * Math.PI * Math.max(getRectLightArea(light), 0);\n }\n if (light.type === 'SphereLight') {\n if (light.radius === 0) return emittedLuminance * 4 * Math.PI;\n return emittedLuminance * Math.PI * Math.max(getSphereLightArea(light), 0);\n }\n if (light.type === 'SpotLight') {\n const radianceLuminance =\n colorLuminance(light.color) * getSpotLightRadiance(light);\n // The selection power is an approximation and ignores the IES profile.\n if (light.radius === 0) {\n return emittedLuminance *\n 4 * Math.PI *\n getSpotLightShapingFluxFactor(light);\n }\n return (\n radianceLuminance *\n Math.PI *\n getSpotLightArea(light) *\n getSpotLightShapingFluxFactor(light)\n );\n }\n // A directional light has no finite emitting area. 4π keeps its heuristic\n // weight on roughly the same scale as an environment map integral.\n return emittedLuminance * 4 * Math.PI;\n}\n\nexport function sphereSolidAnglePdf(distanceToCenter: number, radius: number) {\n if (distanceToCenter <= radius) return 1 / (4 * Math.PI);\n const cosThetaMax = Math.sqrt(\n Math.max(0, 1 - radius * radius / (distanceToCenter * distanceToCenter))\n );\n return 1 / Math.max(2 * Math.PI * (1 - cosThetaMax), 1e-8);\n}\n\n/** Packs unique 128² peak-normalized IES profiles four scalar samples per texel. */\nexport function packIESProfiles(lights: AnalyticLight[], firstTexel = 0) {\n const offsets = new Int32Array(lights.length).fill(-1);\n const profiles: IESProfile[] = [];\n const indices = new Map<IESProfile, number>();\n lights.forEach((light, index) => {\n if (light.type !== 'SpotLight' || !light.iesProfile) return;\n let profileIndex = indices.get(light.iesProfile);\n if (profileIndex == null) {\n profileIndex = profiles.length;\n indices.set(light.iesProfile, profileIndex);\n profiles.push(light.iesProfile);\n }\n offsets[index] = firstTexel + profileIndex * ((128 * 128) / 4);\n });\n const data = new Float32Array(profiles.length * 128 * 128);\n profiles.forEach((profile, index) => data.set(profile.data, index * 128 * 128));\n return { data, offsets, texelCount: data.length / 4 };\n}\n\n// Keep the input object identity across native record-width conversions.\nconst environmentPowers = new WeakMap<object, number>();\n\nexport function estimateEnvironmentPower<T extends TexturePixelSource>(image?: T) {\n if (!image?.data || !image.width || !image.height) return 0;\n const cached = environmentPowers.get(image);\n if (cached !== undefined) return cached;\n const { data, width, height } = image;\n const power = environmentPower(data, width, height);\n environmentPowers.set(image, power);\n return power;\n}\n\n/** Reusable typed choices; insertion order matches the sampling distribution. */\nexport class LightChoiceBuffer {\n count = 0;\n sourceTypes = new Uint32Array(0);\n sourceIndices = new Uint32Array(0);\n weights = new Float64Array(0);\n reserve(capacity: number) {\n this.count = 0;\n if (this.weights.length < capacity) {\n this.sourceTypes = new Uint32Array(capacity);\n this.sourceIndices = new Uint32Array(capacity);\n this.weights = new Float64Array(capacity);\n }\n }\n push(sourceType: number, sourceIndex: number, weight: number) {\n if (!(weight > 0) || !isFinite(weight)) return;\n const i = this.count++;\n this.sourceTypes[i] = sourceType; this.sourceIndices[i] = sourceIndex; this.weights[i] = weight;\n }\n}\n\n/** Builds a Walker alias table. Each 16-byte entry is probability/alias/type/index. */\nexport function buildLightAliasTable(inputs: LightChoiceInput[] | LightChoiceBuffer): LightSamplingDistribution {\n let active: LightChoiceBuffer;\n if (!Array.isArray(inputs)) active = inputs;\n else {\n active = new LightChoiceBuffer(); active.reserve(inputs.length);\n for (const input of inputs) active.push(input.sourceType, input.sourceIndex, input.weight);\n }\n const count = active.count;\n let totalWeight = 0;\n for (let i = 0; i < count; i++) totalWeight += active.weights[i];\n if (!count || !(totalWeight > 0)) return { choices: new Uint32Array(4), pmfs: new Float32Array(0), totalWeight: 0 };\n const pmfs = new Float32Array(count);\n const scaled = new Float64Array(count);\n const small = new Uint32Array(count), large = new Uint32Array(count);\n let smallCount = 0, largeCount = 0;\n for (let i = 0; i < count; i++) {\n pmfs[i] = active.weights[i] / totalWeight;\n scaled[i] = pmfs[i] * count;\n if (scaled[i] < 1) small[smallCount++] = i; else large[largeCount++] = i;\n }\n const buffer = new ArrayBuffer(count * 16);\n const floats = new Float32Array(buffer), ints = new Int32Array(buffer);\n while (smallCount && largeCount) {\n const low = small[--smallCount] + 0, high = large[--largeCount] + 0;\n floats[low * 4] = scaled[low]; ints[low * 4 + 1] = high;\n scaled[high] = scaled[high] + scaled[low] - 1;\n if (scaled[high] < 1) small[smallCount++] = high; else large[largeCount++] = high;\n }\n for (let i = 0; i < smallCount; i++) { const index = small[i]; floats[index * 4] = 1; ints[index * 4 + 1] = index; }\n for (let i = 0; i < largeCount; i++) { const index = large[i]; floats[index * 4] = 1; ints[index * 4 + 1] = index; }\n for (let i = 0; i < count; i++) { ints[i * 4 + 2] = active.sourceTypes[i]; ints[i * 4 + 3] = active.sourceIndices[i]; }\n return { choices: new Uint32Array(buffer), pmfs, totalWeight };\n}\n\n/**\n * Builds the table a shadow catcher draws its occlusion tests from: the\n * environment and analytic lights of `choices` at their relative weights.\n * Emissive meshes are scene objects, not light already present in the plate\n * the catcher darkens, so their occlusion is not catcher shadow. Returns\n * `undefined` when `choices` holds no emissive triangle and the catcher can\n * share the main table.\n */\nexport function buildShadowCatcherLightAliasTable(\n choices: LightChoiceBuffer,\n scratch = new LightChoiceBuffer()\n): LightSamplingDistribution | undefined {\n let emissive = 0;\n for (let i = 0; i < choices.count; i++) {\n if (choices.sourceTypes[i] === LIGHT_CHOICE_EMISSIVE_TRIANGLE) emissive++;\n }\n if (!emissive) return undefined;\n scratch.reserve(choices.count - emissive);\n for (let i = 0; i < choices.count; i++) {\n if (choices.sourceTypes[i] !== LIGHT_CHOICE_EMISSIVE_TRIANGLE) {\n scratch.push(choices.sourceTypes[i], choices.sourceIndices[i], choices.weights[i]);\n }\n }\n return buildLightAliasTable(scratch);\n}\n\nfunction dominantLocalMaterial(geometry: Geometry, indices: Uint32Array, triangleOffset: number, materialCount: number) {\n // Public triangles have the same raw material index on all three corners.\n return localMaterialIndex(geometry, indices[triangleOffset], materialCount);\n}\n\nexport function collectEmissiveTriangles(\n bindings: EmissiveMeshBinding[],\n materials: OpenPBRMaterial[]\n) {\n const triangles: EmissiveTriangle[] = [];\n const local = [vec3.create(), vec3.create(), vec3.create()];\n const world = [vec3.create(), vec3.create(), vec3.create()];\n const edge0 = vec3.create();\n const edge1 = vec3.create();\n const cross = vec3.create();\n\n for (const { mesh, geometry, materialIndices } of bindings) {\n // Emission is constant during this synchronous collection. Compute it once\n // per local material table instead of allocating an RGB array per triangle.\n const samplingLuminances: number[] = [];\n for (let local = 0; local < Math.max(1, materialIndices.length); local++) {\n const material = materials[materialIndices[local] ?? materialIndices[0] ?? 0];\n samplingLuminances.push(!material || material.shadowCatcher || material.unlit\n ? 0 : colorLuminance(materialEmission(material)));\n }\n const matrix = new Float64Array(16), parent = matrixStorage(mesh.transform);\n for (let instance = 0; instance < meshInstanceCount(mesh); instance++) {\n meshInstanceTransform(mesh, instance, matrix, parent);\n const indices = geometry.indexArray;\n const positions = geometry.position.array;\n const uvs = geometry.uv?.array;\n const secondaryUvs = geometry.uv1?.array ?? uvs;\n for (let triangleOffset = 0; triangleOffset < attributeLength(indices); triangleOffset += 3) {\n const localMaterialIndex = dominantLocalMaterial(geometry, indices, triangleOffset, materialIndices.length);\n const materialIndex = materialIndices[localMaterialIndex] ?? materialIndices[0] ?? 0;\n const samplingLuminance = samplingLuminances[localMaterialIndex];\n if (!(samplingLuminance > 1e-8)) continue;\n\n const triangleIndices = [\n attributeValue(indices, triangleOffset),\n attributeValue(indices, triangleOffset + 1),\n attributeValue(indices, triangleOffset + 2)\n ];\n for (let corner = 0; corner < 3; corner++) {\n const vertex = triangleIndices[corner];\n vec3.set(\n local[corner],\n positions[vertex * geometry.position.itemSize],\n positions[vertex * geometry.position.itemSize + 1],\n positions[vertex * geometry.position.itemSize + 2]\n );\n vec3.transformMat4(world[corner], local[corner], matrix);\n }\n vec3.sub(edge0, world[1], world[0]);\n vec3.sub(edge1, world[2], world[0]);\n vec3.cross(cross, edge0, edge1);\n const area = 0.5 * vec3.length(cross);\n if (!(area > 1e-10) || !isFinite(area)) continue;\n\n const triangleUvs = triangleIndices.map((vertex) =>\n uvs\n ? [uvs[vertex * 2], uvs[vertex * 2 + 1]] as [number, number]\n : [0, 0] as [number, number]\n );\n const triangleSecondaryUvs = triangleIndices.map((vertex) =>\n secondaryUvs\n ? [secondaryUvs[vertex * 2], secondaryUvs[vertex * 2 + 1]] as [number, number]\n : [0, 0] as [number, number]\n );\n triangles.push({\n p0: vec3.clone(world[0]),\n p1: vec3.clone(world[1]),\n p2: vec3.clone(world[2]),\n uv0: triangleUvs[0],\n uv1: triangleUvs[1],\n uv2: triangleUvs[2],\n secondaryUv0: triangleSecondaryUvs[0],\n secondaryUv1: triangleSecondaryUvs[1],\n secondaryUv2: triangleSecondaryUvs[2],\n materialIndex,\n area,\n samplingLuminance,\n selectionPmf: 0\n });\n }\n }\n }\n return triangles;\n}\n\nfunction packEmissivePoint(data: Float32Array, offset: number, point: Float32Array) {\n // Preserve TypedArray.set's overlapping-view semantics for callers with aliases.\n if (data.buffer === point.buffer) {data.set(point, offset); return;}\n data[offset] = point[0]; data[offset + 1] = point[1]; data[offset + 2] = point[2];\n}\nexport function packEmissiveTriangles(triangles: EmissiveTriangle[], data: Float32Array = new Float32Array(Math.max(triangles.length, 1) * 24)) {\n triangles.forEach((triangle, index) => {\n const offset = index * 24;\n packEmissivePoint(data, offset, triangle.p0);\n data[offset + 3] = triangle.selectionPmf;\n packEmissivePoint(data, offset + 4, triangle.p1);\n data[offset + 7] = triangle.area;\n packEmissivePoint(data, offset + 8, triangle.p2);\n data[offset + 11] = triangle.materialIndex;\n data[offset + 12] = triangle.uv0[0]; data[offset + 13] = triangle.uv0[1];\n data[offset + 14] = triangle.uv1[0]; data[offset + 15] = triangle.uv1[1];\n data[offset + 16] = triangle.uv2[0]; data[offset + 17] = triangle.uv2[1];\n data[offset + 18] = triangle.secondaryUv0[0]; data[offset + 19] = triangle.secondaryUv0[1];\n data[offset + 20] = triangle.secondaryUv1[0]; data[offset + 21] = triangle.secondaryUv1[1];\n data[offset + 22] = triangle.secondaryUv2[0]; data[offset + 23] = triangle.secondaryUv2[1];\n });\n return data;\n}\n\n\ninterface EmissiveCacheEntry { geometry: Geometry; version: number; instanceVersion: number; instanceCount: number; instanceTransforms?: Float32Array; matrix: Float64Array;\n indices: number[]; activity: boolean[]; triangles: EmissiveTriangle[] }\n\n// WeakMap class fields have no native representation in scriptc 0.3.2.\n// Keep the same per-cache weak ownership in a module-owned registry.\nconst emissiveBindings = new WeakMap<EmissiveTriangleCache, WeakMap<Mesh, EmissiveCacheEntry>>();\n\n/** Caches world-space vertices per mesh, independently of emission strength. */\nexport class EmissiveTriangleCache {\n constructor() { emissiveBindings.set(this, new WeakMap()); }\n private _triangles: EmissiveTriangle[] = [];\n collect(bindings: EmissiveMeshBinding[], materials: OpenPBRMaterial[]) {\n const cachedBindings = emissiveBindings.get(this)!;\n this._triangles.length = 0;\n for (const binding of bindings) {\n const { mesh, geometry, materialIndices } = binding;\n const isActive = (index: number) => {\n const m = materials[index];\n return !!m && !m.unlit && !m.shadowCatcher && colorLuminance(materialEmission(m)) > 1e-8;\n };\n const instanceVersion = mesh.instanceData?.transformsVersion ?? 0;\n const instanceCount = meshInstanceCount(mesh);\n const instanceTransforms = mesh.instanceData?.transforms;\n let cached = cachedBindings.get(mesh);\n if (!cached || cached.geometry !== geometry || cached.version !== geometry.version || cached.instanceVersion !== instanceVersion || cached.instanceCount !== instanceCount || cached.instanceTransforms !== instanceTransforms ||\n cached.indices.length !== materialIndices.length || materialIndices.some((index, i) =>\n cached!.indices[i] !== index || cached!.activity[i] !== isActive(index)) ||\n meshMatrixChanged(mesh, cached.matrix)) {\n cached = { geometry, version: geometry.version, instanceVersion, instanceCount, instanceTransforms, matrix: copyMeshMatrix(mesh),\n indices: materialIndices.slice(), activity: materialIndices.map(isActive),\n triangles: collectEmissiveTriangles([binding], materials) };\n cachedBindings.set(mesh, cached);\n } else {\n for (const triangle of cached.triangles) {\n const m = materials[triangle.materialIndex];\n triangle.samplingLuminance = colorLuminance(materialEmission(m));\n }\n }\n for (const triangle of cached.triangles) this._triangles.push(triangle);\n }\n return this._triangles;\n }\n}\n\nfunction copyMeshMatrix(mesh: Mesh): Float64Array { return matrixStorage(mesh.transform); }\nfunction meshMatrixChanged(mesh: Mesh, previous: Float64Array): boolean {\n const matrix = matrixStorage(mesh.transform);\n for (let i = 0; i < matrix.length; i++) if (!Object.is(matrix[i], previous[i])) return true;\n return false;\n}\n\nfunction environmentPower(data: NonNullable<TexturePixelSource['data']>, width: number, height: number): number {\n if (data instanceof Uint8Array) return environmentPowerKernel(data, width, height, 1 / 255);\n if (data instanceof Uint8ClampedArray) return environmentPowerKernel(data, width, height, 1 / 255);\n if (data instanceof Float32Array) return environmentPowerKernel(data, width, height, 1);\n return environmentPowerKernel(data, width, height, 1);\n}\n\nfunction environmentPowerKernel<T extends NonNullable<TexturePixelSource['data']>>(data: T, width: number, height: number, scale: number): number {\n const channels = Math.max(Math.floor(pixelLength(data) / (width * height)), 1);\n let weightedLuminance = 0;\n for (let y = 0; y < height; y++) {\n const sinTheta = Math.sin(Math.PI * (y + 0.5) / height);\n for (let x = 0; x < width; x++) {\n const offset = (y * width + x) * channels;\n weightedLuminance +=\n colorLuminance([\n pixelValue(data, offset) * scale,\n pixelValue(data, offset + Math.min(1, channels - 1)) * scale,\n pixelValue(data, offset + Math.min(2, channels - 1)) * scale\n ]) * sinTheta;\n }\n }\n return weightedLuminance * (2 * Math.PI * Math.PI) / (width * height);\n}\n"]}
1
+ {"version":3,"file":"lightSampling.js","sourceRoot":"","sources":["../../src/renderer/lightSampling.ts"],"names":[],"mappings":"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","sourcesContent":["import {matrixStorage} from '../math/storage.js';\nimport { pixelLength, pixelValue } from '../scene/texturePixels.js';\nimport { materialEmission } from './materialEmission.js';\nimport { meshInstanceCount, meshInstanceTransform } from './meshInstances.js';\nimport { getRectLightArea, getSphereLightArea, getSpotLightArea, getSpotLightRadiance, getSpotLightShapingFluxFactor } from './lightsData.js';\nimport { localMaterialIndex } from './materialIndices.js';\nimport { attributeLength, attributeValue } from '../scene/attributeData.js';\nimport { type TexturePixelSource, vec3 } from '../math.js';\nimport DirectionalLight from '../scene/DirectionalLight.js';\nimport Geometry from '../scene/Geometry.js';\nimport type Mesh from '../scene/MeshState.js';\nimport type RectLight from '../scene/RectLightState.js';\nimport SphereLight from '../scene/SphereLight.js';\nimport SpotLight from '../scene/SpotLight.js';\nimport IESProfile from '../scene/IESProfile.js';\nimport type OpenPBRMaterial from '../scene/MaterialState.js';\n\nimport { LIGHT_CHOICE_EMISSIVE_TRIANGLE } from './lightConstants.js';\nexport * from './lightConstants.js';\ntype AnalyticLight = DirectionalLight | SphereLight | SpotLight | RectLight;\n\nexport interface EmissiveTriangle {\n p0: Float32Array;\n p1: Float32Array;\n p2: Float32Array;\n uv0: [number, number];\n uv1: [number, number];\n uv2: [number, number];\n secondaryUv0: [number, number];\n secondaryUv1: [number, number];\n secondaryUv2: [number, number];\n materialIndex: number;\n area: number;\n samplingLuminance: number;\n selectionPmf: number;\n}\n\nexport interface EmissiveMeshBinding {\n mesh: Mesh;\n geometry: Geometry;\n materialIndices: number[];\n}\n\nexport interface LightChoiceInput {\n sourceType: number;\n sourceIndex: number;\n weight: number;\n}\n\nexport interface LightSamplingDistribution {\n choices: Uint32Array;\n pmfs: Float32Array;\n totalWeight: number;\n}\n\nconst luminanceCoefficients = [0.2126, 0.7152, 0.0722] as const;\n\nexport function colorLuminance<T extends ArrayLike<number>>(color: T) {\n return Math.max(\n color[0] * luminanceCoefficients[0] +\n color[1] * luminanceCoefficients[1] +\n color[2] * luminanceCoefficients[2],\n 0\n );\n}\n\nexport function estimateAnalyticLightPower(light: AnalyticLight) {\n const emittedLuminance = colorLuminance(light.color) * light.intensity;\n if (!(emittedLuminance > 0)) return 0;\n if (light.type === 'RectLight') {\n return emittedLuminance * Math.PI * Math.max(getRectLightArea(light), 0);\n }\n if (light.type === 'SphereLight') {\n if (light.radius === 0) return emittedLuminance * 4 * Math.PI;\n return emittedLuminance * Math.PI * Math.max(getSphereLightArea(light), 0);\n }\n if (light.type === 'SpotLight') {\n const radianceLuminance =\n colorLuminance(light.color) * getSpotLightRadiance(light);\n // The selection power is an approximation and ignores the IES profile.\n if (light.radius === 0) {\n return emittedLuminance *\n 4 * Math.PI *\n getSpotLightShapingFluxFactor(light);\n }\n return (\n radianceLuminance *\n Math.PI *\n getSpotLightArea(light) *\n getSpotLightShapingFluxFactor(light)\n );\n }\n // A directional light has no finite emitting area. 4π keeps its heuristic\n // weight on roughly the same scale as an environment map integral.\n return emittedLuminance * 4 * Math.PI;\n}\n\nexport function sphereSolidAnglePdf(distanceToCenter: number, radius: number) {\n if (distanceToCenter <= radius) return 1 / (4 * Math.PI);\n const sinThetaMaxSquared = Math.min(1, radius * radius / (distanceToCenter * distanceToCenter));\n const cosThetaMax = Math.sqrt(Math.max(0, 1 - sinThetaMaxSquared));\n const oneMinusCosThetaMax = sinThetaMaxSquared / (1 + cosThetaMax);\n return 1 / Math.max(2 * Math.PI * oneMinusCosThetaMax, 1e-8);\n}\n\n/** Packs unique 128² peak-normalized IES profiles four scalar samples per texel. */\nexport function packIESProfiles(lights: AnalyticLight[], firstTexel = 0) {\n const offsets = new Int32Array(lights.length).fill(-1);\n const profiles: IESProfile[] = [];\n const indices = new Map<IESProfile, number>();\n lights.forEach((light, index) => {\n if (light.type !== 'SpotLight' || !light.iesProfile) return;\n let profileIndex = indices.get(light.iesProfile);\n if (profileIndex == null) {\n profileIndex = profiles.length;\n indices.set(light.iesProfile, profileIndex);\n profiles.push(light.iesProfile);\n }\n offsets[index] = firstTexel + profileIndex * ((128 * 128) / 4);\n });\n const data = new Float32Array(profiles.length * 128 * 128);\n profiles.forEach((profile, index) => data.set(profile.data, index * 128 * 128));\n return { data, offsets, texelCount: data.length / 4 };\n}\n\n// Keep the input object identity across native record-width conversions.\nconst environmentPowers = new WeakMap<object, number>();\n\nexport function estimateEnvironmentPower<T extends TexturePixelSource>(image?: T) {\n if (!image?.data || !image.width || !image.height) return 0;\n const cached = environmentPowers.get(image);\n if (cached !== undefined) return cached;\n const { data, width, height } = image;\n const power = environmentPower(data, width, height);\n environmentPowers.set(image, power);\n return power;\n}\n\n/** Reusable typed choices; insertion order matches the sampling distribution. */\nexport class LightChoiceBuffer {\n count = 0;\n sourceTypes = new Uint32Array(0);\n sourceIndices = new Uint32Array(0);\n weights = new Float64Array(0);\n reserve(capacity: number) {\n this.count = 0;\n if (this.weights.length < capacity) {\n this.sourceTypes = new Uint32Array(capacity);\n this.sourceIndices = new Uint32Array(capacity);\n this.weights = new Float64Array(capacity);\n }\n }\n push(sourceType: number, sourceIndex: number, weight: number) {\n if (!(weight > 0) || !isFinite(weight)) return;\n const i = this.count++;\n this.sourceTypes[i] = sourceType; this.sourceIndices[i] = sourceIndex; this.weights[i] = weight;\n }\n}\n\n/** Builds a Walker alias table. Each 16-byte entry is probability/alias/type/index. */\nexport function buildLightAliasTable(inputs: LightChoiceInput[] | LightChoiceBuffer): LightSamplingDistribution {\n let active: LightChoiceBuffer;\n if (!Array.isArray(inputs)) active = inputs;\n else {\n active = new LightChoiceBuffer(); active.reserve(inputs.length);\n for (const input of inputs) active.push(input.sourceType, input.sourceIndex, input.weight);\n }\n const count = active.count;\n let totalWeight = 0;\n for (let i = 0; i < count; i++) totalWeight += active.weights[i];\n if (!count || !(totalWeight > 0)) return { choices: new Uint32Array(4), pmfs: new Float32Array(0), totalWeight: 0 };\n const pmfs = new Float32Array(count);\n const scaled = new Float64Array(count);\n const small = new Uint32Array(count), large = new Uint32Array(count);\n let smallCount = 0, largeCount = 0;\n for (let i = 0; i < count; i++) {\n pmfs[i] = active.weights[i] / totalWeight;\n scaled[i] = pmfs[i] * count;\n if (scaled[i] < 1) small[smallCount++] = i; else large[largeCount++] = i;\n }\n const buffer = new ArrayBuffer(count * 16);\n const floats = new Float32Array(buffer), ints = new Int32Array(buffer);\n while (smallCount && largeCount) {\n const low = small[--smallCount] + 0, high = large[--largeCount] + 0;\n floats[low * 4] = scaled[low]; ints[low * 4 + 1] = high;\n scaled[high] = scaled[high] + scaled[low] - 1;\n if (scaled[high] < 1) small[smallCount++] = high; else large[largeCount++] = high;\n }\n for (let i = 0; i < smallCount; i++) { const index = small[i]; floats[index * 4] = 1; ints[index * 4 + 1] = index; }\n for (let i = 0; i < largeCount; i++) { const index = large[i]; floats[index * 4] = 1; ints[index * 4 + 1] = index; }\n for (let i = 0; i < count; i++) { ints[i * 4 + 2] = active.sourceTypes[i]; ints[i * 4 + 3] = active.sourceIndices[i]; }\n return { choices: new Uint32Array(buffer), pmfs, totalWeight };\n}\n\n/**\n * Builds the table a shadow catcher draws its occlusion tests from: the\n * environment and analytic lights of `choices` at their relative weights.\n * Emissive meshes are scene objects, not light already present in the plate\n * the catcher darkens, so their occlusion is not catcher shadow. Returns\n * `undefined` when `choices` holds no emissive triangle and the catcher can\n * share the main table.\n */\nexport function buildShadowCatcherLightAliasTable(\n choices: LightChoiceBuffer,\n scratch = new LightChoiceBuffer()\n): LightSamplingDistribution | undefined {\n let emissive = 0;\n for (let i = 0; i < choices.count; i++) {\n if (choices.sourceTypes[i] === LIGHT_CHOICE_EMISSIVE_TRIANGLE) emissive++;\n }\n if (!emissive) return undefined;\n scratch.reserve(choices.count - emissive);\n for (let i = 0; i < choices.count; i++) {\n if (choices.sourceTypes[i] !== LIGHT_CHOICE_EMISSIVE_TRIANGLE) {\n scratch.push(choices.sourceTypes[i], choices.sourceIndices[i], choices.weights[i]);\n }\n }\n return buildLightAliasTable(scratch);\n}\n\nfunction dominantLocalMaterial(geometry: Geometry, indices: Uint32Array, triangleOffset: number, materialCount: number) {\n // Public triangles have the same raw material index on all three corners.\n return localMaterialIndex(geometry, indices[triangleOffset], materialCount);\n}\n\nexport function collectEmissiveTriangles(\n bindings: EmissiveMeshBinding[],\n materials: OpenPBRMaterial[],\n samplingWeight?: (material:OpenPBRMaterial)=>number\n) {\n const triangles: EmissiveTriangle[] = [];\n const local = [vec3.create(), vec3.create(), vec3.create()];\n const world = [vec3.create(), vec3.create(), vec3.create()];\n const edge0 = vec3.create();\n const edge1 = vec3.create();\n const cross = vec3.create();\n\n for (const { mesh, geometry, materialIndices } of bindings) {\n // Emission is constant during this synchronous collection. Compute it once\n // per local material table instead of allocating an RGB array per triangle.\n const samplingLuminances: number[] = [];\n for (let local = 0; local < Math.max(1, materialIndices.length); local++) {\n const material = materials[materialIndices[local] ?? materialIndices[0] ?? 0];\n samplingLuminances.push(!material || material.shadowCatcher || material.unlit\n ? 0 : (samplingWeight?samplingWeight(material):colorLuminance(materialEmission(material))));\n }\n const matrix = new Float64Array(16), parent = matrixStorage(mesh.transform);\n for (let instance = 0; instance < meshInstanceCount(mesh); instance++) {\n meshInstanceTransform(mesh, instance, matrix, parent);\n const indices = geometry.indexArray;\n const positions = geometry.position.array;\n const uvs = geometry.uv?.array;\n const secondaryUvs = geometry.uv1?.array ?? uvs;\n for (let triangleOffset = 0; triangleOffset < attributeLength(indices); triangleOffset += 3) {\n const localMaterialIndex = dominantLocalMaterial(geometry, indices, triangleOffset, materialIndices.length);\n const materialIndex = materialIndices[localMaterialIndex] ?? materialIndices[0] ?? 0;\n const samplingLuminance = samplingLuminances[localMaterialIndex];\n if (!(samplingLuminance > 1e-8)) continue;\n\n const triangleIndices = [\n attributeValue(indices, triangleOffset),\n attributeValue(indices, triangleOffset + 1),\n attributeValue(indices, triangleOffset + 2)\n ];\n for (let corner = 0; corner < 3; corner++) {\n const vertex = triangleIndices[corner];\n vec3.set(\n local[corner],\n positions[vertex * geometry.position.itemSize],\n positions[vertex * geometry.position.itemSize + 1],\n positions[vertex * geometry.position.itemSize + 2]\n );\n vec3.transformMat4(world[corner], local[corner], matrix);\n }\n vec3.sub(edge0, world[1], world[0]);\n vec3.sub(edge1, world[2], world[0]);\n vec3.cross(cross, edge0, edge1);\n const area = 0.5 * vec3.length(cross);\n if (!(area > 1e-10) || !isFinite(area)) continue;\n\n const triangleUvs = triangleIndices.map((vertex) =>\n uvs\n ? [uvs[vertex * 2], uvs[vertex * 2 + 1]] as [number, number]\n : [0, 0] as [number, number]\n );\n const triangleSecondaryUvs = triangleIndices.map((vertex) =>\n secondaryUvs\n ? [secondaryUvs[vertex * 2], secondaryUvs[vertex * 2 + 1]] as [number, number]\n : [0, 0] as [number, number]\n );\n triangles.push({\n p0: vec3.clone(world[0]),\n p1: vec3.clone(world[1]),\n p2: vec3.clone(world[2]),\n uv0: triangleUvs[0],\n uv1: triangleUvs[1],\n uv2: triangleUvs[2],\n secondaryUv0: triangleSecondaryUvs[0],\n secondaryUv1: triangleSecondaryUvs[1],\n secondaryUv2: triangleSecondaryUvs[2],\n materialIndex,\n area,\n samplingLuminance,\n selectionPmf: 0\n });\n }\n }\n }\n return triangles;\n}\n\nfunction packEmissivePoint(data: Float32Array, offset: number, point: Float32Array) {\n // Preserve TypedArray.set's overlapping-view semantics for callers with aliases.\n if (data.buffer === point.buffer) {data.set(point, offset); return;}\n data[offset] = point[0]; data[offset + 1] = point[1]; data[offset + 2] = point[2];\n}\nexport function packEmissiveTriangles(triangles: EmissiveTriangle[], data: Float32Array = new Float32Array(Math.max(triangles.length, 1) * 24)) {\n triangles.forEach((triangle, index) => {\n const offset = index * 24;\n packEmissivePoint(data, offset, triangle.p0);\n data[offset + 3] = triangle.selectionPmf;\n packEmissivePoint(data, offset + 4, triangle.p1);\n data[offset + 7] = triangle.area;\n packEmissivePoint(data, offset + 8, triangle.p2);\n data[offset + 11] = triangle.materialIndex;\n data[offset + 12] = triangle.uv0[0]; data[offset + 13] = triangle.uv0[1];\n data[offset + 14] = triangle.uv1[0]; data[offset + 15] = triangle.uv1[1];\n data[offset + 16] = triangle.uv2[0]; data[offset + 17] = triangle.uv2[1];\n data[offset + 18] = triangle.secondaryUv0[0]; data[offset + 19] = triangle.secondaryUv0[1];\n data[offset + 20] = triangle.secondaryUv1[0]; data[offset + 21] = triangle.secondaryUv1[1];\n data[offset + 22] = triangle.secondaryUv2[0]; data[offset + 23] = triangle.secondaryUv2[1];\n });\n return data;\n}\n\n\ninterface EmissiveCacheEntry { geometry: Geometry; version: number; instanceVersion: number; instanceCount: number; instanceTransforms?: Float32Array; matrix: Float64Array;\n indices: number[]; activity: boolean[]; triangles: EmissiveTriangle[] }\n\n// WeakMap class fields have no native representation in scriptc 0.3.2.\n// Keep the same per-cache weak ownership in a module-owned registry.\nconst emissiveBindings = new WeakMap<EmissiveTriangleCache, WeakMap<Mesh, EmissiveCacheEntry>>();\n\n/** Caches world-space vertices per mesh, independently of emission strength. */\nexport class EmissiveTriangleCache {\n constructor(private readonly samplingWeight?:(material:OpenPBRMaterial)=>number) { emissiveBindings.set(this, new WeakMap()); }\n private _triangles: EmissiveTriangle[] = [];\n collect(bindings: EmissiveMeshBinding[], materials: OpenPBRMaterial[]) {\n const cachedBindings = emissiveBindings.get(this)!;\n this._triangles.length = 0;\n for (const binding of bindings) {\n const { mesh, geometry, materialIndices } = binding;\n const isActive = (index: number) => {\n const m = materials[index];\n return !!m && !m.unlit && !m.shadowCatcher && (this.samplingWeight?this.samplingWeight(m):colorLuminance(materialEmission(m))) > 1e-8;\n };\n const instanceVersion = mesh.instanceData?.transformsVersion ?? 0;\n const instanceCount = meshInstanceCount(mesh);\n const instanceTransforms = mesh.instanceData?.transforms;\n let cached = cachedBindings.get(mesh);\n if (!cached || cached.geometry !== geometry || cached.version !== geometry.version || cached.instanceVersion !== instanceVersion || cached.instanceCount !== instanceCount || cached.instanceTransforms !== instanceTransforms ||\n cached.indices.length !== materialIndices.length || materialIndices.some((index, i) =>\n cached!.indices[i] !== index || cached!.activity[i] !== isActive(index)) ||\n meshMatrixChanged(mesh, cached.matrix)) {\n cached = { geometry, version: geometry.version, instanceVersion, instanceCount, instanceTransforms, matrix: copyMeshMatrix(mesh),\n indices: materialIndices.slice(), activity: materialIndices.map(isActive),\n triangles: collectEmissiveTriangles([binding], materials,this.samplingWeight) };\n cachedBindings.set(mesh, cached);\n } else {\n for (const triangle of cached.triangles) {\n const m = materials[triangle.materialIndex];\n triangle.samplingLuminance = this.samplingWeight?this.samplingWeight(m):colorLuminance(materialEmission(m));\n }\n }\n for (const triangle of cached.triangles) this._triangles.push(triangle);\n }\n return this._triangles;\n }\n}\n\nfunction copyMeshMatrix(mesh: Mesh): Float64Array { return matrixStorage(mesh.transform); }\nfunction meshMatrixChanged(mesh: Mesh, previous: Float64Array): boolean {\n const matrix = matrixStorage(mesh.transform);\n for (let i = 0; i < matrix.length; i++) if (!Object.is(matrix[i], previous[i])) return true;\n return false;\n}\n\nfunction environmentPower(data: NonNullable<TexturePixelSource['data']>, width: number, height: number): number {\n if (data instanceof Uint8Array) return environmentPowerKernel(data, width, height, 1 / 255);\n if (data instanceof Uint8ClampedArray) return environmentPowerKernel(data, width, height, 1 / 255);\n if (data instanceof Float32Array) return environmentPowerKernel(data, width, height, 1);\n return environmentPowerKernel(data, width, height, 1);\n}\n\nfunction environmentPowerKernel<T extends NonNullable<TexturePixelSource['data']>>(data: T, width: number, height: number, scale: number): number {\n const channels = Math.max(Math.floor(pixelLength(data) / (width * height)), 1);\n let weightedLuminance = 0;\n for (let y = 0; y < height; y++) {\n const sinTheta = Math.sin(Math.PI * (y + 0.5) / height);\n for (let x = 0; x < width; x++) {\n const offset = (y * width + x) * channels;\n weightedLuminance +=\n colorLuminance([\n pixelValue(data, offset) * scale,\n pixelValue(data, offset + Math.min(1, channels - 1)) * scale,\n pixelValue(data, offset + Math.min(2, channels - 1)) * scale\n ]) * sinTheta;\n }\n }\n return weightedLuminance * (2 * Math.PI * Math.PI) / (width * height);\n}\n"]}
@@ -1,4 +1,7 @@
1
1
  export { displayAovKind as aovChannel } from './aovDisplay.js';
2
+ import { traceSchema } from '../settings/render.js';
3
+ // Every setting that changes the traced image, including caustics.
4
+ const imageFields = Object.values(traceSchema).filter(field => field.kind === 'image').map(field => field.key);
2
5
  /** Pure consecutive-edit policy; isolated changes start final immediately. */
3
6
  export function updateProgressiveState(state, changed, active, now, idleMs) {
4
7
  const lastContinuousChange = active ? -Infinity : changed && state.previousChanged ? now : state.lastContinuousChange;
@@ -7,9 +10,7 @@ export function updateProgressiveState(state, changed, active, now, idleMs) {
7
10
  /** Public state used to leave a finished canvas idle while still noticing settings edits. */
8
11
  export function loopImageState(render, display) {
9
12
  return JSON.stringify([
10
- render.samples, render.width, render.height, render.maxSamples, render.bounces, render.clamping,
11
- render.samplingPattern, render.directLightCandidates, render.bevel, render.bevelSamples,
12
- render.dispersionWavelengths, render.alphaBlendStrategy, render.transmissiveOutputAlphaMin,
13
+ render.samples, render.width, render.height, render.maxSamples, imageFields.map(key => render[key]),
13
14
  render.resolutionScale, render.adaptiveResolution, render.denoiser, render.denoising,
14
15
  render.aovs, render.aovSamples,
15
16
  display.canvas.width, display.canvas.height, display.toneMapping, display.toneMappingExposure,
@@ -1 +1 @@
1
- {"version":3,"file":"progressiveScheduler.js","sourceRoot":"","sources":["../../src/renderer/progressiveScheduler.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,cAAc,IAAI,UAAU,EAAC,MAAM,iBAAiB,CAAC;AAK7D,8EAA8E;AAC9E,MAAM,UAAU,sBAAsB,CAAC,KAAuB,EAAE,OAAgB,EAAE,MAAe,EAAE,GAAW,EAAE,MAAc;IAC5H,MAAM,oBAAoB,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,OAAO,IAAI,KAAK,CAAC,eAAe,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,oBAAoB,CAAC;IACtH,OAAO,EAAC,eAAe,EAAE,OAAO,IAAI,CAAC,MAAM,EAAE,oBAAoB,EAAE,QAAQ,EAAE,MAAM,IAAI,GAAG,GAAG,oBAAoB,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,CAAC,EAAC,CAAC;AAC3I,CAAC;AAED,6FAA6F;AAC7F,MAAM,UAAU,cAAc,CAAC,MAAc,EAAE,OAAgB;IAC7D,OAAO,IAAI,CAAC,SAAS,CAAC;QACpB,MAAM,CAAC,OAAO,EAAE,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,UAAU,EAAE,MAAM,CAAC,OAAO,EAAE,MAAM,CAAC,QAAQ;QAC/F,MAAM,CAAC,eAAe,EAAE,MAAM,CAAC,qBAAqB,EAAE,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,YAAY;QACvF,MAAM,CAAC,qBAAqB,EAAE,MAAM,CAAC,kBAAkB,EAAE,MAAM,CAAC,0BAA0B;QAC1F,MAAM,CAAC,eAAe,EAAE,MAAM,CAAC,kBAAkB,EAAE,MAAM,CAAC,QAAQ,EAAE,MAAM,CAAC,SAAS;QACpF,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,UAAU;QAC9B,OAAO,CAAC,MAAM,CAAC,KAAK,EAAE,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,WAAW,EAAE,OAAO,CAAC,mBAAmB;QAC7F,OAAO,CAAC,QAAQ,EAAE,OAAO,CAAC,UAAU,EAAE,OAAO,CAAC,WAAW,EAAE,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,QAAQ;QACzF,OAAO,CAAC,cAAc,EAAE,OAAO,CAAC,cAAc,EAAE,OAAO,CAAC,WAAW,EAAE,OAAO,CAAC,gBAAgB;QAC7F,OAAO,CAAC,OAAO,EAAE,OAAO,CAAC,kBAAkB,EAAE,OAAO,CAAC,kBAAkB;QACvE,OAAO,CAAC,aAAa,EAAE,OAAO,CAAC,gBAAgB,EAAE,OAAO,CAAC,cAAc,EAAE,OAAO,CAAC,cAAc;KAChG,CAAC,CAAC;AACL,CAAC","sourcesContent":["export {displayAovKind as aovChannel} from './aovDisplay.js';\nimport type Render from '../Render.js';\nimport type Display from '../Display.js';\n\nexport interface ProgressiveState { previousChanged: boolean; lastContinuousChange: number; changing: boolean; }\n/** Pure consecutive-edit policy; isolated changes start final immediately. */\nexport function updateProgressiveState(state: ProgressiveState, changed: boolean, active: boolean, now: number, idleMs: number): ProgressiveState {\n const lastContinuousChange = active ? -Infinity : changed && state.previousChanged ? now : state.lastContinuousChange;\n return {previousChanged: changed && !active, lastContinuousChange, changing: active || now - lastContinuousChange < Math.max(0, idleMs)};\n}\n\n/** Public state used to leave a finished canvas idle while still noticing settings edits. */\nexport function loopImageState(render: Render, display: Display): string {\n return JSON.stringify([\n render.samples, render.width, render.height, render.maxSamples, render.bounces, render.clamping,\n render.samplingPattern, render.directLightCandidates, render.bevel, render.bevelSamples,\n render.dispersionWavelengths, render.alphaBlendStrategy, render.transmissiveOutputAlphaMin,\n render.resolutionScale, render.adaptiveResolution, render.denoiser, render.denoising,\n render.aovs, render.aovSamples,\n display.canvas.width, display.canvas.height, display.toneMapping, display.toneMappingExposure,\n display.contrast, display.saturation, display.temperature, display.tint, display.vignette,\n display.bloomIntensity, display.bloomThreshold, display.bloomRadius, display.hdrOutputEnabled,\n display.channel, display.shadowCatcherColor, display.shadowCatcherAlpha,\n display.aovDepthRange, display.aovPositionScale, display.aovMotionScale, display.aovIdComponent,\n ]);\n}\n"]}
1
+ {"version":3,"file":"progressiveScheduler.js","sourceRoot":"","sources":["../../src/renderer/progressiveScheduler.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,cAAc,IAAI,UAAU,EAAC,MAAM,iBAAiB,CAAC;AAG7D,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AAEpD,mEAAmE;AACnE,MAAM,WAAW,GAAG,MAAM,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,IAAI,KAAK,OAAO,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;AAG/G,8EAA8E;AAC9E,MAAM,UAAU,sBAAsB,CAAC,KAAuB,EAAE,OAAgB,EAAE,MAAe,EAAE,GAAW,EAAE,MAAc;IAC5H,MAAM,oBAAoB,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,OAAO,IAAI,KAAK,CAAC,eAAe,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,oBAAoB,CAAC;IACtH,OAAO,EAAC,eAAe,EAAE,OAAO,IAAI,CAAC,MAAM,EAAE,oBAAoB,EAAE,QAAQ,EAAE,MAAM,IAAI,GAAG,GAAG,oBAAoB,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,CAAC,EAAC,CAAC;AAC3I,CAAC;AAED,6FAA6F;AAC7F,MAAM,UAAU,cAAc,CAAC,MAAc,EAAE,OAAgB;IAC7D,OAAO,IAAI,CAAC,SAAS,CAAC;QACpB,MAAM,CAAC,OAAO,EAAE,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,UAAU,EAAE,WAAW,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QACnG,MAAM,CAAC,eAAe,EAAE,MAAM,CAAC,kBAAkB,EAAE,MAAM,CAAC,QAAQ,EAAE,MAAM,CAAC,SAAS;QACpF,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,UAAU;QAC9B,OAAO,CAAC,MAAM,CAAC,KAAK,EAAE,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,WAAW,EAAE,OAAO,CAAC,mBAAmB;QAC7F,OAAO,CAAC,QAAQ,EAAE,OAAO,CAAC,UAAU,EAAE,OAAO,CAAC,WAAW,EAAE,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,QAAQ;QACzF,OAAO,CAAC,cAAc,EAAE,OAAO,CAAC,cAAc,EAAE,OAAO,CAAC,WAAW,EAAE,OAAO,CAAC,gBAAgB;QAC7F,OAAO,CAAC,OAAO,EAAE,OAAO,CAAC,kBAAkB,EAAE,OAAO,CAAC,kBAAkB;QACvE,OAAO,CAAC,aAAa,EAAE,OAAO,CAAC,gBAAgB,EAAE,OAAO,CAAC,cAAc,EAAE,OAAO,CAAC,cAAc;KAChG,CAAC,CAAC;AACL,CAAC","sourcesContent":["export {displayAovKind as aovChannel} from './aovDisplay.js';\nimport type Render from '../Render.js';\nimport type Display from '../Display.js';\nimport { traceSchema } from '../settings/render.js';\n\n// Every setting that changes the traced image, including caustics.\nconst imageFields = Object.values(traceSchema).filter(field => field.kind === 'image').map(field => field.key);\n\nexport interface ProgressiveState { previousChanged: boolean; lastContinuousChange: number; changing: boolean; }\n/** Pure consecutive-edit policy; isolated changes start final immediately. */\nexport function updateProgressiveState(state: ProgressiveState, changed: boolean, active: boolean, now: number, idleMs: number): ProgressiveState {\n const lastContinuousChange = active ? -Infinity : changed && state.previousChanged ? now : state.lastContinuousChange;\n return {previousChanged: changed && !active, lastContinuousChange, changing: active || now - lastContinuousChange < Math.max(0, idleMs)};\n}\n\n/** Public state used to leave a finished canvas idle while still noticing settings edits. */\nexport function loopImageState(render: Render, display: Display): string {\n return JSON.stringify([\n render.samples, render.width, render.height, render.maxSamples, imageFields.map(key => render[key]),\n render.resolutionScale, render.adaptiveResolution, render.denoiser, render.denoising,\n render.aovs, render.aovSamples,\n display.canvas.width, display.canvas.height, display.toneMapping, display.toneMappingExposure,\n display.contrast, display.saturation, display.temperature, display.tint, display.vignette,\n display.bloomIntensity, display.bloomThreshold, display.bloomRadius, display.hdrOutputEnabled,\n display.channel, display.shadowCatcherColor, display.shadowCatcherAlpha,\n display.aovDepthRange, display.aovPositionScale, display.aovMotionScale, display.aovIdComponent,\n ]);\n}\n"]}
@@ -15,6 +15,7 @@ export interface TraceSettings {
15
15
  bevelSamples: number;
16
16
  dispersionWavelengths: 1 | 3;
17
17
  directLightCandidates: number;
18
+ caustics?: import('../Render.js').CausticSettings;
18
19
  alphaBlendStrategy: AlphaBlendStrategy;
19
20
  samplingPattern: SamplingPattern;
20
21
  maxSamples: number;
@@ -1 +1 @@
1
- {"version":3,"file":"renderPipeline.js","sourceRoot":"","sources":["../../src/renderer/renderPipeline.ts"],"names":[],"mappings":"AAwCA,mFAAmF;AACnF,MAAM,UAAU,kBAAkB,CAChC,KAIC,EACD,MAA4B,EAC5B,KAAK,GAAG,KAAK,EACb,OAAqB;IAErB,MAAM,OAAO,GAAG,IAAI,GAAG,EAAgB,CAAC;IACxC,MAAM,QAAQ,GAAG,IAAI,GAAG,EAA+B,CAAC;IACxD,IAAI,MAAgC,CAAC;IACrC,IAAI,UAA+B,CAAC;IACpC,OAAO;QACL,oBAAoB,EAAE,GAAG,EAAE,CAAC,OAAO,EAAE,cAAc,EAAE,IAAI,CAAC;QAC1D,YAAY,CAAC,KAAK;YAChB,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC;YACzB,MAAM,MAAM,GAAiB;gBAC3B,GAAG,OAAO;gBACV,IAAI,oBAAoB,KAAK,OAAO,OAAO,CAAC,oBAAoB,CAAC,CAAC,CAAC;gBACnE,IAAI,oBAAoB,KAAK,OAAO,OAAO,CAAC,oBAAoB,CAAC,CAAC,CAAC;gBACnE,KAAK;gBACL,SAAS,CAAC,OAAO,IAAI,QAAQ,CAAC,GAAG,CAAC,MAAM,EAAE,EAAE,GAAG,OAAO,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;gBACxF,QAAQ;oBACN,MAAM,GAAG,MAAM,CAAC;oBAChB,IAAI,KAAK;wBAAE,KAAK,CAAC,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,GAAG,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;oBAC1F,OAAO,CAAC,QAAQ,EAAE,CAAC;gBACrB,CAAC;aACF,CAAC;YACF,MAAM,CAAC,qBAAqB,CAAC,UAAU,CAAC,CAAC;YACzC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;YACpB,OAAO,MAAM,CAAC;QAChB,CAAC;QACD,aAAa,CAAC,MAAM,IAAI,IAAI,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC;YAAC,QAAQ,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;YAAC,MAAM,CAAC,OAAO,EAAE,CAAC;QAAC,CAAC,CAAC,CAAC;QACpG,SAAS,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,EAAE,CAAC,KAAK,CAAC,SAAS,CAAC,MAAM,EAAE,MAAM,CAAC;QAC9D,SAAS,EAAE,MAAM,CAAC,EAAE,CAAC,KAAK,CAAC,SAAS,CAAC,MAAM,CAAC;QAC5C,aAAa,CAAC,KAAK;YACjB,UAAU,GAAG,KAAK,CAAC;YAAC,KAAK,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;YAC/C,KAAK,MAAM,MAAM,IAAI,OAAO;gBAAE,MAAM,CAAC,qBAAqB,CAAC,KAAK,CAAC,CAAC;QACpE,CAAC;QACD,qBAAqB,EAAE,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,qBAAqB,CAAC,KAAK,CAAC;QAClE,KAAK,CAAC,gBAAgB,CAAC,MAAM,EAAE,IAAI,IAAI,KAAK,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,KAAK,CAAC,gBAAgB,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;QACrH,cAAc;YACZ,OAAO,EAAE,GAAG,KAAK,CAAC,cAAc,EAAE,EAAE,GAAG,MAAM,EAAE,cAAc,EAAE,EAAE,OAAO,EAAE,KAAK,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,EAAC,KAAK,EAAE,CAAC,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,SAAS,EAAE,EAAC,CAAC,CAAC,EAAE,CAAC;QAC7I,CAAC;QACD,OAAO,KAAK,KAAK,MAAM,MAAM,IAAI,OAAO;YAAE,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC,QAAQ,CAAC,KAAK,EAAE,CAAC,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC;KACtI,CAAC;AACJ,CAAC","sourcesContent":["import type {ScratchPool} from './ScratchPool.js';\nimport type Camera from '../scene/Camera.js';\nimport type { Scene } from '../scene/Scene.js';\nimport type { SceneResources, AlphaBlendStrategy, ToneMappingParams, DisplayChannel } from './RenderingPipeline.js';\nimport type { SamplingPattern } from './sampling.js';\nimport type { TargetPipeline } from './accumulationTarget.js';\n\n/** Immutable execution settings restored before every operation on a target. */\nexport interface TraceSettings {\n aovs?: readonly import('./aov.js').AovKind[]; aovSamples?: number;\n transmissiveOutputAlphaMin: number;\n bounces: number; clamping: number; bevel: boolean; bevelSamples: number;\n dispersionWavelengths: 1 | 3; directLightCandidates: number;\n alphaBlendStrategy: AlphaBlendStrategy; samplingPattern: SamplingPattern; maxSamples: number;\n timeBudgetMs: number; maxTiles: number; batchSamples: boolean;\n}\nexport interface DisplaySettings {\n toneMapping: ToneMappingParams;\n bloom: { intensity: number; threshold: number; radius: number };\n hdrOutputEnabled: boolean; channel: DisplayChannel;\n shadowCatcherColor: [number, number, number]; shadowCatcherAlpha: number;\n}\nexport interface RenderTarget extends TargetPipeline {\n readonly label: string;\n configure(settings: TraceSettings): void;\n synchronizeBackground(background: Scene['background']): void;\n}\nexport interface RenderPipeline {\n getSharedMemoryBytes(): number;\n createTarget(label: string): RenderTarget;\n releaseTarget(target: RenderTarget): void;\n setMeshes: SceneResources['setMeshes'];\n setLights: SceneResources['setLights'];\n setBackground: SceneResources['setBackground'];\n setTextureAtlasBudget: SceneResources['setTextureAtlasBudget'];\n readDepthSamples(camera: Camera, area: Parameters<SceneResources['readDepthSamples']>[0], aspect?: number): ReturnType<SceneResources['readDepthSamples']>;\n getDiagnostics(): ReturnType<SceneResources['getDiagnostics']>;\n dispose(): void;\n}\n\n/** Shared scene ownership; every image operation explicitly selects its target. */\nexport function makeRenderPipeline(\n scene: Pick<RenderPipeline, 'setMeshes' | 'setLights' | 'setBackground' | 'setTextureAtlasBudget' | 'getDiagnostics' | 'dispose'> & {\n setCamera(camera: Camera): void;\n readDepthSamples(area: Parameters<SceneResources['readDepthSamples']>[0], aspect?: number): ReturnType<SceneResources['readDepthSamples']>;\n setBounce(bounces: number): boolean;\n },\n create: () => TargetPipeline,\n webgl = false,\n scratch?: ScratchPool\n): RenderPipeline {\n const targets = new Set<RenderTarget>();\n const settings = new Map<RenderTarget, TraceSettings>();\n let latest: RenderTarget | undefined;\n let background: Scene['background'];\n return {\n getSharedMemoryBytes: () => scratch?.getMemoryBytes() ?? 0,\n createTarget(label) {\n const backend = create();\n const target: RenderTarget = {\n ...backend,\n get presentationComplete() { return backend.presentationComplete; },\n get presentationDenoised() { return backend.presentationDenoised; },\n label,\n configure(options) { settings.set(target, { ...options }); backend.configure(options); },\n activate() {\n latest = target;\n if (webgl) scene.setBounce(Math.max(1, ...Array.from(settings.values(), s => s.bounces)));\n backend.activate();\n }\n };\n target.synchronizeBackground(background);\n targets.add(target);\n return target;\n },\n releaseTarget(target) { if (targets.delete(target)) { settings.delete(target); target.dispose(); } },\n setMeshes: (meshes, update) => scene.setMeshes(meshes, update),\n setLights: lights => scene.setLights(lights),\n setBackground(value) {\n background = value; scene.setBackground(value);\n for (const target of targets) target.synchronizeBackground(value);\n },\n setTextureAtlasBudget: bytes => scene.setTextureAtlasBudget(bytes),\n async readDepthSamples(camera, area) { scene.setCamera(camera); return scene.readDepthSamples(area, camera.aspect); },\n getDiagnostics() {\n return { ...scene.getDiagnostics(), ...latest?.getDiagnostics(), targets: Array.from(targets, t => ({label: t.label, ...t.getMemory()})) };\n },\n dispose() { for (const target of targets) target.dispose(); targets.clear(); settings.clear(); scene.dispose(); scratch?.dispose(); }\n };\n}\n"]}
1
+ {"version":3,"file":"renderPipeline.js","sourceRoot":"","sources":["../../src/renderer/renderPipeline.ts"],"names":[],"mappings":"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","sourcesContent":["import type {ScratchPool} from './ScratchPool.js';\nimport type Camera from '../scene/Camera.js';\nimport type { Scene } from '../scene/Scene.js';\nimport type { SceneResources, AlphaBlendStrategy, ToneMappingParams, DisplayChannel } from './RenderingPipeline.js';\nimport type { SamplingPattern } from './sampling.js';\nimport type { TargetPipeline } from './accumulationTarget.js';\n\n/** Immutable execution settings restored before every operation on a target. */\nexport interface TraceSettings {\n aovs?: readonly import('./aov.js').AovKind[]; aovSamples?: number;\n transmissiveOutputAlphaMin: number;\n bounces: number; clamping: number; bevel: boolean; bevelSamples: number;\n dispersionWavelengths: 1 | 3; directLightCandidates: number;\n caustics?: import('../Render.js').CausticSettings;\n alphaBlendStrategy: AlphaBlendStrategy; samplingPattern: SamplingPattern; maxSamples: number;\n timeBudgetMs: number; maxTiles: number; batchSamples: boolean;\n}\nexport interface DisplaySettings {\n toneMapping: ToneMappingParams;\n bloom: { intensity: number; threshold: number; radius: number };\n hdrOutputEnabled: boolean; channel: DisplayChannel;\n shadowCatcherColor: [number, number, number]; shadowCatcherAlpha: number;\n}\nexport interface RenderTarget extends TargetPipeline {\n readonly label: string;\n configure(settings: TraceSettings): void;\n synchronizeBackground(background: Scene['background']): void;\n}\nexport interface RenderPipeline {\n getSharedMemoryBytes(): number;\n createTarget(label: string): RenderTarget;\n releaseTarget(target: RenderTarget): void;\n setMeshes: SceneResources['setMeshes'];\n setLights: SceneResources['setLights'];\n setBackground: SceneResources['setBackground'];\n setTextureAtlasBudget: SceneResources['setTextureAtlasBudget'];\n readDepthSamples(camera: Camera, area: Parameters<SceneResources['readDepthSamples']>[0], aspect?: number): ReturnType<SceneResources['readDepthSamples']>;\n getDiagnostics(): ReturnType<SceneResources['getDiagnostics']>;\n dispose(): void;\n}\n\n/** Shared scene ownership; every image operation explicitly selects its target. */\nexport function makeRenderPipeline(\n scene: Pick<RenderPipeline, 'setMeshes' | 'setLights' | 'setBackground' | 'setTextureAtlasBudget' | 'getDiagnostics' | 'dispose'> & {\n setCamera(camera: Camera): void;\n readDepthSamples(area: Parameters<SceneResources['readDepthSamples']>[0], aspect?: number): ReturnType<SceneResources['readDepthSamples']>;\n setBounce(bounces: number): boolean;\n },\n create: () => TargetPipeline,\n webgl = false,\n scratch?: ScratchPool\n): RenderPipeline {\n const targets = new Set<RenderTarget>();\n const settings = new Map<RenderTarget, TraceSettings>();\n let latest: RenderTarget | undefined;\n let background: Scene['background'];\n return {\n getSharedMemoryBytes: () => scratch?.getMemoryBytes() ?? 0,\n createTarget(label) {\n const backend = create();\n const target: RenderTarget = {\n ...backend,\n get presentationComplete() { return backend.presentationComplete; },\n get presentationDenoised() { return backend.presentationDenoised; },\n label,\n configure(options) { settings.set(target, { ...options }); backend.configure(options); },\n activate() {\n latest = target;\n if (webgl) scene.setBounce(Math.max(1, ...Array.from(settings.values(), s => s.bounces)));\n backend.activate();\n }\n };\n target.synchronizeBackground(background);\n targets.add(target);\n return target;\n },\n releaseTarget(target) { if (targets.delete(target)) { settings.delete(target); target.dispose(); } },\n setMeshes: (meshes, update) => scene.setMeshes(meshes, update),\n setLights: lights => scene.setLights(lights),\n setBackground(value) {\n background = value; scene.setBackground(value);\n for (const target of targets) target.synchronizeBackground(value);\n },\n setTextureAtlasBudget: bytes => scene.setTextureAtlasBudget(bytes),\n async readDepthSamples(camera, area) { scene.setCamera(camera); return scene.readDepthSamples(area, camera.aspect); },\n getDiagnostics() {\n return { ...scene.getDiagnostics(), ...latest?.getDiagnostics(), targets: Array.from(targets, t => ({label: t.label, ...t.getMemory()})) };\n },\n dispose() { for (const target of targets) target.dispose(); targets.clear(); settings.clear(); scene.dispose(); scratch?.dispose(); }\n };\n}\n"]}
@@ -0,0 +1,31 @@
1
+ import type { ShaderMixin } from './shader.js';
2
+ /** Optional transport experiment. Production entry points never import its implementation. */
3
+ export interface ResearchShaderParts {
4
+ enabled: boolean;
5
+ maxDepth: number;
6
+ debugGroup: number;
7
+ declarations: string;
8
+ contribution: string;
9
+ debugOutput: string;
10
+ mixin?: ShaderMixin;
11
+ fragments?: Record<string, string>;
12
+ }
13
+ export interface ResearchPassState {
14
+ debugGroup: number;
15
+ enabled: boolean;
16
+ key: string;
17
+ workgroupSize: number;
18
+ features: object;
19
+ uniform: object;
20
+ }
21
+ export interface ResearchTransport {
22
+ compute(options: object): ResearchShaderParts;
23
+ fragment(options: readonly unknown[]): ResearchShaderParts;
24
+ constants(constants: Record<string, boolean | number>, features: object): Record<string, boolean | number>;
25
+ configure(pass: object, backend: 'webgpu' | 'webgl'): ResearchPassState;
26
+ prepare(pass: object, backend: 'webgpu' | 'webgl', lighting?: unknown): void;
27
+ capture(pass: object): void;
28
+ dispose(pass: object, backend: 'webgpu' | 'webgl'): void;
29
+ packUniform(data: ArrayBuffer, options: object): void;
30
+ }
31
+ export declare function researchTransport(): ResearchTransport | undefined;
@@ -0,0 +1,5 @@
1
+ let extension;
2
+ /** @internal Registers an explicitly imported experiment; call before allocating renders. */
3
+ export function registerResearchTransport(value) { extension = value; }
4
+ export function researchTransport() { return extension; }
5
+ //# sourceMappingURL=researchTransport.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"researchTransport.js","sourceRoot":"","sources":["../../src/renderer/researchTransport.ts"],"names":[],"mappings":"AA+BA,IAAI,SAAwC,CAAC;AAC7C,6FAA6F;AAC7F,MAAM,UAAU,yBAAyB,CAAC,KAAoC,IAAU,SAAS,GAAG,KAAK,CAAC,CAAC,CAAC;AAC5G,MAAM,UAAU,iBAAiB,KAAoC,OAAO,SAAS,CAAC,CAAC,CAAC","sourcesContent":["import type {ShaderMixin} from './shader.js';\n\n/** Optional transport experiment. Production entry points never import its implementation. */\nexport interface ResearchShaderParts {\n enabled: boolean;\n maxDepth: number;\n debugGroup: number;\n declarations: string;\n contribution: string;\n debugOutput: string;\n mixin?: ShaderMixin;\n fragments?: Record<string, string>;\n}\nexport interface ResearchPassState {\n debugGroup: number;\n enabled: boolean;\n key: string;\n workgroupSize: number;\n features: object;\n uniform: object;\n}\nexport interface ResearchTransport {\n compute(options: object): ResearchShaderParts;\n fragment(options: readonly unknown[]): ResearchShaderParts;\n constants(constants: Record<string, boolean | number>, features: object): Record<string, boolean | number>;\n configure(pass: object, backend: 'webgpu' | 'webgl'): ResearchPassState;\n prepare(pass: object, backend: 'webgpu' | 'webgl', lighting?: unknown): void;\n capture(pass: object): void;\n dispose(pass: object, backend: 'webgpu' | 'webgl'): void;\n packUniform(data: ArrayBuffer, options: object): void;\n}\nlet extension: ResearchTransport | undefined;\n/** @internal Registers an explicitly imported experiment; call before allocating renders. */\nexport function registerResearchTransport(value: ResearchTransport | undefined): void { extension = value; }\nexport function researchTransport(): ResearchTransport | undefined { return extension; }\n"]}
@@ -3,6 +3,7 @@ export declare const protocolVersions: {
3
3
  SCENE: number;
4
4
  RESOURCE_PACKET: number;
5
5
  RESOURCE_WRITES: number;
6
+ TARGET_PACKET: number;
6
7
  GEOMETRY_KERNELS: number;
7
8
  };
8
9
  export declare function sceneRecords(): {
@@ -13,7 +13,7 @@ function record(fields) {
13
13
  // One source for native wire records, resource identities and shared WebGPU
14
14
  // bindings. Descriptor offsets are u32 words; uniform offsets are bytes.
15
15
  export const WORD_BYTES = 4;
16
- export const protocolVersions = { SCENE: 4, RESOURCE_PACKET: 1, RESOURCE_WRITES: 3, GEOMETRY_KERNELS: 1 };
16
+ export const protocolVersions = { SCENE: 4, RESOURCE_PACKET: 1, RESOURCE_WRITES: 3, TARGET_PACKET: 4, GEOMETRY_KERNELS: 1 };
17
17
  export function sceneRecords() {
18
18
  return {
19
19
  HEADER: record([field('VERSION'), field('LENGTH'), field('WIDTH'), field('HEIGHT'),
@@ -39,7 +39,7 @@ export function sceneRecords() {
39
39
  EXTENSION: record([field('ID'), field('X'), field('Y'), field('Z')]),
40
40
  SETTINGS: record([field('STRUCT_SIZE'), field('SAMPLING_PATTERN'), field('SEED'), field('MAX_SAMPLES'),
41
41
  field('BOUNCES', 2), field('DIRECT_LIGHT_CANDIDATES', 2), field('BEVEL_SAMPLES', 2), field('CLAMPING', 2),
42
- field('TRANSMISSIVE_ALPHA_MIN', 2), field('SEQUENCE_OFFSET'), field('VARIANTS')]),
42
+ field('TRANSMISSIVE_ALPHA_MIN', 2), field('SEQUENCE_OFFSET'), field('VARIANTS'), field('CAUSTIC_FLAGS'), field('LIGHT_PHOTONS'), field('PHOTON_MAP_PHOTONS'), field('PHOTON_MAP_RADIUS')]),
43
43
  WRITE_ENTRY: record([field('ID'), field('KIND'), field('LENGTH'), field('DESTINATION'), field('WIDTH'), field('HEIGHT'), field('FORMAT'), field('BYTE_OFFSET')]),
44
44
  GEOMETRY_KERNEL_HEADER: record([field('VERSION'), field('COUNT'), field('LENGTH'), field('RESERVED')]),
45
45
  GEOMETRY_KERNEL_ENTRY: record([field('SOURCE'), field('VERTEX_COUNT'), field('BOUNDS'), field('TANGENTS')]),
@@ -1 +1 @@
1
- {"version":3,"file":"sceneLayoutSchema.js","sourceRoot":"","sources":["../../src/renderer/sceneLayoutSchema.ts"],"names":[],"mappings":"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","sourcesContent":["import {makeRayTraceUniform} from './wgpuSceneUniform.js';\n\ntype Field = readonly [string, number];\nconst field = (name: string, words = 1): Field => [name, words];\nfunction record(fields: Field[]): Record<string, number> {\n let words = 0;\n const offsets: Record<string, number> = {};\n for (const [name, length] of fields) { offsets[name] = words; words += length; }\n offsets.WORDS = words;\n return offsets;\n}\n\n// One source for native wire records, resource identities and shared WebGPU\n// bindings. Descriptor offsets are u32 words; uniform offsets are bytes.\nexport const WORD_BYTES = 4;\nexport const protocolVersions = {SCENE: 4, RESOURCE_PACKET: 1, RESOURCE_WRITES: 3, GEOMETRY_KERNELS: 1};\nexport function sceneRecords() { return {\n HEADER: record([field('VERSION'), field('LENGTH'), field('WIDTH'), field('HEIGHT'),\n field('GEOMETRY_COUNT'), field('MESH_COUNT'), field('MATERIAL_COUNT'), field('LIGHT_COUNT'), field('TEXTURE_COUNT'),\n field('GEOMETRY_OFFSET'), field('MESH_OFFSET'), field('MATERIAL_OFFSET'), field('LIGHT_OFFSET'), field('TEXTURE_OFFSET'),\n field('CAMERA_OFFSET'), field('RESERVED'), field('BACKGROUND_COLOR', 4), field('ENVIRONMENT_TEXTURE'),\n field('BACKGROUND_TEXTURE'), field('QUALITY_FLAGS'), field('BATCH_OFFSET'), field('MESH_AOV_IDS'), field('MATERIAL_AOV_IDS'), field('ENVIRONMENT_SETTINGS'), field('GROUNDED_BACKGROUND'), field('RESERVED_END', 4)]),\n GEOMETRY: record([field('VERTEX_COUNT'), field('INDEX_COUNT'), field('POSITION'), field('INDICES'), field('NORMAL'),\n field('UV'), field('UV1'), field('COLOR'), field('TANGENT'), field('MATERIAL_INDEX'), field('RESERVED', 2)]),\n MESH: record([field('GEOMETRY'), field('MATERIAL'), field('MATERIAL_TABLE'), field('MATERIAL_COUNT'), field('TRANSFORM', 16)]),\n MATERIAL: record([field('BASE_COLOR', 3), field('ROUGHNESS'), field('METALNESS'), field('TRANSMISSION'), field('IOR'),\n field('EMISSION_COLOR', 3), field('EMISSION_LUMINANCE'), field('COAT_WEIGHT'), field('COAT_ROUGHNESS'), field('OPACITY'),\n field('THIN_WALLED'), field('MAP'), field('NORMAL_MAP'), field('METALLIC_ROUGHNESS_MAP'), field('EMISSIVE_MAP'),\n field('EXTENSION_COUNT'), field('EXTENSION_OFFSET'), field('RESERVED', 3)]),\n TEXTURE: record([field('WIDTH'), field('HEIGHT'), field('STORAGE'), field('PIXELS'), field('FLIP_Y'), field('UV_CHANNEL'),\n field('UV_SCALE', 2), field('UV_OFFSET', 2), field('WRAP_S'), field('WRAP_T')]),\n LIGHT: record([field('TYPE'), field('COLOR', 3), field('INTENSITY'), field('SIZE'), field('HEIGHT_OR_INNER'),\n field('SPREAD_OR_OUTER'), field('TEXTURE'), field('IES_OFFSET'), field('IES_BYTES'), field('RESERVED'), field('TRANSFORM', 16)]),\n CAMERA: record([field('PROJECTION'), field('FOV'), field('NEAR'), field('FAR'), field('LEFT'), field('RIGHT'), field('BOTTOM'),\n field('TOP'), field('ZOOM'), field('F_STOP'), field('FOCUS_DISTANCE'), field('SENSOR_HEIGHT'), field('METERS_PER_UNIT'),\n field('RESERVED', 3), field('TRANSFORM', 16)]),\n BATCH: record([field('COUNT'), field('TRANSFORMS'), field('COLORS'), field('RESERVED')]),\n EXTENSION: record([field('ID'), field('X'), field('Y'), field('Z')]),\n SETTINGS: record([field('STRUCT_SIZE'), field('SAMPLING_PATTERN'), field('SEED'), field('MAX_SAMPLES'),\n field('BOUNCES', 2), field('DIRECT_LIGHT_CANDIDATES', 2), field('BEVEL_SAMPLES', 2), field('CLAMPING', 2),\n field('TRANSMISSIVE_ALPHA_MIN', 2), field('SEQUENCE_OFFSET'), field('VARIANTS')]),\n WRITE_ENTRY: record([field('ID'), field('KIND'), field('LENGTH'), field('DESTINATION'), field('WIDTH'), field('HEIGHT'), field('FORMAT'), field('BYTE_OFFSET')]),\n GEOMETRY_KERNEL_HEADER: record([field('VERSION'), field('COUNT'), field('LENGTH'), field('RESERVED')]),\n GEOMETRY_KERNEL_ENTRY: record([field('SOURCE'), field('VERTEX_COUNT'), field('BOUNDS'), field('TANGENTS')]),\n PACKET_HEADER: record([field('VERSION'), field('COUNT'), field('WIDTH'), field('HEIGHT')]),\n PACKET_ENTRY: record([field('ID'), field('KIND'), field('LENGTH'), field('WIDTH'), field('HEIGHT'), field('LAYERS'), field('FORMAT'), field('BYTE_OFFSET')])\n};\n}\nexport const resourceIds = {\n AS_CHANGED_BLASES: 53,\n BVH: 1, INSTANCES: 2, ATTRIBUTES: 3, MATERIALS: 4, MAP_INFO: 5, CAMERA: 6, TRACE_UNIFORM: 7, LIGHT_UNIFORM: 8,\n COLOR: 10, NORMAL: 11, ALBEDO: 12, SHADOW_CATCHER: 13, ATLAS: 20, ENVIRONMENT: 21, ENVIRONMENT_CDF: 22,\n BACKGROUND: 23, LIGHT_SAMPLING: 24, ENERGY_LUT: 25, DISPLACEMENT: 26, SOFTWARE_SHADER: 30, METADATA: 31,\n HWRT_SHADER: 33, HIT_SHADER: 34, INDICES: 35, SOFTWARE_PATH_SHADER: 36, HWRT_PATH_SHADER: 37,\n DISPLACEMENT_BOUNDS: 38, SOFTWARE_HIT_SHADER: 39, PRIMITIVE_IDS: 40, AS_POSITIONS: 41, AS_INDICES: 42,\n PATH_EVENTS: 50, PATH_PARAMETERS: 51, QUERY_COUNTS: 52,\n SOFTWARE_FRAME_SHADER: 54, HWRT_FRAME_SHADER: 55\n};\nexport const packetKinds = {BUFFER: 0, TEXTURE: 1, WGSL: 2, METADATA: 3};\nexport const samplerIds = {MATERIAL: 40};\nexport const textureFormats = {RGBA8_UNORM: 0, RGBA16_FLOAT: 1, RGBA32_FLOAT: 2, R32_FLOAT: 3, RG32_FLOAT: 4};\nexport const textureFormatInfo = [\n {id: textureFormats.RGBA8_UNORM, name: 'rgba8unorm', bytes: 4}, {id: textureFormats.RGBA16_FLOAT, name: 'rgba16float', bytes: 8}, {id: textureFormats.RGBA32_FLOAT, name: 'rgba32float', bytes: 16},\n {id: textureFormats.R32_FLOAT, name: 'r32float', bytes: 4}, {id: textureFormats.RG32_FLOAT, name: 'rg32float', bytes: 8}\n];\nexport const rounding = {rangeScale: 255, rangeShift: 8, rangeEpsilon: 1e-6, float32Product: true, float32Difference: true};\n\ninterface BindingSchema {name: string; resource: number; kind: 'buffer' | 'texture' | 'sampler'; layout: GPUBindGroupLayoutEntry}\nconst buffer = (name: string, resource: number, binding: number, type: GPUBufferBindingType): BindingSchema =>\n ({name, resource, kind: 'buffer', layout: {binding, visibility: 4, buffer: {type}}});\nconst texture = (name: string, resource: number, binding: number, array = false, filter = false): BindingSchema =>\n ({name, resource, kind: 'texture', layout: {binding, visibility: 4, texture: {viewDimension: array ? '2d-array' : '2d', sampleType: filter ? 'float' : 'unfilterable-float'}}});\nexport const bindGroups = [\n {name: 'SCENE', label: 'Buffers', bindings: [buffer('BVH', resourceIds.BVH, 0, 'read-only-storage'), buffer('INSTANCES', resourceIds.INSTANCES, 1, 'read-only-storage'),\n buffer('ATTRIBUTES', resourceIds.ATTRIBUTES, 2, 'read-only-storage'), buffer('MATERIALS', resourceIds.MATERIALS, 3, 'read-only-storage')]},\n {name: 'TEXTURES', label: 'Textures', bindings: [\n {name: 'SAMPLER', resource: samplerIds.MATERIAL, kind: 'sampler', layout: {binding: 0, visibility: 4, sampler: {}}} as BindingSchema,\n texture('ATLAS', resourceIds.ATLAS, 1, true, true), buffer('MAP_INFO', resourceIds.MAP_INFO, 3, 'uniform'), texture('ENVIRONMENT', resourceIds.ENVIRONMENT, 4),\n texture('ENVIRONMENT_CDF', resourceIds.ENVIRONMENT_CDF, 5), texture('BACKGROUND', resourceIds.BACKGROUND, 6), texture('LIGHT_SAMPLING', resourceIds.LIGHT_SAMPLING, 8),\n texture('ENERGY_LUT', resourceIds.ENERGY_LUT, 9), texture('DISPLACEMENT', resourceIds.DISPLACEMENT, 10)]},\n {name: 'FRAME', label: 'Uniforms', bindings: [buffer('CAMERA', resourceIds.CAMERA, 0, 'uniform'), buffer('TRACE_UNIFORM', resourceIds.TRACE_UNIFORM, 1, 'uniform'), buffer('LIGHT_UNIFORM', resourceIds.LIGHT_UNIFORM, 2, 'uniform')]},\n {name: 'OUTPUT', label: 'Ray Trace Out Buffers', bindings: [buffer('COLOR', resourceIds.COLOR, 0, 'storage'), buffer('NORMAL', resourceIds.NORMAL, 1, 'storage'), buffer('ALBEDO', resourceIds.ALBEDO, 2, 'storage'), buffer('SHADOW_CATCHER', resourceIds.SHADOW_CATCHER, 3, 'storage')]}\n];\nexport const hwrtBindings = {ACCELERATION: 4, INDICES: 5, DIAGNOSTIC: 7, PATH_PARAMETERS: 8};\nexport function rayTraceBindGroupLayouts(): GPUBindGroupLayoutDescriptor[] {\n return bindGroups.map(group => ({label: group.label, entries: group.bindings.map(binding => binding.layout)}));\n}\n\nexport function rayTraceUniformOffsets() {\nconst uniform = makeRayTraceUniform();\nconst rayTraceUniform = Object.fromEntries(Object.entries(uniform.views).map(([name, view]) =>\n [name.replace(/([a-z0-9])([A-Z])/g, '$1_$2').replace(/([A-Z])([A-Z][a-z])/g, '$1_$2').toUpperCase(), view.byteOffset]));\nrayTraceUniform.BYTES = uniform.buffer.byteLength;\nreturn rayTraceUniform;\n}\nexport const uniformSizes = {CAMERA_BYTES: 144, LIGHT_BYTES: 64 * 6 * 4 * WORD_BYTES};\n\n// The primary-surface ABI, shared by the trace hook, resolve shader and Rust.\nexport const framePixelFields = [\n ['noisyColor', 'noisy_color', 'vec4f', 'Linear HDR radiance, alpha 1.'],\n ['normalRoughness', 'normal_roughness', 'vec4f', 'Oriented world shading normal xyz, specular roughness w.'],\n ['positionDepth', 'position_depth', 'vec4f', 'World position xyz, linear camera-forward depth w.'],\n ['geometricNormal', 'geometric_normal', 'vec4f', 'Original unflipped geometric normal xyz, zero w.'],\n ['baseColorMetalness', 'base_color_metalness', 'vec4f', 'Resolved base color; not a directional diffuse reflectance.'],\n ['transmission', 'transmission', 'vec4f', 'Transmission color RGB, transmission weight w.'],\n ['roughnessIor', 'roughness_ior', 'vec4f', 'Roughness xy, incident IOR z and transmitted IOR w.'],\n ['absorption', 'absorption', 'vec4f', 'Medium extinction RGB and medium type w.'],\n ['identity', 'identity', 'vec4u', 'Publication-local instance/primitive indices, thin-wall flag, validity.'],\n ['barycentricsFace', 'barycentrics_face', 'vec4f', 'Barycentrics xy, front-face boolean z, resolved material index w.'],\n ['unclampedRadiance', 'unclamped_radiance', 'vec4f', 'Radiance before per-sample clamping, alpha 1.'],\n ['rngState', 'rng_state', 'vec4u', 'Final RNG words for reproducibility, opaque to consumers.'],\n ['rngDimensions', 'rng_dimensions', 'vec4u', 'Counter, bounce, sample index and seed.'],\n ['diffuseAlbedo', 'diffuse_albedo', 'vec4f', 'Directional reflectance RGB, zero w; REFLECTANCE validity is required.'],\n ['specularAlbedo', 'specular_albedo', 'vec4f', 'Directional reflectance RGB, zero w; REFLECTANCE validity is required.'],\n] as const;\n"]}
1
+ {"version":3,"file":"sceneLayoutSchema.js","sourceRoot":"","sources":["../../src/renderer/sceneLayoutSchema.ts"],"names":[],"mappings":"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","sourcesContent":["import {makeRayTraceUniform} from './wgpuSceneUniform.js';\n\ntype Field = readonly [string, number];\nconst field = (name: string, words = 1): Field => [name, words];\nfunction record(fields: Field[]): Record<string, number> {\n let words = 0;\n const offsets: Record<string, number> = {};\n for (const [name, length] of fields) { offsets[name] = words; words += length; }\n offsets.WORDS = words;\n return offsets;\n}\n\n// One source for native wire records, resource identities and shared WebGPU\n// bindings. Descriptor offsets are u32 words; uniform offsets are bytes.\nexport const WORD_BYTES = 4;\nexport const protocolVersions = {SCENE: 4, RESOURCE_PACKET: 1, RESOURCE_WRITES: 3,TARGET_PACKET:4, GEOMETRY_KERNELS: 1};\nexport function sceneRecords() { return {\n HEADER: record([field('VERSION'), field('LENGTH'), field('WIDTH'), field('HEIGHT'),\n field('GEOMETRY_COUNT'), field('MESH_COUNT'), field('MATERIAL_COUNT'), field('LIGHT_COUNT'), field('TEXTURE_COUNT'),\n field('GEOMETRY_OFFSET'), field('MESH_OFFSET'), field('MATERIAL_OFFSET'), field('LIGHT_OFFSET'), field('TEXTURE_OFFSET'),\n field('CAMERA_OFFSET'), field('RESERVED'), field('BACKGROUND_COLOR', 4), field('ENVIRONMENT_TEXTURE'),\n field('BACKGROUND_TEXTURE'), field('QUALITY_FLAGS'), field('BATCH_OFFSET'), field('MESH_AOV_IDS'), field('MATERIAL_AOV_IDS'), field('ENVIRONMENT_SETTINGS'), field('GROUNDED_BACKGROUND'), field('RESERVED_END', 4)]),\n GEOMETRY: record([field('VERTEX_COUNT'), field('INDEX_COUNT'), field('POSITION'), field('INDICES'), field('NORMAL'),\n field('UV'), field('UV1'), field('COLOR'), field('TANGENT'), field('MATERIAL_INDEX'), field('RESERVED', 2)]),\n MESH: record([field('GEOMETRY'), field('MATERIAL'), field('MATERIAL_TABLE'), field('MATERIAL_COUNT'), field('TRANSFORM', 16)]),\n MATERIAL: record([field('BASE_COLOR', 3), field('ROUGHNESS'), field('METALNESS'), field('TRANSMISSION'), field('IOR'),\n field('EMISSION_COLOR', 3), field('EMISSION_LUMINANCE'), field('COAT_WEIGHT'), field('COAT_ROUGHNESS'), field('OPACITY'),\n field('THIN_WALLED'), field('MAP'), field('NORMAL_MAP'), field('METALLIC_ROUGHNESS_MAP'), field('EMISSIVE_MAP'),\n field('EXTENSION_COUNT'), field('EXTENSION_OFFSET'), field('RESERVED', 3)]),\n TEXTURE: record([field('WIDTH'), field('HEIGHT'), field('STORAGE'), field('PIXELS'), field('FLIP_Y'), field('UV_CHANNEL'),\n field('UV_SCALE', 2), field('UV_OFFSET', 2), field('WRAP_S'), field('WRAP_T')]),\n LIGHT: record([field('TYPE'), field('COLOR', 3), field('INTENSITY'), field('SIZE'), field('HEIGHT_OR_INNER'),\n field('SPREAD_OR_OUTER'), field('TEXTURE'), field('IES_OFFSET'), field('IES_BYTES'), field('RESERVED'), field('TRANSFORM', 16)]),\n CAMERA: record([field('PROJECTION'), field('FOV'), field('NEAR'), field('FAR'), field('LEFT'), field('RIGHT'), field('BOTTOM'),\n field('TOP'), field('ZOOM'), field('F_STOP'), field('FOCUS_DISTANCE'), field('SENSOR_HEIGHT'), field('METERS_PER_UNIT'),\n field('RESERVED', 3), field('TRANSFORM', 16)]),\n BATCH: record([field('COUNT'), field('TRANSFORMS'), field('COLORS'), field('RESERVED')]),\n EXTENSION: record([field('ID'), field('X'), field('Y'), field('Z')]),\n SETTINGS: record([field('STRUCT_SIZE'), field('SAMPLING_PATTERN'), field('SEED'), field('MAX_SAMPLES'),\n field('BOUNCES', 2), field('DIRECT_LIGHT_CANDIDATES', 2), field('BEVEL_SAMPLES', 2), field('CLAMPING', 2),\n field('TRANSMISSIVE_ALPHA_MIN', 2), field('SEQUENCE_OFFSET'), field('VARIANTS'),field('CAUSTIC_FLAGS'),field('LIGHT_PHOTONS'),field('PHOTON_MAP_PHOTONS'),field('PHOTON_MAP_RADIUS')]),\n WRITE_ENTRY: record([field('ID'), field('KIND'), field('LENGTH'), field('DESTINATION'), field('WIDTH'), field('HEIGHT'), field('FORMAT'), field('BYTE_OFFSET')]),\n GEOMETRY_KERNEL_HEADER: record([field('VERSION'), field('COUNT'), field('LENGTH'), field('RESERVED')]),\n GEOMETRY_KERNEL_ENTRY: record([field('SOURCE'), field('VERTEX_COUNT'), field('BOUNDS'), field('TANGENTS')]),\n PACKET_HEADER: record([field('VERSION'), field('COUNT'), field('WIDTH'), field('HEIGHT')]),\n PACKET_ENTRY: record([field('ID'), field('KIND'), field('LENGTH'), field('WIDTH'), field('HEIGHT'), field('LAYERS'), field('FORMAT'), field('BYTE_OFFSET')])\n};\n}\nexport const resourceIds = {\n AS_CHANGED_BLASES: 53,\n BVH: 1, INSTANCES: 2, ATTRIBUTES: 3, MATERIALS: 4, MAP_INFO: 5, CAMERA: 6, TRACE_UNIFORM: 7, LIGHT_UNIFORM: 8,\n COLOR: 10, NORMAL: 11, ALBEDO: 12, SHADOW_CATCHER: 13, ATLAS: 20, ENVIRONMENT: 21, ENVIRONMENT_CDF: 22,\n BACKGROUND: 23, LIGHT_SAMPLING: 24, ENERGY_LUT: 25, DISPLACEMENT: 26, SOFTWARE_SHADER: 30, METADATA: 31,\n HWRT_SHADER: 33, HIT_SHADER: 34, INDICES: 35, SOFTWARE_PATH_SHADER: 36, HWRT_PATH_SHADER: 37,\n DISPLACEMENT_BOUNDS: 38, SOFTWARE_HIT_SHADER: 39, PRIMITIVE_IDS: 40, AS_POSITIONS: 41, AS_INDICES: 42,\n PATH_EVENTS: 50, PATH_PARAMETERS: 51, QUERY_COUNTS: 52,\n SOFTWARE_FRAME_SHADER: 54, HWRT_FRAME_SHADER: 55\n};\nexport const packetKinds = {BUFFER: 0, TEXTURE: 1, WGSL: 2, METADATA: 3};\nexport const samplerIds = {MATERIAL: 40};\nexport const textureFormats = {RGBA8_UNORM: 0, RGBA16_FLOAT: 1, RGBA32_FLOAT: 2, R32_FLOAT: 3, RG32_FLOAT: 4};\nexport const textureFormatInfo = [\n {id: textureFormats.RGBA8_UNORM, name: 'rgba8unorm', bytes: 4}, {id: textureFormats.RGBA16_FLOAT, name: 'rgba16float', bytes: 8}, {id: textureFormats.RGBA32_FLOAT, name: 'rgba32float', bytes: 16},\n {id: textureFormats.R32_FLOAT, name: 'r32float', bytes: 4}, {id: textureFormats.RG32_FLOAT, name: 'rg32float', bytes: 8}\n];\nexport const rounding = {rangeScale: 255, rangeShift: 8, rangeEpsilon: 1e-6, float32Product: true, float32Difference: true};\n\ninterface BindingSchema {name: string; resource: number; kind: 'buffer' | 'texture' | 'sampler'; layout: GPUBindGroupLayoutEntry}\nconst buffer = (name: string, resource: number, binding: number, type: GPUBufferBindingType): BindingSchema =>\n ({name, resource, kind: 'buffer', layout: {binding, visibility: 4, buffer: {type}}});\nconst texture = (name: string, resource: number, binding: number, array = false, filter = false): BindingSchema =>\n ({name, resource, kind: 'texture', layout: {binding, visibility: 4, texture: {viewDimension: array ? '2d-array' : '2d', sampleType: filter ? 'float' : 'unfilterable-float'}}});\nexport const bindGroups = [\n {name: 'SCENE', label: 'Buffers', bindings: [buffer('BVH', resourceIds.BVH, 0, 'read-only-storage'), buffer('INSTANCES', resourceIds.INSTANCES, 1, 'read-only-storage'),\n buffer('ATTRIBUTES', resourceIds.ATTRIBUTES, 2, 'read-only-storage'), buffer('MATERIALS', resourceIds.MATERIALS, 3, 'read-only-storage')]},\n {name: 'TEXTURES', label: 'Textures', bindings: [\n {name: 'SAMPLER', resource: samplerIds.MATERIAL, kind: 'sampler', layout: {binding: 0, visibility: 4, sampler: {}}} as BindingSchema,\n texture('ATLAS', resourceIds.ATLAS, 1, true, true), buffer('MAP_INFO', resourceIds.MAP_INFO, 3, 'uniform'), texture('ENVIRONMENT', resourceIds.ENVIRONMENT, 4),\n texture('ENVIRONMENT_CDF', resourceIds.ENVIRONMENT_CDF, 5), texture('BACKGROUND', resourceIds.BACKGROUND, 6), texture('LIGHT_SAMPLING', resourceIds.LIGHT_SAMPLING, 8),\n texture('ENERGY_LUT', resourceIds.ENERGY_LUT, 9), texture('DISPLACEMENT', resourceIds.DISPLACEMENT, 10)]},\n {name: 'FRAME', label: 'Uniforms', bindings: [buffer('CAMERA', resourceIds.CAMERA, 0, 'uniform'), buffer('TRACE_UNIFORM', resourceIds.TRACE_UNIFORM, 1, 'uniform'), buffer('LIGHT_UNIFORM', resourceIds.LIGHT_UNIFORM, 2, 'uniform')]},\n {name: 'OUTPUT', label: 'Ray Trace Out Buffers', bindings: [buffer('COLOR', resourceIds.COLOR, 0, 'storage'), buffer('NORMAL', resourceIds.NORMAL, 1, 'storage'), buffer('ALBEDO', resourceIds.ALBEDO, 2, 'storage'), buffer('SHADOW_CATCHER', resourceIds.SHADOW_CATCHER, 3, 'storage')]}\n];\nexport const hwrtBindings = {ACCELERATION: 4, INDICES: 5, DIAGNOSTIC: 7, PATH_PARAMETERS: 8};\nexport function rayTraceBindGroupLayouts(): GPUBindGroupLayoutDescriptor[] {\n return bindGroups.map(group => ({label: group.label, entries: group.bindings.map(binding => binding.layout)}));\n}\n\nexport function rayTraceUniformOffsets() {\nconst uniform = makeRayTraceUniform();\nconst rayTraceUniform = Object.fromEntries(Object.entries(uniform.views).map(([name, view]) =>\n [name.replace(/([a-z0-9])([A-Z])/g, '$1_$2').replace(/([A-Z])([A-Z][a-z])/g, '$1_$2').toUpperCase(), view.byteOffset]));\nrayTraceUniform.BYTES = uniform.buffer.byteLength;\nreturn rayTraceUniform;\n}\nexport const uniformSizes = {CAMERA_BYTES: 144, LIGHT_BYTES: 64 * 6 * 4 * WORD_BYTES};\n\n// The primary-surface ABI, shared by the trace hook, resolve shader and Rust.\nexport const framePixelFields = [\n ['noisyColor', 'noisy_color', 'vec4f', 'Linear HDR radiance, alpha 1.'],\n ['normalRoughness', 'normal_roughness', 'vec4f', 'Oriented world shading normal xyz, specular roughness w.'],\n ['positionDepth', 'position_depth', 'vec4f', 'World position xyz, linear camera-forward depth w.'],\n ['geometricNormal', 'geometric_normal', 'vec4f', 'Original unflipped geometric normal xyz, zero w.'],\n ['baseColorMetalness', 'base_color_metalness', 'vec4f', 'Resolved base color; not a directional diffuse reflectance.'],\n ['transmission', 'transmission', 'vec4f', 'Transmission color RGB, transmission weight w.'],\n ['roughnessIor', 'roughness_ior', 'vec4f', 'Roughness xy, incident IOR z and transmitted IOR w.'],\n ['absorption', 'absorption', 'vec4f', 'Medium extinction RGB and medium type w.'],\n ['identity', 'identity', 'vec4u', 'Publication-local instance/primitive indices, thin-wall flag, validity.'],\n ['barycentricsFace', 'barycentrics_face', 'vec4f', 'Barycentrics xy, front-face boolean z, resolved material index w.'],\n ['unclampedRadiance', 'unclamped_radiance', 'vec4f', 'Radiance before per-sample clamping, alpha 1.'],\n ['rngState', 'rng_state', 'vec4u', 'Final RNG words for reproducibility, opaque to consumers.'],\n ['rngDimensions', 'rng_dimensions', 'vec4u', 'Counter, bounce, sample index and seed.'],\n ['diffuseAlbedo', 'diffuse_albedo', 'vec4f', 'Directional reflectance RGB, zero w; REFLECTANCE validity is required.'],\n ['specularAlbedo', 'specular_albedo', 'vec4f', 'Directional reflectance RGB, zero w; REFLECTANCE validity is required.'],\n] as const;\n"]}
@@ -11,10 +11,10 @@ return textureLoad(${name}, pixel, level);
11
11
  ${samplers.map(sampler => /* wgsl */ `
12
12
  fn sample_${name}_${sampler}(coord: vec2f) -> vec4f {
13
13
  ${scratch ? /* wgsl */ `
14
- let kH = textureDimensions(${name});
15
- if (all(kH == ${name}Region())) { return textureSampleLevel(${name}, ${sampler}, coord, 0.0); }
14
+ let kk = textureDimensions(${name});
15
+ if (all(kk == ${name}Region())) { return textureSampleLevel(${name}, ${sampler}, coord, 0.0); }
16
16
  let pixel = clamp(coord * vec2f(${name}Region()), vec2f(0.5), vec2f(${name}Region()) - vec2f(0.5));
17
- return textureSampleLevel(${name}, ${sampler}, pixel / vec2f(kH), 0.0);`
17
+ return textureSampleLevel(${name}, ${sampler}, pixel / vec2f(kk), 0.0);`
18
18
  : `return textureSample(${name}, ${sampler}, coord);`}
19
19
  }`).join('')}`).join('');
20
20
  }
@@ -29,10 +29,10 @@ return texelFetch(${name}, pixel, level);
29
29
  }
30
30
  vec4 sample_${name}(vec2 coord) {
31
31
  ${scratch ? /* glsl */ `
32
- ivec2 kH = textureSize(${name}, 0);
33
- if (all(equal(kH, ${name}Region()))) return texture(${name}, coord);
32
+ ivec2 kk = textureSize(${name}, 0);
33
+ if (all(equal(kk, ${name}Region()))) return texture(${name}, coord);
34
34
  vec2 pixel = clamp(coord * vec2(${name}Region()), vec2(0.5), vec2(${name}Region()) - vec2(0.5));
35
- return texture(${name}, pixel / vec2(kH));`
35
+ return texture(${name}, pixel / vec2(kk));`
36
36
  : `return texture(${name}, coord);`}
37
37
  }`).join('');
38
38
  }
@@ -0,0 +1,21 @@
1
+ /**
2
+ * Continuous wavelength sampling shared by camera paths and caustic photons.
3
+ *
4
+ * CIE 1931 matching functions use the multi-lobe fit from Wyman, Sloan and
5
+ * Shirley, "Simple Analytic Approximations to the CIE XYZ Color Matching
6
+ * Functions", JCGT 2(2), 2013. Only the published formula and coefficients are
7
+ * used. Out-of-gamut negatives clamp to zero, and each channel is normalized so
8
+ * that a uniform wavelength keeps white light white.
9
+ */
10
+ export declare const SPECTRUM_WAVELENGTH_MIN = 400;
11
+ export declare const SPECTRUM_WAVELENGTH_RANGE = 300;
12
+ export declare function spectrumRgb(wavelength: number): number[];
13
+ export declare const SPECTRUM_PHOTON_DISTRIBUTION = 3;
14
+ /** Maps a unit random number to a wavelength and its probability density. */
15
+ export declare function spectrumSample(distribution: number, u: number): {
16
+ wavelength: number;
17
+ pdf: number;
18
+ };
19
+ export declare function spectrumIorWavelength(wavelength: number): number;
20
+ export declare const spectrumWgsl: string;
21
+ export declare const spectrumGlsl: string;