@meimu/mutracer 0.2.0 → 0.3.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (372) hide show
  1. package/CHANGELOG.md +222 -0
  2. package/LICENSES/FidelityFX-FSR.txt +19 -0
  3. package/LICENSES/pbrt-v4-Apache-2.0.txt +202 -0
  4. package/README.md +3 -0
  5. package/THIRD_PARTY_NOTICES.md +18 -4
  6. package/dist/assets/bvh.worker.js +1 -1
  7. package/dist/mutracer.umd.js +9328 -7614
  8. package/docs/api.md +83 -35
  9. package/docs/caustics.md +80 -0
  10. package/docs/materials.md +9 -6
  11. package/docs/performance.md +7 -0
  12. package/docs/post-processing.md +62 -9
  13. package/docs/progressive-rendering.md +53 -9
  14. package/docs/sampling.md +4 -0
  15. package/docs/technical/acceleration.md +52 -0
  16. package/docs/technical/aovs.md +79 -0
  17. package/docs/technical/caustics.md +109 -0
  18. package/docs/technical/continuous-spectrum.md +122 -0
  19. package/docs/technical/display-upscale.md +82 -0
  20. package/docs/technical/openpbr.md +99 -0
  21. package/docs/technical/pbrt-import.md +168 -0
  22. package/docs/technical/tiling.md +74 -0
  23. package/docs/technical/webgl.md +53 -0
  24. package/docs/updates.md +3 -1
  25. package/docs/viewer-checklist.md +65 -0
  26. package/docs/viewer.md +18 -6
  27. package/lib/Display.d.ts +19 -5
  28. package/lib/Display.js +10 -7
  29. package/lib/Display.js.map +1 -1
  30. package/lib/Engine.d.ts +4 -1
  31. package/lib/Engine.js +77 -14
  32. package/lib/Engine.js.map +1 -1
  33. package/lib/Render.d.ts +81 -24
  34. package/lib/Render.js +201 -26
  35. package/lib/Render.js.map +1 -1
  36. package/lib/RenderLoop.d.ts +7 -3
  37. package/lib/RenderLoop.js +68 -44
  38. package/lib/RenderLoop.js.map +1 -1
  39. package/lib/main.d.ts +4 -2
  40. package/lib/main.js +1 -0
  41. package/lib/main.js.map +1 -1
  42. package/lib/oidn.d.ts +1 -1
  43. package/lib/renderer/AovPrimitiveCache.js +39 -8
  44. package/lib/renderer/AovPrimitiveCache.js.map +1 -1
  45. package/lib/renderer/DisplayPostProcess.d.ts +8 -3
  46. package/lib/renderer/DisplayPostProcess.js +51 -18
  47. package/lib/renderer/DisplayPostProcess.js.map +1 -1
  48. package/lib/renderer/GPUTraceQueue.d.ts +2 -1
  49. package/lib/renderer/GPUTraceQueue.js +3 -1
  50. package/lib/renderer/GPUTraceQueue.js.map +1 -1
  51. package/lib/renderer/MaterialData.js +7 -2
  52. package/lib/renderer/MaterialData.js.map +1 -1
  53. package/lib/renderer/RenderingPipeline.d.ts +11 -1
  54. package/lib/renderer/RenderingPipeline.js.map +1 -1
  55. package/lib/renderer/TileRender.d.ts +2 -2
  56. package/lib/renderer/TileRender.js +128 -7
  57. package/lib/renderer/TileRender.js.map +1 -1
  58. package/lib/renderer/WGPUAov.d.ts +6 -1
  59. package/lib/renderer/WGPUAov.js +108 -14
  60. package/lib/renderer/WGPUAov.js.map +1 -1
  61. package/lib/renderer/WGPUCanvasSurface.js +12 -1
  62. package/lib/renderer/WGPUCanvasSurface.js.map +1 -1
  63. package/lib/renderer/WGPUCausticLightPass.d.ts +48 -0
  64. package/lib/renderer/WGPUCausticLightPass.js +217 -0
  65. package/lib/renderer/WGPUCausticLightPass.js.map +1 -0
  66. package/lib/renderer/WGPUEnvMapDistribution.js +19 -19
  67. package/lib/renderer/WGPUFullQuadPass.js +3 -3
  68. package/lib/renderer/WGPUPhotonMap.d.ts +37 -0
  69. package/lib/renderer/WGPUPhotonMap.js +191 -0
  70. package/lib/renderer/WGPUPhotonMap.js.map +1 -0
  71. package/lib/renderer/WGPURayTraceOutput.d.ts +13 -1
  72. package/lib/renderer/WGPURayTraceOutput.js +122 -28
  73. package/lib/renderer/WGPURayTraceOutput.js.map +1 -1
  74. package/lib/renderer/WGPURayTracePass.d.ts +65 -21
  75. package/lib/renderer/WGPURayTracePass.js +730 -409
  76. package/lib/renderer/WGPURayTracePass.js.map +1 -1
  77. package/lib/renderer/WGPURenderingPipeline.js +110 -68
  78. package/lib/renderer/WGPURenderingPipeline.js.map +1 -1
  79. package/lib/renderer/WebGLAov.js +3 -3
  80. package/lib/renderer/WebGLAov.js.map +1 -1
  81. package/lib/renderer/WebGLFullQuadPass.d.ts +2 -1
  82. package/lib/renderer/WebGLFullQuadPass.js +10 -0
  83. package/lib/renderer/WebGLFullQuadPass.js.map +1 -1
  84. package/lib/renderer/WebGLJNLMDenoiser.js +66 -66
  85. package/lib/renderer/WebGLJNLMDenoiser.js.map +1 -1
  86. package/lib/renderer/WebGLRayTraceOutputPass.js +4 -4
  87. package/lib/renderer/WebGLRayTracePass.d.ts +20 -11
  88. package/lib/renderer/WebGLRayTracePass.js +157 -116
  89. package/lib/renderer/WebGLRayTracePass.js.map +1 -1
  90. package/lib/renderer/WebGLRenderingPipeline.js +17 -14
  91. package/lib/renderer/WebGLRenderingPipeline.js.map +1 -1
  92. package/lib/renderer/WebGLSkyBaker.js +60 -60
  93. package/lib/renderer/accumulationTarget.d.ts +2 -1
  94. package/lib/renderer/accumulationTarget.js.map +1 -1
  95. package/lib/renderer/aov.d.ts +13 -1
  96. package/lib/renderer/aov.js +21 -2
  97. package/lib/renderer/aov.js.map +1 -1
  98. package/lib/renderer/aovDisplay.js +2 -2
  99. package/lib/renderer/aovDisplay.js.map +1 -1
  100. package/lib/renderer/binnedSahBvh.d.ts +2 -1
  101. package/lib/renderer/binnedSahBvh.js +24 -17
  102. package/lib/renderer/binnedSahBvh.js.map +1 -1
  103. package/lib/renderer/bvhAccel.d.ts +3 -1
  104. package/lib/renderer/bvhAccel.js +36 -6
  105. package/lib/renderer/bvhAccel.js.map +1 -1
  106. package/lib/renderer/cameraUniform.d.ts +1 -1
  107. package/lib/renderer/cameraUniform.js +6 -2
  108. package/lib/renderer/cameraUniform.js.map +1 -1
  109. package/lib/renderer/causticDiagnostics.d.ts +31 -0
  110. package/lib/renderer/causticDiagnostics.js +5 -0
  111. package/lib/renderer/causticDiagnostics.js.map +1 -0
  112. package/lib/renderer/causticEmission.d.ts +10 -0
  113. package/lib/renderer/causticEmission.js +40 -0
  114. package/lib/renderer/causticEmission.js.map +1 -0
  115. package/lib/renderer/causticUniform.d.ts +12 -0
  116. package/lib/renderer/causticUniform.js +22 -0
  117. package/lib/renderer/causticUniform.js.map +1 -0
  118. package/lib/renderer/caustics.d.ts +16 -0
  119. package/lib/renderer/caustics.js +93 -0
  120. package/lib/renderer/caustics.js.map +1 -0
  121. package/lib/renderer/compactVertices.d.ts +14 -0
  122. package/lib/renderer/compactVertices.js +124 -0
  123. package/lib/renderer/compactVertices.js.map +1 -0
  124. package/lib/renderer/easu.d.ts +11 -0
  125. package/lib/renderer/easu.js +156 -0
  126. package/lib/renderer/easu.js.map +1 -0
  127. package/lib/renderer/geometryUpdateState.d.ts +1 -0
  128. package/lib/renderer/geometryUpdateState.js.map +1 -1
  129. package/lib/renderer/geometryUpdates.js +3 -2
  130. package/lib/renderer/geometryUpdates.js.map +1 -1
  131. package/lib/renderer/glsl/aovDisplay.frag.js +5 -5
  132. package/lib/renderer/glsl/aovReflectance.glsl.js +53 -53
  133. package/lib/renderer/glsl/aovReflectanceSamples.glsl.js +1 -1
  134. package/lib/renderer/glsl/aovTrace.frag.js +45 -37
  135. package/lib/renderer/glsl/aovTrace.frag.js.map +1 -1
  136. package/lib/renderer/glsl/chunks/cameraProjection.glsl.d.ts +2 -0
  137. package/lib/renderer/glsl/chunks/cameraProjection.glsl.js +16 -0
  138. package/lib/renderer/glsl/chunks/cameraProjection.glsl.js.map +1 -0
  139. package/lib/renderer/glsl/chunks/cameraRay.glsl.d.ts +1 -1
  140. package/lib/renderer/glsl/chunks/cameraRay.glsl.js +9 -16
  141. package/lib/renderer/glsl/chunks/cameraRay.glsl.js.map +1 -1
  142. package/lib/renderer/glsl/chunks/emissiveLight.glsl.d.ts +2 -0
  143. package/lib/renderer/glsl/chunks/emissiveLight.glsl.js +35 -0
  144. package/lib/renderer/glsl/chunks/emissiveLight.glsl.js.map +1 -0
  145. package/lib/renderer/glsl/chunks/envMap.glsl.js +73 -73
  146. package/lib/renderer/glsl/chunks/intersect.glsl.js +478 -465
  147. package/lib/renderer/glsl/chunks/intersect.glsl.js.map +1 -1
  148. package/lib/renderer/glsl/chunks/materialBuffer.glsl.d.ts +1 -0
  149. package/lib/renderer/glsl/chunks/materialBuffer.glsl.js +156 -153
  150. package/lib/renderer/glsl/chunks/materialBuffer.glsl.js.map +1 -1
  151. package/lib/renderer/glsl/chunks/openPbrBsdf.glsl.js +771 -771
  152. package/lib/renderer/glsl/chunks/rand.glsl.js +3 -3
  153. package/lib/renderer/glsl/chunks/random.glsl.js +6 -6
  154. package/lib/renderer/glsl/chunks/rayTraceCore.glsl.d.ts +1 -0
  155. package/lib/renderer/glsl/chunks/rayTraceCore.glsl.js +70 -63
  156. package/lib/renderer/glsl/chunks/rayTraceCore.glsl.js.map +1 -1
  157. package/lib/renderer/glsl/chunks/sampleLight.glsl.js +89 -75
  158. package/lib/renderer/glsl/chunks/sampleLight.glsl.js.map +1 -1
  159. package/lib/renderer/glsl/chunks/sampleMaterial.glsl.d.ts +1 -0
  160. package/lib/renderer/glsl/chunks/sampleMaterial.glsl.js +160 -118
  161. package/lib/renderer/glsl/chunks/sampleMaterial.glsl.js.map +1 -1
  162. package/lib/renderer/glsl/chunks/sampleShadowCatcher.glsl.js +14 -14
  163. package/lib/renderer/glsl/chunks/sampling.glsl.js +88 -91
  164. package/lib/renderer/glsl/chunks/sampling.glsl.js.map +1 -1
  165. package/lib/renderer/glsl/chunks/sobol.glsl.js +79 -79
  166. package/lib/renderer/glsl/chunks/spectralPrefix.glsl.d.ts +6 -0
  167. package/lib/renderer/glsl/chunks/spectralPrefix.glsl.js +47 -0
  168. package/lib/renderer/glsl/chunks/spectralPrefix.glsl.js.map +1 -0
  169. package/lib/renderer/glsl/chunks/textureLinear.glsl.js +5 -5
  170. package/lib/renderer/glsl/chunks/uvProjection.glsl.js +11 -11
  171. package/lib/renderer/glsl/depthQuery.frag.js +13 -7
  172. package/lib/renderer/glsl/depthQuery.frag.js.map +1 -1
  173. package/lib/renderer/glsl/normalizeRayTraceOutput.frag.js +10 -10
  174. package/lib/renderer/glsl/rayTrace.frag.d.ts +1 -1
  175. package/lib/renderer/glsl/rayTrace.frag.js +338 -252
  176. package/lib/renderer/glsl/rayTrace.frag.js.map +1 -1
  177. package/lib/renderer/glsl/shadowCatcher.frag.js +27 -26
  178. package/lib/renderer/glsl/shadowCatcher.frag.js.map +1 -1
  179. package/lib/renderer/glsl/webglPipeline.frag.js +59 -59
  180. package/lib/renderer/gpuMemory.js +1 -1
  181. package/lib/renderer/gpuMemory.js.map +1 -1
  182. package/lib/renderer/lightSampling.d.ts +3 -2
  183. package/lib/renderer/lightSampling.js +14 -8
  184. package/lib/renderer/lightSampling.js.map +1 -1
  185. package/lib/renderer/openPbrEnergyLut.d.ts +2 -1
  186. package/lib/renderer/openPbrEnergyLut.js +18 -1
  187. package/lib/renderer/openPbrEnergyLut.js.map +1 -1
  188. package/lib/renderer/pathLimits.d.ts +5 -4
  189. package/lib/renderer/pathLimits.js +6 -5
  190. package/lib/renderer/pathLimits.js.map +1 -1
  191. package/lib/renderer/prepareMeshBVH.d.ts +2 -0
  192. package/lib/renderer/prepareMeshBVH.js +5 -3
  193. package/lib/renderer/prepareMeshBVH.js.map +1 -1
  194. package/lib/renderer/progressiveScheduler.js +5 -4
  195. package/lib/renderer/progressiveScheduler.js.map +1 -1
  196. package/lib/renderer/renderPipeline.d.ts +5 -0
  197. package/lib/renderer/renderPipeline.js +1 -0
  198. package/lib/renderer/renderPipeline.js.map +1 -1
  199. package/lib/renderer/researchTransport.d.ts +31 -0
  200. package/lib/renderer/researchTransport.js +5 -0
  201. package/lib/renderer/researchTransport.js.map +1 -0
  202. package/lib/renderer/sceneAssembly.d.ts +1 -1
  203. package/lib/renderer/sceneAssembly.js +4 -3
  204. package/lib/renderer/sceneAssembly.js.map +1 -1
  205. package/lib/renderer/sceneChangeDetector.d.ts +1 -1
  206. package/lib/renderer/sceneChangeDetector.js +3 -1
  207. package/lib/renderer/sceneChangeDetector.js.map +1 -1
  208. package/lib/renderer/sceneLayoutSchema.d.ts +2 -0
  209. package/lib/renderer/sceneLayoutSchema.js +3 -3
  210. package/lib/renderer/sceneLayoutSchema.js.map +1 -1
  211. package/lib/renderer/scenePreparation.d.ts +3 -2
  212. package/lib/renderer/scenePreparation.js +18 -2
  213. package/lib/renderer/scenePreparation.js.map +1 -1
  214. package/lib/renderer/scratchSampling.js +6 -6
  215. package/lib/renderer/spectrum.d.ts +21 -0
  216. package/lib/renderer/spectrum.js +154 -0
  217. package/lib/renderer/spectrum.js.map +1 -0
  218. package/lib/renderer/staticBvhPreparation.d.ts +9 -0
  219. package/lib/renderer/staticBvhPreparation.js +8 -2
  220. package/lib/renderer/staticBvhPreparation.js.map +1 -1
  221. package/lib/renderer/surfaceHit.d.ts +10 -0
  222. package/lib/renderer/surfaceHit.js +22 -0
  223. package/lib/renderer/surfaceHit.js.map +1 -0
  224. package/lib/renderer/tangentRequirements.d.ts +2 -0
  225. package/lib/renderer/tangentRequirements.js +7 -0
  226. package/lib/renderer/tangentRequirements.js.map +1 -0
  227. package/lib/renderer/textureAtlas.d.ts +4 -0
  228. package/lib/renderer/textureAtlas.js +48 -2
  229. package/lib/renderer/textureAtlas.js.map +1 -1
  230. package/lib/renderer/webgl.js +4 -0
  231. package/lib/renderer/webgl.js.map +1 -1
  232. package/lib/renderer/webglLightSampling.d.ts +39 -0
  233. package/lib/renderer/webglLightSampling.js +15 -0
  234. package/lib/renderer/webglLightSampling.js.map +1 -0
  235. package/lib/renderer/webglVertexAttributes.d.ts +17 -0
  236. package/lib/renderer/webglVertexAttributes.js +44 -0
  237. package/lib/renderer/webglVertexAttributes.js.map +1 -0
  238. package/lib/renderer/wgpuBindlessSource.js +3 -3
  239. package/lib/renderer/wgpuMaterialConstants.js +4 -3
  240. package/lib/renderer/wgpuMaterialConstants.js.map +1 -1
  241. package/lib/renderer/wgpuSceneUniform.js +2 -2
  242. package/lib/renderer/wgpuSceneUniform.js.map +1 -1
  243. package/lib/renderer/wgpuShaderSource.d.ts +22 -0
  244. package/lib/renderer/wgpuShaderSource.js +3 -1
  245. package/lib/renderer/wgpuShaderSource.js.map +1 -1
  246. package/lib/renderer/wgsl/aovCompact.wgsl.d.ts +4 -0
  247. package/lib/renderer/wgsl/aovCompact.wgsl.js +26 -0
  248. package/lib/renderer/wgsl/aovCompact.wgsl.js.map +1 -0
  249. package/lib/renderer/wgsl/aovDisplay.wgsl.js +9 -9
  250. package/lib/renderer/wgsl/aovReflectance.wgsl.js +55 -55
  251. package/lib/renderer/wgsl/aovReflectanceSamples.wgsl.js +1 -1
  252. package/lib/renderer/wgsl/aovResolve.wgsl.d.ts +4 -0
  253. package/lib/renderer/wgsl/aovResolve.wgsl.js +21 -2
  254. package/lib/renderer/wgsl/aovResolve.wgsl.js.map +1 -1
  255. package/lib/renderer/wgsl/aovSnapshot.wgsl.js +2 -2
  256. package/lib/renderer/wgsl/aovSnapshot.wgsl.js.map +1 -1
  257. package/lib/renderer/wgsl/aovTrace.wgsl.js +33 -33
  258. package/lib/renderer/wgsl/aovTraceDisplay.wgsl.d.ts +2 -0
  259. package/lib/renderer/wgsl/aovTraceDisplay.wgsl.js +56 -0
  260. package/lib/renderer/wgsl/aovTraceDisplay.wgsl.js.map +1 -0
  261. package/lib/renderer/wgsl/bloom.wgsl.js +18 -18
  262. package/lib/renderer/wgsl/causticLight.compute.d.ts +6 -0
  263. package/lib/renderer/wgsl/causticLight.compute.js +539 -0
  264. package/lib/renderer/wgsl/causticLight.compute.js.map +1 -0
  265. package/lib/renderer/wgsl/chunks/background.wgsl.d.ts +2 -0
  266. package/lib/renderer/wgsl/chunks/background.wgsl.js +102 -0
  267. package/lib/renderer/wgsl/chunks/background.wgsl.js.map +1 -0
  268. package/lib/renderer/wgsl/chunks/causticAdjoint.wgsl.d.ts +2 -0
  269. package/lib/renderer/wgsl/chunks/causticAdjoint.wgsl.js +12 -0
  270. package/lib/renderer/wgsl/chunks/causticAdjoint.wgsl.js.map +1 -0
  271. package/lib/renderer/wgsl/chunks/causticAtomic.wgsl.d.ts +2 -0
  272. package/lib/renderer/wgsl/chunks/causticAtomic.wgsl.js +16 -0
  273. package/lib/renderer/wgsl/chunks/causticAtomic.wgsl.js.map +1 -0
  274. package/lib/renderer/wgsl/chunks/caustics.wgsl.d.ts +1 -0
  275. package/lib/renderer/wgsl/chunks/caustics.wgsl.js +62 -0
  276. package/lib/renderer/wgsl/chunks/caustics.wgsl.js.map +1 -0
  277. package/lib/renderer/wgsl/chunks/common.wgsl.js +4 -4
  278. package/lib/renderer/wgsl/chunks/envMap.wgsl.js +37 -37
  279. package/lib/renderer/wgsl/chunks/intersect.wgsl.d.ts +6 -2
  280. package/lib/renderer/wgsl/chunks/intersect.wgsl.js +634 -620
  281. package/lib/renderer/wgsl/chunks/intersect.wgsl.js.map +1 -1
  282. package/lib/renderer/wgsl/chunks/intersectionAlpha.wgsl.d.ts +1 -1
  283. package/lib/renderer/wgsl/chunks/intersectionAlpha.wgsl.js +23 -21
  284. package/lib/renderer/wgsl/chunks/intersectionAlpha.wgsl.js.map +1 -1
  285. package/lib/renderer/wgsl/chunks/materialBuffer.wgsl.d.ts +3 -1
  286. package/lib/renderer/wgsl/chunks/materialBuffer.wgsl.js +77 -74
  287. package/lib/renderer/wgsl/chunks/materialBuffer.wgsl.js.map +1 -1
  288. package/lib/renderer/wgsl/chunks/openPbrBsdf.wgsl.js +795 -795
  289. package/lib/renderer/wgsl/chunks/pdm_displacement.wgsl.js +139 -139
  290. package/lib/renderer/wgsl/chunks/rand.wgsl.js +3 -3
  291. package/lib/renderer/wgsl/chunks/rayTraceCore.wgsl.d.ts +5 -1
  292. package/lib/renderer/wgsl/chunks/rayTraceCore.wgsl.js +45 -29
  293. package/lib/renderer/wgsl/chunks/rayTraceCore.wgsl.js.map +1 -1
  294. package/lib/renderer/wgsl/chunks/sampleLight.wgsl.d.ts +1 -1
  295. package/lib/renderer/wgsl/chunks/sampleLight.wgsl.js +142 -138
  296. package/lib/renderer/wgsl/chunks/sampleLight.wgsl.js.map +1 -1
  297. package/lib/renderer/wgsl/chunks/sampleMaterial.wgsl.d.ts +1 -1
  298. package/lib/renderer/wgsl/chunks/sampleMaterial.wgsl.js +228 -189
  299. package/lib/renderer/wgsl/chunks/sampleMaterial.wgsl.js.map +1 -1
  300. package/lib/renderer/wgsl/chunks/sampleShadowCatcher.wgsl.d.ts +1 -1
  301. package/lib/renderer/wgsl/chunks/sampleShadowCatcher.wgsl.js +11 -11
  302. package/lib/renderer/wgsl/chunks/sampleShadowCatcher.wgsl.js.map +1 -1
  303. package/lib/renderer/wgsl/chunks/sampling.wgsl.d.ts +1 -1
  304. package/lib/renderer/wgsl/chunks/sampling.wgsl.js +88 -92
  305. package/lib/renderer/wgsl/chunks/sampling.wgsl.js.map +1 -1
  306. package/lib/renderer/wgsl/chunks/sobol.wgsl.js +83 -83
  307. package/lib/renderer/wgsl/chunks/spectralPrefix.wgsl.d.ts +6 -0
  308. package/lib/renderer/wgsl/chunks/spectralPrefix.wgsl.js +66 -0
  309. package/lib/renderer/wgsl/chunks/spectralPrefix.wgsl.js.map +1 -0
  310. package/lib/renderer/wgsl/chunks/uvProjection.wgsl.js +11 -11
  311. package/lib/renderer/wgsl/chunks/vertexAttributes.wgsl.d.ts +2 -0
  312. package/lib/renderer/wgsl/chunks/vertexAttributes.wgsl.js +61 -0
  313. package/lib/renderer/wgsl/chunks/vertexAttributes.wgsl.js.map +1 -0
  314. package/lib/renderer/wgsl/compose.frag.wgsl.d.ts +2 -0
  315. package/lib/renderer/wgsl/compose.frag.wgsl.js +100 -98
  316. package/lib/renderer/wgsl/compose.frag.wgsl.js.map +1 -1
  317. package/lib/renderer/wgsl/customDenoise.wgsl.js +10 -10
  318. package/lib/renderer/wgsl/depthQuery.wgsl.d.ts +1 -1
  319. package/lib/renderer/wgsl/depthQuery.wgsl.js +12 -3
  320. package/lib/renderer/wgsl/depthQuery.wgsl.js.map +1 -1
  321. package/lib/renderer/wgsl/easu.wgsl.d.ts +2 -0
  322. package/lib/renderer/wgsl/easu.wgsl.js +80 -0
  323. package/lib/renderer/wgsl/easu.wgsl.js.map +1 -0
  324. package/lib/renderer/wgsl/easuDetail.wgsl.d.ts +21 -0
  325. package/lib/renderer/wgsl/easuDetail.wgsl.js +230 -0
  326. package/lib/renderer/wgsl/easuDetail.wgsl.js.map +1 -0
  327. package/lib/renderer/wgsl/jnlm.compute.js +74 -74
  328. package/lib/renderer/wgsl/jnlm.compute.js.map +1 -1
  329. package/lib/renderer/wgsl/offlineAdaptive.compute.js +26 -26
  330. package/lib/renderer/wgsl/oidnAuxiliary.wgsl.js +3 -3
  331. package/lib/renderer/wgsl/photonMap.compute.d.ts +29 -0
  332. package/lib/renderer/wgsl/photonMap.compute.js +352 -0
  333. package/lib/renderer/wgsl/photonMap.compute.js.map +1 -0
  334. package/lib/renderer/wgsl/proceduralSky.compute.js +64 -64
  335. package/lib/renderer/wgsl/rayTrace.compute.d.ts +23 -1
  336. package/lib/renderer/wgsl/rayTrace.compute.js +531 -543
  337. package/lib/renderer/wgsl/rayTrace.compute.js.map +1 -1
  338. package/lib/scene/MaterialState.d.ts +2 -2
  339. package/lib/scene/MaterialState.js +2 -2
  340. package/lib/scene/MaterialState.js.map +1 -1
  341. package/lib/scene/Scene.js.map +1 -1
  342. package/lib/settings/render.d.ts +22 -0
  343. package/lib/settings/render.js +2 -0
  344. package/lib/settings/render.js.map +1 -1
  345. package/lib/util/fromTHREE.js +23 -16
  346. package/lib/util/fromTHREE.js.map +1 -1
  347. package/lib/version.d.ts +1 -1
  348. package/lib/version.js +1 -1
  349. package/lib/version.js.map +1 -1
  350. package/llms.txt +2 -1
  351. package/package.json +7 -4
  352. package/lib/oidnBundledWeights.cdn.d.ts +0 -2
  353. package/lib/oidnBundledWeights.cdn.js +0 -5
  354. package/lib/oidnBundledWeights.cdn.js.map +0 -1
  355. package/lib/renderer/bvh.worker.d.ts +0 -1
  356. package/lib/renderer/bvh.worker.js +0 -16
  357. package/lib/renderer/bvh.worker.js.map +0 -1
  358. package/lib/renderer/bvhWorkerBuild.d.ts +0 -13
  359. package/lib/renderer/bvhWorkerBuild.js +0 -17
  360. package/lib/renderer/bvhWorkerBuild.js.map +0 -1
  361. package/lib/renderer/lightCore.d.ts +0 -12
  362. package/lib/renderer/lightCore.js +0 -13
  363. package/lib/renderer/lightCore.js.map +0 -1
  364. package/lib/renderer/materialCore.d.ts +0 -8
  365. package/lib/renderer/materialCore.js +0 -9
  366. package/lib/renderer/materialCore.js.map +0 -1
  367. package/lib/scene/PixelTexture.d.ts +0 -6
  368. package/lib/scene/PixelTexture.js +0 -10
  369. package/lib/scene/PixelTexture.js.map +0 -1
  370. package/lib/util/studioLighting.d.ts +0 -18
  371. package/lib/util/studioLighting.js +0 -36
  372. package/lib/util/studioLighting.js.map +0 -1
@@ -1,10 +1,10 @@
1
1
  // Next-event estimation with resampled importance sampling over the light
2
2
  // candidates, followed by BSDF (or phase function) sampling, as described in
3
3
  // http://www.pbr-book.org/3ed-2018/Light_Transport_I_Surface_Reflection/Direct_Lighting.html#EstimatingtheDirectLightingIntegral
4
- export function createSampleMaterialWgsl(hasAnisotropyDirections = true, hasCoatNormals = false) {
4
+ export function createSampleMaterialWgsl(hasAnisotropyDirections = true, hasCoatNormals = false, caustics = false, researchContribution = '', photonMapping = false, channelIndependentRis = false) {
5
5
  return /* wgsl */ `
6
6
 
7
- struct ob {
7
+ struct oQ {
8
8
  ray: Ray,
9
9
  maxDistance: f32,
10
10
  triangleIndex: i32,
@@ -16,32 +16,37 @@ lightSelectionPmf: f32,
16
16
  valid: bool,
17
17
  }
18
18
 
19
- fn sd(
19
+ fn tw(
20
20
  si: ptr<function, SurfaceInteraction>,
21
21
  ma: OpenPbrResolvedMaterial,
22
- aa: ptr<function, Path>,
22
+ path: ptr<function, Path>,
23
23
  ffnormal: vec3f,
24
- eM: bool,
24
+ isSurface: bool,
25
25
  lightSample: LightSampleRec,
26
26
  f: vec3f,
27
27
  scatteringPdf: f32,
28
- gz: ptr<function, ob>
28
+ eO: ptr<function, oQ>
29
29
  ) -> bool {
30
- (*gz).valid = false;
31
- (*gz).lightSelectionPmf = 0.0;
32
- (*gz).risTarget = 0.0;
30
+ (*eO).valid = false;
31
+ (*eO).lightSelectionPmf = 0.0;
32
+ (*eO).risTarget = 0.0;
33
33
  var Li = lightSample.emission;
34
34
 
35
- let lightDir = lightSample.direction;
36
- let qY = -(*aa).ray.d;
37
- let fA = lightSample.pdf;
35
+ let lightDir = lightSample.direction;${caustics ? /* wgsl */ `
36
+ if(isSurface&&isCausticSpecular(ma)){
37
+ var connection=*path;
38
+ causticAdvance(&connection,ma,dot(ffnormal,lightDir)<0.0,true);
39
+ if(causticHitOwned(connection,lightSample.sourceType!=0u,true)){return false;}
40
+ }` : ''}
41
+ let sg = -(*path).ray.d;
42
+ let lightPdf = lightSample.pdf;
38
43
  let lightSelectionPmf = lightSample.selectionPmf;
39
44
 
40
45
 
41
46
  ${hasCoatNormals ? /* wgsl */ `var cosThetaL = dot(ffnormal, lightDir);
42
- if (eM && ma.coatNormalEnabled) { cosThetaL = dot(ma.geometricNormal, lightDir); }` : 'let cosThetaL = dot(ffnormal, lightDir);'}
47
+ if (isSurface && ma.coatNormalEnabled) { cosThetaL = dot(ma.geometricNormal, lightDir); }` : 'let cosThetaL = dot(ffnormal, lightDir);'}
43
48
 
44
- if ((fA <= 0.0) | (lightSelectionPmf <= 0.0) |
49
+ if ((lightPdf <= 0.0) | (lightSelectionPmf <= 0.0) |
45
50
  (max(max(Li.x, Li.y), Li.z) <= 0.0)) {
46
51
  return false;
47
52
  }
@@ -50,201 +55,215 @@ if ((scatteringPdf <= 0.0) | (max(max(f.x, f.y), f.z) <= 0.0)) {
50
55
  return false;
51
56
  }
52
57
 
53
- var ns: Ray;
54
- var hw = (*si).position + EPS * lightDir;
55
- if (eM) {
56
- hw = sR((*si).position, (*si).faceNormal, lightDir);
57
- let ch = 0.1;
58
- var dL = dot((*si).normal, lightDir);
59
- ${hasCoatNormals ? /* wgsl */ ` if (ma.coatNormalEnabled) { dL = dot((*si).faceNormal, lightDir); }` : ''}
58
+ var oa: Ray;
59
+ var eY = (*si).position + EPS * lightDir;
60
+ if (isSurface) {
61
+ eY = un((*si).position, (*si).faceNormal, lightDir);
62
+ let shadowTerminatorCutoff = 0.1;
63
+ var dl = dot((*si).normal, lightDir);
64
+ ${hasCoatNormals ? /* wgsl */ ` if (ma.coatNormalEnabled) { dl = dot((*si).faceNormal, lightDir); }` : ''}
60
65
  let geometricNormal = select(
61
66
  (*si).faceNormal,
62
67
  -(*si).faceNormal,
63
- dL < 0.0
68
+ dl < 0.0
64
69
  );
65
- dL = abs(dL);
66
- let iq = dot(geometricNormal, lightDir);
67
- let pq = select(
68
- clamp(1.0 - iq / ch, 0.0, 1.0),
70
+ dl = abs(dl);
71
+ let iw = dot(geometricNormal, lightDir);
72
+ let qo = select(
73
+ clamp(1.0 - iw / shadowTerminatorCutoff, 0.0, 1.0),
69
74
  clamp(
70
- 2.0 - (iq + dL) / ch,
75
+ 2.0 - (iw + dl) / shadowTerminatorCutoff,
71
76
  0.0,
72
77
  1.0
73
78
  ),
74
- dL < ch
79
+ dl < shadowTerminatorCutoff
75
80
  );
76
- hw += (*si).shadowOffset * pq;
81
+ eY += (*si).shadowOffset * qo;
77
82
  }
78
83
 
79
84
 
80
85
 
81
86
 
82
- var mA = lightDir;
83
- var nN = lightSample.dist - EPS;
87
+ var mZ = lightDir;
88
+ var oy = lightSample.dist - EPS;
84
89
  if (lightSample.sourceType == 1u) {
85
- let uo =
90
+ let wc =
86
91
  (*si).position + lightSample.direction * lightSample.dist;
87
- let rc = uo + EPS * lightSample.normal;
88
- let rr = rc - hw;
89
- nN = length(rr);
90
- mA = normalize(rr);
92
+ let sk = wc + EPS * lightSample.normal;
93
+ let sB = sk - eY;
94
+ oy = length(sB);
95
+ mZ = normalize(sB);
91
96
  }
92
- gC(&ns, hw, mA);
97
+ initRay(&oa, eY, mZ);
93
98
 
94
99
 
95
100
 
96
101
 
97
- if (eM & (cosThetaL < 0.0) & (lightSample.sourceType == 0u)) {
98
- let background = hX(ns);
102
+ if (isSurface & (cosThetaL < 0.0) & (lightSample.sourceType == 0u)) {
103
+ let background = fI(oa);
99
104
  Li = background.rgb * background.a;
100
105
  }
101
- if (SPECTRAL) {
102
- Li = aj(Li, (*si).wavelength);
106
+ if (SPECTRAL${channelIndependentRis ? ' && rtUniform.dispersionWavelengths == 1' : ''}) {
107
+ Li = sampling_spectral_rgb_filter(Li, (*si).spectralChannel);
103
108
  }
104
109
 
105
110
 
106
111
 
107
- let fl = select(
108
- uS(fA, scatteringPdf),
112
+ let misWeight = select(
113
+ wM(lightPdf, scatteringPdf),
109
114
  1.0,
110
115
  lightSample.isDelta
111
116
  );
112
- if (fl > 0.0) {
113
- let kV = Li * f / fA * (*aa).beta;
114
- (*gz).risTarget = max(
115
- dot(max(kV * lightSelectionPmf, vec3f(0.0)), luminance),
117
+ if (misWeight > 0.0) {
118
+ let ll = Li * f / lightPdf * (*path).beta;
119
+ (*eO).risTarget = max(
120
+ dot(max(ll * lightSelectionPmf, vec3f(0.0)), ${channelIndependentRis ? 'select(luminance, vec3f(1.0 / 3.0), SPECTRAL && rtUniform.dispersionWavelengths != 1)' : 'luminance'}),
116
121
  0.0
117
122
  );
118
- (*gz).ray = ns;
119
- (*gz).maxDistance = nN;
120
- (*gz).triangleIndex = (*si).triangleIndex;
121
- (*gz).contribution = fl * kV;
122
- (*gz).lightSelectionPmf = lightSelectionPmf;
123
- (*gz).valid = true;
123
+ (*eO).ray = oa;
124
+ (*eO).maxDistance = oy;
125
+ (*eO).triangleIndex = (*si).triangleIndex;
126
+ (*eO).contribution = misWeight * ll;${channelIndependentRis ? /* wgsl */ `
127
+
128
+
129
+
130
+ if (SPECTRAL && rtUniform.dispersionWavelengths != 1) {
131
+ (*eO).contribution = sampling_spectral_rgb_filter((*eO).contribution, (*si).spectralChannel);
132
+ }` : ''}
133
+ (*eO).lightSelectionPmf = lightSelectionPmf;
134
+ (*eO).valid = true;
124
135
  return true;
125
136
  }
126
137
  return false;
127
138
  }
128
139
 
129
- struct qc {
140
+ struct rb {
130
141
  direction: vec3f,
131
142
  response: vec3f,
132
143
  pdf: f32,
133
144
  transmission: bool,
134
145
  }
135
146
 
136
- fn sW(
147
+ fn ps(
137
148
  si: ptr<function, SurfaceInteraction>,
138
149
  ma: OpenPbrResolvedMaterial,
139
- prepared: ag,
140
- aa: ptr<function, Path>,
150
+ prepared: OpenPbrPreparedBsdf,
151
+ path: ptr<function, Path>,
141
152
  ffnormal: vec3f,
142
- eM: bool
143
- ) -> qc {
144
- let candidateCount = kB();
145
- var selected: ob;
153
+ isSurface: bool
154
+ ) -> rb {
155
+ let candidateCount = kL();
156
+ var selected: oQ;
146
157
  selected.valid = false;
147
- var nH = 0.0;
148
- var mq = 0.0;
149
- var result: qc;
158
+ var oo = 0.0;
159
+ var mQ = 0.0;
160
+ var result: rb;
150
161
 
151
162
 
152
163
 
153
164
 
154
165
  for (var event = 0u; event <= candidateCount; event++) {
155
- let rX = event == candidateCount;
166
+ let continuation = event == candidateCount;
156
167
  var lightSample: LightSampleRec;
157
168
  var lightDir: vec3f;
158
169
  var scatteringPdf = 0.0;
159
170
  var response = vec3f(0.0);
160
- var tE = false;
161
- if (rX) {
162
- var rU = 1.0;
171
+ var vg = false;
172
+ if (continuation) {
173
+ var pP = 1.0;
163
174
  var valid = selected.valid;
164
175
  if (candidateCount > 1u) {
165
- valid = valid & (nH > 0.0);
176
+ valid = valid & (oo > 0.0);
166
177
  if (valid) {
167
- rU = selected.lightSelectionPmf * mq /
168
- (f32(candidateCount) * nH);
178
+ pP = selected.lightSelectionPmf * mQ /
179
+ (f32(candidateCount) * oo);
169
180
  }
170
181
  }
171
- if (valid && !intersectSceneShadow(selected.ray, selected.maxDistance, selected.triangleIndex)) {
172
- (*aa).li += selected.contribution * rU;
182
+ if (valid && !intersectSceneShadow(selected.ray, selected.maxDistance, selected.triangleIndex, (*si).instanceIndex)) {
183
+ ${caustics ? ` var connection=*path;
184
+ if(isSurface&&isCausticSpecular(ma)){causticAdvance(&connection,ma,dot(ffnormal,selected.ray.d)<0.0,true);}
185
+ connection.beta=vec3f(1.0);causticHotRecord(connection,selected.contribution*pP,0u);
186
+ ` : ''} (*path).li += selected.contribution * pP;
173
187
  }
174
- if (!eM) {
175
- result.direction = fH(-(*aa).ray.d,
176
- (*si).mediumAnisotropy, dZ(cE(PHASE_DIRECTION)));
177
- result.pdf = bL(
178
- dot(result.direction, -(*aa).ray.d), (*si).mediumAnisotropy);
188
+ if (!isSurface) {
189
+ result.direction = dQ(-(*path).ray.d,
190
+ (*si).mediumAnisotropy, sample2D(aX(PHASE_DIRECTION)));
191
+ result.pdf = ba(
192
+ dot(result.direction, -(*path).ray.d), (*si).mediumAnisotropy);
179
193
  return result;
180
194
  }
181
- let vR = vec3f(dZ(cE(BSDF_DIRECTION)), dp(cE(BSDF_LOBE)));
182
- tE = !prepared.material.thinWalled &
195
+ let yh = vec3f(sample2D(aX(BSDF_DIRECTION)), sample1D(aX(BSDF_LOBE)));
196
+ vg = !prepared.material.thinWalled &
183
197
  (abs(prepared.material.relativeIor - 1.0) <= 1e-6) &
184
198
  (prepared.probabilities[OPENPBR_LOBE_TRANSMISSION] >= 1.0 - 1e-6);
185
- if (tE) {
199
+ if (vg) {
186
200
  lightDir = openpbr_to_world(prepared.basis, -prepared.viewLocal);
187
- response = bh(prepared.material) * cF(prepared,
201
+ response = bb(prepared.material) * cp(prepared,
188
202
  ${hasCoatNormals ? 'select(-prepared.viewLocal.z, dot(prepared.coatBasis.normal, lightDir), prepared.material.coatNormalEnabled)' : '-prepared.viewLocal.z'});
189
203
  scatteringPdf = 1.0;
190
204
  result.transmission = true;
191
205
  } else {
192
206
  var roughness = 1.0; var specular = false; var diffuse = true;
193
- var jT = u32(OPENPBR_LOBE_DIFFUSE);
207
+ var lobe = u32(OPENPBR_LOBE_DIFFUSE);
194
208
 
195
209
  var transmission = false;
196
- if (!jq(prepared, vR, &lightDir, &transmission,
197
- &roughness, &specular, &diffuse, &jT)) { return result; }
210
+ if (!jC(prepared, yh, &lightDir, &transmission,
211
+ &roughness, &specular, &diffuse, &lobe)) { return result; }
198
212
  result.transmission = transmission;
199
213
  }
200
214
  } else {
201
- let lV = vec3f(dZ(sl(event, 1u)), dp(sl(event, 0u)));
202
- nE((*si).position, lV, event, candidateCount, &lightSample);
215
+ let ob = vec3f(sample2D(tF(event, 1u)), sample1D(tF(event, 0u)));
216
+ oj((*si).position, ob, event, candidateCount, &lightSample);
203
217
  lightDir = lightSample.direction;
204
218
  if ((lightSample.pdf <= 0.0) | (lightSample.selectionPmf <= 0.0) |
205
219
  (max(max(lightSample.emission.x, lightSample.emission.y), lightSample.emission.z) <= 0.0)) { continue; }
206
220
  ${hasCoatNormals ? /* wgsl */ `var cosThetaL = dot(ffnormal, lightDir);
207
- if (eM & ma.coatNormalEnabled) { cosThetaL = dot(ma.geometricNormal, lightDir); }` : /* wgsl */ `let cosThetaL = dot(ffnormal, lightDir);`}
208
- if (eM & (cosThetaL <= 0.0) & (ma.transmissionWeight <= 0.0) & (ma.subsurfaceWeight <= 0.0)) { continue; }
221
+ if (isSurface & ma.coatNormalEnabled) { cosThetaL = dot(ma.geometricNormal, lightDir); }` : /* wgsl */ `let cosThetaL = dot(ffnormal, lightDir);`}
222
+ if (isSurface & (cosThetaL <= 0.0) & (ma.transmissionWeight <= 0.0) & (ma.subsurfaceWeight <= 0.0)) { continue; }
209
223
  }
210
- if (!tE) {
211
- if (eM) {
212
- response = bO(prepared, lightDir, &scatteringPdf);
224
+ if (!vg) {
225
+ if (isSurface) {
226
+ response = openpbr_eval_prepared(prepared, lightDir, &scatteringPdf);
213
227
  } else {
214
- scatteringPdf = bL(
215
- dot(-(*aa).ray.d, lightDir), (*si).mediumAnisotropy);
228
+ scatteringPdf = ba(
229
+ dot(-(*path).ray.d, lightDir), (*si).mediumAnisotropy);
216
230
  response = vec3f(scatteringPdf);
217
231
  }
218
232
  }
219
- if (rX) {
233
+ if (continuation) {
220
234
  result.direction = lightDir; result.response = response; result.pdf = scatteringPdf;
221
235
  return result;
222
236
  }
223
- var candidate: ob;
224
- let tv = sd(si, ma, aa, ffnormal, eM,
237
+ var candidate: oQ;
238
+ let uY = tw(si, ma, path, ffnormal, isSurface,
225
239
  lightSample, response, scatteringPdf, &candidate);
226
- if (!tv) { continue; }
240
+ if (!uY) { continue; }
227
241
  if (candidateCount == 1u) {
228
242
  selected = candidate;
229
243
  continue;
230
244
  }
231
- let kO = candidate.risTarget / max(candidate.lightSelectionPmf, 1e-20);
232
- if (!(kO > 0.0) | (kO != kO)) { continue; }
233
- mq += kO;
245
+ let kZ = candidate.risTarget / max(candidate.lightSelectionPmf, 1e-20);
246
+ if (!(kZ > 0.0) | (kZ != kZ)) { continue; }
247
+ mQ += kZ;
234
248
  if (!selected.valid ||
235
- qx(event) * mq <= kO) {
249
+ rA(event) * mQ <= kZ) {
236
250
  selected = candidate;
237
- nH = candidate.risTarget;
251
+ oo = candidate.risTarget;
238
252
  }
239
253
  }
240
254
  return result;
241
255
  }
242
256
 
243
- fn qm(
257
+ fn emissiveHitMisWeight(
244
258
  si: ptr<function, SurfaceInteraction>,
245
- aa: ptr<function, Path>
246
- ) -> f32 {
247
- if ((*aa).fromEye | (rtUniform.lightWeightTotal <= 0.0) |
259
+ path: ptr<function, Path>
260
+ ) -> f32 {${caustics ? /* wgsl */ `
261
+ if (causticHitOwned(*path, true, true)) { return 0.0; }` : ''}
262
+
263
+
264
+ let pi = dot((*si).faceNormal, -(*path).ray.d);
265
+ if (pi <= 0.0 && materialsBuffer[(*si).materialIndex].doubleSided < 0.5) { return 0.0; }
266
+ if ((*path).fromEye | (rtUniform.lightWeightTotal <= 0.0) |
248
267
  (i32(materialsBuffer[(*si).materialIndex].matType) == UNLIT)) {
249
268
  return 1.0;
250
269
  }
@@ -252,54 +271,53 @@ let samplingLuminance = dot(
252
271
  materialsBuffer[(*si).materialIndex].emission,
253
272
  luminance
254
273
  );
255
- let qi = dot((*si).faceNormal, -(*aa).ray.d);
256
- if ((samplingLuminance <= 0.0) | (qi <= 0.0)) {
274
+ if ((samplingLuminance <= 0.0) | (pi <= 0.0)) {
257
275
  return 1.0;
258
276
  }
259
- let te = distance((*si).position, (*aa).ray.o);
260
- let fA = samplingLuminance / rtUniform.lightWeightTotal *
261
- te * te / max(qi, 1e-8);
262
- return gj((*aa).scatteringPdf, fA);
277
+ let uF = distance((*si).position, (*path).ray.o);
278
+ let lightPdf = samplingLuminance / rtUniform.lightWeightTotal *
279
+ uF * uF / max(pi, 1e-8);
280
+ return gm((*path).scatteringPdf, lightPdf);
263
281
  }
264
282
 
265
283
  ${hasCoatNormals ? /* wgsl */ `
266
284
 
267
285
 
268
- fn fT(input: vec3f, face: vec3f, view: vec3f) -> vec3f {
286
+ fn fQ(input: vec3f, face: vec3f, view: vec3f) -> vec3f {
269
287
  let front = dot(face, view) >= 0.0;
270
- let vP = select(-face, face, front);
271
- let sc = select(-input, input, front);
272
- if ((dot(input, face) <= 0.0) | (dot(sc, view) <= 1e-6)) { return vP; }
273
- return sc;
288
+ let yc = select(-face, face, front);
289
+ let tv = select(-input, input, front);
290
+ if ((dot(input, face) <= 0.0) | (dot(tv, view) <= 1e-6)) { return yc; }
291
+ return tv;
274
292
  }
275
293
  ` : ''}
276
- fn mL(
294
+ fn nB(
277
295
  si: ptr<function, SurfaceInteraction>,
278
296
  ma: ptr<function, OpenPbrResolvedMaterial>,
279
- aa: ptr<function, Path>
297
+ path: ptr<function, Path>
280
298
  ) {
281
299
  ${hasCoatNormals ? /* wgsl */ `
282
- let bK = (*si).faceNormal;
283
- let nB = (*si).normal;
300
+ let bC = (*si).faceNormal;
301
+ let oh = (*si).normal;
284
302
  ` : ''}
285
- var sO: f32 = -dot((*si).faceNormal, (*aa).ray.d);
286
- var tV: f32 = -dot((*si).normal, (*aa).ray.d);
303
+ var uk: f32 = -dot((*si).faceNormal, (*path).ray.d);
304
+ var vH: f32 = -dot((*si).normal, (*path).ray.d);
287
305
  if ((((*ma).transmissionWeight > 0.0) | ((*ma).subsurfaceWeight > 0.0)) & (*ma).thinWalled) {
288
306
 
289
- if (sO < 0.0) {
307
+ if (uk < 0.0) {
290
308
  (*si).faceNormal = -(*si).faceNormal;
291
- sO = -sO;
309
+ uk = -uk;
292
310
  }
293
- if (tV < 0.0) {
311
+ if (vH < 0.0) {
294
312
  (*si).normal = -(*si).normal;
295
- tV = -tV;
313
+ vH = -vH;
296
314
  }
297
315
  }
298
316
 
299
317
 
300
- var qM: bool = (sO >= 0.0) & (tV < 0.0);
301
- var ndv: f32 = select(tV, sO, qM);
302
- var N: vec3f = select((*si).normal, (*si).faceNormal, qM);
318
+ var rS: bool = (uk >= 0.0) & (vH < 0.0);
319
+ var ndv: f32 = select(vH, uk, rS);
320
+ var N: vec3f = select((*si).normal, (*si).faceNormal, rS);
303
321
 
304
322
  (*ma).inside = (ndv <= 0.0) & !(*ma).thinWalled;
305
323
 
@@ -307,128 +325,149 @@ var N: vec3f = select((*si).normal, (*si).faceNormal, qM);
307
325
  var ffnormal = select(-N, N, ndv >= 0.0);
308
326
  ${hasCoatNormals ? /* wgsl */ `
309
327
  if ((*ma).coatNormalEnabled) {
310
- let view = -(*aa).ray.d;
311
- let gp = dot(bK, view);
312
- (*ma).geometricNormal = select(-bK, bK, gp >= 0.0);
313
- ffnormal = fT(nB, bK, view);
314
- (*ma).coatNormal = fT((*si).coatNormal, bK, view);
315
- (*ma).inside = (gp <= 0.0) & !(*ma).thinWalled;
316
- (*ma).relativeIor = select((*ma).specularIor, 1.0 / (*ma).specularIor, (gp > 0.0) | (*ma).thinWalled);
328
+ let view = -(*path).ray.d;
329
+ let gr = dot(bC, view);
330
+ (*ma).geometricNormal = select(-bC, bC, gr >= 0.0);
331
+ ffnormal = fQ(oh, bC, view);
332
+ (*ma).coatNormal = fQ((*si).coatNormal, bC, view);
333
+ (*ma).inside = (gr <= 0.0) & !(*ma).thinWalled;
334
+ (*ma).relativeIor = select((*ma).specularIor, 1.0 / (*ma).specularIor, (gr > 0.0) | (*ma).thinWalled);
317
335
  }
318
336
  ` : ''}
319
337
 
320
- (*aa).scatteringIsDelta = false;
321
- var bs = false;
322
- var hC = false;
338
+ (*path).scatteringIsDelta = false;
339
+ var mediumSampled = false;
340
+ var hE = false;
323
341
  let mediumType = (*si).mediumType;
324
342
 
325
343
  var scatteringPdf: f32;
326
- var dH: vec3f;
344
+ var di: vec3f;
327
345
 
328
346
  if (HAS_MEDIUM) {
329
- let d = distance((*si).position, (*aa).ray.o);
330
- let os = (*aa).ray.o;
347
+ let d = distance((*si).position, (*path).ray.o);
348
+ let pd = (*path).ray.o;
331
349
  let extinction = (*si).mediumExtinction;
332
350
  let scattering = min((*si).mediumScattering, extinction);
333
- let tR = max(max(extinction.x, extinction.y), extinction.z);
334
- if ((mediumType > 0) & (tR > 0.0)) {
351
+ let vD = max(max(extinction.x, extinction.y), extinction.z);
352
+ if ((mediumType > 0) & (vD > 0.0)) {
335
353
 
336
354
 
337
- let oi = min(i32(dp(cE(MEDIUM_CHANNEL)) * 3.0), 2);
338
- let fS = extinction[oi];
339
- let iH = select(
355
+ let oW = min(i32(sample1D(aX(MEDIUM_CHANNEL)) * 3.0), 2);
356
+ let fP = extinction[oW];
357
+ let iO = select(
340
358
  d,
341
- min(-log(max(dp(cE(MEDIUM_DISTANCE)), 1e-7)) / fS, d),
342
- fS > 0.0
359
+ min(-log(max(sample1D(aX(MEDIUM_DISTANCE)), 1e-7)) / fP, d),
360
+ fP > 0.0
343
361
  );
344
- bs = iH < d;
345
- let transmittance = exp(-extinction * iH);
346
- let oU = select(
362
+ mediumSampled = iO < d;
363
+ let transmittance = exp(-extinction * iO);
364
+ let density = select(
347
365
  transmittance,
348
366
  extinction * transmittance,
349
- bs
367
+ mediumSampled
350
368
  );
351
- let oE = max((oU.x + oU.y + oU.z) / 3.0, 1e-8);
352
- if (bs) {
353
- (*aa).beta *= transmittance * scattering / oE;
369
+ let mediumPdf = max((density.x + density.y + density.z) / 3.0, 1e-8);
370
+ if (mediumSampled) {
371
+ (*path).beta *= transmittance * scattering / mediumPdf;
372
+
373
+ if (all((*path).beta == vec3f(0.0))) { (*path).abort = true; return; }
354
374
 
355
- (*aa).ray.o = os + iH * (*aa).ray.d;
356
- (*si).position = (*aa).ray.o;
375
+ (*path).ray.o = pd + iO * (*path).ray.d;
376
+ (*si).position = (*path).ray.o;
377
+
378
+ (*si).triangleIndex = -1;
379
+ (*si).instanceIndex = -1;
357
380
  }
358
381
  else {
359
- (*aa).beta *= transmittance / oE;
382
+ (*path).beta *= transmittance / mediumPdf;
383
+
384
+ if (all((*path).beta == vec3f(0.0))) { (*path).abort = true; return; }
360
385
  }
361
386
  }
362
387
  }
363
388
 
364
- if (!bs) {
365
- (*aa).li += qm(si, aa) * (*ma).emission * (*aa).beta;
389
+ if (!mediumSampled) {
390
+
391
+
392
+ var surfaceEmission = (*ma).emission;
393
+ if (SPECTRAL) {
394
+ surfaceEmission = sampling_spectral_rgb_filter(surfaceEmission, (*si).spectralChannel);
395
+ }
396
+ ${caustics ? ` let nO=emissiveHitMisWeight(si,path);
397
+ causticHotRecord(*path,nO*surfaceEmission,1u);causticEmitterRecord(*si,*path,nO,surfaceEmission);
398
+ (*path).li+=nO*surfaceEmission*(*path).beta;` : ' (*path).li += emissiveHitMisWeight(si, path) * surfaceEmission * (*path).beta;'}
366
399
  }
367
400
  if ((*ma).materialType == UNLIT) {
368
- (*aa).abort = true;
401
+ (*path).abort = true;
369
402
  return;
370
403
  }
371
404
 
372
405
 
373
- var prepared: ag;
374
- if (!bs) {
406
+ var prepared: OpenPbrPreparedBsdf;
407
+ if (!mediumSampled) {
375
408
  ${hasAnisotropyDirections ? /* wgsl */ `
376
409
  (*ma).directionTangent = (*si).directionTangent;
377
410
  (*ma).directionBitangent = (*si).directionBitangent;
378
411
  (*ma).geometryTangent = (*si).geometryTangent;
379
412
  (*ma).geometryBitangent = (*si).geometryBitangent;
380
413
  ` : /* wgsl */ ``}
381
- prepared = ds((*si).tangent, *ma, -(*aa).ray.d, ffnormal);
414
+ prepared = bX((*si).tangent, *ma, -(*path).ray.d, ffnormal);
382
415
  }
383
- let qW = sW(si, *ma, prepared, aa, ffnormal, !bs);
384
- dH = qW.direction;
385
- scatteringPdf = qW.pdf;
386
- if (!bs) {
387
- let f = qW.response;
388
- let isNextRefraction = qW.transmission;
416
+ ${researchContribution}${photonMapping ? /* wgsl */ ` if(!mediumSampled){let value=(*path).beta*sY(*si,prepared,(*path).fromEye,!(*path).causticHasReceiver);causticEstimateRecord(value,1u);(*path).li+=value;}
417
+ ` : ''} let lX = ps(si, *ma, prepared, path, ffnormal, !mediumSampled);
418
+ di = lX.direction;
419
+ scatteringPdf = lX.pdf;
420
+ if (!mediumSampled) {
421
+ let f = lX.response;
422
+ let isNextRefraction = lX.transmission;
389
423
 
390
424
 
391
425
 
392
426
 
393
427
  if (!(scatteringPdf > 0.0) |
394
428
  !all(f == f) | !all(abs(f) < vec3f(3.402823e38)) |
395
- (dot(dH, dH) < 0.5)) {
396
- (*aa).scatteringPdf = 0.0;
397
- (*aa).abort = true;
429
+ (dot(di, di) < 0.5)) {
430
+ (*path).scatteringPdf = 0.0;
431
+ (*path).abort = true;
398
432
  return;
399
433
  }
400
434
 
401
435
 
402
- (*aa).scatteringIsDelta = !prepared.material.thinWalled &
436
+ (*path).scatteringIsDelta = !prepared.material.thinWalled &
403
437
  (abs(prepared.material.relativeIor - 1.0) <= 1e-6) &
404
438
  (prepared.probabilities[OPENPBR_LOBE_TRANSMISSION] >= 1.0 - 1e-6);
405
- (*aa).beta *= f / scatteringPdf;
439
+ ${caustics ? /* wgsl */ ` causticAdvance(path, *ma, isNextRefraction, true);
440
+ ` : ''} (*path).beta *= f / scatteringPdf;
441
+
442
+ if (all((*path).beta == vec3f(0.0))) { (*path).abort = true; return; }
406
443
 
407
- hC = isNextRefraction & !(*ma).thinWalled;
408
- (*aa).isNextRefraction = isNextRefraction;
444
+ hE = isNextRefraction & !(*ma).thinWalled;
445
+ (*path).isNextRefraction = isNextRefraction;
409
446
 
410
447
 
411
- (*aa).ray.o = (*si).position + EPS * dH;
448
+ (*path).ray.o = (*si).position + EPS * di;
412
449
  ${hasCoatNormals ? /* wgsl */ `
413
- if ((*ma).coatNormalEnabled) { (*aa).ray.o = (*si).position + EPS * select(-bK, bK, dot(bK, dH) >= 0.0); }
450
+ if ((*ma).coatNormalEnabled) { (*path).ray.o = (*si).position + EPS * select(-bC, bC, dot(bC, di) >= 0.0); }
414
451
  ` : ''}
415
452
  }
416
- (*aa).scatteringPdf = scatteringPdf;
417
- (*aa).ray.d = dH;
418
- if (bs) {
419
- (*aa).isNextRefraction = false;
453
+ (*path).scatteringPdf = scatteringPdf;
454
+ (*path).ray.d = di;
455
+ if (mediumSampled) {${caustics ? /* wgsl */ `
456
+ causticAdvance(path, *ma, false, false);` : ''}
457
+ (*path).isNextRefraction = false;
420
458
  }
421
459
 
422
- (*aa).fromEye = false;
460
+ (*path).fromEye = false;
423
461
 
424
462
  if (HAS_MEDIUM) {
425
463
 
426
464
 
427
- if (!bs & hC & ((*ma).mediumType > 0)) {
428
- if (sO >= 0.0) {
465
+ if (!mediumSampled & hE & ((*ma).mediumType > 0)) {
466
+ if (uk >= 0.0) {
429
467
  (*si).mediumType = (*ma).mediumType;
430
468
  (*si).mediumExtinction = (*ma).mediumExtinction;
431
469
  (*si).mediumScattering = (*ma).mediumScattering;
470
+ (*path).scatteringMediumEntered = (*path).scatteringMediumEntered || any((*ma).mediumScattering > vec3f(0.0));
432
471
  (*si).mediumAnisotropy = (*ma).mediumAnisotropy;
433
472
  }
434
473
  else {