@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
@@ -1,11 +1,18 @@
1
+ import { photonQuerySource } from './photonMap.compute.js';
2
+ import backgroundWgsl from './chunks/background.wgsl.js';
3
+ import { researchTransport } from '../researchTransport.js';
4
+ import { causticPartitionWGSL } from './chunks/caustics.wgsl.js';
1
5
  import { MAX_PATH_EVENTS } from '../pathLimits.js';
2
6
  import shadowCatcherAccumulationWGSL from './chunks/shadowCatcherAccumulation.wgsl.js';
7
+ import reflectanceWGSL from './aovReflectance.wgsl.js';
8
+ import aovTraceWGSL from './aovTrace.wgsl.js';
3
9
  import depthQueryWGSL from './depthQuery.wgsl.js';
4
10
  // Portions adapted from ray-tracing-renderer@0.10.15
5
11
  // (https://github.com/hoverinc/ray-tracing-renderer).
6
12
  // Copyright (c) 2019 HOVER, MIT license; see LICENSES/RayTracingRenderer-MIT.txt.
7
13
  import commonWgsl from './chunks/common.wgsl.js';
8
14
  import { WGPU_SCENE_FEATURE_BITS } from '../WGPUSceneFeatures.js';
15
+ import { ALL_MATERIAL_SHADER_CAPABILITIES, MATERIAL_SHADER_CAPABILITIES } from '../shaderCapabilities.js';
9
16
  import rayTraceCoreWgsl from './chunks/rayTraceCore.wgsl.js';
10
17
  import { createMaterialBufferWgsl } from './chunks/materialBuffer.wgsl.js';
11
18
  import createIntersectionWgsl from './chunks/intersect.wgsl.js';
@@ -15,81 +22,148 @@ import { createSampleMaterialWgsl } from './chunks/sampleMaterial.wgsl.js';
15
22
  import sampleLightWgsl from './chunks/sampleLight.wgsl.js';
16
23
  import { createOpenPbrBsdfWgsl } from './chunks/openPbrBsdf.wgsl.js';
17
24
  import samplingWgsl from './chunks/sampling.wgsl.js';
25
+ import { spectrumWgsl } from '../spectrum.js';
18
26
  import sampleShadowCatcherWgsl from './chunks/sampleShadowCatcher.wgsl.js';
19
27
  import envMapWgsl from './chunks/envMap.wgsl.js';
20
28
  import uvProjectionWgsl from './chunks/uvProjection.wgsl.js';
21
29
  export const WORKGROUP_SIZE = 8;
22
30
  /** Generates the WebGPU megakernel path tracing compute shader. */
23
- export default function rayTraceCompute({ hasDisplacement, hasAnisotropyDirections = false, hasCoatNormals = false, hasAlpha = true, hasSceneAlpha = true, blasLayoutMask = 1 }) {
31
+ export default function rayTraceCompute(options, sceneIntersections = '', pathDiagnostic = false, inputHooks) {
32
+ const research = researchTransport()?.compute(options);
33
+ const enabled = research?.enabled ?? false;
34
+ const partitionDepth = research?.maxDepth ?? 20;
35
+ const debugGroup = research?.debugGroup ?? options.debugGroup ?? -1;
36
+ let { hasDisplacement, workgroupSize = WORKGROUP_SIZE, lightTracing = false, photonMapping = false, photonMaxDepth = 20, hasAnisotropyDirections = false, hasCoatNormals = false, hasAlpha = true, hasSceneAlpha = true, blasLayoutMask = 1, spectral, sceneCapabilities, dynamicEnvironment = false, materialCapabilities = ALL_MATERIAL_SHADER_CAPABILITIES, lightCapabilities } = options;
24
37
  hasAnisotropyDirections ||= hasCoatNormals;
25
38
  const deterministicPrimaryAlpha = hasAlpha;
39
+ const hasShadowCatcher = sceneCapabilities === undefined || (sceneCapabilities & WGPU_SCENE_FEATURE_BITS.HAS_SHADOW_CATCHER) !== 0;
40
+ const primaryVariables = /* wgsl */ `
41
+ var si: SurfaceInteraction;
42
+ var ma: OpenPbrResolvedMaterial;
43
+ si.albedoSampled = false;
44
+ si.mediumType = 0;
45
+ si.mediumExtinction = vec3f(0.0);
46
+ si.mediumScattering = vec3f(0.0);
47
+ si.mediumAnisotropy = 0.0;
48
+ si.barycentrics = vec2f(0.0);
49
+
50
+ `;
51
+ const primaryGuides = /* wgsl */ `${inputHooks?.primarySurface ?? ''} if (${hasShadowCatcher ? /* wgsl */ `si.hit && ma.materialType == SHADOW_CATCHER` : /* wgsl */ `false`}) {
52
+ (*outAux).isShadowCatcher = true;
53
+
54
+
55
+ (*outAux).albedo = vec3f(1.0);
56
+ (*outAux).normal = select(si.normal, -si.normal, dot(si.normal, ray.d) > 0.0);
57
+ var path: Path;
58
+ path.ray = ray;
59
+ path.fromEye = true;
60
+ (*outAux).shadowCounts = sampleShadowCatcher(si, 0, &path);
61
+
62
+
63
+ return vec4f(1.0);
64
+ }
65
+ else {
66
+ if (HAS_BEVEL && rtUniform.bevel != 0) {
67
+ if (ma.bevel > 0.0) {
68
+ si.normal = mT(si, ma.bevel);
69
+ }
70
+ }
71
+
72
+
73
+
74
+ if (si.hit && (ma.materialType == STANDARD || ma.materialType == UNLIT)) {
75
+ (*outAux).albedo = select(ma.baseColor, vec3f(1.0), ma.transmissionWeight > 0.5);
76
+ (*outAux).normal = select(
77
+ si.normal,
78
+ -si.normal,
79
+ dot(si.normal, si.position - cameraUniform.viewInv[3].xyz) > 0.0
80
+ );
81
+
82
+
83
+
84
+ si.albedoSampled = ma.transmissionWeight > 0.5;
85
+ }
86
+
87
+ (*outAux).isShadowCatcher = false;
88
+
89
+
90
+ }
91
+ `;
26
92
  const source = /* wgsl */ `
27
93
 
28
94
  ${commonWgsl}
29
95
 
30
- ${rayTraceCoreWgsl({ hasSceneAlpha, hasAnisotropyDirections, hasCoatNormals })}
96
+ ${rayTraceCoreWgsl({ hasSceneAlpha, hasAnisotropyDirections, hasCoatNormals, lightCapabilities, caustics: enabled || lightTracing || photonMapping })}
31
97
 
32
98
  ${uvProjectionWgsl}
33
99
 
34
- ${createMaterialBufferWgsl({ hasSceneAlpha, hasAnisotropyDirections, hasCoatNormals })}
100
+ ${createMaterialBufferWgsl({ hasSceneAlpha, hasAnisotropyDirections, hasCoatNormals,
101
+ caustics: enabled || lightTracing || photonMapping,
102
+ hasTransmission: (materialCapabilities & MATERIAL_SHADER_CAPABILITIES.transmission) !== 0,
103
+ hasMetalness: (materialCapabilities & MATERIAL_SHADER_CAPABILITIES.metal) !== 0 })}
35
104
 
36
- ${createIntersectionWgsl({ hasDisplacement, blasLayoutMask, hasAnisotropyDirections, hasCoatNormals })}
105
+ ${createIntersectionWgsl({ hasDisplacement, blasLayoutMask, hasAnisotropyDirections, hasCoatNormals, sceneIntersections })}
37
106
  ${randWgsl}
38
107
  ${randomWgsl}
39
108
  ${envMapWgsl}
40
109
 
41
110
  ${samplingWgsl}
111
+ ${spectrumWgsl}
42
112
  ${createOpenPbrBsdfWgsl(hasAnisotropyDirections, hasCoatNormals)}
43
- ${sampleLightWgsl}
113
+ ${sampleLightWgsl}${inputHooks?.declarations ?? ''}
44
114
 
45
115
 
46
- var<private> tL: u32 = 0u;
116
+ var<private> vp: u32 = 0u;
47
117
 
48
118
 
49
119
 
50
- fn jX() -> u32 {
120
+ fn ke() -> u32 {
51
121
  return u32(max(rtUniform.directLightCandidates, 1));
52
122
  }
53
123
 
54
124
 
55
125
 
56
126
 
57
- fn pK(wP: u32) -> f32 {
127
+ fn qp(yQ: u32) -> f32 {
58
128
 
59
129
 
60
130
 
61
131
 
62
132
  if (SAMPLING_PATTERN == 2) { _ = rand(); }
63
- let kd = bc.x + bc.y * u32(rtUniform.outputSize.x);
64
- let key = aq(aq(kd, bd), rtUniform.sequenceSeed);
65
- let dimension = aq(cF, wP) ^ 0xa511e9b3u;
66
- return f32(eg(key ^ dimension) >> 8u) * (1.0 / 16777216.0);
133
+ let kl = aI.x + aI.y * u32(rtUniform.outputSize.x);
134
+ let key = ak(ak(kl, aC), rtUniform.sequenceSeed);
135
+ let dimension = ak(samplingBounce, yQ) ^ 0xa511e9b3u;
136
+ return f32(cB(key ^ dimension) >> 8u) * (1.0 / 16777216.0);
67
137
  }
68
138
 
69
139
 
70
140
 
71
- fn tC(fg: f32, scatteringPdf: f32) -> f32 {
72
- let aV = jX();
73
- if (aV <= 1u) {
74
- return aG(fg, scatteringPdf);
141
+ fn uY(lightPdf: f32, scatteringPdf: f32) -> f32 {
142
+ let candidateCount = ke();
143
+ if (candidateCount <= 1u) {
144
+ return aF(lightPdf, scatteringPdf);
75
145
  }
76
- let iJ = f32(aV) * fg;
77
- return iJ /
78
- max(iJ + scatteringPdf, 1e-20);
146
+ let weightedLightPdf = f32(candidateCount) * lightPdf;
147
+ return weightedLightPdf /
148
+ max(weightedLightPdf + scatteringPdf, 1e-20);
79
149
  }
80
150
 
81
151
 
82
- fn fX(scatteringPdf: f32, fg: f32) -> f32 {
83
- let aV = jX();
84
- if (aV <= 1u) {
85
- return aG(scatteringPdf, fg);
152
+ fn fV(scatteringPdf: f32, lightPdf: f32) -> f32 {
153
+ let candidateCount = ke();
154
+ if (candidateCount <= 1u) {
155
+ return aF(scatteringPdf, lightPdf);
86
156
  }
87
- let iJ = f32(aV) * fg;
157
+ let weightedLightPdf = f32(candidateCount) * lightPdf;
88
158
  return scatteringPdf /
89
- max(scatteringPdf + iJ, 1e-20);
159
+ max(scatteringPdf + weightedLightPdf, 1e-20);
90
160
  }
91
161
 
92
- ${createSampleMaterialWgsl(hasAnisotropyDirections, hasCoatNormals)}
162
+ ${enabled || lightTracing || photonMapping ? causticPartitionWGSL(enabled, lightTracing, photonMapping, partitionDepth, debugGroup >= 30, photonMaxDepth) : ''}${research?.declarations ?? ''}${photonMapping ? `const CAUSTIC_LIGHT_TRACING=${lightTracing};
163
+ const CAUSTIC_MNEE=${enabled};
164
+ const CAUSTIC_MNEE_MAX_DEPTH=${partitionDepth}u;
165
+ const CAUSTIC_PHOTON_MAX_DEPTH=${photonMaxDepth}u;
166
+ ` + photonQuerySource(debugGroup, !lightTracing && (options.photonDirectSubset ?? true)) : ''}${createSampleMaterialWgsl(hasAnisotropyDirections, hasCoatNormals, enabled || lightTracing || photonMapping, research?.contribution, photonMapping)}
93
167
  ${sampleShadowCatcherWgsl}
94
168
 
95
169
 
@@ -101,24 +175,24 @@ ${shadowCatcherAccumulationWGSL}
101
175
  @group(3) @binding(3) var<storage, read_write> outShadowCatcher: array<ShadowCatcherAccumulation>;
102
176
 
103
177
 
104
- fn hK(
105
- hg: u32,
106
- vy: vec3f,
178
+ fn hH(
179
+ gf: u32,
180
+ radiance: vec3f,
107
181
  normal: vec3f
108
182
  ) {
109
183
  if (rtUniform.varianceMoments != 0) {
110
- let value = dot(vy, luminance);
111
- outNormal[hg] += vec4f(value * value, 0.0, 0.0, 1.0);
184
+ let value = dot(radiance, luminance);
185
+ outNormal[gf] += vec4f(value * value, 0.0, 0.0, 1.0);
112
186
  }
113
187
  else {
114
- outNormal[hg] += vec4f(normal, 1.0);
188
+ outNormal[gf] += vec4f(normal, 1.0);
115
189
  }
116
190
  }
117
191
 
118
192
 
119
193
 
120
- fn iS(hg: u32, value: f32) {
121
- outShadowCatcher[hg].moments += vec4f(value, value * value, 0.0, 0.0);
194
+ fn iP(gf: u32, value: f32) {
195
+ outShadowCatcher[gf].moments += vec4f(value, value * value, 0.0, 0.0);
122
196
  }
123
197
 
124
198
 
@@ -128,120 +202,27 @@ albedo: vec3f,
128
202
  isShadowCatcher: bool,
129
203
  normal: vec3f,
130
204
  isBlank: bool,
131
- }
132
-
133
- fn dq(sN: vec3f, height: f32, radius: f32) -> f32 {
134
- let fR = length(sN);
135
- if (fR < 0.00001) {
136
- return -radius;
137
- }
138
-
139
- let iG = radius * sN.y / fR;
140
- let iq = -1.5 * height;
141
- var ev: f32;
142
- if (iG >= 0.0) {
143
- ev = radius;
144
- }
145
- else if (iG < iq) {
146
- ev = -height * fR / sN.y;
147
- }
148
- else {
149
- let dW = 1.0
150
- - iG * iG / (3.0 * iq * iq);
151
- ev = radius * dW;
152
- }
153
- return fR - ev;
154
- }
155
-
156
- fn eT(origin: vec3f, direction: vec3f) -> vec3f {
157
- if (!USE_GROUNDED_BACKGROUND) {
158
- return direction;
159
- }
160
- let params = rtUniform.groundedBackgroundParams;
161
- let bY = normalize(direction);
162
- let center = vec3f(
163
- rtUniform.groundedBackgroundCenter.x,
164
- params.z + params.x,
165
- rtUniform.groundedBackgroundCenter.y
166
- );
167
- let bB = origin - center;
168
- let eJ = dot(bB, bY);
169
- let ej = eJ * eJ
170
- - dot(bB, bB) + params.y * params.y;
171
- if (
172
- ej <= 0.0
173
- || dq(bB, params.x, params.y) > 0.0
174
- ) {
175
- return direction;
176
- }
177
-
178
- var cC = -eJ + sqrt(ej);
179
- if (cC <= 0.0) {
180
- return direction;
181
- }
182
-
183
- let nO = bB + bY * cC;
184
- if (nO.y >= 0.0) {
185
- return normalize(nO);
186
- }
187
-
188
- if (bY.y < -0.00001 && params.y > 1.5 * params.x) {
189
- let hT = (-params.x - bB.y) / bY.y;
190
- let nE = bB + bY * hT;
191
- let om = (2.0 / 3.0)
192
- * sqrt(params.y * params.y - 2.25 * params.x * params.x);
193
- if (hT > 0.0 && length(nE.xz) <= om) {
194
- return normalize(nE);
195
- }
196
- }
197
205
 
198
- var cN = 0.0;
199
- for (var i = 0; i < 14; i++) {
200
- let fh = (cN + cC) * 0.5;
201
- let pL = bB + bY * fh;
202
- if (dq(pL, params.x, params.y) > 0.0) {
203
- cC = fh;
204
- }
205
- else {
206
- cN = fh;
207
- }
208
- }
209
- let hit = bB + bY * ((cN + cC) * 0.5);
210
- return normalize(hit);
211
- }
212
-
213
- fn hH(ray: Ray) -> vec4f {
214
- var bg = vec4f(0.0);
215
- if (USE_BACKGROUND_MAP) {
216
- let d = eT(ray.o, ray.d);
217
- let t = rtUniform.backgroundMapTransform;
218
- let qb = vec3f(t.x * d.x - t.y * d.z, d.y, t.y * d.x + t.x * d.z);
219
- let aW = textureLinear(backgroundMap, eL(qb));
220
- bg = vec4f(aW.rgb * t.z, aW.a);
221
- }
222
- else if (USE_BACKGROUND) {
223
- bg = rtUniform.backgroundColor;
224
- }
225
- else if (USE_ENVMAP) {
226
- bg = textureLinear(envMap, cY(ray.d));
227
- }
228
- return bg;
206
+ shadowCounts: vec2f,
229
207
  }
230
208
 
231
- fn cW(ray: Ray, wavelength: f32) -> vec4f {
232
- let bg = hH(ray);
209
+ ${backgroundWgsl}fn cP(ray: Ray, channel: i32) -> vec4f {
210
+ let bg = ft(ray);
233
211
  if (SPECTRAL) {
234
- return vec4f(ai(bg.rgb, wavelength), bg.a);
212
+ return vec4f(sampling_spectral_rgb_filter(bg.rgb, channel), bg.a);
235
213
  }
236
214
  return bg;
237
215
  }
238
216
 
239
- fn bounce(uv: vec2f, aa: ptr<function, Path>, depth: ptr<function, i32>, si: ptr<function, ad>, ma: ptr<function, J>, outAux: ptr<function, RayTraceAuxiliary>) {
240
- cF = u32(max(*depth, 0));
217
+
218
+
219
+ fn nO(uv: vec2f, path: ptr<function, Path>, depth: ptr<function, i32>, si: ptr<function, SurfaceInteraction>, ma: ptr<function, OpenPbrResolvedMaterial>, outAux: ptr<function, RayTraceAuxiliary>, eV: ptr<function, bool>) {
220
+ *eV = false;
221
+ samplingBounce = u32(max(*depth, 0));
241
222
  let matType = (*ma).materialType;
242
- let isShadowCatcher = matType == SHADOW_CATCHER;
223
+ let isShadowCatcher = ${hasShadowCatcher ? /* wgsl */ `matType == SHADOW_CATCHER` : /* wgsl */ `false`};
243
224
  if (isShadowCatcher) {
244
- if ((*aa).fromEye) {
225
+ if ((*path).fromEye) {
245
226
  (*si).hit = false;
246
227
  }
247
228
  else {
@@ -249,37 +230,37 @@ else {
249
230
 
250
231
 
251
232
  if (USE_ENVMAP) {
252
- if ((*aa).isNextRefraction) {
233
+ if ((*path).isNextRefraction) {
253
234
 
254
235
 
255
- let bg = cW(
256
- (*aa).ray,
257
- (*si).wavelength
236
+ let bg = cP(
237
+ (*path).ray,
238
+ (*si).spectralChannel
258
239
  );
259
- let cT = select(fX((*aa).scatteringPdf,
260
- iB(cY((*aa).ray.d)) * rtUniform.envLightPmf),
261
- 1.0, (*aa).scatteringIsDelta);
262
- (*aa).li += cT * (*aa).beta * bg.rgb * bg.a;
263
- (*aa).alpha = max((*aa).alpha, bg.a);
240
+ let cM = select(fV((*path).scatteringPdf,
241
+ envMapPdf(cT((*path).ray.d)) * rtUniform.envLightPmf),
242
+ 1.0, (*path).scatteringIsDelta);
243
+ (*path).li += cM * (*path).beta * bg.rgb * bg.a;
244
+ (*path).alpha = max((*path).alpha, bg.a);
264
245
  }
265
246
  else {
266
- let tQ = cY((*aa).ray.d);
267
- var emission = textureLinear(envMap, tQ).rgb;
247
+ let vC = cT((*path).ray.d);
248
+ var emission = textureLinear(envMap, vC).rgb;
268
249
  if (SPECTRAL) {
269
- emission = ai(emission, (*si).wavelength);
250
+ emission = sampling_spectral_rgb_filter(emission, (*si).spectralChannel);
270
251
  }
271
- (*aa).li += (*aa).beta * emission *
272
- fX((*aa).scatteringPdf, iB(tQ));
252
+ (*path).li += (*path).beta * emission *
253
+ fV((*path).scatteringPdf, envMapPdf(vC));
273
254
  }
274
255
  }
275
256
  else {
276
- let bg = cW(
277
- (*aa).ray,
278
- (*si).wavelength
257
+ let bg = cP(
258
+ (*path).ray,
259
+ (*si).spectralChannel
279
260
  );
280
- (*aa).li += (*aa).beta * bg.rgb * bg.a;
261
+ (*path).li += (*path).beta * bg.rgb * bg.a;
281
262
  }
282
- (*aa).abort = true;
263
+ (*path).abort = true;
283
264
  return;
284
265
  }
285
266
  }
@@ -287,72 +268,72 @@ if (!(*si).hit) {
287
268
 
288
269
 
289
270
 
290
- let bg = cW(
291
- (*aa).ray,
292
- (*si).wavelength
271
+ let bg = cP(
272
+ (*path).ray,
273
+ (*si).spectralChannel
293
274
  );
294
- if ((*aa).fromEye) {
275
+ if ((*path).fromEye) {
295
276
 
296
- (*aa).li = (*aa).beta * bg.rgb * bg.a;
297
- (*aa).alpha = bg.a;
277
+ (*path).li = (*path).beta * bg.rgb * bg.a;
278
+ (*path).alpha = bg.a;
298
279
 
299
280
  (*outAux).isBlank = bg.a < 0.001 ||
300
281
  (USE_BACKGROUND && !USE_BACKGROUND_MAP);
301
282
  }
302
283
  else {
303
- let cam = hC(uv);
304
- let mL = dot(cam.d, (*aa).ray.d) > 0.0;
284
+ let cam = eT(uv);
285
+ let nt = dot(cam.d, (*path).ray.d) > 0.0;
305
286
  if (rtUniform.transmissiveOutputAlphaMin < 1.0) {
306
- if (mL) {
307
- (*aa).alpha = max((*aa).alpha, bg.a);
287
+ if (nt) {
288
+ (*path).alpha = max((*path).alpha, bg.a);
308
289
  } else {
309
- (*aa).alpha = 1.0;
290
+ (*path).alpha = 1.0;
310
291
  }
311
292
  }
312
293
  if (!USE_ENVMAP) {
313
294
 
314
295
 
315
- if (mL) {
296
+ if (nt) {
316
297
 
317
298
 
318
- (*aa).li += (*aa).beta *
319
- fX((*aa).scatteringPdf, 1.0) * bg.rgb;
299
+ (*path).li += (*path).beta *
300
+ fV((*path).scatteringPdf, 1.0) * bg.rgb;
320
301
  }
321
302
  }
322
303
  }
323
- (*aa).abort = true;
304
+ (*path).abort = true;
324
305
  return;
325
306
  }
326
307
 
327
- var cH = false;
308
+
328
309
  if ((matType == STANDARD || matType == UNLIT)) {
329
310
  let alpha = clamp((*ma).alpha, 0.0, 1.0);
330
311
 
331
312
  if (alpha < 1.0) {
332
313
 
333
314
 
334
- if (alpha <= 0.0 || eo(3u) > alpha) {
335
- cH = true;
315
+ if (alpha <= 0.0 || ek(3u) > alpha) {
316
+ (*eV) = true;
336
317
  }
337
318
  }
338
- if (!cH && rtUniform.transmissiveOutputAlphaMin < 1.0) {
319
+ if (!(*eV) && rtUniform.transmissiveOutputAlphaMin < 1.0) {
339
320
 
340
321
 
341
- let tW = max(1.0 - (*ma).transmissionWeight, 1.0 - pow(1.0 - rtUniform.transmissiveOutputAlphaMin, f32(*depth)));
342
- (*aa).alpha = max(tW, (*aa).alpha);
322
+ let outputAlpha = max(1.0 - (*ma).transmissionWeight, 1.0 - pow(1.0 - rtUniform.transmissiveOutputAlphaMin, f32(*depth)));
323
+ (*path).alpha = max(outputAlpha, (*path).alpha);
343
324
  }
344
- if (!cH) {
345
- tL = u32(max(*depth, 0));
346
- mb(si, ma, aa);
325
+ if (!(*eV)) {
326
+ vp = u32(max(*depth, 0));
327
+ mx(si, ma, path);
347
328
  }
348
329
  else {
349
330
 
350
331
 
351
- (*aa).ray.o = (*si).position + (*aa).ray.d * EPS;
332
+ (*path).ray.o = (*si).position + (*path).ray.d * EPS;
352
333
  }
353
334
  }
354
335
 
355
- if (!(*si).albedoSampled && !cH) {
336
+ if (!(*si).albedoSampled && !(*eV)) {
356
337
 
357
338
  if ((matType == STANDARD || matType == UNLIT)) {
358
339
  if (!((*ma).transmissionWeight > 0.5 ||
@@ -377,33 +358,34 @@ if (*depth > 4) {
377
358
 
378
359
 
379
360
  if (USE_RR) {
380
- if (*depth >= RR_MAX && !cH) {
381
- let oH = (*aa).beta;
361
+ if (*depth >= RR_MAX && !(*eV)) {
362
+ let pl = (*path).beta;
382
363
 
383
- let oy = max(max(oH.x, oH.y), oH.z);
384
- let q: f32 = max(0.0, 1.0 - oy);
385
- if (dz(cw(RUSSIAN_ROULETTE)) < q) {
364
+ let pc = max(max(pl.x, pl.y), pl.z);
365
+ let q: f32 = max(0.0, 1.0 - pc);
366
+ if (sample1D(bE(RUSSIAN_ROULETTE)) < q) {
386
367
 
387
368
 
388
- (*aa).alpha = 1.0;
389
- (*aa).abort = true;
369
+ (*path).alpha = 1.0;
370
+ (*path).abort = true;
390
371
  }
391
372
  else {
392
- (*aa).beta /= 1.0 - q;
373
+ (*path).beta /= 1.0 - q;
393
374
  }
394
375
  }
395
376
  }
396
- if ((*aa).abort) {
377
+ if ((*path).abort) {
397
378
  return;
398
379
  }
399
380
 
400
- cZ((*aa).ray, si, *depth, true, (*aa).isNextRefraction);
401
- eX(ma, (*si).materialIndex, (*si).uv, (*si).uv1, (*si).instanceIndex, (*si).vertexColor);
402
381
 
382
+ }
383
+
384
+ fn jQ(path: ptr<function, Path>, depth: ptr<function, i32>, si: ptr<function, SurfaceInteraction>, ma: ptr<function, OpenPbrResolvedMaterial>, aJ: bool) {
403
385
  if (SPECTRAL) {
404
386
 
405
387
  if ((*ma).transmissionWeight > 0.001) {
406
- (*ma).specularIor = eN(
388
+ (*ma).specularIor = sampling_cauchy_ior(
407
389
  (*si).wavelength,
408
390
  (*ma).specularIor,
409
391
  (*ma).transmissionDispersionScale,
@@ -412,406 +394,557 @@ if ((*ma).transmissionWeight > 0.001) {
412
394
  }
413
395
  }
414
396
 
415
- if (cH) {
397
+ if (aJ) {
416
398
  return;
417
399
  }
418
400
 
419
401
 
420
402
  var lightSample: LightSampleRec;
421
- let hy = eo(3u) < (*ma).alpha;
403
+ let ht = ek(3u) < (*ma).alpha;
422
404
  for (var i = 0; i < rtUniform.lightsCount; i++) {
423
405
 
424
406
  let light: Light = analyticLights[i];
425
- let d = my((*aa).ray, light, &lightSample);
407
+ let d = mX((*path).ray, light, &lightSample);
426
408
  lightSample.pdf *= light.selectionPmf;
427
- let mC = (*si).hit && d > distance((*si).position, (*aa).ray.o);
428
- if (d != INF && !(mC && hy)) {
429
- let fa = fX((*aa).scatteringPdf, lightSample.pdf);
409
+ let lH = (*si).hit && d > distance((*si).position, (*path).ray.o);
410
+ if (d != INF && !(lH && ht)) {
411
+ let misWeight = fV((*path).scatteringPdf, lightSample.pdf);
430
412
  if (SPECTRAL) {
431
- lightSample.emission = ai(lightSample.emission, (*si).wavelength);
413
+ lightSample.emission = sampling_spectral_rgb_filter(lightSample.emission, (*si).spectralChannel);
432
414
  }
433
- (*aa).li += fa * (*aa).beta * lightSample.emission;
434
- (*aa).alpha = 1.0;
435
- (*aa).abort = true;
415
+ ${enabled || lightTracing || photonMapping ? 'if (!causticHitOwned(*path, true, true)) { causticHotRecord(*path,misWeight*lightSample.emission,2u); ' : ''}(*path).li += misWeight * (*path).beta * lightSample.emission;${enabled || lightTracing || photonMapping ? ' }' : ''}
416
+ (*path).alpha = 1.0;
417
+ (*path).abort = true;
436
418
  }
437
419
  }
438
420
 
439
421
  if (USE_ENVMAP) {
440
- if (!((*si).hit && hy)) {
441
- if ((*aa).isNextRefraction) {
422
+ if (!((*si).hit && ht)) {${lightTracing || photonMapping ? /* wgsl */ `
423
+ if(causticHitOwned(*path,false,true)){(*path).abort=true;return;}` : ''}
424
+ if ((*path).isNextRefraction) {
442
425
 
443
426
 
444
427
 
445
- let bg = cW(
446
- (*aa).ray,
447
- (*si).wavelength
428
+ let bg = cP(
429
+ (*path).ray,
430
+ (*si).spectralChannel
448
431
  );
449
- let cT = select(fX((*aa).scatteringPdf,
450
- iB(cY((*aa).ray.d)) * rtUniform.envLightPmf),
451
- 1.0, (*aa).scatteringIsDelta);
452
- (*aa).li += cT * (*aa).beta * bg.rgb * bg.a;
453
- (*aa).alpha = max((*aa).alpha, bg.a);
454
- (*aa).abort = true;
432
+ let cM = select(fV((*path).scatteringPdf,
433
+ envMapPdf(cT((*path).ray.d)) * rtUniform.envLightPmf),
434
+ 1.0, (*path).scatteringIsDelta);
435
+ (*path).li += cM * (*path).beta * bg.rgb * bg.a;
436
+ (*path).alpha = max((*path).alpha, bg.a);
437
+ (*path).abort = true;
455
438
  return;
456
439
  }
457
- let _uv = cY((*aa).ray.d);
440
+ let _uv = cT((*path).ray.d);
458
441
  var emission = textureLinear(envMap, _uv).rgb;
459
- let fa = fX(
460
- (*aa).scatteringPdf,
461
- iB(_uv) * rtUniform.envLightPmf
442
+ let misWeight = fV(
443
+ (*path).scatteringPdf,
444
+ envMapPdf(_uv) * rtUniform.envLightPmf
462
445
  );
463
446
  if (SPECTRAL) {
464
- emission = ai(emission, (*si).wavelength);
447
+ emission = sampling_spectral_rgb_filter(emission, (*si).spectralChannel);
465
448
  }
466
449
 
467
450
  if (!USE_BACKGROUND) {
468
- (*aa).alpha = 1.0;
451
+ (*path).alpha = 1.0;
469
452
  }
470
- (*aa).li += (*aa).beta * emission * fa;
471
- (*aa).abort = true;
453
+ (*path).li += (*path).beta * emission * misWeight;
454
+ (*path).abort = true;
472
455
  }
473
456
  }
474
457
 
475
458
  *depth = *depth + 1;
476
459
  }
477
460
 
478
- fn hC(fH: vec2f) -> Ray {
479
- let origin = cameraUniform.viewProjectionInv * vec4f(fH * 2.0 - 1.0, -1.0, 1.0);
480
- let center = cameraUniform.viewProjectionInv * vec4f(fH * 2.0 - 1.0, 1.0, 1.0);
461
+ fn eT(coord: vec2f) -> Ray {
462
+ let origin = cameraUniform.viewProjectionInv * vec4f(coord * 2.0 - 1.0, -1.0, 1.0);
463
+ let center = cameraUniform.viewProjectionInv * vec4f(coord * 2.0 - 1.0, 1.0, 1.0);
481
464
  var cam: Ray;
482
- iC(&cam, origin.xyz / origin.w, normalize(center.xyz * origin.w - origin.xyz * center.w));
465
+ initRay(&cam, origin.xyz / origin.w, normalize(center.xyz * origin.w - origin.xyz * center.w));
483
466
 
484
467
  return cam;
485
468
  }
486
469
 
487
470
 
488
- fn kz(radius: f32, xi: f32) -> vec2f {
471
+ fn kK(radius: f32, xi: f32) -> vec2f {
489
472
  var x = 0.25;
490
- for (var nG = 0; nG < 10; nG++) {
473
+ for (var iteration = 0; iteration < 10; iteration++) {
491
474
  let x2 = x * x;
492
475
  let x3 = x2 * x;
493
- let kP = 1.0 - x;
476
+ let la = 1.0 - x;
494
477
  let value = 10.0 * x2 - 20.0 * x3 + 15.0 * x2 * x2 -
495
478
  4.0 * x2 * x3 - xi;
496
- let mj = 20.0 * x * kP * kP * kP;
497
- if (abs(value) < 1e-6 || mj == 0.0) { break; }
498
- x = clamp(x - value / mj, 0.0, 1.0);
479
+ let mJ = 20.0 * x * la * la * la;
480
+ if (abs(value) < 1e-6 || mJ == 0.0) { break; }
481
+ x = clamp(x - value / mJ, 0.0, 1.0);
499
482
  }
500
- let jo = x * radius;
501
- return vec2f(jo, sqrt(max(radius * radius - jo * jo, 0.0)));
483
+ let jr = x * radius;
484
+ return vec2f(jr, sqrt(max(radius * radius - jr * jr, 0.0)));
502
485
  }
503
486
 
504
- fn iT(radius: f32, gx: f32) -> f32 {
505
- if (gx >= radius) { return 0.0; }
506
- let og = radius - gx;
507
- return og * og * og;
487
+ fn bevelCubicPdf(radius: f32, gu: f32) -> f32 {
488
+ if (gu >= radius) { return 0.0; }
489
+ let falloff = radius - gu;
490
+ return falloff * falloff * falloff;
508
491
  }
509
492
 
510
493
 
511
- fn mt(source: ad, radius: f32) -> vec3f {
494
+ fn mT(source: SurfaceInteraction, radius: f32) -> vec3f {
512
495
  var geometricNormal = source.faceNormal;
513
496
  if (dot(geometricNormal, source.vertexNormal) < 0.0) {
514
497
  geometricNormal = -geometricNormal;
515
498
  }
516
499
  var tangent: vec3f;
517
500
  var bitangent: vec3f;
518
- aL(geometricNormal, &tangent, &bitangent);
519
- var iF = vec3f(0.0);
520
-
521
- for (var ig = 0; ig < BEVEL_SAMPLES; ig++) {
522
- let ph = fp(CAMERA_BEVEL_BASE + u32(ig));
523
- var cA = ph.x;
524
- let oF = ph.y;
525
- var dj = geometricNormal;
501
+ sampling_orthonormal_basis(geometricNormal, &tangent, &bitangent);
502
+ var iE = vec3f(0.0);
503
+
504
+ for (var ih = 0; ih < BEVEL_SAMPLES; ih++) {
505
+ let qa = sample2D(CAMERA_BEVEL_BASE + u32(ih));
506
+ var cr = qa.x;
507
+ let pj = qa.y;
508
+ var cZ = geometricNormal;
526
509
  var fI = tangent;
527
- var ek = bitangent;
528
- var gf = 0.5;
529
- var hY = 0.25;
530
- var gH = 0.25;
531
- if (cA < 0.5) {
532
- cA *= 2.0;
533
- }
534
- else if (cA < 0.75) {
535
- let mJ = dj;
536
- dj = fI;
537
- fI = mJ;
538
- gf = 0.25;
539
- hY = 0.5;
540
- cA = (cA - 0.5) * 4.0;
510
+ var eh = bitangent;
511
+ var ge = 0.5;
512
+ var hW = 0.25;
513
+ var gC = 0.25;
514
+ if (cr < 0.5) {
515
+ cr *= 2.0;
516
+ }
517
+ else if (cr < 0.75) {
518
+ let nr = cZ;
519
+ cZ = fI;
520
+ fI = nr;
521
+ ge = 0.25;
522
+ hW = 0.5;
523
+ cr = (cr - 0.5) * 4.0;
541
524
  }
542
525
  else {
543
- let mJ = dj;
544
- dj = ek;
545
- ek = mJ;
546
- gf = 0.25;
547
- gH = 0.5;
548
- cA = (cA - 0.75) * 4.0;
549
- }
550
-
551
- let gV = kz(radius, oF);
552
- let phi = TWOPI * cA;
553
- let qv = gV.x *
554
- (cos(phi) * fI + sin(phi) * ek);
526
+ let nr = cZ;
527
+ cZ = eh;
528
+ eh = nr;
529
+ ge = 0.25;
530
+ gC = 0.5;
531
+ cr = (cr - 0.75) * 4.0;
532
+ }
533
+
534
+ let gQ = kK(radius, pj);
535
+ let phi = TWOPI * cr;
536
+ let rr = gQ.x *
537
+ (cos(phi) * fI + sin(phi) * eh);
555
538
  var ray: Ray;
556
- iC(
539
+ initRay(
557
540
  &ray,
558
- source.position + dj * gV.y + qv,
559
- -dj
541
+ source.position + cZ * gQ.y + rr,
542
+ -cZ
560
543
  );
561
- var hit: ad;
562
- iM(
544
+ var hit: SurfaceInteraction;
545
+ intersectSceneBevel(
563
546
  ray,
564
547
  &hit,
565
548
  source.instanceIndex,
566
- max(2.0 * gV.y, EPS)
549
+ max(2.0 * gQ.y, EPS)
567
550
  );
568
551
  if (!hit.hit) { continue; }
569
552
 
570
- let kQ = gf * abs(dot(dj, hit.faceNormal));
571
- let mF = hY * abs(dot(fI, hit.faceNormal));
572
- let kb = gH * abs(dot(ek, hit.faceNormal));
573
- var weight = kQ / max(
574
- kQ * kQ + mF * mF +
575
- kb * kb,
553
+ let lc = ge * abs(dot(cZ, hit.faceNormal));
554
+ let nj = hW * abs(dot(fI, hit.faceNormal));
555
+ let kj = gC * abs(dot(eh, hit.faceNormal));
556
+ var weight = lc / max(
557
+ lc * lc + nj * nj +
558
+ kj * kj,
576
559
  1e-8
577
560
  );
578
- weight *= iT(radius, distance(hit.position, source.position)) /
579
- max(iT(radius, gV.x), 1e-8);
580
- iF += weight * hit.vertexNormal;
561
+ weight *= bevelCubicPdf(radius, distance(hit.position, source.position)) /
562
+ max(bevelCubicPdf(radius, gQ.x), 1e-8);
563
+ iE += weight * hit.vertexNormal;
581
564
  }
582
565
 
583
- if (dot(iF, iF) <= 1e-12) { return source.normal; }
584
- let jH = normalize(iF);
585
- let result = source.normal + jH - source.vertexNormal;
566
+ if (dot(iE, iE) <= 1e-12) { return source.normal; }
567
+ let jM = normalize(iE);
568
+ let result = source.normal + jM - source.vertexNormal;
586
569
  if (dot(result, result) > 1e-12) { return normalize(result); }
587
570
  return source.normal;
588
571
  }
589
572
 
590
- fn bw(uv: vec2f, si: ptr<function, ad>, ray: Ray, ma: ptr<function, J>, outAux: ptr<function, RayTraceAuxiliary>) -> vec4f {
591
- var aa: Path;
592
- aa.ray = ray;
593
- aa.li = vec3f(0.0);
594
- aa.alpha = select(1.0, 0.0, rtUniform.transmissiveOutputAlphaMin < 1.0);
595
- aa.beta = vec3f(1.0);
596
- aa.fromEye = true;
597
- aa.scatteringPdf = 0.0;
598
- aa.scatteringIsDelta = false;
599
- aa.isNextRefraction = false;
600
- aa.abort = false;
573
+ fn cG(uv: vec2f, si: ptr<function, SurfaceInteraction>, ray: Ray, ma: ptr<function, OpenPbrResolvedMaterial>, outAux: ptr<function, RayTraceAuxiliary>, sc: bool) -> vec4f {
574
+ var path: Path;
575
+ path.ray = ray;
576
+ path.li = vec3f(0.0);
577
+ path.alpha = select(1.0, 0.0, rtUniform.transmissiveOutputAlphaMin < 1.0);
578
+ path.beta = vec3f(1.0);
579
+ path.fromEye = true;
580
+ path.scatteringPdf = 0.0;
581
+ path.scatteringIsDelta = false;
582
+ path.isNextRefraction = false;
583
+ path.abort = false;
601
584
 
602
- let rJ = (*ma).transmissionWeight < 0.001 && (*ma).subsurfaceWeight < 0.001 && (*ma).alpha > 0.99;
603
585
  let bounceLimit = max(rtUniform.bounces, 0);
586
+ let eZ = min(bounceLimit * 3, ${MAX_PATH_EVENTS});
604
587
  var depth = 0;
588
+ var aJ = false;
589
+ var bH = false;
590
+
591
+
605
592
 
606
- for (var idx: i32 = 0; idx < min(bounceLimit * 3, ${MAX_PATH_EVENTS}); idx = idx + 1) {
607
- if (rJ && idx > bounceLimit) {
608
- aa.abort = true;
593
+
594
+ for (var event = 0; event <= eZ; event++) {
595
+ if ((event != 0) | sc) {
596
+ intersectScene(path.ray, si, depth, event != 0, path.isNextRefraction);
597
+ getMaterial(ma, (*si).materialIndex, (*si).uv, (*si).uv1, (*si).instanceIndex, (*si).vertexColor);
609
598
  }
610
- if (aa.abort) {
611
- break;
599
+ if (event == 0) {
600
+ if (sc & (*si).hit & ((*ma).materialType == STANDARD)) {
601
+ (*outAux).albedo = select((*ma).baseColor, vec3f(1.0), (*ma).transmissionWeight > 0.5);
602
+ (*outAux).normal = select((*si).normal, -(*si).normal,
603
+ dot((*si).normal, (*si).position - cameraUniform.viewInv[3].xyz) > 0.0);
604
+ (*si).albedoSampled = (*ma).transmissionWeight > 0.5;
612
605
  }
613
- bounce(uv, &aa, &depth, si, ma, outAux);
606
+ bH = ((*ma).transmissionWeight < 0.001) & ((*ma).subsurfaceWeight < 0.001) & ((*ma).alpha > 0.99);
607
+ } else {
608
+ jQ(&path, &depth, si, ma, aJ);
614
609
  }
615
-
616
- return vec4f(aa.li, aa.alpha);
610
+ if (bH & (event > bounceLimit)) { path.abort = true; }
611
+ if (path.abort | (event >= eZ)) { break; }
612
+ nO(uv, &path, &depth, si, ma, outAux, &aJ);
613
+ if (path.abort) { break; }
617
614
  }
618
615
 
619
- fn iD(uv: vec2f, si: ptr<function, ad>, ray: Ray, ma: ptr<function, J>, outAux: ptr<function, RayTraceAuxiliary>) -> vec4f {
620
- ${deterministicPrimaryAlpha ? /* wgsl */ `let coverage = clamp((*ma).alpha, 0.0, 1.0);
621
- if (!(*si).hit || ((*ma).materialType != STANDARD && (*ma).materialType != UNLIT) || coverage >= 1.0) {
622
- return bw(uv, si, ray, ma, outAux);
616
+ return vec4f(path.li, path.alpha);
623
617
  }
624
618
 
619
+ fn iC(uv: vec2f, si: ptr<function, SurfaceInteraction>, ray: Ray, ma: ptr<function, OpenPbrResolvedMaterial>, outAux: ptr<function, RayTraceAuxiliary>) -> vec4f {
620
+ ${deterministicPrimaryAlpha ? /* wgsl */ `let coverage = clamp((*ma).alpha, 0.0, 1.0);
625
621
 
626
622
 
627
623
 
628
624
 
629
- var nX = ray;
630
- nX.o = (*si).position + ray.d * (EPS * 0.02);
631
- var dE = *si;
632
- dE.albedoSampled = false;
633
- cZ(nX, &dE, 0, false, false);
634
- var rr: J;
635
- eX(&rr, dE.materialIndex, dE.uv, dE.uv1, dE.instanceIndex, dE.vertexColor);
636
- var gn = *outAux;
637
- if (dE.hit && rr.materialType == STANDARD) {
638
- gn.albedo = select(
639
- rr.baseColor,
640
- vec3f(1.0),
641
- rr.transmissionWeight > 0.5
642
- );
643
- gn.normal = select(
644
- dE.normal,
645
- -dE.normal,
646
- dot(
647
- dE.normal,
648
- dE.position - cameraUniform.viewInv[3].xyz
649
- ) > 0.0
650
- );
651
- dE.albedoSampled = rr.transmissionWeight > 0.5;
652
- }
653
- let back = bw(
654
- uv, &dE, nX, &rr, &gn
655
- );
656
- if (coverage <= 0.0) {
657
- *outAux = gn;
658
- return back;
659
- }
660
-
661
- var tu = *si;
662
- var uI = *ma;
663
- uI.alpha = 1.0;
664
- var iW = *outAux;
665
- let qY = bw(
666
- uv, &tu, ray, &uI, &iW
667
- );
668
- (*outAux).albedo = mix(gn.albedo, iW.albedo, coverage);
669
- let fW = mix(gn.normal, iW.normal, coverage);
670
- (*outAux).normal = select(
671
- vec3f(0.0),
672
- normalize(fW),
673
- dot(fW, fW) > 1e-12
674
- );
675
- (*outAux).isBlank = gn.isBlank && iW.isBlank;
676
- (*outAux).isShadowCatcher = gn.isShadowCatcher && iW.isShadowCatcher;
677
- return mix(back, qY, coverage);` : /* wgsl */ `return bw(uv, si, ray, ma, outAux);`}
625
+ let split = (*si).hit & (((*ma).materialType == STANDARD) | ((*ma).materialType == UNLIT)) & (coverage < 1.0);
626
+ var st = ray;
627
+ var tr = *si;
628
+ var tq = *ma;
629
+ var iw = *outAux;
630
+ if (split) {
631
+ st.o = (*si).position + ray.d * (EPS * 0.02);
632
+ tr.albedoSampled = false;
678
633
  }
634
+ var back: vec4f;
635
+ var eg: RayTraceAuxiliary;
679
636
 
680
637
 
681
-
682
- fn mx(uv: vec2f, ray: Ray, outAux: ptr<function, RayTraceAuxiliary>) -> vec4f {
683
- var si: ad;
684
- var ma: J;
638
+ let vq = select(1u, rtUniform.loopUnrollGuard >> 1u, split & (coverage > 0.0));
639
+ for (var uM = 0u; uM < vq; uM++) {
640
+ let result = cG(uv, &tr, st, &tq, &iw, split & (uM == 0u));
641
+ if (!split | (coverage <= 0.0)) { *outAux = iw; return result; }
642
+ if (uM == 0u) {
643
+ back = result; eg = iw;
644
+ tr = *si; tq = *ma; tq.alpha = 1.0;
645
+ st = ray; iw = *outAux;
646
+ } else {
647
+ (*outAux).albedo = mix(eg.albedo, iw.albedo, coverage);
648
+ let cS = mix(eg.normal, iw.normal, coverage);
649
+ (*outAux).normal = select(vec3f(0.0), normalize(cS), dot(cS, cS) > 1e-12);
650
+ (*outAux).isBlank = eg.isBlank & iw.isBlank;
651
+ (*outAux).isShadowCatcher = eg.isShadowCatcher & iw.isShadowCatcher;
652
+ (*outAux).shadowCounts = mix(eg.shadowCounts, iw.shadowCounts, coverage);
653
+ return mix(back, result, coverage);
654
+ }
655
+ }
656
+ return vec4f(0.0);` : /* wgsl */ `return cG(uv, si, ray, ma, outAux, false);`}
657
+ }
658
+
659
+
660
+
661
+ ${spectral === false && deterministicPrimaryAlpha ? /* wgsl */ `fn hR(uv: vec2f, ray: Ray, outAux: ptr<function, RayTraceAuxiliary>) -> vec4f {
662
+ ${primaryVariables}
663
+ var oy: SurfaceInteraction;
664
+ var ox: OpenPbrResolvedMaterial;
665
+ var uh: RayTraceAuxiliary;
666
+ var iH = false;
667
+ var query = true;
668
+ var split = false;
669
+ var coverage = 1.0;
670
+ var front = false;
671
+ var back: vec4f;
672
+ var eg: RayTraceAuxiliary;
673
+ var path: Path; path.ray = ray;
674
+ path.alpha = select(1.0, 0.0, rtUniform.transmissiveOutputAlphaMin < 1.0);
675
+ path.beta = vec3f(1.0); path.fromEye = true;
676
+ let bounceLimit = max(rtUniform.bounces, 0);
677
+ let eZ = min(bounceLimit * 3, ${MAX_PATH_EVENTS});
678
+ var event = 0; var depth = 0; var aJ = false;
679
+ var bH = false;
680
+
681
+
682
+ for (var step = 0; step < (${MAX_PATH_EVENTS} + 1) * 2 + 2; step++) {
683
+ if (query) {
684
+ intersectScene(path.ray, &si, depth, event != 0, path.isNextRefraction);
685
+ getMaterial(&ma, si.materialIndex, si.uv, si.uv1, si.instanceIndex, si.vertexColor);
686
+ }
687
+ query = true;
688
+ if (!iH) {
689
+ ${primaryGuides}
690
+ oy = si; ox = ma; uh = *outAux;
691
+ iH = true;
692
+ coverage = clamp(ma.alpha, 0.0, 1.0);
693
+ split = si.hit & ((ma.materialType == STANDARD) | (ma.materialType == UNLIT)) & (coverage < 1.0);
694
+ if (split) {
695
+ path.ray.o = si.position + ray.d * (EPS * 0.02);
685
696
  si.albedoSampled = false;
686
- si.mediumType = 0;
687
- si.mediumExtinction = vec3f(0.0);
688
- si.mediumScattering = vec3f(0.0);
689
- si.mediumAnisotropy = 0.0;
690
- si.barycentrics = vec2f(0.0);
691
-
692
-
693
- cZ(ray, &si, 0, false, false);
694
- eX(&ma, si.materialIndex, si.uv, si.uv1, si.instanceIndex, si.vertexColor);
695
-
696
- if (si.hit && ma.materialType == SHADOW_CATCHER) {
697
- (*outAux).isShadowCatcher = true;
698
-
699
-
700
- (*outAux).albedo = vec3f(1.0);
701
- (*outAux).normal = select(si.normal, -si.normal, dot(si.normal, ray.d) > 0.0);
702
- var aa: Path;
703
- aa.ray = ray;
704
- aa.fromEye = true;
705
- sampleShadowCatcher(si, 0, &aa);
706
-
707
-
708
-
709
- return vec4f(vec3f(1.0), aa.alpha);
710
- }
711
- else {
712
- if (HAS_BEVEL && rtUniform.bevel != 0) {
713
- if (ma.bevel > 0.0) {
714
- si.normal = mt(si, ma.bevel);
715
- }
697
+ continue;
716
698
  }
717
-
718
-
719
-
720
- if (si.hit && (ma.materialType == STANDARD || ma.materialType == UNLIT)) {
699
+ } else if ((event == 0) & !front & split) {
700
+ if (si.hit & (ma.materialType == STANDARD)) {
721
701
  (*outAux).albedo = select(ma.baseColor, vec3f(1.0), ma.transmissionWeight > 0.5);
722
- (*outAux).normal = select(
723
- si.normal,
724
- -si.normal,
725
- dot(si.normal, si.position - cameraUniform.viewInv[3].xyz) > 0.0
726
- );
727
-
728
-
729
-
702
+ (*outAux).normal = select(si.normal, -si.normal,
703
+ dot(si.normal, si.position - cameraUniform.viewInv[3].xyz) > 0.0);
730
704
  si.albedoSampled = ma.transmissionWeight > 0.5;
731
705
  }
706
+ }
707
+ if (event == 0) {
708
+ bH = (ma.transmissionWeight < 0.001) & (ma.subsurfaceWeight < 0.001) & (ma.alpha > 0.99);
709
+ } else {
710
+ jQ(&path, &depth, &si, &ma, aJ);
711
+ }
712
+ if (bH & (event > bounceLimit)) { path.abort = true; }
713
+ if (!path.abort & (event < eZ)) {
714
+ nO(uv, &path, &depth, &si, &ma, outAux, &aJ);
715
+ }
716
+ if (path.abort | (event >= eZ)) {
717
+ let result = vec4f(path.li, path.alpha);
718
+ if (!split | (coverage <= 0.0)) { return result; }
719
+ if (front) {
720
+ (*outAux).albedo = mix(eg.albedo, (*outAux).albedo, coverage);
721
+ let cS = mix(eg.normal, (*outAux).normal, coverage);
722
+ (*outAux).normal = select(vec3f(0.0), normalize(cS), dot(cS, cS) > 1e-12);
723
+ (*outAux).isBlank = eg.isBlank & (*outAux).isBlank;
724
+ (*outAux).isShadowCatcher = eg.isShadowCatcher & (*outAux).isShadowCatcher;
725
+ (*outAux).shadowCounts = mix(eg.shadowCounts, (*outAux).shadowCounts, coverage);
726
+ return mix(back, result, coverage);
727
+ }
728
+ back = result; eg = *outAux;
729
+ front = true; query = false; event = 0; depth = 0; aJ = false;
730
+ si = oy; ma = ox; ma.alpha = 1.0; *outAux = uh;
731
+ path = Path(); path.ray = ray; path.beta = vec3f(1.0); path.fromEye = true;
732
+ path.alpha = select(1.0, 0.0, rtUniform.transmissiveOutputAlphaMin < 1.0);
733
+ } else { event++; }
734
+ }
735
+ return vec4f(0.0);
736
+ }
737
+ ` : spectral === false && !deterministicPrimaryAlpha ? /* wgsl */ `fn hR(uv: vec2f, ray: Ray, outAux: ptr<function, RayTraceAuxiliary>) -> vec4f {
738
+ ${primaryVariables}
739
+ var path: Path;
740
+ path.ray = ray;
741
+ path.alpha = select(1.0, 0.0, rtUniform.transmissiveOutputAlphaMin < 1.0);
742
+ path.beta = vec3f(1.0);
743
+ path.fromEye = true;
744
+ let bounceLimit = max(rtUniform.bounces, 0);
745
+ let eZ = min(bounceLimit * 3, ${MAX_PATH_EVENTS});
746
+ var bH = false;
747
+ var depth = 0;
748
+ var aJ = false;
749
+
732
750
 
733
- (*outAux).isShadowCatcher = false;
734
751
 
752
+ for (var event = 0; event <= eZ; event++) {
753
+ intersectScene(path.ray, &si, depth, event != 0, path.isNextRefraction);
754
+ getMaterial(&ma, si.materialIndex, si.uv, si.uv1, si.instanceIndex, si.vertexColor);
755
+ if (event == 0) {
756
+ ${primaryGuides}
757
+ bH = ma.transmissionWeight < 0.001 && ma.subsurfaceWeight < 0.001 && ma.alpha > 0.99;
758
+ } else {
759
+ jQ(&path, &depth, &si, &ma, aJ);
760
+ }
761
+ if (bH && event > bounceLimit) { path.abort = true; }
762
+ if (path.abort || event >= eZ) { break; }
763
+ nO(uv, &path, &depth, &si, &ma, outAux, &aJ);
764
+ if (path.abort) { break; }
765
+ }
766
+ return vec4f(path.li, path.alpha);
767
+ }
768
+ ` : spectral === true && !deterministicPrimaryAlpha ? /* wgsl */ `
769
+ fn hR(uv: vec2f, ray: Ray, outAux: ptr<function, RayTraceAuxiliary>) -> vec4f {
770
+ ${primaryVariables}
771
+ var oy: SurfaceInteraction;
772
+ var ox: OpenPbrResolvedMaterial;
773
+ var iH = false;
774
+ var path: Path; path.ray = ray;
775
+ let bounceLimit = max(rtUniform.bounces, 0);
776
+ let eZ = min(bounceLimit * 3, ${MAX_PATH_EVENTS});
777
+ var depth = 0; var event = 0; var aJ = false;
778
+ var bH = false;
779
+ var mc = 0;
780
+ let bi = rtUniform.dispersionWavelengths == 1;
781
+ var ew = false;
782
+ var eG = 0;
783
+ var aZ = 0.0;
784
+ var he: vec4u;
785
+ var ey = 0u;
786
+ var aU: RayTraceAuxiliary;
787
+ var color = vec3f(0.0); var alpha = 0.0;
788
+ var dw = vec3f(0.0);
789
+ var dz = vec3f(0.0);
790
+ var mz = true;
791
+
792
+
793
+
794
+ let xf = min((${MAX_PATH_EVENTS} + 1) * 3, i32(rtUniform.loopUnrollGuard * ${Math.ceil((MAX_PATH_EVENTS + 1) * 3 / 4)}u));
795
+ for (var step = 0; step < xf; step++) {
796
+ if (!iH | ((event != 0) & !path.abort)) {
797
+ intersectScene(path.ray, &si, depth, event != 0, path.isNextRefraction);
798
+ getMaterial(&ma, si.materialIndex, si.uv, si.uv1, si.instanceIndex, si.vertexColor);
799
+ }
800
+ if (event == 0) {
801
+ if (!iH) {
802
+ ${primaryGuides}
803
+ oy = si; ox = ma; iH = true;
804
+ ew = si.hit & (ma.transmissionWeight > 0.001) & (ma.transmissionDispersionScale > 0.001);
805
+ aZ = sample1D(CAMERA_WAVELENGTH);
806
+ if (bi) {
807
+ eG = min(i32(floor(aZ * 3.0)), 2);
808
+ aZ = fract(aZ * 3.0);
809
+ }
810
+ he = s0; ey = ca;
811
+ }
812
+ si = oy; ma = ox; aU = *outAux;
813
+ if (!bi) {
814
+ s0 = he; ca = ey; samplingBounce = 0u;
815
+ aU.isBlank = false; aU.isShadowCatcher = false;
816
+ }
817
+ si.wavelength = 0.0; si.spectralChannel = 0;
818
+ if (!bi | ew) {
819
+ let channel = select(mc, eG, bi);
820
+ si.spectralChannel = channel + 1;
821
+ si.wavelength = cU(u32(channel), aZ);
822
+ ma.specularIor = sampling_cauchy_ior(si.wavelength, ma.specularIor,
823
+ ma.transmissionDispersionScale, ma.dispersionAbbeNumber);
824
+ }
825
+ path = Path(); path.ray = ray; path.beta = vec3f(1.0); path.fromEye = true;
826
+ path.alpha = select(1.0, 0.0, rtUniform.transmissiveOutputAlphaMin < 1.0);
827
+ depth = 0; aJ = false;
828
+ bH = (ma.transmissionWeight < 0.001) & (ma.subsurfaceWeight < 0.001) & (ma.alpha > 0.99);
829
+ } else if (!path.abort) {
830
+ jQ(&path, &depth, &si, &ma, aJ);
831
+ }
832
+ if (bH & (event > bounceLimit)) { path.abort = true; }
833
+ if (!path.abort & (event < eZ)) {
834
+ nO(uv, &path, &depth, &si, &ma, &aU, &aJ);
835
+ }
836
+ if (path.abort | (event >= eZ)) {
837
+ let result = vec4f(path.li, path.alpha);
838
+ if (bi) {
839
+ *outAux = aU;
840
+ let scale = select(1.0, 3.0, ew);
841
+ return vec4f(result.rgb * scale, result.a);
842
+ }
843
+ color += result.rgb; alpha = max(alpha, result.a);
844
+ dw += aU.albedo;
845
+ dz += aU.normal;
846
+ mz = mz & aU.isBlank;
847
+ mc++;
848
+ if (mc >= 3) {
849
+ (*outAux).albedo = dw / 3.0;
850
+ (*outAux).normal = dz / 3.0;
851
+ (*outAux).isBlank = mz;
852
+ return vec4f(color, alpha);
853
+ }
854
+ event = 0;
855
+ } else { event++; }
856
+ }
857
+ return vec4f(0.0);
858
+ }
859
+ ` : /* wgsl */ `fn hR(uv: vec2f, ray: Ray, outAux: ptr<function, RayTraceAuxiliary>) -> vec4f {
860
+ ${primaryVariables}
861
+ intersectScene(ray, &si, 0, false, false);
862
+ getMaterial(&ma, si.materialIndex, si.uv, si.uv1, si.instanceIndex, si.vertexColor);
863
+ ${primaryGuides}
735
864
  if (SPECTRAL) {
736
865
 
737
866
 
738
867
 
739
868
 
740
- let sQ = array<f32, 3>(650.0, 510.0, 475.0);
741
- var tO = vec3f(0.0);
869
+ var vu = vec3f(0.0);
742
870
  var alpha = 0.0;
743
- var jE = vec3f(0.0);
744
- var jF = vec3f(0.0);
745
- var sf = true;
871
+ var dw = vec3f(0.0);
872
+ var dz = vec3f(0.0);
873
+ var mz = true;
746
874
  var si2 = si;
747
875
  var ma2 = ma;
748
- let qL = s0;
749
- let nT = em;
750
- let eh = rtUniform.dispersionWavelengths == 1;
751
- let jM = si.hit &&
876
+ var aZ = sample1D(CAMERA_WAVELENGTH);
877
+ let he = s0;
878
+ let ey = ca;
879
+ let bi = rtUniform.dispersionWavelengths == 1;
880
+ let ew = si.hit &&
752
881
  ma.transmissionWeight > 0.001 &&
753
882
  ma.transmissionDispersionScale > 0.001;
754
- let se = select(3, 1, eh);
755
- var lO = 0;
756
- if (eh && jM) {
883
+ let tm = select(3, 1, bi);
884
+ var eG = 0;
885
+ if (bi) {
757
886
 
758
887
 
759
- lO = min(i32(floor(dz(CAMERA_WAVELENGTH) * 3.0)), 2);
888
+ eG = min(i32(floor(aZ * 3.0)), 2);
889
+ aZ = fract(aZ * 3.0);
760
890
  }
761
- for (var i = 0; i < se; i++) {
891
+ for (var i = 0; i < tm; i++) {
762
892
 
763
893
 
764
894
 
765
- if (!eh) {
766
- s0 = qL;
767
- em = nT;
768
- cF = 0u;
895
+ if (!bi) {
896
+ s0 = he;
897
+ ca = ey;
898
+ samplingBounce = 0u;
769
899
  }
770
900
  si.wavelength = 0.0;
771
- if (!eh || jM) {
772
- si.wavelength = sQ[select(i, lO, eh)];
773
- ma.specularIor = eN(
901
+ si.spectralChannel = 0;
902
+ if (!bi || ew) {
903
+ let channel = select(i, eG, bi);
904
+ si.spectralChannel = channel + 1;
905
+ si.wavelength = cU(u32(channel), aZ);
906
+ ma.specularIor = sampling_cauchy_ior(
774
907
  si.wavelength,
775
908
  ma.specularIor,
776
909
  ma.transmissionDispersionScale,
777
910
  ma.dispersionAbbeNumber
778
911
  );
779
912
  }
780
- var dD: RayTraceAuxiliary;
781
- if (eh) {
782
- dD = *outAux;
913
+ var aU: RayTraceAuxiliary;
914
+ if (bi) {
915
+ aU = *outAux;
783
916
  } else {
784
- dD.albedo = (*outAux).albedo;
785
- dD.normal = (*outAux).normal;
786
- dD.isBlank = false;
787
- dD.isShadowCatcher = false;
788
- }
789
- let res = iD(uv, &si, ray, &ma, &dD);
790
- if (eh) {
791
- *outAux = dD;
792
- let scale = select(1.0, 3.0, jM);
917
+ aU.albedo = (*outAux).albedo;
918
+ aU.normal = (*outAux).normal;
919
+ aU.isBlank = false;
920
+ aU.isShadowCatcher = false;
921
+ }
922
+ let res = iC(uv, &si, ray, &ma, &aU);
923
+ if (bi) {
924
+ *outAux = aU;
925
+ let scale = select(1.0, 3.0, ew);
793
926
  return vec4f(res.rgb * scale, res.a);
794
927
  }
795
- tO += res.rgb;
928
+ vu += res.rgb;
796
929
  alpha = max(alpha, res.a);
797
- jE += dD.albedo;
798
- jF += dD.normal;
799
- sf = sf && dD.isBlank;
930
+ dw += aU.albedo;
931
+ dz += aU.normal;
932
+ mz = mz && aU.isBlank;
800
933
  si = si2;
801
934
  ma = ma2;
802
935
  }
803
- (*outAux).albedo = jE / 3.0;
804
- (*outAux).normal = jF / 3.0;
805
- (*outAux).isBlank = sf;
806
- return vec4f(tO, alpha);
936
+ (*outAux).albedo = dw / 3.0;
937
+ (*outAux).normal = dz / 3.0;
938
+ (*outAux).isBlank = mz;
939
+ return vec4f(vu, alpha);
807
940
  }
808
941
  else {
809
- return iD(uv, &si, ray, &ma, outAux);
810
- }
942
+ return iC(uv, &si, ray, &ma, outAux);
811
943
  }
812
944
  }
945
+ `}
813
946
 
814
- fn oK(ip: vec2f) -> vec2f {
947
+ fn kq(ip: vec2f) -> vec2f {
815
948
  let p = 2.0 * ip - 1.0;
816
949
  let greater = abs(p.x) > abs(p.y);
817
950
  let r = select(p.y, p.x, greater);
@@ -820,23 +953,25 @@ return r * vec2f(cos(theta), sin(theta));
820
953
  }
821
954
 
822
955
 
823
- @compute @workgroup_size(${WORKGROUP_SIZE}, ${WORKGROUP_SIZE}, 1)
956
+ @compute @workgroup_size(${workgroupSize}, ${workgroupSize}, 1)
824
957
  fn main(@builtin(global_invocation_id) globalId: vec3u) {
825
958
  let outputSize = rtUniform.outputSize;
826
959
  let scaleOffset = rtUniform.scaleOffset;
827
960
  var jitter = rtUniform.jitter;
828
961
 
829
- let fH = globalId.xy * vec2u(scaleOffset.xy) + vec2u(scaleOffset.zw);
830
- if (fH.x >= u32(outputSize.x) || fH.y >= u32(outputSize.y)) {
962
+ ${pathDiagnostic ? ` if (globalId.y >= mtPathParameters.y) { return; }
963
+ let pathId = vec2u(globalId.x, globalId.y + mtPathParameters.x);
964
+ ` : ''} let coord = ${pathDiagnostic ? 'pathId' : 'globalId.xy'} * vec2u(scaleOffset.xy) + vec2u(scaleOffset.zw);
965
+ if (coord.x >= u32(outputSize.x) || coord.y >= u32(outputSize.y)) {
831
966
  return;
832
967
  }
833
- let idx = fH.x + fH.y * u32(outputSize.x);
968
+ let idx = coord.x + coord.y * u32(outputSize.x);
834
969
 
835
970
  if (
836
971
  rtUniform.adaptiveSampling != 0 &&
837
972
  outNormal[idx].a >= textureLoad(
838
973
  adaptiveSampleTargets,
839
- vec2i(fH),
974
+ vec2i(coord),
840
975
  0
841
976
  ).r
842
977
  ) {
@@ -846,26 +981,26 @@ return;
846
981
 
847
982
 
848
983
 
849
- let uv = (vec2<f32>(f32(fH.x), f32(fH.y)) + vec2f(0.5)) / outputSize;
984
+ let uv = (vec2<f32>(f32(coord.x), f32(coord.y)) + vec2f(0.5)) / outputSize;
850
985
 
851
- bc = fH;
852
- bd = u32(outNormal[idx].a) + rtUniform.sampleSequenceOffset;
853
- cF = 0u; em = 0u;
854
- if (SAMPLING_PATTERN == 0 || SAMPLING_PATTERN == 1) {
855
- jitter = (fp(CAMERA_PIXEL) - 0.5) / outputSize;
986
+ aI = coord;
987
+ aC = u32(outNormal[idx].a) + rtUniform.sampleSequenceOffset;
988
+ samplingBounce = 0u; ca = 0u;
989
+ if (${inputHooks?.uniformJitter ? 'false' : 'SAMPLING_PATTERN == 0 || SAMPLING_PATTERN == 1'}) {
990
+ jitter = (sample2D(CAMERA_PIXEL) - 0.5) / outputSize;
856
991
  }
857
- kh(fH, i32(bd ^ eg(rtUniform.sequenceSeed)));
858
- var cam = hC(uv + jitter);
992
+ fi(coord, i32(aC ^ cB(rtUniform.sequenceSeed)));
993
+ var cam = eT(uv + jitter);
859
994
 
860
995
  if (cameraUniform.apertureRadius > 0.0) {
861
996
 
862
997
  let eye = cameraUniform.viewInv[3].xyz;
863
- let oj = -normalize(cameraUniform.viewInv[2].xyz);
864
- let qy = eye + cam.d * (cameraUniform.focusDistance / dot(cam.d, oj));
865
- let rK = cameraUniform.apertureRadius * oK(fp(CAMERA_LENS));
866
- let origin = (cameraUniform.viewInv * vec4f(rK, 0.0, 1.0)).xyz;
867
- let dir = normalize(qy - origin);
868
- iC(&cam, origin, dir);
998
+ let forward = -normalize(cameraUniform.viewInv[2].xyz);
999
+ let ju = eye + cam.d * (cameraUniform.focusDistance / dot(cam.d, forward));
1000
+ let sH = cameraUniform.apertureRadius * kq(sample2D(CAMERA_LENS));
1001
+ let origin = (cameraUniform.viewInv * vec4f(sH, 0.0, 1.0)).xyz;
1002
+ let dir = normalize(ju - origin);
1003
+ initRay(&cam, origin, dir);
869
1004
  }
870
1005
 
871
1006
  var outAux: RayTraceAuxiliary;
@@ -873,35 +1008,39 @@ outAux.albedo = vec3f(0.0);
873
1008
  outAux.normal = vec3f(0.0);
874
1009
  outAux.isBlank = false;
875
1010
  outAux.isShadowCatcher = false;
876
- var aF = mx(uv + jitter, cam, &outAux);
877
-
878
-
1011
+ ${pathDiagnostic ? ' mtPathBegin(coord);\n' : ''}${inputHooks?.begin ?? ''} var liAndAlpha = hR(uv + jitter, cam, &outAux);
1012
+ ${inputHooks?.unclampedColor ?? ''}
1013
+ ${(enabled || lightTracing || photonMapping) && debugGroup >= 0 ? /* wgsl */ ` liAndAlpha=${debugGroup >= 50 ? `vec4f(photonQueryStats,1.0)` : debugGroup >= 30 ? `vec4f(causticHot[${debugGroup - 30}],1.0)` : research?.debugOutput ?? 'liAndAlpha'};
1014
+ ` : ''}
879
1015
 
880
1016
  if (rtUniform.clamping > 0.0) {
881
1017
  let clamping = rtUniform.clamping;
882
- aF = vec4(clamp(aF.rgb, -vec3f(clamping), vec3f(clamping)), aF.a);
1018
+ liAndAlpha = vec4(clamp(liAndAlpha.rgb, -vec3f(clamping), vec3f(clamping)), liAndAlpha.a);
883
1019
  }
884
- if (!(aF.x < INF && aF.x > -EPS)) {
885
- aF = vec4f(0.0, 0.0, 0.0, 1.0);
1020
+ if (!(liAndAlpha.x < INF && liAndAlpha.x > -EPS)) {
1021
+ liAndAlpha = vec4f(0.0, 0.0, 0.0, 1.0);
886
1022
  }
887
1023
 
888
1024
  if (outAux.isShadowCatcher) {
889
1025
 
890
1026
 
891
- let aW = hH(cam);
892
- let qg = select(0.0, 1.0, aW.a >= 0.01);
893
- let jw = vec4f(aW.rgb * aW.a, aW.a);
1027
+ let aW = ft(cam);
1028
+ let qX = select(0.0, 1.0, aW.a >= 0.01);
1029
+ let jC = vec4f(aW.rgb * aW.a, aW.a);
894
1030
 
895
1031
 
896
- outShadowCatcher[idx].mask += vec4f(1.0, aW.a, qg, aF.a);
897
- outShadowCatcher[idx].background += jw;
898
- outColor[idx] += jw;
899
- outAlbedo[idx] += vec4f(outAux.albedo, qg);
900
- hK(idx, aW.rgb, outAux.normal);
901
1032
 
1033
+ outShadowCatcher[idx].mask += vec4f(1.0, aW.a, qX, 0.0);
1034
+ outShadowCatcher[idx].moments += vec4f(0.0, 0.0, outAux.shadowCounts);
1035
+ outShadowCatcher[idx].background += jC;
1036
+ outColor[idx] += jC;
1037
+ outAlbedo[idx] += vec4f(outAux.albedo, qX);
1038
+ hH(idx, aW.rgb, outAux.normal);
902
1039
 
903
- let visibility = 1.0 - aF.a;
904
- iS(idx, visibility * select(
1040
+
1041
+ let counts = outAux.shadowCounts;
1042
+ let visibility = 1.0 - select(0.0, counts.x / counts.y, counts.y > 0.0);
1043
+ iP(idx, visibility * select(
905
1044
  1.0, dot(aW.rgb, luminance), aW.a >= 0.01
906
1045
  ));
907
1046
  }
@@ -912,28 +1051,34 @@ if (HAS_SHADOW_CATCHER && outAux.isBlank && USE_BACKGROUND && !USE_BACKGROUND_MA
912
1051
 
913
1052
 
914
1053
 
915
- outShadowCatcher[idx].background += aF;
916
- outShadowCatcher[idx].mask.g += aF.a;
1054
+ outShadowCatcher[idx].background += liAndAlpha;
1055
+ outShadowCatcher[idx].mask.g += liAndAlpha.a;
917
1056
  }
918
- outColor[idx] += aF;
1057
+ outColor[idx] += liAndAlpha;
919
1058
  outAlbedo[idx] += vec4f(outAux.albedo, select(1.0, 0.0, outAux.isBlank));
920
- hK(idx, aF.rgb, outAux.normal);
921
- iS(idx, dot(aF.rgb, luminance));
922
- }
1059
+ hH(idx, liAndAlpha.rgb, outAux.normal);
1060
+ iP(idx, dot(liAndAlpha.rgb, luminance));
923
1061
  }
1062
+ ${pathDiagnostic ? ' mtPathEnd(outAux.normal, outAux.albedo);\n' : ''}${inputHooks?.end ?? ''}}
924
1063
  `;
925
1064
  // The query entry point shares the exact BVH and material implementation.
926
1065
  // It has no effect on the beauty entry point or its bindings.
927
1066
  // Gate optional material layers on scene-level feature flags so drivers can
928
1067
  // skip the unused BSDF lobes.
929
- let specializedSource = source + depthQueryWGSL;
1068
+ let specializedSource = source + depthQueryWGSL + reflectanceWGSL + aovTraceWGSL;
930
1069
  const backgroundBits = {
931
1070
  USE_BACKGROUND: 1,
932
1071
  USE_BACKGROUND_MAP: 2,
933
1072
  USE_GROUNDED_BACKGROUND: 4
934
1073
  };
935
1074
  specializedSource = specializedSource.replace(/\b(?:USE_BACKGROUND|USE_BACKGROUND_MAP|USE_GROUNDED_BACKGROUND)\b/g, (name) => `((rtUniform.backgroundFlags & ${backgroundBits[name]}) != 0)`);
936
- specializedSource = specializedSource.replace(new RegExp(`\\b(?:${Object.keys(WGPU_SCENE_FEATURE_BITS).join('|')})\\b`, 'g'), name => `((rtUniform.sceneFeatureFlags & ${WGPU_SCENE_FEATURE_BITS[name]}u) != 0u)`);
1075
+ specializedSource = specializedSource.replace(new RegExp(`\\b(?:${Object.keys(WGPU_SCENE_FEATURE_BITS).join('|')})\\b`, 'g'),
1076
+ // Material weights and absent texture indices already disable retained
1077
+ // material capabilities. Environment presence also changes background/MIS
1078
+ // behavior, so its active flag must remain dynamic when support is retained.
1079
+ name => sceneCapabilities === undefined || dynamicEnvironment && name === 'USE_ENVMAP' && (sceneCapabilities & WGPU_SCENE_FEATURE_BITS[name]) !== 0
1080
+ ? /* wgsl */ `((rtUniform.sceneFeatureFlags & ${WGPU_SCENE_FEATURE_BITS[name]}u) != 0u)`
1081
+ : (sceneCapabilities & WGPU_SCENE_FEATURE_BITS[name]) !== 0 ? /* wgsl */ `true` : /* wgsl */ `false`);
937
1082
  return specializedSource;
938
1083
  }
939
1084
  //# sourceMappingURL=rayTrace.compute.js.map