@meimu/mutracer 0.3.0 → 0.3.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (304) hide show
  1. package/CHANGELOG.md +222 -0
  2. package/LICENSES/FidelityFX-FSR.txt +19 -0
  3. package/LICENSES/pbrt-v4-Apache-2.0.txt +202 -0
  4. package/THIRD_PARTY_NOTICES.md +18 -4
  5. package/dist/assets/bvh.worker.js +1 -1
  6. package/dist/mutracer.umd.js +6260 -5580
  7. package/docs/api.md +45 -18
  8. package/docs/materials.md +4 -2
  9. package/docs/performance.md +7 -0
  10. package/docs/post-processing.md +62 -9
  11. package/docs/progressive-rendering.md +3 -0
  12. package/docs/sampling.md +4 -0
  13. package/docs/technical/acceleration.md +52 -0
  14. package/docs/technical/aovs.md +79 -0
  15. package/docs/technical/caustics.md +109 -0
  16. package/docs/technical/continuous-spectrum.md +29 -0
  17. package/docs/technical/display-upscale.md +82 -0
  18. package/docs/technical/openpbr.md +99 -0
  19. package/docs/technical/pbrt-import.md +168 -0
  20. package/docs/technical/tiling.md +74 -0
  21. package/docs/technical/webgl.md +53 -0
  22. package/docs/viewer.md +11 -1
  23. package/lib/Display.d.ts +19 -5
  24. package/lib/Display.js +10 -7
  25. package/lib/Display.js.map +1 -1
  26. package/lib/Engine.d.ts +2 -1
  27. package/lib/Engine.js +30 -2
  28. package/lib/Engine.js.map +1 -1
  29. package/lib/Render.d.ts +20 -11
  30. package/lib/Render.js +32 -7
  31. package/lib/Render.js.map +1 -1
  32. package/lib/main.d.ts +3 -1
  33. package/lib/main.js +1 -0
  34. package/lib/main.js.map +1 -1
  35. package/lib/oidn.d.ts +1 -1
  36. package/lib/renderer/AovPrimitiveCache.js +39 -8
  37. package/lib/renderer/AovPrimitiveCache.js.map +1 -1
  38. package/lib/renderer/DisplayPostProcess.d.ts +8 -3
  39. package/lib/renderer/DisplayPostProcess.js +51 -18
  40. package/lib/renderer/DisplayPostProcess.js.map +1 -1
  41. package/lib/renderer/MaterialData.js +7 -2
  42. package/lib/renderer/MaterialData.js.map +1 -1
  43. package/lib/renderer/RenderingPipeline.d.ts +7 -1
  44. package/lib/renderer/RenderingPipeline.js.map +1 -1
  45. package/lib/renderer/TileRender.d.ts +2 -2
  46. package/lib/renderer/TileRender.js +128 -7
  47. package/lib/renderer/TileRender.js.map +1 -1
  48. package/lib/renderer/WGPUAov.d.ts +6 -1
  49. package/lib/renderer/WGPUAov.js +108 -14
  50. package/lib/renderer/WGPUAov.js.map +1 -1
  51. package/lib/renderer/WGPUCanvasSurface.js +12 -1
  52. package/lib/renderer/WGPUCanvasSurface.js.map +1 -1
  53. package/lib/renderer/WGPUEnvMapDistribution.js +19 -19
  54. package/lib/renderer/WGPUFullQuadPass.js +3 -3
  55. package/lib/renderer/WGPURayTraceOutput.js +12 -12
  56. package/lib/renderer/WGPURayTracePass.d.ts +17 -4
  57. package/lib/renderer/WGPURayTracePass.js +194 -71
  58. package/lib/renderer/WGPURayTracePass.js.map +1 -1
  59. package/lib/renderer/WGPURenderingPipeline.js +46 -40
  60. package/lib/renderer/WGPURenderingPipeline.js.map +1 -1
  61. package/lib/renderer/WebGLAov.js +3 -3
  62. package/lib/renderer/WebGLAov.js.map +1 -1
  63. package/lib/renderer/WebGLFullQuadPass.d.ts +1 -1
  64. package/lib/renderer/WebGLFullQuadPass.js +8 -2
  65. package/lib/renderer/WebGLFullQuadPass.js.map +1 -1
  66. package/lib/renderer/WebGLJNLMDenoiser.js +66 -66
  67. package/lib/renderer/WebGLJNLMDenoiser.js.map +1 -1
  68. package/lib/renderer/WebGLRayTraceOutputPass.js +4 -4
  69. package/lib/renderer/WebGLRayTracePass.d.ts +14 -10
  70. package/lib/renderer/WebGLRayTracePass.js +115 -111
  71. package/lib/renderer/WebGLRayTracePass.js.map +1 -1
  72. package/lib/renderer/WebGLRenderingPipeline.js +10 -3
  73. package/lib/renderer/WebGLRenderingPipeline.js.map +1 -1
  74. package/lib/renderer/WebGLSkyBaker.js +57 -57
  75. package/lib/renderer/aov.d.ts +13 -1
  76. package/lib/renderer/aov.js +21 -2
  77. package/lib/renderer/aov.js.map +1 -1
  78. package/lib/renderer/aovDisplay.js +2 -2
  79. package/lib/renderer/aovDisplay.js.map +1 -1
  80. package/lib/renderer/binnedSahBvh.d.ts +2 -1
  81. package/lib/renderer/binnedSahBvh.js +24 -17
  82. package/lib/renderer/binnedSahBvh.js.map +1 -1
  83. package/lib/renderer/bvhAccel.d.ts +3 -1
  84. package/lib/renderer/bvhAccel.js +36 -6
  85. package/lib/renderer/bvhAccel.js.map +1 -1
  86. package/lib/renderer/cameraUniform.d.ts +1 -1
  87. package/lib/renderer/cameraUniform.js +6 -2
  88. package/lib/renderer/cameraUniform.js.map +1 -1
  89. package/lib/renderer/compactVertices.d.ts +14 -0
  90. package/lib/renderer/compactVertices.js +124 -0
  91. package/lib/renderer/compactVertices.js.map +1 -0
  92. package/lib/renderer/easu.d.ts +11 -0
  93. package/lib/renderer/easu.js +156 -0
  94. package/lib/renderer/easu.js.map +1 -0
  95. package/lib/renderer/geometryUpdateState.d.ts +1 -0
  96. package/lib/renderer/geometryUpdateState.js.map +1 -1
  97. package/lib/renderer/geometryUpdates.js +3 -2
  98. package/lib/renderer/geometryUpdates.js.map +1 -1
  99. package/lib/renderer/glsl/aovDisplay.frag.js +5 -5
  100. package/lib/renderer/glsl/aovReflectance.glsl.js +35 -35
  101. package/lib/renderer/glsl/aovReflectanceSamples.glsl.js +1 -1
  102. package/lib/renderer/glsl/aovTrace.frag.js +44 -36
  103. package/lib/renderer/glsl/aovTrace.frag.js.map +1 -1
  104. package/lib/renderer/glsl/chunks/cameraProjection.glsl.d.ts +2 -0
  105. package/lib/renderer/glsl/chunks/cameraProjection.glsl.js +16 -0
  106. package/lib/renderer/glsl/chunks/cameraProjection.glsl.js.map +1 -0
  107. package/lib/renderer/glsl/chunks/cameraRay.glsl.d.ts +1 -1
  108. package/lib/renderer/glsl/chunks/cameraRay.glsl.js +9 -16
  109. package/lib/renderer/glsl/chunks/cameraRay.glsl.js.map +1 -1
  110. package/lib/renderer/glsl/chunks/emissiveLight.glsl.js +8 -8
  111. package/lib/renderer/glsl/chunks/envMap.glsl.js +67 -67
  112. package/lib/renderer/glsl/chunks/intersect.glsl.js +390 -375
  113. package/lib/renderer/glsl/chunks/intersect.glsl.js.map +1 -1
  114. package/lib/renderer/glsl/chunks/materialBuffer.glsl.js +120 -120
  115. package/lib/renderer/glsl/chunks/openPbrBsdf.glsl.js +562 -562
  116. package/lib/renderer/glsl/chunks/rand.glsl.js +3 -3
  117. package/lib/renderer/glsl/chunks/random.glsl.js +4 -4
  118. package/lib/renderer/glsl/chunks/rayTraceCore.glsl.js +37 -35
  119. package/lib/renderer/glsl/chunks/rayTraceCore.glsl.js.map +1 -1
  120. package/lib/renderer/glsl/chunks/sampleLight.glsl.js +70 -74
  121. package/lib/renderer/glsl/chunks/sampleLight.glsl.js.map +1 -1
  122. package/lib/renderer/glsl/chunks/sampleMaterial.glsl.d.ts +1 -1
  123. package/lib/renderer/glsl/chunks/sampleMaterial.glsl.js +107 -88
  124. package/lib/renderer/glsl/chunks/sampleMaterial.glsl.js.map +1 -1
  125. package/lib/renderer/glsl/chunks/sampleShadowCatcher.glsl.js +11 -11
  126. package/lib/renderer/glsl/chunks/sampling.glsl.js +77 -77
  127. package/lib/renderer/glsl/chunks/sobol.glsl.js +70 -70
  128. package/lib/renderer/glsl/chunks/spectralPrefix.glsl.d.ts +6 -0
  129. package/lib/renderer/glsl/chunks/spectralPrefix.glsl.js +47 -0
  130. package/lib/renderer/glsl/chunks/spectralPrefix.glsl.js.map +1 -0
  131. package/lib/renderer/glsl/chunks/textureLinear.glsl.js +5 -5
  132. package/lib/renderer/glsl/chunks/uvProjection.glsl.js +11 -11
  133. package/lib/renderer/glsl/depthQuery.frag.js +12 -6
  134. package/lib/renderer/glsl/depthQuery.frag.js.map +1 -1
  135. package/lib/renderer/glsl/normalizeRayTraceOutput.frag.js +10 -10
  136. package/lib/renderer/glsl/rayTrace.frag.js +233 -170
  137. package/lib/renderer/glsl/rayTrace.frag.js.map +1 -1
  138. package/lib/renderer/glsl/shadowCatcher.frag.js +10 -9
  139. package/lib/renderer/glsl/shadowCatcher.frag.js.map +1 -1
  140. package/lib/renderer/glsl/webglPipeline.frag.js +58 -58
  141. package/lib/renderer/gpuMemory.js +1 -1
  142. package/lib/renderer/gpuMemory.js.map +1 -1
  143. package/lib/renderer/openPbrEnergyLut.d.ts +2 -1
  144. package/lib/renderer/openPbrEnergyLut.js +18 -1
  145. package/lib/renderer/openPbrEnergyLut.js.map +1 -1
  146. package/lib/renderer/pathLimits.d.ts +5 -4
  147. package/lib/renderer/pathLimits.js +6 -5
  148. package/lib/renderer/pathLimits.js.map +1 -1
  149. package/lib/renderer/prepareMeshBVH.d.ts +2 -0
  150. package/lib/renderer/prepareMeshBVH.js +5 -3
  151. package/lib/renderer/prepareMeshBVH.js.map +1 -1
  152. package/lib/renderer/progressiveScheduler.js +1 -1
  153. package/lib/renderer/progressiveScheduler.js.map +1 -1
  154. package/lib/renderer/renderPipeline.d.ts +4 -0
  155. package/lib/renderer/renderPipeline.js +1 -0
  156. package/lib/renderer/renderPipeline.js.map +1 -1
  157. package/lib/renderer/researchTransport.d.ts +1 -1
  158. package/lib/renderer/researchTransport.js.map +1 -1
  159. package/lib/renderer/sceneAssembly.d.ts +1 -1
  160. package/lib/renderer/sceneAssembly.js +4 -3
  161. package/lib/renderer/sceneAssembly.js.map +1 -1
  162. package/lib/renderer/sceneChangeDetector.d.ts +1 -1
  163. package/lib/renderer/sceneChangeDetector.js +3 -1
  164. package/lib/renderer/sceneChangeDetector.js.map +1 -1
  165. package/lib/renderer/sceneLayoutSchema.d.ts +1 -0
  166. package/lib/renderer/sceneLayoutSchema.js +2 -2
  167. package/lib/renderer/sceneLayoutSchema.js.map +1 -1
  168. package/lib/renderer/scenePreparation.d.ts +3 -2
  169. package/lib/renderer/scenePreparation.js +18 -2
  170. package/lib/renderer/scenePreparation.js.map +1 -1
  171. package/lib/renderer/scratchSampling.js +6 -6
  172. package/lib/renderer/spectrum.js +2 -2
  173. package/lib/renderer/staticBvhPreparation.d.ts +9 -0
  174. package/lib/renderer/staticBvhPreparation.js +8 -2
  175. package/lib/renderer/staticBvhPreparation.js.map +1 -1
  176. package/lib/renderer/surfaceHit.d.ts +10 -0
  177. package/lib/renderer/surfaceHit.js +22 -0
  178. package/lib/renderer/surfaceHit.js.map +1 -0
  179. package/lib/renderer/tangentRequirements.d.ts +2 -0
  180. package/lib/renderer/tangentRequirements.js +7 -0
  181. package/lib/renderer/tangentRequirements.js.map +1 -0
  182. package/lib/renderer/textureAtlas.d.ts +4 -0
  183. package/lib/renderer/textureAtlas.js +48 -2
  184. package/lib/renderer/textureAtlas.js.map +1 -1
  185. package/lib/renderer/webgl.js +4 -0
  186. package/lib/renderer/webgl.js.map +1 -1
  187. package/lib/renderer/webglVertexAttributes.d.ts +17 -0
  188. package/lib/renderer/webglVertexAttributes.js +44 -0
  189. package/lib/renderer/webglVertexAttributes.js.map +1 -0
  190. package/lib/renderer/wgpuBindlessSource.js +2 -2
  191. package/lib/renderer/wgpuMaterialConstants.js +4 -3
  192. package/lib/renderer/wgpuMaterialConstants.js.map +1 -1
  193. package/lib/renderer/wgpuSceneUniform.js +2 -2
  194. package/lib/renderer/wgpuSceneUniform.js.map +1 -1
  195. package/lib/renderer/wgpuShaderSource.d.ts +15 -0
  196. package/lib/renderer/wgpuShaderSource.js +1 -1
  197. package/lib/renderer/wgpuShaderSource.js.map +1 -1
  198. package/lib/renderer/wgsl/aovCompact.wgsl.d.ts +4 -0
  199. package/lib/renderer/wgsl/aovCompact.wgsl.js +26 -0
  200. package/lib/renderer/wgsl/aovCompact.wgsl.js.map +1 -0
  201. package/lib/renderer/wgsl/aovDisplay.wgsl.js +9 -9
  202. package/lib/renderer/wgsl/aovReflectance.wgsl.js +39 -39
  203. package/lib/renderer/wgsl/aovReflectanceSamples.wgsl.js +1 -1
  204. package/lib/renderer/wgsl/aovResolve.wgsl.d.ts +4 -0
  205. package/lib/renderer/wgsl/aovResolve.wgsl.js +21 -2
  206. package/lib/renderer/wgsl/aovResolve.wgsl.js.map +1 -1
  207. package/lib/renderer/wgsl/aovSnapshot.wgsl.js +2 -2
  208. package/lib/renderer/wgsl/aovSnapshot.wgsl.js.map +1 -1
  209. package/lib/renderer/wgsl/aovTrace.wgsl.js +31 -31
  210. package/lib/renderer/wgsl/aovTraceDisplay.wgsl.d.ts +2 -0
  211. package/lib/renderer/wgsl/aovTraceDisplay.wgsl.js +56 -0
  212. package/lib/renderer/wgsl/aovTraceDisplay.wgsl.js.map +1 -0
  213. package/lib/renderer/wgsl/bloom.wgsl.js +18 -18
  214. package/lib/renderer/wgsl/causticLight.compute.d.ts +1 -1
  215. package/lib/renderer/wgsl/causticLight.compute.js +121 -119
  216. package/lib/renderer/wgsl/causticLight.compute.js.map +1 -1
  217. package/lib/renderer/wgsl/chunks/background.wgsl.js +46 -46
  218. package/lib/renderer/wgsl/chunks/causticAdjoint.wgsl.js +4 -4
  219. package/lib/renderer/wgsl/chunks/causticAtomic.wgsl.js +3 -3
  220. package/lib/renderer/wgsl/chunks/caustics.wgsl.js +3 -3
  221. package/lib/renderer/wgsl/chunks/common.wgsl.js +4 -4
  222. package/lib/renderer/wgsl/chunks/envMap.wgsl.js +30 -30
  223. package/lib/renderer/wgsl/chunks/intersect.wgsl.d.ts +6 -2
  224. package/lib/renderer/wgsl/chunks/intersect.wgsl.js +550 -542
  225. package/lib/renderer/wgsl/chunks/intersect.wgsl.js.map +1 -1
  226. package/lib/renderer/wgsl/chunks/intersectionAlpha.wgsl.d.ts +1 -1
  227. package/lib/renderer/wgsl/chunks/intersectionAlpha.wgsl.js +18 -16
  228. package/lib/renderer/wgsl/chunks/intersectionAlpha.wgsl.js.map +1 -1
  229. package/lib/renderer/wgsl/chunks/materialBuffer.wgsl.d.ts +2 -1
  230. package/lib/renderer/wgsl/chunks/materialBuffer.wgsl.js +70 -69
  231. package/lib/renderer/wgsl/chunks/materialBuffer.wgsl.js.map +1 -1
  232. package/lib/renderer/wgsl/chunks/openPbrBsdf.wgsl.js +593 -593
  233. package/lib/renderer/wgsl/chunks/pdm_displacement.wgsl.js +118 -118
  234. package/lib/renderer/wgsl/chunks/rand.wgsl.js +3 -3
  235. package/lib/renderer/wgsl/chunks/rayTraceCore.wgsl.d.ts +4 -1
  236. package/lib/renderer/wgsl/chunks/rayTraceCore.wgsl.js +32 -26
  237. package/lib/renderer/wgsl/chunks/rayTraceCore.wgsl.js.map +1 -1
  238. package/lib/renderer/wgsl/chunks/sampleLight.wgsl.js +114 -114
  239. package/lib/renderer/wgsl/chunks/sampleMaterial.wgsl.d.ts +1 -1
  240. package/lib/renderer/wgsl/chunks/sampleMaterial.wgsl.js +159 -137
  241. package/lib/renderer/wgsl/chunks/sampleMaterial.wgsl.js.map +1 -1
  242. package/lib/renderer/wgsl/chunks/sampleShadowCatcher.wgsl.js +8 -8
  243. package/lib/renderer/wgsl/chunks/sampling.wgsl.js +74 -74
  244. package/lib/renderer/wgsl/chunks/sobol.wgsl.js +74 -74
  245. package/lib/renderer/wgsl/chunks/spectralPrefix.wgsl.d.ts +6 -0
  246. package/lib/renderer/wgsl/chunks/spectralPrefix.wgsl.js +66 -0
  247. package/lib/renderer/wgsl/chunks/spectralPrefix.wgsl.js.map +1 -0
  248. package/lib/renderer/wgsl/chunks/uvProjection.wgsl.js +11 -11
  249. package/lib/renderer/wgsl/chunks/vertexAttributes.wgsl.d.ts +2 -0
  250. package/lib/renderer/wgsl/chunks/vertexAttributes.wgsl.js +61 -0
  251. package/lib/renderer/wgsl/chunks/vertexAttributes.wgsl.js.map +1 -0
  252. package/lib/renderer/wgsl/compose.frag.wgsl.d.ts +2 -0
  253. package/lib/renderer/wgsl/compose.frag.wgsl.js +99 -97
  254. package/lib/renderer/wgsl/compose.frag.wgsl.js.map +1 -1
  255. package/lib/renderer/wgsl/customDenoise.wgsl.js +10 -10
  256. package/lib/renderer/wgsl/depthQuery.wgsl.d.ts +1 -1
  257. package/lib/renderer/wgsl/depthQuery.wgsl.js +11 -2
  258. package/lib/renderer/wgsl/depthQuery.wgsl.js.map +1 -1
  259. package/lib/renderer/wgsl/easu.wgsl.d.ts +2 -0
  260. package/lib/renderer/wgsl/easu.wgsl.js +80 -0
  261. package/lib/renderer/wgsl/easu.wgsl.js.map +1 -0
  262. package/lib/renderer/wgsl/easuDetail.wgsl.d.ts +21 -0
  263. package/lib/renderer/wgsl/easuDetail.wgsl.js +230 -0
  264. package/lib/renderer/wgsl/easuDetail.wgsl.js.map +1 -0
  265. package/lib/renderer/wgsl/jnlm.compute.js +74 -74
  266. package/lib/renderer/wgsl/jnlm.compute.js.map +1 -1
  267. package/lib/renderer/wgsl/offlineAdaptive.compute.js +26 -26
  268. package/lib/renderer/wgsl/oidnAuxiliary.wgsl.js +3 -3
  269. package/lib/renderer/wgsl/photonMap.compute.js +89 -89
  270. package/lib/renderer/wgsl/proceduralSky.compute.js +61 -61
  271. package/lib/renderer/wgsl/rayTrace.compute.d.ts +14 -0
  272. package/lib/renderer/wgsl/rayTrace.compute.js +395 -333
  273. package/lib/renderer/wgsl/rayTrace.compute.js.map +1 -1
  274. package/lib/scene/Scene.js.map +1 -1
  275. package/lib/settings/render.d.ts +11 -0
  276. package/lib/settings/render.js +1 -0
  277. package/lib/settings/render.js.map +1 -1
  278. package/lib/util/fromTHREE.js +21 -14
  279. package/lib/util/fromTHREE.js.map +1 -1
  280. package/lib/version.d.ts +1 -1
  281. package/lib/version.js +1 -1
  282. package/lib/version.js.map +1 -1
  283. package/package.json +5 -2
  284. package/lib/oidnBundledWeights.cdn.d.ts +0 -2
  285. package/lib/oidnBundledWeights.cdn.js +0 -5
  286. package/lib/oidnBundledWeights.cdn.js.map +0 -1
  287. package/lib/renderer/bvh.worker.d.ts +0 -1
  288. package/lib/renderer/bvh.worker.js +0 -16
  289. package/lib/renderer/bvh.worker.js.map +0 -1
  290. package/lib/renderer/bvhWorkerBuild.d.ts +0 -13
  291. package/lib/renderer/bvhWorkerBuild.js +0 -17
  292. package/lib/renderer/bvhWorkerBuild.js.map +0 -1
  293. package/lib/renderer/lightCore.d.ts +0 -12
  294. package/lib/renderer/lightCore.js +0 -13
  295. package/lib/renderer/lightCore.js.map +0 -1
  296. package/lib/renderer/materialCore.d.ts +0 -8
  297. package/lib/renderer/materialCore.js +0 -9
  298. package/lib/renderer/materialCore.js.map +0 -1
  299. package/lib/scene/PixelTexture.d.ts +0 -6
  300. package/lib/scene/PixelTexture.js +0 -10
  301. package/lib/scene/PixelTexture.js.map +0 -1
  302. package/lib/util/studioLighting.d.ts +0 -18
  303. package/lib/util/studioLighting.js +0 -36
  304. package/lib/util/studioLighting.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, 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"]}
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;AAED,8EAA8E;AAC9E,MAAM,CAAC,MAAM,aAAa,GAAG,EAAE,CAAC;AAiBhC,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,EACtB,IAAI,GAAG,CAAC,EACR,iBAAiB,GAAG,KAAK;IAEzB,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,EAAE,IAAI,CAAC,CAAC;IAC3E,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,wEAAwE;IACxE,oDAAoD;IACpD,MAAM,MAAM,GAAG,IAAI,WAAW,CAAC,CAAC,SAAS,GAAG,CAAC,iBAAiB,CAAC,CAAC,CAAC,mBAAmB,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC;IAChH,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,IAAI,iBAAiB,EAAE,CAAC;gBACtB,MAAM,GAAG,GAAG,SAAS,GAAG,MAAM,GAAG,CAAC,CAAC;gBACnC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC;gBAClB,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,MAAM,GAAG,CAAC,GAAG,CAAC,CAAC,EAAE,GAAG,GAAG,CAAC,CAAC,CAAC;gBAChE,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,GAAG,CAAC,EAAE,MAAM,GAAG,CAAC,GAAG,CAAC,CAAC,EAAE,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;YAC1E,CAAC;YACD,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,+EAA+E;AAC/E,MAAM,UAAU,YAAY,CAAC,SAAwB,EAAE,MAAsB;IAC3E,OAAO,SAAS,CAAC,SAAS,EAAE,MAAM,EAAE,aAAa,EAAE,IAAI,CAAC,CAAC;AAC3D,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,MAAM,SAAS,GAAqB,EAAE,CAAC;IACvC,SAAS,YAAY,CAAC,eAAuB,EAAE,QAAsB;QACnE,MAAM,GAAG,GAAG,IAAI,CAAC,eAAe,GAAG,CAAC,CAAC,CAAC;QACtC,IAAI,CAAC,GAAG;YAAE,OAAO;QACjB,cAAc,CAAC,QAAQ,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC;QACrC,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,GAAG,GAAG,CAAC,CAAC,CAAC;QAC5C,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;QAChD,SAAS,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,GAAG,GAAG,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC;IACjD,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,YAAY,CAAC,eAAe,EAAE,QAAQ,CAAC,CAAC;gBACxC,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,MAAM,OAAO,GAAG,QAAQ,CAAC,eAAe,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;QACzD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YACxC,MAAM,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;YAC9B,MAAM,QAAQ,GAAG,gBAAgB,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;YACrD,IAAI,QAAQ,EAAE,CAAC;gBACb,iBAAiB,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;gBACpC,IAAI,kBAAkB,CAAC,GAAG,CAAC,MAAM,CAAC;oBAAE,YAAY,CAAC,IAAI,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,QAAQ,CAAC,CAAC;YACnF,CAAC;QACH,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,SAAS,EAAE,GAAG,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,CAAC,CACtF;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\n// More TLAS bins separate overlapping static instances; native retains eight.\nexport const WEB_TLAS_BINS = 64;\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 bins = 8,\n perInstanceBounds = false\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), bins);\n const { order, offsets, vec4Count, maxDepth, maxLeafPrimitives } = layoutBvh2(bvh);\n const { bounds, leftFirst, primCount, primIndices } = bvh;\n // Web TLAS leaves point at separate world boxes. Keep the shared/native\n // instance stride and legacy leaf layout unchanged.\n const buffer = new ArrayBuffer((vec4Count + (perInstanceBounds ? meshInstancesLength(instances) * 2 : 0)) * 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 if (perInstanceBounds) {\n const box = vec4Count + target * 2;\n ints[e + 3] = box;\n floats.set(aabbs.subarray(source * 6, source * 6 + 3), box * 4);\n floats.set(aabbs.subarray(source * 6 + 3, source * 6 + 6), box * 4 + 4);\n }\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// Web-only leaf boxes; shared and native callers retain their existing layout.\nexport function buildWebTLAS(instances: MeshInstances, blases: BLASInstance[]): FlattendBVH {\n return buildTLAS(instances, blases, WEB_TLAS_BINS, true);\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 const boxRanges: TLASRefitRange[] = [];\n function writeLeafBox(primitiveOffset: number, instance: TLASInstance) {\n const box = ints[primitiveOffset + 3];\n if (!box) return;\n instanceBounds(instance, scratch, 0);\n floats.set(scratch.subarray(0, 3), box * 4);\n floats.set(scratch.subarray(3, 6), box * 4 + 4);\n boxRanges.push({ offset: box * 16, size: 32 });\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 writeLeafBox(primitiveOffset, 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 const entries = metadata.instancesByLeaf.get(leaf) ?? [];\n for (let i = 0; i < entries.length; i++) {\n const { source } = entries[i];\n const instance = readMeshInstance(instances, source);\n if (instance) {\n addInstanceBounds(bounds, instance);\n if (dirtySourceIndices.has(source)) writeLeafBox(leaf * 4 + 8 + i * 4, instance);\n }\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 [...boxRanges, ...[...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"]}
@@ -1,2 +1,2 @@
1
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;
2
+ export declare function packCameraUniform(viewProjectionInverse: Float32Array, cameraWorld: Float32Array, apertureRadius: number, focusDistance: number, projectionInverse?: Float32Array): Float32Array;
@@ -1,12 +1,16 @@
1
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);
2
+ export function packCameraUniform(viewProjectionInverse, cameraWorld, apertureRadius, focusDistance, projectionInverse) {
3
+ const values = new Float32Array(projectionInverse ? 52 : 36);
4
4
  for (let i = 0; i < 16; i++) {
5
5
  values[i] = viewProjectionInverse[i];
6
6
  values[16 + i] = cameraWorld[i];
7
7
  }
8
8
  values[32] = apertureRadius;
9
9
  values[33] = focusDistance;
10
+ // The browser appends a view-space inverse projection. Keep the legacy
11
+ // 36-float block intact for native until its independent port is reviewed.
12
+ if (projectionInverse)
13
+ values.set(projectionInverse, 36);
10
14
  return values;
11
15
  }
12
16
  //# sourceMappingURL=cameraUniform.js.map
@@ -1 +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
+ {"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,EAAE,iBAAgC;IAE/E,MAAM,MAAM,GAAG,IAAI,YAAY,CAAC,iBAAiB,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;IAC7D,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,uEAAuE;IACvE,2EAA2E;IAC3E,IAAI,iBAAiB;QAAE,MAAM,CAAC,GAAG,CAAC,iBAAiB,EAAE,EAAE,CAAC,CAAC;IACzD,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, projectionInverse?: Float32Array\n): Float32Array {\n const values = new Float32Array(projectionInverse ? 52 : 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 // The browser appends a view-space inverse projection. Keep the legacy\n // 36-float block intact for native until its independent port is reviewed.\n if (projectionInverse) values.set(projectionInverse, 36);\n return values;\n}\n"]}
@@ -0,0 +1,14 @@
1
+ import type Geometry from '../scene/Geometry.js';
2
+ export declare function compactVertexLayout(geometries: readonly Geometry[], normalFloat?: boolean): {
3
+ stride: number;
4
+ offsets: number[];
5
+ constants: Record<string, number | boolean>;
6
+ };
7
+ export declare function encodeNormal(x: number, y: number, z: number): number;
8
+ export declare function encodeTangent(x: number, y: number, z: number, w: number): number;
9
+ /** CPU decoder for layout/precision checks and backend-independent encoding consumers. */
10
+ export declare function decodeDirection(word: number, tangent?: boolean): [number, number, number];
11
+ /** Writes source geometry directly into its resident packed vertex region. */
12
+ export declare function packCompactVertices(geometry: Geometry, output: Uint32Array, stride: number, offsets: readonly number[], first: number, count: number, outputFirst?: number, deformationOnly?: boolean, colorFloat?: boolean, normalFloat?: boolean): void;
13
+ /** Optional material plane, indexed by BVH triangle record. Unused node entries are never read. */
14
+ export declare function packTriangleMaterials(geometry: Geometry, materialIndices: readonly number[], bvh: ArrayBuffer, output: Uint32Array, offset: number): void;
@@ -0,0 +1,124 @@
1
+ import { localMaterialIndex } from './materialIndices.js';
2
+ import { hasGeneratedVertexTangents } from '../util/geometry.js';
3
+ // Word offsets, not vec4 slots. Positions and both UV sets remain f32.
4
+ // An absent secondary UV aliases the primary UV without duplicating its storage.
5
+ export function compactVertexLayout(geometries, normalFloat = false) {
6
+ const has = (name) => geometries.some(g => !!g[name]);
7
+ let colorFloat = false;
8
+ for (const g of geometries)
9
+ if (g.color) {
10
+ for (const value of g.color.array)
11
+ if (!(value >= 0 && value <= 1)) {
12
+ colorFloat = true;
13
+ break;
14
+ }
15
+ }
16
+ let stride = normalFloat ? 6 : 4;
17
+ const offsets = [0, 3, stride, stride, stride, stride, -1];
18
+ if (has('uv') || has('uv1'))
19
+ stride += 2;
20
+ offsets[3] = has('uv1') ? stride : offsets[2];
21
+ if (has('uv1'))
22
+ stride += 2;
23
+ offsets[4] = stride;
24
+ if (has('color'))
25
+ stride += colorFloat ? 3 : 1;
26
+ offsets[5] = stride;
27
+ if (has('tangent'))
28
+ stride++;
29
+ const names = ['POSITION', 'NORMAL', 'UV', 'UV1', 'COLOR', 'TANGENT'];
30
+ const constants = { ATTR_STRIDE: stride, USE_UV: has('uv') || has('uv1'),
31
+ USE_VERTEX_COLOR: has('color'), COLOR_FLOAT: colorFloat, NORMAL_FLOAT: normalFloat, HAS_VERTEX_UV: has('uv') || has('uv1'),
32
+ HAS_VERTEX_TANGENT: has('tangent'), HAS_TRIANGLE_MATERIAL: has('materialIndex'), MATERIALINDEX_OFF: 0 };
33
+ names.forEach((name, i) => { constants[name + '_OFF'] = offsets[i]; });
34
+ return { stride, offsets, constants };
35
+ }
36
+ function oct(x, y, z, maximum, bits) {
37
+ const length = Math.abs(x) + Math.abs(y) + Math.abs(z);
38
+ if (!length)
39
+ return (1 << (bits - 1)) | (1 << (bits * 2 - 1));
40
+ x /= length;
41
+ y /= length;
42
+ if (z < 0) {
43
+ const oldX = x;
44
+ x = (1 - Math.abs(y)) * (oldX < 0 ? -1 : 1);
45
+ y = (1 - Math.abs(oldX)) * (y < 0 ? -1 : 1);
46
+ }
47
+ const mask = (1 << bits) - 1;
48
+ return ((Math.round(x * maximum) & mask) | ((Math.round(y * maximum) & mask) << bits)) >>> 0;
49
+ }
50
+ export function encodeNormal(x, y, z) { return oct(x, y, z, 32767, 16); }
51
+ export function encodeTangent(x, y, z, w) {
52
+ const sign = w > 1.5 ? 3 : w < 0 ? 2 : w > 0 ? 1 : 0;
53
+ return (oct(x, y, z, 16383, 15) | (sign << 30)) >>> 0;
54
+ }
55
+ /** CPU decoder for layout/precision checks and backend-independent encoding consumers. */
56
+ export function decodeDirection(word, tangent = false) {
57
+ const bits = tangent ? 15 : 16, shift = 32 - bits, maximum = (1 << (bits - 1)) - 1;
58
+ const a = (word << shift) >> shift, b = (word << (32 - 2 * bits)) >> shift;
59
+ if (a === -maximum - 1 && b === -maximum - 1)
60
+ return [0, 0, 0];
61
+ let x = a / maximum, y = b / maximum;
62
+ const z = 1 - Math.abs(x) - Math.abs(y);
63
+ if (z < 0) {
64
+ const oldX = x;
65
+ x = (1 - Math.abs(y)) * (oldX < 0 ? -1 : 1);
66
+ y = (1 - Math.abs(oldX)) * (y < 0 ? -1 : 1);
67
+ }
68
+ const length = Math.hypot(x, y, z);
69
+ return [x / length, y / length, z / length];
70
+ }
71
+ /** Writes source geometry directly into its resident packed vertex region. */
72
+ export function packCompactVertices(geometry, output, stride, offsets, first, count, outputFirst = first, deformationOnly = false, colorFloat = false, normalFloat = false) {
73
+ const floats = new Float32Array(output.buffer, output.byteOffset, output.length);
74
+ const p = geometry.position.array, n = geometry.normal.array, tangent = geometry.tangent;
75
+ const uv = geometry.uv, uv1 = geometry.uv1 ?? uv, color = geometry.color;
76
+ const tangentArray = tangent?.array, tangentSize = tangent?.itemSize ?? 0;
77
+ const tangentSign = tangentSize === 4 ? 0 : hasGeneratedVertexTangents(geometry) ? 0 : 2;
78
+ const uvArray = uv?.array, uv1Array = uv1?.array, colorArray = color?.array;
79
+ const uvOffset = offsets[2], uv1Offset = offsets[3], colorOffset = offsets[4], tangentOffset = offsets[5];
80
+ for (let i = first, end = first + count, d = outputFirst * stride; i < end; i++, d += stride) {
81
+ floats[d] = p[i * 3];
82
+ floats[d + 1] = p[i * 3 + 1];
83
+ floats[d + 2] = p[i * 3 + 2];
84
+ if (normalFloat) {
85
+ floats[d + 3] = n[i * 3];
86
+ floats[d + 4] = n[i * 3 + 1];
87
+ floats[d + 5] = n[i * 3 + 2];
88
+ }
89
+ else
90
+ output[d + 3] = encodeNormal(n[i * 3], n[i * 3 + 1], n[i * 3 + 2]);
91
+ if (tangentOffset < stride) {
92
+ const t = i * tangentSize;
93
+ output[d + tangentOffset] = tangentArray ? encodeTangent(tangentArray[t], tangentArray[t + 1], tangentArray[t + 2], tangentSize === 4 ? tangentArray[t + 3] : tangentSign) : encodeTangent(0, 0, 0, 0);
94
+ }
95
+ if (deformationOnly)
96
+ continue;
97
+ if (uvOffset < colorOffset) {
98
+ floats[d + uvOffset] = uvArray?.[i * 2] ?? 0;
99
+ floats[d + uvOffset + 1] = uvArray?.[i * 2 + 1] ?? 0;
100
+ floats[d + uv1Offset] = uv1Array?.[i * 2] ?? 0;
101
+ floats[d + uv1Offset + 1] = uv1Array?.[i * 2 + 1] ?? 0;
102
+ }
103
+ if (colorOffset < tangentOffset) {
104
+ const r = colorArray?.[i * 3] ?? 1, g = colorArray?.[i * 3 + 1] ?? 1, b = colorArray?.[i * 3 + 2] ?? 1;
105
+ if (colorFloat) {
106
+ floats[d + colorOffset] = r;
107
+ floats[d + colorOffset + 1] = g;
108
+ floats[d + colorOffset + 2] = b;
109
+ }
110
+ else
111
+ output[d + colorOffset] = (Math.round(r * 255) | Math.round(g * 255) << 8 | Math.round(b * 255) << 16 | 0xff000000) >>> 0;
112
+ }
113
+ }
114
+ }
115
+ /** Optional material plane, indexed by BVH triangle record. Unused node entries are never read. */
116
+ export function packTriangleMaterials(geometry, materialIndices, bvh, output, offset) {
117
+ const words = new Uint32Array(bvh);
118
+ for (let record = 0; record < words.length / 4; record++) {
119
+ const vertex = words[record * 4];
120
+ output[offset + record] = geometry.materialIndex && vertex < geometry.vertexCount
121
+ ? (materialIndices[localMaterialIndex(geometry, vertex, materialIndices.length)] ?? 0) + 1 : 0;
122
+ }
123
+ }
124
+ //# sourceMappingURL=compactVertices.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"compactVertices.js","sourceRoot":"","sources":["../../src/renderer/compactVertices.ts"],"names":[],"mappings":"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","sourcesContent":["import {localMaterialIndex} from './materialIndices.js';\nimport type Geometry from '../scene/Geometry.js';\nimport {hasGeneratedVertexTangents} from '../util/geometry.js';\n\n// Word offsets, not vec4 slots. Positions and both UV sets remain f32.\n// An absent secondary UV aliases the primary UV without duplicating its storage.\nexport function compactVertexLayout(geometries: readonly Geometry[], normalFloat = false) {\n const has = (name: 'uv' | 'uv1' | 'color' | 'tangent' | 'materialIndex') => geometries.some(g => !!g[name]);\n let colorFloat = false;\n for (const g of geometries) if (g.color) {\n for (const value of g.color.array) if (!(value >= 0 && value <= 1)) {colorFloat = true; break;}\n }\n let stride = normalFloat ? 6 : 4;\n const offsets = [0, 3, stride, stride, stride, stride, -1];\n if (has('uv') || has('uv1')) stride += 2;\n offsets[3] = has('uv1') ? stride : offsets[2];\n if (has('uv1')) stride += 2;\n offsets[4] = stride;\n if (has('color')) stride += colorFloat ? 3 : 1;\n offsets[5] = stride;\n if (has('tangent')) stride++;\n const names = ['POSITION', 'NORMAL', 'UV', 'UV1', 'COLOR', 'TANGENT'];\n const constants: Record<string, boolean | number> = {ATTR_STRIDE: stride, USE_UV: has('uv') || has('uv1'),\n USE_VERTEX_COLOR: has('color'), COLOR_FLOAT: colorFloat, NORMAL_FLOAT: normalFloat, HAS_VERTEX_UV: has('uv') || has('uv1'),\n HAS_VERTEX_TANGENT: has('tangent'), HAS_TRIANGLE_MATERIAL: has('materialIndex'), MATERIALINDEX_OFF: 0};\n names.forEach((name, i) => {constants[name + '_OFF'] = offsets[i];});\n return {stride, offsets, constants};\n}\n\nfunction oct(x: number, y: number, z: number, maximum: number, bits: number) {\n const length = Math.abs(x) + Math.abs(y) + Math.abs(z);\n if (!length) return (1 << (bits - 1)) | (1 << (bits * 2 - 1));\n x /= length; y /= length;\n if (z < 0) {\n const oldX = x;\n x = (1 - Math.abs(y)) * (oldX < 0 ? -1 : 1);\n y = (1 - Math.abs(oldX)) * (y < 0 ? -1 : 1);\n }\n const mask = (1 << bits) - 1;\n return ((Math.round(x * maximum) & mask) | ((Math.round(y * maximum) & mask) << bits)) >>> 0;\n}\n\nexport function encodeNormal(x: number, y: number, z: number) {return oct(x, y, z, 32767, 16);}\nexport function encodeTangent(x: number, y: number, z: number, w: number) {\n const sign = w > 1.5 ? 3 : w < 0 ? 2 : w > 0 ? 1 : 0;\n return (oct(x, y, z, 16383, 15) | (sign << 30)) >>> 0;\n}\n\n/** CPU decoder for layout/precision checks and backend-independent encoding consumers. */\nexport function decodeDirection(word: number, tangent = false): [number, number, number] {\n const bits = tangent ? 15 : 16, shift = 32 - bits, maximum = (1 << (bits - 1)) - 1;\n const a = (word << shift) >> shift, b = (word << (32 - 2 * bits)) >> shift;\n if (a === -maximum - 1 && b === -maximum - 1) return [0, 0, 0];\n let x = a / maximum, y = b / maximum;\n const z = 1 - Math.abs(x) - Math.abs(y);\n if (z < 0) {\n const oldX = x;\n x = (1 - Math.abs(y)) * (oldX < 0 ? -1 : 1);\n y = (1 - Math.abs(oldX)) * (y < 0 ? -1 : 1);\n }\n const length = Math.hypot(x, y, z);\n return [x / length, y / length, z / length];\n}\n\n/** Writes source geometry directly into its resident packed vertex region. */\nexport function packCompactVertices(geometry: Geometry, output: Uint32Array, stride: number, offsets: readonly number[],\n first: number, count: number, outputFirst = first, deformationOnly = false, colorFloat = false, normalFloat = false) {\n const floats = new Float32Array(output.buffer, output.byteOffset, output.length);\n const p = geometry.position.array, n = geometry.normal.array, tangent = geometry.tangent;\n const uv = geometry.uv, uv1 = geometry.uv1 ?? uv, color = geometry.color;\n const tangentArray = tangent?.array, tangentSize = tangent?.itemSize ?? 0;\n const tangentSign = tangentSize === 4 ? 0 : hasGeneratedVertexTangents(geometry) ? 0 : 2;\n const uvArray = uv?.array, uv1Array = uv1?.array, colorArray = color?.array;\n const uvOffset = offsets[2], uv1Offset = offsets[3], colorOffset = offsets[4], tangentOffset = offsets[5];\n for (let i = first, end = first + count, d = outputFirst * stride; i < end; i++, d += stride) {\n floats[d] = p[i * 3]; floats[d + 1] = p[i * 3 + 1]; floats[d + 2] = p[i * 3 + 2];\n if (normalFloat) {\n floats[d + 3] = n[i * 3]; floats[d + 4] = n[i * 3 + 1]; floats[d + 5] = n[i * 3 + 2];\n } else output[d + 3] = encodeNormal(n[i * 3], n[i * 3 + 1], n[i * 3 + 2]);\n if (tangentOffset < stride) {\n const t = i * tangentSize;\n output[d + tangentOffset] = tangentArray ? encodeTangent(tangentArray[t], tangentArray[t + 1], tangentArray[t + 2],\n tangentSize === 4 ? tangentArray[t + 3] : tangentSign) : encodeTangent(0, 0, 0, 0);\n }\n if (deformationOnly) continue;\n if (uvOffset < colorOffset) {\n floats[d + uvOffset] = uvArray?.[i * 2] ?? 0; floats[d + uvOffset + 1] = uvArray?.[i * 2 + 1] ?? 0;\n floats[d + uv1Offset] = uv1Array?.[i * 2] ?? 0; floats[d + uv1Offset + 1] = uv1Array?.[i * 2 + 1] ?? 0;\n }\n if (colorOffset < tangentOffset) {\n const r = colorArray?.[i * 3] ?? 1, g = colorArray?.[i * 3 + 1] ?? 1, b = colorArray?.[i * 3 + 2] ?? 1;\n if (colorFloat) {floats[d + colorOffset] = r; floats[d + colorOffset + 1] = g; floats[d + colorOffset + 2] = b;}\n else output[d + colorOffset] = (Math.round(r * 255) | Math.round(g * 255) << 8 | Math.round(b * 255) << 16 | 0xff000000) >>> 0;\n }\n }\n}\n\n/** Optional material plane, indexed by BVH triangle record. Unused node entries are never read. */\nexport function packTriangleMaterials(geometry: Geometry, materialIndices: readonly number[], bvh: ArrayBuffer,\n output: Uint32Array, offset: number) {\n const words = new Uint32Array(bvh);\n for (let record = 0; record < words.length / 4; record++) {\n const vertex = words[record * 4];\n output[offset + record] = geometry.materialIndex && vertex < geometry.vertexCount\n ? (materialIndices[localMaterialIndex(geometry, vertex, materialIndices.length)] ?? 0) + 1 : 0;\n }\n}\n"]}
@@ -0,0 +1,11 @@
1
+ import type { PostProcess } from '../Display.js';
2
+ /** createEasuPass options. */
3
+ export interface EasuOptions {
4
+ /** Recover surface texture detail from the displayed render's diffuseColor, specularColor and depth AOVs, traced with aovResolution 'display'. Default false. Warns once when the displayed render lacks that configuration; frames whose AOVs are not ready or do not match the output size use EASU alone. Unsupported surfaces and silhouettes receive no compensation. */ albedoDetail?: boolean;
5
+ }
6
+ /** A display pass with optional scratch images. Dispose after unregistering; it may be used again. */
7
+ export type EasuPass = PostProcess & {
8
+ dispose(): void;
9
+ };
10
+ /** Creates an edge-adaptive display-space upscale pass (AMD FSR 1 EASU), without sharpening. Register with outputSize: (_, display) => display. WebGPU only; supports rgba8unorm and extended-range rgba16float, including alpha. Copies inputs that already have the output size and area-averages larger ones. Default EASU alone. */
11
+ export declare function createEasuPass(options?: EasuOptions): EasuPass;