@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,3 +1,4 @@
1
+ import { type SurfaceHit } from './surfaceHit.js';
1
2
  import { WebGLAov } from './WebGLAov.js';
2
3
  import { type AovKind } from './aov.js';
3
4
  import { type SamplingPattern } from './sampling.js';
@@ -12,6 +13,10 @@ declare class WebGLRayTracePass {
12
13
  private _aovPrimitiveCache;
13
14
  private readonly _renderer;
14
15
  private _meshes;
16
+ private _emissiveActive;
17
+ private _directLightLegacy?;
18
+ private _emissiveCache;
19
+ private _emissiveTex;
15
20
  private _sceneEnvironment;
16
21
  private _rectLightTextures;
17
22
  private _analyticLights;
@@ -33,8 +38,9 @@ declare class WebGLRayTracePass {
33
38
  private _dirtyColorMeshes;
34
39
  private _tlas?;
35
40
  private _bvhData?;
36
- private _instancesData?;
37
- private _materialIndexData?;
41
+ private _instancesOffset;
42
+ private _vertexAttributeData?;
43
+ private _vertexAttributeLayout?;
38
44
  private _meshSnapshot;
39
45
  private _snapshotByMesh;
40
46
  private _needsUpdateAnalyticLightsBuffer;
@@ -62,14 +68,8 @@ declare class WebGLRayTracePass {
62
68
  private _sequenceSeed;
63
69
  private _zLogSPP;
64
70
  private _positionBufferTex;
65
- private _normalBufferTex;
66
- private _colorBufferTex;
67
- private _tangentBufferTex;
68
- private _uvBufferTex;
69
- private _uv1BufferTex;
71
+ private _vertexAttributeTex;
70
72
  private _bvhBufferTex;
71
- private _instancesBufferTex;
72
- private _matIndexBufferTex;
73
73
  private _hasTransmission;
74
74
  private _hasAlpha;
75
75
  private _invalid;
@@ -77,6 +77,7 @@ declare class WebGLRayTracePass {
77
77
  private _mainPass;
78
78
  private _shadowCatcherPass;
79
79
  private _viewProjInv;
80
+ private _projectionInv;
80
81
  private _apertureRadius;
81
82
  private _focusDistance;
82
83
  private _aovPass;
@@ -87,6 +88,8 @@ declare class WebGLRayTracePass {
87
88
  private _depthAspect;
88
89
  private _hasShadowCatcher;
89
90
  private _spectral;
91
+ private _shareSpectralPrefix;
92
+ private _independentSpectralPaths;
90
93
  constructor(renderer: WebGLRenderer);
91
94
  preparePrograms(): boolean;
92
95
  createPass(clear: boolean, tile: {
@@ -116,6 +119,8 @@ declare class WebGLRayTracePass {
116
119
  textureAtlas: import("./textureAtlas.js").TextureAtlasStats | undefined;
117
120
  };
118
121
  private _updateMeshData;
122
+ private _uploadBVH;
123
+ private _uploadInstanceRanges;
119
124
  private _updateMaterialConstants;
120
125
  private _updateMeshMembership;
121
126
  private _updateGeometryData;
@@ -136,18 +141,22 @@ declare class WebGLRayTracePass {
136
141
  bevel: boolean;
137
142
  dispersionWavelengths: 1 | 3;
138
143
  directLightCandidates: number;
144
+ caustics?: import('../Render.js').CausticSettings;
139
145
  }): void;
140
- setWavelength(wavelength: number): void;
146
+ setSpectralChannel(channel: number): void;
141
147
  setSampleCount(sampleCount: number): void;
142
148
  isInvalid(): boolean;
143
149
  hasShadowCatcher(): boolean;
144
150
  hasDispersion(): boolean;
151
+ hasSharedSpectralPrefix(): boolean;
145
152
  prepare(): void;
146
153
  setSamplingPattern(pattern: SamplingPattern, maxSamples: number, sequenceSeed?: number): boolean;
147
154
  setSampleSequenceOffset(_offset: number): void;
148
155
  prepareAovs(state: WebGLAov, camera: Camera, width: number, height: number, kinds: readonly AovKind[]): boolean;
149
156
  renderAovs(state: WebGLAov, camera: Camera, width: number, height: number, samples: number, cap: number, kinds: readonly AovKind[], sequenceOffset?: number): boolean;
150
- readDepthSamples(area: DepthSampleArea, aspect?: number): Promise<Float32Array | undefined>;
157
+ pickSurface(x: number, y: number, aspect?: number): Promise<SurfaceHit | null | undefined>;
158
+ readDepthSamples(area: DepthSampleArea, aspect?: number): Promise<Float32Array<ArrayBufferLike> | undefined>;
159
+ private _readDepthSamples;
151
160
  dispose(): void;
152
161
  }
153
162
  export default WebGLRayTracePass;
@@ -1,9 +1,14 @@
1
+ import { materialNeedsVertexTangents } from './tangentRequirements.js';
2
+ import { resolveSurfaceHit } from './surfaceHit.js';
3
+ import { researchTransport } from './researchTransport.js';
4
+ import { EmissiveTriangleCache } from './lightSampling.js';
5
+ import { prepareWebGLLightSampling } from './webglLightSampling.js';
1
6
  import { AovPrimitiveCache } from './AovPrimitiveCache.js';
2
7
  import { aovTraceFragment } from './glsl/aovTrace.frag.js';
3
8
  import { packAovScene } from './aovScene.js';
4
- import { aovMask } from './aov.js';
9
+ import { aovMask, AOV_ACCUMULATED_MASK, AOV_REFLECTANCE_MASK } from './aov.js';
5
10
  import { WebGLSkySource } from './WebGLSkySource.js';
6
- import { normalizeBounces } from './pathLimits.js';
11
+ import { normalizeBounces, MAX_PATH_EVENTS_WEBGL } from './pathLimits.js';
7
12
  import { updateMeshInstanceColors } from './prepareMeshBVH.js';
8
13
  import { updateTLASInstanceColors } from './bvhAccel.js';
9
14
  import { getMaterialHashKey } from '../scene/openPbrSchema.js';
@@ -22,7 +27,7 @@ import { MaterialChangeTracker, materialIsEmissive } from './materialChanges.js'
22
27
  import { constants, Texture2D as WebGLTexture2D } from './webgl.js';
23
28
  import { WebGLFullQuadPass } from './WebGLFullQuadPass.js';
24
29
  import { mat4 } from '../math.js';
25
- import { buildBLAS, buildTLAS, concatBLASBuffers, refitBLAS, refitTLAS, mergeRefitRanges } from './bvhAccel.js';
30
+ import { buildBLAS, buildWebTLAS, concatBLASBuffers, refitBLAS, refitTLAS, mergeRefitRanges } from './bvhAccel.js';
26
31
  import { generateBackgroundMapFromSceneBackground, environmentRotation, backgroundMapTransform, backgroundMapRotation } from './envMapCreation.js';
27
32
  import { envMapDistribution, environmentMapSourcesMatch } from './envMapDistribution.js';
28
33
  import createRayTraceFragmentShader from './glsl/rayTrace.frag.js';
@@ -37,6 +42,7 @@ import { updatePreparedGeometries, canUpdateGeometries, geometryTopologyChanged
37
42
  import { Attribute } from '../scene/Geometry.js';
38
43
  import { updateMeshInstances, updateMeshInstanceTransforms } from './prepareMeshBVH.js';
39
44
  import { mergeMeshesToGeometry } from './mergeMeshesToGeometry.js';
45
+ import { packVertexAttributes, vertexAttributeDefines, vertexAttributeLayout } from './webglVertexAttributes.js';
40
46
  import { DEFAULT_BEVEL_SAMPLES, normalizeBevelSamples } from './RenderingPipeline.js';
41
47
  import { getOpenPbrEnergyLutData, OPENPBR_ENERGY_LUT_HEIGHT, OPENPBR_ENERGY_LUT_WIDTH } from './openPbrEnergyLut.js';
42
48
  // A defensive mixture keeps weak-but-wide lights from being starved by an
@@ -64,6 +70,10 @@ class WebGLRayTracePass {
64
70
  _aovPrimitiveCache = new AovPrimitiveCache();
65
71
  _renderer;
66
72
  _meshes = [];
73
+ _emissiveActive = false;
74
+ _directLightLegacy;
75
+ _emissiveCache = new EmissiveTriangleCache();
76
+ _emissiveTex = new WebGLTexture2D(commonNearestFloatProps);
67
77
  _sceneEnvironment = new SceneEnvironmentCache();
68
78
  _rectLightTextures = new RectLightTextureTracker();
69
79
  _analyticLights = [];
@@ -85,8 +95,9 @@ class WebGLRayTracePass {
85
95
  _dirtyColorMeshes = new Set();
86
96
  _tlas;
87
97
  _bvhData;
88
- _instancesData;
89
- _materialIndexData;
98
+ _instancesOffset = 0;
99
+ _vertexAttributeData;
100
+ _vertexAttributeLayout;
90
101
  _meshSnapshot = [];
91
102
  _snapshotByMesh = new WeakMap();
92
103
  _needsUpdateAnalyticLightsBuffer = true;
@@ -122,17 +133,8 @@ class WebGLRayTracePass {
122
133
  _sequenceSeed = 0;
123
134
  _zLogSPP = 0;
124
135
  _positionBufferTex = new WebGLTexture2D(commonNearestFloatProps);
125
- _normalBufferTex = new WebGLTexture2D(commonNearestFloatProps);
126
- _colorBufferTex = new WebGLTexture2D(commonNearestFloatProps);
127
- _tangentBufferTex = new WebGLTexture2D(commonNearestFloatProps);
128
- _uvBufferTex = new WebGLTexture2D(commonNearestFloatProps);
129
- _uv1BufferTex = new WebGLTexture2D(commonNearestFloatProps);
136
+ _vertexAttributeTex = new WebGLTexture2D(commonNearestFloatProps);
130
137
  _bvhBufferTex = new WebGLTexture2D(commonNearestFloatProps);
131
- _instancesBufferTex = new WebGLTexture2D(commonNearestFloatProps);
132
- _matIndexBufferTex = new WebGLTexture2D({
133
- ...commonNearestFloatProps
134
- // type: constants.INT
135
- });
136
138
  _hasTransmission = false;
137
139
  _hasAlpha = false;
138
140
  _invalid = false;
@@ -140,6 +142,7 @@ class WebGLRayTracePass {
140
142
  _mainPass;
141
143
  _shadowCatcherPass;
142
144
  _viewProjInv = mat4.create();
145
+ _projectionInv = mat4.create();
143
146
  _apertureRadius = 0;
144
147
  _focusDistance = 10;
145
148
  _aovPass;
@@ -150,6 +153,8 @@ class WebGLRayTracePass {
150
153
  _depthAspect = 1;
151
154
  _hasShadowCatcher = false;
152
155
  _spectral = false;
156
+ _shareSpectralPrefix = true;
157
+ _independentSpectralPaths = false;
153
158
  constructor(renderer) {
154
159
  this._renderer = renderer;
155
160
  const accumulationOutput = {
@@ -222,7 +227,7 @@ class WebGLRayTracePass {
222
227
  : this._mainPass.getOutput(label);
223
228
  }
224
229
  setBounce(bounce) {
225
- const next = normalizeBounces(bounce);
230
+ const next = normalizeBounces(bounce, MAX_PATH_EVENTS_WEBGL);
226
231
  const changed = this._bounces !== next;
227
232
  this._bounces = next;
228
233
  return changed;
@@ -433,34 +438,14 @@ class WebGLRayTracePass {
433
438
  this._needsUpdateMeshMembership = false;
434
439
  const mergedGeometry = res.geometry;
435
440
  const materials = res.materials;
436
- const tlas = buildTLAS(res.instances, res.blases);
437
- this._tlas = tlas;
438
- const tlasBuffer = new Float32Array(tlas.buffer);
439
- const instancesBuffer = this._instancesData = new Float32Array(tlas.instancesBuffer);
440
- const blasBuffer = new Float32Array(concatBLASBuffers(res.blases));
441
- const bvhBuffer = this._bvhData = new Float32Array(tlasBuffer.length + blasBuffer.length);
442
- const blasOffset = tlasBuffer.length / 4;
443
- bvhBuffer.set(tlasBuffer);
444
- bvhBuffer.set(blasBuffer, blasOffset * 4);
441
+ this._tlas = buildWebTLAS(res.instances, res.blases);
442
+ this._uploadBVH(new Float32Array(concatBLASBuffers(res.blases)));
443
+ const layout = this._vertexAttributeLayout = vertexAttributeLayout(mergedGeometry);
444
+ let vertexAttributeColumns = 0;
445
445
  if (mergedGeometry.position.array.length > 0) {
446
446
  setDataTexture(this._positionBufferTex, mergedGeometry.position.array, 3);
447
- setDataTexture(this._normalBufferTex, mergedGeometry.normal.array, 3);
448
- mergedGeometry.color &&
449
- setDataTexture(this._colorBufferTex, mergedGeometry.color.array, 3);
450
- mergedGeometry.tangent &&
451
- setDataTexture(this._tangentBufferTex, mergedGeometry.tangent.array, 4);
452
- mergedGeometry.uv &&
453
- setDataTexture(this._uvBufferTex, mergedGeometry.uv.array, 2);
454
- mergedGeometry.uv1 &&
455
- setDataTexture(this._uv1BufferTex, mergedGeometry.uv1.array, 2);
456
- mergedGeometry.materialIndex &&
457
- setDataTexture(this._matIndexBufferTex,
458
- // TODO currently int texture doesn't work
459
- this._materialIndexData = new Float32Array(mergedGeometry.materialIndex.array), 4);
460
- }
461
- if (bvhBuffer.length > 0) {
462
- setDataTexture(this._bvhBufferTex, bvhBuffer, 4);
463
- setDataTexture(this._instancesBufferTex, instancesBuffer, 4);
447
+ this._vertexAttributeData = packVertexAttributes(mergedGeometry, layout, new Float32Array(mergedGeometry.vertexCount * layout.stride * 4));
448
+ vertexAttributeColumns = setDataTexture(this._vertexAttributeTex, this._vertexAttributeData, 4).columnsLog;
464
449
  }
465
450
  this._materialData?.dispose(this._renderer.gl);
466
451
  const materialData = new MaterialTable(materials, this._analyticLights, {
@@ -472,26 +457,41 @@ class WebGLRayTracePass {
472
457
  this._tracePasses.forEach((pass) => {
473
458
  pass.setUniforms({
474
459
  bvhBuffer: this._bvhBufferTex,
475
- instancesBuffer: this._instancesBufferTex,
476
460
  positionBuffer: this._positionBufferTex,
477
- normalBuffer: this._normalBufferTex,
478
- tangentBuffer: mergedGeometry.tangent ? this._tangentBufferTex : null,
479
- colorBuffer: mergedGeometry.color ? this._colorBufferTex : null,
480
- uvBuffer: mergedGeometry.uv ? this._uvBufferTex : null,
481
- uv1Buffer: mergedGeometry.uv1 ? this._uv1BufferTex : null,
482
- materialIndexBuffer: this._matIndexBufferTex,
483
- bvhColumns: textureDimensionsFromArray(bvhBuffer.length / 4).columnsLog,
461
+ vertexAttributes: this._vertexAttributeTex,
484
462
  vertexColumns: textureDimensionsFromArray(Attribute.getCount(mergedGeometry.position)).columnsLog,
485
- instancesColumns: textureDimensionsFromArray(instancesBuffer.length / 4)
486
- .columnsLog,
487
- blasOffset,
463
+ vertexAttributeColumns,
488
464
  isEmptyScene: +(res.instances.length === 0)
489
465
  });
490
466
  });
491
467
  this._updateMaterialConstants(materials, materialData, mergedGeometry);
492
468
  this._materialChanges.capture(materials);
493
469
  this._pendingMaterialUpdate = undefined;
494
- return bvhBuffer;
470
+ }
471
+ // One texture holds the TLAS, the BLASes and then the instance records.
472
+ _uploadBVH(blas) {
473
+ const tlas = this._tlas, instances = new Float32Array(tlas.instancesBuffer);
474
+ const tlasLength = tlas.buffer.byteLength / 4, instancesOffset = tlasLength + blas.length;
475
+ const data = this._bvhData = new Float32Array(instancesOffset + instances.length);
476
+ data.set(new Float32Array(tlas.buffer));
477
+ data.set(blas, tlasLength);
478
+ data.set(instances, instancesOffset);
479
+ this._instancesOffset = instancesOffset / 4;
480
+ if (data.length > 0)
481
+ setDataTexture(this._bvhBufferTex, data, 4);
482
+ this._tracePasses.forEach(pass => pass.setUniforms({
483
+ bvhColumns: textureDimensionsFromArray(data.length / 4).columnsLog,
484
+ blasOffset: tlasLength / 4,
485
+ instancesOffset: this._instancesOffset
486
+ }));
487
+ }
488
+ _uploadInstanceRanges(ranges) {
489
+ const instances = new Uint8Array(this._tlas.instancesBuffer), data = this._bvhData;
490
+ const base = this._instancesOffset * 16;
491
+ for (const { offset, size } of ranges) {
492
+ new Uint8Array(data.buffer).set(instances.subarray(offset, offset + size), base + offset);
493
+ this._bvhBufferTex.updateDataRange(this._renderer.gl, data, base + offset, size);
494
+ }
495
495
  }
496
496
  _updateMaterialConstants(materials, materialData, mergedGeometry) {
497
497
  // Avoid too much shader compilation
@@ -503,13 +503,24 @@ class WebGLRayTracePass {
503
503
  this._hasTransmission = materials.some((m) => m.transmissionWeight > 0 ||
504
504
  m.mapAlphaUsage === "transmission");
505
505
  this._hasAlpha = materials.some((m) => resolveMaterialAlphaMode(m) !== 'opaque');
506
- this._spectral = materials.some((m) => m.transmissionDispersionScale > 0);
506
+ const spectral = materials.some((m) => m.transmissionDispersionScale > 0);
507
+ if (spectral !== !!this._spectral) {
508
+ this._spectral = spectral;
509
+ const shader = createRayTraceFragmentShader({
510
+ channelIndependentLight: spectral, shareSpectralPrefix: spectral && this._shareSpectralPrefix
511
+ });
512
+ if (!researchTransport()?.configure(this, 'webgl')?.enabled) {
513
+ shader.parallelCompile = true;
514
+ this._mainPass.setShader(shader);
515
+ }
516
+ }
507
517
  this._tracePasses.forEach(pass => {
508
518
  pass.setDefines({
509
519
  OES_texture_float_linear: true,
510
520
  STACK_SIZE,
511
521
  USE_VERTEX_COLOR: mergedGeometry.color != null,
512
- USE_TANGENT: mergedGeometry.tangent != null,
522
+ USE_TANGENT: mergedGeometry.tangent != null && materials.some(materialNeedsVertexTangents),
523
+ ...vertexAttributeDefines(vertexAttributeLayout(mergedGeometry)),
513
524
  USE_COAT_NORMAL_FRAMES: materials.some(m => m.coatWeight > 0 && (!!m.normalMap || !!m.coatNormalMap)),
514
525
  HAS_TRANSMISSION: this._hasTransmission,
515
526
  HAS_GLTF_ANISOTROPY: materials.some(m => m.specularAnisotropyModel === 'gltf' && m.specularAnisotropy > 0),
@@ -524,7 +535,7 @@ class WebGLRayTracePass {
524
535
  // Multiple-scattering SSS paths need enough collisions to return to
525
536
  // the boundary before roulette; terminating at depth five produces
526
537
  // dark materials and a handful of very large surviving samples.
527
- RR_MAX: HAS_MEDIUM ? 12 : 2,
538
+ RR_MAX: 12,
528
539
  ...materialData.defines
529
540
  });
530
541
  materialData.setToPass(pass);
@@ -533,20 +544,9 @@ class WebGLRayTracePass {
533
544
  _updateMeshMembership() {
534
545
  const res = this._pendingMembershipData;
535
546
  this._preparedMeshData = res;
536
- const tlas = this._tlas = buildTLAS(res.instances, res.blases);
537
- const blas = new Float32Array(concatBLASBuffers(res.blases));
538
- const data = this._bvhData = new Float32Array(tlas.buffer.byteLength / 4 + blas.length);
539
- data.set(new Float32Array(tlas.buffer));
540
- data.set(blas, tlas.buffer.byteLength / 4);
541
- this._instancesData = new Float32Array(tlas.instancesBuffer);
542
- setDataTexture(this._bvhBufferTex, data, 4);
543
- setDataTexture(this._instancesBufferTex, this._instancesData, 4);
544
- this._tracePasses.forEach(pass => pass.setUniforms({
545
- bvhColumns: textureDimensionsFromArray(data.length / 4).columnsLog,
546
- instancesColumns: textureDimensionsFromArray(this._instancesData.length / 4).columnsLog,
547
- blasOffset: tlas.buffer.byteLength / 16,
548
- isEmptyScene: +(res.instances.length === 0)
549
- }));
547
+ this._tlas = buildWebTLAS(res.instances, res.blases);
548
+ this._uploadBVH(new Float32Array(concatBLASBuffers(res.blases)));
549
+ this._tracePasses.forEach(pass => pass.setUniform('isEmptyScene', +(res.instances.length === 0)));
550
550
  this._pendingMembershipData = undefined;
551
551
  this._needsUpdateMeshMembership = false;
552
552
  this._debugBvhData = undefined;
@@ -554,20 +554,12 @@ class WebGLRayTracePass {
554
554
  _updateGeometryData() {
555
555
  const res = this._preparedMeshData, tlas = this._tlas;
556
556
  const update = updatePreparedGeometries(res, this._pendingGeometryUpdates);
557
- for (const { first, count, topologyChanged, deformationOnly } of update.vertices) {
558
- for (const [attribute, texture] of [
559
- [res.geometry.position, this._positionBufferTex], [res.geometry.normal, this._normalBufferTex],
560
- [res.geometry.tangent, this._tangentBufferTex], [res.geometry.color, this._colorBufferTex],
561
- [res.geometry.uv, this._uvBufferTex], [res.geometry.uv1, this._uv1BufferTex]
562
- ])
563
- if (attribute && (!deformationOnly || attribute === res.geometry.position || attribute === res.geometry.normal || attribute === res.geometry.tangent))
564
- texture.updateDataRange(this._renderer.gl, attribute.array, first * attribute.itemSize * 4, count * attribute.itemSize * 4);
565
- if (!topologyChanged)
566
- continue;
567
- const material = this._materialIndexData;
568
- for (let i = first * 4; i < (first + count) * 4; i++)
569
- material[i] = res.geometry.materialIndex.array[i];
570
- this._matIndexBufferTex.updateDataRange(this._renderer.gl, material, first * 16, count * 16);
557
+ const layout = this._vertexAttributeLayout, attributes = this._vertexAttributeData;
558
+ for (const { first, count } of update.vertices) {
559
+ const position = res.geometry.position;
560
+ this._positionBufferTex.updateDataRange(this._renderer.gl, position.array, first * position.itemSize * 4, count * position.itemSize * 4);
561
+ packVertexAttributes(res.geometry, layout, attributes, first, count);
562
+ this._vertexAttributeTex.updateDataRange(this._renderer.gl, attributes, first * layout.stride * 16, count * layout.stride * 16);
571
563
  }
572
564
  for (const mesh of update.meshes)
573
565
  this._dirtyTransformMeshes.add(mesh);
@@ -577,12 +569,7 @@ class WebGLRayTracePass {
577
569
  if (update.resized) {
578
570
  res.instances = updateMeshInstanceTransforms(res.instanceBindings);
579
571
  refitTLAS(tlas, res.instances, res.blases);
580
- const blas = new Float32Array(concatBLASBuffers(res.blases));
581
- this._bvhData = new Float32Array(tlas.buffer.byteLength / 4 + blas.length);
582
- this._bvhData.set(new Float32Array(tlas.buffer));
583
- this._bvhData.set(blas, tlas.buffer.byteLength / 4);
584
- setDataTexture(this._bvhBufferTex, this._bvhData, 4);
585
- this._tracePasses.forEach(pass => pass.setUniform('bvhColumns', textureDimensionsFromArray(this._bvhData.length / 4).columnsLog));
572
+ this._uploadBVH(new Float32Array(concatBLASBuffers(res.blases)));
586
573
  }
587
574
  else {
588
575
  const ranges = [];
@@ -603,8 +590,7 @@ class WebGLRayTracePass {
603
590
  if (res && tlas) {
604
591
  const dirty = updateMeshInstanceColors(res.instanceBindings, res.instances, this._dirtyColorMeshes);
605
592
  const ranges = updateTLASInstanceColors(tlas, res.instances, dirty);
606
- for (const { offset, size } of ranges)
607
- this._instancesBufferTex.updateDataRange(this._renderer.gl, this._instancesData, offset, size);
593
+ this._uploadInstanceRanges(ranges);
608
594
  }
609
595
  this._dirtyColorMeshes.clear();
610
596
  }
@@ -624,8 +610,7 @@ class WebGLRayTracePass {
624
610
  this._bvhData.set(new Float32Array(tlas.buffer));
625
611
  for (const { offset, size } of ranges.tlasRanges)
626
612
  this._bvhBufferTex.updateDataRange(this._renderer.gl, this._bvhData, offset, size);
627
- for (const { offset, size } of ranges.instanceRanges)
628
- this._instancesBufferTex.updateDataRange(this._renderer.gl, this._instancesData, offset, size);
613
+ this._uploadInstanceRanges(ranges.instanceRanges);
629
614
  this._dirtyTransformMeshes.clear();
630
615
  this._needsRefitTLAS = false;
631
616
  this._debugBvhData = undefined;
@@ -679,6 +664,7 @@ class WebGLRayTracePass {
679
664
  ? (1 - POWER_WEIGHTED_LIGHT_MIX) * fallbackPmf +
680
665
  POWER_WEIGHTED_LIGHT_MIX * (weight / totalWeight)
681
666
  : fallbackPmf);
667
+ this._directLightLegacy = { env: this._envLightSelectionPmf, pmfs: this._analyticLightSelectionPmfs };
682
668
  let cumulativePmf = this._envLightSelectionPmf;
683
669
  this._analyticLightSelectionCdfs = Float32Array.from(this._analyticLightSelectionPmfs, (pmf) => {
684
670
  cumulativePmf += pmf;
@@ -714,9 +700,11 @@ class WebGLRayTracePass {
714
700
  const viewProjectionInv = this._viewProjInv;
715
701
  this._apertureRadius = cameraApertureRadius(camera);
716
702
  this._focusDistance = camera.focusDistance;
717
- this._getViewProjInv(camera, viewProjectionInv);
703
+ mat4.invert(this._projectionInv, camera.getProjectionMatrix(this._depthAspect));
704
+ mat4.mul(viewProjectionInv, camera.transform, this._projectionInv);
718
705
  this._tracePasses.forEach((pass) => {
719
706
  pass.setUniform('viewProjectionInv', viewProjectionInv);
707
+ pass.setUniform('projectionInv', this._projectionInv);
720
708
  pass.setUniform('viewInv', camera.transform);
721
709
  // Zero for orthographic cameras, which have no depth of field.
722
710
  pass.setUniform('cameraApertureRadius', this._apertureRadius);
@@ -751,15 +739,27 @@ class WebGLRayTracePass {
751
739
  this._shadowCatcherPass.useTarget(target);
752
740
  }
753
741
  setQuality(options) {
742
+ const wasIndependent = this._independentSpectralPaths;
743
+ const research = researchTransport()?.configure(this, 'webgl');
744
+ this._independentSpectralPaths = !!research?.enabled;
745
+ const share = options.dispersionWavelengths !== 1;
746
+ if (this._spectral && (share !== this._shareSpectralPrefix || wasIndependent) && !research?.enabled) {
747
+ const shader = createRayTraceFragmentShader({
748
+ channelIndependentLight: true, shareSpectralPrefix: share
749
+ });
750
+ shader.parallelCompile = true;
751
+ this._mainPass.setShader(shader);
752
+ }
753
+ this._shareSpectralPrefix = share;
754
754
  this._tracePasses.forEach(pass => {
755
- pass.setUniform('bounceLimit', normalizeBounces(options.bounces));
755
+ pass.setUniform('bounceLimit', normalizeBounces(options.bounces, MAX_PATH_EVENTS_WEBGL));
756
756
  pass.setUniform('bevelEnabled', options.bevel);
757
757
  pass.setUniform('dispersionWavelengths', options.dispersionWavelengths);
758
758
  });
759
759
  }
760
- setWavelength(wavelength) {
760
+ setSpectralChannel(channel) {
761
761
  this._tracePasses.forEach((pass) => {
762
- pass.setUniform('wavelength', wavelength);
762
+ pass.setUniform('spectralChannel', channel);
763
763
  });
764
764
  }
765
765
  setSampleCount(sampleCount) {
@@ -776,6 +776,10 @@ class WebGLRayTracePass {
776
776
  hasDispersion() {
777
777
  return this._spectral;
778
778
  }
779
+ hasSharedSpectralPrefix() {
780
+ // Research connections can disperse before the camera reaches a boundary.
781
+ return this._shareSpectralPrefix && !this._independentSpectralPaths;
782
+ }
779
783
  prepare() {
780
784
  if (this._needsUpdateMeshData) {
781
785
  this._updateMeshData();
@@ -791,6 +795,29 @@ class WebGLRayTracePass {
791
795
  this._updateMeshColors();
792
796
  if (this._pendingMaterialUpdate)
793
797
  this._updateMaterialData();
798
+ researchTransport()?.prepare(this, 'webgl');
799
+ const res = this._preparedMeshData;
800
+ if (res) {
801
+ const triangles = this._emissiveCache.collect(res.emissiveBindings, res.materials);
802
+ this._mainPass.setDefines({ HAS_EMISSIVE_LIGHTS: triangles.length > 0 });
803
+ if (!triangles.length && this._emissiveActive && this._directLightLegacy) {
804
+ this._envLightSelectionPmf = this._directLightLegacy.env;
805
+ this._analyticLightSelectionPmfs = Float32Array.from(this._directLightLegacy.pmfs);
806
+ this._tracePasses.forEach(pass => pass.setUniform('envLightSelectionPmf', this._envLightSelectionPmf));
807
+ this._needsUpdateAnalyticLightsBuffer = true;
808
+ }
809
+ this._emissiveActive = triangles.length > 0;
810
+ if (triangles.length) {
811
+ const lighting = prepareWebGLLightSampling(this._analyticLights, triangles, estimateEnvironmentPower(this._envImageSource));
812
+ this._envLightSelectionPmf = lighting.environmentPmf;
813
+ this._analyticLightSelectionPmfs = Float32Array.from(lighting.analyticPmfs);
814
+ const columns = setDataTexture(this._emissiveTex, lighting.data, 4).columnsLog;
815
+ this._mainPass.setUniforms({ emissiveLightData: this._emissiveTex, emissiveLightColumns: columns,
816
+ emissiveChoiceOffset: lighting.emissiveTexels, emissiveChoiceCount: lighting.choiceCount,
817
+ emissivePmfOffset: lighting.pmfOffset, emissiveWeightTotal: lighting.totalWeight, envLightSelectionPmf: lighting.environmentPmf });
818
+ this._needsUpdateAnalyticLightsBuffer = true;
819
+ }
820
+ }
794
821
  if (this._needsUpdateAnalyticLightsBuffer) {
795
822
  const analyticLights = this._analyticLights;
796
823
  analyticLights.length > 0 &&
@@ -843,14 +870,17 @@ class WebGLRayTracePass {
843
870
  // WebGL has uniform per-pixel counts; setSampleCount already includes offset.
844
871
  setSampleSequenceOffset(_offset) { }
845
872
  prepareAovs(state, camera, width, height, kinds) {
846
- if (!kinds.length || !this._preparedMeshData || !this._tlas)
873
+ if (!kinds.length)
874
+ return true;
875
+ // An AOV channel may be the first thing to render a new scene.
876
+ this.prepare();
877
+ if (!this._preparedMeshData || !this._tlas)
847
878
  return true;
848
879
  const gl = this._renderer.gl;
849
880
  if (!gl.getExtension('EXT_color_buffer_float'))
850
881
  throw new Error('AOV requires EXT_color_buffer_float');
851
- this.prepare();
852
882
  state.resize(width, height);
853
- this._aovPass.setDefines({ AOV_REFLECTANCE: (aovMask(kinds) & 24) !== 0 });
883
+ this._aovPass.setDefines({ AOV_REFLECTANCE: (aovMask(kinds) & AOV_REFLECTANCE_MASK) !== 0 });
854
884
  if (!state.frame) {
855
885
  const packed = packAovScene(this._preparedMeshData, this._tlas, camera, width, height, state.history, this._aovPrimitiveCache.get(this._preparedMeshData, this._tlas));
856
886
  state.frame = packed.frame;
@@ -868,17 +898,17 @@ class WebGLRayTracePass {
868
898
  return center && accumulation;
869
899
  }
870
900
  renderAovs(state, camera, width, height, samples, cap, kinds, sequenceOffset = 0) {
871
- if (!kinds.length || !this._preparedMeshData || !this._tlas)
872
- return true;
873
901
  if (!this.prepareAovs(state, camera, width, height, kinds))
874
902
  return false;
903
+ if (!kinds.length || !this._preparedMeshData || !this._tlas)
904
+ return true;
875
905
  if (!state.centerReady) {
876
906
  this._aovCenter.createPass({}, state.center);
877
907
  state.centerReady = true;
878
908
  state.history.accept(state.frame);
879
909
  }
880
910
  const target = Math.min(samples, cap);
881
- if ((aovMask(kinds) & 31) === 0)
911
+ if ((aovMask(kinds) & AOV_ACCUMULATED_MASK) === 0)
882
912
  state.samples = target;
883
913
  while (state.samples < target) {
884
914
  const output = state.accumulation[state.samples % 2], previous = state.accumulation[(state.samples + 1) % 2];
@@ -890,17 +920,33 @@ class WebGLRayTracePass {
890
920
  }
891
921
  return true;
892
922
  }
893
- async readDepthSamples(area, aspect) {
923
+ async pickSurface(x, y, aspect) {
924
+ const source = this._preparedMeshData, tlas = this._tlas;
925
+ if (!source || !tlas)
926
+ return;
927
+ const values = await this._readDepthSamples({ x, y, size: 0 }, aspect, true);
928
+ if (!values || source !== this._preparedMeshData || tlas !== this._tlas)
929
+ return;
930
+ return resolveSurfaceHit(source, tlas, values);
931
+ }
932
+ readDepthSamples(area, aspect) {
933
+ return this._readDepthSamples(area, aspect);
934
+ }
935
+ async _readDepthSamples(area, aspect, picking = false) {
894
936
  if (this._depthAbort.signal.aborted || this._invalid || !this._preparedMeshData ||
895
937
  !this._renderer.isAllProgramCompiled())
896
938
  return;
897
939
  this.prepare();
898
- this._depthPass.setUniform('depthArea', packDepthSampleArea(area, aspect ?? this._depthAspect));
940
+ const packed = packDepthSampleArea(area, aspect ?? this._depthAspect);
941
+ if (picking)
942
+ packed.set([-1, -1], 2);
943
+ this._depthPass.setUniform('depthArea', packed);
899
944
  this._depthPass.createPass({});
900
945
  const rgba = await readFloatPixelsAsync(this._renderer.gl, DEPTH_SAMPLE_GRID, DEPTH_SAMPLE_GRID, this._depthAbort.signal);
901
- return unpackDepthSamples(rgba);
946
+ return picking ? rgba.slice(0, 4) : unpackDepthSamples(rgba);
902
947
  }
903
948
  dispose() {
949
+ researchTransport()?.dispose(this, 'webgl');
904
950
  this._skySource.dispose();
905
951
  this._depthAbort.abort();
906
952
  this._materialData?.dispose(this._renderer.gl);
@@ -909,19 +955,14 @@ class WebGLRayTracePass {
909
955
  const gl = this._renderer.gl;
910
956
  [
911
957
  this._lightTex,
958
+ this._emissiveTex,
912
959
  this._openPbrEnergyLut,
913
960
  this._envMap,
914
961
  this._envMapDistribution,
915
962
  this._backgroundTex,
916
963
  this._positionBufferTex,
917
- this._normalBufferTex,
918
- this._colorBufferTex,
919
- this._tangentBufferTex,
920
- this._uvBufferTex,
921
- this._uv1BufferTex,
922
- this._bvhBufferTex,
923
- this._instancesBufferTex,
924
- this._matIndexBufferTex
964
+ this._vertexAttributeTex,
965
+ this._bvhBufferTex
925
966
  ].forEach((texture) => texture.dispose(gl));
926
967
  }
927
968
  }