@meimu/mutracer 0.0.0-stage → 0.1.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 (536) hide show
  1. package/LICENSE +21 -0
  2. package/LICENSES/Apache-2.0.txt +202 -0
  3. package/LICENSES/GLSL-PathTracer-MIT.txt +21 -0
  4. package/LICENSES/GlMatrix-MIT.txt +19 -0
  5. package/LICENSES/KinoBloom-MIT.txt +21 -0
  6. package/LICENSES/OIDNWeb-MIT.txt +21 -0
  7. package/LICENSES/Octicons-MIT.txt +21 -0
  8. package/LICENSES/RayTracingRenderer-MIT.txt +21 -0
  9. package/LICENSES/TinyBVH-MIT.txt +21 -0
  10. package/LICENSES/WebGPUUtils-MIT.txt +21 -0
  11. package/LICENSES/ZetaRay-MIT.txt +21 -0
  12. package/README.md +240 -2
  13. package/THIRD_PARTY_NOTICES.md +160 -0
  14. package/dist/assets/bvh.worker.js +1 -0
  15. package/dist/mutracer.umd.js +14360 -0
  16. package/docs/api.md +394 -0
  17. package/docs/bvh.md +141 -0
  18. package/docs/denoising.md +301 -0
  19. package/docs/getting-started.md +308 -0
  20. package/docs/materials.md +281 -0
  21. package/docs/performance.md +85 -0
  22. package/docs/post-processing.md +87 -0
  23. package/docs/progressive-rendering.md +160 -0
  24. package/docs/sampling.md +40 -0
  25. package/docs/threejs.md +274 -0
  26. package/docs/todo.md +61 -0
  27. package/docs/updates.md +208 -0
  28. package/lib/Display.d.ts +72 -0
  29. package/lib/Display.js +123 -0
  30. package/lib/Display.js.map +1 -0
  31. package/lib/Engine.d.ts +161 -0
  32. package/lib/Engine.js +681 -0
  33. package/lib/Engine.js.map +1 -0
  34. package/lib/Render.d.ts +265 -0
  35. package/lib/Render.js +742 -0
  36. package/lib/Render.js.map +1 -0
  37. package/lib/RenderLoop.d.ts +79 -0
  38. package/lib/RenderLoop.js +236 -0
  39. package/lib/RenderLoop.js.map +1 -0
  40. package/lib/Sync.d.ts +19 -0
  41. package/lib/Sync.js +19 -0
  42. package/lib/Sync.js.map +1 -0
  43. package/lib/constants.d.ts +2 -0
  44. package/lib/constants.js +3 -0
  45. package/lib/constants.js.map +1 -0
  46. package/lib/main.d.ts +56 -0
  47. package/lib/main.js +43 -0
  48. package/lib/main.js.map +1 -0
  49. package/lib/math.d.ts +23 -0
  50. package/lib/math.js +56 -0
  51. package/lib/math.js.map +1 -0
  52. package/lib/oidn.d.ts +45 -0
  53. package/lib/oidn.js +42 -0
  54. package/lib/oidn.js.map +1 -0
  55. package/lib/oidnBundledWeights.cdn.d.ts +2 -0
  56. package/lib/oidnBundledWeights.cdn.js +5 -0
  57. package/lib/oidnBundledWeights.cdn.js.map +1 -0
  58. package/lib/oidnBundledWeights.d.ts +2 -0
  59. package/lib/oidnBundledWeights.js +4 -0
  60. package/lib/oidnBundledWeights.js.map +1 -0
  61. package/lib/renderer/DisplayPostProcess.d.ts +14 -0
  62. package/lib/renderer/DisplayPostProcess.js +41 -0
  63. package/lib/renderer/DisplayPostProcess.js.map +1 -0
  64. package/lib/renderer/MaterialTable.d.ts +119 -0
  65. package/lib/renderer/MaterialTable.js +550 -0
  66. package/lib/renderer/MaterialTable.js.map +1 -0
  67. package/lib/renderer/OfflineAdaptiveSampling.d.ts +47 -0
  68. package/lib/renderer/OfflineAdaptiveSampling.js +36 -0
  69. package/lib/renderer/OfflineAdaptiveSampling.js.map +1 -0
  70. package/lib/renderer/RenderingPipeline.d.ts +232 -0
  71. package/lib/renderer/RenderingPipeline.js +18 -0
  72. package/lib/renderer/RenderingPipeline.js.map +1 -0
  73. package/lib/renderer/ScratchPool.d.ts +13 -0
  74. package/lib/renderer/ScratchPool.js +21 -0
  75. package/lib/renderer/ScratchPool.js.map +1 -0
  76. package/lib/renderer/TileRender.d.ts +44 -0
  77. package/lib/renderer/TileRender.js +283 -0
  78. package/lib/renderer/TileRender.js.map +1 -0
  79. package/lib/renderer/WGPUBloomPass.d.ts +17 -0
  80. package/lib/renderer/WGPUBloomPass.js +243 -0
  81. package/lib/renderer/WGPUBloomPass.js.map +1 -0
  82. package/lib/renderer/WGPUCanvasSurface.d.ts +21 -0
  83. package/lib/renderer/WGPUCanvasSurface.js +48 -0
  84. package/lib/renderer/WGPUCanvasSurface.js.map +1 -0
  85. package/lib/renderer/WGPUComputePass.d.ts +73 -0
  86. package/lib/renderer/WGPUComputePass.js +317 -0
  87. package/lib/renderer/WGPUComputePass.js.map +1 -0
  88. package/lib/renderer/WGPUFullQuadPass.d.ts +73 -0
  89. package/lib/renderer/WGPUFullQuadPass.js +389 -0
  90. package/lib/renderer/WGPUFullQuadPass.js.map +1 -0
  91. package/lib/renderer/WGPUHDRPeakMeter.d.ts +19 -0
  92. package/lib/renderer/WGPUHDRPeakMeter.js +112 -0
  93. package/lib/renderer/WGPUHDRPeakMeter.js.map +1 -0
  94. package/lib/renderer/WGPUJNLMDenoiser.d.ts +61 -0
  95. package/lib/renderer/WGPUJNLMDenoiser.js +412 -0
  96. package/lib/renderer/WGPUJNLMDenoiser.js.map +1 -0
  97. package/lib/renderer/WGPURayTraceOutput.d.ts +44 -0
  98. package/lib/renderer/WGPURayTraceOutput.js +368 -0
  99. package/lib/renderer/WGPURayTraceOutput.js.map +1 -0
  100. package/lib/renderer/WGPURayTracePass.d.ts +284 -0
  101. package/lib/renderer/WGPURayTracePass.js +2323 -0
  102. package/lib/renderer/WGPURayTracePass.js.map +1 -0
  103. package/lib/renderer/WGPURenderingPipeline.d.ts +9 -0
  104. package/lib/renderer/WGPURenderingPipeline.js +1448 -0
  105. package/lib/renderer/WGPURenderingPipeline.js.map +1 -0
  106. package/lib/renderer/WGPUSceneFeatures.d.ts +3 -0
  107. package/lib/renderer/WGPUSceneFeatures.js +20 -0
  108. package/lib/renderer/WGPUSceneFeatures.js.map +1 -0
  109. package/lib/renderer/WGPUScratchBuffer.d.ts +9 -0
  110. package/lib/renderer/WGPUScratchBuffer.js +21 -0
  111. package/lib/renderer/WGPUScratchBuffer.js.map +1 -0
  112. package/lib/renderer/WGPUScratchTexture.d.ts +10 -0
  113. package/lib/renderer/WGPUScratchTexture.js +27 -0
  114. package/lib/renderer/WGPUScratchTexture.js.map +1 -0
  115. package/lib/renderer/WGPUShaderCache.d.ts +26 -0
  116. package/lib/renderer/WGPUShaderCache.js +103 -0
  117. package/lib/renderer/WGPUShaderCache.js.map +1 -0
  118. package/lib/renderer/WebGLBloomPass.d.ts +18 -0
  119. package/lib/renderer/WebGLBloomPass.js +113 -0
  120. package/lib/renderer/WebGLBloomPass.js.map +1 -0
  121. package/lib/renderer/WebGLFullQuadPass.d.ts +65 -0
  122. package/lib/renderer/WebGLFullQuadPass.js +208 -0
  123. package/lib/renderer/WebGLFullQuadPass.js.map +1 -0
  124. package/lib/renderer/WebGLJNLMDenoiser.d.ts +32 -0
  125. package/lib/renderer/WebGLJNLMDenoiser.js +328 -0
  126. package/lib/renderer/WebGLJNLMDenoiser.js.map +1 -0
  127. package/lib/renderer/WebGLRayTraceOutputPass.d.ts +20 -0
  128. package/lib/renderer/WebGLRayTraceOutputPass.js +106 -0
  129. package/lib/renderer/WebGLRayTraceOutputPass.js.map +1 -0
  130. package/lib/renderer/WebGLRayTracePass.d.ts +142 -0
  131. package/lib/renderer/WebGLRayTracePass.js +845 -0
  132. package/lib/renderer/WebGLRayTracePass.js.map +1 -0
  133. package/lib/renderer/WebGLReadback.d.ts +4 -0
  134. package/lib/renderer/WebGLReadback.js +75 -0
  135. package/lib/renderer/WebGLReadback.js.map +1 -0
  136. package/lib/renderer/WebGLRenderingPipeline.d.ts +4 -0
  137. package/lib/renderer/WebGLRenderingPipeline.js +510 -0
  138. package/lib/renderer/WebGLRenderingPipeline.js.map +1 -0
  139. package/lib/renderer/WebGLScratchCopy.d.ts +10 -0
  140. package/lib/renderer/WebGLScratchCopy.js +27 -0
  141. package/lib/renderer/WebGLScratchCopy.js.map +1 -0
  142. package/lib/renderer/accumulationTarget.d.ts +26 -0
  143. package/lib/renderer/accumulationTarget.js +2 -0
  144. package/lib/renderer/accumulationTarget.js.map +1 -0
  145. package/lib/renderer/binnedSahBvh.d.ts +31 -0
  146. package/lib/renderer/binnedSahBvh.js +263 -0
  147. package/lib/renderer/binnedSahBvh.js.map +1 -0
  148. package/lib/renderer/bvh.worker.d.ts +1 -0
  149. package/lib/renderer/bvh.worker.js +16 -0
  150. package/lib/renderer/bvh.worker.js.map +1 -0
  151. package/lib/renderer/bvhAccel.d.ts +81 -0
  152. package/lib/renderer/bvhAccel.js +621 -0
  153. package/lib/renderer/bvhAccel.js.map +1 -0
  154. package/lib/renderer/bvhWorkerBuild.d.ts +12 -0
  155. package/lib/renderer/bvhWorkerBuild.js +17 -0
  156. package/lib/renderer/bvhWorkerBuild.js.map +1 -0
  157. package/lib/renderer/bvhWorkerClient.d.ts +57 -0
  158. package/lib/renderer/bvhWorkerClient.js +166 -0
  159. package/lib/renderer/bvhWorkerClient.js.map +1 -0
  160. package/lib/renderer/cameraLens.d.ts +5 -0
  161. package/lib/renderer/cameraLens.js +15 -0
  162. package/lib/renderer/cameraLens.js.map +1 -0
  163. package/lib/renderer/cameraSnapshot.d.ts +3 -0
  164. package/lib/renderer/cameraSnapshot.js +7 -0
  165. package/lib/renderer/cameraSnapshot.js.map +1 -0
  166. package/lib/renderer/committedScene.d.ts +13 -0
  167. package/lib/renderer/committedScene.js +126 -0
  168. package/lib/renderer/committedScene.js.map +1 -0
  169. package/lib/renderer/dataTextureUtil.d.ts +32 -0
  170. package/lib/renderer/dataTextureUtil.js +46 -0
  171. package/lib/renderer/dataTextureUtil.js.map +1 -0
  172. package/lib/renderer/denoiser.d.ts +65 -0
  173. package/lib/renderer/denoiser.js +2 -0
  174. package/lib/renderer/denoiser.js.map +1 -0
  175. package/lib/renderer/depthQuery.d.ts +14 -0
  176. package/lib/renderer/depthQuery.js +14 -0
  177. package/lib/renderer/depthQuery.js.map +1 -0
  178. package/lib/renderer/deviceRequirements.d.ts +23 -0
  179. package/lib/renderer/deviceRequirements.js +50 -0
  180. package/lib/renderer/deviceRequirements.js.map +1 -0
  181. package/lib/renderer/envMapCreation.d.ts +10 -0
  182. package/lib/renderer/envMapCreation.js +96 -0
  183. package/lib/renderer/envMapCreation.js.map +1 -0
  184. package/lib/renderer/envMapDistribution.d.ts +9 -0
  185. package/lib/renderer/envMapDistribution.js +107 -0
  186. package/lib/renderer/envMapDistribution.js.map +1 -0
  187. package/lib/renderer/float16.d.ts +1 -0
  188. package/lib/renderer/float16.js +19 -0
  189. package/lib/renderer/float16.js.map +1 -0
  190. package/lib/renderer/geometryBvh.d.ts +11 -0
  191. package/lib/renderer/geometryBvh.js +24 -0
  192. package/lib/renderer/geometryBvh.js.map +1 -0
  193. package/lib/renderer/geometryUpdates.d.ts +28 -0
  194. package/lib/renderer/geometryUpdates.js +131 -0
  195. package/lib/renderer/geometryUpdates.js.map +1 -0
  196. package/lib/renderer/glsl/chunks/cameraRay.glsl.d.ts +2 -0
  197. package/lib/renderer/glsl/chunks/cameraRay.glsl.js +37 -0
  198. package/lib/renderer/glsl/chunks/cameraRay.glsl.js.map +1 -0
  199. package/lib/renderer/glsl/chunks/common.glsl.d.ts +2 -0
  200. package/lib/renderer/glsl/chunks/common.glsl.js +17 -0
  201. package/lib/renderer/glsl/chunks/common.glsl.js.map +1 -0
  202. package/lib/renderer/glsl/chunks/envMap.glsl.d.ts +2 -0
  203. package/lib/renderer/glsl/chunks/envMap.glsl.js +192 -0
  204. package/lib/renderer/glsl/chunks/envMap.glsl.js.map +1 -0
  205. package/lib/renderer/glsl/chunks/intersect.glsl.d.ts +2 -0
  206. package/lib/renderer/glsl/chunks/intersect.glsl.js +1091 -0
  207. package/lib/renderer/glsl/chunks/intersect.glsl.js.map +1 -0
  208. package/lib/renderer/glsl/chunks/materialBuffer.glsl.d.ts +2 -0
  209. package/lib/renderer/glsl/chunks/materialBuffer.glsl.js +371 -0
  210. package/lib/renderer/glsl/chunks/materialBuffer.glsl.js.map +1 -0
  211. package/lib/renderer/glsl/chunks/openPbrBsdf.glsl.d.ts +2 -0
  212. package/lib/renderer/glsl/chunks/openPbrBsdf.glsl.js +1767 -0
  213. package/lib/renderer/glsl/chunks/openPbrBsdf.glsl.js.map +1 -0
  214. package/lib/renderer/glsl/chunks/rand.glsl.d.ts +2 -0
  215. package/lib/renderer/glsl/chunks/rand.glsl.js +26 -0
  216. package/lib/renderer/glsl/chunks/rand.glsl.js.map +1 -0
  217. package/lib/renderer/glsl/chunks/random.glsl.d.ts +2 -0
  218. package/lib/renderer/glsl/chunks/random.glsl.js +27 -0
  219. package/lib/renderer/glsl/chunks/random.glsl.js.map +1 -0
  220. package/lib/renderer/glsl/chunks/rayTraceCore.glsl.d.ts +2 -0
  221. package/lib/renderer/glsl/chunks/rayTraceCore.glsl.js +287 -0
  222. package/lib/renderer/glsl/chunks/rayTraceCore.glsl.js.map +1 -0
  223. package/lib/renderer/glsl/chunks/sampleLight.glsl.d.ts +2 -0
  224. package/lib/renderer/glsl/chunks/sampleLight.glsl.js +254 -0
  225. package/lib/renderer/glsl/chunks/sampleLight.glsl.js.map +1 -0
  226. package/lib/renderer/glsl/chunks/sampleMaterial.glsl.d.ts +2 -0
  227. package/lib/renderer/glsl/chunks/sampleMaterial.glsl.js +279 -0
  228. package/lib/renderer/glsl/chunks/sampleMaterial.glsl.js.map +1 -0
  229. package/lib/renderer/glsl/chunks/sampleShadowCatcher.glsl.d.ts +2 -0
  230. package/lib/renderer/glsl/chunks/sampleShadowCatcher.glsl.js +48 -0
  231. package/lib/renderer/glsl/chunks/sampleShadowCatcher.glsl.js.map +1 -0
  232. package/lib/renderer/glsl/chunks/sampling.glsl.d.ts +2 -0
  233. package/lib/renderer/glsl/chunks/sampling.glsl.js +194 -0
  234. package/lib/renderer/glsl/chunks/sampling.glsl.js.map +1 -0
  235. package/lib/renderer/glsl/chunks/sobol.glsl.d.ts +2 -0
  236. package/lib/renderer/glsl/chunks/sobol.glsl.js +170 -0
  237. package/lib/renderer/glsl/chunks/sobol.glsl.js.map +1 -0
  238. package/lib/renderer/glsl/chunks/textureLinear.glsl.d.ts +2 -0
  239. package/lib/renderer/glsl/chunks/textureLinear.glsl.js +27 -0
  240. package/lib/renderer/glsl/chunks/textureLinear.glsl.js.map +1 -0
  241. package/lib/renderer/glsl/chunks/uvProjection.glsl.d.ts +2 -0
  242. package/lib/renderer/glsl/chunks/uvProjection.glsl.js +72 -0
  243. package/lib/renderer/glsl/chunks/uvProjection.glsl.js.map +1 -0
  244. package/lib/renderer/glsl/depthQuery.frag.d.ts +3 -0
  245. package/lib/renderer/glsl/depthQuery.frag.js +55 -0
  246. package/lib/renderer/glsl/depthQuery.frag.js.map +1 -0
  247. package/lib/renderer/glsl/normalizeRayTraceOutput.frag.d.ts +6 -0
  248. package/lib/renderer/glsl/normalizeRayTraceOutput.frag.js +46 -0
  249. package/lib/renderer/glsl/normalizeRayTraceOutput.frag.js.map +1 -0
  250. package/lib/renderer/glsl/rayTrace.frag.d.ts +2 -0
  251. package/lib/renderer/glsl/rayTrace.frag.js +623 -0
  252. package/lib/renderer/glsl/rayTrace.frag.js.map +1 -0
  253. package/lib/renderer/glsl/shadowCatcher.frag.d.ts +3 -0
  254. package/lib/renderer/glsl/shadowCatcher.frag.js +119 -0
  255. package/lib/renderer/glsl/shadowCatcher.frag.js.map +1 -0
  256. package/lib/renderer/glsl/webglPipeline.frag.d.ts +4 -0
  257. package/lib/renderer/glsl/webglPipeline.frag.js +208 -0
  258. package/lib/renderer/glsl/webglPipeline.frag.js.map +1 -0
  259. package/lib/renderer/gpuMemory.d.ts +2 -0
  260. package/lib/renderer/gpuMemory.js +10 -0
  261. package/lib/renderer/gpuMemory.js.map +1 -0
  262. package/lib/renderer/halton.d.ts +1 -0
  263. package/lib/renderer/halton.js +15 -0
  264. package/lib/renderer/halton.js.map +1 -0
  265. package/lib/renderer/jnlm.d.ts +85 -0
  266. package/lib/renderer/jnlm.js +87 -0
  267. package/lib/renderer/jnlm.js.map +1 -0
  268. package/lib/renderer/lightSampling.d.ts +75 -0
  269. package/lib/renderer/lightSampling.js +305 -0
  270. package/lib/renderer/lightSampling.js.map +1 -0
  271. package/lib/renderer/lightsUtil.d.ts +26 -0
  272. package/lib/renderer/lightsUtil.js +154 -0
  273. package/lib/renderer/lightsUtil.js.map +1 -0
  274. package/lib/renderer/materialChanges.d.ts +13 -0
  275. package/lib/renderer/materialChanges.js +59 -0
  276. package/lib/renderer/materialChanges.js.map +1 -0
  277. package/lib/renderer/materialComparison.generated.d.ts +5 -0
  278. package/lib/renderer/materialComparison.generated.js +655 -0
  279. package/lib/renderer/materialComparison.generated.js.map +1 -0
  280. package/lib/renderer/materialConstants.d.ts +6 -0
  281. package/lib/renderer/materialConstants.js +3 -0
  282. package/lib/renderer/materialConstants.js.map +1 -0
  283. package/lib/renderer/materialEmission.d.ts +9 -0
  284. package/lib/renderer/materialEmission.js +21 -0
  285. package/lib/renderer/materialEmission.js.map +1 -0
  286. package/lib/renderer/materialIndices.d.ts +7 -0
  287. package/lib/renderer/materialIndices.js +34 -0
  288. package/lib/renderer/materialIndices.js.map +1 -0
  289. package/lib/renderer/materialLayout.d.ts +102 -0
  290. package/lib/renderer/materialLayout.js +189 -0
  291. package/lib/renderer/materialLayout.js.map +1 -0
  292. package/lib/renderer/materialTextureSlots.d.ts +537 -0
  293. package/lib/renderer/materialTextureSlots.js +219 -0
  294. package/lib/renderer/materialTextureSlots.js.map +1 -0
  295. package/lib/renderer/mergeMeshesToGeometry.d.ts +8 -0
  296. package/lib/renderer/mergeMeshesToGeometry.js +236 -0
  297. package/lib/renderer/mergeMeshesToGeometry.js.map +1 -0
  298. package/lib/renderer/meshInstances.d.ts +23 -0
  299. package/lib/renderer/meshInstances.js +66 -0
  300. package/lib/renderer/meshInstances.js.map +1 -0
  301. package/lib/renderer/meshMembership.d.ts +10 -0
  302. package/lib/renderer/meshMembership.js +72 -0
  303. package/lib/renderer/meshMembership.js.map +1 -0
  304. package/lib/renderer/oidnNetwork.d.ts +20 -0
  305. package/lib/renderer/oidnNetwork.js +123 -0
  306. package/lib/renderer/oidnNetwork.js.map +1 -0
  307. package/lib/renderer/openPbrEnergyLut.d.ts +32 -0
  308. package/lib/renderer/openPbrEnergyLut.js +965 -0
  309. package/lib/renderer/openPbrEnergyLut.js.map +1 -0
  310. package/lib/renderer/pathLimits.d.ts +4 -0
  311. package/lib/renderer/pathLimits.js +7 -0
  312. package/lib/renderer/pathLimits.js.map +1 -0
  313. package/lib/renderer/prepareMeshBVH.d.ts +110 -0
  314. package/lib/renderer/prepareMeshBVH.js +857 -0
  315. package/lib/renderer/prepareMeshBVH.js.map +1 -0
  316. package/lib/renderer/progressiveScheduler.d.ts +11 -0
  317. package/lib/renderer/progressiveScheduler.js +19 -0
  318. package/lib/renderer/progressiveScheduler.js.map +1 -0
  319. package/lib/renderer/renderPipeline.d.ts +57 -0
  320. package/lib/renderer/renderPipeline.js +49 -0
  321. package/lib/renderer/renderPipeline.js.map +1 -0
  322. package/lib/renderer/sampling.d.ts +10 -0
  323. package/lib/renderer/sampling.js +28 -0
  324. package/lib/renderer/sampling.js.map +1 -0
  325. package/lib/renderer/sceneChangeDetector.d.ts +29 -0
  326. package/lib/renderer/sceneChangeDetector.js +232 -0
  327. package/lib/renderer/sceneChangeDetector.js.map +1 -0
  328. package/lib/renderer/sceneLightChanges.d.ts +14 -0
  329. package/lib/renderer/sceneLightChanges.js +34 -0
  330. package/lib/renderer/sceneLightChanges.js.map +1 -0
  331. package/lib/renderer/scratchSampling.d.ts +3 -0
  332. package/lib/renderer/scratchSampling.js +39 -0
  333. package/lib/renderer/scratchSampling.js.map +1 -0
  334. package/lib/renderer/shader.d.ts +37 -0
  335. package/lib/renderer/shader.js +41 -0
  336. package/lib/renderer/shader.js.map +1 -0
  337. package/lib/renderer/staticBvhPreparation.d.ts +24 -0
  338. package/lib/renderer/staticBvhPreparation.js +116 -0
  339. package/lib/renderer/staticBvhPreparation.js.map +1 -0
  340. package/lib/renderer/textureRegion.d.ts +8 -0
  341. package/lib/renderer/textureRegion.js +9 -0
  342. package/lib/renderer/textureRegion.js.map +1 -0
  343. package/lib/renderer/texturesFromMaterials.d.ts +6 -0
  344. package/lib/renderer/texturesFromMaterials.js +37 -0
  345. package/lib/renderer/texturesFromMaterials.js.map +1 -0
  346. package/lib/renderer/util.d.ts +17 -0
  347. package/lib/renderer/util.js +56 -0
  348. package/lib/renderer/util.js.map +1 -0
  349. package/lib/renderer/webgl.d.ts +131 -0
  350. package/lib/renderer/webgl.js +586 -0
  351. package/lib/renderer/webgl.js.map +1 -0
  352. package/lib/renderer/webglShaders.d.ts +4 -0
  353. package/lib/renderer/webglShaders.js +41 -0
  354. package/lib/renderer/webglShaders.js.map +1 -0
  355. package/lib/renderer/wgsl/chunks/common.wgsl.d.ts +2 -0
  356. package/lib/renderer/wgsl/chunks/common.wgsl.js +23 -0
  357. package/lib/renderer/wgsl/chunks/common.wgsl.js.map +1 -0
  358. package/lib/renderer/wgsl/chunks/envMap.wgsl.d.ts +2 -0
  359. package/lib/renderer/wgsl/chunks/envMap.wgsl.js +128 -0
  360. package/lib/renderer/wgsl/chunks/envMap.wgsl.js.map +1 -0
  361. package/lib/renderer/wgsl/chunks/intersect.wgsl.d.ts +6 -0
  362. package/lib/renderer/wgsl/chunks/intersect.wgsl.js +1441 -0
  363. package/lib/renderer/wgsl/chunks/intersect.wgsl.js.map +1 -0
  364. package/lib/renderer/wgsl/chunks/intersectionAlpha.wgsl.d.ts +8 -0
  365. package/lib/renderer/wgsl/chunks/intersectionAlpha.wgsl.js +85 -0
  366. package/lib/renderer/wgsl/chunks/intersectionAlpha.wgsl.js.map +1 -0
  367. package/lib/renderer/wgsl/chunks/materialBuffer.wgsl.d.ts +7 -0
  368. package/lib/renderer/wgsl/chunks/materialBuffer.wgsl.js +315 -0
  369. package/lib/renderer/wgsl/chunks/materialBuffer.wgsl.js.map +1 -0
  370. package/lib/renderer/wgsl/chunks/openPbrBsdf.wgsl.d.ts +3 -0
  371. package/lib/renderer/wgsl/chunks/openPbrBsdf.wgsl.js +1737 -0
  372. package/lib/renderer/wgsl/chunks/openPbrBsdf.wgsl.js.map +1 -0
  373. package/lib/renderer/wgsl/chunks/pdm_displacement.wgsl.d.ts +4 -0
  374. package/lib/renderer/wgsl/chunks/pdm_displacement.wgsl.js +352 -0
  375. package/lib/renderer/wgsl/chunks/pdm_displacement.wgsl.js.map +1 -0
  376. package/lib/renderer/wgsl/chunks/rand.wgsl.d.ts +2 -0
  377. package/lib/renderer/wgsl/chunks/rand.wgsl.js +25 -0
  378. package/lib/renderer/wgsl/chunks/rand.wgsl.js.map +1 -0
  379. package/lib/renderer/wgsl/chunks/random.wgsl.d.ts +1 -0
  380. package/lib/renderer/wgsl/chunks/random.wgsl.js +2 -0
  381. package/lib/renderer/wgsl/chunks/random.wgsl.js.map +1 -0
  382. package/lib/renderer/wgsl/chunks/rayTraceCore.wgsl.d.ts +5 -0
  383. package/lib/renderer/wgsl/chunks/rayTraceCore.wgsl.js +328 -0
  384. package/lib/renderer/wgsl/chunks/rayTraceCore.wgsl.js.map +1 -0
  385. package/lib/renderer/wgsl/chunks/sampleLight.wgsl.d.ts +2 -0
  386. package/lib/renderer/wgsl/chunks/sampleLight.wgsl.js +400 -0
  387. package/lib/renderer/wgsl/chunks/sampleLight.wgsl.js.map +1 -0
  388. package/lib/renderer/wgsl/chunks/sampleMaterial.wgsl.d.ts +3 -0
  389. package/lib/renderer/wgsl/chunks/sampleMaterial.wgsl.js +439 -0
  390. package/lib/renderer/wgsl/chunks/sampleMaterial.wgsl.js.map +1 -0
  391. package/lib/renderer/wgsl/chunks/sampleShadowCatcher.wgsl.d.ts +2 -0
  392. package/lib/renderer/wgsl/chunks/sampleShadowCatcher.wgsl.js +40 -0
  393. package/lib/renderer/wgsl/chunks/sampleShadowCatcher.wgsl.js.map +1 -0
  394. package/lib/renderer/wgsl/chunks/sampling.wgsl.d.ts +2 -0
  395. package/lib/renderer/wgsl/chunks/sampling.wgsl.js +198 -0
  396. package/lib/renderer/wgsl/chunks/sampling.wgsl.js.map +1 -0
  397. package/lib/renderer/wgsl/chunks/shadowCatcherAccumulation.wgsl.d.ts +8 -0
  398. package/lib/renderer/wgsl/chunks/shadowCatcherAccumulation.wgsl.js +16 -0
  399. package/lib/renderer/wgsl/chunks/shadowCatcherAccumulation.wgsl.js.map +1 -0
  400. package/lib/renderer/wgsl/chunks/sobol.wgsl.d.ts +2 -0
  401. package/lib/renderer/wgsl/chunks/sobol.wgsl.js +170 -0
  402. package/lib/renderer/wgsl/chunks/sobol.wgsl.js.map +1 -0
  403. package/lib/renderer/wgsl/chunks/uvProjection.wgsl.d.ts +2 -0
  404. package/lib/renderer/wgsl/chunks/uvProjection.wgsl.js +42 -0
  405. package/lib/renderer/wgsl/chunks/uvProjection.wgsl.js.map +1 -0
  406. package/lib/renderer/wgsl/compose.frag.wgsl.d.ts +5 -0
  407. package/lib/renderer/wgsl/compose.frag.wgsl.js +218 -0
  408. package/lib/renderer/wgsl/compose.frag.wgsl.js.map +1 -0
  409. package/lib/renderer/wgsl/customDenoise.wgsl.d.ts +4 -0
  410. package/lib/renderer/wgsl/customDenoise.wgsl.js +28 -0
  411. package/lib/renderer/wgsl/customDenoise.wgsl.js.map +1 -0
  412. package/lib/renderer/wgsl/depthQuery.wgsl.d.ts +3 -0
  413. package/lib/renderer/wgsl/depthQuery.wgsl.js +34 -0
  414. package/lib/renderer/wgsl/depthQuery.wgsl.js.map +1 -0
  415. package/lib/renderer/wgsl/offlineAdaptive.compute.d.ts +2 -0
  416. package/lib/renderer/wgsl/offlineAdaptive.compute.js +108 -0
  417. package/lib/renderer/wgsl/offlineAdaptive.compute.js.map +1 -0
  418. package/lib/renderer/wgsl/rayTrace.compute.d.ts +16 -0
  419. package/lib/renderer/wgsl/rayTrace.compute.js +927 -0
  420. package/lib/renderer/wgsl/rayTrace.compute.js.map +1 -0
  421. package/lib/scene/AmbientLight.d.ts +17 -0
  422. package/lib/scene/AmbientLight.js +15 -0
  423. package/lib/scene/AmbientLight.js.map +1 -0
  424. package/lib/scene/Camera.d.ts +78 -0
  425. package/lib/scene/Camera.js +111 -0
  426. package/lib/scene/Camera.js.map +1 -0
  427. package/lib/scene/DirectionalLight.d.ts +18 -0
  428. package/lib/scene/DirectionalLight.js +17 -0
  429. package/lib/scene/DirectionalLight.js.map +1 -0
  430. package/lib/scene/EnvironmentLight.d.ts +14 -0
  431. package/lib/scene/EnvironmentLight.js +14 -0
  432. package/lib/scene/EnvironmentLight.js.map +1 -0
  433. package/lib/scene/Geometry.d.ts +87 -0
  434. package/lib/scene/Geometry.js +108 -0
  435. package/lib/scene/Geometry.js.map +1 -0
  436. package/lib/scene/IESProfile.d.ts +19 -0
  437. package/lib/scene/IESProfile.js +165 -0
  438. package/lib/scene/IESProfile.js.map +1 -0
  439. package/lib/scene/InstancedMesh.d.ts +43 -0
  440. package/lib/scene/InstancedMesh.js +79 -0
  441. package/lib/scene/InstancedMesh.js.map +1 -0
  442. package/lib/scene/Mesh.d.ts +14 -0
  443. package/lib/scene/Mesh.js +17 -0
  444. package/lib/scene/Mesh.js.map +1 -0
  445. package/lib/scene/OpenPBRMaterial.d.ts +224 -0
  446. package/lib/scene/OpenPBRMaterial.js +240 -0
  447. package/lib/scene/OpenPBRMaterial.js.map +1 -0
  448. package/lib/scene/RectLight.d.ts +31 -0
  449. package/lib/scene/RectLight.js +26 -0
  450. package/lib/scene/RectLight.js.map +1 -0
  451. package/lib/scene/Scene.d.ts +55 -0
  452. package/lib/scene/Scene.js +2 -0
  453. package/lib/scene/Scene.js.map +1 -0
  454. package/lib/scene/SceneNode.d.ts +16 -0
  455. package/lib/scene/SceneNode.js +33 -0
  456. package/lib/scene/SceneNode.js.map +1 -0
  457. package/lib/scene/SphereLight.d.ts +22 -0
  458. package/lib/scene/SphereLight.js +20 -0
  459. package/lib/scene/SphereLight.js.map +1 -0
  460. package/lib/scene/SpotLight.d.ts +35 -0
  461. package/lib/scene/SpotLight.js +29 -0
  462. package/lib/scene/SpotLight.js.map +1 -0
  463. package/lib/scene/Texture.d.ts +38 -0
  464. package/lib/scene/Texture.js +37 -0
  465. package/lib/scene/Texture.js.map +1 -0
  466. package/lib/scene/anisotropyParameters.d.ts +1 -0
  467. package/lib/scene/anisotropyParameters.js +13 -0
  468. package/lib/scene/anisotropyParameters.js.map +1 -0
  469. package/lib/scene/geometryChanges.d.ts +5 -0
  470. package/lib/scene/geometryChanges.js +18 -0
  471. package/lib/scene/geometryChanges.js.map +1 -0
  472. package/lib/scene/materialTextureNames.d.ts +2 -0
  473. package/lib/scene/materialTextureNames.js +9 -0
  474. package/lib/scene/materialTextureNames.js.map +1 -0
  475. package/lib/scene/openPbrSchema.d.ts +400 -0
  476. package/lib/scene/openPbrSchema.js +149 -0
  477. package/lib/scene/openPbrSchema.js.map +1 -0
  478. package/lib/scene/thinFilmParameters.d.ts +4 -0
  479. package/lib/scene/thinFilmParameters.js +12 -0
  480. package/lib/scene/thinFilmParameters.js.map +1 -0
  481. package/lib/settings/display.d.ts +118 -0
  482. package/lib/settings/display.js +34 -0
  483. package/lib/settings/display.js.map +1 -0
  484. package/lib/settings/engine.d.ts +37 -0
  485. package/lib/settings/engine.js +26 -0
  486. package/lib/settings/engine.js.map +1 -0
  487. package/lib/settings/render.d.ts +178 -0
  488. package/lib/settings/render.js +36 -0
  489. package/lib/settings/render.js.map +1 -0
  490. package/lib/tinybvh/LICENSE +21 -0
  491. package/lib/tinybvh/TinyBvhBuilder.d.ts +17 -0
  492. package/lib/tinybvh/TinyBvhBuilder.js +211 -0
  493. package/lib/tinybvh/TinyBvhBuilder.js.map +1 -0
  494. package/lib/tinybvh/tinybvh.wasm +0 -0
  495. package/lib/types.d.ts +13 -0
  496. package/lib/types.js +2 -0
  497. package/lib/types.js.map +1 -0
  498. package/lib/util/canvas.d.ts +2 -0
  499. package/lib/util/canvas.js +13 -0
  500. package/lib/util/canvas.js.map +1 -0
  501. package/lib/util/commonGeometry.d.ts +15 -0
  502. package/lib/util/commonGeometry.js +240 -0
  503. package/lib/util/commonGeometry.js.map +1 -0
  504. package/lib/util/events.d.ts +7 -0
  505. package/lib/util/events.js +23 -0
  506. package/lib/util/events.js.map +1 -0
  507. package/lib/util/frame.d.ts +2 -0
  508. package/lib/util/frame.js +10 -0
  509. package/lib/util/frame.js.map +1 -0
  510. package/lib/util/fromTHREE.d.ts +105 -0
  511. package/lib/util/fromTHREE.js +1111 -0
  512. package/lib/util/fromTHREE.js.map +1 -0
  513. package/lib/util/geometry.d.ts +13 -0
  514. package/lib/util/geometry.js +292 -0
  515. package/lib/util/geometry.js.map +1 -0
  516. package/lib/util/loadRGBE.d.ts +7 -0
  517. package/lib/util/loadRGBE.js +168 -0
  518. package/lib/util/loadRGBE.js.map +1 -0
  519. package/lib/util/math.d.ts +8 -0
  520. package/lib/util/math.js +64 -0
  521. package/lib/util/math.js.map +1 -0
  522. package/lib/util/mesh.d.ts +7 -0
  523. package/lib/util/mesh.js +20 -0
  524. package/lib/util/mesh.js.map +1 -0
  525. package/lib/util/threeDeformation.d.ts +20 -0
  526. package/lib/util/threeDeformation.js +218 -0
  527. package/lib/util/threeDeformation.js.map +1 -0
  528. package/lib/version.d.ts +2 -0
  529. package/lib/version.js +3 -0
  530. package/lib/version.js.map +1 -0
  531. package/llms.txt +62 -0
  532. package/oidn/weights/LICENSE.txt +202 -0
  533. package/oidn/weights/README.md +43 -0
  534. package/oidn/weights/rt_hdr_alb_nrm.tza +0 -0
  535. package/oidn/weights/rt_hdr_alb_nrm_small.tza +0 -0
  536. package/package.json +124 -4
@@ -0,0 +1,845 @@
1
+ import { normalizeBounces } from './pathLimits.js';
2
+ import { updateMeshInstanceColors } from './prepareMeshBVH.js';
3
+ import { updateTLASInstanceColors } from './bvhAccel.js';
4
+ import { getMaterialHashKey } from '../scene/openPbrSchema.js';
5
+ import { sameInstanceMembership } from './meshInstances.js';
6
+ import InstancedMesh from '../scene/InstancedMesh.js';
7
+ import { dirtyMeshInstanceIndices } from './prepareMeshBVH.js';
8
+ import { cameraApertureRadius } from './cameraLens.js';
9
+ import { getGeometryBvh, setGeometryBvh } from './geometryBvh.js';
10
+ import { samplingPatternCode, zSobolLog2SPP } from './sampling.js';
11
+ import depthQueryFrag from './glsl/depthQuery.frag.js';
12
+ import { readFloatPixelsAsync } from './WebGLReadback.js';
13
+ import { DEPTH_SAMPLE_GRID, packDepthSampleArea, unpackDepthSamples } from './depthQuery.js';
14
+ import { MeshMembershipCache } from './meshMembership.js';
15
+ import { SceneEnvironmentCache, RectLightTextureTracker } from './sceneLightChanges.js';
16
+ import { MaterialChangeTracker, materialIsEmissive } from './materialChanges.js';
17
+ import { constants, Texture2D as WebGLTexture2D } from './webgl.js';
18
+ import { WebGLFullQuadPass } from './WebGLFullQuadPass.js';
19
+ import { mat4 } from '../math.js';
20
+ import { buildBLAS, buildTLAS, concatBLASBuffers, refitBLAS, refitTLAS, mergeRefitRanges } from './bvhAccel.js';
21
+ import { generateBackgroundMapFromSceneBackground } from './envMapCreation.js';
22
+ import { envMapDistribution, environmentMapSourcesMatch } from './envMapDistribution.js';
23
+ import createRayTraceFragmentShader from './glsl/rayTrace.frag.js';
24
+ import shadowCatcherFrag from './glsl/shadowCatcher.frag.js';
25
+ import MaterialTable, { DEFAULT_MAX_TEXTURE_ARRAY_BYTES, materialUsesMedium } from './MaterialTable.js';
26
+ import { resolveMaterialAlphaMode } from '../scene/OpenPBRMaterial.js';
27
+ import { isIntelMac, numberArraysEqual } from './util.js';
28
+ import { commonLinearFloatProps, commonNearestFloatProps, setDataTexture, textureDimensionsFromArray } from './dataTextureUtil.js';
29
+ import { CONSTANT_DIRECTIONAL_LIGHT, CONSTANT_RECT_LIGHT, CONSTANT_SPHERE_LIGHT, packLightsToBuffer } from './lightsUtil.js';
30
+ import { estimateAnalyticLightPower, estimateEnvironmentPower, packIESProfiles } from './lightSampling.js';
31
+ import { updatePreparedGeometries, canUpdateGeometries, geometryTopologyChanged } from './geometryUpdates.js';
32
+ import { Attribute } from '../scene/Geometry.js';
33
+ import { updateMeshInstances, updateMeshInstanceTransforms } from './prepareMeshBVH.js';
34
+ import { mergeMeshesToGeometry } from './mergeMeshesToGeometry.js';
35
+ import { DEFAULT_BEVEL_SAMPLES, normalizeBevelSamples } from './RenderingPipeline.js';
36
+ import { getOpenPbrEnergyLutData, OPENPBR_ENERGY_LUT_HEIGHT, OPENPBR_ENERGY_LUT_WIDTH } from './openPbrEnergyLut.js';
37
+ // A defensive mixture keeps weak-but-wide lights from being starved by an
38
+ // imperfect scalar power estimate while still favoring dominant emitters.
39
+ const POWER_WEIGHTED_LIGHT_MIX = 0.25;
40
+ function packLightsToTexture(texture, lights, texturesIndices, selectionPmfs, selectionCdfs, iesProfileTexelOffsets) {
41
+ const data = packLightsToBuffer(lights, texturesIndices, selectionPmfs, selectionCdfs, iesProfileTexelOffsets);
42
+ texture.source = {
43
+ data,
44
+ width: data.length / 4,
45
+ height: 1
46
+ };
47
+ }
48
+ // TODO EXT_float_blend
49
+ // rayTraceBlendNode.inputs = {
50
+ // colorTex: rayTraceNode,
51
+ // prevColorTex: {
52
+ // node: rayTraceBlendNode,
53
+ // prevFrame: true
54
+ // }
55
+ // };
56
+ // TODO use one method to set all required properties.
57
+ // Ensure necessary properties are set.
58
+ class WebGLRayTracePass {
59
+ _renderer;
60
+ _meshes = [];
61
+ _sceneEnvironment = new SceneEnvironmentCache();
62
+ _rectLightTextures = new RectLightTextureTracker();
63
+ _analyticLights = [];
64
+ _analyticLightSelectionPmfs = new Float32Array(0);
65
+ _analyticLightSelectionCdfs = new Float32Array(0);
66
+ _envLightSelectionPmf = 0;
67
+ _materialData;
68
+ _maxTextureArrayBytes = DEFAULT_MAX_TEXTURE_ARRAY_BYTES;
69
+ _preparedMeshData;
70
+ _membershipCache = new MeshMembershipCache();
71
+ _pendingMembershipData;
72
+ _materialChanges = new MaterialChangeTracker();
73
+ _pendingMaterialUpdate;
74
+ _pendingGeometryUpdates = new Set();
75
+ _needsUpdateMeshData = true;
76
+ _needsUpdateMeshMembership = false;
77
+ _needsRefitTLAS = false;
78
+ _dirtyTransformMeshes = new Set();
79
+ _dirtyColorMeshes = new Set();
80
+ _tlas;
81
+ _bvhData;
82
+ _instancesData;
83
+ _materialIndexData;
84
+ _meshSnapshot = [];
85
+ _snapshotByMesh = new WeakMap();
86
+ _needsUpdateAnalyticLightsBuffer = true;
87
+ _debugBvhData;
88
+ _lightTex = new WebGLTexture2D(commonNearestFloatProps);
89
+ _iesProfileTex = new WebGLTexture2D(commonNearestFloatProps);
90
+ _iesProfileColumns = 1;
91
+ _iesProfileTexelOffsets = new Int32Array(0);
92
+ _openPbrEnergyLut = new WebGLTexture2D({
93
+ ...commonNearestFloatProps,
94
+ source: {
95
+ data: getOpenPbrEnergyLutData(),
96
+ width: OPENPBR_ENERGY_LUT_WIDTH,
97
+ height: OPENPBR_ENERGY_LUT_HEIGHT
98
+ }
99
+ });
100
+ _envMap = new WebGLTexture2D(commonLinearFloatProps);
101
+ _envMapDistribution = new WebGLTexture2D(commonLinearFloatProps);
102
+ _envImageSource;
103
+ _backgroundTex = new WebGLTexture2D(commonLinearFloatProps);
104
+ _hasEnvMap = false;
105
+ _hasBackground = false;
106
+ _groundedBackgroundParams = new Float32Array([0, 0, 0, 0]);
107
+ _groundedBackgroundCenter = new Float32Array([0, 0]);
108
+ _bounces = 2;
109
+ _bevelSamples = DEFAULT_BEVEL_SAMPLES;
110
+ _clamping;
111
+ // higher number results in faster convergence over time, but with lower quality initial samples
112
+ _samplingCode = -1;
113
+ _sequenceSeed = 0;
114
+ _zLogSPP = 0;
115
+ _positionBufferTex = new WebGLTexture2D(commonNearestFloatProps);
116
+ _normalBufferTex = new WebGLTexture2D(commonNearestFloatProps);
117
+ _colorBufferTex = new WebGLTexture2D(commonNearestFloatProps);
118
+ _tangentBufferTex = new WebGLTexture2D(commonNearestFloatProps);
119
+ _uvBufferTex = new WebGLTexture2D(commonNearestFloatProps);
120
+ _uv1BufferTex = new WebGLTexture2D(commonNearestFloatProps);
121
+ _bvhBufferTex = new WebGLTexture2D(commonNearestFloatProps);
122
+ _instancesBufferTex = new WebGLTexture2D(commonNearestFloatProps);
123
+ _matIndexBufferTex = new WebGLTexture2D({
124
+ ...commonNearestFloatProps
125
+ // type: constants.INT
126
+ });
127
+ _hasTransmission = false;
128
+ _hasAlpha = false;
129
+ _invalid = false;
130
+ _transmissiveAlphaMin = 1;
131
+ _mainPass;
132
+ _shadowCatcherPass;
133
+ _viewProjInv = mat4.create();
134
+ _apertureRadius = 0;
135
+ _focusDistance = 10;
136
+ _tracePasses;
137
+ _depthPass;
138
+ _depthAbort = new AbortController();
139
+ _depthAspect = 1;
140
+ _hasShadowCatcher = false;
141
+ _spectral = false;
142
+ constructor(renderer) {
143
+ this._renderer = renderer;
144
+ const accumulationOutput = {
145
+ type: constants.FLOAT,
146
+ minFilter: constants.LINEAR,
147
+ magFilter: constants.LINEAR,
148
+ wrapS: constants.CLAMP_TO_EDGE,
149
+ wrapT: constants.CLAMP_TO_EDGE
150
+ };
151
+ const rayTraceFrag = createRayTraceFragmentShader();
152
+ rayTraceFrag.parallelCompile = true;
153
+ shadowCatcherFrag.parallelCompile = true;
154
+ this._mainPass = new WebGLFullQuadPass('rayTrace', renderer, {
155
+ shader: rayTraceFrag,
156
+ // `moments` holds the denoiser's guide value moments and sample count.
157
+ outputs: ['color', 'albedo', 'normal', 'moments'],
158
+ outputParams: {
159
+ color: accumulationOutput,
160
+ albedo: accumulationOutput,
161
+ normal: accumulationOutput,
162
+ moments: accumulationOutput
163
+ }
164
+ });
165
+ this._shadowCatcherPass = new WebGLFullQuadPass('shadowCatcher', renderer, {
166
+ shader: shadowCatcherFrag,
167
+ outputs: ['shadowCatcher', 'catcherBackground', 'catcherMoments'],
168
+ outputParams: {
169
+ shadowCatcher: accumulationOutput,
170
+ catcherBackground: accumulationOutput,
171
+ catcherMoments: accumulationOutput
172
+ }
173
+ });
174
+ this._depthPass = new WebGLFullQuadPass('Depth query', renderer, {
175
+ shader: depthQueryFrag, outputs: ['depth'],
176
+ outputParams: { depth: commonNearestFloatProps }
177
+ });
178
+ this._tracePasses = [this._mainPass, this._shadowCatcherPass, this._depthPass];
179
+ this._tracePasses.forEach((pass) => {
180
+ pass.setDefines({
181
+ OES_texture_float_linear: !!renderer.gl.getExtension('OES_texture_float_linear')
182
+ });
183
+ });
184
+ this._mainPass.setUniform('openPbrEnergyLut', this._openPbrEnergyLut);
185
+ }
186
+ createPass(clear, tile, disableShadowCatcher = false) {
187
+ this.prepare();
188
+ const options = {
189
+ clear,
190
+ blend: !clear,
191
+ scissor: tile
192
+ };
193
+ this._mainPass.createPass({}, undefined, options);
194
+ if (this._hasShadowCatcher && !disableShadowCatcher) {
195
+ this._shadowCatcherPass.createPass({}, undefined, options);
196
+ }
197
+ }
198
+ getOutput(label) {
199
+ return label === 'shadowCatcher' || label === 'catcherBackground' ||
200
+ label === 'catcherMoments'
201
+ ? this._shadowCatcherPass.getOutput(label)
202
+ : this._mainPass.getOutput(label);
203
+ }
204
+ setBounce(bounce) {
205
+ const next = normalizeBounces(bounce);
206
+ const changed = this._bounces !== next;
207
+ this._bounces = next;
208
+ return changed;
209
+ }
210
+ setClamping(clamping) {
211
+ const changed = this._clamping !== clamping;
212
+ this._clamping = clamping;
213
+ return changed;
214
+ }
215
+ setBevelSamples(samples) {
216
+ const next = normalizeBevelSamples(samples);
217
+ const changed = this._bevelSamples !== next;
218
+ if (changed) {
219
+ this._bevelSamples = next;
220
+ }
221
+ return changed;
222
+ }
223
+ _setEnvMap(envImage) {
224
+ if (!environmentMapSourcesMatch(envImage, this._envImageSource) && envImage) {
225
+ this._envMap.source = envImage;
226
+ this._envMapDistribution.source = envMapDistribution(envImage);
227
+ }
228
+ this._envImageSource = envImage;
229
+ this._tracePasses.forEach((pass) => {
230
+ pass.setUniform('envMap', envImage ? this._envMap : null);
231
+ pass.setUniform('envMapDistribution', envImage ? this._envMapDistribution : null);
232
+ pass.setUniform('envLightSelectionPmf', this._envLightSelectionPmf);
233
+ pass.setDefines({
234
+ USE_ENVMAP: !!envImage
235
+ });
236
+ });
237
+ this._hasEnvMap = !!envImage;
238
+ }
239
+ setBackground(background) {
240
+ const backgroundImage = background && generateBackgroundMapFromSceneBackground(background);
241
+ if (backgroundImage) {
242
+ this._backgroundTex.source = backgroundImage;
243
+ }
244
+ this._hasBackground = !!backgroundImage;
245
+ const grounded = background &&
246
+ !Array.isArray(background) &&
247
+ 'type' in background &&
248
+ background.type === 'GroundedSkybox'
249
+ ? background
250
+ : undefined;
251
+ this._groundedBackgroundParams.set(grounded
252
+ ? [
253
+ Math.max(grounded.height, 0.0001),
254
+ Math.max(grounded.radius, 0.0001),
255
+ grounded.groundHeight ?? 0,
256
+ 1
257
+ ]
258
+ : [0, 0, 0, 0]);
259
+ this._groundedBackgroundCenter.set(grounded?.center ?? [0, 0]);
260
+ }
261
+ setTransmissiveOutputAlphaMin(transmissiveAlphaMin) {
262
+ const changed = this._transmissiveAlphaMin !== transmissiveAlphaMin;
263
+ this._transmissiveAlphaMin = transmissiveAlphaMin;
264
+ return changed;
265
+ }
266
+ setMeshes(meshes, update) {
267
+ for (const mesh of update?.colors ?? [])
268
+ this._dirtyColorMeshes.add(mesh);
269
+ if (update && this._preparedMeshData && this._materialData &&
270
+ !this._needsUpdateMeshData && meshes === this._meshes) {
271
+ const change = this._materialChanges.classify(update.materials ?? []);
272
+ if (change.level !== 'geometry' && canUpdateGeometries(this._preparedMeshData, update.geometries ?? [])) {
273
+ if (update.materials?.length) {
274
+ const pending = this._pendingMaterialUpdate;
275
+ this._pendingMaterialUpdate = { level: pending?.level === 'textures' ? 'textures' : change.level,
276
+ emission: !!pending?.emission || change.emission,
277
+ emissiveMap: !!pending?.emissiveMap || change.emissiveMap,
278
+ materials: new Set([...(pending?.materials ?? []), ...update.materials]) };
279
+ this._meshSnapshot.forEach(item => { item.materialKeys = item.materials.map(getMaterialHashKey); });
280
+ }
281
+ for (const geometry of update.geometries ?? [])
282
+ this._pendingGeometryUpdates.add(geometry);
283
+ for (const item of this._meshSnapshot)
284
+ if (this._pendingGeometryUpdates.has(item.geometry))
285
+ item.geometryVersion = item.geometry.version;
286
+ for (const mesh of update.transforms ?? []) {
287
+ const item = this._snapshotByMesh.get(mesh);
288
+ if (!item)
289
+ continue;
290
+ for (let i = 0; i < 16; i++)
291
+ item.matrix[i] = mesh.transform[i];
292
+ this._dirtyTransformMeshes.add(mesh);
293
+ this._needsRefitTLAS = true;
294
+ }
295
+ return !!update.materials?.length || !!update.transforms?.length || !!update.colors?.length || !!update.geometries?.length;
296
+ }
297
+ }
298
+ const materialChange = !!update?.materials?.length;
299
+ const next = meshes.map((mesh) => ({
300
+ mesh,
301
+ instanceCount: mesh instanceof InstancedMesh ? mesh.count : 1,
302
+ instanceVersion: mesh instanceof InstancedMesh ? mesh.transformsVersion : 0,
303
+ instanceTransforms: mesh instanceof InstancedMesh ? mesh.transforms : undefined,
304
+ instanceColors: mesh instanceof InstancedMesh ? mesh.colors : undefined,
305
+ colorVersion: mesh instanceof InstancedMesh ? mesh.colorsVersion : 0,
306
+ geometry: mesh.geometry,
307
+ materials: mesh.materials.slice(),
308
+ materialKeys: mesh.materials.map(getMaterialHashKey),
309
+ geometryVersion: mesh.geometry.version,
310
+ positionArray: mesh.geometry.position.array, indexArray: mesh.geometry.indices.array,
311
+ matrix: Array.from(mesh.transform)
312
+ }));
313
+ const membershipChanged = next.length !== this._meshSnapshot.length ||
314
+ next.some((item, i) => item.mesh !== this._meshSnapshot[i]?.mesh || item.instanceCount !== this._meshSnapshot[i]?.instanceCount ||
315
+ item.materials.some((material, k) => material !== this._meshSnapshot[i]?.materials[k]));
316
+ const membership = !this._needsUpdateMeshData && membershipChanged && this._preparedMeshData
317
+ ? this._membershipCache.update(this._preparedMeshData, meshes) : undefined;
318
+ if (membership) {
319
+ const versions = new Map(this._meshSnapshot.flatMap(item => item.materials.map((m, i) => [m, item.materialKeys[i]])));
320
+ const materialsChanged = membership.materials.length !== this._preparedMeshData.materials.length ||
321
+ membership.materials.some((m, i) => m !== this._preparedMeshData.materials[i] ||
322
+ versions.has(m) && getMaterialHashKey(m) !== versions.get(m));
323
+ this._pendingMembershipData = membership;
324
+ this._meshes = meshes;
325
+ this._meshSnapshot = next;
326
+ this._snapshotByMesh = new WeakMap();
327
+ next.forEach(item => this._snapshotByMesh.set(item.mesh, item));
328
+ this._needsUpdateMeshMembership = true;
329
+ this._needsRefitTLAS = false;
330
+ this._dirtyTransformMeshes.clear();
331
+ if (materialsChanged)
332
+ this._pendingMaterialUpdate = { level: 'textures', emission: true,
333
+ emissiveMap: true, materials: new Set(membership.materials) };
334
+ return true;
335
+ }
336
+ const changed = next.length !== this._meshSnapshot.length ||
337
+ next.some((item, i) => {
338
+ const prev = this._meshSnapshot[i];
339
+ return (!prev ||
340
+ item.mesh !== prev.mesh || item.instanceCount !== prev.instanceCount || item.instanceVersion !== prev.instanceVersion || item.instanceTransforms !== prev.instanceTransforms ||
341
+ item.geometry !== prev.geometry || item.colorVersion !== prev.colorVersion || item.instanceColors !== prev.instanceColors ||
342
+ item.materials.length !== prev.materials.length ||
343
+ item.materials.some((material, k) => material !== prev.materials[k]) ||
344
+ item.materialKeys.some((hash, k) => hash !== prev.materialKeys[k]) ||
345
+ item.geometryVersion !== prev.geometryVersion ||
346
+ item.matrix.some((value, k) => value !== prev.matrix[k]));
347
+ });
348
+ next.forEach((item, i) => {
349
+ const prev = this._meshSnapshot[i];
350
+ if (prev &&
351
+ item.geometry === prev.geometry &&
352
+ (item.geometryVersion !== prev.geometryVersion || item.positionArray !== prev.positionArray || item.indexArray !== prev.indexArray)) {
353
+ const usesDisplacement = !!item.materials[0]?.displacementMap &&
354
+ Math.abs(item.materials[0].displacementScale) > 1e-6;
355
+ if (usesDisplacement || geometryTopologyChanged(this._preparedMeshData, item.geometry) ||
356
+ !getGeometryBvh(item.geometry) ||
357
+ !refitBLAS(getGeometryBvh(item.geometry), item.geometry)) {
358
+ setGeometryBvh(item.geometry, undefined);
359
+ }
360
+ }
361
+ });
362
+ this._meshSnapshot = next;
363
+ this._snapshotByMesh = new WeakMap();
364
+ next.forEach(item => this._snapshotByMesh.set(item.mesh, item));
365
+ if (!changed && update && !materialChange)
366
+ return false;
367
+ this._meshes = meshes;
368
+ this._needsUpdateMeshData = true;
369
+ this._needsRefitTLAS = false;
370
+ this._dirtyTransformMeshes.clear();
371
+ this._debugBvhData = undefined;
372
+ return true;
373
+ }
374
+ setTextureAtlasBudget(maxBytes) {
375
+ const next = Number.isFinite(maxBytes)
376
+ ? Math.max(4, Math.floor(maxBytes))
377
+ : DEFAULT_MAX_TEXTURE_ARRAY_BYTES;
378
+ if (next === this._maxTextureArrayBytes)
379
+ return false;
380
+ this._maxTextureArrayBytes = next;
381
+ this._needsUpdateMeshData = true;
382
+ return true;
383
+ }
384
+ getDebugBVHData() {
385
+ if (!this._debugBvhData) {
386
+ const mergedMesh = mergeMeshesToGeometry(this._meshes);
387
+ const bvh = buildBLAS(mergedMesh.geometry);
388
+ this._debugBvhData = { buffer: bvh.buffer };
389
+ }
390
+ return this._debugBvhData;
391
+ }
392
+ getDiagnostics() {
393
+ return {
394
+ textureAtlas: this._materialData?.textureAtlasStats
395
+ };
396
+ }
397
+ _updateMeshData() {
398
+ this._pendingGeometryUpdates.clear();
399
+ this._needsUpdateMeshData = false;
400
+ const res = updateMeshInstances(this._meshes);
401
+ this._preparedMeshData = res;
402
+ this._membershipCache.capture(res);
403
+ this._pendingMembershipData = undefined;
404
+ this._needsUpdateMeshMembership = false;
405
+ const mergedGeometry = res.geometry;
406
+ const materials = res.materials;
407
+ const tlas = buildTLAS(res.instances, res.blases);
408
+ this._tlas = tlas;
409
+ const tlasBuffer = new Float32Array(tlas.buffer);
410
+ const instancesBuffer = this._instancesData = new Float32Array(tlas.instancesBuffer);
411
+ const blasBuffer = new Float32Array(concatBLASBuffers(res.blases));
412
+ const bvhBuffer = this._bvhData = new Float32Array(tlasBuffer.length + blasBuffer.length);
413
+ const blasOffset = tlasBuffer.length / 4;
414
+ bvhBuffer.set(tlasBuffer);
415
+ bvhBuffer.set(blasBuffer, blasOffset * 4);
416
+ if (mergedGeometry.position.array.length > 0) {
417
+ setDataTexture(this._positionBufferTex, mergedGeometry.position.array, 3);
418
+ setDataTexture(this._normalBufferTex, mergedGeometry.normal.array, 3);
419
+ mergedGeometry.color &&
420
+ setDataTexture(this._colorBufferTex, mergedGeometry.color.array, 3);
421
+ mergedGeometry.tangent &&
422
+ setDataTexture(this._tangentBufferTex, mergedGeometry.tangent.array, 4);
423
+ mergedGeometry.uv &&
424
+ setDataTexture(this._uvBufferTex, mergedGeometry.uv.array, 2);
425
+ mergedGeometry.uv1 &&
426
+ setDataTexture(this._uv1BufferTex, mergedGeometry.uv1.array, 2);
427
+ mergedGeometry.materialIndex &&
428
+ setDataTexture(this._matIndexBufferTex,
429
+ // TODO currently int texture doesn't work
430
+ this._materialIndexData = new Float32Array(mergedGeometry.materialIndex.array), 4);
431
+ }
432
+ if (bvhBuffer.length > 0) {
433
+ setDataTexture(this._bvhBufferTex, bvhBuffer, 4);
434
+ setDataTexture(this._instancesBufferTex, instancesBuffer, 4);
435
+ }
436
+ this._materialData?.dispose(this._renderer.gl);
437
+ const materialData = new MaterialTable(materials, this._analyticLights, {
438
+ maxTextureArrayBytes: this._maxTextureArrayBytes,
439
+ maxTextureArrayLayers: this._renderer.gl.getParameter(this._renderer.gl.MAX_ARRAY_TEXTURE_LAYERS),
440
+ maxTextureDimension2D: this._renderer.gl.getParameter(this._renderer.gl.MAX_TEXTURE_SIZE)
441
+ });
442
+ this._materialData = materialData;
443
+ this._tracePasses.forEach((pass) => {
444
+ pass.setUniforms({
445
+ bvhBuffer: this._bvhBufferTex,
446
+ instancesBuffer: this._instancesBufferTex,
447
+ positionBuffer: this._positionBufferTex,
448
+ normalBuffer: this._normalBufferTex,
449
+ tangentBuffer: mergedGeometry.tangent ? this._tangentBufferTex : null,
450
+ colorBuffer: mergedGeometry.color ? this._colorBufferTex : null,
451
+ uvBuffer: mergedGeometry.uv ? this._uvBufferTex : null,
452
+ uv1Buffer: mergedGeometry.uv1 ? this._uv1BufferTex : null,
453
+ materialIndexBuffer: this._matIndexBufferTex,
454
+ bvhColumns: textureDimensionsFromArray(bvhBuffer.length / 4).columnsLog,
455
+ vertexColumns: textureDimensionsFromArray(Attribute.getCount(mergedGeometry.position)).columnsLog,
456
+ instancesColumns: textureDimensionsFromArray(instancesBuffer.length / 4)
457
+ .columnsLog,
458
+ blasOffset,
459
+ isEmptyScene: +(res.instances.length === 0)
460
+ });
461
+ });
462
+ this._updateMaterialConstants(materials, materialData, mergedGeometry);
463
+ this._materialChanges.capture(materials);
464
+ this._pendingMaterialUpdate = undefined;
465
+ return bvhBuffer;
466
+ }
467
+ _updateMaterialConstants(materials, materialData, mergedGeometry) {
468
+ // Avoid too much shader compilation
469
+ const STACK_SIZE = 50;
470
+ const hasShadowCatcher = materials.some((m) => m.shadowCatcher);
471
+ const HAS_BEVEL = materials.some((m) => m.bevelSize > 0);
472
+ const HAS_MEDIUM = materials.some(materialUsesMedium);
473
+ this._hasShadowCatcher = hasShadowCatcher;
474
+ this._hasTransmission = materials.some((m) => m.transmissionWeight > 0 ||
475
+ m.mapAlphaUsage === "transmission");
476
+ this._hasAlpha = materials.some((m) => resolveMaterialAlphaMode(m) !== 'opaque');
477
+ this._spectral = materials.some((m) => m.transmissionDispersionScale > 0);
478
+ this._tracePasses.forEach(pass => {
479
+ pass.setDefines({
480
+ OES_texture_float_linear: true,
481
+ STACK_SIZE,
482
+ USE_VERTEX_COLOR: mergedGeometry.color != null,
483
+ USE_TANGENT: mergedGeometry.tangent != null,
484
+ HAS_TRANSMISSION: this._hasTransmission,
485
+ HAS_GLTF_ANISOTROPY: materials.some(m => m.specularAnisotropyModel === 'gltf' && m.specularAnisotropy > 0),
486
+ HAS_BEVEL,
487
+ HAS_MEDIUM,
488
+ HAS_ALPHA: this._hasAlpha,
489
+ BEVEL_SAMPLES: this._bevelSamples,
490
+ RECT_LIGHT: CONSTANT_RECT_LIGHT,
491
+ SPHERE_LIGHT: CONSTANT_SPHERE_LIGHT,
492
+ DIRECTIONAL_LIGHT: CONSTANT_DIRECTIONAL_LIGHT,
493
+ USE_RR: true,
494
+ // Multiple-scattering SSS paths need enough collisions to return to
495
+ // the boundary before roulette; terminating at depth five produces
496
+ // dark materials and a handful of very large surviving samples.
497
+ RR_MAX: HAS_MEDIUM ? 12 : 2,
498
+ ...materialData.defines
499
+ });
500
+ materialData.setToPass(pass);
501
+ });
502
+ }
503
+ _updateMeshMembership() {
504
+ const res = this._pendingMembershipData;
505
+ this._preparedMeshData = res;
506
+ const tlas = this._tlas = buildTLAS(res.instances, res.blases);
507
+ const blas = new Float32Array(concatBLASBuffers(res.blases));
508
+ const data = this._bvhData = new Float32Array(tlas.buffer.byteLength / 4 + blas.length);
509
+ data.set(new Float32Array(tlas.buffer));
510
+ data.set(blas, tlas.buffer.byteLength / 4);
511
+ this._instancesData = new Float32Array(tlas.instancesBuffer);
512
+ setDataTexture(this._bvhBufferTex, data, 4);
513
+ setDataTexture(this._instancesBufferTex, this._instancesData, 4);
514
+ this._tracePasses.forEach(pass => pass.setUniforms({
515
+ bvhColumns: textureDimensionsFromArray(data.length / 4).columnsLog,
516
+ instancesColumns: textureDimensionsFromArray(this._instancesData.length / 4).columnsLog,
517
+ blasOffset: tlas.buffer.byteLength / 16,
518
+ isEmptyScene: +(res.instances.length === 0)
519
+ }));
520
+ this._pendingMembershipData = undefined;
521
+ this._needsUpdateMeshMembership = false;
522
+ this._debugBvhData = undefined;
523
+ }
524
+ _updateGeometryData() {
525
+ const res = this._preparedMeshData, tlas = this._tlas;
526
+ const update = updatePreparedGeometries(res, this._pendingGeometryUpdates);
527
+ for (const { first, count, topologyChanged, deformationOnly } of update.vertices) {
528
+ for (const [attribute, texture] of [
529
+ [res.geometry.position, this._positionBufferTex], [res.geometry.normal, this._normalBufferTex],
530
+ [res.geometry.tangent, this._tangentBufferTex], [res.geometry.color, this._colorBufferTex],
531
+ [res.geometry.uv, this._uvBufferTex], [res.geometry.uv1, this._uv1BufferTex]
532
+ ])
533
+ if (attribute && (!deformationOnly || attribute === res.geometry.position || attribute === res.geometry.normal || attribute === res.geometry.tangent))
534
+ texture.updateDataRange(this._renderer.gl, attribute.array, first * attribute.itemSize * 4, count * attribute.itemSize * 4);
535
+ if (!topologyChanged)
536
+ continue;
537
+ const material = this._materialIndexData;
538
+ for (let i = first * 4; i < (first + count) * 4; i++)
539
+ material[i] = res.geometry.materialIndex.array[i];
540
+ this._matIndexBufferTex.updateDataRange(this._renderer.gl, material, first * 16, count * 16);
541
+ }
542
+ for (const mesh of update.meshes)
543
+ this._dirtyTransformMeshes.add(mesh);
544
+ if (update.relocated)
545
+ for (const binding of res.instanceBindings)
546
+ this._dirtyTransformMeshes.add(binding.mesh);
547
+ if (update.resized) {
548
+ res.instances = updateMeshInstanceTransforms(res.instanceBindings);
549
+ refitTLAS(tlas, res.instances, res.blases);
550
+ const blas = new Float32Array(concatBLASBuffers(res.blases));
551
+ this._bvhData = new Float32Array(tlas.buffer.byteLength / 4 + blas.length);
552
+ this._bvhData.set(new Float32Array(tlas.buffer));
553
+ this._bvhData.set(blas, tlas.buffer.byteLength / 4);
554
+ setDataTexture(this._bvhBufferTex, this._bvhData, 4);
555
+ this._tracePasses.forEach(pass => pass.setUniform('bvhColumns', textureDimensionsFromArray(this._bvhData.length / 4).columnsLog));
556
+ }
557
+ else {
558
+ const ranges = [];
559
+ for (const { blas, offset } of update.blases) {
560
+ const target = tlas.buffer.byteLength + offset;
561
+ new Uint8Array(this._bvhData.buffer).set(new Uint8Array(blas.buffer), target);
562
+ ranges.push({ offset: target, size: blas.buffer.byteLength });
563
+ }
564
+ for (const { offset, size } of mergeRefitRanges(ranges))
565
+ this._bvhBufferTex.updateDataRange(this._renderer.gl, this._bvhData, offset, size);
566
+ }
567
+ this._needsRefitTLAS = true;
568
+ this._pendingGeometryUpdates.clear();
569
+ this._debugBvhData = undefined;
570
+ }
571
+ _updateMeshColors() {
572
+ const res = this._preparedMeshData, tlas = this._tlas;
573
+ if (res && tlas) {
574
+ const dirty = updateMeshInstanceColors(res.instanceBindings, res.instances, this._dirtyColorMeshes);
575
+ const ranges = updateTLASInstanceColors(tlas, res.instances, dirty);
576
+ for (const { offset, size } of ranges)
577
+ this._instancesBufferTex.updateDataRange(this._renderer.gl, this._instancesData, offset, size);
578
+ }
579
+ this._dirtyColorMeshes.clear();
580
+ }
581
+ _refitMeshInstances() {
582
+ const res = this._preparedMeshData, tlas = this._tlas;
583
+ const dirty = dirtyMeshInstanceIndices(res.instanceBindings, this._dirtyTransformMeshes, res.instances);
584
+ const previousInstances = res.instances;
585
+ res.instances = updateMeshInstanceTransforms(res.instanceBindings, res.instances, dirty);
586
+ if (!sameInstanceMembership(previousInstances, res.instances)) {
587
+ this._pendingMembershipData = res;
588
+ this._updateMeshMembership();
589
+ this._dirtyTransformMeshes.clear();
590
+ this._needsRefitTLAS = false;
591
+ return;
592
+ }
593
+ const ranges = refitTLAS(tlas, res.instances, res.blases, dirty);
594
+ this._bvhData.set(new Float32Array(tlas.buffer));
595
+ for (const { offset, size } of ranges.tlasRanges)
596
+ this._bvhBufferTex.updateDataRange(this._renderer.gl, this._bvhData, offset, size);
597
+ for (const { offset, size } of ranges.instanceRanges)
598
+ this._instancesBufferTex.updateDataRange(this._renderer.gl, this._instancesData, offset, size);
599
+ this._dirtyTransformMeshes.clear();
600
+ this._needsRefitTLAS = false;
601
+ this._debugBvhData = undefined;
602
+ }
603
+ _updateMaterialData() {
604
+ const update = this._pendingMaterialUpdate;
605
+ const res = this._preparedMeshData;
606
+ let data = this._materialData;
607
+ if (update.level === 'textures') {
608
+ data.dispose(this._renderer.gl);
609
+ data = this._materialData = new MaterialTable(res.materials, this._analyticLights, {
610
+ maxTextureArrayBytes: this._maxTextureArrayBytes,
611
+ maxTextureArrayLayers: this._renderer.gl.getParameter(this._renderer.gl.MAX_ARRAY_TEXTURE_LAYERS),
612
+ maxTextureDimension2D: this._renderer.gl.getParameter(this._renderer.gl.MAX_TEXTURE_SIZE)
613
+ });
614
+ this._needsUpdateAnalyticLightsBuffer = true;
615
+ }
616
+ else
617
+ data.repackParams(res.materials);
618
+ this._updateMaterialConstants(res.materials, data, res.geometry);
619
+ if (update.emission || update.emissiveMap) {
620
+ // WebGL currently evaluates mesh emission on path hits; its direct-light
621
+ // sampler has only analytic/environment sources. Retain that behavior.
622
+ res.emissiveBindings = res.instanceBindings.filter(binding => binding.materialIndices.some(index => materialIsEmissive(res.materials[index])));
623
+ }
624
+ this._materialChanges.capture([...update.materials]);
625
+ this._pendingMaterialUpdate = undefined;
626
+ }
627
+ setLights(lights) {
628
+ const analyticLights = lights.filter((light) => light.type === 'DirectionalLight' ||
629
+ light.type === 'SphereLight' ||
630
+ light.type === 'SpotLight' ||
631
+ light.type === 'RectLight');
632
+ const numAnalyticLights = analyticLights.length;
633
+ const envImage = this._sceneEnvironment.update(lights);
634
+ const envWeight = estimateEnvironmentPower(envImage);
635
+ const analyticWeights = analyticLights.map(estimateAnalyticLightPower);
636
+ const totalWeight = envWeight + analyticWeights.reduce((sum, weight) => sum + weight, 0);
637
+ const sourceCount = analyticLights.length + (envImage ? 1 : 0);
638
+ const fallbackPmf = sourceCount > 0 ? 1 / sourceCount : 0;
639
+ this._envLightSelectionPmf = envImage
640
+ ? totalWeight > 0
641
+ ? (1 - POWER_WEIGHTED_LIGHT_MIX) * fallbackPmf +
642
+ POWER_WEIGHTED_LIGHT_MIX * (envWeight / totalWeight)
643
+ : fallbackPmf
644
+ : 0;
645
+ this._analyticLightSelectionPmfs = Float32Array.from(analyticWeights, (weight) => totalWeight > 0
646
+ ? (1 - POWER_WEIGHTED_LIGHT_MIX) * fallbackPmf +
647
+ POWER_WEIGHTED_LIGHT_MIX * (weight / totalWeight)
648
+ : fallbackPmf);
649
+ let cumulativePmf = this._envLightSelectionPmf;
650
+ this._analyticLightSelectionCdfs = Float32Array.from(this._analyticLightSelectionPmfs, (pmf) => {
651
+ cumulativePmf += pmf;
652
+ return cumulativePmf;
653
+ });
654
+ if (this._analyticLightSelectionCdfs.length > 0) {
655
+ this._analyticLightSelectionCdfs[this._analyticLightSelectionCdfs.length - 1] = 1;
656
+ }
657
+ this._tracePasses.forEach((pass) => {
658
+ pass.setDefines({
659
+ NUM_LIGHTS: numAnalyticLights,
660
+ HAS_SPHERE_LIGHTS: !!analyticLights.find((light) => light.type === 'SphereLight'),
661
+ HAS_SPOT_LIGHTS: !!analyticLights.find((light) => light.type === 'SpotLight'),
662
+ HAS_RECT_LIGHTS: !!analyticLights.find((light) => light.type === 'RectLight'),
663
+ HAS_DIRECTIONAL_LIGHTS: !!analyticLights.find((light) => light.type === 'DirectionalLight')
664
+ });
665
+ });
666
+ const lightTexturesChanged = this._rectLightTextures.update(analyticLights);
667
+ this._analyticLights = analyticLights;
668
+ const packedIES = packIESProfiles(analyticLights);
669
+ this._iesProfileTexelOffsets = packedIES.offsets;
670
+ this._iesProfileColumns = setDataTexture(this._iesProfileTex, packedIES.data.length ? packedIES.data : new Float32Array(4), 4).columns;
671
+ if (lightTexturesChanged)
672
+ this._needsUpdateMeshData = true;
673
+ this._needsUpdateAnalyticLightsBuffer = true;
674
+ this._setEnvMap(envImage);
675
+ }
676
+ _getViewProjInv(camera, viewProjInv) {
677
+ mat4.invert(viewProjInv, camera.getProjectionMatrix(this._depthAspect));
678
+ mat4.mul(viewProjInv, camera.transform, viewProjInv);
679
+ }
680
+ setCamera(camera) {
681
+ const viewProjectionInv = this._viewProjInv;
682
+ this._apertureRadius = cameraApertureRadius(camera);
683
+ this._focusDistance = camera.focusDistance;
684
+ this._getViewProjInv(camera, viewProjectionInv);
685
+ this._tracePasses.forEach((pass) => {
686
+ pass.setUniform('viewProjectionInv', viewProjectionInv);
687
+ pass.setUniform('viewInv', camera.transform);
688
+ // Zero for orthographic cameras, which have no depth of field.
689
+ pass.setUniform('cameraApertureRadius', this._apertureRadius);
690
+ pass.setUniform('cameraFocusDistance', camera.focusDistance);
691
+ });
692
+ }
693
+ cameraChanged(camera) {
694
+ const tmp = mat4.create();
695
+ this._getViewProjInv(camera, tmp);
696
+ return (!numberArraysEqual(this._viewProjInv, tmp) ||
697
+ cameraApertureRadius(camera) !== this._apertureRadius ||
698
+ camera.focusDistance !== this._focusDistance);
699
+ }
700
+ setSize(width, height, targetAspect = width / height) {
701
+ this._depthAspect = targetAspect;
702
+ this._tracePasses.forEach((pass) => {
703
+ pass.setSize(pass === this._depthPass ? DEPTH_SAMPLE_GRID : width, pass === this._depthPass ? DEPTH_SAMPLE_GRID : height);
704
+ pass.setUniform('pixelSize', [1 / width, 1 / height]);
705
+ });
706
+ }
707
+ setJitter(x, y) {
708
+ this._tracePasses.forEach((pass) => {
709
+ pass.setUniform('jitter', [x, y]);
710
+ });
711
+ }
712
+ releaseTarget(target) { this._mainPass.releaseTarget(target); this._shadowCatcherPass.releaseTarget(target); }
713
+ getTargetMemoryBytes(target) {
714
+ return this._mainPass.getMemoryBytes(target) + this._shadowCatcherPass.getMemoryBytes(target);
715
+ }
716
+ useTarget(target) {
717
+ this._mainPass.useTarget(target);
718
+ this._shadowCatcherPass.useTarget(target);
719
+ }
720
+ setQuality(options) {
721
+ this._tracePasses.forEach(pass => {
722
+ pass.setUniform('bounceLimit', normalizeBounces(options.bounces));
723
+ pass.setUniform('bevelEnabled', options.bevel);
724
+ pass.setUniform('dispersionWavelengths', options.dispersionWavelengths);
725
+ });
726
+ }
727
+ setWavelength(wavelength) {
728
+ this._tracePasses.forEach((pass) => {
729
+ pass.setUniform('wavelength', wavelength);
730
+ });
731
+ }
732
+ setSampleCount(sampleCount) {
733
+ this._tracePasses.forEach((pass) => {
734
+ pass.setUniform('sampleCount', sampleCount);
735
+ });
736
+ }
737
+ isInvalid() {
738
+ return this._invalid;
739
+ }
740
+ hasShadowCatcher() {
741
+ return this._hasShadowCatcher;
742
+ }
743
+ hasDispersion() {
744
+ return this._spectral;
745
+ }
746
+ prepare() {
747
+ if (this._needsUpdateMeshData) {
748
+ this._updateMeshData();
749
+ }
750
+ else if (this._needsUpdateMeshMembership) {
751
+ this._updateMeshMembership();
752
+ }
753
+ if (this._pendingGeometryUpdates.size)
754
+ this._updateGeometryData();
755
+ if (this._needsRefitTLAS)
756
+ this._refitMeshInstances();
757
+ if (this._dirtyColorMeshes.size)
758
+ this._updateMeshColors();
759
+ if (this._pendingMaterialUpdate)
760
+ this._updateMaterialData();
761
+ if (this._needsUpdateAnalyticLightsBuffer) {
762
+ const analyticLights = this._analyticLights;
763
+ analyticLights.length > 0 &&
764
+ packLightsToTexture(this._lightTex, analyticLights, this._materialData.getLightTexturesIndices(), this._analyticLightSelectionPmfs, this._analyticLightSelectionCdfs, this._iesProfileTexelOffsets);
765
+ this._needsUpdateAnalyticLightsBuffer = false;
766
+ }
767
+ this._tracePasses.forEach((pass) => {
768
+ pass.setUniform('backgroundMap', this._hasBackground
769
+ ? this._backgroundTex
770
+ : this._hasEnvMap
771
+ ? this._envMap
772
+ : null);
773
+ pass.setUniform('transmissiveOutputAlphaMin', Math.max(Math.min(1, this._transmissiveAlphaMin), 0));
774
+ pass.setUniform('lightsTex', this._lightTex);
775
+ pass.setUniform('iesProfileData', this._iesProfileTex);
776
+ pass.setUniform('iesProfileColumns', this._iesProfileColumns);
777
+ pass.setUniform('groundedBackgroundParams', this._groundedBackgroundParams);
778
+ pass.setUniform('groundedBackgroundCenter', this._groundedBackgroundCenter);
779
+ pass.setDefines({
780
+ // Double bounce fix on intel mac
781
+ // Limit the bounce to avoid long compilation time.
782
+ BOUNCES: isIntelMac()
783
+ ? Math.min(this._bounces, 3) *
784
+ (this._hasTransmission || this._hasAlpha ? 2 : 1)
785
+ : this._bounces,
786
+ CLAMPING: this._clamping || undefined,
787
+ BEVEL_SAMPLES: this._bevelSamples,
788
+ USE_BACKGROUND: this._hasBackground,
789
+ USE_GROUNDED_BACKGROUND: this._groundedBackgroundParams[3] > 0
790
+ });
791
+ });
792
+ }
793
+ setSamplingPattern(pattern, maxSamples, sequenceSeed = 0) {
794
+ const code = samplingPatternCode(pattern);
795
+ const logSPP = zSobolLog2SPP(code === 1 ? maxSamples - 1 : maxSamples);
796
+ const changed = this._samplingCode !== code || this._sequenceSeed !== (sequenceSeed >>> 0) ||
797
+ (code === 1 && this._zLogSPP !== logSPP);
798
+ this._samplingCode = code;
799
+ this._sequenceSeed = sequenceSeed >>> 0;
800
+ this._zLogSPP = logSPP;
801
+ this._tracePasses.forEach(pass => {
802
+ pass.setUniform('samplingPattern', code);
803
+ pass.setUniform('sequenceSeed', this._sequenceSeed);
804
+ pass.setUniform('zSobolLogSPP', logSPP);
805
+ });
806
+ return changed;
807
+ }
808
+ // WebGL has uniform per-pixel counts; setSampleCount already includes offset.
809
+ setSampleSequenceOffset(_offset) { }
810
+ async readDepthSamples(area, aspect) {
811
+ if (this._depthAbort.signal.aborted || this._invalid || !this._preparedMeshData ||
812
+ !this._renderer.isAllProgramCompiled())
813
+ return;
814
+ this.prepare();
815
+ this._depthPass.setUniform('depthArea', packDepthSampleArea(area, aspect ?? this._depthAspect));
816
+ this._depthPass.createPass({});
817
+ const rgba = await readFloatPixelsAsync(this._renderer.gl, DEPTH_SAMPLE_GRID, DEPTH_SAMPLE_GRID, this._depthAbort.signal);
818
+ return unpackDepthSamples(rgba);
819
+ }
820
+ dispose() {
821
+ this._depthAbort.abort();
822
+ this._materialData?.dispose(this._renderer.gl);
823
+ this._materialData = undefined;
824
+ this._tracePasses.forEach((pass) => pass.dispose());
825
+ const gl = this._renderer.gl;
826
+ [
827
+ this._lightTex,
828
+ this._openPbrEnergyLut,
829
+ this._envMap,
830
+ this._envMapDistribution,
831
+ this._backgroundTex,
832
+ this._positionBufferTex,
833
+ this._normalBufferTex,
834
+ this._colorBufferTex,
835
+ this._tangentBufferTex,
836
+ this._uvBufferTex,
837
+ this._uv1BufferTex,
838
+ this._bvhBufferTex,
839
+ this._instancesBufferTex,
840
+ this._matIndexBufferTex
841
+ ].forEach((texture) => texture.dispose(gl));
842
+ }
843
+ }
844
+ export default WebGLRayTracePass;
845
+ //# sourceMappingURL=WebGLRayTracePass.js.map