@meimu/mutracer 0.1.4 → 0.2.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 (529) hide show
  1. package/LICENSES/Classroom-CC0.txt +121 -0
  2. package/README.md +7 -7
  3. package/THIRD_PARTY_NOTICES.md +13 -8
  4. package/dist/assets/bvh.worker.js +1 -1
  5. package/dist/mutracer.umd.js +10421 -8363
  6. package/docs/api.md +202 -11
  7. package/docs/denoising.md +30 -15
  8. package/docs/materials.md +18 -27
  9. package/docs/performance.md +5 -2
  10. package/docs/progressive-rendering.md +32 -1
  11. package/docs/threejs.md +19 -10
  12. package/docs/updates.md +44 -2
  13. package/docs/viewer.md +41 -3
  14. package/lib/Display.d.ts +13 -2
  15. package/lib/Display.js +27 -6
  16. package/lib/Display.js.map +1 -1
  17. package/lib/Engine.d.ts +2 -0
  18. package/lib/Engine.js +52 -25
  19. package/lib/Engine.js.map +1 -1
  20. package/lib/Render.d.ts +44 -9
  21. package/lib/Render.js +115 -17
  22. package/lib/Render.js.map +1 -1
  23. package/lib/RenderLoop.d.ts +7 -1
  24. package/lib/RenderLoop.js +94 -13
  25. package/lib/RenderLoop.js.map +1 -1
  26. package/lib/main.d.ts +6 -3
  27. package/lib/main.js +1 -0
  28. package/lib/main.js.map +1 -1
  29. package/lib/math/access.d.ts +4 -0
  30. package/lib/math/access.js +10 -0
  31. package/lib/math/access.js.map +1 -0
  32. package/lib/math/mat3.d.ts +4 -0
  33. package/lib/math/mat3.js +54 -0
  34. package/lib/math/mat3.js.map +1 -0
  35. package/lib/math/mat4.d.ts +19 -0
  36. package/lib/math/mat4.js +413 -0
  37. package/lib/math/mat4.js.map +1 -0
  38. package/lib/math/storage.d.ts +6 -0
  39. package/lib/math/storage.js +22 -0
  40. package/lib/math/storage.js.map +1 -0
  41. package/lib/math/types.d.ts +3 -0
  42. package/lib/math/types.js +2 -0
  43. package/lib/math/types.js.map +1 -0
  44. package/lib/math/vec2.d.ts +13 -0
  45. package/lib/math/vec2.js +52 -0
  46. package/lib/math/vec2.js.map +1 -0
  47. package/lib/math/vec3.d.ts +23 -0
  48. package/lib/math/vec3.js +139 -0
  49. package/lib/math/vec3.js.map +1 -0
  50. package/lib/math.d.ts +5 -17
  51. package/lib/math.js +5 -55
  52. package/lib/math.js.map +1 -1
  53. package/lib/oidn.d.ts +1 -1
  54. package/lib/oidn.js +4 -2
  55. package/lib/oidn.js.map +1 -1
  56. package/lib/oidnBundledWeights.cdn.d.ts +2 -2
  57. package/lib/renderer/AovPrimitiveCache.d.ts +10 -0
  58. package/lib/renderer/AovPrimitiveCache.js +48 -0
  59. package/lib/renderer/AovPrimitiveCache.js.map +1 -0
  60. package/lib/renderer/Box3.d.ts +5 -0
  61. package/lib/renderer/Box3.js +9 -0
  62. package/lib/renderer/Box3.js.map +1 -0
  63. package/lib/renderer/GPUTraceQueue.d.ts +10 -0
  64. package/lib/renderer/GPUTraceQueue.js +31 -0
  65. package/lib/renderer/GPUTraceQueue.js.map +1 -0
  66. package/lib/renderer/MaterialData.d.ts +15 -0
  67. package/lib/renderer/MaterialData.js +61 -0
  68. package/lib/renderer/MaterialData.js.map +1 -0
  69. package/lib/renderer/MaterialTable.d.ts +11 -98
  70. package/lib/renderer/MaterialTable.js +34 -412
  71. package/lib/renderer/MaterialTable.js.map +1 -1
  72. package/lib/renderer/RenderingPipeline.d.ts +32 -13
  73. package/lib/renderer/RenderingPipeline.js +1 -17
  74. package/lib/renderer/RenderingPipeline.js.map +1 -1
  75. package/lib/renderer/TileRender.d.ts +0 -1
  76. package/lib/renderer/TileRender.js +14 -1
  77. package/lib/renderer/TileRender.js.map +1 -1
  78. package/lib/renderer/WGPUAov.d.ts +39 -0
  79. package/lib/renderer/WGPUAov.js +239 -0
  80. package/lib/renderer/WGPUAov.js.map +1 -0
  81. package/lib/renderer/WGPUBindlessMaterialData.d.ts +17 -0
  82. package/lib/renderer/WGPUBindlessMaterialData.js +48 -0
  83. package/lib/renderer/WGPUBindlessMaterialData.js.map +1 -0
  84. package/lib/renderer/WGPUBindlessTextures.d.ts +47 -0
  85. package/lib/renderer/WGPUBindlessTextures.js +180 -0
  86. package/lib/renderer/WGPUBindlessTextures.js.map +1 -0
  87. package/lib/renderer/WGPUBloomPass.js +17 -97
  88. package/lib/renderer/WGPUBloomPass.js.map +1 -1
  89. package/lib/renderer/WGPUComputePass.d.ts +1 -1
  90. package/lib/renderer/WGPUComputePass.js.map +1 -1
  91. package/lib/renderer/WGPUEnvMapDistribution.d.ts +12 -0
  92. package/lib/renderer/WGPUEnvMapDistribution.js +150 -0
  93. package/lib/renderer/WGPUEnvMapDistribution.js.map +1 -0
  94. package/lib/renderer/WGPUFullQuadPass.js +10 -9
  95. package/lib/renderer/WGPUFullQuadPass.js.map +1 -1
  96. package/lib/renderer/WGPUJNLMDenoiser.d.ts +1 -20
  97. package/lib/renderer/WGPUJNLMDenoiser.js +4 -267
  98. package/lib/renderer/WGPUJNLMDenoiser.js.map +1 -1
  99. package/lib/renderer/WGPURayTraceOutput.js +26 -17
  100. package/lib/renderer/WGPURayTraceOutput.js.map +1 -1
  101. package/lib/renderer/WGPURayTracePass.d.ts +36 -40
  102. package/lib/renderer/WGPURayTracePass.js +399 -548
  103. package/lib/renderer/WGPURayTracePass.js.map +1 -1
  104. package/lib/renderer/WGPURenderingPipeline.d.ts +5 -3
  105. package/lib/renderer/WGPURenderingPipeline.js +239 -60
  106. package/lib/renderer/WGPURenderingPipeline.js.map +1 -1
  107. package/lib/renderer/WGPUShaderCache.d.ts +2 -2
  108. package/lib/renderer/WGPUShaderCache.js +10 -5
  109. package/lib/renderer/WGPUShaderCache.js.map +1 -1
  110. package/lib/renderer/WGPUShaderCapabilities.d.ts +10 -0
  111. package/lib/renderer/WGPUShaderCapabilities.js +54 -0
  112. package/lib/renderer/WGPUShaderCapabilities.js.map +1 -0
  113. package/lib/renderer/WGPUSkyBaker.d.ts +13 -0
  114. package/lib/renderer/WGPUSkyBaker.js +85 -0
  115. package/lib/renderer/WGPUSkyBaker.js.map +1 -0
  116. package/lib/renderer/WebGLAov.d.ts +41 -0
  117. package/lib/renderer/WebGLAov.js +106 -0
  118. package/lib/renderer/WebGLAov.js.map +1 -0
  119. package/lib/renderer/WebGLFullQuadPass.d.ts +5 -3
  120. package/lib/renderer/WebGLFullQuadPass.js +18 -2
  121. package/lib/renderer/WebGLFullQuadPass.js.map +1 -1
  122. package/lib/renderer/WebGLJNLMDenoiser.d.ts +1 -1
  123. package/lib/renderer/WebGLJNLMDenoiser.js +83 -74
  124. package/lib/renderer/WebGLJNLMDenoiser.js.map +1 -1
  125. package/lib/renderer/WebGLRayTraceOutputPass.js +7 -4
  126. package/lib/renderer/WebGLRayTraceOutputPass.js.map +1 -1
  127. package/lib/renderer/WebGLRayTracePass.d.ts +12 -2
  128. package/lib/renderer/WebGLRayTracePass.js +83 -7
  129. package/lib/renderer/WebGLRayTracePass.js.map +1 -1
  130. package/lib/renderer/WebGLRenderingPipeline.js +116 -8
  131. package/lib/renderer/WebGLRenderingPipeline.js.map +1 -1
  132. package/lib/renderer/WebGLSkyBaker.d.ts +39 -0
  133. package/lib/renderer/WebGLSkyBaker.js +422 -0
  134. package/lib/renderer/WebGLSkyBaker.js.map +1 -0
  135. package/lib/renderer/WebGLSkySource.d.ts +9 -0
  136. package/lib/renderer/WebGLSkySource.js +28 -0
  137. package/lib/renderer/WebGLSkySource.js.map +1 -0
  138. package/lib/renderer/accumulationTarget.d.ts +5 -0
  139. package/lib/renderer/accumulationTarget.js.map +1 -1
  140. package/lib/renderer/aov.d.ts +42 -0
  141. package/lib/renderer/aov.js +50 -0
  142. package/lib/renderer/aov.js.map +1 -0
  143. package/lib/renderer/aovDisplay.d.ts +14 -0
  144. package/lib/renderer/aovDisplay.js +32 -0
  145. package/lib/renderer/aovDisplay.js.map +1 -0
  146. package/lib/renderer/aovScene.d.ts +21 -0
  147. package/lib/renderer/aovScene.js +139 -0
  148. package/lib/renderer/aovScene.js.map +1 -0
  149. package/lib/renderer/binnedSahBvh.js +2 -1
  150. package/lib/renderer/binnedSahBvh.js.map +1 -1
  151. package/lib/renderer/bvhAccel.d.ts +20 -10
  152. package/lib/renderer/bvhAccel.js +168 -58
  153. package/lib/renderer/bvhAccel.js.map +1 -1
  154. package/lib/renderer/bvhWorkerBuild.d.ts +1 -0
  155. package/lib/renderer/cameraSnapshot.js +2 -1
  156. package/lib/renderer/cameraSnapshot.js.map +1 -1
  157. package/lib/renderer/cameraUniform.d.ts +2 -0
  158. package/lib/renderer/cameraUniform.js +12 -0
  159. package/lib/renderer/cameraUniform.js.map +1 -0
  160. package/lib/renderer/committedScene.js +4 -0
  161. package/lib/renderer/committedScene.js.map +1 -1
  162. package/lib/renderer/denoiser.d.ts +3 -11
  163. package/lib/renderer/denoiser.js.map +1 -1
  164. package/lib/renderer/depthQuery.js +4 -1
  165. package/lib/renderer/depthQuery.js.map +1 -1
  166. package/lib/renderer/displacementPreparation.d.ts +11 -0
  167. package/lib/renderer/displacementPreparation.js +351 -0
  168. package/lib/renderer/displacementPreparation.js.map +1 -0
  169. package/lib/renderer/displacementRange.d.ts +1 -0
  170. package/lib/renderer/displacementRange.js +9 -0
  171. package/lib/renderer/displacementRange.js.map +1 -0
  172. package/lib/renderer/displayParityDiagnostics.d.ts +11 -0
  173. package/lib/renderer/displayParityDiagnostics.js +2 -0
  174. package/lib/renderer/displayParityDiagnostics.js.map +1 -0
  175. package/lib/renderer/envMapCreation.d.ts +9 -8
  176. package/lib/renderer/envMapCreation.js +36 -12
  177. package/lib/renderer/envMapCreation.js.map +1 -1
  178. package/lib/renderer/envMapDistribution.d.ts +12 -2
  179. package/lib/renderer/envMapDistribution.js +43 -34
  180. package/lib/renderer/envMapDistribution.js.map +1 -1
  181. package/lib/renderer/geometryBvhBounds.d.ts +4 -0
  182. package/lib/renderer/geometryBvhBounds.js +82 -0
  183. package/lib/renderer/geometryBvhBounds.js.map +1 -0
  184. package/lib/renderer/geometryUpdateState.d.ts +32 -0
  185. package/lib/renderer/geometryUpdateState.js +2 -0
  186. package/lib/renderer/geometryUpdateState.js.map +1 -0
  187. package/lib/renderer/geometryUpdates.d.ts +17 -9
  188. package/lib/renderer/geometryUpdates.js +92 -33
  189. package/lib/renderer/geometryUpdates.js.map +1 -1
  190. package/lib/renderer/glsl/aovDisplay.frag.d.ts +3 -0
  191. package/lib/renderer/glsl/aovDisplay.frag.js +54 -0
  192. package/lib/renderer/glsl/aovDisplay.frag.js.map +1 -0
  193. package/lib/renderer/glsl/aovReflectance.glsl.d.ts +2 -0
  194. package/lib/renderer/glsl/aovReflectance.glsl.js +87 -0
  195. package/lib/renderer/glsl/aovReflectance.glsl.js.map +1 -0
  196. package/lib/renderer/glsl/aovReflectanceSamples.glsl.d.ts +2 -0
  197. package/lib/renderer/glsl/aovReflectanceSamples.glsl.js +135 -0
  198. package/lib/renderer/glsl/aovReflectanceSamples.glsl.js.map +1 -0
  199. package/lib/renderer/glsl/aovTrace.frag.d.ts +2 -0
  200. package/lib/renderer/glsl/aovTrace.frag.js +121 -0
  201. package/lib/renderer/glsl/aovTrace.frag.js.map +1 -0
  202. package/lib/renderer/glsl/chunks/cameraRay.glsl.js +12 -12
  203. package/lib/renderer/glsl/chunks/envMap.glsl.js +80 -74
  204. package/lib/renderer/glsl/chunks/envMap.glsl.js.map +1 -1
  205. package/lib/renderer/glsl/chunks/intersect.glsl.js +437 -435
  206. package/lib/renderer/glsl/chunks/intersect.glsl.js.map +1 -1
  207. package/lib/renderer/glsl/chunks/materialBuffer.glsl.js +146 -145
  208. package/lib/renderer/glsl/chunks/materialBuffer.glsl.js.map +1 -1
  209. package/lib/renderer/glsl/chunks/openPbrBsdf.glsl.js +821 -821
  210. package/lib/renderer/glsl/chunks/openPbrBsdf.glsl.js.map +1 -1
  211. package/lib/renderer/glsl/chunks/rand.glsl.js +3 -3
  212. package/lib/renderer/glsl/chunks/random.glsl.js +6 -6
  213. package/lib/renderer/glsl/chunks/rayTraceCore.glsl.js +51 -51
  214. package/lib/renderer/glsl/chunks/rayTraceCore.glsl.js.map +1 -1
  215. package/lib/renderer/glsl/chunks/sampleLight.glsl.js +80 -80
  216. package/lib/renderer/glsl/chunks/sampleMaterial.glsl.js +108 -108
  217. package/lib/renderer/glsl/chunks/sampleMaterial.glsl.js.map +1 -1
  218. package/lib/renderer/glsl/chunks/sampleShadowCatcher.glsl.js +20 -17
  219. package/lib/renderer/glsl/chunks/sampleShadowCatcher.glsl.js.map +1 -1
  220. package/lib/renderer/glsl/chunks/sampling.glsl.js +93 -93
  221. package/lib/renderer/glsl/chunks/sobol.glsl.js +79 -79
  222. package/lib/renderer/glsl/chunks/textureLinear.glsl.js +5 -5
  223. package/lib/renderer/glsl/chunks/uvProjection.glsl.js +12 -12
  224. package/lib/renderer/glsl/chunks/uvProjection.glsl.js.map +1 -1
  225. package/lib/renderer/glsl/depthQuery.frag.js +7 -7
  226. package/lib/renderer/glsl/normalizeRayTraceOutput.frag.js +17 -9
  227. package/lib/renderer/glsl/normalizeRayTraceOutput.frag.js.map +1 -1
  228. package/lib/renderer/glsl/rayTrace.frag.js +191 -191
  229. package/lib/renderer/glsl/shadowCatcher.frag.js +25 -20
  230. package/lib/renderer/glsl/shadowCatcher.frag.js.map +1 -1
  231. package/lib/renderer/glsl/webglPipeline.frag.js +65 -60
  232. package/lib/renderer/glsl/webglPipeline.frag.js.map +1 -1
  233. package/lib/renderer/lightConstants.d.ts +10 -0
  234. package/lib/renderer/lightConstants.js +11 -0
  235. package/lib/renderer/lightConstants.js.map +1 -0
  236. package/lib/renderer/lightCore.d.ts +12 -0
  237. package/lib/renderer/lightCore.js +13 -0
  238. package/lib/renderer/lightCore.js.map +1 -0
  239. package/lib/renderer/lightSampling.d.ts +20 -17
  240. package/lib/renderer/lightSampling.js +123 -56
  241. package/lib/renderer/lightSampling.js.map +1 -1
  242. package/lib/renderer/lightsData.d.ts +21 -0
  243. package/lib/renderer/lightsData.js +192 -0
  244. package/lib/renderer/lightsData.js.map +1 -0
  245. package/lib/renderer/lightsUtil.d.ts +3 -26
  246. package/lib/renderer/lightsUtil.js +3 -153
  247. package/lib/renderer/lightsUtil.js.map +1 -1
  248. package/lib/renderer/materialBufferData.d.ts +70 -0
  249. package/lib/renderer/materialBufferData.js +2 -0
  250. package/lib/renderer/materialBufferData.js.map +1 -0
  251. package/lib/renderer/materialConstants.d.ts +11 -0
  252. package/lib/renderer/materialConstants.js +11 -0
  253. package/lib/renderer/materialConstants.js.map +1 -1
  254. package/lib/renderer/materialCore.d.ts +8 -0
  255. package/lib/renderer/materialCore.js +9 -0
  256. package/lib/renderer/materialCore.js.map +1 -0
  257. package/lib/renderer/materialEmission.d.ts +2 -2
  258. package/lib/renderer/materialEmission.js +3 -3
  259. package/lib/renderer/materialEmission.js.map +1 -1
  260. package/lib/renderer/materialLayout.d.ts +2 -101
  261. package/lib/renderer/materialLayout.js +110 -172
  262. package/lib/renderer/materialLayout.js.map +1 -1
  263. package/lib/renderer/materialLayoutSchema.d.ts +26 -0
  264. package/lib/renderer/materialLayoutSchema.js +172 -0
  265. package/lib/renderer/materialLayoutSchema.js.map +1 -0
  266. package/lib/renderer/materialParams.d.ts +69 -0
  267. package/lib/renderer/materialParams.js +272 -0
  268. package/lib/renderer/materialParams.js.map +1 -0
  269. package/lib/renderer/materialTextureSlots.d.ts +14 -324
  270. package/lib/renderer/materialTextureSlots.js +21 -8
  271. package/lib/renderer/materialTextureSlots.js.map +1 -1
  272. package/lib/renderer/materialTextures.d.ts +6 -0
  273. package/lib/renderer/{texturesFromMaterials.js → materialTextures.js} +1 -2
  274. package/lib/renderer/materialTextures.js.map +1 -0
  275. package/lib/renderer/mergeMeshesToGeometry.js +6 -147
  276. package/lib/renderer/mergeMeshesToGeometry.js.map +1 -1
  277. package/lib/renderer/meshInstances.d.ts +4 -21
  278. package/lib/renderer/meshInstances.js +10 -56
  279. package/lib/renderer/meshInstances.js.map +1 -1
  280. package/lib/renderer/oidnNetwork.d.ts +2 -2
  281. package/lib/renderer/oidnNetwork.js +1 -1
  282. package/lib/renderer/oidnNetwork.js.map +1 -1
  283. package/lib/renderer/openPbrEnergyLut.js +850 -846
  284. package/lib/renderer/openPbrEnergyLut.js.map +1 -1
  285. package/lib/renderer/ownedDenoiser.d.ts +9 -0
  286. package/lib/renderer/ownedDenoiser.js +2 -0
  287. package/lib/renderer/ownedDenoiser.js.map +1 -0
  288. package/lib/renderer/packedMeshInstances.d.ts +23 -0
  289. package/lib/renderer/packedMeshInstances.js +80 -0
  290. package/lib/renderer/packedMeshInstances.js.map +1 -0
  291. package/lib/renderer/prepareMeshBVH.d.ts +12 -47
  292. package/lib/renderer/prepareMeshBVH.js +21 -642
  293. package/lib/renderer/prepareMeshBVH.js.map +1 -1
  294. package/lib/renderer/proceduralEnvironmentPower.d.ts +3 -0
  295. package/lib/renderer/proceduralEnvironmentPower.js +8 -0
  296. package/lib/renderer/proceduralEnvironmentPower.js.map +1 -0
  297. package/lib/renderer/progressiveScheduler.d.ts +1 -0
  298. package/lib/renderer/progressiveScheduler.js +3 -0
  299. package/lib/renderer/progressiveScheduler.js.map +1 -1
  300. package/lib/renderer/renderPipeline.d.ts +3 -1
  301. package/lib/renderer/renderPipeline.js.map +1 -1
  302. package/lib/renderer/renderingLimits.d.ts +9 -0
  303. package/lib/renderer/renderingLimits.js +18 -0
  304. package/lib/renderer/renderingLimits.js.map +1 -0
  305. package/lib/renderer/sceneAssembly.d.ts +73 -0
  306. package/lib/renderer/sceneAssembly.js +109 -0
  307. package/lib/renderer/sceneAssembly.js.map +1 -0
  308. package/lib/renderer/sceneChangeCore.d.ts +39 -0
  309. package/lib/renderer/sceneChangeCore.js +307 -0
  310. package/lib/renderer/sceneChangeCore.js.map +1 -0
  311. package/lib/renderer/sceneChangeDetector.d.ts +3 -6
  312. package/lib/renderer/sceneChangeDetector.js +24 -150
  313. package/lib/renderer/sceneChangeDetector.js.map +1 -1
  314. package/lib/renderer/sceneLayoutSchema.d.ts +118 -0
  315. package/lib/renderer/sceneLayoutSchema.js +111 -0
  316. package/lib/renderer/sceneLayoutSchema.js.map +1 -0
  317. package/lib/renderer/sceneLightChanges.d.ts +3 -3
  318. package/lib/renderer/sceneLightChanges.js.map +1 -1
  319. package/lib/renderer/scenePreparation.d.ts +55 -0
  320. package/lib/renderer/scenePreparation.js +360 -0
  321. package/lib/renderer/scenePreparation.js.map +1 -0
  322. package/lib/renderer/scratchSampling.js +18 -18
  323. package/lib/renderer/scratchSampling.js.map +1 -1
  324. package/lib/renderer/shader.d.ts +2 -0
  325. package/lib/renderer/shader.js +2 -0
  326. package/lib/renderer/shader.js.map +1 -1
  327. package/lib/renderer/shaderCapabilities.d.ts +23 -0
  328. package/lib/renderer/shaderCapabilities.js +55 -0
  329. package/lib/renderer/shaderCapabilities.js.map +1 -0
  330. package/lib/renderer/shaderCapacity.d.ts +2 -0
  331. package/lib/renderer/shaderCapacity.js +5 -0
  332. package/lib/renderer/shaderCapacity.js.map +1 -0
  333. package/lib/renderer/skyModel.d.ts +9 -0
  334. package/lib/renderer/skyModel.js +10 -0
  335. package/lib/renderer/skyModel.js.map +1 -0
  336. package/lib/renderer/textureAtlas.d.ts +60 -0
  337. package/lib/renderer/textureAtlas.js +145 -0
  338. package/lib/renderer/textureAtlas.js.map +1 -0
  339. package/lib/renderer/textureAtlasPixels.d.ts +7 -0
  340. package/lib/renderer/textureAtlasPixels.js +68 -0
  341. package/lib/renderer/textureAtlasPixels.js.map +1 -0
  342. package/lib/renderer/util.d.ts +1 -1
  343. package/lib/renderer/util.js.map +1 -1
  344. package/lib/renderer/webgl.d.ts +9 -2
  345. package/lib/renderer/webgl.js +54 -9
  346. package/lib/renderer/webgl.js.map +1 -1
  347. package/lib/renderer/wgpuBindless.d.ts +26 -0
  348. package/lib/renderer/wgpuBindless.js +95 -0
  349. package/lib/renderer/wgpuBindless.js.map +1 -0
  350. package/lib/renderer/wgpuBindlessSource.d.ts +2 -0
  351. package/lib/renderer/wgpuBindlessSource.js +51 -0
  352. package/lib/renderer/wgpuBindlessSource.js.map +1 -0
  353. package/lib/renderer/wgpuMaterialConstants.d.ts +4 -0
  354. package/lib/renderer/wgpuMaterialConstants.js +52 -0
  355. package/lib/renderer/wgpuMaterialConstants.js.map +1 -0
  356. package/lib/renderer/wgpuSceneUniform.d.ts +42 -0
  357. package/lib/renderer/wgpuSceneUniform.js +125 -0
  358. package/lib/renderer/wgpuSceneUniform.js.map +1 -0
  359. package/lib/renderer/wgpuShaderSource.d.ts +15 -0
  360. package/lib/renderer/wgpuShaderSource.js +31 -0
  361. package/lib/renderer/wgpuShaderSource.js.map +1 -0
  362. package/lib/renderer/wgsl/aovDisplay.wgsl.d.ts +1 -0
  363. package/lib/renderer/wgsl/aovDisplay.wgsl.js +70 -0
  364. package/lib/renderer/wgsl/aovDisplay.wgsl.js.map +1 -0
  365. package/lib/renderer/wgsl/aovReflectance.wgsl.d.ts +2 -0
  366. package/lib/renderer/wgsl/aovReflectance.wgsl.js +98 -0
  367. package/lib/renderer/wgsl/aovReflectance.wgsl.js.map +1 -0
  368. package/lib/renderer/wgsl/aovReflectanceSamples.wgsl.d.ts +2 -0
  369. package/lib/renderer/wgsl/aovReflectanceSamples.wgsl.js +135 -0
  370. package/lib/renderer/wgsl/aovReflectanceSamples.wgsl.js.map +1 -0
  371. package/lib/renderer/wgsl/aovResolve.wgsl.d.ts +5 -0
  372. package/lib/renderer/wgsl/aovResolve.wgsl.js +38 -0
  373. package/lib/renderer/wgsl/aovResolve.wgsl.js.map +1 -0
  374. package/lib/renderer/wgsl/aovSnapshot.wgsl.d.ts +4 -0
  375. package/lib/renderer/wgsl/aovSnapshot.wgsl.js +21 -0
  376. package/lib/renderer/wgsl/aovSnapshot.wgsl.js.map +1 -0
  377. package/lib/renderer/wgsl/aovTrace.wgsl.d.ts +2 -0
  378. package/lib/renderer/wgsl/aovTrace.wgsl.js +115 -0
  379. package/lib/renderer/wgsl/aovTrace.wgsl.js.map +1 -0
  380. package/lib/renderer/wgsl/bloom.wgsl.d.ts +13 -0
  381. package/lib/renderer/wgsl/bloom.wgsl.js +92 -0
  382. package/lib/renderer/wgsl/bloom.wgsl.js.map +1 -0
  383. package/lib/renderer/wgsl/chunks/common.wgsl.js +4 -4
  384. package/lib/renderer/wgsl/chunks/envMap.wgsl.d.ts +1 -1
  385. package/lib/renderer/wgsl/chunks/envMap.wgsl.js +43 -37
  386. package/lib/renderer/wgsl/chunks/envMap.wgsl.js.map +1 -1
  387. package/lib/renderer/wgsl/chunks/intersect.wgsl.d.ts +13 -1
  388. package/lib/renderer/wgsl/chunks/intersect.wgsl.js +743 -706
  389. package/lib/renderer/wgsl/chunks/intersect.wgsl.js.map +1 -1
  390. package/lib/renderer/wgsl/chunks/intersectionAlpha.wgsl.js +16 -16
  391. package/lib/renderer/wgsl/chunks/intersectionAlpha.wgsl.js.map +1 -1
  392. package/lib/renderer/wgsl/chunks/materialBuffer.wgsl.d.ts +3 -1
  393. package/lib/renderer/wgsl/chunks/materialBuffer.wgsl.js +86 -83
  394. package/lib/renderer/wgsl/chunks/materialBuffer.wgsl.js.map +1 -1
  395. package/lib/renderer/wgsl/chunks/openPbrBsdf.wgsl.js +855 -857
  396. package/lib/renderer/wgsl/chunks/openPbrBsdf.wgsl.js.map +1 -1
  397. package/lib/renderer/wgsl/chunks/pdm_displacement.wgsl.js +139 -139
  398. package/lib/renderer/wgsl/chunks/rand.wgsl.js +3 -3
  399. package/lib/renderer/wgsl/chunks/rayTraceCore.wgsl.d.ts +2 -1
  400. package/lib/renderer/wgsl/chunks/rayTraceCore.wgsl.js +42 -32
  401. package/lib/renderer/wgsl/chunks/rayTraceCore.wgsl.js.map +1 -1
  402. package/lib/renderer/wgsl/chunks/sampleLight.wgsl.d.ts +1 -1
  403. package/lib/renderer/wgsl/chunks/sampleLight.wgsl.js +152 -148
  404. package/lib/renderer/wgsl/chunks/sampleLight.wgsl.js.map +1 -1
  405. package/lib/renderer/wgsl/chunks/sampleMaterial.wgsl.js +239 -232
  406. package/lib/renderer/wgsl/chunks/sampleMaterial.wgsl.js.map +1 -1
  407. package/lib/renderer/wgsl/chunks/sampleShadowCatcher.wgsl.d.ts +1 -1
  408. package/lib/renderer/wgsl/chunks/sampleShadowCatcher.wgsl.js +26 -13
  409. package/lib/renderer/wgsl/chunks/sampleShadowCatcher.wgsl.js.map +1 -1
  410. package/lib/renderer/wgsl/chunks/sampling.wgsl.js +91 -91
  411. package/lib/renderer/wgsl/chunks/shadowCatcherAccumulation.wgsl.d.ts +1 -1
  412. package/lib/renderer/wgsl/chunks/shadowCatcherAccumulation.wgsl.js +1 -0
  413. package/lib/renderer/wgsl/chunks/shadowCatcherAccumulation.wgsl.js.map +1 -1
  414. package/lib/renderer/wgsl/chunks/sobol.wgsl.js +83 -83
  415. package/lib/renderer/wgsl/chunks/uvProjection.wgsl.js +12 -12
  416. package/lib/renderer/wgsl/chunks/uvProjection.wgsl.js.map +1 -1
  417. package/lib/renderer/wgsl/compose.frag.wgsl.d.ts +8 -3
  418. package/lib/renderer/wgsl/compose.frag.wgsl.js +143 -118
  419. package/lib/renderer/wgsl/compose.frag.wgsl.js.map +1 -1
  420. package/lib/renderer/wgsl/customDenoise.wgsl.js +10 -10
  421. package/lib/renderer/wgsl/depthQuery.wgsl.js +7 -7
  422. package/lib/renderer/wgsl/jnlm.compute.d.ts +25 -0
  423. package/lib/renderer/wgsl/jnlm.compute.js +315 -0
  424. package/lib/renderer/wgsl/jnlm.compute.js.map +1 -0
  425. package/lib/renderer/wgsl/offlineAdaptive.compute.js +28 -28
  426. package/lib/renderer/wgsl/oidnAuxiliary.wgsl.d.ts +1 -0
  427. package/lib/renderer/wgsl/oidnAuxiliary.wgsl.js +17 -0
  428. package/lib/renderer/wgsl/oidnAuxiliary.wgsl.js.map +1 -0
  429. package/lib/renderer/wgsl/proceduralSky.compute.d.ts +1 -0
  430. package/lib/renderer/wgsl/proceduralSky.compute.js +198 -0
  431. package/lib/renderer/wgsl/proceduralSky.compute.js.map +1 -0
  432. package/lib/renderer/wgsl/rayTrace.compute.d.ts +17 -1
  433. package/lib/renderer/wgsl/rayTrace.compute.js +612 -393
  434. package/lib/renderer/wgsl/rayTrace.compute.js.map +1 -1
  435. package/lib/scene/Camera.js +7 -3
  436. package/lib/scene/Camera.js.map +1 -1
  437. package/lib/scene/EnvironmentLight.d.ts +5 -9
  438. package/lib/scene/EnvironmentLight.js +4 -14
  439. package/lib/scene/EnvironmentLight.js.map +1 -1
  440. package/lib/scene/EnvironmentLightState.d.ts +18 -0
  441. package/lib/scene/EnvironmentLightState.js +19 -0
  442. package/lib/scene/EnvironmentLightState.js.map +1 -0
  443. package/lib/scene/Geometry.d.ts +12 -6
  444. package/lib/scene/Geometry.js +37 -13
  445. package/lib/scene/Geometry.js.map +1 -1
  446. package/lib/scene/InstanceState.d.ts +39 -0
  447. package/lib/scene/InstanceState.js +77 -0
  448. package/lib/scene/InstanceState.js.map +1 -0
  449. package/lib/scene/InstancedMesh.d.ts +1 -1
  450. package/lib/scene/InstancedMesh.js +3 -0
  451. package/lib/scene/InstancedMesh.js.map +1 -1
  452. package/lib/scene/MaterialState.d.ts +209 -0
  453. package/lib/scene/MaterialState.js +231 -0
  454. package/lib/scene/MaterialState.js.map +1 -0
  455. package/lib/scene/Mesh.d.ts +4 -6
  456. package/lib/scene/Mesh.js +3 -11
  457. package/lib/scene/Mesh.js.map +1 -1
  458. package/lib/scene/MeshState.d.ts +20 -0
  459. package/lib/scene/MeshState.js +35 -0
  460. package/lib/scene/MeshState.js.map +1 -0
  461. package/lib/scene/OpenPBRMaterial.d.ts +7 -169
  462. package/lib/scene/OpenPBRMaterial.js +5 -223
  463. package/lib/scene/OpenPBRMaterial.js.map +1 -1
  464. package/lib/scene/PixelTexture.d.ts +6 -0
  465. package/lib/scene/PixelTexture.js +10 -0
  466. package/lib/scene/PixelTexture.js.map +1 -0
  467. package/lib/scene/ProceduralSky.d.ts +24 -0
  468. package/lib/scene/ProceduralSky.js +40 -0
  469. package/lib/scene/ProceduralSky.js.map +1 -0
  470. package/lib/scene/RectLight.d.ts +2 -13
  471. package/lib/scene/RectLight.js +3 -21
  472. package/lib/scene/RectLight.js.map +1 -1
  473. package/lib/scene/RectLightState.d.ts +31 -0
  474. package/lib/scene/RectLightState.js +26 -0
  475. package/lib/scene/RectLightState.js.map +1 -0
  476. package/lib/scene/Scene.d.ts +15 -4
  477. package/lib/scene/Scene.js.map +1 -1
  478. package/lib/scene/SceneNode.js +7 -6
  479. package/lib/scene/SceneNode.js.map +1 -1
  480. package/lib/scene/Texture.d.ts +10 -41
  481. package/lib/scene/Texture.js +4 -33
  482. package/lib/scene/Texture.js.map +1 -1
  483. package/lib/scene/TextureState.d.ts +35 -0
  484. package/lib/scene/TextureState.js +35 -0
  485. package/lib/scene/TextureState.js.map +1 -0
  486. package/lib/scene/attributeData.d.ts +4 -0
  487. package/lib/scene/attributeData.js +10 -0
  488. package/lib/scene/attributeData.js.map +1 -0
  489. package/lib/scene/lightState.d.ts +8 -0
  490. package/lib/scene/lightState.js +2 -0
  491. package/lib/scene/lightState.js.map +1 -0
  492. package/lib/scene/openPbrSchema.d.ts +7 -12
  493. package/lib/scene/openPbrSchema.js +273 -28
  494. package/lib/scene/openPbrSchema.js.map +1 -1
  495. package/lib/scene/skyParameters.d.ts +20 -0
  496. package/lib/scene/skyParameters.js +28 -0
  497. package/lib/scene/skyParameters.js.map +1 -0
  498. package/lib/scene/textureData.d.ts +9 -0
  499. package/lib/scene/textureData.js +2 -0
  500. package/lib/scene/textureData.js.map +1 -0
  501. package/lib/scene/texturePixels.d.ts +6 -0
  502. package/lib/scene/texturePixels.js +10 -0
  503. package/lib/scene/texturePixels.js.map +1 -0
  504. package/lib/settings/display.d.ts +33 -0
  505. package/lib/settings/display.js +7 -0
  506. package/lib/settings/display.js.map +1 -1
  507. package/lib/settings/render.d.ts +25 -3
  508. package/lib/settings/render.js +3 -1
  509. package/lib/settings/render.js.map +1 -1
  510. package/lib/tinybvh/tinybvh.wasm +0 -0
  511. package/lib/util/commonGeometry.js +7 -7
  512. package/lib/util/commonGeometry.js.map +1 -1
  513. package/lib/util/fromTHREE.d.ts +4 -1
  514. package/lib/util/fromTHREE.js +18 -5
  515. package/lib/util/fromTHREE.js.map +1 -1
  516. package/lib/util/geometry.js +42 -29
  517. package/lib/util/geometry.js.map +1 -1
  518. package/lib/util/loadRGBE.js +3 -4
  519. package/lib/util/loadRGBE.js.map +1 -1
  520. package/lib/util/studioLighting.d.ts +18 -0
  521. package/lib/util/studioLighting.js +36 -0
  522. package/lib/util/studioLighting.js.map +1 -0
  523. package/lib/version.d.ts +1 -1
  524. package/lib/version.js +1 -1
  525. package/lib/version.js.map +1 -1
  526. package/llms.txt +4 -0
  527. package/package.json +31 -5
  528. package/lib/renderer/texturesFromMaterials.d.ts +0 -6
  529. package/lib/renderer/texturesFromMaterials.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"bvhAccel.js","sourceRoot":"","sources":["../../src/renderer/bvhAccel.ts"],"names":[],"mappings":"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","sourcesContent":["import { readMeshInstance, type MeshInstances } from './meshInstances.js';\n// Bounding volume hierarchies of scene geometry (BLAS) and mesh instances\n// (TLAS), built with the binned SAH builder in ./binnedSahBvh and written\n// directly in the BVH2 layout read by the traversal shaders.\n\nimport Geometry, { Attribute } from '../scene/Geometry.js';\nimport { mat4, vec3 } from '../math.js';\nimport { Mat4Array } from '../math.js';\nimport { buildBinnedSahBvh, layoutBvh2 } from './binnedSahBvh.js';\n\nconst vec3Min = vec3.min;\nconst vec3Max = vec3.max;\n\nexport const INSTANCE_VEC4_STRIDE = 10;\nexport const INSTANCE_WORD_STRIDE = INSTANCE_VEC4_STRIDE * 4;\n\nexport type BvhLayout = 'bvh2' | 'bvh4' | 'bvh-gpu' | 'cwbvh';\n\nexport interface FlattendBVH {\n /** CPU builder that produced the GPU traversal data. */\n builder?: 'builtin' | 'tinybvh';\n buildSurfaceArea?: number;\n maxDepth: number;\n /** Largest leaf fan-out; used with maxDepth to size the traversal stack. */\n maxLeafPrimitives?: number;\n buffer: ArrayBuffer;\n /** Precomputed data without a layout field uses the legacy BVH2 layout. */\n layout?: BvhLayout;\n\n instancesBuffer?: ArrayBuffer;\n}\n\nconst BLAS_LAYOUT_SHIFT = 30;\nconst BLAS_OFFSET_MASK = 0x3fffffff;\nconst blasLayoutCodes: Record<BvhLayout, number> = {\n bvh2: 0,\n bvh4: 1,\n 'bvh-gpu': 2,\n cwbvh: 3\n};\n\nfunction encodeBlasOffset(offset: number, layout: BvhLayout) {\n if (!Number.isSafeInteger(offset) || offset < 0 || offset > BLAS_OFFSET_MASK) {\n throw new Error(`BLAS offset ${offset} exceeds the packed 30-bit range`);\n }\n return (offset | (blasLayoutCodes[layout] << BLAS_LAYOUT_SHIFT)) | 0;\n}\n\nexport class Box3 {\n min: vec3.Vec3Array;\n max: vec3.Vec3Array;\n\n constructor() {\n this.min = [Infinity, Infinity, Infinity];\n this.max = [-Infinity, -Infinity, -Infinity];\n }\n}\n\nfunction unionBounds(bounds: Box3, a: Box3, b: Box3) {\n vec3Min(bounds.min, a.min, b.min);\n vec3Max(bounds.max, a.max, b.max);\n return bounds;\n}\n\nexport interface TLASInstance {\n blasIndex: number;\n bounds: Box3;\n transform: Mat4Array;\n materialsIndices: number[];\n displacementScale?: number;\n color?: [number, number, number];\n}\n\nexport interface BLASInstance {\n bvh: FlattendBVH;\n trainglesCount: number;\n verticesCount: number;\n}\n\n// Keep a bounded specialization range for unusually deep hierarchies while\n// allowing large TinyBVH converted builds (for example Mustang_Red requires 51).\n// WebGPU still specializes each TLAS/BLAS stack to the scene's exact need.\nexport const MAX_TRAVERSAL_STACK_SIZE = 64;\n\nexport interface TraversalStackSizes {\n tlas: number;\n blas: number;\n}\n\n/**\n * Sizes independent TLAS and BLAS stacks for the nested WebGPU traversal.\n * A TLAS leaf is consumed in place, so its instance fan-out no longer needs\n * pending stack entries. TinyBVH converted layouts store their exact stack\n * requirement in maxDepth; BVH2 stores its tree depth.\n */\nexport function getTraversalStackSizes(\n tlas: FlattendBVH,\n blases: readonly BLASInstance[]\n): TraversalStackSizes {\n return {\n tlas: Math.min(\n MAX_TRAVERSAL_STACK_SIZE,\n Math.max(1, tlas.maxDepth)\n ),\n blas: Math.min(\n MAX_TRAVERSAL_STACK_SIZE,\n blases.reduce(\n (stackSize, blas) => Math.max(stackSize, blas.bvh.maxDepth),\n 1\n )\n )\n };\n}\n\nexport function concatBLASBuffers(blases: BLASInstance[]): ArrayBuffer {\n const buffers = blases.map((blas) => new Float32Array(blas.bvh.buffer));\n const totalLength = buffers.reduce((sum, buffer) => sum + buffer.length, 0);\n const result = new Float32Array(totalLength);\n let offset = 0;\n for (let i = 0; i < blases.length; i++) {\n result.set(buffers[i], offset);\n offset += buffers[i].length;\n }\n return result.buffer;\n}\n\nfunction packH(minH: number, maxH: number): number {\n const roundedMinH = Math.min(Math.floor(minH * 255), 255);\n const roundedMaxH =\n Math.abs(maxH - minH) < 1e-6\n ? roundedMinH\n : Math.min(Math.ceil(maxH * 255), 255);\n return (roundedMinH << 8) + roundedMaxH;\n}\n\n/** Writes min and max of a triangle, or of its displacement prism, to out. */\nfunction triangleBounds(\n positions: ArrayLike<number>,\n stride: number,\n normals: ArrayLike<number> | undefined,\n normalStride: number,\n i0: number,\n i1: number,\n i2: number,\n minHeight: number,\n maxHeight: number,\n out: Float32Array,\n o: number\n) {\n let minX = Infinity, minY = Infinity, minZ = Infinity;\n let maxX = -Infinity, maxY = -Infinity, maxZ = -Infinity;\n for (let corner = 0; corner < 3; corner++) {\n const vertex = corner === 0 ? i0 : corner === 1 ? i1 : i2;\n const p = vertex * stride;\n const x = positions[p], y = positions[p + 1], z = positions[p + 2];\n if (normals) {\n const n = vertex * normalStride;\n let nx = normals[n], ny = normals[n + 1], nz = normals[n + 2];\n const length = Math.sqrt(nx * nx + ny * ny + nz * nz);\n if (length > 0) {\n nx /= length; ny /= length; nz /= length;\n }\n for (let side = 0; side < 2; side++) {\n const h = side === 0 ? minHeight : maxHeight;\n const px = x + nx * h, py = y + ny * h, pz = z + nz * h;\n minX = Math.min(minX, px); minY = Math.min(minY, py); minZ = Math.min(minZ, pz);\n maxX = Math.max(maxX, px); maxY = Math.max(maxY, py); maxZ = Math.max(maxZ, pz);\n }\n } else {\n minX = Math.min(minX, x); minY = Math.min(minY, y); minZ = Math.min(minZ, z);\n maxX = Math.max(maxX, x); maxY = Math.max(maxY, y); maxZ = Math.max(maxZ, z);\n }\n }\n out[o] = minX; out[o + 1] = minY; out[o + 2] = minZ;\n out[o + 3] = maxX; out[o + 4] = maxY; out[o + 5] = maxZ;\n return isFinite(minX) && isFinite(minY) && isFinite(minZ) &&\n isFinite(maxX) && isFinite(maxY) && isFinite(maxZ);\n}\n\nfunction emptyBvh(isTLAS: boolean): FlattendBVH {\n return {\n builder: 'builtin',\n buildSurfaceArea: isTLAS ? undefined : 0,\n maxDepth: 0,\n maxLeafPrimitives: 0,\n buffer: new ArrayBuffer(0),\n layout: 'bvh2',\n instancesBuffer: isTLAS ? new ArrayBuffer(0) : undefined\n };\n}\n\n/** BLAS without triangles. */\nexport function emptyBLAS() {\n return emptyBvh(false);\n}\n\n/**\n * Builds a BVH2 BLAS over the geometry's triangles. Triangles with\n * non-finite bounds are skipped. With per-triangle displacement ranges\n * (min, max pairs scaled by displacementScale), leaves bound the\n * displacement prisms along the vertex normals and store the packed ranges.\n */\nexport function buildBLAS(\n geometry: Pick<Geometry, 'position' | 'indices' | 'normal'>,\n displacementScale = 0,\n trianglesDisplacement?: Float32Array\n): FlattendBVH {\n const position = geometry.position;\n const indices = geometry.indices?.array;\n if (!position || !indices || !Attribute.getCount(position)) {\n return emptyBvh(false);\n }\n const positions = position.array;\n const stride = position.itemSize;\n const normal = trianglesDisplacement ? geometry.normal : undefined;\n const normals = normal?.array;\n const normalStride = normal?.itemSize ?? 0;\n const triangleCount = Math.floor(indices.length / 3);\n const aabbs = new Float32Array(triangleCount * 6);\n const triangles = new Uint32Array(triangleCount);\n let count = 0;\n for (let t = 0; t < triangleCount; t++) {\n let minHeight = 0, maxHeight = 0;\n if (normals) {\n minHeight = trianglesDisplacement![t * 2] * displacementScale;\n maxHeight = trianglesDisplacement![t * 2 + 1] * displacementScale;\n if (isNaN(minHeight) || isNaN(maxHeight)) {\n minHeight = 0;\n maxHeight = displacementScale;\n }\n }\n if (triangleBounds(\n positions, stride, normals, normalStride,\n indices[t * 3], indices[t * 3 + 1], indices[t * 3 + 2],\n minHeight, maxHeight, aabbs, count * 6\n )) {\n triangles[count++] = t;\n }\n }\n if (!count) return emptyBvh(false);\n\n const bvh = buildBinnedSahBvh(aabbs, count);\n const { order, offsets, vec4Count, maxDepth, maxLeafPrimitives } = layoutBvh2(bvh);\n const { bounds, leftFirst, primCount, primIndices } = bvh;\n const buffer = new ArrayBuffer(vec4Count * 16);\n const floats = new Float32Array(buffer);\n const ints = new Int32Array(buffer);\n let buildSurfaceArea = 0;\n for (let k = 0; k < order.length; k++) {\n const node = order[k];\n const o = offsets[node] * 4, b = node * 6;\n floats[o] = bounds[b]; floats[o + 1] = bounds[b + 1]; floats[o + 2] = bounds[b + 2];\n floats[o + 4] = bounds[b + 3]; floats[o + 5] = bounds[b + 4]; floats[o + 6] = bounds[b + 5];\n const x = bounds[b + 3] - bounds[b], y = bounds[b + 4] - bounds[b + 1], z = bounds[b + 5] - bounds[b + 2];\n buildSurfaceArea += 2 * (x * z + x * y + z * y);\n const prims = primCount[node];\n if (!prims) {\n // Pointer to the second child.\n ints[o + 3] = offsets[leftFirst[node] + 1];\n continue;\n }\n // Negative signals to the shader that this node is a leaf.\n ints[o + 3] = -prims;\n for (let i = 0; i < prims; i++) {\n const t = triangles[primIndices[leftFirst[node] + i]];\n const e = o + 8 + i * 4;\n ints[e] = indices[t * 3];\n ints[e + 1] = indices[t * 3 + 1];\n ints[e + 2] = indices[t * 3 + 2];\n // Pack minH, maxH to one channel.\n ints[e + 3] = trianglesDisplacement\n ? packH(trianglesDisplacement[t * 2], trianglesDisplacement[t * 2 + 1])\n : 0;\n }\n }\n\n return {\n builder: 'builtin',\n buildSurfaceArea,\n maxDepth,\n maxLeafPrimitives,\n buffer,\n layout: 'bvh2'\n };\n}\n\ninterface BlasPlacement {\n blasOffsets: number[];\n vertexOffsets: number[];\n layouts: BvhLayout[];\n}\n\nfunction getBlasPlacement(blases: BLASInstance[]): BlasPlacement {\n let blasOffset = 0;\n let vertexOffset = 0;\n const placement: BlasPlacement = { blasOffsets: [], vertexOffsets: [], layouts: [] };\n blases.forEach((blas) => {\n placement.blasOffsets.push(blasOffset);\n placement.vertexOffsets.push(vertexOffset);\n placement.layouts.push(blas.bvh.layout ?? 'bvh2');\n blasOffset += blas.bvh.buffer.byteLength / 16;\n vertexOffset += blas.verticesCount;\n });\n return placement;\n}\n\n/** Writes the instance's world bounds, padded by its displacement, to out. */\nfunction instanceBounds(instance: TLASInstance, out: Float32Array, o: number) {\n const { min, max } = instance.bounds;\n let padX = 0, padY = 0, padZ = 0;\n const displacementScale = instance.displacementScale;\n if (displacementScale) {\n const m = instance.transform;\n padX = Math.max(0, displacementScale * Math.hypot(m[0], m[1], m[2]));\n padY = Math.max(0, displacementScale * Math.hypot(m[4], m[5], m[6]));\n padZ = Math.max(0, displacementScale * Math.hypot(m[8], m[9], m[10]));\n }\n out[o] = min[0] - padX; out[o + 1] = min[1] - padY; out[o + 2] = min[2] - padZ;\n out[o + 3] = max[0] + padX; out[o + 4] = max[1] + padY; out[o + 5] = max[2] + padZ;\n}\n\nfunction writeInstanceRecord(\n instanceInts: Int32Array,\n instanceFloats: Float32Array,\n targetIndex: number,\n instance: TLASInstance,\n placement: BlasPlacement\n) {\n const offset = targetIndex * INSTANCE_WORD_STRIDE;\n instanceInts[offset] = encodeBlasOffset(\n placement.blasOffsets[instance.blasIndex],\n placement.layouts[instance.blasIndex]\n );\n instanceInts[offset + 1] = placement.vertexOffsets[instance.blasIndex];\n instanceInts[offset + 2] = instance.materialsIndices[0] || 0;\n instanceFloats[offset + 3] = instance.displacementScale || 0;\n instanceFloats.set(instance.color ?? [1, 1, 1], offset + 36);\n instanceFloats[offset + 39] = 0;\n const inverse = mat4.invert(mat4.create(), instance.transform);\n for (let i = 0; i < 16; i++) {\n instanceFloats[offset + 4 + i] = inverse[i];\n instanceFloats[offset + 20 + i] = instance.transform[i];\n }\n}\n\n/**\n * Builds a BVH2 TLAS over the instances. Leaves store\n * (instance record, BLAS offset, source instance index, 0); instance records\n * are written in leaf order to instancesBuffer.\n */\nexport function buildTLAS(\n instances: MeshInstances,\n blases: BLASInstance[]\n): FlattendBVH {\n if (!instances.length) return emptyBvh(true);\n const placement = getBlasPlacement(blases);\n const aabbs = new Float32Array(instances.length * 6);\n for (let i = 0; i < instances.length; i++) {\n instanceBounds(readMeshInstance(instances, i), aabbs, i * 6);\n }\n\n const bvh = buildBinnedSahBvh(aabbs, instances.length);\n const { order, offsets, vec4Count, maxDepth, maxLeafPrimitives } = layoutBvh2(bvh);\n const { bounds, leftFirst, primCount, primIndices } = bvh;\n const buffer = new ArrayBuffer(vec4Count * 16);\n const floats = new Float32Array(buffer);\n const ints = new Int32Array(buffer);\n const instancesBuffer = new ArrayBuffer(instances.length * INSTANCE_WORD_STRIDE * 4);\n const instanceInts = new Int32Array(instancesBuffer);\n const instanceFloats = new Float32Array(instancesBuffer);\n let target = 0;\n for (let k = 0; k < order.length; k++) {\n const node = order[k];\n const o = offsets[node] * 4, b = node * 6;\n floats[o] = bounds[b]; floats[o + 1] = bounds[b + 1]; floats[o + 2] = bounds[b + 2];\n floats[o + 4] = bounds[b + 3]; floats[o + 5] = bounds[b + 4]; floats[o + 6] = bounds[b + 5];\n const prims = primCount[node];\n if (!prims) {\n ints[o + 3] = offsets[leftFirst[node] + 1];\n continue;\n }\n ints[o + 3] = -prims;\n for (let i = 0; i < prims; i++) {\n const source = primIndices[leftFirst[node] + i];\n const instance = readMeshInstance(instances, source);\n const e = o + 8 + i * 4;\n ints[e] = target;\n ints[e + 1] = placement.blasOffsets[instance.blasIndex];\n // Keep the source instance index in the otherwise-unused z lane so\n // the TLAS can be refitted without rebuilding its topology.\n ints[e + 2] = source;\n writeInstanceRecord(instanceInts, instanceFloats, target, instance, placement);\n target++;\n }\n }\n\n return {\n builder: 'builtin',\n maxDepth,\n maxLeafPrimitives,\n buffer,\n layout: 'bvh2',\n instancesBuffer\n };\n}\n\nexport interface TLASRefitRange {\n offset: number;\n size: number;\n}\n\nexport interface TLASRefitResult {\n tlasRanges: TLASRefitRange[];\n instanceRanges: TLASRefitRange[];\n}\n\ninterface TLASRefitMetadata {\n parent: Map<number, number>;\n depth: Map<number, number>;\n leavesBySource: Map<number, Set<number>>;\n instancesByLeaf: Map<number, { source: number; target: number }[]>;\n}\n\nconst tlasRefitMetadata = new WeakMap<FlattendBVH, TLASRefitMetadata>();\n\nfunction getTLASRefitMetadata(flattened: FlattendBVH, ints: Int32Array) {\n const cached = tlasRefitMetadata.get(flattened);\n if (cached) return cached;\n const metadata: TLASRefitMetadata = {\n parent: new Map(),\n depth: new Map(),\n leavesBySource: new Map(),\n instancesByLeaf: new Map()\n };\n const visit = (index: number, parent: number | undefined, depth: number) => {\n metadata.depth.set(index, depth);\n if (parent != null) metadata.parent.set(index, parent);\n const base = index * 4;\n const primitiveCountOrChild = ints[base + 3];\n if (primitiveCountOrChild >= 0) {\n visit(index + 2, index, depth + 1);\n visit(primitiveCountOrChild, index, depth + 1);\n return;\n }\n const entries: { source: number; target: number }[] = [];\n for (let i = 0; i < -primitiveCountOrChild; i++) {\n const primitiveOffset = base + 8 + i * 4;\n const target = ints[primitiveOffset];\n const source = ints[primitiveOffset + 2];\n entries.push({ source, target });\n const leaves = metadata.leavesBySource.get(source) ?? new Set<number>();\n leaves.add(index);\n metadata.leavesBySource.set(source, leaves);\n }\n metadata.instancesByLeaf.set(index, entries);\n };\n visit(0, undefined, 0);\n tlasRefitMetadata.set(flattened, metadata);\n return metadata;\n}\n\nexport function mergeRefitRanges(ranges: TLASRefitRange[]) {\n const sorted = ranges\n .filter(({ size }) => size > 0)\n .sort((left, right) => left.offset - right.offset);\n const merged: TLASRefitRange[] = [];\n for (const range of sorted) {\n const previous = merged[merged.length - 1];\n if (previous && range.offset <= previous.offset + previous.size) {\n previous.size = Math.max(\n previous.size,\n range.offset + range.size - previous.offset\n );\n } else {\n merged.push({ ...range });\n }\n }\n return merged;\n}\n\nexport function refitTLAS(\n flattened: FlattendBVH,\n instances: MeshInstances,\n blases: BLASInstance[],\n dirtySourceIndices?: ReadonlySet<number>\n): TLASRefitResult {\n if (!flattened.instancesBuffer || !flattened.buffer.byteLength) {\n return { tlasRanges: [], instanceRanges: [] };\n }\n const floats = new Float32Array(flattened.buffer);\n const ints = new Int32Array(flattened.buffer);\n const instanceFloats = new Float32Array(flattened.instancesBuffer);\n const instanceInts = new Int32Array(flattened.instancesBuffer);\n\n const placement = getBlasPlacement(blases);\n const scratch = new Float32Array(6);\n\n function writeInstance(targetIndex: number, sourceIndex: number) {\n writeInstanceRecord(instanceInts, instanceFloats, targetIndex, readMeshInstance(instances, sourceIndex), placement);\n }\n\n function addInstanceBounds(bounds: Box3, instance: TLASInstance) {\n instanceBounds(instance, scratch, 0);\n bounds.min[0] = Math.min(bounds.min[0], scratch[0]);\n bounds.min[1] = Math.min(bounds.min[1], scratch[1]);\n bounds.min[2] = Math.min(bounds.min[2], scratch[2]);\n bounds.max[0] = Math.max(bounds.max[0], scratch[3]);\n bounds.max[1] = Math.max(bounds.max[1], scratch[4]);\n bounds.max[2] = Math.max(bounds.max[2], scratch[5]);\n }\n\n function writeNodeBounds(index: number, bounds: Box3) {\n const base = index * 4;\n floats[base] = bounds.min[0];\n floats[base + 1] = bounds.min[1];\n floats[base + 2] = bounds.min[2];\n floats[base + 4] = bounds.max[0];\n floats[base + 5] = bounds.max[1];\n floats[base + 6] = bounds.max[2];\n }\n\n function readNodeBounds(index: number) {\n const base = index * 4;\n const bounds = new Box3();\n vec3.set(bounds.min, floats[base], floats[base + 1], floats[base + 2]);\n vec3.set(\n bounds.max,\n floats[base + 4],\n floats[base + 5],\n floats[base + 6]\n );\n return bounds;\n }\n\n function refitNode(index: number): Box3 {\n const base = index * 4;\n const bounds = new Box3();\n const primitiveCountOrChild = ints[base + 3];\n if (primitiveCountOrChild >= 0) {\n const left = refitNode(index + 2);\n const right = refitNode(primitiveCountOrChild);\n unionBounds(bounds, left, right);\n } else {\n for (let i = 0; i < -primitiveCountOrChild; i++) {\n const primitiveOffset = base + 8 + i * 4;\n const targetInstance = ints[primitiveOffset];\n const sourceInstance = ints[primitiveOffset + 2];\n const instance = readMeshInstance(instances, sourceInstance);\n if (!instance) continue;\n addInstanceBounds(bounds, instance);\n writeInstance(targetInstance, sourceInstance);\n }\n }\n writeNodeBounds(index, bounds);\n return bounds;\n }\n\n if (!dirtySourceIndices) {\n refitNode(0);\n return {\n tlasRanges: [{ offset: 0, size: flattened.buffer.byteLength }],\n instanceRanges: [\n { offset: 0, size: flattened.instancesBuffer.byteLength }\n ]\n };\n }\n\n const metadata = getTLASRefitMetadata(flattened, ints);\n const dirtyLeaves = new Set<number>();\n const instanceRanges: TLASRefitRange[] = [];\n for (const source of dirtySourceIndices) {\n const leaves = metadata.leavesBySource.get(source);\n if (!leaves) continue;\n leaves.forEach((leaf) => dirtyLeaves.add(leaf));\n for (const leaf of leaves) {\n for (const entry of metadata.instancesByLeaf.get(leaf) ?? []) {\n if (entry.source !== source) continue;\n writeInstance(entry.target, source);\n instanceRanges.push({ offset: entry.target * INSTANCE_WORD_STRIDE * 4, size: INSTANCE_WORD_STRIDE * 4 });\n }\n }\n }\n\n const dirtyNodes = new Set<number>();\n for (const leaf of dirtyLeaves) {\n const bounds = new Box3();\n for (const { source } of metadata.instancesByLeaf.get(leaf) ?? []) {\n const instance = readMeshInstance(instances, source);\n if (instance) addInstanceBounds(bounds, instance);\n }\n writeNodeBounds(leaf, bounds);\n dirtyNodes.add(leaf);\n let parent = metadata.parent.get(leaf);\n while (parent != null) {\n dirtyNodes.add(parent);\n parent = metadata.parent.get(parent);\n }\n }\n\n const internalNodes = [...dirtyNodes]\n .filter((index) => ints[index * 4 + 3] >= 0)\n .sort(\n (left, right) =>\n (metadata.depth.get(right) ?? 0) - (metadata.depth.get(left) ?? 0)\n );\n for (const index of internalNodes) {\n const right = ints[index * 4 + 3];\n const bounds = new Box3();\n unionBounds(bounds, readNodeBounds(index + 2), readNodeBounds(right));\n writeNodeBounds(index, bounds);\n }\n\n return {\n tlasRanges: mergeRefitRanges(\n [...dirtyNodes].map((index) => ({ offset: index * 16, size: 32 }))\n ),\n instanceRanges: mergeRefitRanges(instanceRanges)\n };\n}\n\n/** Dynamic BLASes rebuild when their total node surface area doubles. */\nexport const DYNAMIC_BLAS_REBUILD_RATIO = 2;\n\ninterface BlasRefitData {\n /** Per leaf (vec4 index): offset of its vertex list in vertices. */\n offsets: Int32Array;\n /** Per leaf: unique vertex count followed by the vertices. */\n vertices: Uint32Array;\n /** Node indices (vec4 units) with descendants before their ancestors. */\n postorder: Int32Array;\n}\n\n// Leaf topology is immutable between BLAS builds. Deduplicate shared triangle\n// corners once so deformation refits read each leaf's vertex only once.\nconst blasRefitData = new WeakMap<ArrayBuffer, BlasRefitData>();\n\nfunction getBlasRefitData(buffer: ArrayBuffer): BlasRefitData {\n const cached = blasRefitData.get(buffer);\n if (cached) return cached;\n const ints = new Int32Array(buffer);\n const offsets = new Int32Array(ints.length / 4);\n const vertices: number[] = [];\n const preorder: number[] = [];\n const stack = [0];\n while (stack.length) {\n const index = stack.pop()!;\n preorder.push(index);\n const base = index * 4;\n const child = ints[base + 3];\n if (child >= 0) {\n stack.push(child, index + 2);\n continue;\n }\n offsets[index] = vertices.length;\n const countSlot = vertices.length;\n vertices.push(0);\n for (let i = 0; i < -child; i++) {\n for (let j = 0; j < 3; j++) {\n const vertex = ints[base + 8 + i * 4 + j];\n let seen = false;\n for (let k = countSlot + 1; k < vertices.length; k++) {\n if (vertices[k] === vertex) { seen = true; break; }\n }\n if (!seen) vertices.push(vertex);\n }\n }\n vertices[countSlot] = vertices.length - countSlot - 1;\n }\n const data = {\n offsets,\n vertices: new Uint32Array(vertices),\n postorder: new Int32Array(preorder.reverse())\n };\n blasRefitData.set(buffer, data);\n return data;\n}\n\n/** Refit a BVH2 BLAS after vertex deformation, preserving topology. */\nexport function refitBLAS(\n flattened: FlattendBVH,\n geometry: Pick<Geometry, 'position'> & Partial<Pick<Geometry, 'dynamic'>>\n) {\n if ((flattened.layout ?? 'bvh2') !== 'bvh2' || !flattened.buffer.byteLength) {\n return false;\n }\n const { offsets, vertices, postorder } = getBlasRefitData(flattened.buffer);\n const floats = new Float32Array(flattened.buffer), ints = new Int32Array(flattened.buffer);\n const positions = geometry.position.array, stride = geometry.position.itemSize;\n if (flattened.buildSurfaceArea == null) {\n let area = 0;\n for (const index of postorder) {\n const b = index * 4;\n const x = floats[b + 4] - floats[b], y = floats[b + 5] - floats[b + 1], z = floats[b + 6] - floats[b + 2];\n area += 2 * (x * z + x * y + z * y);\n }\n flattened.buildSurfaceArea = area;\n }\n let area = 0;\n for (let node = 0; node < postorder.length; node++) {\n const index = postorder[node], base = index * 4, child = ints[base + 3];\n let minX = Infinity, minY = Infinity, minZ = Infinity;\n let maxX = -Infinity, maxY = -Infinity, maxZ = -Infinity;\n if (child >= 0) {\n const left = base + 8, right = child * 4;\n minX = Math.min(floats[left], floats[right]); minY = Math.min(floats[left + 1], floats[right + 1]); minZ = Math.min(floats[left + 2], floats[right + 2]);\n maxX = Math.max(floats[left + 4], floats[right + 4]); maxY = Math.max(floats[left + 5], floats[right + 5]); maxZ = Math.max(floats[left + 6], floats[right + 6]);\n } else {\n const start = offsets[index], end = start + 1 + vertices[start];\n for (let i = start + 1; i < end; i++) {\n const offset = vertices[i] * stride;\n const x = positions[offset], y = positions[offset + 1], z = positions[offset + 2];\n if (!isFinite(x) || !isFinite(y) || !isFinite(z)) continue;\n minX = Math.min(minX, x); minY = Math.min(minY, y); minZ = Math.min(minZ, z);\n maxX = Math.max(maxX, x); maxY = Math.max(maxY, y); maxZ = Math.max(maxZ, z);\n }\n }\n const x = maxX - minX, y = maxY - minY, z = maxZ - minZ;\n area += 2 * (x * z + x * y + z * y);\n floats[base] = minX; floats[base + 1] = minY; floats[base + 2] = minZ;\n floats[base + 4] = maxX; floats[base + 5] = maxY; floats[base + 6] = maxZ;\n }\n return !geometry.dynamic || !(area > flattened.buildSurfaceArea * DYNAMIC_BLAS_REBUILD_RATIO);\n}\n\n/** Writes only instance colors; TLAS topology and bounds remain untouched. */\nexport function updateTLASInstanceColors(flattened: FlattendBVH, instances: MeshInstances, dirty: ReadonlySet<number>): TLASRefitRange[] {\n if (!flattened.instancesBuffer || !flattened.buffer.byteLength || !dirty.size) return [];\n const metadata = getTLASRefitMetadata(flattened, new Int32Array(flattened.buffer));\n const floats = new Float32Array(flattened.instancesBuffer);\n const ranges: TLASRefitRange[] = [];\n for (const source of dirty) for (const leaf of metadata.leavesBySource.get(source) ?? []) {\n for (const entry of metadata.instancesByLeaf.get(leaf) ?? []) {\n if (entry.source !== source) continue;\n const offset = entry.target * INSTANCE_WORD_STRIDE + 36;\n floats.set(readMeshInstance(instances, source).color ?? [1, 1, 1], offset);\n ranges.push({offset: offset * 4, size: 16});\n }\n }\n return mergeRefitRanges(ranges);\n}\n"]}
1
+ {"version":3,"file":"bvhAccel.js","sourceRoot":"","sources":["../../src/renderer/bvhAccel.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,mBAAmB,EAAsB,MAAM,0BAA0B,CAAC;AAMrG,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AACxC,OAAO,EAAE,iBAAiB,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAElE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,eAAe,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AAC1F,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAC,yBAAyB,EAAC,MAAM,wBAAwB,CAAC;AACjE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEjC,MAAM,CAAC,MAAM,oBAAoB,GAAG,EAAE,CAAC;AACvC,MAAM,CAAC,MAAM,oBAAoB,GAAG,oBAAoB,GAAG,CAAC,CAAC;AAoB7D,MAAM,iBAAiB,GAAG,EAAE,CAAC;AAC7B,MAAM,gBAAgB,GAAG,UAAU,CAAC;AACpC,MAAM,eAAe,GAA8B;IACjD,IAAI,EAAE,CAAC;IACP,IAAI,EAAE,CAAC;IACP,SAAS,EAAE,CAAC;IACZ,KAAK,EAAE,CAAC;CACT,CAAC;AAEF,SAAS,gBAAgB,CAAC,MAAc,EAAE,MAAiB;IACzD,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,MAAM,GAAG,CAAC,IAAI,MAAM,GAAG,gBAAgB,EAAE,CAAC;QAC7E,MAAM,IAAI,KAAK,CAAC,eAAe,MAAM,kCAAkC,CAAC,CAAC;IAC3E,CAAC;IACD,OAAO,CAAC,MAAM,GAAG,CAAC,eAAe,CAAC,MAAM,CAAC,IAAI,iBAAiB,CAAC,CAAC,GAAG,CAAC,CAAC;AACvE,CAAC;AAED,SAAS,WAAW,CAAC,MAAY,EAAE,CAAO,EAAE,CAAO;IACjD,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC;IACnC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC;IACnC,OAAO,MAAM,CAAC;AAChB,CAAC;AAiBD,2EAA2E;AAC3E,iFAAiF;AACjF,2EAA2E;AAC3E,MAAM,CAAC,MAAM,wBAAwB,GAAG,EAAE,CAAC;AAO3C;;;;;GAKG;AACH,MAAM,UAAU,sBAAsB,CACpC,IAAiB,EACjB,MAA+B;IAE/B,OAAO;QACL,IAAI,EAAE,IAAI,CAAC,GAAG,CACZ,wBAAwB,EACxB,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,QAAQ,CAAC,CAC3B;QACD,IAAI,EAAE,IAAI,CAAC,GAAG,CACZ,wBAAwB,EACxB,MAAM,CAAC,MAAM,CACX,CAAC,SAAS,EAAE,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,SAAS,EAAE,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,EAC3D,CAAC,CACF,CACF;KACF,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,MAAsB;IACtD,MAAM,OAAO,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,YAAY,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC;IACxE,MAAM,WAAW,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,MAAM,EAAE,EAAE,CAAC,GAAG,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;IAC5E,MAAM,MAAM,GAAG,IAAI,YAAY,CAAC,WAAW,CAAC,CAAC;IAC7C,IAAI,MAAM,GAAG,CAAC,CAAC;IACf,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACvC,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC;QAC/B,MAAM,IAAI,OAAO,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;IAC9B,CAAC;IACD,OAAO,MAAM,CAAC,MAAM,CAAC;AACvB,CAAC;AAED,SAAS,KAAK,CAAC,IAAY,EAAE,IAAY;IACvC,MAAM,WAAW,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,GAAG,GAAG,CAAC,EAAE,GAAG,CAAC,CAAC;IAC1D,MAAM,WAAW,GACf,IAAI,CAAC,GAAG,CAAC,IAAI,GAAG,IAAI,CAAC,GAAG,IAAI;QAC1B,CAAC,CAAC,WAAW;QACb,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,GAAG,GAAG,CAAC,EAAE,GAAG,CAAC,CAAC;IAC3C,OAAO,CAAC,WAAW,IAAI,CAAC,CAAC,GAAG,WAAW,CAAC;AAC1C,CAAC;AAED,8EAA8E;AAC9E,SAAS,cAAc,CACrB,SAAuB,EACvB,MAAc,EACd,OAAiC,EACjC,YAAoB,EACpB,EAAU,EACV,EAAU,EACV,EAAU,EACV,SAAiB,EACjB,SAAiB,EACjB,GAAiB,EACjB,CAAS;IAET,IAAI,IAAI,GAAG,QAAQ,EAAE,IAAI,GAAG,QAAQ,EAAE,IAAI,GAAG,QAAQ,CAAC;IACtD,IAAI,IAAI,GAAG,CAAC,QAAQ,EAAE,IAAI,GAAG,CAAC,QAAQ,EAAE,IAAI,GAAG,CAAC,QAAQ,CAAC;IACzD,KAAK,IAAI,MAAM,GAAG,CAAC,EAAE,MAAM,GAAG,CAAC,EAAE,MAAM,EAAE,EAAE,CAAC;QAC1C,MAAM,MAAM,GAAG,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC1D,MAAM,CAAC,GAAG,MAAM,GAAG,MAAM,CAAC;QAC1B,MAAM,CAAC,GAAG,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,SAAS,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,GAAG,SAAS,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;QACnE,IAAI,OAAO,EAAE,CAAC;YACZ,MAAM,CAAC,GAAG,MAAM,GAAG,YAAY,CAAC;YAChC,IAAI,EAAE,GAAG,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,GAAG,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,GAAG,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;YAC9D,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC;YACtD,IAAI,MAAM,GAAG,CAAC,EAAE,CAAC;gBACf,EAAE,IAAI,MAAM,CAAC;gBAAC,EAAE,IAAI,MAAM,CAAC;gBAAC,EAAE,IAAI,MAAM,CAAC;YAC3C,CAAC;YACD,KAAK,IAAI,IAAI,GAAG,CAAC,EAAE,IAAI,GAAG,CAAC,EAAE,IAAI,EAAE,EAAE,CAAC;gBACpC,MAAM,CAAC,GAAG,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC;gBAC7C,MAAM,EAAE,GAAG,CAAC,GAAG,EAAE,GAAG,CAAC,EAAE,EAAE,GAAG,CAAC,GAAG,EAAE,GAAG,CAAC,EAAE,EAAE,GAAG,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;gBACxD,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;gBAAC,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;gBAAC,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;gBAChF,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;gBAAC,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;gBAAC,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;YAClF,CAAC;QACH,CAAC;aAAM,CAAC;YACN,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;YAAC,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;YAAC,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;YAC7E,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;YAAC,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;YAAC,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;QAC/E,CAAC;IACH,CAAC;IACD,GAAG,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC;IAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC;IAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC;IACpD,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC;IAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC;IAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC;IACxD,OAAO,QAAQ,CAAC,IAAI,CAAC,IAAI,QAAQ,CAAC,IAAI,CAAC,IAAI,QAAQ,CAAC,IAAI,CAAC;QACvD,QAAQ,CAAC,IAAI,CAAC,IAAI,QAAQ,CAAC,IAAI,CAAC,IAAI,QAAQ,CAAC,IAAI,CAAC,CAAC;AACvD,CAAC;AAED,SAAS,QAAQ,CAAC,MAAe;IAC/B,OAAO;QACL,OAAO,EAAE,SAAS;QAClB,gBAAgB,EAAE,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;QACxC,QAAQ,EAAE,CAAC;QACX,iBAAiB,EAAE,CAAC;QACpB,MAAM,EAAE,IAAI,WAAW,CAAC,CAAC,CAAC;QAC1B,MAAM,EAAE,MAAM;QACd,eAAe,EAAE,MAAM,CAAC,CAAC,CAAC,IAAI,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS;KACzD,CAAC;AACJ,CAAC;AAED,8BAA8B;AAC9B,MAAM,UAAU,SAAS;IACvB,OAAO,QAAQ,CAAC,KAAK,CAAC,CAAC;AACzB,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,SAAS,CACvB,QAA2D,EAC3D,iBAAiB,GAAG,CAAC,EACrB,qBAAoC;IAEpC,MAAM,QAAQ,GAAG,QAAQ,CAAC,QAAQ,CAAC;IACnC,MAAM,cAAc,GAAG,QAAQ,CAAC,OAAO,CAAC;IACxC,IAAI,CAAC,QAAQ,IAAI,CAAC,cAAc,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC;QAC3D,OAAO,QAAQ,CAAC,KAAK,CAAC,CAAC;IACzB,CAAC;IACD,MAAM,OAAO,GAAG,YAAY,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC;IACnD,MAAM,SAAS,GAAG,QAAQ,CAAC,KAAK,CAAC;IACjC,MAAM,MAAM,GAAG,QAAQ,CAAC,QAAQ,CAAC;IACjC,MAAM,MAAM,GAAG,qBAAqB,CAAC,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC;IACnE,MAAM,OAAO,GAAG,MAAM,EAAE,KAAK,CAAC;IAC9B,MAAM,YAAY,GAAG,MAAM,EAAE,QAAQ,IAAI,CAAC,CAAC;IAC3C,MAAM,aAAa,GAAG,IAAI,CAAC,KAAK,CAAC,eAAe,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC;IAC/D,MAAM,KAAK,GAAG,IAAI,YAAY,CAAC,aAAa,GAAG,CAAC,CAAC,CAAC;IAClD,MAAM,SAAS,GAAG,IAAI,WAAW,CAAC,aAAa,CAAC,CAAC;IACjD,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,aAAa,EAAE,CAAC,EAAE,EAAE,CAAC;QACvC,IAAI,SAAS,GAAG,CAAC,EAAE,SAAS,GAAG,CAAC,CAAC;QACjC,IAAI,OAAO,EAAE,CAAC;YACZ,SAAS,GAAG,qBAAsB,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,iBAAiB,CAAC;YAC9D,SAAS,GAAG,qBAAsB,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,iBAAiB,CAAC;YAClE,IAAI,KAAK,CAAC,SAAS,CAAC,IAAI,KAAK,CAAC,SAAS,CAAC,EAAE,CAAC;gBACzC,SAAS,GAAG,CAAC,CAAC;gBACd,SAAS,GAAG,iBAAiB,CAAC;YAChC,CAAC;QACH,CAAC;QACD,IAAI,cAAc,CAChB,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,YAAY,EACxC,cAAc,CAAC,OAAO,EAAE,CAAC,GAAG,CAAC,CAAC,EAAE,cAAc,CAAC,OAAO,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,EAAE,cAAc,CAAC,OAAO,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,EACtG,SAAS,EAAE,SAAS,EAAE,KAAK,EAAE,KAAK,GAAG,CAAC,CACvC,EAAE,CAAC;YACF,SAAS,CAAC,KAAK,EAAE,CAAC,GAAG,CAAC,CAAC;QACzB,CAAC;IACH,CAAC;IACD,IAAI,CAAC,KAAK;QAAE,OAAO,QAAQ,CAAC,KAAK,CAAC,CAAC;IAEnC,MAAM,GAAG,GAAG,iBAAiB,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;IAC5C,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,iBAAiB,EAAE,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC;IACnF,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,WAAW,EAAE,GAAG,GAAG,CAAC;IAC1D,MAAM,MAAM,GAAG,IAAI,WAAW,CAAC,SAAS,GAAG,EAAE,CAAC,CAAC;IAC/C,MAAM,MAAM,GAAG,IAAI,YAAY,CAAC,MAAM,CAAC,CAAC;IACxC,MAAM,IAAI,GAAG,IAAI,UAAU,CAAC,MAAM,CAAC,CAAC;IACpC,IAAI,gBAAgB,GAAG,CAAC,CAAC;IACzB,MAAM,WAAW,GAAa,EAAE,CAAC;IACjC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACtC,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;QACtB,MAAM,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,GAAG,CAAC,CAAC;QAC1C,MAAM,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;QAAC,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;QAAC,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;QACpF,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;QAAC,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;QAAC,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;QAC5F,MAAM,CAAC,GAAG,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;QAC1G,gBAAgB,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;QAChD,MAAM,KAAK,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC;QAC9B,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,+BAA+B;YAC/B,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,OAAO,CAAC,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;YAC3C,SAAS;QACX,CAAC;QACD,2DAA2D;QAC3D,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC;QACrB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,EAAE,CAAC,EAAE,EAAE,CAAC;YAC/B,MAAM,CAAC,GAAG,SAAS,CAAC,WAAW,CAAC,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;YACtD,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;YACxB,IAAI,qBAAqB;gBAAE,WAAW,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;YACtD,IAAI,CAAC,CAAC,CAAC,GAAG,cAAc,CAAC,OAAO,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;YACzC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,cAAc,CAAC,OAAO,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;YACjD,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,cAAc,CAAC,OAAO,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;YACjD,kCAAkC;YAClC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,qBAAqB;gBACjC,CAAC,CAAC,KAAK,CAAC,qBAAqB,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,qBAAqB,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;gBACvE,CAAC,CAAC,CAAC,CAAC;QACR,CAAC;IACH,CAAC;IAED,OAAO;QACL,OAAO,EAAE,SAAS;QAClB,WAAW,EAAE,qBAAqB,CAAC,CAAC,CAAC,IAAI,WAAW,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,SAAS;QAC7E,gBAAgB;QAChB,QAAQ;QACR,iBAAiB;QACjB,MAAM;QACN,MAAM,EAAE,MAAM;KACf,CAAC;AACJ,CAAC;AAQD,SAAS,gBAAgB,CAAC,MAAsB;IAC9C,IAAI,UAAU,GAAG,CAAC,CAAC;IACnB,IAAI,YAAY,GAAG,CAAC,CAAC;IACrB,MAAM,SAAS,GAAkB,EAAE,WAAW,EAAE,EAAE,EAAE,aAAa,EAAE,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC;IACrF,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE;QACtB,SAAS,CAAC,WAAW,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QACvC,SAAS,CAAC,aAAa,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;QAC3C,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,IAAI,MAAM,CAAC,CAAC;QAClD,UAAU,IAAI,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,UAAU,GAAG,EAAE,CAAC;QAC9C,YAAY,IAAI,IAAI,CAAC,aAAa,CAAC;IACrC,CAAC,CAAC,CAAC;IACH,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,8EAA8E;AAC9E,SAAS,cAAc,CAAC,QAAsB,EAAE,GAAiB,EAAE,CAAS;IAC1E,MAAM,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,QAAQ,CAAC,MAAM,CAAC;IACrC,IAAI,IAAI,GAAG,CAAC,EAAE,IAAI,GAAG,CAAC,EAAE,IAAI,GAAG,CAAC,CAAC;IACjC,MAAM,iBAAiB,GAAG,QAAQ,CAAC,iBAAiB,CAAC;IACrD,IAAI,iBAAiB,EAAE,CAAC;QACtB,MAAM,CAAC,GAAG,QAAQ,CAAC,SAAS,CAAC;QAC7B,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,iBAAiB,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;QACvF,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,iBAAiB,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;QACvF,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,iBAAiB,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC;IAC1F,CAAC;IACD,GAAG,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC;IAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC;IAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC;IACjG,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC;IAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC;IAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC;AACvG,CAAC;AAED,SAAS,kBAAkB,CAAC,MAAoB,EAAE,MAAc,EAAE,QAAsB;IACtF,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC;IAC7B,MAAM,CAAC,MAAM,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACtC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAC1C,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AAC5C,CAAC;AAED,SAAS,mBAAmB,CAC1B,YAAwB,EACxB,cAA4B,EAC5B,WAAmB,EACnB,QAAsB,EACtB,SAAwB;IAExB,MAAM,MAAM,GAAG,WAAW,GAAG,oBAAoB,CAAC;IAClD,YAAY,CAAC,MAAM,CAAC,GAAG,gBAAgB,CACrC,SAAS,CAAC,WAAW,CAAC,QAAQ,CAAC,SAAS,CAAC,EACzC,SAAS,CAAC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAC,CACtC,CAAC;IACF,YAAY,CAAC,MAAM,GAAG,CAAC,CAAC,GAAG,SAAS,CAAC,aAAa,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;IACvE,YAAY,CAAC,MAAM,GAAG,CAAC,CAAC,GAAG,QAAQ,CAAC,gBAAgB,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;IAC7D,cAAc,CAAC,MAAM,GAAG,CAAC,CAAC,GAAG,QAAQ,CAAC,iBAAiB,IAAI,CAAC,CAAC;IAC7D,kBAAkB,CAAC,cAAc,EAAE,MAAM,GAAG,EAAE,EAAE,QAAQ,CAAC,CAAC;IAC1D,cAAc,CAAC,MAAM,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC;IAChC,MAAM,OAAO,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,YAAY,CAAC,EAAE,CAAC,EAAE,QAAQ,CAAC,SAAS,CAAE,CAAC;IACvE,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC;QAC5B,cAAc,CAAC,MAAM,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;QAC5C,cAAc,CAAC,MAAM,GAAG,EAAE,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC;IAChE,CAAC;AACH,CAAC;AAED,4EAA4E;AAC5E,+EAA+E;AAC/E,MAAM,UAAU,mBAAmB,CAAC,SAAwB,EAAE,gBAA0B,EAAE,aAAuB;IAC/G,MAAM,MAAM,GAAG,IAAI,WAAW,CAAC,mBAAmB,CAAC,SAAS,CAAC,GAAG,oBAAoB,GAAG,CAAC,CAAC,CAAC;IAC1F,MAAM,KAAK,GAAG,IAAI,UAAU,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,YAAY,CAAC,MAAM,CAAC,CAAC;IACxE,MAAM,SAAS,GAAkB,EAAC,WAAW,EAAE,gBAAgB,EAAE,aAAa;QAC5E,OAAO,EAAE,gBAAgB,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,EAAC,CAAC;IAC/C,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,mBAAmB,CAAC,SAAS,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QACxD,mBAAmB,CAAC,KAAK,EAAE,MAAM,EAAE,CAAC,EAAE,gBAAgB,CAAC,SAAS,EAAE,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC;IACnF,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,8EAA8E;AAC9E,MAAM,UAAU,oBAAoB,CAAC,MAAmB,EAAE,SAAwB,EAAE,gBAA0B,EAAE,aAAuB,EAAE,KAA0B;IACjK,MAAM,KAAK,GAAG,IAAI,UAAU,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,YAAY,CAAC,MAAM,CAAC,CAAC;IACxE,MAAM,SAAS,GAAkB,EAAC,WAAW,EAAE,gBAAgB,EAAE,aAAa,EAAE,OAAO,EAAE,gBAAgB,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,EAAC,CAAC;IAC7H,MAAM,MAAM,GAAqB,EAAE,CAAC;IACpC,KAAK,MAAM,KAAK,IAAI,KAAK,EAAE,CAAC;QAC1B,mBAAmB,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,gBAAgB,CAAC,SAAS,EAAE,KAAK,CAAC,EAAE,SAAS,CAAC,CAAC;QACzF,MAAM,CAAC,IAAI,CAAC,EAAC,MAAM,EAAE,KAAK,GAAG,oBAAoB,GAAG,CAAC,EAAE,IAAI,EAAE,oBAAoB,GAAG,CAAC,EAAC,CAAC,CAAC;IAC1F,CAAC;IACD,OAAO,gBAAgB,CAAC,MAAM,CAAC,CAAC;AAClC,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,SAAS,CACvB,SAAwB,EACxB,MAAsB;IAEtB,IAAI,CAAC,mBAAmB,CAAC,SAAS,CAAC;QAAE,OAAO,QAAQ,CAAC,IAAI,CAAC,CAAC;IAC3D,MAAM,SAAS,GAAG,gBAAgB,CAAC,MAAM,CAAC,CAAC;IAC3C,MAAM,KAAK,GAAG,IAAI,YAAY,CAAC,mBAAmB,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC;IACnE,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,mBAAmB,CAAC,SAAS,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QACxD,cAAc,CAAC,gBAAgB,CAAC,SAAS,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IAC/D,CAAC;IAED,MAAM,GAAG,GAAG,iBAAiB,CAAC,KAAK,EAAE,mBAAmB,CAAC,SAAS,CAAC,CAAC,CAAC;IACrE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,iBAAiB,EAAE,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC;IACnF,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,WAAW,EAAE,GAAG,GAAG,CAAC;IAC1D,MAAM,MAAM,GAAG,IAAI,WAAW,CAAC,SAAS,GAAG,EAAE,CAAC,CAAC;IAC/C,MAAM,MAAM,GAAG,IAAI,YAAY,CAAC,MAAM,CAAC,CAAC;IACxC,MAAM,IAAI,GAAG,IAAI,UAAU,CAAC,MAAM,CAAC,CAAC;IACpC,MAAM,eAAe,GAAG,IAAI,WAAW,CAAC,mBAAmB,CAAC,SAAS,CAAC,GAAG,oBAAoB,GAAG,CAAC,CAAC,CAAC;IACnG,MAAM,YAAY,GAAG,IAAI,UAAU,CAAC,eAAe,CAAC,CAAC;IACrD,MAAM,cAAc,GAAG,IAAI,YAAY,CAAC,eAAe,CAAC,CAAC;IACzD,IAAI,MAAM,GAAG,CAAC,CAAC;IACf,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACtC,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;QACtB,MAAM,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,GAAG,CAAC,CAAC;QAC1C,MAAM,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;QAAC,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;QAAC,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;QACpF,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;QAAC,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;QAAC,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;QAC5F,MAAM,KAAK,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC;QAC9B,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,OAAO,CAAC,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;YAC3C,SAAS;QACX,CAAC;QACD,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC;QACrB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,EAAE,CAAC,EAAE,EAAE,CAAC;YAC/B,MAAM,MAAM,GAAG,WAAW,CAAC,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;YAChD,MAAM,QAAQ,GAAG,gBAAgB,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;YACrD,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;YACxB,IAAI,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC;YACjB,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,SAAS,CAAC,WAAW,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;YACxD,mEAAmE;YACnE,4DAA4D;YAC5D,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,MAAM,CAAC;YACrB,mBAAmB,CAAC,YAAY,EAAE,cAAc,EAAE,MAAM,EAAE,QAAQ,EAAE,SAAS,CAAC,CAAC;YAC/E,MAAM,EAAE,CAAC;QACX,CAAC;IACH,CAAC;IAED,OAAO;QACL,OAAO,EAAE,SAAS;QAClB,QAAQ;QACR,iBAAiB;QACjB,MAAM;QACN,MAAM,EAAE,MAAM;QACd,eAAe;KAChB,CAAC;AACJ,CAAC;AAED,8EAA8E;AAC9E,MAAM,UAAU,kBAAkB,CAAC,SAAwB;IACzD,MAAM,MAAM,GAAG,IAAI,YAAY,CAAC,mBAAmB,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC;IACpE,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,mBAAmB,CAAC,SAAS,CAAC,EAAE,CAAC,EAAE;QAAE,cAAc,CAAC,gBAAgB,CAAC,SAAS,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IACvH,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,mFAAmF;AACnF,MAAM,UAAU,aAAa,CAAC,SAAwB,EAAE,MAAsB,EAAE,SAAsB;IACpG,MAAM,KAAK,GAAG,mBAAmB,CAAC,SAAS,CAAC,CAAC;IAC7C,IAAI,CAAC,KAAK;QAAE,OAAO,QAAQ,CAAC,IAAI,CAAC,CAAC;IAClC,MAAM,SAAS,GAAG,gBAAgB,CAAC,MAAM,CAAC,EAAE,KAAK,GAAG,IAAI,UAAU,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;IACrF,MAAM,eAAe,GAAG,IAAI,WAAW,CAAC,KAAK,GAAG,oBAAoB,GAAG,CAAC,CAAC,CAAC;IAC1E,MAAM,YAAY,GAAG,IAAI,UAAU,CAAC,eAAe,CAAC,EAAE,cAAc,GAAG,IAAI,YAAY,CAAC,eAAe,CAAC,CAAC;IACzG,MAAM,KAAK,GAAa,CAAC,CAAC,CAAC,CAAC;IAAC,IAAI,MAAM,GAAG,CAAC,CAAC;IAC5C,OAAO,KAAK,CAAC,MAAM,EAAE,CAAC;QACpB,MAAM,IAAI,GAAG,KAAK,CAAC,GAAG,EAAG,EAAE,CAAC,GAAG,IAAI,GAAG,CAAC,EAAE,KAAK,GAAG,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;QAC9D,IAAI,KAAK,IAAI,CAAC,EAAE,CAAC;YAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YAAC,KAAK,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC;YAAC,SAAS;QAAC,CAAC;QACtE,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC,EAAE,EAAE,CAAC;YAChC,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,MAAM,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;YAC3C,IAAI,MAAM,GAAG,CAAC,IAAI,MAAM,IAAI,KAAK,IAAI,MAAM,IAAI,KAAK;gBAAE,MAAM,IAAI,KAAK,CAAC,gCAAgC,CAAC,CAAC;YACxG,MAAM,QAAQ,GAAG,gBAAgB,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;YACrD,KAAK,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC;YAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,SAAS,CAAC,WAAW,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;YAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,MAAM,CAAC;YAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC;YACrH,mBAAmB,CAAC,YAAY,EAAE,cAAc,EAAE,MAAM,EAAE,EAAE,QAAQ,EAAE,SAAS,CAAC,CAAC;QACnF,CAAC;IACH,CAAC;IACD,IAAI,MAAM,KAAK,KAAK;QAAE,MAAM,IAAI,KAAK,CAAC,uCAAuC,CAAC,CAAC;IAC/E,SAAS,CAAC,eAAe,GAAG,eAAe,CAAC;IAC5C,OAAO,SAAS,CAAC;AACnB,CAAC;AAmBD,MAAM,iBAAiB,GAAG,IAAI,OAAO,EAAkC,CAAC;AAExE,SAAS,oBAAoB,CAAC,SAAsB,EAAE,IAAgB;IACpE,MAAM,MAAM,GAAG,iBAAiB,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;IAChD,IAAI,MAAM;QAAE,OAAO,MAAM,CAAC;IAC1B,MAAM,QAAQ,GAAsB;QAClC,MAAM,EAAE,IAAI,GAAG,EAAE;QACjB,KAAK,EAAE,IAAI,GAAG,EAAE;QAChB,cAAc,EAAE,IAAI,GAAG,EAAE;QACzB,eAAe,EAAE,IAAI,GAAG,EAAE;KAC3B,CAAC;IACF,MAAM,KAAK,GAAG,CAAC,KAAa,EAAE,MAA0B,EAAE,KAAa,EAAE,EAAE;QACzE,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;QACjC,IAAI,MAAM,IAAI,IAAI;YAAE,QAAQ,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;QACvD,MAAM,IAAI,GAAG,KAAK,GAAG,CAAC,CAAC;QACvB,MAAM,qBAAqB,GAAG,IAAI,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC;QAC7C,IAAI,qBAAqB,IAAI,CAAC,EAAE,CAAC;YAC/B,KAAK,CAAC,KAAK,GAAG,CAAC,EAAE,KAAK,EAAE,KAAK,GAAG,CAAC,CAAC,CAAC;YACnC,KAAK,CAAC,qBAAqB,EAAE,KAAK,EAAE,KAAK,GAAG,CAAC,CAAC,CAAC;YAC/C,OAAO;QACT,CAAC;QACD,MAAM,OAAO,GAAyC,EAAE,CAAC;QACzD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,qBAAqB,EAAE,CAAC,EAAE,EAAE,CAAC;YAChD,MAAM,eAAe,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;YACzC,MAAM,MAAM,GAAG,IAAI,CAAC,eAAe,CAAC,CAAC;YACrC,MAAM,MAAM,GAAG,IAAI,CAAC,eAAe,GAAG,CAAC,CAAC,CAAC;YACzC,OAAO,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;YACjC,MAAM,MAAM,GAAG,QAAQ,CAAC,cAAc,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,IAAI,GAAG,EAAU,CAAC;YACxE,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;YAClB,QAAQ,CAAC,cAAc,CAAC,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QAC9C,CAAC;QACD,QAAQ,CAAC,eAAe,CAAC,GAAG,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;IAC/C,CAAC,CAAC;IACF,KAAK,CAAC,CAAC,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC;IACvB,iBAAiB,CAAC,GAAG,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;IAC3C,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,MAAwB;IACvD,MAAM,MAAM,GAAG,MAAM;SAClB,MAAM,CAAC,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,IAAI,GAAG,CAAC,CAAC;SAC9B,IAAI,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC;IACrD,MAAM,MAAM,GAAqB,EAAE,CAAC;IACpC,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QAC3B,MAAM,QAAQ,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QAC3C,IAAI,QAAQ,IAAI,KAAK,CAAC,MAAM,IAAI,QAAQ,CAAC,MAAM,GAAG,QAAQ,CAAC,IAAI,EAAE,CAAC;YAChE,QAAQ,CAAC,IAAI,GAAG,IAAI,CAAC,GAAG,CACtB,QAAQ,CAAC,IAAI,EACb,KAAK,CAAC,MAAM,GAAG,KAAK,CAAC,IAAI,GAAG,QAAQ,CAAC,MAAM,CAC5C,CAAC;QACJ,CAAC;aAAM,CAAC;YACN,MAAM,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,KAAK,CAAC,MAAM,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC;QAC1D,CAAC;IACH,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,0EAA0E;AAC1E,MAAM,UAAU,gBAAgB,CAAC,SAAsB;IACrD,MAAM,IAAI,GAAG,EAAC,GAAG,SAAS,EAAE,MAAM,EAAE,SAAS,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,eAAe,EAAE,SAAS,CAAC,eAAe,EAAE,KAAK,CAAC,CAAC,CAAC,EAAC,CAAC;IACrH,IAAI,SAAS,CAAC,MAAM,CAAC,UAAU,IAAI,SAAS,CAAC,eAAe,EAAE,CAAC;QAC7D,iBAAiB,CAAC,GAAG,CAAC,IAAI,EAAE,oBAAoB,CAAC,SAAS,EAAE,IAAI,UAAU,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;IACjG,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,MAAM,UAAU,SAAS,CACvB,SAAsB,EACtB,SAAwB,EACxB,MAAsB,EACtB,kBAAwC;IAExC,IAAI,CAAC,SAAS,CAAC,eAAe,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,UAAU,EAAE,CAAC;QAC/D,OAAO,EAAE,UAAU,EAAE,EAAE,EAAE,cAAc,EAAE,EAAE,EAAE,CAAC;IAChD,CAAC;IACD,MAAM,MAAM,GAAG,IAAI,YAAY,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;IAClD,MAAM,IAAI,GAAG,IAAI,UAAU,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;IAC9C,MAAM,cAAc,GAAG,IAAI,YAAY,CAAC,SAAS,CAAC,eAAe,CAAC,CAAC;IACnE,MAAM,YAAY,GAAG,IAAI,UAAU,CAAC,SAAS,CAAC,eAAe,CAAC,CAAC;IAE/D,MAAM,SAAS,GAAG,gBAAgB,CAAC,MAAM,CAAC,CAAC;IAC3C,MAAM,OAAO,GAAG,IAAI,YAAY,CAAC,CAAC,CAAC,CAAC;IAEpC,SAAS,aAAa,CAAC,WAAmB,EAAE,WAAmB;QAC7D,mBAAmB,CAAC,YAAY,EAAE,cAAc,EAAE,WAAW,EAAE,gBAAgB,CAAC,SAAS,EAAE,WAAW,CAAC,EAAE,SAAS,CAAC,CAAC;IACtH,CAAC;IAED,SAAS,iBAAiB,CAAC,MAAY,EAAE,QAAsB;QAC7D,cAAc,CAAC,QAAQ,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC;QACrC,KAAK,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAChE,KAAK,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAChE,KAAK,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAChE,KAAK,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAChE,KAAK,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAChE,KAAK,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAClE,CAAC;IAED,SAAS,eAAe,CAAC,KAAa,EAAE,MAAY;QAClD,MAAM,IAAI,GAAG,KAAK,GAAG,CAAC,CAAC;QACvB,MAAM,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;QACnC,MAAM,CAAC,IAAI,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;QACvC,MAAM,CAAC,IAAI,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;QACvC,MAAM,CAAC,IAAI,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;QACvC,MAAM,CAAC,IAAI,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;QACvC,MAAM,CAAC,IAAI,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;IACzC,CAAC;IAED,SAAS,cAAc,CAAC,KAAa;QACnC,MAAM,IAAI,GAAG,KAAK,GAAG,CAAC,CAAC;QACvB,MAAM,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;QAC1B,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,EAAE,MAAM,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC,IAAI,GAAG,CAAC,CAAC,EAAE,MAAM,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC;QACvE,IAAI,CAAC,GAAG,CACN,MAAM,CAAC,GAAG,EACV,MAAM,CAAC,IAAI,GAAG,CAAC,CAAC,EAChB,MAAM,CAAC,IAAI,GAAG,CAAC,CAAC,EAChB,MAAM,CAAC,IAAI,GAAG,CAAC,CAAC,CACjB,CAAC;QACF,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,SAAS,SAAS,CAAC,KAAa;QAC9B,MAAM,IAAI,GAAG,KAAK,GAAG,CAAC,CAAC;QACvB,MAAM,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;QAC1B,MAAM,qBAAqB,GAAG,IAAI,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC;QAC7C,IAAI,qBAAqB,IAAI,CAAC,EAAE,CAAC;YAC/B,MAAM,IAAI,GAAG,SAAS,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC;YAClC,MAAM,KAAK,GAAG,SAAS,CAAC,qBAAqB,CAAC,CAAC;YAC/C,WAAW,CAAC,MAAM,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC;QACnC,CAAC;aAAM,CAAC;YACN,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,qBAAqB,EAAE,CAAC,EAAE,EAAE,CAAC;gBAChD,MAAM,eAAe,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;gBACzC,MAAM,cAAc,GAAG,IAAI,CAAC,eAAe,CAAC,CAAC;gBAC7C,MAAM,cAAc,GAAG,IAAI,CAAC,eAAe,GAAG,CAAC,CAAC,CAAC;gBACjD,MAAM,QAAQ,GAAG,gBAAgB,CAAC,SAAS,EAAE,cAAc,CAAC,CAAC;gBAC7D,IAAI,CAAC,QAAQ;oBAAE,SAAS;gBACxB,iBAAiB,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;gBACpC,aAAa,CAAC,cAAc,EAAE,cAAc,CAAC,CAAC;YAChD,CAAC;QACH,CAAC;QACD,eAAe,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;QAC/B,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,IAAI,CAAC,kBAAkB,EAAE,CAAC;QACxB,SAAS,CAAC,CAAC,CAAC,CAAC;QACb,OAAO;YACL,UAAU,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,IAAI,EAAE,SAAS,CAAC,MAAM,CAAC,UAAU,EAAE,CAAC;YAC9D,cAAc,EAAE;gBACd,EAAE,MAAM,EAAE,CAAC,EAAE,IAAI,EAAE,SAAS,CAAC,eAAe,CAAC,UAAU,EAAE;aAC1D;SACF,CAAC;IACJ,CAAC;IAED,MAAM,QAAQ,GAAG,oBAAoB,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;IACvD,MAAM,WAAW,GAAG,IAAI,GAAG,EAAU,CAAC;IACtC,MAAM,cAAc,GAAqB,EAAE,CAAC;IAC5C,KAAK,MAAM,MAAM,IAAI,kBAAkB,EAAE,CAAC;QACxC,MAAM,MAAM,GAAG,QAAQ,CAAC,cAAc,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QACnD,IAAI,CAAC,MAAM;YAAE,SAAS;QACtB,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC;QAChD,KAAK,MAAM,IAAI,IAAI,MAAM,EAAE,CAAC;YAC1B,KAAK,MAAM,KAAK,IAAI,QAAQ,CAAC,eAAe,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE,CAAC;gBAC7D,IAAI,KAAK,CAAC,MAAM,KAAK,MAAM;oBAAE,SAAS;gBACtC,aAAa,CAAC,KAAK,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;gBACpC,cAAc,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,KAAK,CAAC,MAAM,GAAG,oBAAoB,GAAG,CAAC,EAAE,IAAI,EAAE,oBAAoB,GAAG,CAAC,EAAE,CAAC,CAAC;YAC3G,CAAC;QACH,CAAC;IACH,CAAC;IAED,MAAM,UAAU,GAAG,IAAI,GAAG,EAAU,CAAC;IACrC,KAAK,MAAM,IAAI,IAAI,WAAW,EAAE,CAAC;QAC/B,MAAM,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;QAC1B,KAAK,MAAM,EAAE,MAAM,EAAE,IAAI,QAAQ,CAAC,eAAe,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE,CAAC;YAClE,MAAM,QAAQ,GAAG,gBAAgB,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;YACrD,IAAI,QAAQ;gBAAE,iBAAiB,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;QACpD,CAAC;QACD,eAAe,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;QAC9B,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QACrB,IAAI,MAAM,GAAG,QAAQ,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QACvC,OAAO,MAAM,IAAI,IAAI,EAAE,CAAC;YACtB,UAAU,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;YACvB,MAAM,GAAG,QAAQ,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QACvC,CAAC;IACH,CAAC;IAED,MAAM,aAAa,GAAG,CAAC,GAAG,UAAU,CAAC;SAClC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,IAAI,CAAC,KAAK,GAAG,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC;SAC3C,IAAI,CACH,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CACd,CAAC,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CACrE,CAAC;IACJ,KAAK,MAAM,KAAK,IAAI,aAAa,EAAE,CAAC;QAClC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;QAClC,MAAM,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;QAC1B,WAAW,CAAC,MAAM,EAAE,cAAc,CAAC,KAAK,GAAG,CAAC,CAAC,EAAE,cAAc,CAAC,KAAK,CAAC,CAAC,CAAC;QACtE,eAAe,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;IACjC,CAAC;IAED,OAAO;QACL,UAAU,EAAE,gBAAgB,CAC1B,CAAC,GAAG,UAAU,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,KAAK,GAAG,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC,CACnE;QACD,cAAc,EAAE,gBAAgB,CAAC,cAAc,CAAC;KACjD,CAAC;AACJ,CAAC;AAED,yEAAyE;AACzE,MAAM,CAAC,MAAM,0BAA0B,GAAG,CAAC,CAAC;AAW5C,8EAA8E;AAC9E,wEAAwE;AACxE,MAAM,aAAa,GAAG,IAAI,OAAO,EAA8B,CAAC;AAEhE,SAAS,gBAAgB,CAAC,MAAmB;IAC3C,MAAM,MAAM,GAAG,aAAa,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IACzC,IAAI,MAAM;QAAE,OAAO,MAAM,CAAC;IAC1B,MAAM,IAAI,GAAG,IAAI,UAAU,CAAC,MAAM,CAAC,CAAC;IACpC,MAAM,OAAO,GAAG,IAAI,UAAU,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IAChD,MAAM,QAAQ,GAAa,EAAE,CAAC;IAC9B,MAAM,QAAQ,GAAa,EAAE,CAAC;IAC9B,MAAM,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC;IAClB,OAAO,KAAK,CAAC,MAAM,EAAE,CAAC;QACpB,MAAM,KAAK,GAAG,KAAK,CAAC,GAAG,EAAG,CAAC;QAC3B,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACrB,MAAM,IAAI,GAAG,KAAK,GAAG,CAAC,CAAC;QACvB,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC;QAC7B,IAAI,KAAK,IAAI,CAAC,EAAE,CAAC;YACf,KAAK,CAAC,IAAI,CAAC,KAAK,EAAE,KAAK,GAAG,CAAC,CAAC,CAAC;YAC7B,SAAS;QACX,CAAC;QACD,OAAO,CAAC,KAAK,CAAC,GAAG,QAAQ,CAAC,MAAM,CAAC;QACjC,MAAM,SAAS,GAAG,QAAQ,CAAC,MAAM,CAAC;QAClC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACjB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC,EAAE,EAAE,CAAC;YAChC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;gBAC3B,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;gBAC1C,IAAI,IAAI,GAAG,KAAK,CAAC;gBACjB,KAAK,IAAI,CAAC,GAAG,SAAS,GAAG,CAAC,EAAE,CAAC,GAAG,QAAQ,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;oBACrD,IAAI,QAAQ,CAAC,CAAC,CAAC,KAAK,MAAM,EAAE,CAAC;wBAAC,IAAI,GAAG,IAAI,CAAC;wBAAC,MAAM;oBAAC,CAAC;gBACrD,CAAC;gBACD,IAAI,CAAC,IAAI;oBAAE,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YACnC,CAAC;QACH,CAAC;QACD,QAAQ,CAAC,SAAS,CAAC,GAAG,QAAQ,CAAC,MAAM,GAAG,SAAS,GAAG,CAAC,CAAC;IACxD,CAAC;IACD,MAAM,IAAI,GAAG;QACX,OAAO;QACP,QAAQ,EAAE,IAAI,WAAW,CAAC,QAAQ,CAAC;QACnC,SAAS,EAAE,IAAI,UAAU,CAAC,QAAQ,CAAC,OAAO,EAAE,CAAC;KAC9C,CAAC;IACF,aAAa,CAAC,GAAG,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;IAChC,OAAO,IAAI,CAAC;AACd,CAAC;AAED,uEAAuE;AACvE,MAAM,UAAU,SAAS,CACvB,SAAsB,EACtB,QAAyE,EACzE,YAA0E;IAE1E,IAAI,CAAC,SAAS,CAAC,MAAM,IAAI,MAAM,CAAC,KAAK,MAAM,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,UAAU,EAAE,CAAC;QAC5E,OAAO,KAAK,CAAC;IACf,CAAC;IACD,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,GAAG,gBAAgB,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;IAC5E,MAAM,MAAM,GAAG,IAAI,YAAY,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,IAAI,GAAG,IAAI,UAAU,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;IAC3F,MAAM,SAAS,GAAG,QAAQ,CAAC,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,QAAQ,CAAC,QAAQ,CAAC,QAAQ,CAAC;IAC/E,MAAM,eAAe,GAAG,IAAI,UAAU,CAAC,YAAY,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;IACtF,MAAM,KAAK,GAAG,IAAI,YAAY,CAAC,CAAC,CAAC,CAAC;IAClC,IAAI,YAAY,EAAE,CAAC;QACjB,oEAAoE;QACpE,wEAAwE;QACxE,MAAM,WAAW,GAAG,SAAS,CAAC,WAAW,CAAC;QAC1C,IAAI,CAAC,CAAC,WAAW,YAAY,WAAW,CAAC;YAAE,OAAO,KAAK,CAAC;QACxD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,WAAW,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;YAC/C,MAAM,MAAM,GAAW,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC;YAC9C,eAAe,CAAC,MAAM,CAAC,GAAG,WAAW,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;QAC/C,CAAC;IACH,CAAC;IACD,IAAI,SAAS,CAAC,gBAAgB,IAAI,IAAI,EAAE,CAAC;QACvC,IAAI,IAAI,GAAG,CAAC,CAAC;QACb,KAAK,MAAM,KAAK,IAAI,SAAS,EAAE,CAAC;YAC9B,MAAM,CAAC,GAAG,KAAK,GAAG,CAAC,CAAC;YACpB,MAAM,CAAC,GAAG,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;YAC1G,IAAI,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;QACtC,CAAC;QACD,SAAS,CAAC,gBAAgB,GAAG,IAAI,CAAC;IACpC,CAAC;IACD,IAAI,IAAI,GAAG,CAAC,CAAC;IACb,KAAK,IAAI,IAAI,GAAG,CAAC,EAAE,IAAI,GAAG,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,EAAE,CAAC;QACnD,MAAM,KAAK,GAAG,SAAS,CAAC,IAAI,CAAC,EAAE,IAAI,GAAG,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,IAAI,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC;QACxE,IAAI,IAAI,GAAG,QAAQ,EAAE,IAAI,GAAG,QAAQ,EAAE,IAAI,GAAG,QAAQ,CAAC;QACtD,IAAI,IAAI,GAAG,CAAC,QAAQ,EAAE,IAAI,GAAG,CAAC,QAAQ,EAAE,IAAI,GAAG,CAAC,QAAQ,CAAC;QACzD,IAAI,KAAK,IAAI,CAAC,EAAE,CAAC;YACf,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC,EAAE,KAAK,GAAG,KAAK,GAAG,CAAC,CAAC;YACzC,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;YAAC,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,GAAG,CAAC,CAAC,EAAE,MAAM,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC;YAAC,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,GAAG,CAAC,CAAC,EAAE,MAAM,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC;YACzJ,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,GAAG,CAAC,CAAC,EAAE,MAAM,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC;YAAC,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,GAAG,CAAC,CAAC,EAAE,MAAM,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC;YAAC,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,GAAG,CAAC,CAAC,EAAE,MAAM,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC;QACnK,CAAC;aAAM,IAAI,YAAY,EAAE,CAAC;YACxB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC,EAAE,EAAE,CAAC;gBAChC,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;gBAChC,MAAM,EAAE,GAAG,IAAI,CAAC,MAAM,CAAC,EAAE,EAAE,GAAG,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,EAAE,EAAE,GAAG,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;gBACtE,MAAM,QAAQ,GAAG,eAAe,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;gBAC7C,IAAI,QAAQ,GAAG,CAAC;oBAAE,OAAO,KAAK,CAAC;gBAC/B,MAAM,OAAO,GAAG,YAAY,CAAC,MAAM,CAAC,QAAQ,GAAG,CAAC,CAAC,EAAE,OAAO,GAAG,YAAY,CAAC,MAAM,CAAC,QAAQ,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;gBACnG,IAAI,CAAC,cAAc,CAAC,SAAS,EAAE,MAAM,EAAE,YAAY,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EACvE,OAAO,GAAG,YAAY,CAAC,KAAK,EAAE,OAAO,GAAG,YAAY,CAAC,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC;oBAAE,OAAO,KAAK,CAAC;gBACtF,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,GAAG,SAAS,CAAC,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,yBAAyB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;gBAC3H,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;gBAAC,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;gBAAC,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;gBAClG,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;gBAAC,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;gBAAC,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;YACpG,CAAC;QACH,CAAC;aAAM,CAAC;YACN,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,EAAE,GAAG,GAAG,KAAK,GAAG,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;YAChE,KAAK,IAAI,CAAC,GAAG,KAAK,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC;gBACrC,MAAM,MAAM,GAAG,QAAQ,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC;gBACpC,MAAM,CAAC,GAAG,SAAS,CAAC,MAAM,CAAC,EAAE,CAAC,GAAG,SAAS,CAAC,MAAM,GAAG,CAAC,CAAC,EAAE,CAAC,GAAG,SAAS,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;gBAClF,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC;oBAAE,SAAS;gBAC3D,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;gBAAC,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;gBAAC,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;gBAC7E,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;gBAAC,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;gBAAC,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;YAC/E,CAAC;QACH,CAAC;QACD,MAAM,CAAC,GAAG,IAAI,GAAG,IAAI,EAAE,CAAC,GAAG,IAAI,GAAG,IAAI,EAAE,CAAC,GAAG,IAAI,GAAG,IAAI,CAAC;QACxD,IAAI,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;QACpC,MAAM,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;QAAC,MAAM,CAAC,IAAI,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC;QAAC,MAAM,CAAC,IAAI,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC;QACtE,MAAM,CAAC,IAAI,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC;QAAC,MAAM,CAAC,IAAI,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC;QAAC,MAAM,CAAC,IAAI,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC;IAC5E,CAAC;IACD,OAAO,CAAC,QAAQ,CAAC,OAAO,IAAI,CAAC,CAAC,IAAI,GAAG,SAAS,CAAC,gBAAgB,GAAG,0BAA0B,CAAC,CAAC;AAChG,CAAC;AAED,8EAA8E;AAC9E,MAAM,UAAU,wBAAwB,CAAC,SAAsB,EAAE,SAAwB,EAAE,KAA0B;IACnH,IAAI,CAAC,SAAS,CAAC,eAAe,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,UAAU,IAAI,CAAC,KAAK,CAAC,IAAI;QAAE,OAAO,EAAE,CAAC;IACzF,MAAM,QAAQ,GAAG,oBAAoB,CAAC,SAAS,EAAE,IAAI,UAAU,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC;IACnF,MAAM,MAAM,GAAG,IAAI,YAAY,CAAC,SAAS,CAAC,eAAe,CAAC,CAAC;IAC3D,MAAM,MAAM,GAAqB,EAAE,CAAC;IACpC,KAAK,MAAM,MAAM,IAAI,KAAK,EAAE,CAAC;QAC3B,MAAM,MAAM,GAAG,QAAQ,CAAC,cAAc,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QACnD,IAAI,CAAC,MAAM;YAAE,SAAS;QACtB,KAAK,MAAM,IAAI,IAAI,MAAM,EAAE,CAAC;YAC1B,KAAK,MAAM,KAAK,IAAI,QAAQ,CAAC,eAAe,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE,CAAC;gBAC7D,IAAI,KAAK,CAAC,MAAM,KAAK,MAAM;oBAAE,SAAS;gBACtC,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,GAAG,oBAAoB,GAAG,EAAE,CAAC;gBACxD,kBAAkB,CAAC,MAAM,EAAE,MAAM,EAAE,gBAAgB,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC,CAAC;gBACxE,MAAM,CAAC,IAAI,CAAC,EAAC,MAAM,EAAE,MAAM,GAAG,CAAC,EAAE,IAAI,EAAE,EAAE,EAAC,CAAC,CAAC;YAC9C,CAAC;QACH,CAAC;IACH,CAAC;IACD,OAAO,gBAAgB,CAAC,MAAM,CAAC,CAAC;AAClC,CAAC","sourcesContent":["import { readMeshInstance, meshInstancesLength, type MeshInstances } from './packedMeshInstances.js';\n// Bounding volume hierarchies of scene geometry (BLAS) and mesh instances\n// (TLAS), built with the binned SAH builder in ./binnedSahBvh and written\n// directly in the BVH2 layout read by the traversal shaders.\n\nimport Geometry from '../scene/Geometry.js';\nimport { mat4, vec3 } from '../math.js';\nimport { buildBinnedSahBvh, layoutBvh2 } from './binnedSahBvh.js';\n\nimport { read, write } from '../math/access.js';\nimport { attributeLength, attributeValue, indexStorage } from '../scene/attributeData.js';\nimport { Box3 } from './Box3.js';\nimport {quantizeDisplacementRange} from './displacementRange.js';\nexport { Box3 } from './Box3.js';\n\nexport const INSTANCE_VEC4_STRIDE = 10;\nexport const INSTANCE_WORD_STRIDE = INSTANCE_VEC4_STRIDE * 4;\n\nexport type BvhLayout = 'bvh2' | 'bvh4' | 'bvh-gpu' | 'cwbvh';\n\nexport interface FlattendBVH {\n /** CPU builder that produced the GPU traversal data. */\n builder?: 'builtin' | 'tinybvh';\n buildSurfaceArea?: number;\n maxDepth: number;\n /** Largest leaf fan-out; used with maxDepth to size the traversal stack. */\n maxLeafPrimitives?: number;\n buffer: ArrayBuffer;\n /** Source triangle IDs, (record, source triangle) pairs. */\n triangleIds?: Uint32Array;\n /** Precomputed data without a layout field uses the legacy BVH2 layout. */\n layout?: BvhLayout;\n\n instancesBuffer?: ArrayBuffer;\n}\n\nconst BLAS_LAYOUT_SHIFT = 30;\nconst BLAS_OFFSET_MASK = 0x3fffffff;\nconst blasLayoutCodes: Record<BvhLayout, number> = {\n bvh2: 0,\n bvh4: 1,\n 'bvh-gpu': 2,\n cwbvh: 3\n};\n\nfunction encodeBlasOffset(offset: number, layout: BvhLayout) {\n if (!Number.isSafeInteger(offset) || offset < 0 || offset > BLAS_OFFSET_MASK) {\n throw new Error(`BLAS offset ${offset} exceeds the packed 30-bit range`);\n }\n return (offset | (blasLayoutCodes[layout] << BLAS_LAYOUT_SHIFT)) | 0;\n}\n\nfunction unionBounds(bounds: Box3, a: Box3, b: Box3) {\n vec3.min(bounds.min, a.min, b.min);\n vec3.max(bounds.max, a.max, b.max);\n return bounds;\n}\n\nexport interface TLASInstance {\n blasIndex: number;\n bounds: Box3;\n transform: Float64Array;\n materialsIndices: number[];\n displacementScale?: number;\n color?: [number, number, number];\n}\n\nexport interface BLASInstance {\n bvh: FlattendBVH;\n trainglesCount: number;\n verticesCount: number;\n}\n\n// Keep a bounded specialization range for unusually deep hierarchies while\n// allowing large TinyBVH converted builds (for example Mustang_Red requires 51).\n// WebGPU still specializes each TLAS/BLAS stack to the scene's exact need.\nexport const MAX_TRAVERSAL_STACK_SIZE = 64;\n\nexport interface TraversalStackSizes {\n tlas: number;\n blas: number;\n}\n\n/**\n * Sizes independent TLAS and BLAS stacks for the nested WebGPU traversal.\n * A TLAS leaf is consumed in place, so its instance fan-out no longer needs\n * pending stack entries. TinyBVH converted layouts store their exact stack\n * requirement in maxDepth; BVH2 stores its tree depth.\n */\nexport function getTraversalStackSizes(\n tlas: FlattendBVH,\n blases: readonly BLASInstance[]\n): TraversalStackSizes {\n return {\n tlas: Math.min(\n MAX_TRAVERSAL_STACK_SIZE,\n Math.max(1, tlas.maxDepth)\n ),\n blas: Math.min(\n MAX_TRAVERSAL_STACK_SIZE,\n blases.reduce(\n (stackSize, blas) => Math.max(stackSize, blas.bvh.maxDepth),\n 1\n )\n )\n };\n}\n\nexport function concatBLASBuffers(blases: BLASInstance[]): ArrayBuffer {\n const buffers = blases.map((blas) => new Float32Array(blas.bvh.buffer));\n const totalLength = buffers.reduce((sum, buffer) => sum + buffer.length, 0);\n const result = new Float32Array(totalLength);\n let offset = 0;\n for (let i = 0; i < blases.length; i++) {\n result.set(buffers[i], offset);\n offset += buffers[i].length;\n }\n return result.buffer;\n}\n\nfunction packH(minH: number, maxH: number): number {\n const roundedMinH = Math.min(Math.floor(minH * 255), 255);\n const roundedMaxH =\n Math.abs(maxH - minH) < 1e-6\n ? roundedMinH\n : Math.min(Math.ceil(maxH * 255), 255);\n return (roundedMinH << 8) + roundedMaxH;\n}\n\n/** Writes min and max of a triangle, or of its displacement prism, to out. */\nfunction triangleBounds(\n positions: Float32Array,\n stride: number,\n normals: Float32Array | undefined,\n normalStride: number,\n i0: number,\n i1: number,\n i2: number,\n minHeight: number,\n maxHeight: number,\n out: Float32Array,\n o: number\n) {\n let minX = Infinity, minY = Infinity, minZ = Infinity;\n let maxX = -Infinity, maxY = -Infinity, maxZ = -Infinity;\n for (let corner = 0; corner < 3; corner++) {\n const vertex = corner === 0 ? i0 : corner === 1 ? i1 : i2;\n const p = vertex * stride;\n const x = positions[p], y = positions[p + 1], z = positions[p + 2];\n if (normals) {\n const n = vertex * normalStride;\n let nx = normals[n], ny = normals[n + 1], nz = normals[n + 2];\n const length = Math.sqrt(nx * nx + ny * ny + nz * nz);\n if (length > 0) {\n nx /= length; ny /= length; nz /= length;\n }\n for (let side = 0; side < 2; side++) {\n const h = side === 0 ? minHeight : maxHeight;\n const px = x + nx * h, py = y + ny * h, pz = z + nz * h;\n minX = Math.min(minX, px); minY = Math.min(minY, py); minZ = Math.min(minZ, pz);\n maxX = Math.max(maxX, px); maxY = Math.max(maxY, py); maxZ = Math.max(maxZ, pz);\n }\n } else {\n minX = Math.min(minX, x); minY = Math.min(minY, y); minZ = Math.min(minZ, z);\n maxX = Math.max(maxX, x); maxY = Math.max(maxY, y); maxZ = Math.max(maxZ, z);\n }\n }\n out[o] = minX; out[o + 1] = minY; out[o + 2] = minZ;\n out[o + 3] = maxX; out[o + 4] = maxY; out[o + 5] = maxZ;\n return isFinite(minX) && isFinite(minY) && isFinite(minZ) &&\n isFinite(maxX) && isFinite(maxY) && isFinite(maxZ);\n}\n\nfunction emptyBvh(isTLAS: boolean): FlattendBVH {\n return {\n builder: 'builtin',\n buildSurfaceArea: isTLAS ? undefined : 0,\n maxDepth: 0,\n maxLeafPrimitives: 0,\n buffer: new ArrayBuffer(0),\n layout: 'bvh2',\n instancesBuffer: isTLAS ? new ArrayBuffer(0) : undefined\n };\n}\n\n/** BLAS without triangles. */\nexport function emptyBLAS() {\n return emptyBvh(false);\n}\n\n/**\n * Builds a BVH2 BLAS over the geometry's triangles. Triangles with\n * non-finite bounds are skipped. With per-triangle displacement ranges\n * (min, max pairs scaled by displacementScale), leaves bound the\n * displacement prisms along the vertex normals and store the packed ranges.\n */\nexport function buildBLAS(\n geometry: Pick<Geometry, 'position' | 'indices' | 'normal'>,\n displacementScale = 0,\n trianglesDisplacement?: Float32Array\n): FlattendBVH {\n const position = geometry.position;\n const indexAttribute = geometry.indices;\n if (!position || !indexAttribute || !position.array.length) {\n return emptyBvh(false);\n }\n const indices = indexStorage(indexAttribute.array);\n const positions = position.array;\n const stride = position.itemSize;\n const normal = trianglesDisplacement ? geometry.normal : undefined;\n const normals = normal?.array;\n const normalStride = normal?.itemSize ?? 0;\n const triangleCount = Math.floor(attributeLength(indices) / 3);\n const aabbs = new Float32Array(triangleCount * 6);\n const triangles = new Uint32Array(triangleCount);\n let count = 0;\n for (let t = 0; t < triangleCount; t++) {\n let minHeight = 0, maxHeight = 0;\n if (normals) {\n minHeight = trianglesDisplacement![t * 2] * displacementScale;\n maxHeight = trianglesDisplacement![t * 2 + 1] * displacementScale;\n if (isNaN(minHeight) || isNaN(maxHeight)) {\n minHeight = 0;\n maxHeight = displacementScale;\n }\n }\n if (triangleBounds(\n positions, stride, normals, normalStride,\n attributeValue(indices, t * 3), attributeValue(indices, t * 3 + 1), attributeValue(indices, t * 3 + 2),\n minHeight, maxHeight, aabbs, count * 6\n )) {\n triangles[count++] = t;\n }\n }\n if (!count) return emptyBvh(false);\n\n const bvh = buildBinnedSahBvh(aabbs, count);\n const { order, offsets, vec4Count, maxDepth, maxLeafPrimitives } = layoutBvh2(bvh);\n const { bounds, leftFirst, primCount, primIndices } = bvh;\n const buffer = new ArrayBuffer(vec4Count * 16);\n const floats = new Float32Array(buffer);\n const ints = new Int32Array(buffer);\n let buildSurfaceArea = 0;\n const triangleIds: number[] = [];\n for (let k = 0; k < order.length; k++) {\n const node = order[k];\n const o = offsets[node] * 4, b = node * 6;\n floats[o] = bounds[b]; floats[o + 1] = bounds[b + 1]; floats[o + 2] = bounds[b + 2];\n floats[o + 4] = bounds[b + 3]; floats[o + 5] = bounds[b + 4]; floats[o + 6] = bounds[b + 5];\n const x = bounds[b + 3] - bounds[b], y = bounds[b + 4] - bounds[b + 1], z = bounds[b + 5] - bounds[b + 2];\n buildSurfaceArea += 2 * (x * z + x * y + z * y);\n const prims = primCount[node];\n if (!prims) {\n // Pointer to the second child.\n ints[o + 3] = offsets[leftFirst[node] + 1];\n continue;\n }\n // Negative signals to the shader that this node is a leaf.\n ints[o + 3] = -prims;\n for (let i = 0; i < prims; i++) {\n const t = triangles[primIndices[leftFirst[node] + i]];\n const e = o + 8 + i * 4;\n if (trianglesDisplacement) triangleIds.push(e / 4, t);\n ints[e] = attributeValue(indices, t * 3);\n ints[e + 1] = attributeValue(indices, t * 3 + 1);\n ints[e + 2] = attributeValue(indices, t * 3 + 2);\n // Pack minH, maxH to one channel.\n ints[e + 3] = trianglesDisplacement\n ? packH(trianglesDisplacement[t * 2], trianglesDisplacement[t * 2 + 1])\n : 0;\n }\n }\n\n return {\n builder: 'builtin',\n triangleIds: trianglesDisplacement ? new Uint32Array(triangleIds) : undefined,\n buildSurfaceArea,\n maxDepth,\n maxLeafPrimitives,\n buffer,\n layout: 'bvh2'\n };\n}\n\ninterface BlasPlacement {\n blasOffsets: number[];\n vertexOffsets: number[];\n layouts: BvhLayout[];\n}\n\nfunction getBlasPlacement(blases: BLASInstance[]): BlasPlacement {\n let blasOffset = 0;\n let vertexOffset = 0;\n const placement: BlasPlacement = { blasOffsets: [], vertexOffsets: [], layouts: [] };\n blases.forEach((blas) => {\n placement.blasOffsets.push(blasOffset);\n placement.vertexOffsets.push(vertexOffset);\n placement.layouts.push(blas.bvh.layout ?? 'bvh2');\n blasOffset += blas.bvh.buffer.byteLength / 16;\n vertexOffset += blas.verticesCount;\n });\n return placement;\n}\n\n/** Writes the instance's world bounds, padded by its displacement, to out. */\nfunction instanceBounds(instance: TLASInstance, out: Float32Array, o: number) {\n const { min, max } = instance.bounds;\n let padX = 0, padY = 0, padZ = 0;\n const displacementScale = instance.displacementScale;\n if (displacementScale) {\n const m = instance.transform;\n padX = Math.max(0, displacementScale * Math.hypot(read(m, 0), read(m, 1), read(m, 2)));\n padY = Math.max(0, displacementScale * Math.hypot(read(m, 4), read(m, 5), read(m, 6)));\n padZ = Math.max(0, displacementScale * Math.hypot(read(m, 8), read(m, 9), read(m, 10)));\n }\n out[o] = read(min, 0) - padX; out[o + 1] = read(min, 1) - padY; out[o + 2] = read(min, 2) - padZ;\n out[o + 3] = read(max, 0) + padX; out[o + 4] = read(max, 1) + padY; out[o + 5] = read(max, 2) + padZ;\n}\n\nfunction writeInstanceColor(output: Float32Array, offset: number, instance: TLASInstance) {\n const color = instance.color;\n output[offset] = color ? color[0] : 1;\n output[offset + 1] = color ? color[1] : 1;\n output[offset + 2] = color ? color[2] : 1;\n}\n\nfunction writeInstanceRecord(\n instanceInts: Int32Array,\n instanceFloats: Float32Array,\n targetIndex: number,\n instance: TLASInstance,\n placement: BlasPlacement\n) {\n const offset = targetIndex * INSTANCE_WORD_STRIDE;\n instanceInts[offset] = encodeBlasOffset(\n placement.blasOffsets[instance.blasIndex],\n placement.layouts[instance.blasIndex]\n );\n instanceInts[offset + 1] = placement.vertexOffsets[instance.blasIndex];\n instanceInts[offset + 2] = instance.materialsIndices[0] || 0;\n instanceFloats[offset + 3] = instance.displacementScale || 0;\n writeInstanceColor(instanceFloats, offset + 36, instance);\n instanceFloats[offset + 39] = 0;\n const inverse = mat4.invert(new Float64Array(16), instance.transform)!;\n for (let i = 0; i < 16; i++) {\n instanceFloats[offset + 4 + i] = inverse[i];\n instanceFloats[offset + 20 + i] = read(instance.transform, i);\n }\n}\n\n// Hardware adapters use the same instance/material/matrix packing without a\n// software hierarchy. Offsets are primitive offsets in their indexed geometry.\nexport function packLinearInstances(instances: MeshInstances, primitiveOffsets: number[], vertexOffsets: number[]): ArrayBuffer {\n const buffer = new ArrayBuffer(meshInstancesLength(instances) * INSTANCE_WORD_STRIDE * 4);\n const words = new Int32Array(buffer), floats = new Float32Array(buffer);\n const placement: BlasPlacement = {blasOffsets: primitiveOffsets, vertexOffsets,\n layouts: primitiveOffsets.map(() => 'bvh2')};\n for (let i = 0; i < meshInstancesLength(instances); i++) {\n writeInstanceRecord(words, floats, i, readMeshInstance(instances, i), placement);\n }\n return buffer;\n}\n\n/** Repack only selected source-order instance slots for hardware adapters. */\nexport function refitLinearInstances(buffer: ArrayBuffer, instances: MeshInstances, primitiveOffsets: number[], vertexOffsets: number[], dirty: ReadonlySet<number>): TLASRefitRange[] {\n const words = new Int32Array(buffer), floats = new Float32Array(buffer);\n const placement: BlasPlacement = {blasOffsets: primitiveOffsets, vertexOffsets, layouts: primitiveOffsets.map(() => 'bvh2')};\n const ranges: TLASRefitRange[] = [];\n for (const index of dirty) {\n writeInstanceRecord(words, floats, index, readMeshInstance(instances, index), placement);\n ranges.push({offset: index * INSTANCE_WORD_STRIDE * 4, size: INSTANCE_WORD_STRIDE * 4});\n }\n return mergeRefitRanges(ranges);\n}\n\n/**\n * Builds a BVH2 TLAS over the instances. Leaves store\n * (instance record, BLAS offset, source instance index, 0); instance records\n * are written in leaf order to instancesBuffer.\n */\nexport function buildTLAS(\n instances: MeshInstances,\n blases: BLASInstance[]\n): FlattendBVH {\n if (!meshInstancesLength(instances)) return emptyBvh(true);\n const placement = getBlasPlacement(blases);\n const aabbs = new Float32Array(meshInstancesLength(instances) * 6);\n for (let i = 0; i < meshInstancesLength(instances); i++) {\n instanceBounds(readMeshInstance(instances, i), aabbs, i * 6);\n }\n\n const bvh = buildBinnedSahBvh(aabbs, meshInstancesLength(instances));\n const { order, offsets, vec4Count, maxDepth, maxLeafPrimitives } = layoutBvh2(bvh);\n const { bounds, leftFirst, primCount, primIndices } = bvh;\n const buffer = new ArrayBuffer(vec4Count * 16);\n const floats = new Float32Array(buffer);\n const ints = new Int32Array(buffer);\n const instancesBuffer = new ArrayBuffer(meshInstancesLength(instances) * INSTANCE_WORD_STRIDE * 4);\n const instanceInts = new Int32Array(instancesBuffer);\n const instanceFloats = new Float32Array(instancesBuffer);\n let target = 0;\n for (let k = 0; k < order.length; k++) {\n const node = order[k];\n const o = offsets[node] * 4, b = node * 6;\n floats[o] = bounds[b]; floats[o + 1] = bounds[b + 1]; floats[o + 2] = bounds[b + 2];\n floats[o + 4] = bounds[b + 3]; floats[o + 5] = bounds[b + 4]; floats[o + 6] = bounds[b + 5];\n const prims = primCount[node];\n if (!prims) {\n ints[o + 3] = offsets[leftFirst[node] + 1];\n continue;\n }\n ints[o + 3] = -prims;\n for (let i = 0; i < prims; i++) {\n const source = primIndices[leftFirst[node] + i];\n const instance = readMeshInstance(instances, source);\n const e = o + 8 + i * 4;\n ints[e] = target;\n ints[e + 1] = placement.blasOffsets[instance.blasIndex];\n // Keep the source instance index in the otherwise-unused z lane so\n // the TLAS can be refitted without rebuilding its topology.\n ints[e + 2] = source;\n writeInstanceRecord(instanceInts, instanceFloats, target, instance, placement);\n target++;\n }\n }\n\n return {\n builder: 'builtin',\n maxDepth,\n maxLeafPrimitives,\n buffer,\n layout: 'bvh2',\n instancesBuffer\n };\n}\n\n/** Bounds transport for a platform BVH builder; same padding as buildTLAS. */\nexport function meshInstanceBounds(instances: MeshInstances): Float32Array {\n const bounds = new Float32Array(meshInstancesLength(instances) * 6);\n for (let i = 0; i < meshInstancesLength(instances); i++) instanceBounds(readMeshInstance(instances, i), bounds, i * 6);\n return bounds;\n}\n\n/** Pack a platform-built BVH2 hierarchy whose leaf x lane holds source indices. */\nexport function packBuiltTLAS(instances: MeshInstances, blases: BLASInstance[], hierarchy: FlattendBVH): FlattendBVH {\n const count = meshInstancesLength(instances);\n if (!count) return emptyBvh(true);\n const placement = getBlasPlacement(blases), words = new Int32Array(hierarchy.buffer);\n const instancesBuffer = new ArrayBuffer(count * INSTANCE_WORD_STRIDE * 4);\n const instanceInts = new Int32Array(instancesBuffer), instanceFloats = new Float32Array(instancesBuffer);\n const stack: number[] = [0]; let target = 0;\n while (stack.length) {\n const node = stack.pop()!, o = node * 4, child = words[o + 3];\n if (child >= 0) { stack.push(child); stack.push(node + 2); continue; }\n for (let i = 0; i < -child; i++) {\n const e = o + 8 + i * 4, source = words[e];\n if (source < 0 || source >= count || target >= count) throw new Error('Invalid platform TLAS instance');\n const instance = readMeshInstance(instances, source);\n words[e] = target; words[e + 1] = placement.blasOffsets[instance.blasIndex]; words[e + 2] = source; words[e + 3] = 0;\n writeInstanceRecord(instanceInts, instanceFloats, target++, instance, placement);\n }\n }\n if (target !== count) throw new Error('Platform TLAS instance count mismatch');\n hierarchy.instancesBuffer = instancesBuffer;\n return hierarchy;\n}\n\nexport interface TLASRefitRange {\n offset: number;\n size: number;\n}\n\nexport interface TLASRefitResult {\n tlasRanges: TLASRefitRange[];\n instanceRanges: TLASRefitRange[];\n}\n\ninterface TLASRefitMetadata {\n parent: Map<number, number>;\n depth: Map<number, number>;\n leavesBySource: Map<number, Set<number>>;\n instancesByLeaf: Map<number, { source: number; target: number }[]>;\n}\n\nconst tlasRefitMetadata = new WeakMap<FlattendBVH, TLASRefitMetadata>();\n\nfunction getTLASRefitMetadata(flattened: FlattendBVH, ints: Int32Array) {\n const cached = tlasRefitMetadata.get(flattened);\n if (cached) return cached;\n const metadata: TLASRefitMetadata = {\n parent: new Map(),\n depth: new Map(),\n leavesBySource: new Map(),\n instancesByLeaf: new Map()\n };\n const visit = (index: number, parent: number | undefined, depth: number) => {\n metadata.depth.set(index, depth);\n if (parent != null) metadata.parent.set(index, parent);\n const base = index * 4;\n const primitiveCountOrChild = ints[base + 3];\n if (primitiveCountOrChild >= 0) {\n visit(index + 2, index, depth + 1);\n visit(primitiveCountOrChild, index, depth + 1);\n return;\n }\n const entries: { source: number; target: number }[] = [];\n for (let i = 0; i < -primitiveCountOrChild; i++) {\n const primitiveOffset = base + 8 + i * 4;\n const target = ints[primitiveOffset];\n const source = ints[primitiveOffset + 2];\n entries.push({ source, target });\n const leaves = metadata.leavesBySource.get(source) ?? new Set<number>();\n leaves.add(index);\n metadata.leavesBySource.set(source, leaves);\n }\n metadata.instancesByLeaf.set(index, entries);\n };\n visit(0, undefined, 0);\n tlasRefitMetadata.set(flattened, metadata);\n return metadata;\n}\n\nexport function mergeRefitRanges(ranges: TLASRefitRange[]) {\n const sorted = ranges\n .filter(({ size }) => size > 0)\n .sort((left, right) => left.offset - right.offset);\n const merged: TLASRefitRange[] = [];\n for (const range of sorted) {\n const previous = merged[merged.length - 1];\n if (previous && range.offset <= previous.offset + previous.size) {\n previous.size = Math.max(\n previous.size,\n range.offset + range.size - previous.offset\n );\n } else {\n merged.push({ offset: range.offset, size: range.size });\n }\n }\n return merged;\n}\n\n/** A transactional candidate shares immutable refit topology metadata. */\nexport function copyTLASForRefit(flattened: FlattendBVH): FlattendBVH {\n const next = {...flattened, buffer: flattened.buffer.slice(0), instancesBuffer: flattened.instancesBuffer?.slice(0)};\n if (flattened.buffer.byteLength && flattened.instancesBuffer) {\n tlasRefitMetadata.set(next, getTLASRefitMetadata(flattened, new Int32Array(flattened.buffer)));\n }\n return next;\n}\n\nexport function refitTLAS(\n flattened: FlattendBVH,\n instances: MeshInstances,\n blases: BLASInstance[],\n dirtySourceIndices?: ReadonlySet<number>\n): TLASRefitResult {\n if (!flattened.instancesBuffer || !flattened.buffer.byteLength) {\n return { tlasRanges: [], instanceRanges: [] };\n }\n const floats = new Float32Array(flattened.buffer);\n const ints = new Int32Array(flattened.buffer);\n const instanceFloats = new Float32Array(flattened.instancesBuffer);\n const instanceInts = new Int32Array(flattened.instancesBuffer);\n\n const placement = getBlasPlacement(blases);\n const scratch = new Float32Array(6);\n\n function writeInstance(targetIndex: number, sourceIndex: number) {\n writeInstanceRecord(instanceInts, instanceFloats, targetIndex, readMeshInstance(instances, sourceIndex), placement);\n }\n\n function addInstanceBounds(bounds: Box3, instance: TLASInstance) {\n instanceBounds(instance, scratch, 0);\n write(bounds.min, 0, Math.min(read(bounds.min, 0), scratch[0]));\n write(bounds.min, 1, Math.min(read(bounds.min, 1), scratch[1]));\n write(bounds.min, 2, Math.min(read(bounds.min, 2), scratch[2]));\n write(bounds.max, 0, Math.max(read(bounds.max, 0), scratch[3]));\n write(bounds.max, 1, Math.max(read(bounds.max, 1), scratch[4]));\n write(bounds.max, 2, Math.max(read(bounds.max, 2), scratch[5]));\n }\n\n function writeNodeBounds(index: number, bounds: Box3) {\n const base = index * 4;\n floats[base] = read(bounds.min, 0);\n floats[base + 1] = read(bounds.min, 1);\n floats[base + 2] = read(bounds.min, 2);\n floats[base + 4] = read(bounds.max, 0);\n floats[base + 5] = read(bounds.max, 1);\n floats[base + 6] = read(bounds.max, 2);\n }\n\n function readNodeBounds(index: number) {\n const base = index * 4;\n const bounds = new Box3();\n vec3.set(bounds.min, floats[base], floats[base + 1], floats[base + 2]);\n vec3.set(\n bounds.max,\n floats[base + 4],\n floats[base + 5],\n floats[base + 6]\n );\n return bounds;\n }\n\n function refitNode(index: number): Box3 {\n const base = index * 4;\n const bounds = new Box3();\n const primitiveCountOrChild = ints[base + 3];\n if (primitiveCountOrChild >= 0) {\n const left = refitNode(index + 2);\n const right = refitNode(primitiveCountOrChild);\n unionBounds(bounds, left, right);\n } else {\n for (let i = 0; i < -primitiveCountOrChild; i++) {\n const primitiveOffset = base + 8 + i * 4;\n const targetInstance = ints[primitiveOffset];\n const sourceInstance = ints[primitiveOffset + 2];\n const instance = readMeshInstance(instances, sourceInstance);\n if (!instance) continue;\n addInstanceBounds(bounds, instance);\n writeInstance(targetInstance, sourceInstance);\n }\n }\n writeNodeBounds(index, bounds);\n return bounds;\n }\n\n if (!dirtySourceIndices) {\n refitNode(0);\n return {\n tlasRanges: [{ offset: 0, size: flattened.buffer.byteLength }],\n instanceRanges: [\n { offset: 0, size: flattened.instancesBuffer.byteLength }\n ]\n };\n }\n\n const metadata = getTLASRefitMetadata(flattened, ints);\n const dirtyLeaves = new Set<number>();\n const instanceRanges: TLASRefitRange[] = [];\n for (const source of dirtySourceIndices) {\n const leaves = metadata.leavesBySource.get(source);\n if (!leaves) continue;\n leaves.forEach((leaf) => dirtyLeaves.add(leaf));\n for (const leaf of leaves) {\n for (const entry of metadata.instancesByLeaf.get(leaf) ?? []) {\n if (entry.source !== source) continue;\n writeInstance(entry.target, source);\n instanceRanges.push({ offset: entry.target * INSTANCE_WORD_STRIDE * 4, size: INSTANCE_WORD_STRIDE * 4 });\n }\n }\n }\n\n const dirtyNodes = new Set<number>();\n for (const leaf of dirtyLeaves) {\n const bounds = new Box3();\n for (const { source } of metadata.instancesByLeaf.get(leaf) ?? []) {\n const instance = readMeshInstance(instances, source);\n if (instance) addInstanceBounds(bounds, instance);\n }\n writeNodeBounds(leaf, bounds);\n dirtyNodes.add(leaf);\n let parent = metadata.parent.get(leaf);\n while (parent != null) {\n dirtyNodes.add(parent);\n parent = metadata.parent.get(parent);\n }\n }\n\n const internalNodes = [...dirtyNodes]\n .filter((index) => ints[index * 4 + 3] >= 0)\n .sort(\n (left, right) =>\n (metadata.depth.get(right) ?? 0) - (metadata.depth.get(left) ?? 0)\n );\n for (const index of internalNodes) {\n const right = ints[index * 4 + 3];\n const bounds = new Box3();\n unionBounds(bounds, readNodeBounds(index + 2), readNodeBounds(right));\n writeNodeBounds(index, bounds);\n }\n\n return {\n tlasRanges: mergeRefitRanges(\n [...dirtyNodes].map((index) => ({ offset: index * 16, size: 32 }))\n ),\n instanceRanges: mergeRefitRanges(instanceRanges)\n };\n}\n\n/** Dynamic BLASes rebuild when their total node surface area doubles. */\nexport const DYNAMIC_BLAS_REBUILD_RATIO = 2;\n\ninterface BlasRefitData {\n /** Per leaf (vec4 index): offset of its vertex list in vertices. */\n offsets: Int32Array;\n /** Per leaf: unique vertex count followed by the vertices. */\n vertices: Uint32Array;\n /** Node indices (vec4 units) with descendants before their ancestors. */\n postorder: Int32Array;\n}\n\n// Leaf topology is immutable between BLAS builds. Deduplicate shared triangle\n// corners once so deformation refits read each leaf's vertex only once.\nconst blasRefitData = new WeakMap<ArrayBuffer, BlasRefitData>();\n\nfunction getBlasRefitData(buffer: ArrayBuffer): BlasRefitData {\n const cached = blasRefitData.get(buffer);\n if (cached) return cached;\n const ints = new Int32Array(buffer);\n const offsets = new Int32Array(ints.length / 4);\n const vertices: number[] = [];\n const preorder: number[] = [];\n const stack = [0];\n while (stack.length) {\n const index = stack.pop()!;\n preorder.push(index);\n const base = index * 4;\n const child = ints[base + 3];\n if (child >= 0) {\n stack.push(child, index + 2);\n continue;\n }\n offsets[index] = vertices.length;\n const countSlot = vertices.length;\n vertices.push(0);\n for (let i = 0; i < -child; i++) {\n for (let j = 0; j < 3; j++) {\n const vertex = ints[base + 8 + i * 4 + j];\n let seen = false;\n for (let k = countSlot + 1; k < vertices.length; k++) {\n if (vertices[k] === vertex) { seen = true; break; }\n }\n if (!seen) vertices.push(vertex);\n }\n }\n vertices[countSlot] = vertices.length - countSlot - 1;\n }\n const data = {\n offsets,\n vertices: new Uint32Array(vertices),\n postorder: new Int32Array(preorder.reverse())\n };\n blasRefitData.set(buffer, data);\n return data;\n}\n\n/** Refit a BVH2 BLAS after vertex deformation, preserving topology. */\nexport function refitBLAS(\n flattened: FlattendBVH,\n geometry: Pick<Geometry, 'position'> & Partial<Pick<Geometry, 'dynamic'>>,\n displacement?: {normal: Float32Array; scale: number; ranges: Float32Array}\n) {\n if ((flattened.layout ?? 'bvh2') !== 'bvh2' || !flattened.buffer.byteLength) {\n return false;\n }\n const { offsets, vertices, postorder } = getBlasRefitData(flattened.buffer);\n const floats = new Float32Array(flattened.buffer), ints = new Int32Array(flattened.buffer);\n const positions = geometry.position.array, stride = geometry.position.itemSize;\n const sourceTriangles = new Int32Array(displacement ? floats.length / 4 : 0).fill(-1);\n const prism = new Float32Array(6);\n if (displacement) {\n // Leaf source IDs remain distinct even for duplicate index triples.\n // Refuse old caches without this metadata before mutating their bounds.\n const triangleIds = flattened.triangleIds;\n if (!(triangleIds instanceof Uint32Array)) return false;\n for (let i = 0; i < triangleIds.length; i += 2) {\n const record: number = Number(triangleIds[i]);\n sourceTriangles[record] = triangleIds[i + 1];\n }\n }\n if (flattened.buildSurfaceArea == null) {\n let area = 0;\n for (const index of postorder) {\n const b = index * 4;\n const x = floats[b + 4] - floats[b], y = floats[b + 5] - floats[b + 1], z = floats[b + 6] - floats[b + 2];\n area += 2 * (x * z + x * y + z * y);\n }\n flattened.buildSurfaceArea = area;\n }\n let area = 0;\n for (let node = 0; node < postorder.length; node++) {\n const index = postorder[node], base = index * 4, child = ints[base + 3];\n let minX = Infinity, minY = Infinity, minZ = Infinity;\n let maxX = -Infinity, maxY = -Infinity, maxZ = -Infinity;\n if (child >= 0) {\n const left = base + 8, right = child * 4;\n minX = Math.min(floats[left], floats[right]); minY = Math.min(floats[left + 1], floats[right + 1]); minZ = Math.min(floats[left + 2], floats[right + 2]);\n maxX = Math.max(floats[left + 4], floats[right + 4]); maxY = Math.max(floats[left + 5], floats[right + 5]); maxZ = Math.max(floats[left + 6], floats[right + 6]);\n } else if (displacement) {\n for (let i = 0; i < -child; i++) {\n const record = base + 8 + i * 4;\n const ia = ints[record], ib = ints[record + 1], ic = ints[record + 2];\n const triangle = sourceTriangles[record / 4];\n if (triangle < 0) return false;\n const minimum = displacement.ranges[triangle * 2], maximum = displacement.ranges[triangle * 2 + 1];\n if (!triangleBounds(positions, stride, displacement.normal, 3, ia, ib, ic,\n minimum * displacement.scale, maximum * displacement.scale, prism, 0)) return false;\n ints[record + 3] = flattened.builder === 'tinybvh' ? quantizeDisplacementRange(minimum, maximum) : packH(minimum, maximum);\n minX = Math.min(minX, prism[0]); minY = Math.min(minY, prism[1]); minZ = Math.min(minZ, prism[2]);\n maxX = Math.max(maxX, prism[3]); maxY = Math.max(maxY, prism[4]); maxZ = Math.max(maxZ, prism[5]);\n }\n } else {\n const start = offsets[index], end = start + 1 + vertices[start];\n for (let i = start + 1; i < end; i++) {\n const offset = vertices[i] * stride;\n const x = positions[offset], y = positions[offset + 1], z = positions[offset + 2];\n if (!isFinite(x) || !isFinite(y) || !isFinite(z)) continue;\n minX = Math.min(minX, x); minY = Math.min(minY, y); minZ = Math.min(minZ, z);\n maxX = Math.max(maxX, x); maxY = Math.max(maxY, y); maxZ = Math.max(maxZ, z);\n }\n }\n const x = maxX - minX, y = maxY - minY, z = maxZ - minZ;\n area += 2 * (x * z + x * y + z * y);\n floats[base] = minX; floats[base + 1] = minY; floats[base + 2] = minZ;\n floats[base + 4] = maxX; floats[base + 5] = maxY; floats[base + 6] = maxZ;\n }\n return !geometry.dynamic || !(area > flattened.buildSurfaceArea * DYNAMIC_BLAS_REBUILD_RATIO);\n}\n\n/** Writes only instance colors; TLAS topology and bounds remain untouched. */\nexport function updateTLASInstanceColors(flattened: FlattendBVH, instances: MeshInstances, dirty: ReadonlySet<number>): TLASRefitRange[] {\n if (!flattened.instancesBuffer || !flattened.buffer.byteLength || !dirty.size) return [];\n const metadata = getTLASRefitMetadata(flattened, new Int32Array(flattened.buffer));\n const floats = new Float32Array(flattened.instancesBuffer);\n const ranges: TLASRefitRange[] = [];\n for (const source of dirty) {\n const leaves = metadata.leavesBySource.get(source);\n if (!leaves) continue;\n for (const leaf of leaves) {\n for (const entry of metadata.instancesByLeaf.get(leaf) ?? []) {\n if (entry.source !== source) continue;\n const offset = entry.target * INSTANCE_WORD_STRIDE + 36;\n writeInstanceColor(floats, offset, readMeshInstance(instances, source));\n ranges.push({offset: offset * 4, size: 16});\n }\n }\n }\n return mergeRefitRanges(ranges);\n}\n"]}
@@ -7,6 +7,7 @@ export declare function executeBvhBuild(request: BvhBuildRequest): Promise<{
7
7
  maxDepth: number;
8
8
  maxLeafPrimitives?: number;
9
9
  buffer: ArrayBuffer;
10
+ triangleIds?: Uint32Array;
10
11
  layout?: import("./bvhAccel.js").BvhLayout;
11
12
  instancesBuffer?: ArrayBuffer;
12
13
  }>;
@@ -1,7 +1,8 @@
1
1
  /** Freeze camera values without rounding Three.js's double-precision matrices. */
2
2
  export function cameraSnapshot(source) {
3
3
  const copy = source.clone();
4
- copy.transform = source.transform.slice();
4
+ const transform = source.transform;
5
+ copy.transform = transform instanceof Float32Array ? transform.slice() : transform.slice();
5
6
  return copy;
6
7
  }
7
8
  //# sourceMappingURL=cameraSnapshot.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"cameraSnapshot.js","sourceRoot":"","sources":["../../src/renderer/cameraSnapshot.ts"],"names":[],"mappings":"AACA,kFAAkF;AAClF,MAAM,UAAU,cAAc,CAAC,MAAc;IAC3C,MAAM,IAAI,GAAG,MAAM,CAAC,KAAK,EAAE,CAAC;IAC5B,IAAI,CAAC,SAAS,GAAG,MAAM,CAAC,SAAS,CAAC,KAAK,EAAE,CAAC;IAC1C,OAAO,IAAI,CAAC;AACd,CAAC","sourcesContent":["import type Camera from '../scene/Camera.js';\n/** Freeze camera values without rounding Three.js's double-precision matrices. */\nexport function cameraSnapshot(source: Camera): Camera {\n const copy = source.clone();\n copy.transform = source.transform.slice();\n return copy;\n}\n"]}
1
+ {"version":3,"file":"cameraSnapshot.js","sourceRoot":"","sources":["../../src/renderer/cameraSnapshot.ts"],"names":[],"mappings":"AACA,kFAAkF;AAClF,MAAM,UAAU,cAAc,CAAC,MAAc;IAC3C,MAAM,IAAI,GAAG,MAAM,CAAC,KAAK,EAAE,CAAC;IAC5B,MAAM,SAAS,GAAG,MAAM,CAAC,SAAS,CAAC;IACnC,IAAI,CAAC,SAAS,GAAG,SAAS,YAAY,YAAY,CAAC,CAAC,CAAC,SAAS,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,KAAK,EAAE,CAAC;IAC3F,OAAO,IAAI,CAAC;AACd,CAAC","sourcesContent":["import type Camera from '../scene/Camera.js';\n/** Freeze camera values without rounding Three.js's double-precision matrices. */\nexport function cameraSnapshot(source: Camera): Camera {\n const copy = source.clone();\n const transform = source.transform;\n copy.transform = transform instanceof Float32Array ? transform.slice() : transform.slice();\n return copy;\n}\n"]}
@@ -0,0 +1,2 @@
1
+ /** Packs the shared WGSL camera block. Matrices are column-major. */
2
+ export declare function packCameraUniform(viewProjectionInverse: Float32Array, cameraWorld: Float32Array, apertureRadius: number, focusDistance: number): Float32Array;
@@ -0,0 +1,12 @@
1
+ /** Packs the shared WGSL camera block. Matrices are column-major. */
2
+ export function packCameraUniform(viewProjectionInverse, cameraWorld, apertureRadius, focusDistance) {
3
+ const values = new Float32Array(36);
4
+ for (let i = 0; i < 16; i++) {
5
+ values[i] = viewProjectionInverse[i];
6
+ values[16 + i] = cameraWorld[i];
7
+ }
8
+ values[32] = apertureRadius;
9
+ values[33] = focusDistance;
10
+ return values;
11
+ }
12
+ //# sourceMappingURL=cameraUniform.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cameraUniform.js","sourceRoot":"","sources":["../../src/renderer/cameraUniform.ts"],"names":[],"mappings":"AAAA,qEAAqE;AACrE,MAAM,UAAU,iBAAiB,CAC/B,qBAAmC,EAAE,WAAyB,EAC9D,cAAsB,EAAE,aAAqB;IAE7C,MAAM,MAAM,GAAG,IAAI,YAAY,CAAC,EAAE,CAAC,CAAC;IACpC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC;QAC5B,MAAM,CAAC,CAAC,CAAC,GAAG,qBAAqB,CAAC,CAAC,CAAC,CAAC;QACrC,MAAM,CAAC,EAAE,GAAG,CAAC,CAAC,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC;IAClC,CAAC;IACD,MAAM,CAAC,EAAE,CAAC,GAAG,cAAc,CAAC;IAC5B,MAAM,CAAC,EAAE,CAAC,GAAG,aAAa,CAAC;IAC3B,OAAO,MAAM,CAAC;AAChB,CAAC","sourcesContent":["/** Packs the shared WGSL camera block. Matrices are column-major. */\nexport function packCameraUniform(\n viewProjectionInverse: Float32Array, cameraWorld: Float32Array,\n apertureRadius: number, focusDistance: number\n): Float32Array {\n const values = new Float32Array(36);\n for (let i = 0; i < 16; i++) {\n values[i] = viewProjectionInverse[i];\n values[16 + i] = cameraWorld[i];\n }\n values[32] = apertureRadius;\n values[33] = focusDistance;\n return values;\n}\n"]}
@@ -1,3 +1,5 @@
1
+ import MeshState from '../scene/MeshState.js';
2
+ import MaterialState from '../scene/MaterialState.js';
1
3
  import { createCanvas } from '../util/canvas.js';
2
4
  import Geometry from '../scene/Geometry.js';
3
5
  import InstancedMesh from '../scene/InstancedMesh.js';
@@ -53,6 +55,8 @@ export class CommittedScene {
53
55
  cloned = Array.isArray(value) ? [] : Object.create(Object.getPrototypeOf(value));
54
56
  this.copies.set(object, cloned);
55
57
  }
58
+ if (value instanceof MeshState || value instanceof MaterialState)
59
+ cloned.aovId = value.aovId;
56
60
  if (this.copying.has(object))
57
61
  return cloned;
58
62
  this.copying.add(object);
@@ -1 +1 @@
1
- {"version":3,"file":"committedScene.js","sourceRoot":"","sources":["../../src/renderer/committedScene.ts"],"names":[],"mappings":"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","sourcesContent":["import {createCanvas} from '../util/canvas.js';\nimport Geometry from '../scene/Geometry.js';\nimport InstancedMesh from '../scene/InstancedMesh.js';\nimport Texture from '../scene/Texture.js';\nimport { copyGeometryChangeState } from '../scene/geometryChanges.js';\nimport { getGeometryBvh, setGeometryBvh } from './geometryBvh.js';\nimport type { Scene } from '../scene/Scene.js';\nimport type { SceneChanges } from './sceneChangeDetector.js';\n\n/** Stable engine-owned mirrors isolate deferred GPU uploads from external edits. */\nexport class CommittedScene {\n private readonly copies = new WeakMap<object, any>();\n private readonly geometryVersions = new WeakMap<Geometry, number>();\n private readonly instanceVersions = new WeakMap<InstancedMesh, {transformsVersion: number; transforms: Float32Array; colorsVersion: number; colors?: Float32Array}>();\n private value?: Scene;\n private readonly copying = new WeakSet<object>();\n\n private copy<T>(value: T, retainGeometryBvh = false): T {\n if (!value || typeof value !== 'object') return value;\n const object = value as object;\n if ((typeof HTMLImageElement !== 'undefined' && object instanceof HTMLImageElement) || (typeof HTMLCanvasElement !== 'undefined' && object instanceof HTMLCanvasElement) ||\n (typeof OffscreenCanvas !== 'undefined' && object instanceof OffscreenCanvas) ||\n (typeof ImageBitmap !== 'undefined' && object instanceof ImageBitmap)) {\n const source = object as HTMLImageElement | HTMLCanvasElement | OffscreenCanvas | ImageBitmap;\n let canvas = this.copies.get(object) as HTMLCanvasElement | OffscreenCanvas | undefined;\n if (!canvas) { canvas = createCanvas(source.width, source.height); this.copies.set(object, canvas); }\n canvas.width = source.width; canvas.height = source.height;\n const context = canvas.getContext('2d') as CanvasRenderingContext2D | OffscreenCanvasRenderingContext2D | null;\n if (!context) throw new Error('Texture snapshot context is not available.');\n context.drawImage(source, 0, 0);\n return canvas as T;\n }\n if (typeof Node !== 'undefined' && object instanceof Node) return value;\n if (value instanceof Geometry && this.geometryVersions.get(value) === value.version) return this.copies.get(value);\n if (ArrayBuffer.isView(value)) {\n const previous = this.copies.get(object);\n if (previous?.constructor === value.constructor && previous.length === (value as any).length) {\n previous.set(value); return previous;\n }\n const cloned = (value as any).slice(); this.copies.set(object, cloned); return cloned;\n }\n if (value instanceof ArrayBuffer) return value.slice(0) as T;\n let cloned = this.copies.get(object);\n if (!cloned) { cloned = Array.isArray(value) ? [] : Object.create(Object.getPrototypeOf(value)); this.copies.set(object, cloned); }\n if (this.copying.has(object)) return cloned;\n this.copying.add(object);\n try {\n for (const key of Object.keys(value)) {\n if (value instanceof InstancedMesh && (key === 'transforms' || key === 'colors')) {\n const previous = this.instanceVersions.get(value);\n const version = key === 'transforms' ? value.transformsVersion : value.colorsVersion;\n const priorVersion = key === 'transforms' ? previous?.transformsVersion : previous?.colorsVersion;\n const array = value[key];\n if (!previous || priorVersion !== version || previous[key] !== array) {\n // Each batch owns its snapshot even when callers share source storage.\n if (!array) cloned[key] = undefined;\n else if (previous?.[key] === array && cloned[key]?.length === array.length) cloned[key].set(array);\n else cloned[key] = array.slice();\n }\n } else cloned[key] = value instanceof Texture && key === 'source' ? value.source : this.copy((value as any)[key], retainGeometryBvh);\n }\n } finally { this.copying.delete(object); }\n if (Array.isArray(value)) cloned.length = value.length;\n if (value instanceof InstancedMesh) this.instanceVersions.set(value, {\n transformsVersion: value.transformsVersion, transforms: value.transforms,\n colorsVersion: value.colorsVersion, colors: value.colors\n });\n if (value instanceof Geometry) {\n this.geometryVersions.set(value, value.version);\n // The renderer builds/refits BVHs on the committed geometry. A source\n // without a precomputed BVH must not erase that tree on every pose edit.\n // Full scene replacements cannot rely on an incremental renderer refit.\n const sourceBvh = getGeometryBvh(value);\n if (sourceBvh || !retainGeometryBvh) setGeometryBvh(cloned, sourceBvh);\n copyGeometryChangeState(value, cloned);\n }\n return cloned;\n }\n\n mirror<T extends object>(source: T): T { return this.copies.get(source); }\n\n capture(scene: Scene, changes: SceneChanges): Scene {\n if (!this.value || changes.meshes === 'full') this.value = { meshes: this.copy(scene.meshes), lights: this.copy(scene.lights), background: this.copy(scene.background) };\n else {\n for (const mesh of changes.transforms) {\n this.copy(mesh.transform);\n if (mesh instanceof InstancedMesh) this.copy(mesh, true);\n }\n for (const mesh of changes.colors) this.copy(mesh, true);\n for (const geometry of changes.geometries) this.copy(geometry, true);\n for (const material of changes.materials) this.copy(material);\n if (changes.lights) this.value.lights = this.copy(scene.lights);\n if (changes.background) this.value.background = this.copy(scene.background);\n }\n return this.value;\n }\n}\n"]}
1
+ {"version":3,"file":"committedScene.js","sourceRoot":"","sources":["../../src/renderer/committedScene.ts"],"names":[],"mappings":"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","sourcesContent":["import MeshState from '../scene/MeshState.js';\nimport MaterialState from '../scene/MaterialState.js';\nimport {createCanvas} from '../util/canvas.js';\nimport Geometry from '../scene/Geometry.js';\nimport InstancedMesh from '../scene/InstancedMesh.js';\nimport Texture from '../scene/Texture.js';\nimport { copyGeometryChangeState } from '../scene/geometryChanges.js';\nimport { getGeometryBvh, setGeometryBvh } from './geometryBvh.js';\nimport type { Scene } from '../scene/Scene.js';\nimport type { SceneChanges } from './sceneChangeDetector.js';\n\n/** Stable engine-owned mirrors isolate deferred GPU uploads from external edits. */\nexport class CommittedScene {\n private readonly copies = new WeakMap<object, any>();\n private readonly geometryVersions = new WeakMap<Geometry, number>();\n private readonly instanceVersions = new WeakMap<InstancedMesh, {transformsVersion: number; transforms: Float32Array; colorsVersion: number; colors?: Float32Array}>();\n private value?: Scene;\n private readonly copying = new WeakSet<object>();\n\n private copy<T>(value: T, retainGeometryBvh = false): T {\n if (!value || typeof value !== 'object') return value;\n const object = value as object;\n if ((typeof HTMLImageElement !== 'undefined' && object instanceof HTMLImageElement) || (typeof HTMLCanvasElement !== 'undefined' && object instanceof HTMLCanvasElement) ||\n (typeof OffscreenCanvas !== 'undefined' && object instanceof OffscreenCanvas) ||\n (typeof ImageBitmap !== 'undefined' && object instanceof ImageBitmap)) {\n const source = object as HTMLImageElement | HTMLCanvasElement | OffscreenCanvas | ImageBitmap;\n let canvas = this.copies.get(object) as HTMLCanvasElement | OffscreenCanvas | undefined;\n if (!canvas) { canvas = createCanvas(source.width, source.height); this.copies.set(object, canvas); }\n canvas.width = source.width; canvas.height = source.height;\n const context = canvas.getContext('2d') as CanvasRenderingContext2D | OffscreenCanvasRenderingContext2D | null;\n if (!context) throw new Error('Texture snapshot context is not available.');\n context.drawImage(source, 0, 0);\n return canvas as T;\n }\n if (typeof Node !== 'undefined' && object instanceof Node) return value;\n if (value instanceof Geometry && this.geometryVersions.get(value) === value.version) return this.copies.get(value);\n if (ArrayBuffer.isView(value)) {\n const previous = this.copies.get(object);\n if (previous?.constructor === value.constructor && previous.length === (value as any).length) {\n previous.set(value); return previous;\n }\n const cloned = (value as any).slice(); this.copies.set(object, cloned); return cloned;\n }\n if (value instanceof ArrayBuffer) return value.slice(0) as T;\n let cloned = this.copies.get(object);\n if (!cloned) { cloned = Array.isArray(value) ? [] : Object.create(Object.getPrototypeOf(value)); this.copies.set(object, cloned); }\n if (value instanceof MeshState || value instanceof MaterialState) cloned.aovId = value.aovId;\n if (this.copying.has(object)) return cloned;\n this.copying.add(object);\n try {\n for (const key of Object.keys(value)) {\n if (value instanceof InstancedMesh && (key === 'transforms' || key === 'colors')) {\n const previous = this.instanceVersions.get(value);\n const version = key === 'transforms' ? value.transformsVersion : value.colorsVersion;\n const priorVersion = key === 'transforms' ? previous?.transformsVersion : previous?.colorsVersion;\n const array = value[key];\n if (!previous || priorVersion !== version || previous[key] !== array) {\n // Each batch owns its snapshot even when callers share source storage.\n if (!array) cloned[key] = undefined;\n else if (previous?.[key] === array && cloned[key]?.length === array.length) cloned[key].set(array);\n else cloned[key] = array.slice();\n }\n } else cloned[key] = value instanceof Texture && key === 'source' ? value.source : this.copy((value as any)[key], retainGeometryBvh);\n }\n } finally { this.copying.delete(object); }\n if (Array.isArray(value)) cloned.length = value.length;\n if (value instanceof InstancedMesh) this.instanceVersions.set(value, {\n transformsVersion: value.transformsVersion, transforms: value.transforms,\n colorsVersion: value.colorsVersion, colors: value.colors\n });\n if (value instanceof Geometry) {\n this.geometryVersions.set(value, value.version);\n // The renderer builds/refits BVHs on the committed geometry. A source\n // without a precomputed BVH must not erase that tree on every pose edit.\n // Full scene replacements cannot rely on an incremental renderer refit.\n const sourceBvh = getGeometryBvh(value);\n if (sourceBvh || !retainGeometryBvh) setGeometryBvh(cloned, sourceBvh);\n copyGeometryChangeState(value, cloned);\n }\n return cloned;\n }\n\n mirror<T extends object>(source: T): T { return this.copies.get(source); }\n\n capture(scene: Scene, changes: SceneChanges): Scene {\n if (!this.value || changes.meshes === 'full') this.value = { meshes: this.copy(scene.meshes), lights: this.copy(scene.lights), background: this.copy(scene.background) };\n else {\n for (const mesh of changes.transforms) {\n this.copy(mesh.transform);\n if (mesh instanceof InstancedMesh) this.copy(mesh, true);\n }\n for (const mesh of changes.colors) this.copy(mesh, true);\n for (const geometry of changes.geometries) this.copy(geometry, true);\n for (const material of changes.materials) this.copy(material);\n if (changes.lights) this.value.lights = this.copy(scene.lights);\n if (changes.background) this.value.background = this.copy(scene.background);\n }\n return this.value;\n }\n}\n"]}
@@ -1,6 +1,5 @@
1
1
  import type { Denoiser } from '../Render.js';
2
2
  import type { JNLMDenoiser } from './jnlm.js';
3
- import type { OIDNDenoiser } from './oidnNetwork.js';
4
3
  export interface OIDNWebGPUData {
5
4
  data: GPUBuffer | GPUTexture;
6
5
  width: number;
@@ -16,9 +15,9 @@ export interface OIDNWeb {
16
15
  albedo: OIDNWeb;
17
16
  normal: OIDNWeb;
18
17
  };
19
- /** Optional serializable execution details exposed by native oidn-web. */
18
+ /** Optional serializable execution details exposed by native oidn-webgpu. */
20
19
  getRuntimeInfo?: () => unknown;
21
- /** Optional shape preparation supported by newer oidn-web runtimes. */
20
+ /** Optional shape preparation supported by newer oidn-webgpu runtimes. */
22
21
  prepareForImage?: (width: number, height: number, options?: {
23
22
  tileOverlap?: number;
24
23
  }) => Promise<void>;
@@ -54,12 +53,5 @@ export type DenoiserHandle = {
54
53
  } | {
55
54
  kind: 'custom';
56
55
  denoiser: Denoiser;
57
- };
58
- /** Only these handles are owned and released by the engine. */
59
- export type OwnedDenoiser = {
60
- kind: 'jnlm';
61
- denoiser: JNLMDenoiser;
62
- } | {
63
- kind: 'oidn';
64
- denoiser: OIDNDenoiser;
56
+ aovs?: readonly import('./aov.js').AovKind[];
65
57
  };
@@ -1 +1 @@
1
- {"version":3,"file":"denoiser.js","sourceRoot":"","sources":["../../src/renderer/denoiser.ts"],"names":[],"mappings":"","sourcesContent":["import type {Denoiser} from '../Render.js';\nimport type {JNLMDenoiser} from './jnlm.js';\nimport type {OIDNDenoiser} from './oidnNetwork.js';\n\nexport interface OIDNWebGPUData {\n data: GPUBuffer | GPUTexture;\n width: number;\n height: number;\n}\nexport interface OIDNWebGPUOutputData {\n data: GPUBuffer;\n width: number;\n height: number;\n}\n\nexport interface OIDNWeb {\n auxiliaryDenoisers?: {\n albedo: OIDNWeb;\n normal: OIDNWeb;\n };\n /** Optional serializable execution details exposed by native oidn-web. */\n getRuntimeInfo?: () => unknown;\n /** Optional shape preparation supported by newer oidn-web runtimes. */\n prepareForImage?: (\n width: number,\n height: number,\n options?: { tileOverlap?: number }\n ) => Promise<void>;\n tileExecute: (opts: {\n color: OIDNWebGPUData;\n albedo?: OIDNWebGPUData;\n normal?: OIDNWebGPUData;\n denoiseAlpha?: boolean;\n wholeImage?: boolean;\n tileOverlap?: number;\n scheduling?: 'animation-frame' | 'event-loop';\n done: (outputData: {\n data: GPUBuffer;\n width: number;\n height: number;\n }) => void;\n error?: (reason: unknown) => void;\n progress?: (\n outputData: OIDNWebGPUOutputData,\n tileData: OIDNWebGPUOutputData | undefined,\n tile: { x: number; y: number; width: number; height: number },\n currentIdx: number,\n totalIdx: number\n ) => void;\n }) => () => void;\n}\n\n/** Explicit private dispatch; built-ins do not implement the public custom interface. */\nexport type DenoiserHandle =\n | {kind: 'jnlm'; denoiser: JNLMDenoiser}\n | {kind: 'oidn'; denoiser: OIDNWeb}\n | {kind: 'custom'; denoiser: Denoiser};\n/** Only these handles are owned and released by the engine. */\nexport type OwnedDenoiser =\n | {kind: 'jnlm'; denoiser: JNLMDenoiser}\n | {kind: 'oidn'; denoiser: OIDNDenoiser};\n"]}
1
+ {"version":3,"file":"denoiser.js","sourceRoot":"","sources":["../../src/renderer/denoiser.ts"],"names":[],"mappings":"","sourcesContent":["import type {Denoiser} from '../Render.js';\nimport type {JNLMDenoiser} from './jnlm.js';\n\nexport interface OIDNWebGPUData {\n data: GPUBuffer | GPUTexture;\n width: number;\n height: number;\n}\nexport interface OIDNWebGPUOutputData {\n data: GPUBuffer;\n width: number;\n height: number;\n}\n\nexport interface OIDNWeb {\n auxiliaryDenoisers?: {\n albedo: OIDNWeb;\n normal: OIDNWeb;\n };\n /** Optional serializable execution details exposed by native oidn-webgpu. */\n getRuntimeInfo?: () => unknown;\n /** Optional shape preparation supported by newer oidn-webgpu runtimes. */\n prepareForImage?: (\n width: number,\n height: number,\n options?: { tileOverlap?: number }\n ) => Promise<void>;\n tileExecute: (opts: {\n color: OIDNWebGPUData;\n albedo?: OIDNWebGPUData;\n normal?: OIDNWebGPUData;\n denoiseAlpha?: boolean;\n wholeImage?: boolean;\n tileOverlap?: number;\n scheduling?: 'animation-frame' | 'event-loop';\n done: (outputData: {\n data: GPUBuffer;\n width: number;\n height: number;\n }) => void;\n error?: (reason: unknown) => void;\n progress?: (\n outputData: OIDNWebGPUOutputData,\n tileData: OIDNWebGPUOutputData | undefined,\n tile: { x: number; y: number; width: number; height: number },\n currentIdx: number,\n totalIdx: number\n ) => void;\n }) => () => void;\n}\n\n/** Explicit private dispatch; built-ins do not implement the public custom interface. */\nexport type DenoiserHandle =\n | {kind: 'jnlm'; denoiser: JNLMDenoiser}\n | {kind: 'oidn'; denoiser: OIDNWeb}\n | {kind: 'custom'; denoiser: Denoiser; aovs?: readonly import('./aov.js').AovKind[]};\n"]}
@@ -9,6 +9,9 @@ export function packDepthSampleArea(area, aspect) {
9
9
  return new Float32Array([area.x, 1 - area.y, area.size / aspect, area.size]);
10
10
  }
11
11
  export function unpackDepthSamples(rgba) {
12
- return Float32Array.from({ length: DEPTH_SAMPLE_COUNT }, (_, i) => rgba[i * 4]);
12
+ const result = new Float32Array(DEPTH_SAMPLE_COUNT);
13
+ for (let i = 0; i < result.length; i++)
14
+ result[i] = rgba[i * 4];
15
+ return result;
13
16
  }
14
17
  //# sourceMappingURL=depthQuery.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"depthQuery.js","sourceRoot":"","sources":["../../src/renderer/depthQuery.ts"],"names":[],"mappings":"AAUA,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,CAAC;AACnC,MAAM,CAAC,MAAM,kBAAkB,GAAG,iBAAiB,IAAI,CAAC,CAAC;AAEzD,+EAA+E;AAC/E,MAAM,UAAU,mBAAmB,CAAC,IAAqB,EAAE,MAAc;IACvE,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,EAAE,IAAI,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC;QAC7D,IAAI,CAAC,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,IAAI,GAAG,CAAC,IAAI,MAAM,IAAI,CAAC,EAAE,CAAC;QACvF,MAAM,IAAI,UAAU,CAAC,+FAA+F,CAAC,CAAC;IACxH,CAAC;IACD,OAAO,IAAI,YAAY,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,CAAC,EAAE,IAAI,CAAC,IAAI,GAAG,MAAM,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;AAC/E,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,IAAkB;IACnD,OAAO,YAAY,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,kBAAkB,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;AAClF,CAAC","sourcesContent":["/** A square depth sampling area in viewport coordinates. */\nexport interface DepthSampleArea {\n /** Horizontal center, 0..1 from the left. Required. */\n x: number;\n /** Vertical center, 0..1 from the top. Required. */\n y: number;\n /** Half height as a fraction of viewport height; 0 samples one point. Required. */\n size: number;\n}\n\nexport const DEPTH_SAMPLE_GRID = 7;\nexport const DEPTH_SAMPLE_COUNT = DEPTH_SAMPLE_GRID ** 2;\n\n/** Bottom-left UV center and half extent, matching both camera-ray shaders. */\nexport function packDepthSampleArea(area: DepthSampleArea, aspect: number) {\n if (![area.x, area.y, area.size, aspect].every(Number.isFinite) ||\n area.x < 0 || area.x > 1 || area.y < 0 || area.y > 1 || area.size < 0 || aspect <= 0) {\n throw new RangeError('Depth sampling requires a viewport center in 0..1, a non-negative size and a positive aspect.');\n }\n return new Float32Array([area.x, 1 - area.y, area.size / aspect, area.size]);\n}\n\nexport function unpackDepthSamples(rgba: Float32Array) {\n return Float32Array.from({ length: DEPTH_SAMPLE_COUNT }, (_, i) => rgba[i * 4]);\n}\n"]}
1
+ {"version":3,"file":"depthQuery.js","sourceRoot":"","sources":["../../src/renderer/depthQuery.ts"],"names":[],"mappings":"AAUA,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,CAAC;AACnC,MAAM,CAAC,MAAM,kBAAkB,GAAG,iBAAiB,IAAI,CAAC,CAAC;AAEzD,+EAA+E;AAC/E,MAAM,UAAU,mBAAmB,CAAC,IAAqB,EAAE,MAAc;IACvE,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,EAAE,IAAI,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC;QAC7D,IAAI,CAAC,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,IAAI,GAAG,CAAC,IAAI,MAAM,IAAI,CAAC,EAAE,CAAC;QACvF,MAAM,IAAI,UAAU,CAAC,+FAA+F,CAAC,CAAC;IACxH,CAAC;IACD,OAAO,IAAI,YAAY,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,CAAC,EAAE,IAAI,CAAC,IAAI,GAAG,MAAM,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;AAC/E,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,IAAkB;IACnD,MAAM,MAAM,GAAG,IAAI,YAAY,CAAC,kBAAkB,CAAC,CAAC;IACpD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,EAAE;QAAE,MAAM,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;IAChE,OAAO,MAAM,CAAC;AAChB,CAAC","sourcesContent":["/** A square depth sampling area in viewport coordinates. */\nexport interface DepthSampleArea {\n /** Horizontal center, 0..1 from the left. Required. */\n x: number;\n /** Vertical center, 0..1 from the top. Required. */\n y: number;\n /** Half height as a fraction of viewport height; 0 samples one point. Required. */\n size: number;\n}\n\nexport const DEPTH_SAMPLE_GRID = 7;\nexport const DEPTH_SAMPLE_COUNT = DEPTH_SAMPLE_GRID ** 2;\n\n/** Bottom-left UV center and half extent, matching both camera-ray shaders. */\nexport function packDepthSampleArea(area: DepthSampleArea, aspect: number) {\n if (![area.x, area.y, area.size, aspect].every(Number.isFinite) ||\n area.x < 0 || area.x > 1 || area.y < 0 || area.y > 1 || area.size < 0 || aspect <= 0) {\n throw new RangeError('Depth sampling requires a viewport center in 0..1, a non-negative size and a positive aspect.');\n }\n return new Float32Array([area.x, 1 - area.y, area.size / aspect, area.size]);\n}\n\nexport function unpackDepthSamples(rgba: Float32Array) {\n const result = new Float32Array(DEPTH_SAMPLE_COUNT);\n for (let i = 0; i < result.length; i++) result[i] = rgba[i * 4];\n return result;\n}\n"]}
@@ -0,0 +1,11 @@
1
+ import Geometry from '../scene/Geometry.js';
2
+ import MaterialState from '../scene/MaterialState.js';
3
+ import { vec2, vec3 } from '../math.js';
4
+ export declare function displacementBaseGeometry(geometry: Geometry, bias: number): Geometry;
5
+ export declare function computeDisplacementMinmax(w: number, sourceChannels: number, readHeight: (index: number) => number): Uint8Array<ArrayBufferLike>[];
6
+ export declare function sphericalProjectionTriangle<T0 extends vec3.Vec3Array, T1 extends vec3.Vec3Array, T2 extends vec3.Vec3Array, T3 extends vec2.Vec2Array, T4 extends vec2.Vec2Array, T5 extends vec2.Vec2Array>(na: T0, nb: T1, nc: T2, uvA: T3, uvB: T4, uvC: T5): boolean;
7
+ export declare function triplanarProjectionTriangle<T0 extends vec3.Vec3Array, T1 extends vec3.Vec3Array, T2 extends vec3.Vec3Array, T3 extends vec3.Vec3Array, T4 extends vec3.Vec3Array, T5 extends vec3.Vec3Array, T6 extends vec2.Vec2Array, T7 extends vec2.Vec2Array, T8 extends vec2.Vec2Array>(a: T0, b: T1, c: T2, na: T3, nb: T4, nc: T5, uvA: T6, uvB: T7, uvC: T8): void;
8
+ export declare function conservativeTrianglesDisplacementRange(triangleCount: number): Float32Array | undefined;
9
+ export declare function computeTrianglesDisplacementRange(geometry: Geometry, minmaxData: Uint8Array[], width: number, isFlipY: boolean, material: MaterialState): Float32Array<ArrayBufferLike>;
10
+ /** Conservative source-order AABBs for the actual displacement prism. */
11
+ export declare function displacementPrismAabbs(geometry: Geometry, displacementScale: number): Float32Array;