@meimu/mutracer 0.1.5 → 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 (590) hide show
  1. package/LICENSES/Classroom-CC0.txt +121 -0
  2. package/README.md +10 -7
  3. package/THIRD_PARTY_NOTICES.md +13 -8
  4. package/dist/assets/bvh.worker.js +1 -1
  5. package/dist/mutracer.umd.js +12316 -9228
  6. package/docs/api.md +232 -21
  7. package/docs/caustics.md +80 -0
  8. package/docs/denoising.md +30 -15
  9. package/docs/materials.md +6 -5
  10. package/docs/performance.md +5 -2
  11. package/docs/progressive-rendering.md +73 -1
  12. package/docs/technical/continuous-spectrum.md +93 -0
  13. package/docs/threejs.md +14 -5
  14. package/docs/updates.md +46 -2
  15. package/docs/viewer-checklist.md +65 -0
  16. package/docs/viewer.md +15 -8
  17. package/lib/Display.d.ts +13 -2
  18. package/lib/Display.js +28 -7
  19. package/lib/Display.js.map +1 -1
  20. package/lib/Engine.d.ts +4 -0
  21. package/lib/Engine.js +99 -37
  22. package/lib/Engine.js.map +1 -1
  23. package/lib/Render.d.ts +98 -15
  24. package/lib/Render.js +275 -27
  25. package/lib/Render.js.map +1 -1
  26. package/lib/RenderLoop.d.ts +11 -1
  27. package/lib/RenderLoop.js +120 -15
  28. package/lib/RenderLoop.js.map +1 -1
  29. package/lib/main.d.ts +6 -3
  30. package/lib/main.js +1 -0
  31. package/lib/main.js.map +1 -1
  32. package/lib/math/access.d.ts +4 -0
  33. package/lib/math/access.js +10 -0
  34. package/lib/math/access.js.map +1 -0
  35. package/lib/math/mat3.d.ts +4 -0
  36. package/lib/math/mat3.js +54 -0
  37. package/lib/math/mat3.js.map +1 -0
  38. package/lib/math/mat4.d.ts +19 -0
  39. package/lib/math/mat4.js +413 -0
  40. package/lib/math/mat4.js.map +1 -0
  41. package/lib/math/storage.d.ts +6 -0
  42. package/lib/math/storage.js +22 -0
  43. package/lib/math/storage.js.map +1 -0
  44. package/lib/math/types.d.ts +3 -0
  45. package/lib/math/types.js +2 -0
  46. package/lib/math/types.js.map +1 -0
  47. package/lib/math/vec2.d.ts +13 -0
  48. package/lib/math/vec2.js +52 -0
  49. package/lib/math/vec2.js.map +1 -0
  50. package/lib/math/vec3.d.ts +23 -0
  51. package/lib/math/vec3.js +139 -0
  52. package/lib/math/vec3.js.map +1 -0
  53. package/lib/math.d.ts +5 -17
  54. package/lib/math.js +5 -55
  55. package/lib/math.js.map +1 -1
  56. package/lib/oidn.d.ts +1 -1
  57. package/lib/oidn.js +4 -2
  58. package/lib/oidn.js.map +1 -1
  59. package/lib/oidnBundledWeights.cdn.d.ts +2 -2
  60. package/lib/renderer/AovPrimitiveCache.d.ts +10 -0
  61. package/lib/renderer/AovPrimitiveCache.js +48 -0
  62. package/lib/renderer/AovPrimitiveCache.js.map +1 -0
  63. package/lib/renderer/Box3.d.ts +5 -0
  64. package/lib/renderer/Box3.js +9 -0
  65. package/lib/renderer/Box3.js.map +1 -0
  66. package/lib/renderer/GPUTraceQueue.d.ts +11 -0
  67. package/lib/renderer/GPUTraceQueue.js +33 -0
  68. package/lib/renderer/GPUTraceQueue.js.map +1 -0
  69. package/lib/renderer/MaterialData.d.ts +15 -0
  70. package/lib/renderer/MaterialData.js +61 -0
  71. package/lib/renderer/MaterialData.js.map +1 -0
  72. package/lib/renderer/MaterialTable.d.ts +11 -98
  73. package/lib/renderer/MaterialTable.js +34 -412
  74. package/lib/renderer/MaterialTable.js.map +1 -1
  75. package/lib/renderer/RenderingPipeline.d.ts +36 -13
  76. package/lib/renderer/RenderingPipeline.js +1 -17
  77. package/lib/renderer/RenderingPipeline.js.map +1 -1
  78. package/lib/renderer/TileRender.d.ts +0 -1
  79. package/lib/renderer/TileRender.js +14 -1
  80. package/lib/renderer/TileRender.js.map +1 -1
  81. package/lib/renderer/WGPUAov.d.ts +39 -0
  82. package/lib/renderer/WGPUAov.js +239 -0
  83. package/lib/renderer/WGPUAov.js.map +1 -0
  84. package/lib/renderer/WGPUBindlessMaterialData.d.ts +17 -0
  85. package/lib/renderer/WGPUBindlessMaterialData.js +48 -0
  86. package/lib/renderer/WGPUBindlessMaterialData.js.map +1 -0
  87. package/lib/renderer/WGPUBindlessTextures.d.ts +47 -0
  88. package/lib/renderer/WGPUBindlessTextures.js +180 -0
  89. package/lib/renderer/WGPUBindlessTextures.js.map +1 -0
  90. package/lib/renderer/WGPUBloomPass.js +17 -97
  91. package/lib/renderer/WGPUBloomPass.js.map +1 -1
  92. package/lib/renderer/WGPUCausticLightPass.d.ts +48 -0
  93. package/lib/renderer/WGPUCausticLightPass.js +217 -0
  94. package/lib/renderer/WGPUCausticLightPass.js.map +1 -0
  95. package/lib/renderer/WGPUComputePass.d.ts +1 -1
  96. package/lib/renderer/WGPUComputePass.js.map +1 -1
  97. package/lib/renderer/WGPUEnvMapDistribution.d.ts +12 -0
  98. package/lib/renderer/WGPUEnvMapDistribution.js +150 -0
  99. package/lib/renderer/WGPUEnvMapDistribution.js.map +1 -0
  100. package/lib/renderer/WGPUFullQuadPass.js +10 -9
  101. package/lib/renderer/WGPUFullQuadPass.js.map +1 -1
  102. package/lib/renderer/WGPUJNLMDenoiser.d.ts +1 -20
  103. package/lib/renderer/WGPUJNLMDenoiser.js +4 -267
  104. package/lib/renderer/WGPUJNLMDenoiser.js.map +1 -1
  105. package/lib/renderer/WGPUPhotonMap.d.ts +37 -0
  106. package/lib/renderer/WGPUPhotonMap.js +191 -0
  107. package/lib/renderer/WGPUPhotonMap.js.map +1 -0
  108. package/lib/renderer/WGPURayTraceOutput.d.ts +13 -1
  109. package/lib/renderer/WGPURayTraceOutput.js +132 -29
  110. package/lib/renderer/WGPURayTraceOutput.js.map +1 -1
  111. package/lib/renderer/WGPURayTracePass.d.ts +83 -56
  112. package/lib/renderer/WGPURayTracePass.js +884 -837
  113. package/lib/renderer/WGPURayTracePass.js.map +1 -1
  114. package/lib/renderer/WGPURenderingPipeline.d.ts +5 -3
  115. package/lib/renderer/WGPURenderingPipeline.js +297 -82
  116. package/lib/renderer/WGPURenderingPipeline.js.map +1 -1
  117. package/lib/renderer/WGPUShaderCache.d.ts +2 -2
  118. package/lib/renderer/WGPUShaderCache.js +10 -5
  119. package/lib/renderer/WGPUShaderCache.js.map +1 -1
  120. package/lib/renderer/WGPUShaderCapabilities.d.ts +10 -0
  121. package/lib/renderer/WGPUShaderCapabilities.js +54 -0
  122. package/lib/renderer/WGPUShaderCapabilities.js.map +1 -0
  123. package/lib/renderer/WGPUSkyBaker.d.ts +13 -0
  124. package/lib/renderer/WGPUSkyBaker.js +85 -0
  125. package/lib/renderer/WGPUSkyBaker.js.map +1 -0
  126. package/lib/renderer/WebGLAov.d.ts +41 -0
  127. package/lib/renderer/WebGLAov.js +106 -0
  128. package/lib/renderer/WebGLAov.js.map +1 -0
  129. package/lib/renderer/WebGLFullQuadPass.d.ts +7 -4
  130. package/lib/renderer/WebGLFullQuadPass.js +22 -2
  131. package/lib/renderer/WebGLFullQuadPass.js.map +1 -1
  132. package/lib/renderer/WebGLJNLMDenoiser.d.ts +1 -1
  133. package/lib/renderer/WebGLJNLMDenoiser.js +83 -74
  134. package/lib/renderer/WebGLJNLMDenoiser.js.map +1 -1
  135. package/lib/renderer/WebGLRayTraceOutputPass.js +7 -4
  136. package/lib/renderer/WebGLRayTraceOutputPass.js.map +1 -1
  137. package/lib/renderer/WebGLRayTracePass.d.ts +18 -3
  138. package/lib/renderer/WebGLRayTracePass.js +121 -9
  139. package/lib/renderer/WebGLRayTracePass.js.map +1 -1
  140. package/lib/renderer/WebGLRenderingPipeline.js +126 -22
  141. package/lib/renderer/WebGLRenderingPipeline.js.map +1 -1
  142. package/lib/renderer/WebGLSkyBaker.d.ts +39 -0
  143. package/lib/renderer/WebGLSkyBaker.js +422 -0
  144. package/lib/renderer/WebGLSkyBaker.js.map +1 -0
  145. package/lib/renderer/WebGLSkySource.d.ts +9 -0
  146. package/lib/renderer/WebGLSkySource.js +28 -0
  147. package/lib/renderer/WebGLSkySource.js.map +1 -0
  148. package/lib/renderer/accumulationTarget.d.ts +6 -0
  149. package/lib/renderer/accumulationTarget.js.map +1 -1
  150. package/lib/renderer/aov.d.ts +42 -0
  151. package/lib/renderer/aov.js +50 -0
  152. package/lib/renderer/aov.js.map +1 -0
  153. package/lib/renderer/aovDisplay.d.ts +14 -0
  154. package/lib/renderer/aovDisplay.js +32 -0
  155. package/lib/renderer/aovDisplay.js.map +1 -0
  156. package/lib/renderer/aovScene.d.ts +21 -0
  157. package/lib/renderer/aovScene.js +139 -0
  158. package/lib/renderer/aovScene.js.map +1 -0
  159. package/lib/renderer/binnedSahBvh.js +2 -1
  160. package/lib/renderer/binnedSahBvh.js.map +1 -1
  161. package/lib/renderer/bvhAccel.d.ts +20 -10
  162. package/lib/renderer/bvhAccel.js +168 -58
  163. package/lib/renderer/bvhAccel.js.map +1 -1
  164. package/lib/renderer/bvhWorkerBuild.d.ts +1 -0
  165. package/lib/renderer/cameraSnapshot.js +2 -1
  166. package/lib/renderer/cameraSnapshot.js.map +1 -1
  167. package/lib/renderer/cameraUniform.d.ts +2 -0
  168. package/lib/renderer/cameraUniform.js +12 -0
  169. package/lib/renderer/cameraUniform.js.map +1 -0
  170. package/lib/renderer/causticDiagnostics.d.ts +31 -0
  171. package/lib/renderer/causticDiagnostics.js +5 -0
  172. package/lib/renderer/causticDiagnostics.js.map +1 -0
  173. package/lib/renderer/causticEmission.d.ts +10 -0
  174. package/lib/renderer/causticEmission.js +40 -0
  175. package/lib/renderer/causticEmission.js.map +1 -0
  176. package/lib/renderer/causticUniform.d.ts +12 -0
  177. package/lib/renderer/causticUniform.js +22 -0
  178. package/lib/renderer/causticUniform.js.map +1 -0
  179. package/lib/renderer/caustics.d.ts +16 -0
  180. package/lib/renderer/caustics.js +93 -0
  181. package/lib/renderer/caustics.js.map +1 -0
  182. package/lib/renderer/committedScene.js +4 -0
  183. package/lib/renderer/committedScene.js.map +1 -1
  184. package/lib/renderer/denoiser.d.ts +3 -11
  185. package/lib/renderer/denoiser.js.map +1 -1
  186. package/lib/renderer/depthQuery.js +4 -1
  187. package/lib/renderer/depthQuery.js.map +1 -1
  188. package/lib/renderer/displacementPreparation.d.ts +11 -0
  189. package/lib/renderer/displacementPreparation.js +351 -0
  190. package/lib/renderer/displacementPreparation.js.map +1 -0
  191. package/lib/renderer/displacementRange.d.ts +1 -0
  192. package/lib/renderer/displacementRange.js +9 -0
  193. package/lib/renderer/displacementRange.js.map +1 -0
  194. package/lib/renderer/displayParityDiagnostics.d.ts +11 -0
  195. package/lib/renderer/displayParityDiagnostics.js +2 -0
  196. package/lib/renderer/displayParityDiagnostics.js.map +1 -0
  197. package/lib/renderer/envMapCreation.d.ts +9 -8
  198. package/lib/renderer/envMapCreation.js +36 -12
  199. package/lib/renderer/envMapCreation.js.map +1 -1
  200. package/lib/renderer/envMapDistribution.d.ts +12 -2
  201. package/lib/renderer/envMapDistribution.js +43 -34
  202. package/lib/renderer/envMapDistribution.js.map +1 -1
  203. package/lib/renderer/geometryBvhBounds.d.ts +4 -0
  204. package/lib/renderer/geometryBvhBounds.js +82 -0
  205. package/lib/renderer/geometryBvhBounds.js.map +1 -0
  206. package/lib/renderer/geometryUpdateState.d.ts +32 -0
  207. package/lib/renderer/geometryUpdateState.js +2 -0
  208. package/lib/renderer/geometryUpdateState.js.map +1 -0
  209. package/lib/renderer/geometryUpdates.d.ts +17 -9
  210. package/lib/renderer/geometryUpdates.js +92 -33
  211. package/lib/renderer/geometryUpdates.js.map +1 -1
  212. package/lib/renderer/glsl/aovDisplay.frag.d.ts +3 -0
  213. package/lib/renderer/glsl/aovDisplay.frag.js +54 -0
  214. package/lib/renderer/glsl/aovDisplay.frag.js.map +1 -0
  215. package/lib/renderer/glsl/aovReflectance.glsl.d.ts +2 -0
  216. package/lib/renderer/glsl/aovReflectance.glsl.js +87 -0
  217. package/lib/renderer/glsl/aovReflectance.glsl.js.map +1 -0
  218. package/lib/renderer/glsl/aovReflectanceSamples.glsl.d.ts +2 -0
  219. package/lib/renderer/glsl/aovReflectanceSamples.glsl.js +135 -0
  220. package/lib/renderer/glsl/aovReflectanceSamples.glsl.js.map +1 -0
  221. package/lib/renderer/glsl/aovTrace.frag.d.ts +2 -0
  222. package/lib/renderer/glsl/aovTrace.frag.js +121 -0
  223. package/lib/renderer/glsl/aovTrace.frag.js.map +1 -0
  224. package/lib/renderer/glsl/chunks/cameraRay.glsl.js +12 -12
  225. package/lib/renderer/glsl/chunks/emissiveLight.glsl.d.ts +2 -0
  226. package/lib/renderer/glsl/chunks/emissiveLight.glsl.js +35 -0
  227. package/lib/renderer/glsl/chunks/emissiveLight.glsl.js.map +1 -0
  228. package/lib/renderer/glsl/chunks/envMap.glsl.js +73 -67
  229. package/lib/renderer/glsl/chunks/envMap.glsl.js.map +1 -1
  230. package/lib/renderer/glsl/chunks/intersect.glsl.js +432 -434
  231. package/lib/renderer/glsl/chunks/intersect.glsl.js.map +1 -1
  232. package/lib/renderer/glsl/chunks/materialBuffer.glsl.d.ts +1 -0
  233. package/lib/renderer/glsl/chunks/materialBuffer.glsl.js +160 -157
  234. package/lib/renderer/glsl/chunks/materialBuffer.glsl.js.map +1 -1
  235. package/lib/renderer/glsl/chunks/openPbrBsdf.glsl.js +802 -802
  236. package/lib/renderer/glsl/chunks/rand.glsl.js +3 -3
  237. package/lib/renderer/glsl/chunks/random.glsl.js +6 -6
  238. package/lib/renderer/glsl/chunks/rayTraceCore.glsl.d.ts +1 -0
  239. package/lib/renderer/glsl/chunks/rayTraceCore.glsl.js +72 -67
  240. package/lib/renderer/glsl/chunks/rayTraceCore.glsl.js.map +1 -1
  241. package/lib/renderer/glsl/chunks/sampleLight.glsl.js +94 -76
  242. package/lib/renderer/glsl/chunks/sampleLight.glsl.js.map +1 -1
  243. package/lib/renderer/glsl/chunks/sampleMaterial.glsl.d.ts +1 -0
  244. package/lib/renderer/glsl/chunks/sampleMaterial.glsl.js +143 -120
  245. package/lib/renderer/glsl/chunks/sampleMaterial.glsl.js.map +1 -1
  246. package/lib/renderer/glsl/chunks/sampleShadowCatcher.glsl.js +21 -18
  247. package/lib/renderer/glsl/chunks/sampleShadowCatcher.glsl.js.map +1 -1
  248. package/lib/renderer/glsl/chunks/sampling.glsl.js +91 -94
  249. package/lib/renderer/glsl/chunks/sampling.glsl.js.map +1 -1
  250. package/lib/renderer/glsl/chunks/sobol.glsl.js +79 -79
  251. package/lib/renderer/glsl/chunks/textureLinear.glsl.js +5 -5
  252. package/lib/renderer/glsl/chunks/uvProjection.glsl.js +12 -12
  253. package/lib/renderer/glsl/chunks/uvProjection.glsl.js.map +1 -1
  254. package/lib/renderer/glsl/depthQuery.frag.js +7 -7
  255. package/lib/renderer/glsl/normalizeRayTraceOutput.frag.js +17 -9
  256. package/lib/renderer/glsl/normalizeRayTraceOutput.frag.js.map +1 -1
  257. package/lib/renderer/glsl/rayTrace.frag.d.ts +1 -1
  258. package/lib/renderer/glsl/rayTrace.frag.js +271 -248
  259. package/lib/renderer/glsl/rayTrace.frag.js.map +1 -1
  260. package/lib/renderer/glsl/shadowCatcher.frag.js +37 -32
  261. package/lib/renderer/glsl/shadowCatcher.frag.js.map +1 -1
  262. package/lib/renderer/glsl/webglPipeline.frag.js +65 -60
  263. package/lib/renderer/glsl/webglPipeline.frag.js.map +1 -1
  264. package/lib/renderer/lightConstants.d.ts +10 -0
  265. package/lib/renderer/lightConstants.js +11 -0
  266. package/lib/renderer/lightConstants.js.map +1 -0
  267. package/lib/renderer/lightCore.d.ts +12 -0
  268. package/lib/renderer/lightCore.js +13 -0
  269. package/lib/renderer/lightCore.js.map +1 -0
  270. package/lib/renderer/lightSampling.d.ts +22 -18
  271. package/lib/renderer/lightSampling.js +135 -62
  272. package/lib/renderer/lightSampling.js.map +1 -1
  273. package/lib/renderer/lightsData.d.ts +21 -0
  274. package/lib/renderer/lightsData.js +192 -0
  275. package/lib/renderer/lightsData.js.map +1 -0
  276. package/lib/renderer/lightsUtil.d.ts +3 -26
  277. package/lib/renderer/lightsUtil.js +3 -153
  278. package/lib/renderer/lightsUtil.js.map +1 -1
  279. package/lib/renderer/materialBufferData.d.ts +70 -0
  280. package/lib/renderer/materialBufferData.js +2 -0
  281. package/lib/renderer/materialBufferData.js.map +1 -0
  282. package/lib/renderer/materialConstants.d.ts +11 -0
  283. package/lib/renderer/materialConstants.js +11 -0
  284. package/lib/renderer/materialConstants.js.map +1 -1
  285. package/lib/renderer/materialCore.d.ts +8 -0
  286. package/lib/renderer/materialCore.js +9 -0
  287. package/lib/renderer/materialCore.js.map +1 -0
  288. package/lib/renderer/materialEmission.d.ts +2 -2
  289. package/lib/renderer/materialEmission.js +3 -3
  290. package/lib/renderer/materialEmission.js.map +1 -1
  291. package/lib/renderer/materialLayout.d.ts +2 -101
  292. package/lib/renderer/materialLayout.js +110 -172
  293. package/lib/renderer/materialLayout.js.map +1 -1
  294. package/lib/renderer/materialLayoutSchema.d.ts +26 -0
  295. package/lib/renderer/materialLayoutSchema.js +172 -0
  296. package/lib/renderer/materialLayoutSchema.js.map +1 -0
  297. package/lib/renderer/materialParams.d.ts +69 -0
  298. package/lib/renderer/materialParams.js +272 -0
  299. package/lib/renderer/materialParams.js.map +1 -0
  300. package/lib/renderer/materialTextureSlots.d.ts +14 -324
  301. package/lib/renderer/materialTextureSlots.js +21 -8
  302. package/lib/renderer/materialTextureSlots.js.map +1 -1
  303. package/lib/renderer/materialTextures.d.ts +6 -0
  304. package/lib/renderer/{texturesFromMaterials.js → materialTextures.js} +1 -2
  305. package/lib/renderer/materialTextures.js.map +1 -0
  306. package/lib/renderer/mergeMeshesToGeometry.js +6 -147
  307. package/lib/renderer/mergeMeshesToGeometry.js.map +1 -1
  308. package/lib/renderer/meshInstances.d.ts +4 -21
  309. package/lib/renderer/meshInstances.js +10 -56
  310. package/lib/renderer/meshInstances.js.map +1 -1
  311. package/lib/renderer/oidnNetwork.d.ts +2 -2
  312. package/lib/renderer/oidnNetwork.js +1 -1
  313. package/lib/renderer/oidnNetwork.js.map +1 -1
  314. package/lib/renderer/openPbrEnergyLut.js +850 -846
  315. package/lib/renderer/openPbrEnergyLut.js.map +1 -1
  316. package/lib/renderer/ownedDenoiser.d.ts +9 -0
  317. package/lib/renderer/ownedDenoiser.js +2 -0
  318. package/lib/renderer/ownedDenoiser.js.map +1 -0
  319. package/lib/renderer/packedMeshInstances.d.ts +23 -0
  320. package/lib/renderer/packedMeshInstances.js +80 -0
  321. package/lib/renderer/packedMeshInstances.js.map +1 -0
  322. package/lib/renderer/prepareMeshBVH.d.ts +12 -47
  323. package/lib/renderer/prepareMeshBVH.js +21 -642
  324. package/lib/renderer/prepareMeshBVH.js.map +1 -1
  325. package/lib/renderer/proceduralEnvironmentPower.d.ts +3 -0
  326. package/lib/renderer/proceduralEnvironmentPower.js +8 -0
  327. package/lib/renderer/proceduralEnvironmentPower.js.map +1 -0
  328. package/lib/renderer/progressiveScheduler.d.ts +1 -0
  329. package/lib/renderer/progressiveScheduler.js +7 -3
  330. package/lib/renderer/progressiveScheduler.js.map +1 -1
  331. package/lib/renderer/renderPipeline.d.ts +4 -1
  332. package/lib/renderer/renderPipeline.js.map +1 -1
  333. package/lib/renderer/renderingLimits.d.ts +9 -0
  334. package/lib/renderer/renderingLimits.js +18 -0
  335. package/lib/renderer/renderingLimits.js.map +1 -0
  336. package/lib/renderer/researchTransport.d.ts +31 -0
  337. package/lib/renderer/researchTransport.js +5 -0
  338. package/lib/renderer/researchTransport.js.map +1 -0
  339. package/lib/renderer/sceneAssembly.d.ts +73 -0
  340. package/lib/renderer/sceneAssembly.js +109 -0
  341. package/lib/renderer/sceneAssembly.js.map +1 -0
  342. package/lib/renderer/sceneChangeCore.d.ts +39 -0
  343. package/lib/renderer/sceneChangeCore.js +307 -0
  344. package/lib/renderer/sceneChangeCore.js.map +1 -0
  345. package/lib/renderer/sceneChangeDetector.d.ts +3 -6
  346. package/lib/renderer/sceneChangeDetector.js +24 -150
  347. package/lib/renderer/sceneChangeDetector.js.map +1 -1
  348. package/lib/renderer/sceneLayoutSchema.d.ts +119 -0
  349. package/lib/renderer/sceneLayoutSchema.js +111 -0
  350. package/lib/renderer/sceneLayoutSchema.js.map +1 -0
  351. package/lib/renderer/sceneLightChanges.d.ts +3 -3
  352. package/lib/renderer/sceneLightChanges.js.map +1 -1
  353. package/lib/renderer/scenePreparation.d.ts +55 -0
  354. package/lib/renderer/scenePreparation.js +360 -0
  355. package/lib/renderer/scenePreparation.js.map +1 -0
  356. package/lib/renderer/scratchSampling.js +18 -18
  357. package/lib/renderer/scratchSampling.js.map +1 -1
  358. package/lib/renderer/shader.d.ts +2 -0
  359. package/lib/renderer/shader.js +2 -0
  360. package/lib/renderer/shader.js.map +1 -1
  361. package/lib/renderer/shaderCapabilities.d.ts +23 -0
  362. package/lib/renderer/shaderCapabilities.js +55 -0
  363. package/lib/renderer/shaderCapabilities.js.map +1 -0
  364. package/lib/renderer/shaderCapacity.d.ts +2 -0
  365. package/lib/renderer/shaderCapacity.js +5 -0
  366. package/lib/renderer/shaderCapacity.js.map +1 -0
  367. package/lib/renderer/skyModel.d.ts +9 -0
  368. package/lib/renderer/skyModel.js +10 -0
  369. package/lib/renderer/skyModel.js.map +1 -0
  370. package/lib/renderer/spectrum.d.ts +21 -0
  371. package/lib/renderer/spectrum.js +154 -0
  372. package/lib/renderer/spectrum.js.map +1 -0
  373. package/lib/renderer/textureAtlas.d.ts +60 -0
  374. package/lib/renderer/textureAtlas.js +145 -0
  375. package/lib/renderer/textureAtlas.js.map +1 -0
  376. package/lib/renderer/textureAtlasPixels.d.ts +7 -0
  377. package/lib/renderer/textureAtlasPixels.js +68 -0
  378. package/lib/renderer/textureAtlasPixels.js.map +1 -0
  379. package/lib/renderer/util.d.ts +1 -1
  380. package/lib/renderer/util.js.map +1 -1
  381. package/lib/renderer/webgl.d.ts +9 -2
  382. package/lib/renderer/webgl.js +54 -9
  383. package/lib/renderer/webgl.js.map +1 -1
  384. package/lib/renderer/webglLightSampling.d.ts +39 -0
  385. package/lib/renderer/webglLightSampling.js +15 -0
  386. package/lib/renderer/webglLightSampling.js.map +1 -0
  387. package/lib/renderer/wgpuBindless.d.ts +26 -0
  388. package/lib/renderer/wgpuBindless.js +95 -0
  389. package/lib/renderer/wgpuBindless.js.map +1 -0
  390. package/lib/renderer/wgpuBindlessSource.d.ts +2 -0
  391. package/lib/renderer/wgpuBindlessSource.js +51 -0
  392. package/lib/renderer/wgpuBindlessSource.js.map +1 -0
  393. package/lib/renderer/wgpuMaterialConstants.d.ts +4 -0
  394. package/lib/renderer/wgpuMaterialConstants.js +52 -0
  395. package/lib/renderer/wgpuMaterialConstants.js.map +1 -0
  396. package/lib/renderer/wgpuSceneUniform.d.ts +42 -0
  397. package/lib/renderer/wgpuSceneUniform.js +125 -0
  398. package/lib/renderer/wgpuSceneUniform.js.map +1 -0
  399. package/lib/renderer/wgpuShaderSource.d.ts +22 -0
  400. package/lib/renderer/wgpuShaderSource.js +33 -0
  401. package/lib/renderer/wgpuShaderSource.js.map +1 -0
  402. package/lib/renderer/wgsl/aovDisplay.wgsl.d.ts +1 -0
  403. package/lib/renderer/wgsl/aovDisplay.wgsl.js +70 -0
  404. package/lib/renderer/wgsl/aovDisplay.wgsl.js.map +1 -0
  405. package/lib/renderer/wgsl/aovReflectance.wgsl.d.ts +2 -0
  406. package/lib/renderer/wgsl/aovReflectance.wgsl.js +98 -0
  407. package/lib/renderer/wgsl/aovReflectance.wgsl.js.map +1 -0
  408. package/lib/renderer/wgsl/aovReflectanceSamples.wgsl.d.ts +2 -0
  409. package/lib/renderer/wgsl/aovReflectanceSamples.wgsl.js +135 -0
  410. package/lib/renderer/wgsl/aovReflectanceSamples.wgsl.js.map +1 -0
  411. package/lib/renderer/wgsl/aovResolve.wgsl.d.ts +5 -0
  412. package/lib/renderer/wgsl/aovResolve.wgsl.js +38 -0
  413. package/lib/renderer/wgsl/aovResolve.wgsl.js.map +1 -0
  414. package/lib/renderer/wgsl/aovSnapshot.wgsl.d.ts +4 -0
  415. package/lib/renderer/wgsl/aovSnapshot.wgsl.js +21 -0
  416. package/lib/renderer/wgsl/aovSnapshot.wgsl.js.map +1 -0
  417. package/lib/renderer/wgsl/aovTrace.wgsl.d.ts +2 -0
  418. package/lib/renderer/wgsl/aovTrace.wgsl.js +115 -0
  419. package/lib/renderer/wgsl/aovTrace.wgsl.js.map +1 -0
  420. package/lib/renderer/wgsl/bloom.wgsl.d.ts +13 -0
  421. package/lib/renderer/wgsl/bloom.wgsl.js +92 -0
  422. package/lib/renderer/wgsl/bloom.wgsl.js.map +1 -0
  423. package/lib/renderer/wgsl/causticLight.compute.d.ts +6 -0
  424. package/lib/renderer/wgsl/causticLight.compute.js +537 -0
  425. package/lib/renderer/wgsl/causticLight.compute.js.map +1 -0
  426. package/lib/renderer/wgsl/chunks/background.wgsl.d.ts +2 -0
  427. package/lib/renderer/wgsl/chunks/background.wgsl.js +102 -0
  428. package/lib/renderer/wgsl/chunks/background.wgsl.js.map +1 -0
  429. package/lib/renderer/wgsl/chunks/causticAdjoint.wgsl.d.ts +2 -0
  430. package/lib/renderer/wgsl/chunks/causticAdjoint.wgsl.js +12 -0
  431. package/lib/renderer/wgsl/chunks/causticAdjoint.wgsl.js.map +1 -0
  432. package/lib/renderer/wgsl/chunks/causticAtomic.wgsl.d.ts +2 -0
  433. package/lib/renderer/wgsl/chunks/causticAtomic.wgsl.js +16 -0
  434. package/lib/renderer/wgsl/chunks/causticAtomic.wgsl.js.map +1 -0
  435. package/lib/renderer/wgsl/chunks/caustics.wgsl.d.ts +1 -0
  436. package/lib/renderer/wgsl/chunks/caustics.wgsl.js +62 -0
  437. package/lib/renderer/wgsl/chunks/caustics.wgsl.js.map +1 -0
  438. package/lib/renderer/wgsl/chunks/common.wgsl.js +4 -4
  439. package/lib/renderer/wgsl/chunks/envMap.wgsl.d.ts +1 -1
  440. package/lib/renderer/wgsl/chunks/envMap.wgsl.js +41 -35
  441. package/lib/renderer/wgsl/chunks/envMap.wgsl.js.map +1 -1
  442. package/lib/renderer/wgsl/chunks/intersect.wgsl.d.ts +13 -1
  443. package/lib/renderer/wgsl/chunks/intersect.wgsl.js +747 -704
  444. package/lib/renderer/wgsl/chunks/intersect.wgsl.js.map +1 -1
  445. package/lib/renderer/wgsl/chunks/intersectionAlpha.wgsl.js +16 -16
  446. package/lib/renderer/wgsl/chunks/intersectionAlpha.wgsl.js.map +1 -1
  447. package/lib/renderer/wgsl/chunks/materialBuffer.wgsl.d.ts +4 -1
  448. package/lib/renderer/wgsl/chunks/materialBuffer.wgsl.js +83 -79
  449. package/lib/renderer/wgsl/chunks/materialBuffer.wgsl.js.map +1 -1
  450. package/lib/renderer/wgsl/chunks/openPbrBsdf.wgsl.js +855 -857
  451. package/lib/renderer/wgsl/chunks/openPbrBsdf.wgsl.js.map +1 -1
  452. package/lib/renderer/wgsl/chunks/pdm_displacement.wgsl.js +137 -137
  453. package/lib/renderer/wgsl/chunks/rand.wgsl.js +3 -3
  454. package/lib/renderer/wgsl/chunks/rayTraceCore.wgsl.d.ts +3 -1
  455. package/lib/renderer/wgsl/chunks/rayTraceCore.wgsl.js +52 -32
  456. package/lib/renderer/wgsl/chunks/rayTraceCore.wgsl.js.map +1 -1
  457. package/lib/renderer/wgsl/chunks/sampleLight.wgsl.d.ts +1 -1
  458. package/lib/renderer/wgsl/chunks/sampleLight.wgsl.js +152 -144
  459. package/lib/renderer/wgsl/chunks/sampleLight.wgsl.js.map +1 -1
  460. package/lib/renderer/wgsl/chunks/sampleMaterial.wgsl.d.ts +1 -1
  461. package/lib/renderer/wgsl/chunks/sampleMaterial.wgsl.js +269 -245
  462. package/lib/renderer/wgsl/chunks/sampleMaterial.wgsl.js.map +1 -1
  463. package/lib/renderer/wgsl/chunks/sampleShadowCatcher.wgsl.d.ts +1 -1
  464. package/lib/renderer/wgsl/chunks/sampleShadowCatcher.wgsl.js +27 -14
  465. package/lib/renderer/wgsl/chunks/sampleShadowCatcher.wgsl.js.map +1 -1
  466. package/lib/renderer/wgsl/chunks/sampling.wgsl.d.ts +1 -1
  467. package/lib/renderer/wgsl/chunks/sampling.wgsl.js +91 -95
  468. package/lib/renderer/wgsl/chunks/sampling.wgsl.js.map +1 -1
  469. package/lib/renderer/wgsl/chunks/shadowCatcherAccumulation.wgsl.d.ts +1 -1
  470. package/lib/renderer/wgsl/chunks/shadowCatcherAccumulation.wgsl.js +1 -0
  471. package/lib/renderer/wgsl/chunks/shadowCatcherAccumulation.wgsl.js.map +1 -1
  472. package/lib/renderer/wgsl/chunks/sobol.wgsl.js +83 -83
  473. package/lib/renderer/wgsl/chunks/uvProjection.wgsl.js +12 -12
  474. package/lib/renderer/wgsl/chunks/uvProjection.wgsl.js.map +1 -1
  475. package/lib/renderer/wgsl/compose.frag.wgsl.d.ts +8 -3
  476. package/lib/renderer/wgsl/compose.frag.wgsl.js +143 -118
  477. package/lib/renderer/wgsl/compose.frag.wgsl.js.map +1 -1
  478. package/lib/renderer/wgsl/customDenoise.wgsl.js +10 -10
  479. package/lib/renderer/wgsl/depthQuery.wgsl.js +7 -7
  480. package/lib/renderer/wgsl/jnlm.compute.d.ts +25 -0
  481. package/lib/renderer/wgsl/jnlm.compute.js +315 -0
  482. package/lib/renderer/wgsl/jnlm.compute.js.map +1 -0
  483. package/lib/renderer/wgsl/offlineAdaptive.compute.js +28 -28
  484. package/lib/renderer/wgsl/oidnAuxiliary.wgsl.d.ts +1 -0
  485. package/lib/renderer/wgsl/oidnAuxiliary.wgsl.js +17 -0
  486. package/lib/renderer/wgsl/oidnAuxiliary.wgsl.js.map +1 -0
  487. package/lib/renderer/wgsl/photonMap.compute.d.ts +29 -0
  488. package/lib/renderer/wgsl/photonMap.compute.js +352 -0
  489. package/lib/renderer/wgsl/photonMap.compute.js.map +1 -0
  490. package/lib/renderer/wgsl/proceduralSky.compute.d.ts +1 -0
  491. package/lib/renderer/wgsl/proceduralSky.compute.js +198 -0
  492. package/lib/renderer/wgsl/proceduralSky.compute.js.map +1 -0
  493. package/lib/renderer/wgsl/rayTrace.compute.d.ts +25 -1
  494. package/lib/renderer/wgsl/rayTrace.compute.js +645 -500
  495. package/lib/renderer/wgsl/rayTrace.compute.js.map +1 -1
  496. package/lib/scene/Camera.js +7 -3
  497. package/lib/scene/Camera.js.map +1 -1
  498. package/lib/scene/EnvironmentLight.d.ts +5 -9
  499. package/lib/scene/EnvironmentLight.js +4 -14
  500. package/lib/scene/EnvironmentLight.js.map +1 -1
  501. package/lib/scene/EnvironmentLightState.d.ts +18 -0
  502. package/lib/scene/EnvironmentLightState.js +19 -0
  503. package/lib/scene/EnvironmentLightState.js.map +1 -0
  504. package/lib/scene/Geometry.d.ts +12 -6
  505. package/lib/scene/Geometry.js +37 -13
  506. package/lib/scene/Geometry.js.map +1 -1
  507. package/lib/scene/InstanceState.d.ts +39 -0
  508. package/lib/scene/InstanceState.js +77 -0
  509. package/lib/scene/InstanceState.js.map +1 -0
  510. package/lib/scene/InstancedMesh.d.ts +1 -1
  511. package/lib/scene/InstancedMesh.js +3 -0
  512. package/lib/scene/InstancedMesh.js.map +1 -1
  513. package/lib/scene/MaterialState.d.ts +209 -0
  514. package/lib/scene/MaterialState.js +231 -0
  515. package/lib/scene/MaterialState.js.map +1 -0
  516. package/lib/scene/Mesh.d.ts +4 -6
  517. package/lib/scene/Mesh.js +3 -11
  518. package/lib/scene/Mesh.js.map +1 -1
  519. package/lib/scene/MeshState.d.ts +20 -0
  520. package/lib/scene/MeshState.js +35 -0
  521. package/lib/scene/MeshState.js.map +1 -0
  522. package/lib/scene/OpenPBRMaterial.d.ts +6 -168
  523. package/lib/scene/OpenPBRMaterial.js +5 -223
  524. package/lib/scene/OpenPBRMaterial.js.map +1 -1
  525. package/lib/scene/PixelTexture.d.ts +6 -0
  526. package/lib/scene/PixelTexture.js +10 -0
  527. package/lib/scene/PixelTexture.js.map +1 -0
  528. package/lib/scene/ProceduralSky.d.ts +24 -0
  529. package/lib/scene/ProceduralSky.js +40 -0
  530. package/lib/scene/ProceduralSky.js.map +1 -0
  531. package/lib/scene/RectLight.d.ts +2 -13
  532. package/lib/scene/RectLight.js +3 -21
  533. package/lib/scene/RectLight.js.map +1 -1
  534. package/lib/scene/RectLightState.d.ts +31 -0
  535. package/lib/scene/RectLightState.js +26 -0
  536. package/lib/scene/RectLightState.js.map +1 -0
  537. package/lib/scene/Scene.d.ts +15 -4
  538. package/lib/scene/Scene.js.map +1 -1
  539. package/lib/scene/SceneNode.js +7 -6
  540. package/lib/scene/SceneNode.js.map +1 -1
  541. package/lib/scene/Texture.d.ts +10 -41
  542. package/lib/scene/Texture.js +4 -33
  543. package/lib/scene/Texture.js.map +1 -1
  544. package/lib/scene/TextureState.d.ts +35 -0
  545. package/lib/scene/TextureState.js +35 -0
  546. package/lib/scene/TextureState.js.map +1 -0
  547. package/lib/scene/attributeData.d.ts +4 -0
  548. package/lib/scene/attributeData.js +10 -0
  549. package/lib/scene/attributeData.js.map +1 -0
  550. package/lib/scene/lightState.d.ts +8 -0
  551. package/lib/scene/lightState.js +2 -0
  552. package/lib/scene/lightState.js.map +1 -0
  553. package/lib/scene/openPbrSchema.d.ts +7 -12
  554. package/lib/scene/openPbrSchema.js +273 -28
  555. package/lib/scene/openPbrSchema.js.map +1 -1
  556. package/lib/scene/skyParameters.d.ts +20 -0
  557. package/lib/scene/skyParameters.js +28 -0
  558. package/lib/scene/skyParameters.js.map +1 -0
  559. package/lib/scene/textureData.d.ts +9 -0
  560. package/lib/scene/textureData.js +2 -0
  561. package/lib/scene/textureData.js.map +1 -0
  562. package/lib/scene/texturePixels.d.ts +6 -0
  563. package/lib/scene/texturePixels.js +10 -0
  564. package/lib/scene/texturePixels.js.map +1 -0
  565. package/lib/settings/display.d.ts +33 -0
  566. package/lib/settings/display.js +7 -0
  567. package/lib/settings/display.js.map +1 -1
  568. package/lib/settings/render.d.ts +36 -3
  569. package/lib/settings/render.js +4 -1
  570. package/lib/settings/render.js.map +1 -1
  571. package/lib/tinybvh/tinybvh.wasm +0 -0
  572. package/lib/util/commonGeometry.js +7 -7
  573. package/lib/util/commonGeometry.js.map +1 -1
  574. package/lib/util/fromTHREE.d.ts +4 -1
  575. package/lib/util/fromTHREE.js +20 -7
  576. package/lib/util/fromTHREE.js.map +1 -1
  577. package/lib/util/geometry.js +42 -29
  578. package/lib/util/geometry.js.map +1 -1
  579. package/lib/util/loadRGBE.js +3 -4
  580. package/lib/util/loadRGBE.js.map +1 -1
  581. package/lib/util/studioLighting.d.ts +18 -0
  582. package/lib/util/studioLighting.js +36 -0
  583. package/lib/util/studioLighting.js.map +1 -0
  584. package/lib/version.d.ts +1 -1
  585. package/lib/version.js +1 -1
  586. package/lib/version.js.map +1 -1
  587. package/llms.txt +5 -0
  588. package/package.json +33 -7
  589. package/lib/renderer/texturesFromMaterials.d.ts +0 -6
  590. package/lib/renderer/texturesFromMaterials.js.map +0 -1
@@ -0,0 +1,13 @@
1
+ export declare const bloomBrightDefine = "\nfn median(a: vec4f, b: vec4f, c: vec4f) -> vec4f {\nreturn a + b + c - min(min(a, b), c) - max(max(a, b), c);\n}\n";
2
+ export declare const bloomBrightMain = "\n\nlet d = vec3i(1, 1, 0);\n\nvar texel = load_colorTex(uv, 0);\nlet s1 = load_colorTex(uv - d.xz, 0);\nlet s2 = load_colorTex(uv + d.xz, 0);\nlet s3 = load_colorTex(uv - d.zy, 0);\nlet s4 = load_colorTex(uv + d.zy, 0);\ntexel = median(median(texel, s1, s2), s3, s4);\n\n// Premultiplied Alpha\nlet lum = dot(texel.rgb, vec3f(0.2125, 0.7154, 0.0721));\nvar color: vec4f;\nif (lum > threshold && texel.a > 0.0) {\n color = vec4f(texel.rgb * scale, texel.a);\n} else {\n // Bleed the alpha to avoid sharp edge when using alpha\n color = vec4f(vec3(0.0), texel.a);\n}\noutput.color = color;\n";
3
+ export declare const bloomDownDefine = "\nfn brightness(c: vec3f) -> f32 {\n return max(max(c.r, c.g), c.b);\n}\n";
4
+ export declare const bloomDownMain = "\nlet size = vec2f(colorTexRegion());\nlet d = vec4f(-1.0, -1.0, 1.0, 1.0) / size.xyxy;\n\noutput.color = sample_colorTex_linearSampler(uv2 + d.xy) * 0.25\n + sample_colorTex_linearSampler(uv2 + d.zy) * 0.25\n + sample_colorTex_linearSampler(uv2 + d.xw) * 0.25\n + sample_colorTex_linearSampler(uv2 + d.zw) * 0.25;\n";
5
+ export declare const bloomBlurDefine = "\nconst kernel = array<f32, 9>(0.07, 0.09, 0.12, 0.14, 0.16, 0.14, 0.12, 0.09, 0.07);\n";
6
+ export declare const bloomBlurMain = "\nlet texSize = vec2f(colorTexRegion());\nlet off = direction / texSize * size;\n\nvar sum = vec4f(0.0);\nvar weightAll = 0.0;\nfor (var i = 0; i < 9; i++) {\n let w = kernel[i];\n sum += sample_colorTex_linearSampler(uv2 + off * f32(i - 4)) * w;\n weightAll += w;\n}\noutput.color = sum / max(weightAll, 0.01);\n";
7
+ export declare const bloomBlendMain = "\nlet color1 = sample_colorTex1_linearSampler(uv2);\nlet color2 = sample_colorTex2_linearSampler(uv2);\noutput.color = mix(color1, color2, weight);\n";
8
+ export declare const BLOOM_LEVELS = 6;
9
+ export declare function bloomBlurSize(radius: number): number;
10
+ export declare function bloomBlendWeight(radius: number): number;
11
+ export type BloomStep = readonly [kind: number, a: number, b: number, target: number, dx: number, dy: number];
12
+ export declare function createBloomPlan(levels: number): BloomStep[];
13
+ export declare const BLOOM_PLAN: BloomStep[];
@@ -0,0 +1,92 @@
1
+ // Shared pass bodies; each host supplies texture access and the entry point.
2
+ // Median bright pass adapted from KinoBloom (MIT), Keijiro Takahashi:
3
+ // https://github.com/keijiro/KinoBloom/blob/master/Assets/Kino/Bloom/Shader/Bloom.cginc#L96
4
+ // See THIRD_PARTY_NOTICES.md and LICENSES/KinoBloom-MIT.txt.
5
+ export const bloomBrightDefine = /* wgsl */ `
6
+ fn tV(a: vec4f, b: vec4f, c: vec4f) -> vec4f {
7
+ return a + b + c - min(min(a, b), c) - max(max(a, b), c);
8
+ }
9
+ `;
10
+ export const bloomBrightMain = /* wgsl */ `
11
+
12
+ let d = vec3i(1, 1, 0);
13
+
14
+ var cR = load_colorTex(uv, 0);
15
+ let s1 = load_colorTex(uv - d.xz, 0);
16
+ let s2 = load_colorTex(uv + d.xz, 0);
17
+ let s3 = load_colorTex(uv - d.zy, 0);
18
+ let s4 = load_colorTex(uv + d.zy, 0);
19
+ cR = tV(tV(cR, s1, s2), s3, s4);
20
+
21
+
22
+ let lum = dot(cR.rgb, vec3f(0.2125, 0.7154, 0.0721));
23
+ var color: vec4f;
24
+ if (lum > threshold && cR.a > 0.0) {
25
+ color = vec4f(cR.rgb * scale, cR.a);
26
+ } else {
27
+
28
+ color = vec4f(vec3(0.0), cR.a);
29
+ }
30
+ output.color = color;
31
+ `;
32
+ export const bloomDownDefine = /* wgsl */ `
33
+ fn yo(c: vec3f) -> f32 {
34
+ return max(max(c.r, c.g), c.b);
35
+ }
36
+ `;
37
+ export const bloomDownMain = /* wgsl */ `
38
+ let size = vec2f(colorTexRegion());
39
+ let d = vec4f(-1.0, -1.0, 1.0, 1.0) / size.xyxy;
40
+
41
+ output.color = sample_colorTex_linearSampler(uv2 + d.xy) * 0.25
42
+ + sample_colorTex_linearSampler(uv2 + d.zy) * 0.25
43
+ + sample_colorTex_linearSampler(uv2 + d.xw) * 0.25
44
+ + sample_colorTex_linearSampler(uv2 + d.zw) * 0.25;
45
+ `;
46
+ export const bloomBlurDefine = /* wgsl */ `
47
+ const yu = array<f32, 9>(0.07, 0.09, 0.12, 0.14, 0.16, 0.14, 0.12, 0.09, 0.07);
48
+ `;
49
+ export const bloomBlurMain = /* wgsl */ `
50
+ let yh = vec2f(colorTexRegion());
51
+ let off = direction / yh * size;
52
+
53
+ var sum = vec4f(0.0);
54
+ var uI = 0.0;
55
+ for (var i = 0; i < 9; i++) {
56
+ let w = yu[i];
57
+ sum += sample_colorTex_linearSampler(uv2 + off * f32(i - 4)) * w;
58
+ uI += w;
59
+ }
60
+ output.color = sum / max(uI, 0.01);
61
+ `;
62
+ export const bloomBlendMain = /* wgsl */ `
63
+ let yq = sample_colorTex1_linearSampler(uv2);
64
+ let yr = sample_colorTex2_linearSampler(uv2);
65
+ output.color = mix(yq, yr, weight);
66
+ `;
67
+ export const BLOOM_LEVELS = 6;
68
+ export function bloomBlurSize(radius) {
69
+ return Math.max(Math.min(radius * 2, 1), 0.2);
70
+ }
71
+ export function bloomBlendWeight(radius) {
72
+ return 1 - Math.max(Math.min(radius ** 0.3 * 0.8, 0.8), 0);
73
+ }
74
+ export function createBloomPlan(levels) {
75
+ const down = 1, h = down + levels, v = h + levels, blend = v + levels;
76
+ const input = blend + levels - 1;
77
+ const steps = [[0, input, input, 0, 0, 0]];
78
+ for (let i = 0; i < levels; i++) {
79
+ const source = i === 0 ? 0 : down + i - 1;
80
+ steps.push([1, source, source, down + i, 0, 0]);
81
+ }
82
+ for (let i = levels - 1; i >= 0; i--) {
83
+ steps.push([2, down + i, down + i, h + i, 1, 0]);
84
+ steps.push([2, h + i, h + i, v + i, 0, 1]);
85
+ }
86
+ for (let i = levels - 2; i >= 0; i--) {
87
+ steps.push([3, i === levels - 2 ? v + levels - 1 : blend + i + 1, v + i, blend + i, 0, 0]);
88
+ }
89
+ return steps;
90
+ }
91
+ export const BLOOM_PLAN = createBloomPlan(BLOOM_LEVELS);
92
+ //# sourceMappingURL=bloom.wgsl.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bloom.wgsl.js","sourceRoot":"","sources":["../../../src/renderer/wgsl/bloom.wgsl.ts"],"names":[],"mappings":"AAAA,6EAA6E;AAC7E,sEAAsE;AACtE,4FAA4F;AAC5F,6DAA6D;AAC7D,MAAM,CAAC,MAAM,iBAAiB,GAAG,UAAU,CAAC;;;;CAI3C,CAAC;AACF,MAAM,CAAC,MAAM,eAAe,GAAG,UAAU,CAAC;;;;;;;;;;;;;;;;;;;;;CAqBzC,CAAC;AACF,MAAM,CAAC,MAAM,eAAe,GAAG,UAAU,CAAC;;;;CAIzC,CAAC;AACF,MAAM,CAAC,MAAM,aAAa,GAAG,UAAU,CAAC;;;;;;;;CAQvC,CAAC;AACF,MAAM,CAAC,MAAM,eAAe,GAAG,UAAU,CAAC;;CAEzC,CAAC;AACF,MAAM,CAAC,MAAM,aAAa,GAAG,UAAU,CAAC;;;;;;;;;;;;CAYvC,CAAC;AACF,MAAM,CAAC,MAAM,cAAc,GAAG,UAAU,CAAC;;;;CAIxC,CAAC;AAEF,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,CAAC;AAC9B,MAAM,UAAU,aAAa,CAAC,MAAc;IAC1C,OAAO,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;AAChD,CAAC;AACD,MAAM,UAAU,gBAAgB,CAAC,MAAc;IAC7C,OAAO,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,IAAI,GAAG,GAAG,GAAG,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;AAC7D,CAAC;AAKD,MAAM,UAAU,eAAe,CAAC,MAAc;IAC5C,MAAM,IAAI,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,GAAG,MAAM,EAAE,CAAC,GAAG,CAAC,GAAG,MAAM,EAAE,KAAK,GAAG,CAAC,GAAG,MAAM,CAAC;IACtE,MAAM,KAAK,GAAG,KAAK,GAAG,MAAM,GAAG,CAAC,CAAC;IACjC,MAAM,KAAK,GAAgB,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IACxD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QAChC,MAAM,MAAM,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC;QAC1C,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IAClD,CAAC;IACD,KAAK,IAAI,CAAC,GAAG,MAAM,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QACrC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,GAAG,CAAC,EAAE,IAAI,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QACjD,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IAC7C,CAAC;IACD,KAAK,IAAI,CAAC,GAAG,MAAM,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QACrC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,KAAK,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IAC7F,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AACD,MAAM,CAAC,MAAM,UAAU,GAAG,eAAe,CAAC,YAAY,CAAC,CAAC","sourcesContent":["// Shared pass bodies; each host supplies texture access and the entry point.\n// Median bright pass adapted from KinoBloom (MIT), Keijiro Takahashi:\n// https://github.com/keijiro/KinoBloom/blob/master/Assets/Kino/Bloom/Shader/Bloom.cginc#L96\n// See THIRD_PARTY_NOTICES.md and LICENSES/KinoBloom-MIT.txt.\nexport const bloomBrightDefine = /* wgsl */ `\nfn median(a: vec4f, b: vec4f, c: vec4f) -> vec4f {\nreturn a + b + c - min(min(a, b), c) - max(max(a, b), c);\n}\n`;\nexport const bloomBrightMain = /* wgsl */ `\n\nlet d = vec3i(1, 1, 0);\n\nvar texel = load_colorTex(uv, 0);\nlet s1 = load_colorTex(uv - d.xz, 0);\nlet s2 = load_colorTex(uv + d.xz, 0);\nlet s3 = load_colorTex(uv - d.zy, 0);\nlet s4 = load_colorTex(uv + d.zy, 0);\ntexel = median(median(texel, s1, s2), s3, s4);\n\n// Premultiplied Alpha\nlet lum = dot(texel.rgb, vec3f(0.2125, 0.7154, 0.0721));\nvar color: vec4f;\nif (lum > threshold && texel.a > 0.0) {\n color = vec4f(texel.rgb * scale, texel.a);\n} else {\n // Bleed the alpha to avoid sharp edge when using alpha\n color = vec4f(vec3(0.0), texel.a);\n}\noutput.color = color;\n`;\nexport const bloomDownDefine = /* wgsl */ `\nfn brightness(c: vec3f) -> f32 {\n return max(max(c.r, c.g), c.b);\n}\n`;\nexport const bloomDownMain = /* wgsl */ `\nlet size = vec2f(colorTexRegion());\nlet d = vec4f(-1.0, -1.0, 1.0, 1.0) / size.xyxy;\n\noutput.color = sample_colorTex_linearSampler(uv2 + d.xy) * 0.25\n + sample_colorTex_linearSampler(uv2 + d.zy) * 0.25\n + sample_colorTex_linearSampler(uv2 + d.xw) * 0.25\n + sample_colorTex_linearSampler(uv2 + d.zw) * 0.25;\n`;\nexport const bloomBlurDefine = /* wgsl */ `\nconst kernel = array<f32, 9>(0.07, 0.09, 0.12, 0.14, 0.16, 0.14, 0.12, 0.09, 0.07);\n`;\nexport const bloomBlurMain = /* wgsl */ `\nlet texSize = vec2f(colorTexRegion());\nlet off = direction / texSize * size;\n\nvar sum = vec4f(0.0);\nvar weightAll = 0.0;\nfor (var i = 0; i < 9; i++) {\n let w = kernel[i];\n sum += sample_colorTex_linearSampler(uv2 + off * f32(i - 4)) * w;\n weightAll += w;\n}\noutput.color = sum / max(weightAll, 0.01);\n`;\nexport const bloomBlendMain = /* wgsl */ `\nlet color1 = sample_colorTex1_linearSampler(uv2);\nlet color2 = sample_colorTex2_linearSampler(uv2);\noutput.color = mix(color1, color2, weight);\n`;\n\nexport const BLOOM_LEVELS = 6;\nexport function bloomBlurSize(radius: number): number {\n return Math.max(Math.min(radius * 2, 1), 0.2);\n}\nexport function bloomBlendWeight(radius: number): number {\n return 1 - Math.max(Math.min(radius ** 0.3 * 0.8, 0.8), 0);\n}\n\n// Slots: bright, down[], horizontal[], vertical[], blend[], external input.\n// Kind selects bright/down/blur/blend. Hosts only bind their own pass resources.\nexport type BloomStep = readonly [kind: number, a: number, b: number, target: number, dx: number, dy: number];\nexport function createBloomPlan(levels: number): BloomStep[] {\n const down = 1, h = down + levels, v = h + levels, blend = v + levels;\n const input = blend + levels - 1;\n const steps: BloomStep[] = [[0, input, input, 0, 0, 0]];\n for (let i = 0; i < levels; i++) {\n const source = i === 0 ? 0 : down + i - 1;\n steps.push([1, source, source, down + i, 0, 0]);\n }\n for (let i = levels - 1; i >= 0; i--) {\n steps.push([2, down + i, down + i, h + i, 1, 0]);\n steps.push([2, h + i, h + i, v + i, 0, 1]);\n }\n for (let i = levels - 2; i >= 0; i--) {\n steps.push([3, i === levels - 2 ? v + levels - 1 : blend + i + 1, v + i, blend + i, 0, 0]);\n }\n return steps;\n}\nexport const BLOOM_PLAN = createBloomPlan(BLOOM_LEVELS);\n"]}
@@ -0,0 +1,6 @@
1
+ export declare const CAUSTIC_UNIFORM_BYTES = 112;
2
+ export declare const causticUnitRandomWgsl = "\n fn causticUnitRandom(value:f32)->f32 {\n return clamp((value-EPS)/(1.0-2.0*EPS),0.0,0.99999994);\n }\n";
3
+ export declare function causticLightCompute(constants: Record<string, boolean | number>, blasLayoutMask: number, hasDisplacement: boolean, mode?: 'lightTracing' | 'photonMapping', sceneIntersections?: string, fullEmissionRandom?: boolean): string;
4
+ export declare const causticAccumulateCompute = "\n @group(0) @binding(0) var<storage,read_write> splats:array<atomic<u32>>;\n @group(0) @binding(1) var<storage,read_write> accumulation:array<vec4f>;\n @compute @workgroup_size(64)\n fn main(@builtin(global_invocation_id) id:vec3u, @builtin(num_workgroups) groups:vec3u) {\n // Large images exceed one dispatch row; preserve the linear pixel order.\n let pixel=id.x+id.y*groups.x*64u;\n if(pixel>=arrayLength(&accumulation)) {\n return;\n }\n let i=pixel*3u;\n accumulation[pixel]+=vec4f(vec3f(bitcast<f32>(atomicLoad(&splats[i])),bitcast<f32>(atomicLoad(&splats[i+1u])),bitcast<f32>(atomicLoad(&splats[i+2u]))),1.0);\n }\n";
5
+ /** Native buffer resolve has the same independent batch normalization as web. */
6
+ export declare const causticBufferCompositeCompute = "\n @group(0)@binding(0)var<storage,read>pt:array<vec4f>;\n @group(0)@binding(1)var<storage,read>caustics:array<vec4f>;\n @group(0)@binding(2)var<storage,read>normal:array<vec4f>;\n @group(0)@binding(3)var<storage,read_write>output:array<vec4f>;\n @compute @workgroup_size(64)fn main(@builtin(global_invocation_id)id:vec3u,@builtin(num_workgroups)groups:vec3u) {\n // Large images exceed one dispatch row; preserve the linear pixel order.\n let pixel=id.x+id.y*groups.x*64u;\n if(pixel>=arrayLength(&output)) {\n return;\n }\n let c=caustics[pixel];\n let p=pt[pixel];\n output[pixel]=vec4f(p.rgb+c.rgb/max(c.a,1.0)*normal[pixel].a,p.a);\n }\n";
@@ -0,0 +1,537 @@
1
+ import { PHOTON_GRID_SIZE, photonPackingWgsl } from './photonMap.compute.js';
2
+ import { SPECTRUM_PHOTON_DISTRIBUTION, SPECTRUM_WAVELENGTH_RANGE, spectrumWgsl } from '../spectrum.js';
3
+ import background from './chunks/background.wgsl.js';
4
+ import atomic from './chunks/causticAtomic.wgsl.js';
5
+ import adjoint from './chunks/causticAdjoint.wgsl.js';
6
+ import common from './chunks/common.wgsl.js';
7
+ import core from './chunks/rayTraceCore.wgsl.js';
8
+ import { createMaterialBufferWgsl } from './chunks/materialBuffer.wgsl.js';
9
+ import intersect from './chunks/intersect.wgsl.js';
10
+ import rand from './chunks/rand.wgsl.js';
11
+ import random from './chunks/random.wgsl.js';
12
+ import env from './chunks/envMap.wgsl.js';
13
+ import sampling from './chunks/sampling.wgsl.js';
14
+ import { createOpenPbrBsdfWgsl } from './chunks/openPbrBsdf.wgsl.js';
15
+ import light from './chunks/sampleLight.wgsl.js';
16
+ import uv from './chunks/uvProjection.wgsl.js';
17
+ import { causticPartitionWGSL } from './chunks/caustics.wgsl.js';
18
+ import { wgpuShaderPreamble } from '../wgpuShaderSource.js';
19
+ import { WGPU_SCENE_FEATURE_BITS } from '../WGPUSceneFeatures.js';
20
+ export const CAUSTIC_UNIFORM_BYTES = 112;
21
+ export const causticUnitRandomWgsl = /* wgsl */ `
22
+ fn causticUnitRandom(value:f32)->f32 {
23
+ return clamp((value-EPS)/(1.0-2.0*EPS),0.0,0.99999994);
24
+ }
25
+ `;
26
+ // Preserve the dormant R1 uniform slot and shader spelling for source parity.
27
+ // Production packs zero; only an explicitly registered research adapter sets it.
28
+ export function causticLightCompute(constants, blasLayoutMask, hasDisplacement, mode = 'lightTracing', sceneIntersections = '', fullEmissionRandom = true) {
29
+ const frames = !!constants.USE_ANISOTROPY_DIRECTIONS || !!constants.USE_COAT_NORMAL_FRAMES, coat = !!constants.USE_COAT_NORMAL_FRAMES;
30
+ return (wgpuShaderPreamble(constants, true) +
31
+ /* wgsl */ `
32
+ ${Object.keys(WGPU_SCENE_FEATURE_BITS)
33
+ .map((name) => `const ${name} = ${!!constants[name]};`)
34
+ .join('\n')}
35
+ ${common}
36
+ ${core({ hasAnisotropyDirections: frames, hasCoatNormals: coat, caustics: true })}
37
+ ${uv}
38
+ ${createMaterialBufferWgsl({ hasAnisotropyDirections: frames, hasCoatNormals: coat, caustics: true })}
39
+ ${intersect({
40
+ hasDisplacement,
41
+ blasLayoutMask,
42
+ hasAnisotropyDirections: frames,
43
+ hasCoatNormals: coat,
44
+ sceneIntersections
45
+ })}
46
+ ${rand}
47
+ ${random}
48
+ ${env}
49
+ ${sampling}
50
+ ${spectrumWgsl}
51
+ ${createOpenPbrBsdfWgsl(frames, coat)}
52
+ ${light}
53
+ ${background.replace(/\b(?:USE_BACKGROUND|USE_BACKGROUND_MAP|USE_GROUNDED_BACKGROUND)\b/g, (name) => `((rtUniform.backgroundFlags & ${{ USE_BACKGROUND: 1, USE_BACKGROUND_MAP: 2, USE_GROUNDED_BACKGROUND: 4 }[name]}) != 0)`)}
54
+ ${causticPartitionWGSL(false, false)}
55
+ ${adjoint}
56
+ struct CausticLightUniform {
57
+ casterSphere: vec4f,
58
+ viewProjection: mat4x4f,
59
+ photonCount: u32,
60
+ batch: u32,
61
+ mnee: u32,
62
+ cameraScale: f32,
63
+ casterCount: u32,
64
+ choiceCount: u32,
65
+ orthographic: u32,
66
+ experiments: u32,
67
+ }
68
+ @group(3) @binding(0) var<uniform> caustic: CausticLightUniform;
69
+ ${mode === 'lightTracing'
70
+ ? '@group(3) @binding(1) var<storage,read_write> splats: array<atomic<u32>>;'
71
+ : `${photonPackingWgsl}
72
+ @group(3)@binding(1)var photons:texture_storage_2d<rgba32uint,write>;
73
+ @group(3)@binding(3)var photonDirections:texture_storage_2d<r32uint,write>;
74
+ fn photonStore(i:u32,value:vec4u) {
75
+ let width=textureDimensions(photons).x;
76
+ textureStore(photons,vec2i(vec2u(i%width,i/width)),value);
77
+ }
78
+ fn pU(i:u32,value:u32) {
79
+ let buckets=min(${PHOTON_GRID_SIZE}u,1u<<(32u-countLeadingZeros(max(256u,caustic.photonCount*2u)-1u)));
80
+ let index=8u+buckets*4u+caustic.photonCount*2u+i;
81
+ let width=textureDimensions(photonDirections).x;
82
+ textureStore(photonDirections,vec2i(vec2u(index%width,index/width)),vec4u(value));
83
+ }
84
+ `}
85
+ @group(3) @binding(2) var causticDistribution:texture_2d<f32>;
86
+
87
+
88
+ ${causticUnitRandomWgsl}
89
+ fn fB(dim:u32)->f32{return ${fullEmissionRandom ? 'causticUnitRandom(sample1D(dim))' : 'sample1D(dim)'}
90
+ ;
91
+ }
92
+ fn hE(dim:u32)->vec2f {
93
+ let value=sample2D(dim);
94
+ return
95
+ ${fullEmissionRandom ? 'vec2f(causticUnitRandom(value.x),causticUnitRandom(value.y))' : 'value'}
96
+ ;
97
+ }
98
+ fn nH(i:u32)->vec4f {
99
+ let width=textureDimensions(causticDistribution).x;
100
+ return textureLoad(causticDistribution,vec2i(vec2u(i%width,i/width)),0);
101
+ }
102
+ fn ds(i:u32)->vec4f {
103
+ return nH(i);
104
+ }
105
+
106
+
107
+
108
+ var<private> kH:vec3f;
109
+ var<private> causticEmissionAreaPdf:f32;
110
+ fn kL(origin:vec3f,position:vec3f,normal:vec3f,emission:vec3f,area:f32,pmf:f32,result:ptr<function,LightSampleRec>) {
111
+ kH=position;
112
+ causticEmissionAreaPdf=pmf/max(area,1e-20);
113
+ let offset=position-origin;
114
+ (*result).dist=length(offset);
115
+ (*result).direction=offset/max((*result).dist,1e-20);
116
+ (*result).normal=normal;
117
+ (*result).emission=emission;
118
+ (*result).pdf=pmf;
119
+ }
120
+ fn rn(origin:vec3f,rnd:vec3f,result:ptr<function,LightSampleRec>) {
121
+ causticEmissionAreaPdf=0.0;
122
+ (*result).pdf=0.0;
123
+ (*result).sourceType=0u;
124
+ (*result).isDelta=false;
125
+ if(caustic.choiceCount==0u) {
126
+ return;
127
+ }
128
+ let scaled=rnd.z*f32(caustic.choiceCount);
129
+ let column=min(u32(scaled),caustic.choiceCount-1u);
130
+ let entry=nH(caustic.casterCount+column*2u);
131
+ let selected=select(bitcast<u32>(entry.y),column,fract(scaled)<entry.x);
132
+ let choice=bitcast<vec4u>(nH(caustic.casterCount+selected*2u));
133
+ let pmf=nH(caustic.casterCount+selected*2u+1u).x;
134
+ (*result).sourceIndex=choice.w;
135
+ if(choice.z==1u) {
136
+ (*result).sourceType=0u;
137
+ ig(rnd.xy,result);
138
+ (*result).pdf*=pmf;
139
+ }
140
+ else if(choice.z==2u) {
141
+ (*result).sourceType=2u;
142
+ var light=analyticLights[choice.w];
143
+ let kind=i32(light.litType);
144
+ if(kind==RECT_LIGHT) {
145
+ let position=light.position+light.u*(rnd.x-.5)+light.v*(rnd.y-.5);
146
+ kL(origin,position,normalize(cross(light.u,light.v)),light.emission,light.area,pmf,result);
147
+ (*result).isDelta=light.radiusOrSpread<=.001;
148
+ bC(light,position,light.position-.5*(light.u+light.v),result);
149
+ }
150
+ else if((kind==SPHERE_LIGHT||kind==SPOT_LIGHT)&&light.radiusOrSpread>0.0) {
151
+ let z=1.0-2.0*rnd.x;
152
+ let dr=sqrt(max(0.0,1.0-z*z));
153
+ let normal=vec3f(dr*cos(TWOPI*rnd.y),dr*sin(TWOPI*rnd.y),z);
154
+ kL(origin,light.position+light.radiusOrSpread*normal,normal,light.emission,light.area,pmf,result);
155
+ }
156
+ else {
157
+ light.selectionPmf=1.0;
158
+ sampleAnalyticLight(light,origin,rnd.xy,result);
159
+ (*result).pdf*=pmf;
160
+ }
161
+ }
162
+ else {
163
+ (*result).sourceType=1u;
164
+ let triangle=getEmissiveTriangle(i32(choice.w));
165
+ let u=sqrt(rnd.x);
166
+ let bary=vec3f(1.0-u,u*(1.0-rnd.y),u*rnd.y);
167
+ let position=bary.x*triangle.p0+bary.y*triangle.p1+bary.z*triangle.p2;
168
+ let normal=normalize(cross(triangle.p1-triangle.p0,triangle.p2-triangle.p0));
169
+ let uv=bary.x*triangle.uv0+bary.y*triangle.uv1+bary.z*triangle.uv2;
170
+ let uv1=bary.x*triangle.secondaryUv0+bary.y*triangle.secondaryUv1+bary.z*triangle.secondaryUv2;
171
+ kL(origin,position,normal,getMaterialEmission(i32(triangle.materialIndex),uv,uv1),triangle.area,pmf,result);
172
+ }
173
+ (*result).selectionPmf=pmf;
174
+ }
175
+ fn lj(s:vec4f,origin:vec3f)->f32 {
176
+ let bG=dot(s.xyz-origin,s.xyz-origin);
177
+ return select(-1.0,sqrt(max(0.0,1.0-s.w*s.w/bG)),bG>s.w*s.w);
178
+ }
179
+
180
+
181
+ fn dN(s:vec4f)->f32 {
182
+ if((caustic.experiments&2u)==0u) { return 1.0; }
183
+ let tB=caustic.viewProjection*vec4f(s.xyz,1.0);
184
+ let m=caustic.viewProjection;
185
+ let extent=s.w*max(length(vec3f(m[0].x,m[1].x,m[2].x)),length(vec3f(m[0].y,m[1].y,m[2].y)));
186
+ if(tB.w<=0.0||abs(tB.x)>tB.w+extent||abs(tB.y)>tB.w+extent) { return .05; }
187
+ return .05+min(1.0,extent*extent/max(tB.w*tB.w,1e-20));
188
+ }
189
+ fn sv(origin:vec3f,rnd:vec3f,pdf:ptr<function,f32>,ky:ptr<function,f32>)->vec3f {
190
+ var total=0.0;
191
+ for(var i=0u;i<caustic.casterCount;i++) {
192
+ total+=(1.0-lj(ds(i),origin))*dN(ds(i));
193
+ }
194
+ var choice=rnd.z*total;
195
+ var selected=ds(0u);
196
+ for(var i=0u;i<caustic.casterCount;i++) {
197
+ let sphere=ds(i);
198
+ selected=sphere;
199
+ choice-=(1.0-lj(sphere,origin))*dN(sphere);
200
+ if(choice<=0.0) {
201
+ break;
202
+ }
203
+ }
204
+ *ky=selected.w;
205
+ let offset=selected.xyz-origin;
206
+ let axis=normalize(select(vec3f(0.0,0.0,1.0),offset,dot(offset,offset)>1e-20));
207
+ let cosine=mix(1.0,lj(selected,origin),rnd.x);
208
+ let uC=sqrt(max(0.0,1.0-cosine*cosine));
209
+ var t:vec3f;
210
+ var b:vec3f;
211
+ sampling_orthonormal_basis(axis,&t,&b);
212
+ let direction=axis*cosine+(t*cos(TWOPI*rnd.y)+b*sin(TWOPI*rnd.y))*uC;
213
+
214
+ var overlaps=0.0;
215
+ for(var i=0u;i<caustic.casterCount;i++) {
216
+ let sphere=ds(i);
217
+ let c=lj(sphere,origin);
218
+ if(c<0.0||dot(normalize(sphere.xyz-origin),direction)>=c) {
219
+ overlaps+=dN(sphere);
220
+ }
221
+ }
222
+ *pdf=overlaps/max(TWOPI*total,1e-20);
223
+ return direction;
224
+ }
225
+ ${mode === 'lightTracing'
226
+ ? /* wgsl */ `${atomic}
227
+ fn causticCameraConnect(si: SurfaceInteraction, material: OpenPbrResolvedMaterial, hQ: Ray, flux: vec3f, extinction: vec3f) {
228
+ let eye=cameraUniform.viewInv[3].xyz;
229
+ let forward=-normalize(cameraUniform.viewInv[2].xyz);
230
+ let rB=hE(causticDim(68u));
231
+ let radius=cameraUniform.apertureRadius*sqrt(rB.x);
232
+ var uV=eye+radius*(cos(TWOPI*rB.y)*cameraUniform.viewInv[0].xyz+sin(TWOPI*rB.y)*cameraUniform.viewInv[1].xyz);
233
+ if(caustic.orthographic!=0u) {
234
+ uV=si.position-forward*dot(si.position-eye,forward);
235
+ }
236
+ let xM=uV-si.position;
237
+ let bG=dot(xM,xM);
238
+ let direction=normalize(xM);
239
+ let wf=uV+(si.position-uV)*cameraUniform.focusDistance/max(dot(si.position-uV,forward),1e-12);
240
+ let qO=select(wf,si.position,caustic.orthographic!=0u);
241
+ let tB=caustic.viewProjection*vec4f(qO,1.0);
242
+ if(tB.w<=0.0||dot(si.position-eye,forward)<=0.0) {
243
+ return;
244
+ }
245
+ let wY=tB.xy/tB.w*0.5+0.5;
246
+ if(any(wY<vec2f(0.0))||any(wY>=vec2f(1.0))) {
247
+ return;
248
+ }
249
+ var shadow:Ray;
250
+ initRay(&shadow,si.position+EPS*direction,direction);
251
+ if(intersectSceneShadow(shadow,sqrt(bG)-2.0*EPS,si.triangleIndex,si.instanceIndex)) {
252
+ return;
253
+ }
254
+ var m=material;
255
+ let normal=select(-si.normal,si.normal,dot(si.normal,-hQ.d)>=0.0);
256
+ m.inside=dot(si.faceNormal,-hQ.d)<0.0;
257
+ m.relativeIor=select(1.0/m.specularIor,m.specularIor,m.inside);
258
+ ${frames
259
+ ? /* wgsl */ ` m.directionTangent=si.directionTangent;m.directionBitangent=si.directionBitangent;m.geometryTangent=si.geometryTangent;m.geometryBitangent=si.geometryBitangent;`
260
+ : ''}
261
+ ${coat
262
+ ? /* wgsl */ ` m.coatNormal=normal;m.geometricNormal=select(-si.faceNormal,si.faceNormal,dot(si.faceNormal,-hQ.d)>=0.0);`
263
+ : ''}
264
+ let prepared=bV(si.tangent,m,-hQ.d,normal);
265
+ var pdf:f32;
266
+ let response=openpbr_eval_prepared(prepared,direction,&pdf);
267
+ let mj=dot(-direction,-normalize(cameraUniform.viewInv[2].xyz));
268
+ if(mj<=0.0) {
269
+ return;
270
+ }
271
+ let wg=caustic.cameraScale*rtUniform.outputSize.x*rtUniform.outputSize.y /
272
+ select(max(bG*mj*mj*mj,1e-12),1.0,caustic.orthographic!=0u);
273
+ let transmittance=exp(-extinction*sqrt(bG));
274
+ let value=flux*transmittance*response*causticAdjoint(-hQ.d,direction,normal,si.faceNormal)*wg/f32(caustic.photonCount);
275
+ let pixel=vec2u(wY*rtUniform.outputSize);
276
+ let index=(pixel.x+pixel.y*u32(rtUniform.outputSize.x))*3u;
277
+ kM(index,value.x);
278
+ kM(index+1u,value.y);
279
+ kM(index+2u,value.z);
280
+ }
281
+ `
282
+ : ''}
283
+ @compute @workgroup_size(64)
284
+ fn main(@builtin(global_invocation_id) id:vec3u) {
285
+ let photonIndex=id.x+id.y*4194240u;
286
+ if(photonIndex>=caustic.photonCount) {
287
+ return;
288
+ }
289
+ ${mode === 'photonMapping' ? 'photonStore(photonIndex,vec4u(0u));' : ''}
290
+ aI=vec2u(photonIndex%u32(rtUniform.outputSize.x),photonIndex/u32(rtUniform.outputSize.x));
291
+ aC=caustic.batch;
292
+ samplingBounce=0u;
293
+ ca=0u;
294
+ fi(aI,i32(ak(caustic.batch,rtUniform.sequenceSeed)));
295
+ var wavelength=0.0;
296
+ var wavelengthPdf=1.0;
297
+ if(SPECTRAL) {
298
+ wavelength=spectrumSample(${SPECTRUM_PHOTON_DISTRIBUTION}u,fB(causticDim(69u)),&wavelengthPdf);
299
+ }
300
+ var ls:LightSampleRec;
301
+ rn(caustic.casterSphere.xyz,vec3f(hE(causticDim(60u)),fB(causticDim(61u))),&ls);
302
+ if(ls.pdf<=0.0) {
303
+ return;
304
+ }
305
+ var infinite=ls.sourceType==0u;
306
+ if(ls.sourceType==2u) {
307
+ infinite=i32(analyticLights[ls.sourceIndex].litType)==DIRECTIONAL_LIGHT;
308
+ }
309
+ var origin=caustic.casterSphere.xyz+ls.direction*ls.dist;
310
+ if(causticEmissionAreaPdf>0.0) { origin=kH; }
311
+ var direction:vec3f;
312
+ var flux:vec3f;
313
+ var ky=caustic.casterSphere.w;
314
+ if(infinite) {
315
+ direction=-ls.direction;
316
+
317
+ var area=0.0;
318
+ for(var i=0u;i<caustic.casterCount;i++) {
319
+ let s=ds(i);
320
+ area+=s.w*s.w*dN(s);
321
+ }
322
+ var choice=fB(causticDim(63u))*area;
323
+ var sphere=ds(0u);
324
+ for(var i=0u;i<caustic.casterCount;i++) {
325
+ sphere=ds(i);
326
+ choice-=sphere.w*sphere.w*dN(sphere);
327
+ if(choice<=0.0) {
328
+ break;
329
+ }
330
+ }
331
+ ky=sphere.w;
332
+ var t:vec3f;
333
+ var b:vec3f;
334
+ sampling_orthonormal_basis(direction,&t,&b);
335
+ let rnd=hE(causticDim(62u));
336
+ origin=sphere.xyz-direction*dot(sphere.xyz-caustic.casterSphere.xyz,direction)-direction*caustic.casterSphere.w;
337
+ origin+=sphere.w*sqrt(rnd.x)*(t*cos(TWOPI*rnd.y)+b*sin(TWOPI*rnd.y));
338
+ var overlaps=0.0;
339
+ for(var i=0u;i<caustic.casterCount;i++) {
340
+ let s=ds(i);
341
+ let offset=origin-s.xyz;
342
+ let qO=offset-direction*dot(offset,direction);
343
+ if(dot(qO,qO)<=s.w*s.w) {
344
+ overlaps+=dN(s);
345
+ }
346
+ }
347
+ let diskPdf=overlaps/max(PI*area,1e-20);
348
+ flux=ls.emission/(ls.pdf*diskPdf);
349
+ }
350
+ else if(ls.sourceType==2u&&i32(analyticLights[ls.sourceIndex].litType)==RECT_LIGHT&&ls.isDelta) {
351
+
352
+ direction=ls.normal;
353
+ flux=ls.emission/causticEmissionAreaPdf;
354
+ }
355
+ else {
356
+ var areaPdf=ls.pdf*abs(dot(ls.normal,-ls.direction))/max(ls.dist*ls.dist,1e-20);
357
+ if(causticEmissionAreaPdf>0.0) { areaPdf=causticEmissionAreaPdf; }
358
+ if(ls.isDelta) {
359
+ areaPdf=ls.selectionPmf;
360
+ }
361
+ if(areaPdf<=0.0) {
362
+ return;
363
+ }
364
+ var directionPdf:f32;
365
+ direction=sv(origin,vec3f(hE(causticDim(62u)),fB(causticDim(63u))),&directionPdf,&ky);
366
+ var emission=ls.emission;
367
+ var mL=max(0.0,dot(ls.normal,direction));
368
+ if(ls.sourceType==2u) {
369
+ let source=analyticLights[ls.sourceIndex];
370
+ emission=source.emission;
371
+ if(i32(source.litType)==SPOT_LIGHT) {
372
+ emission*=evaluateSpotEmissionMultiplier(source,direction);
373
+ }
374
+ if(ls.isDelta) {
375
+ mL=1.0;
376
+ }
377
+ if(i32(source.litType)==RECT_LIGHT&&mL<cos(0.5*PI*source.radiusOrSpread)) {
378
+ return;
379
+ }
380
+ if(i32(source.litType)==RECT_LIGHT) {
381
+ var un:LightSampleRec;
382
+ un.emission=emission;
383
+ bC(source,origin,source.position-0.5*(source.u+source.v),&un);
384
+ emission=un.emission;
385
+ }
386
+ }
387
+ flux=emission*mL/(areaPdf*directionPdf);
388
+ }
389
+ if(SPECTRAL) {
390
+ flux*=spectrumRgb(wavelength)/(wavelengthPdf*${SPECTRUM_WAVELENGTH_RANGE}.0);
391
+ }
392
+ var ray:Ray;
393
+ initRay(&ray,origin+EPS*direction,direction);
394
+ var vt=0u;
395
+ var wN=false;
396
+ var extinction=vec3f(0.0);
397
+ var scattering=vec3f(0.0);
398
+ var si:SurfaceInteraction;
399
+ for(var depth=0;
400
+ ${mode === 'photonMapping' ? 'depth<=max(rtUniform.bounces,0)' : 'depth<20'}
401
+ ;
402
+ depth++) {
403
+ samplingBounce=u32(depth);
404
+ si.triangleIndex=-1;
405
+ intersectScene(ray,&si,0,true,depth>0);
406
+ if(!si.hit) {
407
+ return;
408
+ }
409
+ var m:OpenPbrResolvedMaterial;
410
+ getMaterial(&m,si.materialIndex,si.uv,si.uv1,si.instanceIndex,si.vertexColor);
411
+ if(m.alpha<1.0&&fB(causticDim(79u))>=m.alpha) {
412
+ initRay(&ray,si.position+EPS*ray.d,ray.d);
413
+ continue;
414
+ }
415
+ if(m.materialType==SHADOW_CATCHER) {
416
+ return;
417
+ }
418
+ let segment=distance(ray.o,si.position);
419
+ let channel=min(u32(sample1D(bE(MEDIUM_CHANNEL))*3.0),2u);
420
+ if(extinction[channel]>0.0&&any(scattering>vec3f(0.0))) {
421
+ let sampled=-log(max(sample1D(bE(MEDIUM_DISTANCE)),1e-7))/extinction[channel];
422
+
423
+
424
+ if(sampled<segment) {
425
+ return;
426
+ }
427
+ }
428
+ let transmittance=exp(-extinction*segment);
429
+ let xK=(transmittance.x+transmittance.y+transmittance.z)/3.0;
430
+ flux*=transmittance/select(1.0,max(xK,1e-20),any(scattering>vec3f(0.0)));
431
+ if(SPECTRAL) {
432
+ m.specularIor=sampling_cauchy_ior(spectrumIorWavelength(wavelength),m.specularIor,m.transmissionDispersionScale,m.dispersionAbbeNumber);
433
+ }
434
+ if(!isCausticSpecular(m)) {
435
+ let wj=ls.sourceType!=0u;
436
+ let r1=wj&&vt==1u&&wN&&m.baseWeight*(1.0-m.baseMetalness)*(1.0-m.transmissionWeight)>0.0&&m.subsurfaceWeight==0.0;
437
+ if(vt>0u
438
+ ${mode === 'lightTracing' ? '&&!(caustic.mnee!=0u&&r1)' : ''}){${mode === 'lightTracing'
439
+ ? 'causticCameraConnect(si,m,ray,flux,extinction);'
440
+ : /* wgsl */ `
441
+ let position=bitcast<vec3u>(si.position);
442
+ photonStore(photonIndex,vec4u(position,sS(flux)));
443
+ if((caustic.experiments&1u)!=0u) {
444
+ var maximum=1e-8;
445
+ for(var i=0u;i<caustic.casterCount;i++) { maximum=max(maximum,ds(i).w); }
446
+ let buckets=min(${PHOTON_GRID_SIZE}u,1u<<(32u-countLeadingZeros(max(256u,caustic.photonCount*2u)-1u)));
447
+ let index=8u+buckets*4u+caustic.photonCount*3u+photonIndex;
448
+ let width=textureDimensions(photonDirections).x;
449
+ textureStore(photonDirections,vec2i(vec2u(index%width,index/width)),vec4u(bitcast<u32>(ky/maximum)));
450
+ }
451
+ let hQ=vec2u(round(pN(-ray.d)*255.0));
452
+ let normal=vec2u(round(pN(si.faceNormal)*vec2f(255.0,127.0)));
453
+ pU(photonIndex,normal.x|(normal.y<<8u)|(select(0u,1u,r1)<<15u)|(hQ.x<<16u)|(hQ.y<<24u));
454
+ `}
455
+ }
456
+ return;
457
+ }
458
+ let view=-ray.d;
459
+ let normal=select(-si.normal,si.normal,dot(si.normal,view)>=0.0);
460
+ m.inside=dot(si.faceNormal,view)<0.0;
461
+ m.relativeIor=select(1.0/m.specularIor,m.specularIor,m.inside);
462
+ ${frames
463
+ ? /* wgsl */ ` m.directionTangent=si.directionTangent;m.directionBitangent=si.directionBitangent;m.geometryTangent=si.geometryTangent;m.geometryBitangent=si.geometryBitangent;`
464
+ : ''}
465
+ ${coat
466
+ ? /* wgsl */ ` m.coatNormal=normal;m.geometricNormal=select(-si.faceNormal,si.faceNormal,dot(si.faceNormal,view)>=0.0);`
467
+ : ''}
468
+ let prepared=bV(si.tangent,m,view,normal);
469
+ var next:vec3f;
470
+ var pdf:f32;
471
+ var transmission:bool;
472
+ var roughness:f32;
473
+ var specular:bool;
474
+ var diffuse:bool;
475
+ var lobe:u32;
476
+ var marginal:f32;
477
+ var full:vec3f;
478
+ let response=dl(prepared,vec3f(sample2D(bE(BSDF_DIRECTION)),sample1D(bE(BSDF_LOBE))),&next,&pdf,&transmission,&roughness,&specular,&diffuse,&lobe,&marginal,&full);
479
+ if(!(pdf>0.0)) {
480
+ return;
481
+ }
482
+ if(vt==0u&&ls.sourceType==0u&&transmission) {
483
+ var reverse:Ray;
484
+ initRay(&reverse,si.position,-ray.d);
485
+ let bg=ft(reverse);
486
+ flux*=bg.rgb*bg.a/max(ls.emission,vec3f(1e-20));
487
+ }
488
+ flux*=response/pdf*causticAdjoint(view,next,normal,si.faceNormal);
489
+
490
+
491
+ if(transmission&&!m.thinWalled) {
492
+ flux/=m.relativeIor*m.relativeIor;
493
+ }
494
+
495
+ if(transmission&&!m.thinWalled&&m.mediumType>0) {
496
+ extinction=select(m.mediumExtinction,vec3f(0.0),m.inside);
497
+ scattering=select(m.mediumScattering,vec3f(0.0),m.inside);
498
+ }
499
+ vt++;
500
+ wN=vt==1u&&((isCausticT(m)&&transmission)||(isCausticR(m)&&!transmission));
501
+ initRay(&ray,si.position+EPS*next,next);
502
+ }
503
+ }
504
+ `);
505
+ }
506
+ export const causticAccumulateCompute = /* wgsl */ `
507
+ @group(0) @binding(0) var<storage,read_write> splats:array<atomic<u32>>;
508
+ @group(0) @binding(1) var<storage,read_write> accumulation:array<vec4f>;
509
+ @compute @workgroup_size(64)
510
+ fn main(@builtin(global_invocation_id) id:vec3u, @builtin(num_workgroups) groups:vec3u) {
511
+
512
+ let pixel=id.x+id.y*groups.x*64u;
513
+ if(pixel>=arrayLength(&accumulation)) {
514
+ return;
515
+ }
516
+ let i=pixel*3u;
517
+ accumulation[pixel]+=vec4f(vec3f(bitcast<f32>(atomicLoad(&splats[i])),bitcast<f32>(atomicLoad(&splats[i+1u])),bitcast<f32>(atomicLoad(&splats[i+2u]))),1.0);
518
+ }
519
+ `;
520
+ /** Native buffer resolve has the same independent batch normalization as web. */
521
+ export const causticBufferCompositeCompute = /* wgsl */ `
522
+ @group(0)@binding(0)var<storage,read>pt:array<vec4f>;
523
+ @group(0)@binding(1)var<storage,read>caustics:array<vec4f>;
524
+ @group(0)@binding(2)var<storage,read>normal:array<vec4f>;
525
+ @group(0)@binding(3)var<storage,read_write>output:array<vec4f>;
526
+ @compute @workgroup_size(64)fn main(@builtin(global_invocation_id)id:vec3u,@builtin(num_workgroups)groups:vec3u) {
527
+
528
+ let pixel=id.x+id.y*groups.x*64u;
529
+ if(pixel>=arrayLength(&output)) {
530
+ return;
531
+ }
532
+ let c=caustics[pixel];
533
+ let p=pt[pixel];
534
+ output[pixel]=vec4f(p.rgb+c.rgb/max(c.a,1.0)*normal[pixel].a,p.a);
535
+ }
536
+ `;
537
+ //# sourceMappingURL=causticLight.compute.js.map