@meimu/mutracer 0.1.5 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (590) hide show
  1. package/LICENSES/Classroom-CC0.txt +121 -0
  2. package/README.md +10 -7
  3. package/THIRD_PARTY_NOTICES.md +13 -8
  4. package/dist/assets/bvh.worker.js +1 -1
  5. package/dist/mutracer.umd.js +12316 -9228
  6. package/docs/api.md +232 -21
  7. package/docs/caustics.md +80 -0
  8. package/docs/denoising.md +30 -15
  9. package/docs/materials.md +6 -5
  10. package/docs/performance.md +5 -2
  11. package/docs/progressive-rendering.md +73 -1
  12. package/docs/technical/continuous-spectrum.md +93 -0
  13. package/docs/threejs.md +14 -5
  14. package/docs/updates.md +46 -2
  15. package/docs/viewer-checklist.md +65 -0
  16. package/docs/viewer.md +15 -8
  17. package/lib/Display.d.ts +13 -2
  18. package/lib/Display.js +28 -7
  19. package/lib/Display.js.map +1 -1
  20. package/lib/Engine.d.ts +4 -0
  21. package/lib/Engine.js +99 -37
  22. package/lib/Engine.js.map +1 -1
  23. package/lib/Render.d.ts +98 -15
  24. package/lib/Render.js +275 -27
  25. package/lib/Render.js.map +1 -1
  26. package/lib/RenderLoop.d.ts +11 -1
  27. package/lib/RenderLoop.js +120 -15
  28. package/lib/RenderLoop.js.map +1 -1
  29. package/lib/main.d.ts +6 -3
  30. package/lib/main.js +1 -0
  31. package/lib/main.js.map +1 -1
  32. package/lib/math/access.d.ts +4 -0
  33. package/lib/math/access.js +10 -0
  34. package/lib/math/access.js.map +1 -0
  35. package/lib/math/mat3.d.ts +4 -0
  36. package/lib/math/mat3.js +54 -0
  37. package/lib/math/mat3.js.map +1 -0
  38. package/lib/math/mat4.d.ts +19 -0
  39. package/lib/math/mat4.js +413 -0
  40. package/lib/math/mat4.js.map +1 -0
  41. package/lib/math/storage.d.ts +6 -0
  42. package/lib/math/storage.js +22 -0
  43. package/lib/math/storage.js.map +1 -0
  44. package/lib/math/types.d.ts +3 -0
  45. package/lib/math/types.js +2 -0
  46. package/lib/math/types.js.map +1 -0
  47. package/lib/math/vec2.d.ts +13 -0
  48. package/lib/math/vec2.js +52 -0
  49. package/lib/math/vec2.js.map +1 -0
  50. package/lib/math/vec3.d.ts +23 -0
  51. package/lib/math/vec3.js +139 -0
  52. package/lib/math/vec3.js.map +1 -0
  53. package/lib/math.d.ts +5 -17
  54. package/lib/math.js +5 -55
  55. package/lib/math.js.map +1 -1
  56. package/lib/oidn.d.ts +1 -1
  57. package/lib/oidn.js +4 -2
  58. package/lib/oidn.js.map +1 -1
  59. package/lib/oidnBundledWeights.cdn.d.ts +2 -2
  60. package/lib/renderer/AovPrimitiveCache.d.ts +10 -0
  61. package/lib/renderer/AovPrimitiveCache.js +48 -0
  62. package/lib/renderer/AovPrimitiveCache.js.map +1 -0
  63. package/lib/renderer/Box3.d.ts +5 -0
  64. package/lib/renderer/Box3.js +9 -0
  65. package/lib/renderer/Box3.js.map +1 -0
  66. package/lib/renderer/GPUTraceQueue.d.ts +11 -0
  67. package/lib/renderer/GPUTraceQueue.js +33 -0
  68. package/lib/renderer/GPUTraceQueue.js.map +1 -0
  69. package/lib/renderer/MaterialData.d.ts +15 -0
  70. package/lib/renderer/MaterialData.js +61 -0
  71. package/lib/renderer/MaterialData.js.map +1 -0
  72. package/lib/renderer/MaterialTable.d.ts +11 -98
  73. package/lib/renderer/MaterialTable.js +34 -412
  74. package/lib/renderer/MaterialTable.js.map +1 -1
  75. package/lib/renderer/RenderingPipeline.d.ts +36 -13
  76. package/lib/renderer/RenderingPipeline.js +1 -17
  77. package/lib/renderer/RenderingPipeline.js.map +1 -1
  78. package/lib/renderer/TileRender.d.ts +0 -1
  79. package/lib/renderer/TileRender.js +14 -1
  80. package/lib/renderer/TileRender.js.map +1 -1
  81. package/lib/renderer/WGPUAov.d.ts +39 -0
  82. package/lib/renderer/WGPUAov.js +239 -0
  83. package/lib/renderer/WGPUAov.js.map +1 -0
  84. package/lib/renderer/WGPUBindlessMaterialData.d.ts +17 -0
  85. package/lib/renderer/WGPUBindlessMaterialData.js +48 -0
  86. package/lib/renderer/WGPUBindlessMaterialData.js.map +1 -0
  87. package/lib/renderer/WGPUBindlessTextures.d.ts +47 -0
  88. package/lib/renderer/WGPUBindlessTextures.js +180 -0
  89. package/lib/renderer/WGPUBindlessTextures.js.map +1 -0
  90. package/lib/renderer/WGPUBloomPass.js +17 -97
  91. package/lib/renderer/WGPUBloomPass.js.map +1 -1
  92. package/lib/renderer/WGPUCausticLightPass.d.ts +48 -0
  93. package/lib/renderer/WGPUCausticLightPass.js +217 -0
  94. package/lib/renderer/WGPUCausticLightPass.js.map +1 -0
  95. package/lib/renderer/WGPUComputePass.d.ts +1 -1
  96. package/lib/renderer/WGPUComputePass.js.map +1 -1
  97. package/lib/renderer/WGPUEnvMapDistribution.d.ts +12 -0
  98. package/lib/renderer/WGPUEnvMapDistribution.js +150 -0
  99. package/lib/renderer/WGPUEnvMapDistribution.js.map +1 -0
  100. package/lib/renderer/WGPUFullQuadPass.js +10 -9
  101. package/lib/renderer/WGPUFullQuadPass.js.map +1 -1
  102. package/lib/renderer/WGPUJNLMDenoiser.d.ts +1 -20
  103. package/lib/renderer/WGPUJNLMDenoiser.js +4 -267
  104. package/lib/renderer/WGPUJNLMDenoiser.js.map +1 -1
  105. package/lib/renderer/WGPUPhotonMap.d.ts +37 -0
  106. package/lib/renderer/WGPUPhotonMap.js +191 -0
  107. package/lib/renderer/WGPUPhotonMap.js.map +1 -0
  108. package/lib/renderer/WGPURayTraceOutput.d.ts +13 -1
  109. package/lib/renderer/WGPURayTraceOutput.js +132 -29
  110. package/lib/renderer/WGPURayTraceOutput.js.map +1 -1
  111. package/lib/renderer/WGPURayTracePass.d.ts +83 -56
  112. package/lib/renderer/WGPURayTracePass.js +884 -837
  113. package/lib/renderer/WGPURayTracePass.js.map +1 -1
  114. package/lib/renderer/WGPURenderingPipeline.d.ts +5 -3
  115. package/lib/renderer/WGPURenderingPipeline.js +297 -82
  116. package/lib/renderer/WGPURenderingPipeline.js.map +1 -1
  117. package/lib/renderer/WGPUShaderCache.d.ts +2 -2
  118. package/lib/renderer/WGPUShaderCache.js +10 -5
  119. package/lib/renderer/WGPUShaderCache.js.map +1 -1
  120. package/lib/renderer/WGPUShaderCapabilities.d.ts +10 -0
  121. package/lib/renderer/WGPUShaderCapabilities.js +54 -0
  122. package/lib/renderer/WGPUShaderCapabilities.js.map +1 -0
  123. package/lib/renderer/WGPUSkyBaker.d.ts +13 -0
  124. package/lib/renderer/WGPUSkyBaker.js +85 -0
  125. package/lib/renderer/WGPUSkyBaker.js.map +1 -0
  126. package/lib/renderer/WebGLAov.d.ts +41 -0
  127. package/lib/renderer/WebGLAov.js +106 -0
  128. package/lib/renderer/WebGLAov.js.map +1 -0
  129. package/lib/renderer/WebGLFullQuadPass.d.ts +7 -4
  130. package/lib/renderer/WebGLFullQuadPass.js +22 -2
  131. package/lib/renderer/WebGLFullQuadPass.js.map +1 -1
  132. package/lib/renderer/WebGLJNLMDenoiser.d.ts +1 -1
  133. package/lib/renderer/WebGLJNLMDenoiser.js +83 -74
  134. package/lib/renderer/WebGLJNLMDenoiser.js.map +1 -1
  135. package/lib/renderer/WebGLRayTraceOutputPass.js +7 -4
  136. package/lib/renderer/WebGLRayTraceOutputPass.js.map +1 -1
  137. package/lib/renderer/WebGLRayTracePass.d.ts +18 -3
  138. package/lib/renderer/WebGLRayTracePass.js +121 -9
  139. package/lib/renderer/WebGLRayTracePass.js.map +1 -1
  140. package/lib/renderer/WebGLRenderingPipeline.js +126 -22
  141. package/lib/renderer/WebGLRenderingPipeline.js.map +1 -1
  142. package/lib/renderer/WebGLSkyBaker.d.ts +39 -0
  143. package/lib/renderer/WebGLSkyBaker.js +422 -0
  144. package/lib/renderer/WebGLSkyBaker.js.map +1 -0
  145. package/lib/renderer/WebGLSkySource.d.ts +9 -0
  146. package/lib/renderer/WebGLSkySource.js +28 -0
  147. package/lib/renderer/WebGLSkySource.js.map +1 -0
  148. package/lib/renderer/accumulationTarget.d.ts +6 -0
  149. package/lib/renderer/accumulationTarget.js.map +1 -1
  150. package/lib/renderer/aov.d.ts +42 -0
  151. package/lib/renderer/aov.js +50 -0
  152. package/lib/renderer/aov.js.map +1 -0
  153. package/lib/renderer/aovDisplay.d.ts +14 -0
  154. package/lib/renderer/aovDisplay.js +32 -0
  155. package/lib/renderer/aovDisplay.js.map +1 -0
  156. package/lib/renderer/aovScene.d.ts +21 -0
  157. package/lib/renderer/aovScene.js +139 -0
  158. package/lib/renderer/aovScene.js.map +1 -0
  159. package/lib/renderer/binnedSahBvh.js +2 -1
  160. package/lib/renderer/binnedSahBvh.js.map +1 -1
  161. package/lib/renderer/bvhAccel.d.ts +20 -10
  162. package/lib/renderer/bvhAccel.js +168 -58
  163. package/lib/renderer/bvhAccel.js.map +1 -1
  164. package/lib/renderer/bvhWorkerBuild.d.ts +1 -0
  165. package/lib/renderer/cameraSnapshot.js +2 -1
  166. package/lib/renderer/cameraSnapshot.js.map +1 -1
  167. package/lib/renderer/cameraUniform.d.ts +2 -0
  168. package/lib/renderer/cameraUniform.js +12 -0
  169. package/lib/renderer/cameraUniform.js.map +1 -0
  170. package/lib/renderer/causticDiagnostics.d.ts +31 -0
  171. package/lib/renderer/causticDiagnostics.js +5 -0
  172. package/lib/renderer/causticDiagnostics.js.map +1 -0
  173. package/lib/renderer/causticEmission.d.ts +10 -0
  174. package/lib/renderer/causticEmission.js +40 -0
  175. package/lib/renderer/causticEmission.js.map +1 -0
  176. package/lib/renderer/causticUniform.d.ts +12 -0
  177. package/lib/renderer/causticUniform.js +22 -0
  178. package/lib/renderer/causticUniform.js.map +1 -0
  179. package/lib/renderer/caustics.d.ts +16 -0
  180. package/lib/renderer/caustics.js +93 -0
  181. package/lib/renderer/caustics.js.map +1 -0
  182. package/lib/renderer/committedScene.js +4 -0
  183. package/lib/renderer/committedScene.js.map +1 -1
  184. package/lib/renderer/denoiser.d.ts +3 -11
  185. package/lib/renderer/denoiser.js.map +1 -1
  186. package/lib/renderer/depthQuery.js +4 -1
  187. package/lib/renderer/depthQuery.js.map +1 -1
  188. package/lib/renderer/displacementPreparation.d.ts +11 -0
  189. package/lib/renderer/displacementPreparation.js +351 -0
  190. package/lib/renderer/displacementPreparation.js.map +1 -0
  191. package/lib/renderer/displacementRange.d.ts +1 -0
  192. package/lib/renderer/displacementRange.js +9 -0
  193. package/lib/renderer/displacementRange.js.map +1 -0
  194. package/lib/renderer/displayParityDiagnostics.d.ts +11 -0
  195. package/lib/renderer/displayParityDiagnostics.js +2 -0
  196. package/lib/renderer/displayParityDiagnostics.js.map +1 -0
  197. package/lib/renderer/envMapCreation.d.ts +9 -8
  198. package/lib/renderer/envMapCreation.js +36 -12
  199. package/lib/renderer/envMapCreation.js.map +1 -1
  200. package/lib/renderer/envMapDistribution.d.ts +12 -2
  201. package/lib/renderer/envMapDistribution.js +43 -34
  202. package/lib/renderer/envMapDistribution.js.map +1 -1
  203. package/lib/renderer/geometryBvhBounds.d.ts +4 -0
  204. package/lib/renderer/geometryBvhBounds.js +82 -0
  205. package/lib/renderer/geometryBvhBounds.js.map +1 -0
  206. package/lib/renderer/geometryUpdateState.d.ts +32 -0
  207. package/lib/renderer/geometryUpdateState.js +2 -0
  208. package/lib/renderer/geometryUpdateState.js.map +1 -0
  209. package/lib/renderer/geometryUpdates.d.ts +17 -9
  210. package/lib/renderer/geometryUpdates.js +92 -33
  211. package/lib/renderer/geometryUpdates.js.map +1 -1
  212. package/lib/renderer/glsl/aovDisplay.frag.d.ts +3 -0
  213. package/lib/renderer/glsl/aovDisplay.frag.js +54 -0
  214. package/lib/renderer/glsl/aovDisplay.frag.js.map +1 -0
  215. package/lib/renderer/glsl/aovReflectance.glsl.d.ts +2 -0
  216. package/lib/renderer/glsl/aovReflectance.glsl.js +87 -0
  217. package/lib/renderer/glsl/aovReflectance.glsl.js.map +1 -0
  218. package/lib/renderer/glsl/aovReflectanceSamples.glsl.d.ts +2 -0
  219. package/lib/renderer/glsl/aovReflectanceSamples.glsl.js +135 -0
  220. package/lib/renderer/glsl/aovReflectanceSamples.glsl.js.map +1 -0
  221. package/lib/renderer/glsl/aovTrace.frag.d.ts +2 -0
  222. package/lib/renderer/glsl/aovTrace.frag.js +121 -0
  223. package/lib/renderer/glsl/aovTrace.frag.js.map +1 -0
  224. package/lib/renderer/glsl/chunks/cameraRay.glsl.js +12 -12
  225. package/lib/renderer/glsl/chunks/emissiveLight.glsl.d.ts +2 -0
  226. package/lib/renderer/glsl/chunks/emissiveLight.glsl.js +35 -0
  227. package/lib/renderer/glsl/chunks/emissiveLight.glsl.js.map +1 -0
  228. package/lib/renderer/glsl/chunks/envMap.glsl.js +73 -67
  229. package/lib/renderer/glsl/chunks/envMap.glsl.js.map +1 -1
  230. package/lib/renderer/glsl/chunks/intersect.glsl.js +432 -434
  231. package/lib/renderer/glsl/chunks/intersect.glsl.js.map +1 -1
  232. package/lib/renderer/glsl/chunks/materialBuffer.glsl.d.ts +1 -0
  233. package/lib/renderer/glsl/chunks/materialBuffer.glsl.js +160 -157
  234. package/lib/renderer/glsl/chunks/materialBuffer.glsl.js.map +1 -1
  235. package/lib/renderer/glsl/chunks/openPbrBsdf.glsl.js +802 -802
  236. package/lib/renderer/glsl/chunks/rand.glsl.js +3 -3
  237. package/lib/renderer/glsl/chunks/random.glsl.js +6 -6
  238. package/lib/renderer/glsl/chunks/rayTraceCore.glsl.d.ts +1 -0
  239. package/lib/renderer/glsl/chunks/rayTraceCore.glsl.js +72 -67
  240. package/lib/renderer/glsl/chunks/rayTraceCore.glsl.js.map +1 -1
  241. package/lib/renderer/glsl/chunks/sampleLight.glsl.js +94 -76
  242. package/lib/renderer/glsl/chunks/sampleLight.glsl.js.map +1 -1
  243. package/lib/renderer/glsl/chunks/sampleMaterial.glsl.d.ts +1 -0
  244. package/lib/renderer/glsl/chunks/sampleMaterial.glsl.js +143 -120
  245. package/lib/renderer/glsl/chunks/sampleMaterial.glsl.js.map +1 -1
  246. package/lib/renderer/glsl/chunks/sampleShadowCatcher.glsl.js +21 -18
  247. package/lib/renderer/glsl/chunks/sampleShadowCatcher.glsl.js.map +1 -1
  248. package/lib/renderer/glsl/chunks/sampling.glsl.js +91 -94
  249. package/lib/renderer/glsl/chunks/sampling.glsl.js.map +1 -1
  250. package/lib/renderer/glsl/chunks/sobol.glsl.js +79 -79
  251. package/lib/renderer/glsl/chunks/textureLinear.glsl.js +5 -5
  252. package/lib/renderer/glsl/chunks/uvProjection.glsl.js +12 -12
  253. package/lib/renderer/glsl/chunks/uvProjection.glsl.js.map +1 -1
  254. package/lib/renderer/glsl/depthQuery.frag.js +7 -7
  255. package/lib/renderer/glsl/normalizeRayTraceOutput.frag.js +17 -9
  256. package/lib/renderer/glsl/normalizeRayTraceOutput.frag.js.map +1 -1
  257. package/lib/renderer/glsl/rayTrace.frag.d.ts +1 -1
  258. package/lib/renderer/glsl/rayTrace.frag.js +271 -248
  259. package/lib/renderer/glsl/rayTrace.frag.js.map +1 -1
  260. package/lib/renderer/glsl/shadowCatcher.frag.js +37 -32
  261. package/lib/renderer/glsl/shadowCatcher.frag.js.map +1 -1
  262. package/lib/renderer/glsl/webglPipeline.frag.js +65 -60
  263. package/lib/renderer/glsl/webglPipeline.frag.js.map +1 -1
  264. package/lib/renderer/lightConstants.d.ts +10 -0
  265. package/lib/renderer/lightConstants.js +11 -0
  266. package/lib/renderer/lightConstants.js.map +1 -0
  267. package/lib/renderer/lightCore.d.ts +12 -0
  268. package/lib/renderer/lightCore.js +13 -0
  269. package/lib/renderer/lightCore.js.map +1 -0
  270. package/lib/renderer/lightSampling.d.ts +22 -18
  271. package/lib/renderer/lightSampling.js +135 -62
  272. package/lib/renderer/lightSampling.js.map +1 -1
  273. package/lib/renderer/lightsData.d.ts +21 -0
  274. package/lib/renderer/lightsData.js +192 -0
  275. package/lib/renderer/lightsData.js.map +1 -0
  276. package/lib/renderer/lightsUtil.d.ts +3 -26
  277. package/lib/renderer/lightsUtil.js +3 -153
  278. package/lib/renderer/lightsUtil.js.map +1 -1
  279. package/lib/renderer/materialBufferData.d.ts +70 -0
  280. package/lib/renderer/materialBufferData.js +2 -0
  281. package/lib/renderer/materialBufferData.js.map +1 -0
  282. package/lib/renderer/materialConstants.d.ts +11 -0
  283. package/lib/renderer/materialConstants.js +11 -0
  284. package/lib/renderer/materialConstants.js.map +1 -1
  285. package/lib/renderer/materialCore.d.ts +8 -0
  286. package/lib/renderer/materialCore.js +9 -0
  287. package/lib/renderer/materialCore.js.map +1 -0
  288. package/lib/renderer/materialEmission.d.ts +2 -2
  289. package/lib/renderer/materialEmission.js +3 -3
  290. package/lib/renderer/materialEmission.js.map +1 -1
  291. package/lib/renderer/materialLayout.d.ts +2 -101
  292. package/lib/renderer/materialLayout.js +110 -172
  293. package/lib/renderer/materialLayout.js.map +1 -1
  294. package/lib/renderer/materialLayoutSchema.d.ts +26 -0
  295. package/lib/renderer/materialLayoutSchema.js +172 -0
  296. package/lib/renderer/materialLayoutSchema.js.map +1 -0
  297. package/lib/renderer/materialParams.d.ts +69 -0
  298. package/lib/renderer/materialParams.js +272 -0
  299. package/lib/renderer/materialParams.js.map +1 -0
  300. package/lib/renderer/materialTextureSlots.d.ts +14 -324
  301. package/lib/renderer/materialTextureSlots.js +21 -8
  302. package/lib/renderer/materialTextureSlots.js.map +1 -1
  303. package/lib/renderer/materialTextures.d.ts +6 -0
  304. package/lib/renderer/{texturesFromMaterials.js → materialTextures.js} +1 -2
  305. package/lib/renderer/materialTextures.js.map +1 -0
  306. package/lib/renderer/mergeMeshesToGeometry.js +6 -147
  307. package/lib/renderer/mergeMeshesToGeometry.js.map +1 -1
  308. package/lib/renderer/meshInstances.d.ts +4 -21
  309. package/lib/renderer/meshInstances.js +10 -56
  310. package/lib/renderer/meshInstances.js.map +1 -1
  311. package/lib/renderer/oidnNetwork.d.ts +2 -2
  312. package/lib/renderer/oidnNetwork.js +1 -1
  313. package/lib/renderer/oidnNetwork.js.map +1 -1
  314. package/lib/renderer/openPbrEnergyLut.js +850 -846
  315. package/lib/renderer/openPbrEnergyLut.js.map +1 -1
  316. package/lib/renderer/ownedDenoiser.d.ts +9 -0
  317. package/lib/renderer/ownedDenoiser.js +2 -0
  318. package/lib/renderer/ownedDenoiser.js.map +1 -0
  319. package/lib/renderer/packedMeshInstances.d.ts +23 -0
  320. package/lib/renderer/packedMeshInstances.js +80 -0
  321. package/lib/renderer/packedMeshInstances.js.map +1 -0
  322. package/lib/renderer/prepareMeshBVH.d.ts +12 -47
  323. package/lib/renderer/prepareMeshBVH.js +21 -642
  324. package/lib/renderer/prepareMeshBVH.js.map +1 -1
  325. package/lib/renderer/proceduralEnvironmentPower.d.ts +3 -0
  326. package/lib/renderer/proceduralEnvironmentPower.js +8 -0
  327. package/lib/renderer/proceduralEnvironmentPower.js.map +1 -0
  328. package/lib/renderer/progressiveScheduler.d.ts +1 -0
  329. package/lib/renderer/progressiveScheduler.js +7 -3
  330. package/lib/renderer/progressiveScheduler.js.map +1 -1
  331. package/lib/renderer/renderPipeline.d.ts +4 -1
  332. package/lib/renderer/renderPipeline.js.map +1 -1
  333. package/lib/renderer/renderingLimits.d.ts +9 -0
  334. package/lib/renderer/renderingLimits.js +18 -0
  335. package/lib/renderer/renderingLimits.js.map +1 -0
  336. package/lib/renderer/researchTransport.d.ts +31 -0
  337. package/lib/renderer/researchTransport.js +5 -0
  338. package/lib/renderer/researchTransport.js.map +1 -0
  339. package/lib/renderer/sceneAssembly.d.ts +73 -0
  340. package/lib/renderer/sceneAssembly.js +109 -0
  341. package/lib/renderer/sceneAssembly.js.map +1 -0
  342. package/lib/renderer/sceneChangeCore.d.ts +39 -0
  343. package/lib/renderer/sceneChangeCore.js +307 -0
  344. package/lib/renderer/sceneChangeCore.js.map +1 -0
  345. package/lib/renderer/sceneChangeDetector.d.ts +3 -6
  346. package/lib/renderer/sceneChangeDetector.js +24 -150
  347. package/lib/renderer/sceneChangeDetector.js.map +1 -1
  348. package/lib/renderer/sceneLayoutSchema.d.ts +119 -0
  349. package/lib/renderer/sceneLayoutSchema.js +111 -0
  350. package/lib/renderer/sceneLayoutSchema.js.map +1 -0
  351. package/lib/renderer/sceneLightChanges.d.ts +3 -3
  352. package/lib/renderer/sceneLightChanges.js.map +1 -1
  353. package/lib/renderer/scenePreparation.d.ts +55 -0
  354. package/lib/renderer/scenePreparation.js +360 -0
  355. package/lib/renderer/scenePreparation.js.map +1 -0
  356. package/lib/renderer/scratchSampling.js +18 -18
  357. package/lib/renderer/scratchSampling.js.map +1 -1
  358. package/lib/renderer/shader.d.ts +2 -0
  359. package/lib/renderer/shader.js +2 -0
  360. package/lib/renderer/shader.js.map +1 -1
  361. package/lib/renderer/shaderCapabilities.d.ts +23 -0
  362. package/lib/renderer/shaderCapabilities.js +55 -0
  363. package/lib/renderer/shaderCapabilities.js.map +1 -0
  364. package/lib/renderer/shaderCapacity.d.ts +2 -0
  365. package/lib/renderer/shaderCapacity.js +5 -0
  366. package/lib/renderer/shaderCapacity.js.map +1 -0
  367. package/lib/renderer/skyModel.d.ts +9 -0
  368. package/lib/renderer/skyModel.js +10 -0
  369. package/lib/renderer/skyModel.js.map +1 -0
  370. package/lib/renderer/spectrum.d.ts +21 -0
  371. package/lib/renderer/spectrum.js +154 -0
  372. package/lib/renderer/spectrum.js.map +1 -0
  373. package/lib/renderer/textureAtlas.d.ts +60 -0
  374. package/lib/renderer/textureAtlas.js +145 -0
  375. package/lib/renderer/textureAtlas.js.map +1 -0
  376. package/lib/renderer/textureAtlasPixels.d.ts +7 -0
  377. package/lib/renderer/textureAtlasPixels.js +68 -0
  378. package/lib/renderer/textureAtlasPixels.js.map +1 -0
  379. package/lib/renderer/util.d.ts +1 -1
  380. package/lib/renderer/util.js.map +1 -1
  381. package/lib/renderer/webgl.d.ts +9 -2
  382. package/lib/renderer/webgl.js +54 -9
  383. package/lib/renderer/webgl.js.map +1 -1
  384. package/lib/renderer/webglLightSampling.d.ts +39 -0
  385. package/lib/renderer/webglLightSampling.js +15 -0
  386. package/lib/renderer/webglLightSampling.js.map +1 -0
  387. package/lib/renderer/wgpuBindless.d.ts +26 -0
  388. package/lib/renderer/wgpuBindless.js +95 -0
  389. package/lib/renderer/wgpuBindless.js.map +1 -0
  390. package/lib/renderer/wgpuBindlessSource.d.ts +2 -0
  391. package/lib/renderer/wgpuBindlessSource.js +51 -0
  392. package/lib/renderer/wgpuBindlessSource.js.map +1 -0
  393. package/lib/renderer/wgpuMaterialConstants.d.ts +4 -0
  394. package/lib/renderer/wgpuMaterialConstants.js +52 -0
  395. package/lib/renderer/wgpuMaterialConstants.js.map +1 -0
  396. package/lib/renderer/wgpuSceneUniform.d.ts +42 -0
  397. package/lib/renderer/wgpuSceneUniform.js +125 -0
  398. package/lib/renderer/wgpuSceneUniform.js.map +1 -0
  399. package/lib/renderer/wgpuShaderSource.d.ts +22 -0
  400. package/lib/renderer/wgpuShaderSource.js +33 -0
  401. package/lib/renderer/wgpuShaderSource.js.map +1 -0
  402. package/lib/renderer/wgsl/aovDisplay.wgsl.d.ts +1 -0
  403. package/lib/renderer/wgsl/aovDisplay.wgsl.js +70 -0
  404. package/lib/renderer/wgsl/aovDisplay.wgsl.js.map +1 -0
  405. package/lib/renderer/wgsl/aovReflectance.wgsl.d.ts +2 -0
  406. package/lib/renderer/wgsl/aovReflectance.wgsl.js +98 -0
  407. package/lib/renderer/wgsl/aovReflectance.wgsl.js.map +1 -0
  408. package/lib/renderer/wgsl/aovReflectanceSamples.wgsl.d.ts +2 -0
  409. package/lib/renderer/wgsl/aovReflectanceSamples.wgsl.js +135 -0
  410. package/lib/renderer/wgsl/aovReflectanceSamples.wgsl.js.map +1 -0
  411. package/lib/renderer/wgsl/aovResolve.wgsl.d.ts +5 -0
  412. package/lib/renderer/wgsl/aovResolve.wgsl.js +38 -0
  413. package/lib/renderer/wgsl/aovResolve.wgsl.js.map +1 -0
  414. package/lib/renderer/wgsl/aovSnapshot.wgsl.d.ts +4 -0
  415. package/lib/renderer/wgsl/aovSnapshot.wgsl.js +21 -0
  416. package/lib/renderer/wgsl/aovSnapshot.wgsl.js.map +1 -0
  417. package/lib/renderer/wgsl/aovTrace.wgsl.d.ts +2 -0
  418. package/lib/renderer/wgsl/aovTrace.wgsl.js +115 -0
  419. package/lib/renderer/wgsl/aovTrace.wgsl.js.map +1 -0
  420. package/lib/renderer/wgsl/bloom.wgsl.d.ts +13 -0
  421. package/lib/renderer/wgsl/bloom.wgsl.js +92 -0
  422. package/lib/renderer/wgsl/bloom.wgsl.js.map +1 -0
  423. package/lib/renderer/wgsl/causticLight.compute.d.ts +6 -0
  424. package/lib/renderer/wgsl/causticLight.compute.js +537 -0
  425. package/lib/renderer/wgsl/causticLight.compute.js.map +1 -0
  426. package/lib/renderer/wgsl/chunks/background.wgsl.d.ts +2 -0
  427. package/lib/renderer/wgsl/chunks/background.wgsl.js +102 -0
  428. package/lib/renderer/wgsl/chunks/background.wgsl.js.map +1 -0
  429. package/lib/renderer/wgsl/chunks/causticAdjoint.wgsl.d.ts +2 -0
  430. package/lib/renderer/wgsl/chunks/causticAdjoint.wgsl.js +12 -0
  431. package/lib/renderer/wgsl/chunks/causticAdjoint.wgsl.js.map +1 -0
  432. package/lib/renderer/wgsl/chunks/causticAtomic.wgsl.d.ts +2 -0
  433. package/lib/renderer/wgsl/chunks/causticAtomic.wgsl.js +16 -0
  434. package/lib/renderer/wgsl/chunks/causticAtomic.wgsl.js.map +1 -0
  435. package/lib/renderer/wgsl/chunks/caustics.wgsl.d.ts +1 -0
  436. package/lib/renderer/wgsl/chunks/caustics.wgsl.js +62 -0
  437. package/lib/renderer/wgsl/chunks/caustics.wgsl.js.map +1 -0
  438. package/lib/renderer/wgsl/chunks/common.wgsl.js +4 -4
  439. package/lib/renderer/wgsl/chunks/envMap.wgsl.d.ts +1 -1
  440. package/lib/renderer/wgsl/chunks/envMap.wgsl.js +41 -35
  441. package/lib/renderer/wgsl/chunks/envMap.wgsl.js.map +1 -1
  442. package/lib/renderer/wgsl/chunks/intersect.wgsl.d.ts +13 -1
  443. package/lib/renderer/wgsl/chunks/intersect.wgsl.js +747 -704
  444. package/lib/renderer/wgsl/chunks/intersect.wgsl.js.map +1 -1
  445. package/lib/renderer/wgsl/chunks/intersectionAlpha.wgsl.js +16 -16
  446. package/lib/renderer/wgsl/chunks/intersectionAlpha.wgsl.js.map +1 -1
  447. package/lib/renderer/wgsl/chunks/materialBuffer.wgsl.d.ts +4 -1
  448. package/lib/renderer/wgsl/chunks/materialBuffer.wgsl.js +83 -79
  449. package/lib/renderer/wgsl/chunks/materialBuffer.wgsl.js.map +1 -1
  450. package/lib/renderer/wgsl/chunks/openPbrBsdf.wgsl.js +855 -857
  451. package/lib/renderer/wgsl/chunks/openPbrBsdf.wgsl.js.map +1 -1
  452. package/lib/renderer/wgsl/chunks/pdm_displacement.wgsl.js +137 -137
  453. package/lib/renderer/wgsl/chunks/rand.wgsl.js +3 -3
  454. package/lib/renderer/wgsl/chunks/rayTraceCore.wgsl.d.ts +3 -1
  455. package/lib/renderer/wgsl/chunks/rayTraceCore.wgsl.js +52 -32
  456. package/lib/renderer/wgsl/chunks/rayTraceCore.wgsl.js.map +1 -1
  457. package/lib/renderer/wgsl/chunks/sampleLight.wgsl.d.ts +1 -1
  458. package/lib/renderer/wgsl/chunks/sampleLight.wgsl.js +152 -144
  459. package/lib/renderer/wgsl/chunks/sampleLight.wgsl.js.map +1 -1
  460. package/lib/renderer/wgsl/chunks/sampleMaterial.wgsl.d.ts +1 -1
  461. package/lib/renderer/wgsl/chunks/sampleMaterial.wgsl.js +269 -245
  462. package/lib/renderer/wgsl/chunks/sampleMaterial.wgsl.js.map +1 -1
  463. package/lib/renderer/wgsl/chunks/sampleShadowCatcher.wgsl.d.ts +1 -1
  464. package/lib/renderer/wgsl/chunks/sampleShadowCatcher.wgsl.js +27 -14
  465. package/lib/renderer/wgsl/chunks/sampleShadowCatcher.wgsl.js.map +1 -1
  466. package/lib/renderer/wgsl/chunks/sampling.wgsl.d.ts +1 -1
  467. package/lib/renderer/wgsl/chunks/sampling.wgsl.js +91 -95
  468. package/lib/renderer/wgsl/chunks/sampling.wgsl.js.map +1 -1
  469. package/lib/renderer/wgsl/chunks/shadowCatcherAccumulation.wgsl.d.ts +1 -1
  470. package/lib/renderer/wgsl/chunks/shadowCatcherAccumulation.wgsl.js +1 -0
  471. package/lib/renderer/wgsl/chunks/shadowCatcherAccumulation.wgsl.js.map +1 -1
  472. package/lib/renderer/wgsl/chunks/sobol.wgsl.js +83 -83
  473. package/lib/renderer/wgsl/chunks/uvProjection.wgsl.js +12 -12
  474. package/lib/renderer/wgsl/chunks/uvProjection.wgsl.js.map +1 -1
  475. package/lib/renderer/wgsl/compose.frag.wgsl.d.ts +8 -3
  476. package/lib/renderer/wgsl/compose.frag.wgsl.js +143 -118
  477. package/lib/renderer/wgsl/compose.frag.wgsl.js.map +1 -1
  478. package/lib/renderer/wgsl/customDenoise.wgsl.js +10 -10
  479. package/lib/renderer/wgsl/depthQuery.wgsl.js +7 -7
  480. package/lib/renderer/wgsl/jnlm.compute.d.ts +25 -0
  481. package/lib/renderer/wgsl/jnlm.compute.js +315 -0
  482. package/lib/renderer/wgsl/jnlm.compute.js.map +1 -0
  483. package/lib/renderer/wgsl/offlineAdaptive.compute.js +28 -28
  484. package/lib/renderer/wgsl/oidnAuxiliary.wgsl.d.ts +1 -0
  485. package/lib/renderer/wgsl/oidnAuxiliary.wgsl.js +17 -0
  486. package/lib/renderer/wgsl/oidnAuxiliary.wgsl.js.map +1 -0
  487. package/lib/renderer/wgsl/photonMap.compute.d.ts +29 -0
  488. package/lib/renderer/wgsl/photonMap.compute.js +352 -0
  489. package/lib/renderer/wgsl/photonMap.compute.js.map +1 -0
  490. package/lib/renderer/wgsl/proceduralSky.compute.d.ts +1 -0
  491. package/lib/renderer/wgsl/proceduralSky.compute.js +198 -0
  492. package/lib/renderer/wgsl/proceduralSky.compute.js.map +1 -0
  493. package/lib/renderer/wgsl/rayTrace.compute.d.ts +25 -1
  494. package/lib/renderer/wgsl/rayTrace.compute.js +645 -500
  495. package/lib/renderer/wgsl/rayTrace.compute.js.map +1 -1
  496. package/lib/scene/Camera.js +7 -3
  497. package/lib/scene/Camera.js.map +1 -1
  498. package/lib/scene/EnvironmentLight.d.ts +5 -9
  499. package/lib/scene/EnvironmentLight.js +4 -14
  500. package/lib/scene/EnvironmentLight.js.map +1 -1
  501. package/lib/scene/EnvironmentLightState.d.ts +18 -0
  502. package/lib/scene/EnvironmentLightState.js +19 -0
  503. package/lib/scene/EnvironmentLightState.js.map +1 -0
  504. package/lib/scene/Geometry.d.ts +12 -6
  505. package/lib/scene/Geometry.js +37 -13
  506. package/lib/scene/Geometry.js.map +1 -1
  507. package/lib/scene/InstanceState.d.ts +39 -0
  508. package/lib/scene/InstanceState.js +77 -0
  509. package/lib/scene/InstanceState.js.map +1 -0
  510. package/lib/scene/InstancedMesh.d.ts +1 -1
  511. package/lib/scene/InstancedMesh.js +3 -0
  512. package/lib/scene/InstancedMesh.js.map +1 -1
  513. package/lib/scene/MaterialState.d.ts +209 -0
  514. package/lib/scene/MaterialState.js +231 -0
  515. package/lib/scene/MaterialState.js.map +1 -0
  516. package/lib/scene/Mesh.d.ts +4 -6
  517. package/lib/scene/Mesh.js +3 -11
  518. package/lib/scene/Mesh.js.map +1 -1
  519. package/lib/scene/MeshState.d.ts +20 -0
  520. package/lib/scene/MeshState.js +35 -0
  521. package/lib/scene/MeshState.js.map +1 -0
  522. package/lib/scene/OpenPBRMaterial.d.ts +6 -168
  523. package/lib/scene/OpenPBRMaterial.js +5 -223
  524. package/lib/scene/OpenPBRMaterial.js.map +1 -1
  525. package/lib/scene/PixelTexture.d.ts +6 -0
  526. package/lib/scene/PixelTexture.js +10 -0
  527. package/lib/scene/PixelTexture.js.map +1 -0
  528. package/lib/scene/ProceduralSky.d.ts +24 -0
  529. package/lib/scene/ProceduralSky.js +40 -0
  530. package/lib/scene/ProceduralSky.js.map +1 -0
  531. package/lib/scene/RectLight.d.ts +2 -13
  532. package/lib/scene/RectLight.js +3 -21
  533. package/lib/scene/RectLight.js.map +1 -1
  534. package/lib/scene/RectLightState.d.ts +31 -0
  535. package/lib/scene/RectLightState.js +26 -0
  536. package/lib/scene/RectLightState.js.map +1 -0
  537. package/lib/scene/Scene.d.ts +15 -4
  538. package/lib/scene/Scene.js.map +1 -1
  539. package/lib/scene/SceneNode.js +7 -6
  540. package/lib/scene/SceneNode.js.map +1 -1
  541. package/lib/scene/Texture.d.ts +10 -41
  542. package/lib/scene/Texture.js +4 -33
  543. package/lib/scene/Texture.js.map +1 -1
  544. package/lib/scene/TextureState.d.ts +35 -0
  545. package/lib/scene/TextureState.js +35 -0
  546. package/lib/scene/TextureState.js.map +1 -0
  547. package/lib/scene/attributeData.d.ts +4 -0
  548. package/lib/scene/attributeData.js +10 -0
  549. package/lib/scene/attributeData.js.map +1 -0
  550. package/lib/scene/lightState.d.ts +8 -0
  551. package/lib/scene/lightState.js +2 -0
  552. package/lib/scene/lightState.js.map +1 -0
  553. package/lib/scene/openPbrSchema.d.ts +7 -12
  554. package/lib/scene/openPbrSchema.js +273 -28
  555. package/lib/scene/openPbrSchema.js.map +1 -1
  556. package/lib/scene/skyParameters.d.ts +20 -0
  557. package/lib/scene/skyParameters.js +28 -0
  558. package/lib/scene/skyParameters.js.map +1 -0
  559. package/lib/scene/textureData.d.ts +9 -0
  560. package/lib/scene/textureData.js +2 -0
  561. package/lib/scene/textureData.js.map +1 -0
  562. package/lib/scene/texturePixels.d.ts +6 -0
  563. package/lib/scene/texturePixels.js +10 -0
  564. package/lib/scene/texturePixels.js.map +1 -0
  565. package/lib/settings/display.d.ts +33 -0
  566. package/lib/settings/display.js +7 -0
  567. package/lib/settings/display.js.map +1 -1
  568. package/lib/settings/render.d.ts +36 -3
  569. package/lib/settings/render.js +4 -1
  570. package/lib/settings/render.js.map +1 -1
  571. package/lib/tinybvh/tinybvh.wasm +0 -0
  572. package/lib/util/commonGeometry.js +7 -7
  573. package/lib/util/commonGeometry.js.map +1 -1
  574. package/lib/util/fromTHREE.d.ts +4 -1
  575. package/lib/util/fromTHREE.js +20 -7
  576. package/lib/util/fromTHREE.js.map +1 -1
  577. package/lib/util/geometry.js +42 -29
  578. package/lib/util/geometry.js.map +1 -1
  579. package/lib/util/loadRGBE.js +3 -4
  580. package/lib/util/loadRGBE.js.map +1 -1
  581. package/lib/util/studioLighting.d.ts +18 -0
  582. package/lib/util/studioLighting.js +36 -0
  583. package/lib/util/studioLighting.js.map +1 -0
  584. package/lib/version.d.ts +1 -1
  585. package/lib/version.js +1 -1
  586. package/lib/version.js.map +1 -1
  587. package/llms.txt +5 -0
  588. package/package.json +33 -7
  589. package/lib/renderer/texturesFromMaterials.d.ts +0 -6
  590. package/lib/renderer/texturesFromMaterials.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"prepareMeshBVH.js","sourceRoot":"","sources":["../../src/renderer/prepareMeshBVH.ts"],"names":[],"mappings":"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","sourcesContent":["import InstancedMesh from '../scene/InstancedMesh.js';\nimport { meshInstanceCount, meshInstanceTransform, PackedMeshInstances, type MeshInstances } from './meshInstances.js';\nimport {createCanvas} from '../util/canvas.js';\nimport { packMaterialIndexAndWeightToInt } from './materialIndices.js';\nimport { getGeometryBvh, setGeometryBvh, geometryBvhConfigMatches, type BvhBuildConfig } from './geometryBvh.js';\nimport { writeMaterialIndices } from './materialIndices.js';\nimport { mat4, vec2, vec3 } from '../math.js';\nimport Geometry, { Attribute } from '../scene/Geometry.js';\nimport Mesh from '../scene/Mesh.js';\nimport OpenPBRMaterial from '../scene/OpenPBRMaterial.js';\nimport { buildBLAS, TLASInstance } from './bvhAccel.js';\nimport { colorLuminance } from './lightSampling.js';\nimport Texture, { isTextureDataSource } from '../scene/Texture.js';\nimport { generateVertexTangents, hasGeneratedVertexTangents } from '../util/geometry.js';\n\nfunction computeGeometryBounds(geometry: Geometry) {\n const min = vec3.fromValues(Infinity, Infinity, Infinity);\n const max = vec3.fromValues(-Infinity, -Infinity, -Infinity);\n const positions = geometry.position.array;\n const stride = geometry.position.itemSize;\n for (let offset = 0; offset + 2 < positions.length; offset += stride) {\n const x = positions[offset];\n const y = positions[offset + 1];\n const z = positions[offset + 2];\n if (!Number.isFinite(x) || !Number.isFinite(y) || !Number.isFinite(z)) {\n continue;\n }\n min[0] = Math.min(min[0], x);\n min[1] = Math.min(min[1], y);\n min[2] = Math.min(min[2], z);\n max[0] = Math.max(max[0], x);\n max[1] = Math.max(max[1], y);\n max[2] = Math.max(max[2], z);\n }\n return [min, max] as [vec3.Vec3Array, vec3.Vec3Array];\n}\n\nexport function getBvhBounds(geometry: Geometry) {\n const bvh = getGeometryBvh(geometry)!;\n const floats = new Float32Array(bvh.buffer);\n if (bvh.layout === 'bvh4') {\n return [\n [floats[0], floats[1], floats[2]],\n [\n floats[0] + floats[3],\n floats[1] + floats[4],\n floats[2] + floats[5]\n ]\n ] as [vec3.Vec3Array, vec3.Vec3Array];\n }\n if (bvh.layout === 'bvh-gpu') {\n const words = new Uint32Array(bvh.buffer);\n if (words[11] === 0) {\n return [\n [\n Math.min(floats[0], floats[8]),\n Math.min(floats[1], floats[9]),\n Math.min(floats[2], floats[10])\n ],\n [\n Math.max(floats[4], floats[12]),\n Math.max(floats[5], floats[13]),\n Math.max(floats[6], floats[14])\n ]\n ] as [vec3.Vec3Array, vec3.Vec3Array];\n }\n // A single-leaf BVH_GPU node does not store its own bounds.\n return computeGeometryBounds(geometry);\n }\n if (bvh.layout === 'cwbvh') {\n const words = new Uint32Array(bvh.buffer);\n const header = words[3];\n const signedByte = (value: number) => (value << 24) >> 24;\n const scale = [\n 2 ** signedByte(header),\n 2 ** signedByte(header >> 8),\n 2 ** signedByte(header >> 16)\n ];\n const min: vec3.Vec3Array = [floats[0], floats[1], floats[2]];\n const max: vec3.Vec3Array = [...min];\n for (let slot = 0; slot < 8; slot++) {\n const meta = (words[6 + (slot >> 2)] >> ((slot & 3) * 8)) & 0xff;\n if (!meta) continue;\n const shift = (slot & 3) * 8;\n const half = slot >> 2;\n max[0] = Math.max(max[0], min[0] + ((words[14 + half] >> shift) & 0xff) * scale[0]);\n max[1] = Math.max(max[1], min[1] + ((words[16 + half] >> shift) & 0xff) * scale[1]);\n max[2] = Math.max(max[2], min[2] + ((words[18 + half] >> shift) & 0xff) * scale[2]);\n }\n return [min, max] as [vec3.Vec3Array, vec3.Vec3Array];\n }\n return [\n [floats[0], floats[1], floats[2]],\n [floats[4], floats[5], floats[6]]\n ] as [vec3.Vec3Array, vec3.Vec3Array];\n}\n\nexport function computeBounds(\n _geometry: Geometry,\n m: mat4.Mat4Array,\n bvhBounds: [vec3.Vec3Array, vec3.Vec3Array],\n result = {min: vec3.create(), max: vec3.create()},\n p = vec3.create()\n) {\n const {min, max} = result;\n vec3.set(min, Infinity, Infinity, Infinity);\n vec3.set(max, -Infinity, -Infinity, -Infinity);\n // Transforming the eight BLAS AABB corners is exact for an affine transform\n // and independent of mesh vertex count. The previous rotated path scanned\n // every vertex on every instance update.\n for (let corner = 0; corner < 8; corner++) {\n vec3.set(\n p,\n bvhBounds[(corner >> 0) & 1][0],\n bvhBounds[(corner >> 1) & 1][1],\n bvhBounds[(corner >> 2) & 1][2]\n );\n vec3.transformMat4(p, p, m);\n if (!p.every(isFinite)) continue;\n vec3.min(min, min, p);\n vec3.max(max, max, p);\n }\n\n return result;\n}\n\nexport interface PreparedMeshInstanceBinding {\n mesh: Mesh;\n geometry: Geometry;\n blasIndex: number;\n materialIndices: number[];\n displacementScale: number;\n bvhBounds: [vec3.Vec3Array, vec3.Vec3Array];\n}\n\nexport function updateMeshInstanceTransforms(\n bindings: PreparedMeshInstanceBinding[],\n current?: MeshInstances,\n dirtyIndices?: ReadonlySet<number>\n) {\n if (bindings.some(binding => binding.mesh instanceof InstancedMesh)) {\n const packed = new PackedMeshInstances(bindings.reduce((count, binding) => count + meshInstanceCount(binding.mesh), 0));\n const matrix = Array(16).fill(0) as mat4.Mat4Array;\n const boundsScratch = {min: vec3.create(), max: vec3.create()}, pointScratch = vec3.create();\n let sourceIndex = 0;\n for (const binding of bindings) {\n const {mesh, geometry, bvhBounds, blasIndex, materialIndices, displacementScale} = binding;\n for (let i = 0; i < meshInstanceCount(mesh); i++, sourceIndex++) {\n meshInstanceTransform(mesh, i, matrix);\n const bounds = computeBounds(geometry, matrix, bvhBounds, boundsScratch, pointScratch);\n if (!bounds.min.every(Number.isFinite) || !bounds.max.every(Number.isFinite) || !matrix.every(Number.isFinite)) continue;\n const index = packed.length++;\n packed.sourceIndices[index] = sourceIndex;\n packed.transforms.set(matrix, index * 16);\n packed.bounds.set(bounds.min, index * 6); packed.bounds.set(bounds.max, index * 6 + 3);\n packed.blasIndices[index] = blasIndex; packed.materials[index] = packMaterialIndexAndWeightToInt(materialIndices[0], 1);\n packed.displacement[index] = displacementScale;\n const colors = mesh instanceof InstancedMesh ? mesh.colors : undefined;\n for (let k = 0; k < 3; k++) packed.colors[index * 3 + k] = colors?.[i * 3 + k] ?? 1;\n }\n }\n return packed;\n }\n const update = (\n {\n mesh,\n geometry,\n blasIndex,\n materialIndices,\n displacementScale,\n bvhBounds\n }: PreparedMeshInstanceBinding\n ) =>\n ({\n bounds: computeBounds(geometry, mesh.transform, bvhBounds),\n blasIndex,\n transform: mesh.transform,\n materialsIndices: materialIndices.map((idx) =>\n packMaterialIndexAndWeightToInt(idx, 1)\n ),\n displacementScale\n }) satisfies TLASInstance;\n if (!current || !dirtyIndices) return bindings.map(update);\n const next = (current as TLASInstance[]).slice();\n dirtyIndices.forEach((index) => {\n const binding = bindings[index];\n if (binding) next[index] = update(binding);\n });\n return next;\n}\n\n/** Returns the first material used for CPU displacement. */\nexport function getMeshDisplacementMaterial(mesh: Mesh) {\n return mesh.materials[0];\n}\n\nexport function getMeshDisplacementMap(mesh: Mesh) {\n // Not support multiple materials for displacement.\n const material = getMeshDisplacementMaterial(mesh);\n return material.displacementMap;\n}\n\nexport function getMeshDisplacementScale(mesh: Mesh) {\n return mesh.materials[0].displacementScale;\n}\n\nconst preparedGeometryCache = new WeakMap<Geometry, Map<string, Geometry>>();\nlet displacementTextureId = 1;\nconst displacementTextureIds = new WeakMap<object, number>();\n\nfunction getDisplacementResourceId(identity: object) {\n let id = displacementTextureIds.get(identity);\n if (id == null) {\n id = displacementTextureId++;\n displacementTextureIds.set(identity, id);\n }\n return id;\n}\n\nexport function getDisplacementTextureDataCacheKey(texture: Texture) {\n const image = texture.image;\n return [\n getDisplacementResourceId(texture.source ?? texture),\n getDisplacementResourceId(image),\n texture.version,\n image.width,\n image.height\n ].join('|');\n}\n\nconst detailedProjectiveRangeTriangleLimit = 100_000;\nconst displacementMinmaxCache = new Map<string, Uint8Array[]>();\n\nexport function getPreparedMeshGeometryCacheKey(mesh: Mesh) {\n const source = mesh.geometry;\n const material = getMeshDisplacementMaterial(mesh);\n const texture = material?.displacementMap;\n if (!material) return undefined;\n // UV and procedural displacement both need height-aware BLAS bounds and\n // packed triangle ranges. Never reuse the source's undisplaced tree, or a\n // different material's height field, when a texture/scale changes.\n const scale = getMeshDisplacementScale(mesh);\n if (texture && (scale !== 0 || material.displacementBias !== 0)) {\n return ['displacement', source.version, getDisplacementTextureDataCacheKey(texture),\n +texture.flipY, texture.uvScale.join(','), texture.uvOffset.join(','), texture.uvChannel, texture.wrapS, texture.wrapT, texture.colorSpace,\n scale, material.displacementBias, material.displacementUvProjectionScale, material.displacementUvProjection].join('|');\n }\n return undefined;\n}\n\nexport function getCachedPreparedMeshGeometry(mesh: Mesh) {\n const key = getPreparedMeshGeometryCacheKey(mesh);\n if (key == null) return mesh.geometry;\n const cached = preparedGeometryCache.get(mesh.geometry)?.get(key);\n if (!cached) {\n const geometry = new Geometry(mesh.geometry);\n geometry.dynamic = mesh.geometry.dynamic;\n geometry.version = mesh.geometry.version;\n return cachePreparedMeshGeometry(mesh, geometry);\n }\n return cached;\n}\n\nexport function cachePreparedMeshGeometry(mesh: Mesh, generated: Geometry) {\n const key = getPreparedMeshGeometryCacheKey(mesh);\n if (key == null) return mesh.geometry;\n let entries = preparedGeometryCache.get(mesh.geometry);\n if (!entries) {\n entries = new Map();\n preparedGeometryCache.set(mesh.geometry, entries);\n }\n if (entries.size >= 4 && !entries.has(key)) entries.clear();\n entries.set(key, generated);\n return generated;\n}\n\n/** Returns cached prepared geometry, or the source while asynchronous preparation is pending. */\nexport function getPreparedMeshGeometry(mesh: Mesh) {\n return getCachedPreparedMeshGeometry(mesh) ?? mesh.geometry;\n}\n\nexport function computeMinmaxCPU(\n _geometry: Geometry,\n heightImage: Texture['image']\n) {\n const w = heightImage.width;\n const minmaxData: Uint8Array[] = [];\n const maxMipLevel = Math.log2(w);\n let heightPixels: ArrayLike<number>;\n let sourceChannels: number;\n let normalizeHeight: (value: number) => number;\n if (isTextureDataSource(heightImage)) {\n heightPixels = heightImage.data;\n sourceChannels = Math.max(\n 1,\n Math.floor(heightImage.data.length / (heightImage.width * heightImage.height))\n );\n const normalized =\n heightImage.data instanceof Uint8Array ||\n heightImage.data instanceof Uint8ClampedArray;\n normalizeHeight = normalized\n ? (value) => value\n : (value) => Math.round(Math.min(Math.max(value, 0), 1) * 255);\n } else {\n const canvas = createCanvas();\n const ctx = canvas.getContext('2d') as CanvasRenderingContext2D | OffscreenCanvasRenderingContext2D | null;\n if (!ctx) throw new Error('The displacement texture is not CPU-readable.');\n canvas.width = w;\n canvas.height = w;\n ctx.drawImage(heightImage, 0, 0, w, w);\n heightPixels = ctx.getImageData(0, 0, w, w).data;\n sourceChannels = 4;\n normalizeHeight = (value) => value;\n }\n let mipmapSize = w;\n for (let lod = 0; lod <= maxMipLevel; lod++) {\n const prevMinmaxData = minmaxData[Math.max(0, lod - 1)];\n const minmax = new Uint8Array(mipmapSize * mipmapSize * 2);\n minmaxData.push(minmax);\n const channels = lod === 0 ? sourceChannels : 2;\n for (let y = 0; y < mipmapSize; y++) {\n for (let x = 0; x < mipmapSize; x++) {\n const yx = y * mipmapSize + x;\n const idx = yx * channels;\n let min = 0;\n let max = 0;\n if (lod == 0) {\n min = normalizeHeight(heightPixels[idx]);\n max = min;\n if (y < mipmapSize - 1 && x < mipmapSize - 1) {\n const h = normalizeHeight(\n heightPixels[idx + (mipmapSize + 1) * channels]\n );\n min = Math.min(min, h);\n max = Math.max(max, h);\n }\n if (y < mipmapSize - 1) {\n const h = normalizeHeight(heightPixels[idx + mipmapSize * channels]);\n min = Math.min(min, h);\n max = Math.max(max, h);\n }\n if (x < mipmapSize - 1) {\n const h = normalizeHeight(heightPixels[idx + channels]);\n min = Math.min(min, h);\n max = Math.max(max, h);\n }\n } else {\n const x2 = x * 2;\n const y2 = y * 2;\n const prevMipmapSize = mipmapSize * 2;\n const idx2 = (y2 * prevMipmapSize + x2) * channels;\n const idx2_0 = idx2;\n const idx2_1 = idx2 + channels;\n const idx2_2 = idx2 + prevMipmapSize * channels;\n const idx2_3 = idx2 + prevMipmapSize * channels + channels;\n min = Math.min(\n prevMinmaxData[idx2_0],\n prevMinmaxData[idx2_1],\n prevMinmaxData[idx2_2],\n prevMinmaxData[idx2_3]\n );\n max = Math.max(\n prevMinmaxData[idx2_0 + 1],\n prevMinmaxData[idx2_1 + 1],\n prevMinmaxData[idx2_2 + 1],\n prevMinmaxData[idx2_3 + 1]\n );\n }\n minmax[yx * 2] = min;\n minmax[yx * 2 + 1] = max;\n }\n }\n mipmapSize = mipmapSize / 2;\n }\n\n return minmaxData;\n}\n\nfunction sphericalProjection(n: vec3.Vec3Array, uv: vec2.Vec2Array) {\n const theta = Math.atan2(n[0], n[2]) / (2.0 * Math.PI) + 0.5;\n const phi = Math.acos(n[1]) / Math.PI;\n vec2.set(uv, theta, 1.0 - phi);\n}\n\nexport function sphericalProjectionTriangle(\n na: vec3.Vec3Array,\n nb: vec3.Vec3Array,\n nc: vec3.Vec3Array,\n uvA: vec2.Vec2Array,\n uvB: vec2.Vec2Array,\n uvC: vec2.Vec2Array\n) {\n sphericalProjection(na, uvA);\n sphericalProjection(nb, uvB);\n sphericalProjection(nc, uvC);\n let onSeam = false;\n for (let i = 0; i < 2; i++) {\n if (\n Math.abs(uvA[i] - uvB[i]) > 0.5 ||\n Math.abs(uvA[i] - uvC[i]) > 0.5 ||\n Math.abs(uvB[i] - uvC[i]) > 0.5\n ) {\n const maxU = Math.max(uvA[i], uvB[i], uvC[i]);\n if (maxU - uvA[i] > 0.5) {\n uvA[i] += 1.0;\n onSeam = true;\n }\n if (maxU - uvB[i] > 0.5) {\n uvB[i] += 1.0;\n onSeam = true;\n }\n if (maxU - uvC[i] > 0.5) {\n uvC[i] += 1.0;\n onSeam = true;\n }\n }\n }\n\n return onSeam;\n}\n\nfunction getMaxAxisIndex(n: vec3.Vec3Array) {\n const x = Math.abs(n[0]);\n const y = Math.abs(n[1]);\n const z = Math.abs(n[2]);\n return x > y && x > z ? 0 : y > z ? 1 : 2;\n}\n\nexport function triplanarProjectionTriangle(\n a: vec3.Vec3Array,\n b: vec3.Vec3Array,\n c: vec3.Vec3Array,\n na: vec3.Vec3Array,\n nb: vec3.Vec3Array,\n nc: vec3.Vec3Array,\n uvA: vec2.Vec2Array,\n uvB: vec2.Vec2Array,\n uvC: vec2.Vec2Array\n) {\n const tmpMaxX = Math.max(Math.abs(na[0]), Math.abs(nb[0]), Math.abs(nc[0]));\n const tmpMaxY = Math.max(Math.abs(na[1]), Math.abs(nb[1]), Math.abs(nc[1]));\n const tmpMaxZ = Math.max(Math.abs(na[2]), Math.abs(nb[2]), Math.abs(nc[2]));\n\n if (tmpMaxX > tmpMaxY && tmpMaxX > tmpMaxZ) {\n // yz\n vec2.set(uvA, a[1], a[2]);\n vec2.set(uvB, b[1], b[2]);\n vec2.set(uvC, c[1], c[2]);\n } else if (tmpMaxY > tmpMaxX && tmpMaxY > tmpMaxZ) {\n // xz\n vec2.set(uvA, a[0], a[2]);\n vec2.set(uvB, b[0], b[2]);\n vec2.set(uvC, c[0], c[2]);\n } else {\n // xy\n vec2.set(uvA, a[0], a[1]);\n vec2.set(uvB, b[0], b[1]);\n vec2.set(uvC, c[0], c[1]);\n }\n}\n\nfunction findRoots(\n triAabbMinP: vec2.Vec2Array,\n triAabbMaxP: vec2.Vec2Array,\n maxDepth: number,\n roots: vec3.Vec3Array[]\n) {\n let d = vec2.sub(vec2.create(), triAabbMaxP, triAabbMinP);\n let size = Math.max(d[0], d[1]);\n let startMipLevel =\n maxDepth - Math.floor(Math.log2(Math.floor(1.0 / size))) - 1;\n if (!isFinite(startMipLevel)) {\n startMipLevel = maxDepth;\n }\n startMipLevel = Math.max(startMipLevel, 0);\n let rootCount = 0;\n while (true) {\n const mipSize = Math.pow(2.0, maxDepth - startMipLevel);\n const minTexelX = Math.floor(mipSize * triAabbMinP[0]);\n const minTexelY = Math.floor(mipSize * triAabbMinP[1]);\n const maxTexelX = Math.floor(mipSize * triAabbMaxP[0]);\n const maxTexelY = Math.floor(mipSize * triAabbMaxP[1]);\n\n if (\n (maxTexelX - minTexelX < 2 &&\n maxTexelY - minTexelY < 2 &&\n startMipLevel >= 0) ||\n startMipLevel >= maxDepth\n ) {\n for (let y = minTexelY; y <= maxTexelY; y++) {\n for (let x = minTexelX; x <= maxTexelX; x++) {\n if (rootCount < roots.length) {\n vec3.set(\n roots[rootCount],\n Math.floor(x),\n Math.floor(y),\n startMipLevel\n );\n rootCount++;\n }\n }\n }\n break;\n }\n\n startMipLevel++;\n }\n\n return rootCount;\n}\n\nexport function getTrianglesDisplacementRange(\n geometry: Geometry,\n heightTexture: Texture | undefined,\n material: OpenPBRMaterial\n) {\n const indices = geometry.indices.array;\n const uvs = geometry.uv?.array;\n const uvProjection = material.displacementUvProjection;\n if (!heightTexture) return;\n if (!uvs && uvProjection === 'none') {\n throw new Error(\n 'UV displacement requires texture coordinates; use triplanar, spherical, or cylindrical projection for a UV-less mesh.'\n );\n }\n const heightImage = heightTexture.image;\n const isFlipY = heightTexture.flipY;\n if (!heightImage.width || !heightImage.height) {\n return;\n }\n const triangleCount = indices.length / 3;\n if (triangleCount >= detailedProjectiveRangeTriangleLimit) {\n // A conservative full-height prism is much cheaper to prepare for dense\n // source meshes and remains intersection-safe. Per-triangle UV min/max is\n // retained for smaller meshes where tighter BVH nodes matter more.\n const conservative = new Float32Array(triangleCount * 2);\n for (let triangle = 0; triangle < triangleCount; triangle++) {\n conservative[triangle * 2 + 1] = 1;\n }\n return conservative;\n }\n const minmaxCacheKey =\n getDisplacementTextureDataCacheKey(heightTexture);\n let minmaxData = displacementMinmaxCache.get(minmaxCacheKey);\n if (!minmaxData) {\n minmaxData = computeMinmaxCPU(geometry, heightImage);\n if (displacementMinmaxCache.size >= 4) {\n displacementMinmaxCache.delete(\n displacementMinmaxCache.keys().next().value!\n );\n }\n displacementMinmaxCache.set(minmaxCacheKey, minmaxData);\n }\n\n const maxDepth = Math.log2(heightImage.width);\n const trianglesDisplacementRange = new Float32Array((indices.length / 3) * 2);\n const normal = geometry.normal!.array;\n const position = geometry.position!.array;\n\n const uv1 = vec2.create();\n const uv2 = vec2.create();\n const uv3 = vec2.create();\n\n const p1 = vec3.create();\n const p2 = vec3.create();\n const p3 = vec3.create();\n\n const n1 = vec3.create();\n const n2 = vec3.create();\n const n3 = vec3.create();\n\n const isTriplanar = uvProjection === 'triplanar';\n const isSpherical = uvProjection === 'spherical';\n const isCylindrical = uvProjection === 'cylindrical';\n const uvScale = material.displacementUvProjectionScale;\n\n const minUv = vec2.create();\n const maxUv = vec2.create();\n\n const roots: vec3.Vec3Array[] = [];\n for (let i = 0; i < 100; i++) {\n roots.push([0, 0, 0]);\n }\n for (let i = 0; i < indices.length; i += 3) {\n const i1 = indices[i];\n const i2 = indices[i + 1];\n const i3 = indices[i + 2];\n const i1_2 = i1 * 2;\n const i2_2 = i2 * 2;\n const i3_2 = i3 * 2;\n const i1_3 = i1 * 3;\n const i2_3 = i2 * 3;\n const i3_3 = i3 * 3;\n\n if (uvs) {\n vec2.set(uv1, uvs[i1_2], uvs[i1_2 + 1]);\n vec2.set(uv2, uvs[i2_2], uvs[i2_2 + 1]);\n vec2.set(uv3, uvs[i3_2], uvs[i3_2 + 1]);\n } else {\n vec2.set(uv1, 0, 0);\n vec2.set(uv2, 0, 0);\n vec2.set(uv3, 0, 0);\n }\n\n let onSeam = false;\n if (isTriplanar || isSpherical || isCylindrical) {\n vec3.set(n1, normal[i1_3], normal[i1_3 + 1], normal[i1_3 + 2]);\n vec3.set(n2, normal[i2_3], normal[i2_3 + 1], normal[i2_3 + 2]);\n vec3.set(n3, normal[i3_3], normal[i3_3 + 1], normal[i3_3 + 2]);\n vec3.normalize(n1, n1);\n vec3.normalize(n2, n2);\n vec3.normalize(n3, n3);\n if (isTriplanar || isSpherical || isCylindrical) {\n vec3.set(p1, position[i1_3], position[i1_3 + 1], position[i1_3 + 2]);\n vec3.set(p2, position[i2_3], position[i2_3 + 1], position[i2_3 + 2]);\n vec3.set(p3, position[i3_3], position[i3_3 + 1], position[i3_3 + 2]);\n }\n if (isTriplanar) {\n // Is on the seam. Needs full prism to avoid empty seams.\n const xMaxIndex = getMaxAxisIndex(n1);\n const yMaxIndex = getMaxAxisIndex(n2);\n const zMaxIndex = getMaxAxisIndex(n3);\n if (!(xMaxIndex === yMaxIndex && yMaxIndex === zMaxIndex)) {\n onSeam = true;\n }\n /* prettier-ignore */\n triplanarProjectionTriangle(\n p1, p2, p3,\n n1, n2, n3,\n uv1, uv2, uv3\n );\n } else if (isSpherical) {\n vec3.normalize(p1, p1);\n vec3.normalize(p2, p2);\n vec3.normalize(p3, p3);\n onSeam = sphericalProjectionTriangle(p1, p2, p3, uv1, uv2, uv3);\n } else {\n const u1 = Math.atan2(p1[2], p1[0]) / (Math.PI * 2) + 0.5;\n const u2 = Math.atan2(p2[2], p2[0]) / (Math.PI * 2) + 0.5;\n const u3 = Math.atan2(p3[2], p3[0]) / (Math.PI * 2) + 0.5;\n vec2.set(uv1, u1, p1[1]);\n vec2.set(uv2, u2, p2[1]);\n vec2.set(uv3, u3, p3[1]);\n onSeam = Math.max(u1, u2, u3) - Math.min(u1, u2, u3) > 0.5;\n }\n }\n vec2.scale(uv1, uv1, uvScale);\n vec2.scale(uv2, uv2, uvScale);\n vec2.scale(uv3, uv3, uvScale);\n\n // TODO PDM don't have zero area triangle issue.\n\n let minHeight = Infinity;\n let maxHeight = -Infinity;\n\n if (onSeam) {\n minHeight = 0.0;\n maxHeight = 255.0;\n } else {\n vec2.copy(maxUv, uv1);\n vec2.copy(minUv, uv1);\n vec2.min(minUv, minUv, uv2);\n vec2.min(minUv, minUv, uv3);\n vec2.max(maxUv, maxUv, uv2);\n vec2.max(maxUv, maxUv, uv3);\n\n const rootCount = findRoots(minUv, maxUv, maxDepth, roots);\n\n for (let k = 0; k < rootCount; k++) {\n const mipLevel = roots[k][2];\n const mipSize = Math.pow(2, maxDepth - mipLevel);\n const minmax = minmaxData[mipLevel];\n const x = ((roots[k][0] % mipSize) + mipSize) % mipSize;\n let y = ((roots[k][1] % mipSize) + mipSize) % mipSize;\n if (isFlipY) {\n y = mipSize - y - 1;\n }\n const idx = (y * mipSize + x) * 2;\n\n minHeight = Math.min(minHeight, minmax[idx]);\n maxHeight = Math.max(maxHeight, minmax[idx + 1]);\n }\n }\n\n // TODO this will cause flat surface optimization fail.\n // But not adding bias will leads to small gap between flat surface and displaced surface.\n trianglesDisplacementRange[(i / 3) * 2] = Math.max(\n (Math.floor(minHeight) - 4) / 255,\n 0\n );\n trianglesDisplacementRange[(i / 3) * 2 + 1] = Math.min(\n (Math.ceil(maxHeight) + 4) / 255,\n 1\n );\n }\n\n return trianglesDisplacementRange;\n}\n\nconst warnedDirectionGeometry = new WeakSet<Geometry>();\n\n/** Prepare auto-generated source attributes before the renderer captures array identities. */\nexport function ensureMeshGeometryAttributes(meshes: readonly Mesh[]) {\n for (const { geometry, materials } of meshes) {\n if (!geometry.tangent && !warnedDirectionGeometry.has(geometry) && materials.some(m => m.anisotropyMap || m.specularAnisotropyRotation !== 0 || m.coatAnisotropyRotation !== 0 || (m.specularAnisotropyModel === 'gltf' && m.specularAnisotropy > 0))) {\n console.warn('MuTracer: anisotropy direction has no vertex tangent; deriving a frame from the selected UV set with a stable fallback for degenerate UVs.');\n warnedDirectionGeometry.add(geometry);\n }\n if (!geometry.position?.array.length) continue;\n if (!geometry.normal) computeGeometryNormals(geometry);\n if (!geometry.tangent && geometry.uv) generateVertexTangents(geometry);\n }\n}\n\nfunction getMeshBlasGeometry(mesh: Mesh, displacement = true) {\n const geometry = displacement ? getPreparedMeshGeometry(mesh) : mesh.geometry;\n if (!geometry.normal) computeGeometryNormals(geometry);\n if (!geometry.tangent && geometry.uv) generateVertexTangents(geometry);\n return geometry;\n}\n\n/** Geometry and displacement inputs shared by synchronous and Worker BLAS builds. */\nexport function getMeshBlasInput(mesh: Mesh) {\n const geometry = getMeshBlasGeometry(mesh);\n const heightMap = getMeshDisplacementMap(mesh);\n const displacementScale = heightMap ? getMeshDisplacementScale(mesh) : 0;\n const trianglesDisplacement = displacementScale !== 0\n ? getTrianglesDisplacementRange(geometry, heightMap, getMeshDisplacementMaterial(mesh))\n : undefined;\n // Build bounds around a normal-offset base while retaining original vertex\n // attributes for texture coordinates and shading. This same input works for\n // built-in, TinyBVH and Worker builds; the shader offsets its base identically.\n const bias = heightMap ? getMeshDisplacementMaterial(mesh).displacementBias : 0;\n if (bias !== 0) {\n const positions = geometry.position.array.slice();\n const normals = geometry.normal.array;\n for (let vertex = 0; vertex < geometry.vertexCount; vertex++) {\n const p = vertex * geometry.position.itemSize, n = vertex * geometry.normal.itemSize;\n const length = Math.hypot(normals[n], normals[n + 1], normals[n + 2]);\n if (length > 0) {\n for (let axis = 0; axis < 3; axis++) positions[p + axis] += normals[n + axis] / length * bias;\n }\n }\n return { geometry: new Geometry({ ...geometry, position: new Attribute(positions, geometry.position.itemSize) }),\n displacementScale, trianglesDisplacement };\n }\n return { geometry, displacementScale, trianglesDisplacement };\n}\n\n/** Whether a static mesh still needs a BLAS before it can be rendered. */\nexport function meshNeedsStaticBvh(mesh: Mesh, config?: BvhBuildConfig) {\n return !!mesh.geometry.position?.array.length && !mesh.geometry.dynamic &&\n (!getGeometryBvh(getPreparedMeshGeometry(mesh)) || !!config && !geometryBvhConfigMatches(getPreparedMeshGeometry(mesh), config));\n}\n\n/** Capture inputs whose changes invalidate an asynchronous BLAS result. */\nexport function captureMeshBlasSnapshot(mesh: Mesh, target: Geometry) {\n const displacementMap = getMeshDisplacementMap(mesh);\n return {\n geometry: mesh.geometry,\n version: mesh.geometry.version,\n cacheKey: getPreparedMeshGeometryCacheKey(mesh),\n bvh: getGeometryBvh(target),\n displacementMap,\n displacementScale: getMeshDisplacementScale(mesh),\n displacementTextureKey: displacementMap\n ? getDisplacementTextureDataCacheKey(displacementMap) : undefined\n };\n}\n\n/** Check that a result still belongs to the captured mesh inputs. */\nexport function meshBlasSnapshotIsCurrent(\n mesh: Mesh, target: Geometry, snapshot: ReturnType<typeof captureMeshBlasSnapshot>\n) {\n return mesh.geometry === snapshot.geometry && mesh.geometry.version === snapshot.version &&\n getPreparedMeshGeometryCacheKey(mesh) === snapshot.cacheKey && getGeometryBvh(target) === snapshot.bvh &&\n getMeshDisplacementMap(mesh) === snapshot.displacementMap &&\n getMeshDisplacementScale(mesh) === snapshot.displacementScale &&\n (!snapshot.displacementMap || getDisplacementTextureDataCacheKey(snapshot.displacementMap) ===\n snapshot.displacementTextureKey);\n}\n\nfunction prepareMeshGeometryBvh(mesh: Mesh, displacement = true) {\n const geometry = getMeshBlasGeometry(mesh, displacement);\n const displacementScale = displacement && getMeshDisplacementMap(mesh) ? getMeshDisplacementScale(mesh) : 0;\n if (geometry.dynamic && getGeometryBvh(geometry)?.builder !== 'builtin') setGeometryBvh(geometry, undefined);\n if (!getGeometryBvh(geometry)) {\n const input = displacement ? getMeshBlasInput(mesh) : { geometry, displacementScale, trianglesDisplacement: undefined };\n setGeometryBvh(geometry, buildBLAS(input.geometry, input.displacementScale, input.trianglesDisplacement));\n }\n return { geometry, displacementScale };\n}\n\nexport function updateMeshInstances(meshes: Mesh[], options: { displacement?: boolean } = {}) {\n const materialIndexMap = new Map<OpenPBRMaterial, number>();\n const geometryIndexMap = new Map<Geometry, number>();\n const geometries: Geometry[] = [];\n const materials: OpenPBRMaterial[] = [];\n const globalMaterialIndicesMap: number[][] = [];\n const emissiveBindings: {\n mesh: Mesh;\n geometry: Geometry;\n materialIndices: number[];\n }[] = [];\n const instanceBindings: PreparedMeshInstanceBinding[] = [];\n\n\n const instances = meshes\n .filter((mesh) => mesh.geometry.position?.array.length > 0)\n .map((mesh) => {\n let { geometry, displacementScale } = prepareMeshGeometryBvh(mesh, options.displacement !== false);\n const bvhBounds = getBvhBounds(geometry);\n const bounds = computeBounds(geometry, mesh.transform, bvhBounds);\n\n let geoIdx = geometryIndexMap.get(geometry);\n const materialsIndices = mesh.materials.map((material) => {\n const key = material;\n if (!materialIndexMap.has(key)) {\n materialIndexMap.set(key, materials.length);\n materials.push(material);\n }\n return materialIndexMap.get(key)!;\n });\n\n // Explicit vertex indices are global after merging. Batches with a\n // different material table need their own vertex region, even when the\n // table contains just one material. Equal tables can share the region.\n if (geoIdx != null && geometry.materialIndex &&\n (materialsIndices.length !== globalMaterialIndicesMap[geoIdx].length ||\n materialsIndices.some((index, i) => index !== globalMaterialIndicesMap[geoIdx!][i]))) {\n const bvh = getGeometryBvh(geometry);\n geometry = new Geometry(geometry);\n setGeometryBvh(geometry, bvh);\n geoIdx = undefined;\n }\n\n if (geoIdx == null) {\n geoIdx = geometries.length;\n geometryIndexMap.set(geometry, geometries.length);\n geometries.push(geometry);\n // Same number with geometries.\n globalMaterialIndicesMap.push(materialsIndices);\n }\n const instance = {\n bounds,\n blasIndex: geoIdx!,\n transform: mesh.transform,\n materialsIndices: materialsIndices.map((idx) =>\n packMaterialIndexAndWeightToInt(idx, 1)\n ),\n displacementScale\n } satisfies TLASInstance;\n if (!(mesh instanceof InstancedMesh) && (\n !bounds.min.every(isFinite) ||\n !bounds.max.every(isFinite) ||\n !mesh.transform.every(isFinite)\n )) {\n return undefined;\n }\n if (mesh.materials.some((material) =>\n !material.unlit && !material.shadowCatcher &&\n colorLuminance(material.emissionColor) * material.emissionLuminance > 1e-8\n )) {\n emissiveBindings.push({ mesh, geometry, materialIndices: materialsIndices });\n }\n instanceBindings.push({\n mesh,\n geometry,\n blasIndex: geoIdx,\n materialIndices: materialsIndices,\n displacementScale,\n bvhBounds\n });\n return instance;\n })\n .filter((instance) => instance != null) as TLASInstance[];\n\n const geometryRegions = new Map<Geometry, { vertexOffset: number; indexOffset: number; materialIndices: number[] }>();\n const geometry = mergeGeometry(geometries, globalMaterialIndicesMap, geometryRegions);\n\n return {\n geometry,\n geometries,\n geometryRegions,\n geometryStates: new Map(instanceBindings.map(binding => {\n const source = binding.mesh.geometry;\n return [source, { topologyVersion: source.topologyVersion, indices: source.indices.array,\n indexCount: source.indices.array.length }];\n })),\n instances: meshes.some(mesh => mesh instanceof InstancedMesh) ? updateMeshInstanceTransforms(instanceBindings) : instances,\n materials,\n instanceBindings,\n emissiveBindings,\n blases: geometries.map((geo) => ({\n bvh: getGeometryBvh(geo)!,\n verticesCount: geo.vertexCount,\n trainglesCount: geo.indices.array.length / 3\n }))\n };\n}\n\nfunction mergeGeometry(\n geometries: Geometry[],\n globalMaterialIndicesMap: number[][],\n regions: Map<Geometry, { vertexOffset: number; indexOffset: number; materialIndices: number[] }>\n) {\n const totalVertexCount = geometries.reduce(\n (sum, geo) => sum + geo.vertexCount,\n 0\n );\n const totalIndexCount = geometries.reduce(\n (sum, geo) => sum + geo.indices.array.length,\n 0\n );\n const positionAttrib = new Attribute(\n new Float32Array(3 * totalVertexCount),\n 3\n );\n const normalAttrib = new Attribute(new Float32Array(3 * totalVertexCount), 3);\n const uvAttrib = new Attribute(new Float32Array(2 * totalVertexCount), 2);\n const uv1Attrib = new Attribute(new Float32Array(2 * totalVertexCount), 2);\n const indexAttrib = new Attribute(new Uint32Array(totalIndexCount), 1);\n\n const materialIndexAttrib = new Attribute(\n new Int32Array(4 * totalVertexCount),\n 4\n );\n\n const hasColor = geometries.some((geo) => geo.color);\n const hasTangent = geometries.some((geo) => geo.tangent);\n\n const mergedGeometry = new Geometry({\n position: positionAttrib,\n normal: normalAttrib,\n uv: uvAttrib,\n uv1: uv1Attrib,\n materialIndex: materialIndexAttrib,\n color: hasColor\n ? new Attribute(new Float32Array(3 * totalVertexCount).fill(1), 3)\n : undefined,\n tangent: hasTangent\n ? new Attribute(new Float32Array(4 * totalVertexCount), 4)\n : undefined,\n indices: indexAttrib\n });\n\n let currentVertex = 0;\n let currentIndex = 0;\n\n geometries.forEach((geometry, idx) => {\n const vertexCount = geometry.vertexCount;\n const globalMaterialIndex = globalMaterialIndicesMap[idx];\n regions.set(geometry, { vertexOffset: currentVertex, indexOffset: currentIndex, materialIndices: globalMaterialIndex });\n\n positionAttrib.array.set(geometry.position!.array, currentVertex * 3);\n normalAttrib.array.set(geometry.normal!.array, currentVertex * 3);\n if (geometry.uv) {\n uvAttrib.array.set(geometry.uv.array, currentVertex * 2);\n }\n uv1Attrib.array.set(\n (geometry.uv1 ?? geometry.uv)?.array ?? new Float32Array(vertexCount * 2),\n currentVertex * 2\n );\n if (geometry.color) {\n mergedGeometry.color!.array.set(geometry.color.array, currentVertex * 3);\n }\n if (geometry.tangent) {\n const source = geometry.tangent;\n for (let v = 0; v < vertexCount; v++) {\n for (let c = 0; c < 4; c++) mergedGeometry.tangent!.array[(currentVertex + v) * 4 + c] =\n c < source.itemSize ? source.array[v * source.itemSize + c] : hasGeneratedVertexTangents(geometry) ? 0 : 2;\n }\n }\n\n writeMaterialIndices(geometry, globalMaterialIndex, materialIndexAttrib.array, currentVertex);\n\n const meshIndices = geometry.indices.array;\n for (let i = 0; i < meshIndices.length; i++) {\n indexAttrib.array[currentIndex + i] = currentVertex + meshIndices[i];\n }\n currentVertex += vertexCount;\n currentIndex += meshIndices.length;\n });\n\n return mergedGeometry;\n}\n\nfunction computeGeometryNormals(geometry: Geometry) {\n const indices = geometry.indices;\n const positions = geometry.position.array;\n geometry.normal = new Attribute(new Float32Array(positions.length), 3);\n const normals = geometry.normal.array;\n\n const p1 = vec3.create();\n const p2 = vec3.create();\n const p3 = vec3.create();\n\n const v21 = vec3.create();\n const v32 = vec3.create();\n\n const n = vec3.create();\n\n const len = indices\n ? indices.array.length\n : geometry.vertexCount;\n let i1, i2, i3;\n for (let f = 0; f < len; ) {\n if (indices) {\n i1 = indices.array[f++];\n i2 = indices.array[f++];\n i3 = indices.array[f++];\n } else {\n i1 = f++;\n i2 = f++;\n i3 = f++;\n }\n\n vec3.set(\n p1,\n positions[i1 * 3],\n positions[i1 * 3 + 1],\n positions[i1 * 3 + 2]\n );\n vec3.set(\n p2,\n positions[i2 * 3],\n positions[i2 * 3 + 1],\n positions[i2 * 3 + 2]\n );\n vec3.set(\n p3,\n positions[i3 * 3],\n positions[i3 * 3 + 1],\n positions[i3 * 3 + 2]\n );\n\n vec3.sub(v21, p1, p2);\n vec3.sub(v32, p2, p3);\n vec3.cross(n, v21, v32);\n // Already be weighted by the triangle area\n for (let i = 0; i < 3; i++) {\n normals[i1 * 3 + i] = normals[i1 * 3 + i] + n[i];\n normals[i2 * 3 + i] = normals[i2 * 3 + i] + n[i];\n normals[i3 * 3 + i] = normals[i3 * 3 + i] + n[i];\n }\n }\n\n for (let i = 0; i < normals.length; ) {\n vec3.set(n, normals[i], normals[i + 1], normals[i + 2]);\n vec3.normalize(n, n);\n normals[i++] = n[0];\n normals[i++] = n[1];\n normals[i++] = n[2];\n }\n}\n\n/** Batch records are regenerated together; refit all numeric source slots. */\nexport function dirtyMeshInstanceIndices(bindings: PreparedMeshInstanceBinding[], meshes: ReadonlySet<Mesh>, instances: MeshInstances) {\n if (instances instanceof PackedMeshInstances) return new Set(Array.from({length: instances.length}, (_, i) => i));\n return new Set(bindings.flatMap((binding, i) => meshes.has(binding.mesh) ? [i] : []));\n}\n\n/** Refreshes color storage without computing transforms or bounds. Returns packed source slots. */\nexport function updateMeshInstanceColors(bindings: PreparedMeshInstanceBinding[], instances: MeshInstances, meshes: ReadonlySet<Mesh>) {\n const dirty = new Set<number>();\n if (!(instances instanceof PackedMeshInstances)) return dirty;\n let sourceStart = 0, packedIndex = 0;\n for (const {mesh} of bindings) {\n const count = meshInstanceCount(mesh), sourceEnd = sourceStart + count;\n while (packedIndex < instances.length && instances.sourceIndices[packedIndex] < sourceEnd) {\n if (meshes.has(mesh)) {\n const localIndex = instances.sourceIndices[packedIndex] - sourceStart;\n const colors = mesh instanceof InstancedMesh ? mesh.colors : undefined;\n for (let k = 0; k < 3; k++) instances.colors[packedIndex * 3 + k] = colors?.[localIndex * 3 + k] ?? 1;\n dirty.add(packedIndex);\n }\n packedIndex++;\n }\n sourceStart = sourceEnd;\n }\n return dirty;\n}\n"]}
1
+ {"version":3,"file":"prepareMeshBVH.js","sourceRoot":"","sources":["../../src/renderer/prepareMeshBVH.ts"],"names":[],"mappings":"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","sourcesContent":["import { isProceduralSkyImage } from '../scene/skyParameters.js';\nimport { prepareSceneMeshes, computeGeometryNormals, type PreparedMeshInstanceBinding as SharedInstanceBinding } from './scenePreparation.js';\nimport InstancedMesh from '../scene/InstancedMesh.js';\nimport { meshInstanceCount, type MeshInstances } from './meshInstances.js';\nimport {createCanvas} from '../util/canvas.js';\nimport { getGeometryBvh, setGeometryBvh, geometryBvhConfigMatches, type BvhBuildConfig } from './geometryBvh.js';\nimport { displacementBaseGeometry, computeDisplacementMinmax, computeTrianglesDisplacementRange, conservativeTrianglesDisplacementRange } from './displacementPreparation.js';\nexport { sphericalProjectionTriangle, triplanarProjectionTriangle } from './displacementPreparation.js';\nimport Geometry from '../scene/Geometry.js';\nimport Mesh from '../scene/Mesh.js';\nimport OpenPBRMaterial from '../scene/OpenPBRMaterial.js';\nimport { buildBLAS } from './bvhAccel.js';\nimport Texture, { isTextureDataSource } from '../scene/Texture.js';\nimport { generateVertexTangents } from '../util/geometry.js';\n\nexport { getBvhBounds } from './geometryBvhBounds.js';\n\nexport { computeBounds, updateMeshInstanceTransforms } from './scenePreparation.js';\nexport type PreparedMeshInstanceBinding = SharedInstanceBinding<Mesh>;\n\n/** Returns the first material used for CPU displacement. */\nexport function getMeshDisplacementMaterial(mesh: Mesh) {\n return mesh.materials[0];\n}\n\nexport function getMeshDisplacementMap(mesh: Mesh) {\n // Not support multiple materials for displacement.\n const material = getMeshDisplacementMaterial(mesh);\n return material.displacementMap;\n}\n\nexport function getMeshDisplacementScale(mesh: Mesh) {\n return mesh.materials[0].displacementScale;\n}\n\nconst preparedGeometryCache = new WeakMap<Geometry, Map<string, Geometry>>();\nlet displacementTextureId = 1;\nconst displacementTextureIds = new WeakMap<object, number>();\n\nfunction getDisplacementResourceId(identity: object) {\n let id = displacementTextureIds.get(identity);\n if (id == null) {\n id = displacementTextureId++;\n displacementTextureIds.set(identity, id);\n }\n return id;\n}\n\nexport function getDisplacementTextureDataCacheKey(texture: Texture) {\n const image = texture.image;\n return [\n getDisplacementResourceId(texture.source ?? texture),\n getDisplacementResourceId(image),\n texture.version,\n image.width,\n image.height\n ].join('|');\n}\n\nconst displacementMinmaxCache = new Map<string, Uint8Array[]>();\n\nexport function getPreparedMeshGeometryCacheKey(mesh: Mesh) {\n const source = mesh.geometry;\n const material = getMeshDisplacementMaterial(mesh);\n const texture = material?.displacementMap;\n if (!material) return undefined;\n // UV and procedural displacement both need height-aware BLAS bounds and\n // packed triangle ranges. Never reuse the source's undisplaced tree, or a\n // different material's height field, when a texture/scale changes.\n const scale = getMeshDisplacementScale(mesh);\n if (texture && (scale !== 0 || material.displacementBias !== 0)) {\n return ['displacement', source.version, getDisplacementTextureDataCacheKey(texture),\n +texture.flipY, texture.uvScale.join(','), texture.uvOffset.join(','), texture.uvChannel, texture.wrapS, texture.wrapT, texture.colorSpace,\n scale, material.displacementBias, material.displacementUvProjectionScale, material.displacementUvProjection].join('|');\n }\n return undefined;\n}\n\nexport function getCachedPreparedMeshGeometry(mesh: Mesh) {\n const key = getPreparedMeshGeometryCacheKey(mesh);\n if (key == null) return mesh.geometry;\n const cached = preparedGeometryCache.get(mesh.geometry)?.get(key);\n if (!cached) {\n const geometry = new Geometry(mesh.geometry);\n geometry.dynamic = mesh.geometry.dynamic;\n geometry.version = mesh.geometry.version;\n return cachePreparedMeshGeometry(mesh, geometry);\n }\n return cached;\n}\n\nexport function cachePreparedMeshGeometry(mesh: Mesh, generated: Geometry) {\n const key = getPreparedMeshGeometryCacheKey(mesh);\n if (key == null) return mesh.geometry;\n let entries = preparedGeometryCache.get(mesh.geometry);\n if (!entries) {\n entries = new Map();\n preparedGeometryCache.set(mesh.geometry, entries);\n }\n if (entries.size >= 4 && !entries.has(key)) entries.clear();\n entries.set(key, generated);\n return generated;\n}\n\n/** Returns cached prepared geometry, or the source while asynchronous preparation is pending. */\nexport function getPreparedMeshGeometry(mesh: Mesh) {\n return getCachedPreparedMeshGeometry(mesh) ?? mesh.geometry;\n}\n\nexport function computeMinmaxCPU(\n _geometry: Geometry,\n heightImage: Texture['image']\n) {\n const w = heightImage.width;\n let heightPixels: ArrayLike<number>;\n let sourceChannels: number;\n let normalizeHeight: (value: number) => number;\n if (isTextureDataSource(heightImage)) {\n heightPixels = heightImage.data;\n sourceChannels = Math.max(\n 1,\n Math.floor(heightImage.data.length / (heightImage.width * heightImage.height))\n );\n const normalized =\n heightImage.data instanceof Uint8Array ||\n heightImage.data instanceof Uint8ClampedArray;\n normalizeHeight = normalized\n ? (value) => value\n : (value) => Math.round(Math.min(Math.max(value, 0), 1) * 255);\n } else {\n const canvas = createCanvas();\n const ctx = canvas.getContext('2d') as CanvasRenderingContext2D | OffscreenCanvasRenderingContext2D | null;\n if (!ctx) throw new Error('The displacement texture is not CPU-readable.');\n canvas.width = w;\n canvas.height = w;\n if (isProceduralSkyImage(heightImage)) throw new Error('ProceduralSky is only supported as an environment or background.');\n ctx.drawImage(heightImage, 0, 0, w, w);\n heightPixels = ctx.getImageData(0, 0, w, w).data;\n sourceChannels = 4;\n normalizeHeight = (value) => value;\n }\n return computeDisplacementMinmax(w, sourceChannels, index => normalizeHeight(heightPixels[index]));\n}\n\nexport function getTrianglesDisplacementRange(\n geometry: Geometry,\n heightTexture: Texture | undefined,\n material: OpenPBRMaterial\n) {\n const indices = geometry.indexArray;\n const uvs = geometry.uv?.array;\n const uvProjection = material.displacementUvProjection;\n if (!heightTexture) return;\n if (!uvs && uvProjection === 'none') {\n throw new Error(\n 'UV displacement requires texture coordinates; use triplanar, spherical, or cylindrical projection for a UV-less mesh.'\n );\n }\n const heightImage = heightTexture.image;\n const isFlipY = heightTexture.flipY;\n if (!heightImage.width || !heightImage.height) {\n return;\n }\n const triangleCount = indices.length / 3;\n // Dense meshes retain the shared conservative full-height prism path.\n const conservative = conservativeTrianglesDisplacementRange(triangleCount);\n if (conservative) return conservative;\n const minmaxCacheKey =\n getDisplacementTextureDataCacheKey(heightTexture);\n let minmaxData = displacementMinmaxCache.get(minmaxCacheKey);\n if (!minmaxData) {\n minmaxData = computeMinmaxCPU(geometry, heightImage);\n if (displacementMinmaxCache.size >= 4) {\n displacementMinmaxCache.delete(\n displacementMinmaxCache.keys().next().value!\n );\n }\n displacementMinmaxCache.set(minmaxCacheKey, minmaxData);\n }\n\n return computeTrianglesDisplacementRange(geometry, minmaxData, heightImage.width, isFlipY, material);\n}\n\nconst warnedDirectionGeometry = new WeakSet<Geometry>();\n\n/** Prepare auto-generated source attributes before the renderer captures array identities. */\nexport function ensureMeshGeometryAttributes(meshes: readonly Mesh[]) {\n for (const { geometry, materials } of meshes) {\n if (!geometry.tangent && !warnedDirectionGeometry.has(geometry) && materials.some(m => m.anisotropyMap || m.specularAnisotropyRotation !== 0 || m.coatAnisotropyRotation !== 0 || (m.specularAnisotropyModel === 'gltf' && m.specularAnisotropy > 0))) {\n console.warn('MuTracer: anisotropy direction has no vertex tangent; deriving a frame from the selected UV set with a stable fallback for degenerate UVs.');\n warnedDirectionGeometry.add(geometry);\n }\n if (!geometry.position?.array.length) continue;\n if (!geometry.normal) computeGeometryNormals(geometry);\n if (!geometry.tangent && geometry.uv) generateVertexTangents(geometry);\n }\n}\n\nfunction getMeshBlasGeometry(mesh: Mesh, displacement = true) {\n const geometry = displacement ? getPreparedMeshGeometry(mesh) : mesh.geometry;\n if (!geometry.normal) computeGeometryNormals(geometry);\n if (!geometry.tangent && geometry.uv) generateVertexTangents(geometry);\n return geometry;\n}\n\n/** Geometry and displacement inputs shared by synchronous and Worker BLAS builds. */\nexport function getMeshBlasInput(mesh: Mesh) {\n const geometry = getMeshBlasGeometry(mesh);\n const heightMap = getMeshDisplacementMap(mesh);\n const displacementScale = heightMap ? getMeshDisplacementScale(mesh) : 0;\n const trianglesDisplacement = displacementScale !== 0\n ? getTrianglesDisplacementRange(geometry, heightMap, getMeshDisplacementMaterial(mesh))\n : undefined;\n // Build bounds around a normal-offset base while retaining original vertex\n // attributes for texture coordinates and shading. This same input works for\n // built-in, TinyBVH and Worker builds; the shader offsets its base identically.\n const bias = heightMap ? getMeshDisplacementMaterial(mesh).displacementBias : 0;\n return { geometry: displacementBaseGeometry(geometry, bias), displacementScale, trianglesDisplacement };\n}\n\n/** Whether a static mesh still needs a BLAS before it can be rendered. */\nexport function meshNeedsStaticBvh(mesh: Mesh, config?: BvhBuildConfig) {\n return !!mesh.geometry.position?.array.length && !mesh.geometry.dynamic &&\n (!getGeometryBvh(getPreparedMeshGeometry(mesh)) || !!config && !geometryBvhConfigMatches(getPreparedMeshGeometry(mesh), config));\n}\n\n/** Capture inputs whose changes invalidate an asynchronous BLAS result. */\nexport function captureMeshBlasSnapshot(mesh: Mesh, target: Geometry) {\n const displacementMap = getMeshDisplacementMap(mesh);\n return {\n geometry: mesh.geometry,\n version: mesh.geometry.version,\n cacheKey: getPreparedMeshGeometryCacheKey(mesh),\n bvh: getGeometryBvh(target),\n displacementMap,\n displacementScale: getMeshDisplacementScale(mesh),\n displacementTextureKey: displacementMap\n ? getDisplacementTextureDataCacheKey(displacementMap) : undefined\n };\n}\n\n/** Check that a result still belongs to the captured mesh inputs. */\nexport function meshBlasSnapshotIsCurrent(\n mesh: Mesh, target: Geometry, snapshot: ReturnType<typeof captureMeshBlasSnapshot>\n) {\n return mesh.geometry === snapshot.geometry && mesh.geometry.version === snapshot.version &&\n getPreparedMeshGeometryCacheKey(mesh) === snapshot.cacheKey && getGeometryBvh(target) === snapshot.bvh &&\n getMeshDisplacementMap(mesh) === snapshot.displacementMap &&\n getMeshDisplacementScale(mesh) === snapshot.displacementScale &&\n (!snapshot.displacementMap || getDisplacementTextureDataCacheKey(snapshot.displacementMap) ===\n snapshot.displacementTextureKey);\n}\n\nfunction prepareMeshGeometryBvh(mesh: Mesh, displacement = true) {\n const geometry = getMeshBlasGeometry(mesh, displacement);\n const displacementScale = displacement && getMeshDisplacementMap(mesh) ? getMeshDisplacementScale(mesh) : 0;\n if (geometry.dynamic && getGeometryBvh(geometry)?.builder !== 'builtin') setGeometryBvh(geometry, undefined);\n if (!getGeometryBvh(geometry)) {\n const input = displacement ? getMeshBlasInput(mesh) : { geometry, displacementScale, trianglesDisplacement: undefined };\n setGeometryBvh(geometry, buildBLAS(input.geometry, input.displacementScale, input.trianglesDisplacement));\n }\n return { geometry, displacementScale };\n}\n\nexport function updateMeshInstances(meshes: Mesh[], options: { displacement?: boolean } = {}) {\n return prepareSceneMeshes(meshes, mesh => prepareMeshGeometryBvh(mesh, options.displacement !== false));\n}\n\nexport {dirtyPreparedInstanceIndices as dirtyMeshInstanceIndices} from './scenePreparation.js';\n\n/** Refreshes color storage without computing transforms or bounds. Returns packed source slots. */\nexport function updateMeshInstanceColors(bindings: PreparedMeshInstanceBinding[], instances: MeshInstances, meshes: ReadonlySet<Mesh>) {\n const dirty = new Set<number>();\n if (Array.isArray(instances)) return dirty;\n let sourceStart = 0, packedIndex = 0;\n for (const {mesh} of bindings) {\n const count = meshInstanceCount(mesh), sourceEnd = sourceStart + count;\n while (packedIndex < instances.length && instances.sourceIndices[packedIndex] < sourceEnd) {\n if (meshes.has(mesh)) {\n const localIndex = instances.sourceIndices[packedIndex] - sourceStart;\n const colors = mesh instanceof InstancedMesh ? mesh.colors : undefined;\n for (let k = 0; k < 3; k++) instances.colors[packedIndex * 3 + k] = colors?.[localIndex * 3 + k] ?? 1;\n dirty.add(packedIndex);\n }\n packedIndex++;\n }\n sourceStart = sourceEnd;\n }\n return dirty;\n}\n"]}
@@ -0,0 +1,3 @@
1
+ import type { ProceduralEnvironmentSource } from './envMapDistribution.js';
2
+ /** Proposal-only power estimate: changing this affects variance, not radiance or PDFs. */
3
+ export declare function proceduralEnvironmentPower(source: ProceduralEnvironmentSource): number;
@@ -0,0 +1,8 @@
1
+ /** Proposal-only power estimate: changing this affects variance, not radiance or PDFs. */
2
+ export function proceduralEnvironmentPower(source) {
3
+ // Avoid a GPU-to-CPU fence just to choose among environment and analytic lights.
4
+ // The uniform component in light-domain selection keeps every source supported.
5
+ const ambient = source.ambient[0] * .2126 + source.ambient[1] * .7152 + source.ambient[2] * .0722;
6
+ return 4 * Math.PI * (source.intensity + Math.max(0, ambient));
7
+ }
8
+ //# sourceMappingURL=proceduralEnvironmentPower.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"proceduralEnvironmentPower.js","sourceRoot":"","sources":["../../src/renderer/proceduralEnvironmentPower.ts"],"names":[],"mappings":"AAEA,0FAA0F;AAC1F,MAAM,UAAU,0BAA0B,CAAC,MAAmC;IAC5E,iFAAiF;IACjF,gFAAgF;IAChF,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,KAAK,GAAG,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,KAAK,GAAG,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC;IAClG,OAAO,CAAC,GAAG,IAAI,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC;AACjE,CAAC","sourcesContent":["import type { ProceduralEnvironmentSource } from './envMapDistribution.js';\n\n/** Proposal-only power estimate: changing this affects variance, not radiance or PDFs. */\nexport function proceduralEnvironmentPower(source: ProceduralEnvironmentSource) {\n // Avoid a GPU-to-CPU fence just to choose among environment and analytic lights.\n // The uniform component in light-domain selection keeps every source supported.\n const ambient = source.ambient[0] * .2126 + source.ambient[1] * .7152 + source.ambient[2] * .0722;\n return 4 * Math.PI * (source.intensity + Math.max(0, ambient));\n}\n"]}
@@ -1,3 +1,4 @@
1
+ export { displayAovKind as aovChannel } from './aovDisplay.js';
1
2
  import type Render from '../Render.js';
2
3
  import type Display from '../Display.js';
3
4
  export interface ProgressiveState {
@@ -1,3 +1,7 @@
1
+ export { displayAovKind as aovChannel } from './aovDisplay.js';
2
+ import { traceSchema } from '../settings/render.js';
3
+ // Every setting that changes the traced image, including caustics.
4
+ const imageFields = Object.values(traceSchema).filter(field => field.kind === 'image').map(field => field.key);
1
5
  /** Pure consecutive-edit policy; isolated changes start final immediately. */
2
6
  export function updateProgressiveState(state, changed, active, now, idleMs) {
3
7
  const lastContinuousChange = active ? -Infinity : changed && state.previousChanged ? now : state.lastContinuousChange;
@@ -6,14 +10,14 @@ export function updateProgressiveState(state, changed, active, now, idleMs) {
6
10
  /** Public state used to leave a finished canvas idle while still noticing settings edits. */
7
11
  export function loopImageState(render, display) {
8
12
  return JSON.stringify([
9
- render.samples, render.width, render.height, render.maxSamples, render.bounces, render.clamping,
10
- render.samplingPattern, render.directLightCandidates, render.bevel, render.bevelSamples,
11
- render.dispersionWavelengths, render.alphaBlendStrategy, render.transmissiveOutputAlphaMin,
13
+ render.samples, render.width, render.height, render.maxSamples, imageFields.map(key => render[key]),
12
14
  render.resolutionScale, render.adaptiveResolution, render.denoiser, render.denoising,
15
+ render.aovs, render.aovSamples,
13
16
  display.canvas.width, display.canvas.height, display.toneMapping, display.toneMappingExposure,
14
17
  display.contrast, display.saturation, display.temperature, display.tint, display.vignette,
15
18
  display.bloomIntensity, display.bloomThreshold, display.bloomRadius, display.hdrOutputEnabled,
16
19
  display.channel, display.shadowCatcherColor, display.shadowCatcherAlpha,
20
+ display.aovDepthRange, display.aovPositionScale, display.aovMotionScale, display.aovIdComponent,
17
21
  ]);
18
22
  }
19
23
  //# sourceMappingURL=progressiveScheduler.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"progressiveScheduler.js","sourceRoot":"","sources":["../../src/renderer/progressiveScheduler.ts"],"names":[],"mappings":"AAIA,8EAA8E;AAC9E,MAAM,UAAU,sBAAsB,CAAC,KAAuB,EAAE,OAAgB,EAAE,MAAe,EAAE,GAAW,EAAE,MAAc;IAC5H,MAAM,oBAAoB,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,OAAO,IAAI,KAAK,CAAC,eAAe,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,oBAAoB,CAAC;IACtH,OAAO,EAAC,eAAe,EAAE,OAAO,IAAI,CAAC,MAAM,EAAE,oBAAoB,EAAE,QAAQ,EAAE,MAAM,IAAI,GAAG,GAAG,oBAAoB,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,CAAC,EAAC,CAAC;AAC3I,CAAC;AAED,6FAA6F;AAC7F,MAAM,UAAU,cAAc,CAAC,MAAc,EAAE,OAAgB;IAC7D,OAAO,IAAI,CAAC,SAAS,CAAC;QACpB,MAAM,CAAC,OAAO,EAAE,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,UAAU,EAAE,MAAM,CAAC,OAAO,EAAE,MAAM,CAAC,QAAQ;QAC/F,MAAM,CAAC,eAAe,EAAE,MAAM,CAAC,qBAAqB,EAAE,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,YAAY;QACvF,MAAM,CAAC,qBAAqB,EAAE,MAAM,CAAC,kBAAkB,EAAE,MAAM,CAAC,0BAA0B;QAC1F,MAAM,CAAC,eAAe,EAAE,MAAM,CAAC,kBAAkB,EAAE,MAAM,CAAC,QAAQ,EAAE,MAAM,CAAC,SAAS;QACpF,OAAO,CAAC,MAAM,CAAC,KAAK,EAAE,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,WAAW,EAAE,OAAO,CAAC,mBAAmB;QAC7F,OAAO,CAAC,QAAQ,EAAE,OAAO,CAAC,UAAU,EAAE,OAAO,CAAC,WAAW,EAAE,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,QAAQ;QACzF,OAAO,CAAC,cAAc,EAAE,OAAO,CAAC,cAAc,EAAE,OAAO,CAAC,WAAW,EAAE,OAAO,CAAC,gBAAgB;QAC7F,OAAO,CAAC,OAAO,EAAE,OAAO,CAAC,kBAAkB,EAAE,OAAO,CAAC,kBAAkB;KACxE,CAAC,CAAC;AACL,CAAC","sourcesContent":["import type Render from '../Render.js';\nimport type Display from '../Display.js';\n\nexport interface ProgressiveState { previousChanged: boolean; lastContinuousChange: number; changing: boolean; }\n/** Pure consecutive-edit policy; isolated changes start final immediately. */\nexport function updateProgressiveState(state: ProgressiveState, changed: boolean, active: boolean, now: number, idleMs: number): ProgressiveState {\n const lastContinuousChange = active ? -Infinity : changed && state.previousChanged ? now : state.lastContinuousChange;\n return {previousChanged: changed && !active, lastContinuousChange, changing: active || now - lastContinuousChange < Math.max(0, idleMs)};\n}\n\n/** Public state used to leave a finished canvas idle while still noticing settings edits. */\nexport function loopImageState(render: Render, display: Display): string {\n return JSON.stringify([\n render.samples, render.width, render.height, render.maxSamples, render.bounces, render.clamping,\n render.samplingPattern, render.directLightCandidates, render.bevel, render.bevelSamples,\n render.dispersionWavelengths, render.alphaBlendStrategy, render.transmissiveOutputAlphaMin,\n render.resolutionScale, render.adaptiveResolution, render.denoiser, render.denoising,\n display.canvas.width, display.canvas.height, display.toneMapping, display.toneMappingExposure,\n display.contrast, display.saturation, display.temperature, display.tint, display.vignette,\n display.bloomIntensity, display.bloomThreshold, display.bloomRadius, display.hdrOutputEnabled,\n display.channel, display.shadowCatcherColor, display.shadowCatcherAlpha,\n ]);\n}\n"]}
1
+ {"version":3,"file":"progressiveScheduler.js","sourceRoot":"","sources":["../../src/renderer/progressiveScheduler.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,cAAc,IAAI,UAAU,EAAC,MAAM,iBAAiB,CAAC;AAG7D,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AAEpD,mEAAmE;AACnE,MAAM,WAAW,GAAG,MAAM,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,IAAI,KAAK,OAAO,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;AAG/G,8EAA8E;AAC9E,MAAM,UAAU,sBAAsB,CAAC,KAAuB,EAAE,OAAgB,EAAE,MAAe,EAAE,GAAW,EAAE,MAAc;IAC5H,MAAM,oBAAoB,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,OAAO,IAAI,KAAK,CAAC,eAAe,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,oBAAoB,CAAC;IACtH,OAAO,EAAC,eAAe,EAAE,OAAO,IAAI,CAAC,MAAM,EAAE,oBAAoB,EAAE,QAAQ,EAAE,MAAM,IAAI,GAAG,GAAG,oBAAoB,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,CAAC,EAAC,CAAC;AAC3I,CAAC;AAED,6FAA6F;AAC7F,MAAM,UAAU,cAAc,CAAC,MAAc,EAAE,OAAgB;IAC7D,OAAO,IAAI,CAAC,SAAS,CAAC;QACpB,MAAM,CAAC,OAAO,EAAE,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,UAAU,EAAE,WAAW,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QACnG,MAAM,CAAC,eAAe,EAAE,MAAM,CAAC,kBAAkB,EAAE,MAAM,CAAC,QAAQ,EAAE,MAAM,CAAC,SAAS;QACpF,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,UAAU;QAC9B,OAAO,CAAC,MAAM,CAAC,KAAK,EAAE,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,WAAW,EAAE,OAAO,CAAC,mBAAmB;QAC7F,OAAO,CAAC,QAAQ,EAAE,OAAO,CAAC,UAAU,EAAE,OAAO,CAAC,WAAW,EAAE,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,QAAQ;QACzF,OAAO,CAAC,cAAc,EAAE,OAAO,CAAC,cAAc,EAAE,OAAO,CAAC,WAAW,EAAE,OAAO,CAAC,gBAAgB;QAC7F,OAAO,CAAC,OAAO,EAAE,OAAO,CAAC,kBAAkB,EAAE,OAAO,CAAC,kBAAkB;QACvE,OAAO,CAAC,aAAa,EAAE,OAAO,CAAC,gBAAgB,EAAE,OAAO,CAAC,cAAc,EAAE,OAAO,CAAC,cAAc;KAChG,CAAC,CAAC;AACL,CAAC","sourcesContent":["export {displayAovKind as aovChannel} from './aovDisplay.js';\nimport type Render from '../Render.js';\nimport type Display from '../Display.js';\nimport { traceSchema } from '../settings/render.js';\n\n// Every setting that changes the traced image, including caustics.\nconst imageFields = Object.values(traceSchema).filter(field => field.kind === 'image').map(field => field.key);\n\nexport interface ProgressiveState { previousChanged: boolean; lastContinuousChange: number; changing: boolean; }\n/** Pure consecutive-edit policy; isolated changes start final immediately. */\nexport function updateProgressiveState(state: ProgressiveState, changed: boolean, active: boolean, now: number, idleMs: number): ProgressiveState {\n const lastContinuousChange = active ? -Infinity : changed && state.previousChanged ? now : state.lastContinuousChange;\n return {previousChanged: changed && !active, lastContinuousChange, changing: active || now - lastContinuousChange < Math.max(0, idleMs)};\n}\n\n/** Public state used to leave a finished canvas idle while still noticing settings edits. */\nexport function loopImageState(render: Render, display: Display): string {\n return JSON.stringify([\n render.samples, render.width, render.height, render.maxSamples, imageFields.map(key => render[key]),\n render.resolutionScale, render.adaptiveResolution, render.denoiser, render.denoising,\n render.aovs, render.aovSamples,\n display.canvas.width, display.canvas.height, display.toneMapping, display.toneMappingExposure,\n display.contrast, display.saturation, display.temperature, display.tint, display.vignette,\n display.bloomIntensity, display.bloomThreshold, display.bloomRadius, display.hdrOutputEnabled,\n display.channel, display.shadowCatcherColor, display.shadowCatcherAlpha,\n display.aovDepthRange, display.aovPositionScale, display.aovMotionScale, display.aovIdComponent,\n ]);\n}\n"]}
@@ -6,6 +6,8 @@ import type { SamplingPattern } from './sampling.js';
6
6
  import type { TargetPipeline } from './accumulationTarget.js';
7
7
  /** Immutable execution settings restored before every operation on a target. */
8
8
  export interface TraceSettings {
9
+ aovs?: readonly import('./aov.js').AovKind[];
10
+ aovSamples?: number;
9
11
  transmissiveOutputAlphaMin: number;
10
12
  bounces: number;
11
13
  clamping: number;
@@ -13,12 +15,13 @@ export interface TraceSettings {
13
15
  bevelSamples: number;
14
16
  dispersionWavelengths: 1 | 3;
15
17
  directLightCandidates: number;
18
+ caustics?: import('../Render.js').CausticSettings;
16
19
  alphaBlendStrategy: AlphaBlendStrategy;
17
20
  samplingPattern: SamplingPattern;
18
21
  maxSamples: number;
19
22
  timeBudgetMs: number;
20
23
  maxTiles: number;
21
- allowMultipleSamplesPerFrame: boolean;
24
+ batchSamples: boolean;
22
25
  }
23
26
  export interface DisplaySettings {
24
27
  toneMapping: ToneMappingParams;
@@ -1 +1 @@
1
- {"version":3,"file":"renderPipeline.js","sourceRoot":"","sources":["../../src/renderer/renderPipeline.ts"],"names":[],"mappings":"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","sourcesContent":["import type {ScratchPool} from './ScratchPool.js';\nimport type Camera from '../scene/Camera.js';\nimport type { Scene } from '../scene/Scene.js';\nimport type { SceneResources, AlphaBlendStrategy, ToneMappingParams, DisplayChannel } from './RenderingPipeline.js';\nimport type { SamplingPattern } from './sampling.js';\nimport type { TargetPipeline } from './accumulationTarget.js';\n\n/** Immutable execution settings restored before every operation on a target. */\nexport interface TraceSettings {\n transmissiveOutputAlphaMin: number;\n bounces: number; clamping: number; bevel: boolean; bevelSamples: number;\n dispersionWavelengths: 1 | 3; directLightCandidates: number;\n alphaBlendStrategy: AlphaBlendStrategy; samplingPattern: SamplingPattern; maxSamples: number;\n timeBudgetMs: number; maxTiles: number; allowMultipleSamplesPerFrame: boolean;\n}\nexport interface DisplaySettings {\n toneMapping: ToneMappingParams;\n bloom: { intensity: number; threshold: number; radius: number };\n hdrOutputEnabled: boolean; channel: DisplayChannel;\n shadowCatcherColor: [number, number, number]; shadowCatcherAlpha: number;\n}\nexport interface RenderTarget extends TargetPipeline {\n readonly label: string;\n configure(settings: TraceSettings): void;\n synchronizeBackground(background: Scene['background']): void;\n}\nexport interface RenderPipeline {\n getSharedMemoryBytes(): number;\n createTarget(label: string): RenderTarget;\n releaseTarget(target: RenderTarget): void;\n setMeshes: SceneResources['setMeshes'];\n setLights: SceneResources['setLights'];\n setBackground: SceneResources['setBackground'];\n setTextureAtlasBudget: SceneResources['setTextureAtlasBudget'];\n readDepthSamples(camera: Camera, area: Parameters<SceneResources['readDepthSamples']>[0], aspect?: number): ReturnType<SceneResources['readDepthSamples']>;\n getDiagnostics(): ReturnType<SceneResources['getDiagnostics']>;\n dispose(): void;\n}\n\n/** Shared scene ownership; every image operation explicitly selects its target. */\nexport function makeRenderPipeline(\n scene: Pick<RenderPipeline, 'setMeshes' | 'setLights' | 'setBackground' | 'setTextureAtlasBudget' | 'getDiagnostics' | 'dispose'> & {\n setCamera(camera: Camera): void;\n readDepthSamples(area: Parameters<SceneResources['readDepthSamples']>[0], aspect?: number): ReturnType<SceneResources['readDepthSamples']>;\n setBounce(bounces: number): boolean;\n },\n create: () => TargetPipeline,\n webgl = false,\n scratch?: ScratchPool\n): RenderPipeline {\n const targets = new Set<RenderTarget>();\n const settings = new Map<RenderTarget, TraceSettings>();\n let latest: RenderTarget | undefined;\n let background: Scene['background'];\n return {\n getSharedMemoryBytes: () => scratch?.getMemoryBytes() ?? 0,\n createTarget(label) {\n const backend = create();\n const target: RenderTarget = {\n ...backend,\n get presentationComplete() { return backend.presentationComplete; },\n get presentationDenoised() { return backend.presentationDenoised; },\n label,\n configure(options) { settings.set(target, { ...options }); backend.configure(options); },\n activate() {\n latest = target;\n if (webgl) scene.setBounce(Math.max(1, ...Array.from(settings.values(), s => s.bounces)));\n backend.activate();\n }\n };\n target.synchronizeBackground(background);\n targets.add(target);\n return target;\n },\n releaseTarget(target) { if (targets.delete(target)) { settings.delete(target); target.dispose(); } },\n setMeshes: (meshes, update) => scene.setMeshes(meshes, update),\n setLights: lights => scene.setLights(lights),\n setBackground(value) {\n background = value; scene.setBackground(value);\n for (const target of targets) target.synchronizeBackground(value);\n },\n setTextureAtlasBudget: bytes => scene.setTextureAtlasBudget(bytes),\n async readDepthSamples(camera, area) { scene.setCamera(camera); return scene.readDepthSamples(area, camera.aspect); },\n getDiagnostics() {\n return { ...scene.getDiagnostics(), ...latest?.getDiagnostics(), targets: Array.from(targets, t => ({label: t.label, ...t.getMemory()})) };\n },\n dispose() { for (const target of targets) target.dispose(); targets.clear(); settings.clear(); scene.dispose(); scratch?.dispose(); }\n };\n}\n"]}
1
+ {"version":3,"file":"renderPipeline.js","sourceRoot":"","sources":["../../src/renderer/renderPipeline.ts"],"names":[],"mappings":"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","sourcesContent":["import type {ScratchPool} from './ScratchPool.js';\nimport type Camera from '../scene/Camera.js';\nimport type { Scene } from '../scene/Scene.js';\nimport type { SceneResources, AlphaBlendStrategy, ToneMappingParams, DisplayChannel } from './RenderingPipeline.js';\nimport type { SamplingPattern } from './sampling.js';\nimport type { TargetPipeline } from './accumulationTarget.js';\n\n/** Immutable execution settings restored before every operation on a target. */\nexport interface TraceSettings {\n aovs?: readonly import('./aov.js').AovKind[]; aovSamples?: number;\n transmissiveOutputAlphaMin: number;\n bounces: number; clamping: number; bevel: boolean; bevelSamples: number;\n dispersionWavelengths: 1 | 3; directLightCandidates: number;\n caustics?: import('../Render.js').CausticSettings;\n alphaBlendStrategy: AlphaBlendStrategy; samplingPattern: SamplingPattern; maxSamples: number;\n timeBudgetMs: number; maxTiles: number; batchSamples: boolean;\n}\nexport interface DisplaySettings {\n toneMapping: ToneMappingParams;\n bloom: { intensity: number; threshold: number; radius: number };\n hdrOutputEnabled: boolean; channel: DisplayChannel;\n shadowCatcherColor: [number, number, number]; shadowCatcherAlpha: number;\n}\nexport interface RenderTarget extends TargetPipeline {\n readonly label: string;\n configure(settings: TraceSettings): void;\n synchronizeBackground(background: Scene['background']): void;\n}\nexport interface RenderPipeline {\n getSharedMemoryBytes(): number;\n createTarget(label: string): RenderTarget;\n releaseTarget(target: RenderTarget): void;\n setMeshes: SceneResources['setMeshes'];\n setLights: SceneResources['setLights'];\n setBackground: SceneResources['setBackground'];\n setTextureAtlasBudget: SceneResources['setTextureAtlasBudget'];\n readDepthSamples(camera: Camera, area: Parameters<SceneResources['readDepthSamples']>[0], aspect?: number): ReturnType<SceneResources['readDepthSamples']>;\n getDiagnostics(): ReturnType<SceneResources['getDiagnostics']>;\n dispose(): void;\n}\n\n/** Shared scene ownership; every image operation explicitly selects its target. */\nexport function makeRenderPipeline(\n scene: Pick<RenderPipeline, 'setMeshes' | 'setLights' | 'setBackground' | 'setTextureAtlasBudget' | 'getDiagnostics' | 'dispose'> & {\n setCamera(camera: Camera): void;\n readDepthSamples(area: Parameters<SceneResources['readDepthSamples']>[0], aspect?: number): ReturnType<SceneResources['readDepthSamples']>;\n setBounce(bounces: number): boolean;\n },\n create: () => TargetPipeline,\n webgl = false,\n scratch?: ScratchPool\n): RenderPipeline {\n const targets = new Set<RenderTarget>();\n const settings = new Map<RenderTarget, TraceSettings>();\n let latest: RenderTarget | undefined;\n let background: Scene['background'];\n return {\n getSharedMemoryBytes: () => scratch?.getMemoryBytes() ?? 0,\n createTarget(label) {\n const backend = create();\n const target: RenderTarget = {\n ...backend,\n get presentationComplete() { return backend.presentationComplete; },\n get presentationDenoised() { return backend.presentationDenoised; },\n label,\n configure(options) { settings.set(target, { ...options }); backend.configure(options); },\n activate() {\n latest = target;\n if (webgl) scene.setBounce(Math.max(1, ...Array.from(settings.values(), s => s.bounces)));\n backend.activate();\n }\n };\n target.synchronizeBackground(background);\n targets.add(target);\n return target;\n },\n releaseTarget(target) { if (targets.delete(target)) { settings.delete(target); target.dispose(); } },\n setMeshes: (meshes, update) => scene.setMeshes(meshes, update),\n setLights: lights => scene.setLights(lights),\n setBackground(value) {\n background = value; scene.setBackground(value);\n for (const target of targets) target.synchronizeBackground(value);\n },\n setTextureAtlasBudget: bytes => scene.setTextureAtlasBudget(bytes),\n async readDepthSamples(camera, area) { scene.setCamera(camera); return scene.readDepthSamples(area, camera.aspect); },\n getDiagnostics() {\n return { ...scene.getDiagnostics(), ...latest?.getDiagnostics(), targets: Array.from(targets, t => ({label: t.label, ...t.getMemory()})) };\n },\n dispose() { for (const target of targets) target.dispose(); targets.clear(); settings.clear(); scene.dispose(); scratch?.dispose(); }\n };\n}\n"]}
@@ -0,0 +1,9 @@
1
+ export declare const DEFAULT_BEVEL_SAMPLES = 8;
2
+ export declare const MIN_BEVEL_SAMPLES = 1;
3
+ export declare const MAX_BEVEL_SAMPLES = 32;
4
+ /** Light candidates resampled per NEE estimate by the WebGPU path tracer. */
5
+ export declare const DEFAULT_DIRECT_LIGHT_CANDIDATES = 4;
6
+ export declare const MIN_DIRECT_LIGHT_CANDIDATES = 1;
7
+ export declare const MAX_DIRECT_LIGHT_CANDIDATES = 16;
8
+ export declare function normalizeDirectLightCandidates(candidates: number): number;
9
+ export declare function normalizeBevelSamples(samples: number): number;
@@ -0,0 +1,18 @@
1
+ export const DEFAULT_BEVEL_SAMPLES = 8;
2
+ export const MIN_BEVEL_SAMPLES = 1;
3
+ export const MAX_BEVEL_SAMPLES = 32;
4
+ /** Light candidates resampled per NEE estimate by the WebGPU path tracer. */
5
+ export const DEFAULT_DIRECT_LIGHT_CANDIDATES = 4;
6
+ export const MIN_DIRECT_LIGHT_CANDIDATES = 1;
7
+ export const MAX_DIRECT_LIGHT_CANDIDATES = 16;
8
+ export function normalizeDirectLightCandidates(candidates) {
9
+ if (!Number.isFinite(candidates))
10
+ return DEFAULT_DIRECT_LIGHT_CANDIDATES;
11
+ return Math.min(MAX_DIRECT_LIGHT_CANDIDATES, Math.max(MIN_DIRECT_LIGHT_CANDIDATES, Math.round(candidates)));
12
+ }
13
+ export function normalizeBevelSamples(samples) {
14
+ if (!Number.isFinite(samples))
15
+ return DEFAULT_BEVEL_SAMPLES;
16
+ return Math.min(MAX_BEVEL_SAMPLES, Math.max(MIN_BEVEL_SAMPLES, Math.round(samples)));
17
+ }
18
+ //# sourceMappingURL=renderingLimits.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"renderingLimits.js","sourceRoot":"","sources":["../../src/renderer/renderingLimits.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,qBAAqB,GAAG,CAAC,CAAC;AACvC,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,CAAC;AACnC,MAAM,CAAC,MAAM,iBAAiB,GAAG,EAAE,CAAC;AAEpC,6EAA6E;AAC7E,MAAM,CAAC,MAAM,+BAA+B,GAAG,CAAC,CAAC;AACjD,MAAM,CAAC,MAAM,2BAA2B,GAAG,CAAC,CAAC;AAC7C,MAAM,CAAC,MAAM,2BAA2B,GAAG,EAAE,CAAC;AAE9C,MAAM,UAAU,8BAA8B,CAAC,UAAkB;IAC/D,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,UAAU,CAAC;QAAE,OAAO,+BAA+B,CAAC;IACzE,OAAO,IAAI,CAAC,GAAG,CACb,2BAA2B,EAC3B,IAAI,CAAC,GAAG,CAAC,2BAA2B,EAAE,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,CAC9D,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAC,OAAe;IACnD,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC;QAAE,OAAO,qBAAqB,CAAC;IAC5D,OAAO,IAAI,CAAC,GAAG,CACb,iBAAiB,EACjB,IAAI,CAAC,GAAG,CAAC,iBAAiB,EAAE,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CACjD,CAAC;AACJ,CAAC","sourcesContent":["export const DEFAULT_BEVEL_SAMPLES = 8;\nexport const MIN_BEVEL_SAMPLES = 1;\nexport const MAX_BEVEL_SAMPLES = 32;\n\n/** Light candidates resampled per NEE estimate by the WebGPU path tracer. */\nexport const DEFAULT_DIRECT_LIGHT_CANDIDATES = 4;\nexport const MIN_DIRECT_LIGHT_CANDIDATES = 1;\nexport const MAX_DIRECT_LIGHT_CANDIDATES = 16;\n\nexport function normalizeDirectLightCandidates(candidates: number) {\n if (!Number.isFinite(candidates)) return DEFAULT_DIRECT_LIGHT_CANDIDATES;\n return Math.min(\n MAX_DIRECT_LIGHT_CANDIDATES,\n Math.max(MIN_DIRECT_LIGHT_CANDIDATES, Math.round(candidates))\n );\n}\n\nexport function normalizeBevelSamples(samples: number) {\n if (!Number.isFinite(samples)) return DEFAULT_BEVEL_SAMPLES;\n return Math.min(\n MAX_BEVEL_SAMPLES,\n Math.max(MIN_BEVEL_SAMPLES, Math.round(samples))\n );\n}\n"]}
@@ -0,0 +1,31 @@
1
+ import type { ShaderMixin } from './shader.js';
2
+ /** Optional transport experiment. Production entry points never import its implementation. */
3
+ export interface ResearchShaderParts {
4
+ enabled: boolean;
5
+ maxDepth: number;
6
+ debugGroup: number;
7
+ declarations: string;
8
+ contribution: string;
9
+ debugOutput: string;
10
+ mixin?: ShaderMixin;
11
+ fragments?: Record<string, string>;
12
+ }
13
+ export interface ResearchPassState {
14
+ debugGroup: number;
15
+ enabled: boolean;
16
+ key: string;
17
+ workgroupSize: number;
18
+ features: object;
19
+ uniform: object;
20
+ }
21
+ export interface ResearchTransport {
22
+ compute(options: object): ResearchShaderParts;
23
+ fragment(options: readonly unknown[]): ResearchShaderParts;
24
+ constants(constants: Record<string, boolean | number>, features: object): Record<string, boolean | number>;
25
+ configure(pass: object, backend: 'webgpu' | 'webgl'): ResearchPassState;
26
+ prepare(pass: object, backend: 'webgpu' | 'webgl', lighting?: unknown): void;
27
+ capture(pass: object): void;
28
+ dispose(pass: object, backend: 'webgpu' | 'webgl'): void;
29
+ packUniform(data: ArrayBuffer, options: object): void;
30
+ }
31
+ export declare function researchTransport(): ResearchTransport | undefined;
@@ -0,0 +1,5 @@
1
+ let extension;
2
+ /** @internal Registers an explicitly imported experiment; call before allocating renders. */
3
+ export function registerResearchTransport(value) { extension = value; }
4
+ export function researchTransport() { return extension; }
5
+ //# sourceMappingURL=researchTransport.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"researchTransport.js","sourceRoot":"","sources":["../../src/renderer/researchTransport.ts"],"names":[],"mappings":"AA+BA,IAAI,SAAwC,CAAC;AAC7C,6FAA6F;AAC7F,MAAM,UAAU,yBAAyB,CAAC,KAAoC,IAAU,SAAS,GAAG,KAAK,CAAC,CAAC,CAAC;AAC5G,MAAM,UAAU,iBAAiB,KAAoC,OAAO,SAAS,CAAC,CAAC,CAAC","sourcesContent":["import type {ShaderMixin} from './shader.js';\n\n/** Optional transport experiment. Production entry points never import its implementation. */\nexport interface ResearchShaderParts {\n enabled: boolean;\n maxDepth: number;\n debugGroup: number;\n declarations: string;\n contribution: string;\n debugOutput: string;\n mixin?: ShaderMixin;\n fragments?: Record<string, string>;\n}\nexport interface ResearchPassState {\n debugGroup: number;\n enabled: boolean;\n key: string;\n workgroupSize: number;\n features: object;\n uniform: object;\n}\nexport interface ResearchTransport {\n compute(options: object): ResearchShaderParts;\n fragment(options: readonly unknown[]): ResearchShaderParts;\n constants(constants: Record<string, boolean | number>, features: object): Record<string, boolean | number>;\n configure(pass: object, backend: 'webgpu' | 'webgl'): ResearchPassState;\n prepare(pass: object, backend: 'webgpu' | 'webgl', lighting?: unknown): void;\n capture(pass: object): void;\n dispose(pass: object, backend: 'webgpu' | 'webgl'): void;\n packUniform(data: ArrayBuffer, options: object): void;\n}\nlet extension: ResearchTransport | undefined;\n/** @internal Registers an explicitly imported experiment; call before allocating renders. */\nexport function registerResearchTransport(value: ResearchTransport | undefined): void { extension = value; }\nexport function researchTransport(): ResearchTransport | undefined { return extension; }\n"]}
@@ -0,0 +1,73 @@
1
+ import type Geometry from '../scene/Geometry.js';
2
+ import type { AnalyticLightState } from '../scene/lightState.js';
3
+ import { makeRayTraceUniform } from './wgpuSceneUniform.js';
4
+ import { type SamplingPattern } from './sampling.js';
5
+ import { LightChoiceBuffer, type EmissiveTriangle } from './lightSampling.js';
6
+ type TraceViews = ReturnType<typeof makeRayTraceUniform>['views'];
7
+ export declare function initialSceneConstants(): Record<string, boolean | number>;
8
+ export declare function sceneAttributeLayout(geometry: Geometry): {
9
+ stride: number;
10
+ offsets: number[];
11
+ constants: Record<string, number | boolean>;
12
+ };
13
+ export declare function sceneTraversalConstants(tlas: number, blas: number, previous?: Record<string, boolean | number>): {
14
+ TLAS_STACK_SIZE: number;
15
+ BLAS_STACK_SIZE: number;
16
+ };
17
+ export declare function writeTraceQuality(views: TraceViews, options: {
18
+ bounces: number;
19
+ bevel: boolean;
20
+ dispersionWavelengths: 1 | 3;
21
+ directLightCandidates: number;
22
+ }): void;
23
+ export declare function traceSampling(pattern: SamplingPattern, maxSamples: number, sequenceSeed: number): {
24
+ code: number;
25
+ logSPP: number;
26
+ seed: number;
27
+ };
28
+ export declare function writeTraceSampling(views: TraceViews, sampling: ReturnType<typeof traceSampling>): void;
29
+ export declare function prepareSceneLightSampling(lights: AnalyticLightState[], emissive: EmissiveTriangle[], environmentPower: number, maxDimension: number, choices?: LightChoiceBuffer, scratch?: Float32Array, catcherChoices?: LightChoiceBuffer): {
30
+ lightData: Float32Array<ArrayBufferLike>;
31
+ lightWidth: number;
32
+ lightHeight: number;
33
+ analyticPmfs: number[];
34
+ profiles: {
35
+ data: Float32Array<ArrayBuffer>;
36
+ offsets: Int32Array<ArrayBuffer>;
37
+ texelCount: number;
38
+ };
39
+ environmentPmf: number;
40
+ choiceCount: number;
41
+ totalWeight: number;
42
+ emissiveTexels: number;
43
+ domains: {
44
+ environment: {
45
+ count: number;
46
+ weight: number;
47
+ pmf: number;
48
+ };
49
+ infinite: {
50
+ count: number;
51
+ weight: number;
52
+ pmf: number;
53
+ };
54
+ localAndEmissive: {
55
+ count: number;
56
+ weight: number;
57
+ pmf: number;
58
+ };
59
+ };
60
+ shadowCatcherChoiceOffset: number;
61
+ shadowCatcherChoiceCount: number;
62
+ };
63
+ export declare function writeTraceLighting(views: TraceViews, data: {
64
+ environmentPmf: number;
65
+ choiceCount: number;
66
+ totalWeight: number;
67
+ lightWidth: number;
68
+ emissiveTexels: number;
69
+ shadowCatcherChoiceOffset: number;
70
+ shadowCatcherChoiceCount: number;
71
+ }): void;
72
+ export declare function packSceneAnalyticLights(lights: AnalyticLightState[], textureIndices: number[], pmfs: number[], profileOffset: (index: number) => number): Float32Array<ArrayBuffer>;
73
+ export {};