@zephyr3d/scene 0.9.27 → 0.10.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (502) hide show
  1. package/README.md +60 -27
  2. package/dist/animation/animation_bank.js +634 -0
  3. package/dist/animation/animation_bank.js.map +1 -0
  4. package/dist/animation/animation_bank_gpu.js +256 -0
  5. package/dist/animation/animation_bank_gpu.js.map +1 -0
  6. package/dist/animation/animationset.js +54 -0
  7. package/dist/animation/animationset.js.map +1 -1
  8. package/dist/animation/cloth/gpu_cloth_component.js +406 -0
  9. package/dist/animation/cloth/gpu_cloth_component.js.map +1 -0
  10. package/dist/animation/cloth/gpu_cloth_system.js +332 -202
  11. package/dist/animation/cloth/gpu_cloth_system.js.map +1 -1
  12. package/dist/animation/gpu_animation_driver.js +289 -0
  13. package/dist/animation/gpu_animation_driver.js.map +1 -0
  14. package/dist/animation/joint_dynamics/collision.js +112 -1
  15. package/dist/animation/joint_dynamics/collision.js.map +1 -1
  16. package/dist/animation/joint_dynamics/controller.js +6 -0
  17. package/dist/animation/joint_dynamics/controller.js.map +1 -1
  18. package/dist/animation/joint_dynamics/joint_dynamics_system.js +11 -0
  19. package/dist/animation/joint_dynamics/joint_dynamics_system.js.map +1 -1
  20. package/dist/animation/joint_dynamics/solver.js +50 -12
  21. package/dist/animation/joint_dynamics/solver.js.map +1 -1
  22. package/dist/animation/joint_dynamics/types.js.map +1 -1
  23. package/dist/animation/skeleton.js +279 -55
  24. package/dist/animation/skeleton.js.map +1 -1
  25. package/dist/animation/skin_palette_atlas.js +252 -0
  26. package/dist/animation/skin_palette_atlas.js.map +1 -0
  27. package/dist/animation/spring/multi_chain_spring_system.js +298 -38
  28. package/dist/animation/spring/multi_chain_spring_system.js.map +1 -1
  29. package/dist/animation/spring/spring_chain.js +2 -0
  30. package/dist/animation/spring/spring_chain.js.map +1 -1
  31. package/dist/animation/spring/spring_collider.js +159 -21
  32. package/dist/animation/spring/spring_collider.js.map +1 -1
  33. package/dist/animation/spring/spring_particle.js +1 -0
  34. package/dist/animation/spring/spring_particle.js.map +1 -1
  35. package/dist/animation/spring/spring_solver.js +173 -0
  36. package/dist/animation/spring/spring_solver.js.map +1 -0
  37. package/dist/animation/spring/spring_system.js +249 -24
  38. package/dist/animation/spring/spring_system.js.map +1 -1
  39. package/dist/animation/spring_modifier.js +32 -1
  40. package/dist/animation/spring_modifier.js.map +1 -1
  41. package/dist/app/app.js +26 -0
  42. package/dist/app/app.js.map +1 -1
  43. package/dist/app/engine.js +86 -15
  44. package/dist/app/engine.js.map +1 -1
  45. package/dist/app/gamepad.js +191 -0
  46. package/dist/app/gamepad.js.map +1 -0
  47. package/dist/app/inputactions.js +271 -0
  48. package/dist/app/inputactions.js.map +1 -0
  49. package/dist/app/inputmgr.js +331 -22
  50. package/dist/app/inputmgr.js.map +1 -1
  51. package/dist/app/loading.js +138 -0
  52. package/dist/app/loading.js.map +1 -0
  53. package/dist/app/pipelinecache.js +209 -0
  54. package/dist/app/pipelinecache.js.map +1 -0
  55. package/dist/app/runtimescript.js +25 -0
  56. package/dist/app/runtimescript.js.map +1 -1
  57. package/dist/app/scriptingsystem.js +54 -0
  58. package/dist/app/scriptingsystem.js.map +1 -1
  59. package/dist/app/scriptregistry.js +7 -2
  60. package/dist/app/scriptregistry.js.map +1 -1
  61. package/dist/asset/asset_manifest.js +59 -0
  62. package/dist/asset/asset_manifest.js.map +1 -0
  63. package/dist/asset/asset_preload.js +258 -0
  64. package/dist/asset/asset_preload.js.map +1 -0
  65. package/dist/asset/assetmanager.js +117 -65
  66. package/dist/asset/assetmanager.js.map +1 -1
  67. package/dist/asset/loaders/ktx2/basis/LICENSE +201 -0
  68. package/dist/asset/loaders/ktx2/basis/basis_transcoder.js +2 -0
  69. package/dist/asset/loaders/ktx2/basis/basis_transcoder.wasm +0 -0
  70. package/dist/asset/loaders/ktx2/basis_location.js +17 -0
  71. package/dist/asset/loaders/ktx2/basis_location.js.map +1 -0
  72. package/dist/asset/loaders/ktx2/ktx2_loader.js +88 -0
  73. package/dist/asset/loaders/ktx2/ktx2_loader.js.map +1 -0
  74. package/dist/asset/loaders/ktx2/ktx2_targets.js +118 -0
  75. package/dist/asset/loaders/ktx2/ktx2_targets.js.map +1 -0
  76. package/dist/asset/loaders/ktx2/transcoder_pool.js +259 -0
  77. package/dist/asset/loaders/ktx2/transcoder_pool.js.map +1 -0
  78. package/dist/asset/mesh_lod_builder.js +104 -0
  79. package/dist/asset/mesh_lod_builder.js.map +1 -0
  80. package/dist/asset/mesh_settings.js +111 -0
  81. package/dist/asset/mesh_settings.js.map +1 -0
  82. package/dist/asset/meshopt_decoder.js +18 -0
  83. package/dist/asset/meshopt_decoder.js.map +1 -0
  84. package/dist/asset/meshopt_simplifier.js +26 -0
  85. package/dist/asset/meshopt_simplifier.js.map +1 -0
  86. package/dist/asset/model.js +171 -1
  87. package/dist/asset/model.js.map +1 -1
  88. package/dist/asset/texture_settings.js +231 -0
  89. package/dist/asset/texture_settings.js.map +1 -0
  90. package/dist/asset/zmsh_binary.js +131 -0
  91. package/dist/asset/zmsh_binary.js.map +1 -0
  92. package/dist/asset/zsdf_binary.js +111 -0
  93. package/dist/asset/zsdf_binary.js.map +1 -0
  94. package/dist/blitter/bilateralblur.js +1 -2
  95. package/dist/blitter/bilateralblur.js.map +1 -1
  96. package/dist/blitter/gaussianblur.js +1 -6
  97. package/dist/blitter/gaussianblur.js.map +1 -1
  98. package/dist/camera/base.js +31 -10
  99. package/dist/camera/base.js.map +1 -1
  100. package/dist/camera/camera.js +104 -178
  101. package/dist/camera/camera.js.map +1 -1
  102. package/dist/camera/follow.js +342 -0
  103. package/dist/camera/follow.js.map +1 -0
  104. package/dist/camera/fps.js +9 -7
  105. package/dist/camera/fps.js.map +1 -1
  106. package/dist/camera/orbit.js +46 -19
  107. package/dist/camera/orbit.js.map +1 -1
  108. package/dist/index.d.ts +25436 -15990
  109. package/dist/index.js +65 -11
  110. package/dist/index.js.map +1 -1
  111. package/dist/material/blinn.js +3 -0
  112. package/dist/material/blinn.js.map +1 -1
  113. package/dist/material/eye.js +1 -1
  114. package/dist/material/eye.js.map +1 -1
  115. package/dist/material/hair.js +2 -3
  116. package/dist/material/hair.js.map +1 -1
  117. package/dist/material/lambert.js +4 -1
  118. package/dist/material/lambert.js.map +1 -1
  119. package/dist/material/material.js +66 -4
  120. package/dist/material/material.js.map +1 -1
  121. package/dist/material/meshmaterial.js +118 -45
  122. package/dist/material/meshmaterial.js.map +1 -1
  123. package/dist/material/mixins/lightmodel/blinnphong.js +1 -1
  124. package/dist/material/mixins/lightmodel/blinnphong.js.map +1 -1
  125. package/dist/material/mixins/lightmodel/lambert.js +1 -1
  126. package/dist/material/mixins/lightmodel/lambert.js.map +1 -1
  127. package/dist/material/mixins/lightmodel/pbrblueprintmixin.js +34 -61
  128. package/dist/material/mixins/lightmodel/pbrblueprintmixin.js.map +1 -1
  129. package/dist/material/mixins/lightmodel/pbrmetallicroughness.js +16 -2
  130. package/dist/material/mixins/lightmodel/pbrmetallicroughness.js.map +1 -1
  131. package/dist/material/mixins/lightmodel/pbrspecularglossness.js +2 -1
  132. package/dist/material/mixins/lightmodel/pbrspecularglossness.js.map +1 -1
  133. package/dist/material/mixins/lit.js +191 -83
  134. package/dist/material/mixins/lit.js.map +1 -1
  135. package/dist/material/mixins/pbr/common.js +31 -206
  136. package/dist/material/mixins/pbr/common.js.map +1 -1
  137. package/dist/material/mtoon.js +1 -1
  138. package/dist/material/mtoon.js.map +1 -1
  139. package/dist/material/pbrmr.js +3 -0
  140. package/dist/material/pbrmr.js.map +1 -1
  141. package/dist/material/pbrsg.js +3 -0
  142. package/dist/material/pbrsg.js.map +1 -1
  143. package/dist/material/sdf_debug.js +78 -0
  144. package/dist/material/sdf_debug.js.map +1 -0
  145. package/dist/material/shader/helper.js +333 -191
  146. package/dist/material/shader/helper.js.map +1 -1
  147. package/dist/material/shader/terrain_blend.js +204 -43
  148. package/dist/material/shader/terrain_blend.js.map +1 -1
  149. package/dist/material/skin.js +331 -297
  150. package/dist/material/skin.js.map +1 -1
  151. package/dist/material/skinprofile.js +1058 -0
  152. package/dist/material/skinprofile.js.map +1 -0
  153. package/dist/material/sss.js +353 -0
  154. package/dist/material/sss.js.map +1 -0
  155. package/dist/material/sss_kernel.js +265 -0
  156. package/dist/material/sss_kernel.js.map +1 -0
  157. package/dist/material/sssprofile.js +879 -0
  158. package/dist/material/sssprofile.js.map +1 -0
  159. package/dist/material/subsurfaceprofile.js +4 -8
  160. package/dist/material/subsurfaceprofile.js.map +1 -1
  161. package/dist/material/terrain-cm.js +464 -188
  162. package/dist/material/terrain-cm.js.map +1 -1
  163. package/dist/material/unlit.js +3 -0
  164. package/dist/material/unlit.js.map +1 -1
  165. package/dist/material/water.js +1261 -1438
  166. package/dist/material/water.js.map +1 -1
  167. package/dist/node_modules/meshoptimizer/LICENSE +21 -0
  168. package/dist/node_modules/meshoptimizer/meshopt_decoder.js +197 -0
  169. package/dist/node_modules/meshoptimizer/meshopt_decoder.js.map +1 -0
  170. package/dist/node_modules/meshoptimizer/meshopt_simplifier.js +677 -0
  171. package/dist/node_modules/meshoptimizer/meshopt_simplifier.js.map +1 -0
  172. package/dist/physics/character.js +226 -0
  173. package/dist/physics/character.js.map +1 -0
  174. package/dist/physics/collider.js +209 -0
  175. package/dist/physics/collider.js.map +1 -0
  176. package/dist/physics/events.js +79 -0
  177. package/dist/physics/events.js.map +1 -0
  178. package/dist/physics/joint.js +272 -0
  179. package/dist/physics/joint.js.map +1 -0
  180. package/dist/physics/node_physics.js +234 -0
  181. package/dist/physics/node_physics.js.map +1 -0
  182. package/dist/physics/part.js +91 -0
  183. package/dist/physics/part.js.map +1 -0
  184. package/dist/physics/rigid_body.js +379 -0
  185. package/dist/physics/rigid_body.js.map +1 -0
  186. package/dist/physics/vehicle.js +335 -0
  187. package/dist/physics/vehicle.js.map +1 -0
  188. package/dist/physics/world.js +25 -0
  189. package/dist/physics/world.js.map +1 -0
  190. package/dist/posteffect/bloom.js +49 -14
  191. package/dist/posteffect/bloom.js.map +1 -1
  192. package/dist/posteffect/motionblur.js +106 -106
  193. package/dist/posteffect/motionblur.js.map +1 -1
  194. package/dist/posteffect/postsss.js +572 -0
  195. package/dist/posteffect/postsss.js.map +1 -0
  196. package/dist/posteffect/sao.js +2 -6
  197. package/dist/posteffect/sao.js.map +1 -1
  198. package/dist/posteffect/skinsss.js +605 -355
  199. package/dist/posteffect/skinsss.js.map +1 -1
  200. package/dist/posteffect/ssgi.js +91 -162
  201. package/dist/posteffect/ssgi.js.map +1 -1
  202. package/dist/posteffect/ssr.js +3 -11
  203. package/dist/posteffect/ssr.js.map +1 -1
  204. package/dist/posteffect/sss.js +4 -13
  205. package/dist/posteffect/sss.js.map +1 -1
  206. package/dist/posteffect/taa.js +1 -0
  207. package/dist/posteffect/taa.js.map +1 -1
  208. package/dist/render/abuffer_oit.js +3 -2
  209. package/dist/render/abuffer_oit.js.map +1 -1
  210. package/dist/render/clipmap.js +179 -64
  211. package/dist/render/clipmap.js.map +1 -1
  212. package/dist/render/cluster_light.js +958 -224
  213. package/dist/render/cluster_light.js.map +1 -1
  214. package/dist/render/cull_visitor.js +25 -5
  215. package/dist/render/cull_visitor.js.map +1 -1
  216. package/dist/render/debug_views.js +37 -0
  217. package/dist/render/debug_views.js.map +1 -0
  218. package/dist/render/depthpass.js +5 -1
  219. package/dist/render/depthpass.js.map +1 -1
  220. package/dist/render/drawable_mixin.js +53 -6
  221. package/dist/render/drawable_mixin.js.map +1 -1
  222. package/dist/render/dualdepthpeeling_oit.js +5 -5
  223. package/dist/render/dualdepthpeeling_oit.js.map +1 -1
  224. package/dist/render/envlight.js +196 -113
  225. package/dist/render/envlight.js.map +1 -1
  226. package/dist/render/fbm_wavegenerator.js +5 -10
  227. package/dist/render/fbm_wavegenerator.js.map +1 -1
  228. package/dist/render/fft_wavegenerator.js +247 -157
  229. package/dist/render/fft_wavegenerator.js.map +1 -1
  230. package/dist/render/gerstner_wavegenerator.js +16 -38
  231. package/dist/render/gerstner_wavegenerator.js.map +1 -1
  232. package/dist/render/gi/probe_volume.js +1334 -0
  233. package/dist/render/gi/probe_volume.js.map +1 -0
  234. package/dist/render/gi/scene_gi.js +282 -0
  235. package/dist/render/gi/scene_gi.js.map +1 -0
  236. package/dist/render/gi/voxel_atlas.js +198 -0
  237. package/dist/render/gi/voxel_atlas.js.map +1 -0
  238. package/dist/render/gi/voxel_lighting.js +652 -0
  239. package/dist/render/gi/voxel_lighting.js.map +1 -0
  240. package/dist/render/gi/voxel_scene.js +642 -0
  241. package/dist/render/gi/voxel_scene.js.map +1 -0
  242. package/dist/render/gi/voxelize_pass.js +223 -0
  243. package/dist/render/gi/voxelize_pass.js.map +1 -0
  244. package/dist/render/globalbindgroup_allocator.js +3 -2
  245. package/dist/render/globalbindgroup_allocator.js.map +1 -1
  246. package/dist/render/gpu_picking.js +9 -36
  247. package/dist/render/gpu_picking.js.map +1 -1
  248. package/dist/render/instance_culling.js +499 -0
  249. package/dist/render/instance_culling.js.map +1 -0
  250. package/dist/render/lightpass.js +19 -8
  251. package/dist/render/lightpass.js.map +1 -1
  252. package/dist/render/lod.js +46 -0
  253. package/dist/render/lod.js.map +1 -0
  254. package/dist/render/primitive.js +301 -9
  255. package/dist/render/primitive.js.map +1 -1
  256. package/dist/render/primitive_readback.js +209 -0
  257. package/dist/render/primitive_readback.js.map +1 -0
  258. package/dist/render/render_queue.js +162 -11
  259. package/dist/render/render_queue.js.map +1 -1
  260. package/dist/render/renderer.js +10 -7
  261. package/dist/render/renderer.js.map +1 -1
  262. package/dist/render/rendergraph/blackboard.js +14 -1
  263. package/dist/render/rendergraph/blackboard.js.map +1 -1
  264. package/dist/render/rendergraph/executor.js +136 -0
  265. package/dist/render/rendergraph/executor.js.map +1 -1
  266. package/dist/render/rendergraph/forward_plus_builder.js +272 -55
  267. package/dist/render/rendergraph/forward_plus_builder.js.map +1 -1
  268. package/dist/render/rendergraph/frame_graph_context.js +41 -0
  269. package/dist/render/rendergraph/frame_graph_context.js.map +1 -0
  270. package/dist/render/rendergraph/scene_render_context.js +31 -2
  271. package/dist/render/rendergraph/scene_render_context.js.map +1 -1
  272. package/dist/render/rendergraph/types.js.map +1 -1
  273. package/dist/render/renderpass.js +28 -5
  274. package/dist/render/renderpass.js.map +1 -1
  275. package/dist/render/sdf/box_allocator.js +98 -0
  276. package/dist/render/sdf/box_allocator.js.map +1 -0
  277. package/dist/render/sdf/global_sdf.js +865 -0
  278. package/dist/render/sdf/global_sdf.js.map +1 -0
  279. package/dist/render/sdf/scene_sdf.js +562 -0
  280. package/dist/render/sdf/scene_sdf.js.map +1 -0
  281. package/dist/render/sdf/sdf_atlas.js +227 -0
  282. package/dist/render/sdf/sdf_atlas.js.map +1 -0
  283. package/dist/render/sdf/sdf_programs.js +42 -0
  284. package/dist/render/sdf/sdf_programs.js.map +1 -0
  285. package/dist/render/sdf/sdf_view.js +199 -0
  286. package/dist/render/sdf/sdf_view.js.map +1 -0
  287. package/dist/render/sdf/waterline.js +610 -0
  288. package/dist/render/sdf/waterline.js.map +1 -0
  289. package/dist/render/shadow_mask_pass.js +142 -25
  290. package/dist/render/shadow_mask_pass.js.map +1 -1
  291. package/dist/render/shore_wave_generator.js +1193 -0
  292. package/dist/render/shore_wave_generator.js.map +1 -0
  293. package/dist/render/sky.js +516 -86
  294. package/dist/render/sky.js.map +1 -1
  295. package/dist/render/transmission_thickness_pass.js +477 -0
  296. package/dist/render/transmission_thickness_pass.js.map +1 -0
  297. package/dist/render/underwater.js +58 -158
  298. package/dist/render/underwater.js.map +1 -1
  299. package/dist/render/virtualtexture/virtual_texture.js +1214 -0
  300. package/dist/render/virtualtexture/virtual_texture.js.map +1 -0
  301. package/dist/render/volumetric_cloud/cloud_common.js +472 -0
  302. package/dist/render/volumetric_cloud/cloud_common.js.map +1 -0
  303. package/dist/render/volumetric_cloud/cloud_noise.js +189 -0
  304. package/dist/render/volumetric_cloud/cloud_noise.js.map +1 -0
  305. package/dist/render/volumetric_cloud/debug_view.js +131 -0
  306. package/dist/render/volumetric_cloud/debug_view.js.map +1 -0
  307. package/dist/render/volumetric_cloud/resources.js +380 -0
  308. package/dist/render/volumetric_cloud/resources.js.map +1 -0
  309. package/dist/render/volumetric_cloud/sky_cache.js +380 -0
  310. package/dist/render/volumetric_cloud/sky_cache.js.map +1 -0
  311. package/dist/render/volumetric_cloud/volumetric_cloud.js +318 -0
  312. package/dist/render/volumetric_cloud/volumetric_cloud.js.map +1 -0
  313. package/dist/render/water_caustics.js +134 -319
  314. package/dist/render/water_caustics.js.map +1 -1
  315. package/dist/render/water_foam.js +627 -0
  316. package/dist/render/water_foam.js.map +1 -0
  317. package/dist/render/water_interaction.js +1795 -0
  318. package/dist/render/water_interaction.js.map +1 -0
  319. package/dist/render/weightedblended_oit.js +3 -3
  320. package/dist/render/weightedblended_oit.js.map +1 -1
  321. package/dist/scene/basesprite.js +9 -4
  322. package/dist/scene/basesprite.js.map +1 -1
  323. package/dist/scene/batchgroup.js +108 -12
  324. package/dist/scene/batchgroup.js.map +1 -1
  325. package/dist/scene/environment.js +28 -7
  326. package/dist/scene/environment.js.map +1 -1
  327. package/dist/scene/foliage.js +1020 -0
  328. package/dist/scene/foliage.js.map +1 -0
  329. package/dist/scene/foliage_buckets.js +147 -0
  330. package/dist/scene/foliage_buckets.js.map +1 -0
  331. package/dist/scene/foliage_mask.js +358 -0
  332. package/dist/scene/foliage_mask.js.map +1 -0
  333. package/dist/scene/hair.js +15 -4
  334. package/dist/scene/hair.js.map +1 -1
  335. package/dist/scene/light.js +179 -13
  336. package/dist/scene/light.js.map +1 -1
  337. package/dist/scene/mesh.js +327 -45
  338. package/dist/scene/mesh.js.map +1 -1
  339. package/dist/scene/meshdrawable.js +6 -0
  340. package/dist/scene/meshdrawable.js.map +1 -1
  341. package/dist/scene/msdftext.js +9 -3
  342. package/dist/scene/msdftext.js.map +1 -1
  343. package/dist/scene/msdftextsprite.js +9 -3
  344. package/dist/scene/msdftextsprite.js.map +1 -1
  345. package/dist/scene/particlesys.js +8 -2
  346. package/dist/scene/particlesys.js.map +1 -1
  347. package/dist/scene/physics_settings.js +157 -0
  348. package/dist/scene/physics_settings.js.map +1 -0
  349. package/dist/scene/scene.js +190 -44
  350. package/dist/scene/scene.js.map +1 -1
  351. package/dist/scene/scene_node.js +147 -6
  352. package/dist/scene/scene_node.js.map +1 -1
  353. package/dist/scene/terrain-cm/bladegrassmaterial.js +735 -0
  354. package/dist/scene/terrain-cm/bladegrassmaterial.js.map +1 -0
  355. package/dist/scene/terrain-cm/grass.js +881 -42
  356. package/dist/scene/terrain-cm/grass.js.map +1 -1
  357. package/dist/scene/terrain-cm/grass_gpu.js +929 -0
  358. package/dist/scene/terrain-cm/grass_gpu.js.map +1 -0
  359. package/dist/scene/terrain-cm/grassmaterial.js +180 -9
  360. package/dist/scene/terrain-cm/grassmaterial.js.map +1 -1
  361. package/dist/scene/terrain-cm/terrain-cm.js +465 -36
  362. package/dist/scene/terrain-cm/terrain-cm.js.map +1 -1
  363. package/dist/scene/terrain-cm/terrain_gi_albedo.js +257 -0
  364. package/dist/scene/terrain-cm/terrain_gi_albedo.js.map +1 -0
  365. package/dist/scene/terrain-cm/terrain_rvt.js +395 -0
  366. package/dist/scene/terrain-cm/terrain_rvt.js.map +1 -0
  367. package/dist/scene/update_queue.js +54 -0
  368. package/dist/scene/update_queue.js.map +1 -0
  369. package/dist/scene/water.js +633 -268
  370. package/dist/scene/water.js.map +1 -1
  371. package/dist/scene/water_surface_sampler.js +324 -0
  372. package/dist/scene/water_surface_sampler.js.map +1 -0
  373. package/dist/scene/wind.js +317 -0
  374. package/dist/scene/wind.js.map +1 -0
  375. package/dist/shaders/atmosphere.js +388 -166
  376. package/dist/shaders/atmosphere.js.map +1 -1
  377. package/dist/shaders/fog.js +100 -32
  378. package/dist/shaders/fog.js.map +1 -1
  379. package/dist/shaders/gi.js +365 -0
  380. package/dist/shaders/gi.js.map +1 -0
  381. package/dist/shaders/ltc_rect.js +202 -0
  382. package/dist/shaders/ltc_rect.js.map +1 -0
  383. package/dist/shaders/misc.js +1 -10
  384. package/dist/shaders/misc.js.map +1 -1
  385. package/dist/shaders/noise.js +5 -1
  386. package/dist/shaders/noise.js.map +1 -1
  387. package/dist/shaders/probes.js +309 -0
  388. package/dist/shaders/probes.js.map +1 -0
  389. package/dist/shaders/sdf.js +537 -0
  390. package/dist/shaders/sdf.js.map +1 -0
  391. package/dist/shaders/shadow.js +104 -70
  392. package/dist/shaders/shadow.js.map +1 -1
  393. package/dist/shaders/skin_brdf.js +243 -0
  394. package/dist/shaders/skin_brdf.js.map +1 -0
  395. package/dist/shaders/ssgi.js +63 -0
  396. package/dist/shaders/ssgi.js.map +1 -0
  397. package/dist/shaders/ssgi_reprojection.js +118 -0
  398. package/dist/shaders/ssgi_reprojection.js.map +1 -0
  399. package/dist/shaders/ssr.js +6 -159
  400. package/dist/shaders/ssr.js.map +1 -1
  401. package/dist/shaders/temporal.js +38 -27
  402. package/dist/shaders/temporal.js.map +1 -1
  403. package/dist/shaders/water.js +32 -82
  404. package/dist/shaders/water.js.map +1 -1
  405. package/dist/shaders/water_medium.js +7 -21
  406. package/dist/shaders/water_medium.js.map +1 -1
  407. package/dist/shadow/dom.js +110 -19
  408. package/dist/shadow/dom.js.map +1 -1
  409. package/dist/shadow/esm.js +3 -3
  410. package/dist/shadow/esm.js.map +1 -1
  411. package/dist/shadow/pcf_opt.js +15 -48
  412. package/dist/shadow/pcf_opt.js.map +1 -1
  413. package/dist/shadow/pcf_pd.js +15 -53
  414. package/dist/shadow/pcf_pd.js.map +1 -1
  415. package/dist/shadow/pcss.js +34 -9
  416. package/dist/shadow/pcss.js.map +1 -1
  417. package/dist/shadow/shadow_impl.js +3 -8
  418. package/dist/shadow/shadow_impl.js.map +1 -1
  419. package/dist/shadow/shadow_region.js +40 -2
  420. package/dist/shadow/shadow_region.js.map +1 -1
  421. package/dist/shadow/shadowmapper.js +93 -53
  422. package/dist/shadow/shadowmapper.js.map +1 -1
  423. package/dist/shadow/ssm.js +18 -72
  424. package/dist/shadow/ssm.js.map +1 -1
  425. package/dist/shadow/vsm.js +3 -3
  426. package/dist/shadow/vsm.js.map +1 -1
  427. package/dist/shapes/shape.js +44 -1
  428. package/dist/shapes/shape.js.map +1 -1
  429. package/dist/utility/buoyancy.js +287 -0
  430. package/dist/utility/buoyancy.js.map +1 -0
  431. package/dist/utility/physical.js +10 -1
  432. package/dist/utility/physical.js.map +1 -1
  433. package/dist/utility/pmrem.js +17 -43
  434. package/dist/utility/pmrem.js.map +1 -1
  435. package/dist/utility/sdf/bake.js +435 -0
  436. package/dist/utility/sdf/bake.js.map +1 -0
  437. package/dist/utility/sdf/bvh.js +576 -0
  438. package/dist/utility/sdf/bvh.js.map +1 -0
  439. package/dist/utility/serialization/manager.js +34 -6
  440. package/dist/utility/serialization/manager.js.map +1 -1
  441. package/dist/utility/serialization/scene/animation.js +46 -5
  442. package/dist/utility/serialization/scene/animation.js.map +1 -1
  443. package/dist/utility/serialization/scene/batch.js +11 -4
  444. package/dist/utility/serialization/scene/batch.js.map +1 -1
  445. package/dist/utility/serialization/scene/camera.js +87 -254
  446. package/dist/utility/serialization/scene/camera.js.map +1 -1
  447. package/dist/utility/serialization/scene/cloth.js +25 -0
  448. package/dist/utility/serialization/scene/cloth.js.map +1 -0
  449. package/dist/utility/serialization/scene/common.js +14 -6
  450. package/dist/utility/serialization/scene/common.js.map +1 -1
  451. package/dist/utility/serialization/scene/foliage.js +821 -0
  452. package/dist/utility/serialization/scene/foliage.js.map +1 -0
  453. package/dist/utility/serialization/scene/hair.js +11 -4
  454. package/dist/utility/serialization/scene/hair.js.map +1 -1
  455. package/dist/utility/serialization/scene/light.js +115 -7
  456. package/dist/utility/serialization/scene/light.js.map +1 -1
  457. package/dist/utility/serialization/scene/material.js +388 -220
  458. package/dist/utility/serialization/scene/material.js.map +1 -1
  459. package/dist/utility/serialization/scene/mesh.js +69 -4
  460. package/dist/utility/serialization/scene/mesh.js.map +1 -1
  461. package/dist/utility/serialization/scene/node.js +140 -5
  462. package/dist/utility/serialization/scene/node.js.map +1 -1
  463. package/dist/utility/serialization/scene/node_physics.js +1318 -0
  464. package/dist/utility/serialization/scene/node_physics.js.map +1 -0
  465. package/dist/utility/serialization/scene/particle.js +11 -4
  466. package/dist/utility/serialization/scene/particle.js.map +1 -1
  467. package/dist/utility/serialization/scene/physics.js +120 -0
  468. package/dist/utility/serialization/scene/physics.js.map +1 -0
  469. package/dist/utility/serialization/scene/primitive.js +124 -10
  470. package/dist/utility/serialization/scene/primitive.js.map +1 -1
  471. package/dist/utility/serialization/scene/scene.js +1687 -51
  472. package/dist/utility/serialization/scene/scene.js.map +1 -1
  473. package/dist/utility/serialization/scene/sprite.js +11 -4
  474. package/dist/utility/serialization/scene/sprite.js.map +1 -1
  475. package/dist/utility/serialization/scene/terrain.js +163 -33
  476. package/dist/utility/serialization/scene/terrain.js.map +1 -1
  477. package/dist/utility/serialization/scene/text.js +11 -4
  478. package/dist/utility/serialization/scene/text.js.map +1 -1
  479. package/dist/utility/serialization/scene/water.js +1543 -264
  480. package/dist/utility/serialization/scene/water.js.map +1 -1
  481. package/dist/utility/serialization/types.js.map +1 -1
  482. package/dist/utility/shprojector.js +10 -22
  483. package/dist/utility/shprojector.js.map +1 -1
  484. package/dist/utility/textures/foam.js +170 -0
  485. package/dist/utility/textures/foam.js.map +1 -0
  486. package/dist/utility/textures/ggxlut.js +17 -43
  487. package/dist/utility/textures/ggxlut.js.map +1 -1
  488. package/dist/utility/textures/ltcdata.js +4 -4
  489. package/dist/utility/textures/ltcdata.js.map +1 -1
  490. package/dist/utility/textures/ltclut.js +16 -6
  491. package/dist/utility/textures/ltclut.js.map +1 -1
  492. package/dist/utility/unsupported.js +24 -0
  493. package/dist/utility/unsupported.js.map +1 -0
  494. package/dist/values.js +13 -1
  495. package/dist/values.js.map +1 -1
  496. package/package.json +25 -12
  497. package/src/asset/loaders/ktx2/basis/LICENSE +201 -0
  498. package/src/asset/loaders/ktx2/basis/basis_transcoder.js +2 -0
  499. package/src/asset/loaders/ktx2/basis/basis_transcoder.wasm +0 -0
  500. package/src/asset/meshoptimizer/LICENSE +21 -0
  501. package/dist/animation/joint_dynamics/convex_collider.js +0 -320
  502. package/dist/animation/joint_dynamics/convex_collider.js.map +0 -1
@@ -0,0 +1,365 @@
1
+ import { sampleInstanceField, sampleGlobalSDFHinted, sdfSurfaceExpand, GLOBAL_SDF_PARAMS, GLOBAL_SDF_LEVELS, globalSDFVoxelCurrent, SDF_LEVEL_BLEND_VOXELS } from './sdf.js';
2
+
3
+ /**
4
+ * Uniform names of the voxelize pass, see {@link declareVoxelizeUniforms}.
5
+ * @internal
6
+ */ const VOXELIZE_ALBEDO = 'zVoxelizeAlbedo';
7
+ /** @internal */ const VOXELIZE_EMISSIVE = 'zVoxelizeEmissive';
8
+ /** @internal */ const VOXELIZE_PARAMS = 'zVoxelizeParams';
9
+ /**
10
+ * Uniform names of the voxel scene (material clipmaps), see
11
+ * {@link declareVoxelSceneUniforms}.
12
+ * @internal
13
+ */ const VOXEL_SCENE_ALBEDO = 'zVoxelSceneAlbedo';
14
+ /** @internal */ const VOXEL_SCENE_EMISSIVE = 'zVoxelSceneEmissive';
15
+ /** @internal */ const VOXEL_SCENE_RADIANCE = 'zVoxelSceneRadiance';
16
+ /** @internal */ const VOXEL_SCENE_ANISO0 = 'zVoxelSceneAniso0';
17
+ /** @internal */ const VOXEL_SCENE_ANISO1 = 'zVoxelSceneAniso1';
18
+ /**
19
+ * Declares the voxelize pass targets of {@link storeVoxelMaterial}; fragment stage only
20
+ * (write-only storage textures).
21
+ *
22
+ * - albedo: rgba8unorm storage, rgb albedo, a = 1 where rasterized (trilinear reads as
23
+ * premultiplied colour and coverage).
24
+ * - emissive: rgba8unorm storage holding RGBE.
25
+ * - params[0]: (field box min, voxel size), params[1]: (atlas slot offset, 0),
26
+ * params[2]: (voxels per axis of the slot, 0); all in mesh local space.
27
+ * @internal
28
+ */ function declareVoxelizeUniforms(scope, group) {
29
+ const pb = scope.$builder;
30
+ scope[VOXELIZE_ALBEDO] = pb.texStorage3D.rgba8unorm().storage(group);
31
+ scope[VOXELIZE_EMISSIVE] = pb.texStorage3D.rgba8unorm().storage(group);
32
+ scope[VOXELIZE_PARAMS] = pb.vec4[3]().uniform(group);
33
+ }
34
+ /**
35
+ * Packs an HDR colour as RGBE into four unorm8 channels: the mantissas scaled
36
+ * so the largest lies in (0.5, 1], the shared exponent biased by 128 in alpha.
37
+ * Zero for black.
38
+ * @internal
39
+ */ function encodeRGBE(scope, color) {
40
+ const pb = scope.$builder;
41
+ const funcName = 'Z_encodeRGBE';
42
+ pb.func(funcName, [
43
+ pb.vec3('c')
44
+ ], function() {
45
+ this.$l.m = pb.max(pb.max(this.c.r, this.c.g), this.c.b);
46
+ this.$if(pb.lessThanEqual(this.m, 1e-6), function() {
47
+ this.$return(pb.vec4(0));
48
+ });
49
+ this.$l.e = pb.clamp(pb.ceil(pb.log2(this.m)), -127, 127);
50
+ this.$return(pb.vec4(pb.div(this.c, pb.exp2(this.e)), pb.div(pb.add(this.e, 128), 255)));
51
+ });
52
+ return scope[funcName](color);
53
+ }
54
+ /**
55
+ * Unpacks what {@link encodeRGBE} packed.
56
+ * @internal
57
+ */ function decodeRGBE(scope, value) {
58
+ const pb = scope.$builder;
59
+ const funcName = 'Z_decodeRGBE';
60
+ pb.func(funcName, [
61
+ pb.vec4('v')
62
+ ], function() {
63
+ this.$if(pb.lessThanEqual(this.v.a, 0), function() {
64
+ this.$return(pb.vec3(0));
65
+ });
66
+ this.$return(pb.mul(this.v.rgb, pb.exp2(pb.sub(pb.mul(this.v.a, 255), 128))));
67
+ });
68
+ return scope[funcName](value);
69
+ }
70
+ /**
71
+ * Stores a fragment's material in the atlas slot voxel holding its mesh-local position
72
+ * (the voxelize pass draws with an identity world matrix); fragments outside the box are dropped.
73
+ * @internal
74
+ */ function storeVoxelMaterial(scope, localPos, albedo, emissive) {
75
+ const pb = scope.$builder;
76
+ const funcName = 'Z_storeVoxelMaterial';
77
+ pb.func(funcName, [
78
+ pb.vec3('pos'),
79
+ pb.vec3('albedo'),
80
+ pb.vec3('emissive')
81
+ ], function() {
82
+ this.$l.p0 = this[VOXELIZE_PARAMS].at(0);
83
+ this.$l.p1 = this[VOXELIZE_PARAMS].at(1);
84
+ this.$l.p2 = this[VOXELIZE_PARAMS].at(2);
85
+ this.$l.v = pb.floor(pb.div(pb.sub(this.pos, this.p0.xyz), this.p0.w));
86
+ this.$if(pb.and(pb.all(pb.greaterThanEqual(this.v, pb.vec3(0))), pb.all(pb.lessThan(this.v, this.p2.xyz))), function() {
87
+ this.$l.t = pb.uvec3(pb.add(this.p1.xyz, this.v));
88
+ pb.textureStore(this[VOXELIZE_ALBEDO], this.t, pb.vec4(this.albedo, 1));
89
+ pb.textureStore(this[VOXELIZE_EMISSIVE], this.t, encodeRGBE(this, this.emissive));
90
+ });
91
+ });
92
+ scope[funcName](localPos, albedo, emissive);
93
+ }
94
+ /**
95
+ * Albedo and emissive of one packed instance at a local point, read from the material
96
+ * atlases after projecting the point onto the surface along the baked field's gradient.
97
+ * No coverage, or no material slot (`matSlot.w <= 0`), gives alpha 0.
98
+ *
99
+ * Declares locals `outAlbedo` (vec4, a = 1 where valid) and `outEmissive` (vec3).
100
+ * @internal
101
+ */ function sampleInstanceMaterial(scope, lp, bmin, bmax, slot, matSlot, matRes, sdfAtlas, sdfAtlasInvSize, matAlbedo, matEmissive, matAtlasInvSize, outAlbedo, outEmissive) {
102
+ const pb = scope.$builder;
103
+ scope.$l[outAlbedo] = pb.vec4(0);
104
+ scope.$l[outEmissive] = pb.vec3(0);
105
+ scope.$if(pb.greaterThan(matSlot.w, 0), function() {
106
+ // Unclamped so the gradient stays valid outside the field box; several steps
107
+ // because in corners the differenced gradient blends faces and one step falls short
108
+ this.$l.gmH = bmin.w;
109
+ this.$l.gmS = lp;
110
+ this.$l.gmN = pb.vec3(0, 1, 0);
111
+ this.$for(pb.int('gmIt'), 0, 3, function() {
112
+ this.$l.gmD = sampleInstanceField(this, this.gmS, bmin, bmax, slot, sdfAtlas, sdfAtlasInvSize);
113
+ this.$l.gmG = pb.vec3(pb.sub(sampleInstanceField(this, pb.add(this.gmS, pb.vec3(this.gmH, 0, 0)), bmin, bmax, slot, sdfAtlas, sdfAtlasInvSize), this.gmD), pb.sub(sampleInstanceField(this, pb.add(this.gmS, pb.vec3(0, this.gmH, 0)), bmin, bmax, slot, sdfAtlas, sdfAtlasInvSize), this.gmD), pb.sub(sampleInstanceField(this, pb.add(this.gmS, pb.vec3(0, 0, this.gmH)), bmin, bmax, slot, sdfAtlas, sdfAtlasInvSize), this.gmD));
114
+ this.gmN = pb.div(this.gmG, pb.max(pb.length(this.gmG), 1e-6));
115
+ this.gmS = pb.sub(this.gmS, pb.mul(this.gmN, this.gmD));
116
+ });
117
+ // Material voxels are twice the field's. The surface is a one-voxel shell, so take
118
+ // the best covered of three samples along the normal
119
+ this.$l.gmA = pb.vec4(0);
120
+ this.$l.gmUVW = pb.vec3(0);
121
+ for (const [k, tag] of [
122
+ [
123
+ 0,
124
+ 'On'
125
+ ],
126
+ [
127
+ -0.5,
128
+ 'In'
129
+ ],
130
+ [
131
+ 0.5,
132
+ 'Out'
133
+ ]
134
+ ]){
135
+ this.$l[`gmF${tag}`] = pb.clamp(pb.div(pb.sub(pb.add(this.gmS, pb.mul(this.gmN, this.gmH, 2 * k)), bmin.xyz), pb.mul(this.gmH, 2)), pb.vec3(0.5), pb.sub(matRes.xyz, pb.vec3(0.5)));
136
+ this.$l[`gmUVW${tag}`] = pb.mul(pb.add(matSlot.xyz, this[`gmF${tag}`]), matAtlasInvSize);
137
+ this.$l[`gmA${tag}`] = pb.textureSampleLevel(matAlbedo, this[`gmUVW${tag}`], 0);
138
+ this.$if(pb.greaterThan(this[`gmA${tag}`].a, this.gmA.a), function() {
139
+ this.gmA = this[`gmA${tag}`];
140
+ this.gmUVW = this[`gmUVW${tag}`];
141
+ });
142
+ }
143
+ this.$if(pb.greaterThan(this.gmA.a, 0.02), function() {
144
+ this[outAlbedo] = pb.vec4(pb.div(this.gmA.rgb, this.gmA.a), 1);
145
+ // RGBE cannot be filtered: manual trilinear over decoded texels, weighted by coverage
146
+ this.$l.gmSize = pb.div(pb.vec3(1), matAtlasInvSize);
147
+ this.$l.gmTc = pb.sub(pb.mul(this.gmUVW, this.gmSize), pb.vec3(0.5));
148
+ this.$l.gmBase = pb.ivec3(pb.floor(this.gmTc));
149
+ this.$l.gmFr = pb.sub(this.gmTc, pb.floor(this.gmTc));
150
+ this.$l.gmEsum = pb.vec3(0);
151
+ this.$l.gmWsum = pb.float(0);
152
+ for(let k = 0; k < 8; k++){
153
+ const off = [
154
+ k & 1,
155
+ k >> 1 & 1,
156
+ k >> 2 & 1
157
+ ];
158
+ this.$l[`gmT${k}`] = pb.add(this.gmBase, pb.ivec3(off[0], off[1], off[2]));
159
+ this.$l[`gmW${k}`] = pb.mul(off[0] ? this.gmFr.x : pb.sub(1, this.gmFr.x), off[1] ? this.gmFr.y : pb.sub(1, this.gmFr.y), off[2] ? this.gmFr.z : pb.sub(1, this.gmFr.z), pb.textureLoad(matAlbedo, this[`gmT${k}`], 0).a);
160
+ this.gmEsum = pb.add(this.gmEsum, pb.mul(decodeRGBE(this, pb.textureLoad(matEmissive, this[`gmT${k}`], 0)), this[`gmW${k}`]));
161
+ this.gmWsum = pb.add(this.gmWsum, this[`gmW${k}`]);
162
+ }
163
+ this[outEmissive] = pb.div(this.gmEsum, pb.max(this.gmWsum, 1e-4));
164
+ });
165
+ });
166
+ }
167
+ /**
168
+ * Declares the voxel scene clipmaps; same layout as the global SDF (levels stacked along z,
169
+ * toroidal windows, same bricks) at half resolution. Requires {@link declareGlobalSDFUniforms}.
170
+ *
171
+ * - albedo: rgba8unorm, rgb albedo, a = 1 where a surface is.
172
+ * - emissive: rgba16float, emitted radiance.
173
+ * - radiance: rgba16float, outgoing radiance summed over the six axis faces.
174
+ * - aniso0, aniso1: rgba8unorm (aniso1 rg8unorm with texture-formats-tier1), per-face share
175
+ * of that sum by luminance: (+x, +y, +z, -x) and (-y, -z) in rg.
176
+ * @internal
177
+ */ function declareVoxelSceneUniforms(scope, group) {
178
+ const pb = scope.$builder;
179
+ scope[VOXEL_SCENE_ALBEDO] = pb.tex3D().sampleType('unfilterable-float').uniform(group);
180
+ scope[VOXEL_SCENE_EMISSIVE] = pb.tex3D().sampleType('unfilterable-float').uniform(group);
181
+ scope[VOXEL_SCENE_RADIANCE] = pb.tex3D().sampleType('unfilterable-float').uniform(group);
182
+ scope[VOXEL_SCENE_ANISO0] = pb.tex3D().sampleType('unfilterable-float').uniform(group);
183
+ scope[VOXEL_SCENE_ANISO1] = pb.tex3D().sampleType('unfilterable-float').uniform(group);
184
+ }
185
+ /**
186
+ * Outgoing radiance at a texel of {@link voxelSceneTexel} toward `normal`, weighted by the
187
+ * per-face anisotropy shares. Zero for level -1.
188
+ * @internal
189
+ */ function loadVoxelSceneRadiance(scope, texel, normal) {
190
+ const pb = scope.$builder;
191
+ const funcName = 'Z_loadVoxelSceneRadiance';
192
+ pb.func(funcName, [
193
+ pb.ivec4('t'),
194
+ pb.vec3('n')
195
+ ], function() {
196
+ this.$if(pb.lessThan(this.t.w, 0), function() {
197
+ this.$return(pb.vec3(0));
198
+ });
199
+ this.$l.total = pb.textureLoad(this[VOXEL_SCENE_RADIANCE], this.t.xyz, 0).rgb;
200
+ this.$l.a0 = pb.textureLoad(this[VOXEL_SCENE_ANISO0], this.t.xyz, 0);
201
+ this.$l.a1 = pb.textureLoad(this[VOXEL_SCENE_ANISO1], this.t.xyz, 0);
202
+ this.$l.pos = pb.max(pb.vec3(0), pb.mul(this.n, this.a0.xyz));
203
+ this.$l.neg = pb.max(pb.vec3(0), pb.mul(pb.neg(this.n), pb.vec3(this.a0.w, this.a1.x, this.a1.y)));
204
+ this.$return(pb.mul(this.total, pb.add(pb.dot(this.pos, pb.vec3(1)), pb.dot(this.neg, pb.vec3(1)))));
205
+ });
206
+ return scope[funcName](texel, normal);
207
+ }
208
+ /**
209
+ * Distant-light visibility by SDF cone tracing through the global field (Wright,
210
+ * "Dynamic Occlusion with Signed Distance Fields", SIGGRAPH 2015).
211
+ *
212
+ * `start` should already be offset off the surface; `tanHalfAngle` sets softness, `minStep`
213
+ * prevents stalling, `maxDistance` ends the march. Levels finer than `minLevel` are skipped.
214
+ * Static geometry only.
215
+ * @internal
216
+ */ function sdfConeShadow(scope, start, dir, tanHalfAngle, minStep, maxDistance, levels, steps = 24, minLevel) {
217
+ const pb = scope.$builder;
218
+ const funcName = 'Z_sdfConeShadow';
219
+ pb.func(funcName, [
220
+ pb.vec3('start'),
221
+ pb.vec3('dir'),
222
+ pb.float('tanHalf'),
223
+ pb.float('minStep'),
224
+ pb.float('maxDist'),
225
+ pb.int('minLevel')
226
+ ], function() {
227
+ this.$l.shadow = pb.float(1);
228
+ this.$l.t = this.minStep;
229
+ this.$l.prevD = pb.float(0);
230
+ this.$for(pb.int('i'), 0, steps, function() {
231
+ this.$l.sp = pb.add(this.start, pb.mul(this.dir, this.t));
232
+ this.$l.s = sampleGlobalSDFHinted(this, this.sp, this.prevD, levels, this.minLevel);
233
+ this.$l.d = this.s.x;
234
+ this.prevD = this.d;
235
+ this.$l.expand = sdfSurfaceExpand(this, this.sp, this.s, pb.sub(this.t, this.minStep), levels);
236
+ this.shadow = pb.min(this.shadow, pb.clamp(pb.div(pb.sub(this.d, this.expand), pb.mul(this.t, this.tanHalf)), 0, 1));
237
+ this.$if(pb.lessThan(this.shadow, 0.01), function() {
238
+ this.$break();
239
+ });
240
+ this.t = pb.add(this.t, pb.clamp(this.d, this.minStep, pb.mul(this.minStep, 16)));
241
+ this.$if(pb.greaterThan(this.t, this.maxDist), function() {
242
+ this.$break();
243
+ });
244
+ });
245
+ this.$return(this.shadow);
246
+ });
247
+ return scope[funcName](start, dir, tanHalfAngle, minStep, maxDistance, minLevel ?? pb.int(0));
248
+ }
249
+ /**
250
+ * Texel (x, y, z, level) of the finest material clipmap level holding a world position with a
251
+ * current brick; level -1 when none does.
252
+ * @internal
253
+ */ function voxelSceneTexel(scope, worldPos, levels) {
254
+ const pb = scope.$builder;
255
+ const funcName = 'Z_voxelSceneTexel';
256
+ pb.func(funcName, [
257
+ pb.vec3('p')
258
+ ], function() {
259
+ this.$l.res = pb.int(this[GLOBAL_SDF_PARAMS].x);
260
+ this.$l.half = pb.div(this.res, 2);
261
+ this.$l.halfV = pb.ivec3(this.half);
262
+ this.$l.result = pb.ivec4(0, 0, 0, -1);
263
+ for(let i = levels - 1; i >= 0; i--){
264
+ this.$l[`info${i}`] = this[GLOBAL_SDF_LEVELS].at(i);
265
+ this.$l[`vf${i}`] = pb.ivec3(pb.floor(pb.div(this.p, this[`info${i}`].w)));
266
+ this.$l[`o${i}`] = pb.ivec3(this[`info${i}`].xyz);
267
+ this.$l[`in${i}`] = pb.and(pb.all(pb.greaterThanEqual(this[`vf${i}`], this[`o${i}`])), pb.all(pb.lessThan(this[`vf${i}`], pb.add(this[`o${i}`], pb.ivec3(this.res)))));
268
+ this.$if(this[`in${i}`], function() {
269
+ this.$if(globalSDFVoxelCurrent(this, this[`vf${i}`], i), function() {
270
+ this.$l.vc = pb.ivec3(pb.floor(pb.div(pb.vec3(this[`vf${i}`]), 2)));
271
+ this.$l.t = pb.mod(pb.add(pb.mod(this.vc, this.halfV), this.halfV), this.halfV);
272
+ this.result = pb.ivec4(this.t.x, this.t.y, pb.add(this.t.z, pb.mul(this.half, i)), i);
273
+ });
274
+ });
275
+ }
276
+ this.$return(this.result);
277
+ });
278
+ return scope[funcName](worldPos);
279
+ }
280
+ /**
281
+ * Voxel scene radiance at a world position toward `normal` (see {@link loadVoxelSceneRadiance}),
282
+ * blended across levels like {@link sampleGlobalSDF} within {@link SDF_LEVEL_BLEND_VOXELS} of a
283
+ * window edge. Zero where no level holds the point with a current brick.
284
+ * @internal
285
+ */ function sampleVoxelSceneRadiance(scope, worldPos, normal, levels) {
286
+ const pb = scope.$builder;
287
+ const funcName = 'Z_sampleVoxelSceneRadiance';
288
+ pb.func(funcName, [
289
+ pb.vec3('p'),
290
+ pb.vec3('n')
291
+ ], function() {
292
+ this.$l.res = pb.int(this[GLOBAL_SDF_PARAMS].x);
293
+ this.$l.resF = this[GLOBAL_SDF_PARAMS].x;
294
+ this.$l.half = pb.div(this.res, 2);
295
+ this.$l.halfV = pb.ivec3(this.half);
296
+ this.$l.sum = pb.vec3(0);
297
+ this.$l.remaining = pb.float(1);
298
+ for(let i = 0; i < levels; i++){
299
+ // Finest first, each level taking the share its finer levels left
300
+ this.$if(pb.greaterThan(this.remaining, 1e-4), function() {
301
+ this.$l.info = this[GLOBAL_SDF_LEVELS].at(i);
302
+ this.$l.vf = pb.ivec3(pb.floor(pb.div(this.p, this.info.w)));
303
+ this.$l.o = pb.ivec3(this.info.xyz);
304
+ this.$l.inside = pb.and(pb.all(pb.greaterThanEqual(this.vf, this.o)), pb.all(pb.lessThan(this.vf, pb.add(this.o, pb.ivec3(this.res)))));
305
+ this.$if(this.inside, function() {
306
+ this.$if(globalSDFVoxelCurrent(this, this.vf, i), function() {
307
+ this.$l.vc = pb.ivec3(pb.floor(pb.div(pb.vec3(this.vf), 2)));
308
+ this.$l.t = pb.mod(pb.add(pb.mod(this.vc, this.halfV), this.halfV), this.halfV);
309
+ this.$l.rad = loadVoxelSceneRadiance(this, pb.ivec4(this.t.x, this.t.y, pb.add(this.t.z, pb.mul(this.half, i)), i), this.n);
310
+ if (i === levels - 1) {
311
+ this.$l.w = pb.float(1);
312
+ } else {
313
+ // Field voxels to the window edge, sample centres at integers
314
+ this.$l.f = pb.sub(pb.div(this.p, this.info.w), pb.add(this.info.xyz, pb.vec3(0.5)));
315
+ this.$l.lo = pb.min(pb.min(this.f.x, this.f.y), this.f.z);
316
+ this.$l.hi = pb.sub(pb.sub(this.resF, 1), pb.max(pb.max(this.f.x, this.f.y), this.f.z));
317
+ this.$l.w = pb.smoothStep(1, 1 + SDF_LEVEL_BLEND_VOXELS, pb.min(this.lo, this.hi));
318
+ }
319
+ this.$l.share = pb.mul(this.remaining, this.w);
320
+ this.sum = pb.add(this.sum, pb.mul(this.rad, this.share));
321
+ this.remaining = pb.sub(this.remaining, this.share);
322
+ });
323
+ });
324
+ });
325
+ }
326
+ this.$return(this.sum);
327
+ });
328
+ return scope[funcName](worldPos, normal);
329
+ }
330
+ /**
331
+ * Albedo (rgb) and presence (a) at a texel of {@link voxelSceneTexel}; zero
332
+ * for level -1.
333
+ * @internal
334
+ */ function loadVoxelSceneAlbedo(scope, texel) {
335
+ const pb = scope.$builder;
336
+ const funcName = 'Z_loadVoxelSceneAlbedo';
337
+ pb.func(funcName, [
338
+ pb.ivec4('t')
339
+ ], function() {
340
+ this.$if(pb.lessThan(this.t.w, 0), function() {
341
+ this.$return(pb.vec4(0));
342
+ });
343
+ this.$return(pb.textureLoad(this[VOXEL_SCENE_ALBEDO], this.t.xyz, 0));
344
+ });
345
+ return scope[funcName](texel);
346
+ }
347
+ /**
348
+ * Emitted radiance at a texel of {@link voxelSceneTexel}; zero for level -1.
349
+ * @internal
350
+ */ function loadVoxelSceneEmissive(scope, texel) {
351
+ const pb = scope.$builder;
352
+ const funcName = 'Z_loadVoxelSceneEmissive';
353
+ pb.func(funcName, [
354
+ pb.ivec4('t')
355
+ ], function() {
356
+ this.$if(pb.lessThan(this.t.w, 0), function() {
357
+ this.$return(pb.vec3(0));
358
+ });
359
+ this.$return(pb.textureLoad(this[VOXEL_SCENE_EMISSIVE], this.t.xyz, 0).rgb);
360
+ });
361
+ return scope[funcName](texel);
362
+ }
363
+
364
+ export { VOXELIZE_ALBEDO, VOXELIZE_EMISSIVE, VOXELIZE_PARAMS, VOXEL_SCENE_ALBEDO, VOXEL_SCENE_ANISO0, VOXEL_SCENE_ANISO1, VOXEL_SCENE_EMISSIVE, VOXEL_SCENE_RADIANCE, declareVoxelSceneUniforms, declareVoxelizeUniforms, decodeRGBE, encodeRGBE, loadVoxelSceneAlbedo, loadVoxelSceneEmissive, loadVoxelSceneRadiance, sampleInstanceMaterial, sampleVoxelSceneRadiance, sdfConeShadow, storeVoxelMaterial, voxelSceneTexel };
365
+ //# sourceMappingURL=gi.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gi.js","sources":["../../src/shaders/gi.ts"],"sourcesContent":["import type { PBGlobalScope, PBInsideFunctionScope, PBShaderExp } from '@zephyr3d/device';\r\nimport {\r\n GLOBAL_SDF_LEVELS,\r\n GLOBAL_SDF_PARAMS,\r\n globalSDFVoxelCurrent,\r\n sampleGlobalSDFHinted,\r\n sampleInstanceField,\r\n sdfSurfaceExpand,\r\n SDF_LEVEL_BLEND_VOXELS\r\n} from './sdf';\r\n\r\n/**\r\n * Uniform names of the voxelize pass, see {@link declareVoxelizeUniforms}.\r\n * @internal\r\n */\r\nexport const VOXELIZE_ALBEDO = 'zVoxelizeAlbedo';\r\n/** @internal */\r\nexport const VOXELIZE_EMISSIVE = 'zVoxelizeEmissive';\r\n/** @internal */\r\nexport const VOXELIZE_PARAMS = 'zVoxelizeParams';\r\n\r\n/**\r\n * Uniform names of the voxel scene (material clipmaps), see\r\n * {@link declareVoxelSceneUniforms}.\r\n * @internal\r\n */\r\nexport const VOXEL_SCENE_ALBEDO = 'zVoxelSceneAlbedo';\r\n/** @internal */\r\nexport const VOXEL_SCENE_EMISSIVE = 'zVoxelSceneEmissive';\r\n/** @internal */\r\nexport const VOXEL_SCENE_RADIANCE = 'zVoxelSceneRadiance';\r\n/** @internal */\r\nexport const VOXEL_SCENE_ANISO0 = 'zVoxelSceneAniso0';\r\n/** @internal */\r\nexport const VOXEL_SCENE_ANISO1 = 'zVoxelSceneAniso1';\r\n\r\n/**\r\n * Declares the voxelize pass targets of {@link storeVoxelMaterial}; fragment stage only\r\n * (write-only storage textures).\r\n *\r\n * - albedo: rgba8unorm storage, rgb albedo, a = 1 where rasterized (trilinear reads as\r\n * premultiplied colour and coverage).\r\n * - emissive: rgba8unorm storage holding RGBE.\r\n * - params[0]: (field box min, voxel size), params[1]: (atlas slot offset, 0),\r\n * params[2]: (voxels per axis of the slot, 0); all in mesh local space.\r\n * @internal\r\n */\r\nexport function declareVoxelizeUniforms(scope: PBGlobalScope, group: number) {\r\n const pb = scope.$builder;\r\n scope[VOXELIZE_ALBEDO] = pb.texStorage3D.rgba8unorm().storage(group);\r\n scope[VOXELIZE_EMISSIVE] = pb.texStorage3D.rgba8unorm().storage(group);\r\n scope[VOXELIZE_PARAMS] = pb.vec4[3]().uniform(group);\r\n}\r\n\r\n/**\r\n * Packs an HDR colour as RGBE into four unorm8 channels: the mantissas scaled\r\n * so the largest lies in (0.5, 1], the shared exponent biased by 128 in alpha.\r\n * Zero for black.\r\n * @internal\r\n */\r\nexport function encodeRGBE(scope: PBInsideFunctionScope, color: PBShaderExp) {\r\n const pb = scope.$builder;\r\n const funcName = 'Z_encodeRGBE';\r\n pb.func(funcName, [pb.vec3('c')], function () {\r\n this.$l.m = pb.max(pb.max(this.c.r, this.c.g), this.c.b);\r\n this.$if(pb.lessThanEqual(this.m, 1e-6), function () {\r\n this.$return(pb.vec4(0));\r\n });\r\n this.$l.e = pb.clamp(pb.ceil(pb.log2(this.m)), -127, 127);\r\n this.$return(pb.vec4(pb.div(this.c, pb.exp2(this.e)), pb.div(pb.add(this.e, 128), 255)));\r\n });\r\n return scope[funcName](color) as PBShaderExp;\r\n}\r\n\r\n/**\r\n * Unpacks what {@link encodeRGBE} packed.\r\n * @internal\r\n */\r\nexport function decodeRGBE(scope: PBInsideFunctionScope, value: PBShaderExp) {\r\n const pb = scope.$builder;\r\n const funcName = 'Z_decodeRGBE';\r\n pb.func(funcName, [pb.vec4('v')], function () {\r\n this.$if(pb.lessThanEqual(this.v.a, 0), function () {\r\n this.$return(pb.vec3(0));\r\n });\r\n this.$return(pb.mul(this.v.rgb, pb.exp2(pb.sub(pb.mul(this.v.a, 255), 128))));\r\n });\r\n return scope[funcName](value) as PBShaderExp;\r\n}\r\n\r\n/**\r\n * Stores a fragment's material in the atlas slot voxel holding its mesh-local position\r\n * (the voxelize pass draws with an identity world matrix); fragments outside the box are dropped.\r\n * @internal\r\n */\r\nexport function storeVoxelMaterial(\r\n scope: PBInsideFunctionScope,\r\n localPos: PBShaderExp,\r\n albedo: PBShaderExp,\r\n emissive: PBShaderExp\r\n) {\r\n const pb = scope.$builder;\r\n const funcName = 'Z_storeVoxelMaterial';\r\n pb.func(funcName, [pb.vec3('pos'), pb.vec3('albedo'), pb.vec3('emissive')], function () {\r\n this.$l.p0 = this[VOXELIZE_PARAMS].at(0);\r\n this.$l.p1 = this[VOXELIZE_PARAMS].at(1);\r\n this.$l.p2 = this[VOXELIZE_PARAMS].at(2);\r\n this.$l.v = pb.floor(pb.div(pb.sub(this.pos, this.p0.xyz), this.p0.w));\r\n this.$if(\r\n pb.and(pb.all(pb.greaterThanEqual(this.v, pb.vec3(0))), pb.all(pb.lessThan(this.v, this.p2.xyz))),\r\n function () {\r\n this.$l.t = pb.uvec3(pb.add(this.p1.xyz, this.v));\r\n pb.textureStore(this[VOXELIZE_ALBEDO], this.t, pb.vec4(this.albedo, 1));\r\n pb.textureStore(this[VOXELIZE_EMISSIVE], this.t, encodeRGBE(this, this.emissive));\r\n }\r\n );\r\n });\r\n scope[funcName](localPos, albedo, emissive);\r\n}\r\n\r\n/**\r\n * Albedo and emissive of one packed instance at a local point, read from the material\r\n * atlases after projecting the point onto the surface along the baked field's gradient.\r\n * No coverage, or no material slot (`matSlot.w <= 0`), gives alpha 0.\r\n *\r\n * Declares locals `outAlbedo` (vec4, a = 1 where valid) and `outEmissive` (vec3).\r\n * @internal\r\n */\r\nexport function sampleInstanceMaterial(\r\n scope: PBInsideFunctionScope,\r\n lp: PBShaderExp,\r\n bmin: PBShaderExp,\r\n bmax: PBShaderExp,\r\n slot: PBShaderExp,\r\n matSlot: PBShaderExp,\r\n matRes: PBShaderExp,\r\n sdfAtlas: PBShaderExp,\r\n sdfAtlasInvSize: PBShaderExp,\r\n matAlbedo: PBShaderExp,\r\n matEmissive: PBShaderExp,\r\n matAtlasInvSize: PBShaderExp,\r\n outAlbedo: string,\r\n outEmissive: string\r\n) {\r\n const pb = scope.$builder;\r\n scope.$l[outAlbedo] = pb.vec4(0);\r\n scope.$l[outEmissive] = pb.vec3(0);\r\n scope.$if(pb.greaterThan(matSlot.w, 0), function () {\r\n // Unclamped so the gradient stays valid outside the field box; several steps\r\n // because in corners the differenced gradient blends faces and one step falls short\r\n this.$l.gmH = bmin.w;\r\n this.$l.gmS = lp;\r\n this.$l.gmN = pb.vec3(0, 1, 0);\r\n this.$for(pb.int('gmIt'), 0, 3, function () {\r\n this.$l.gmD = sampleInstanceField(this, this.gmS, bmin, bmax, slot, sdfAtlas, sdfAtlasInvSize);\r\n this.$l.gmG = pb.vec3(\r\n pb.sub(\r\n sampleInstanceField(\r\n this,\r\n pb.add(this.gmS, pb.vec3(this.gmH, 0, 0)),\r\n bmin,\r\n bmax,\r\n slot,\r\n sdfAtlas,\r\n sdfAtlasInvSize\r\n ),\r\n this.gmD\r\n ),\r\n pb.sub(\r\n sampleInstanceField(\r\n this,\r\n pb.add(this.gmS, pb.vec3(0, this.gmH, 0)),\r\n bmin,\r\n bmax,\r\n slot,\r\n sdfAtlas,\r\n sdfAtlasInvSize\r\n ),\r\n this.gmD\r\n ),\r\n pb.sub(\r\n sampleInstanceField(\r\n this,\r\n pb.add(this.gmS, pb.vec3(0, 0, this.gmH)),\r\n bmin,\r\n bmax,\r\n slot,\r\n sdfAtlas,\r\n sdfAtlasInvSize\r\n ),\r\n this.gmD\r\n )\r\n );\r\n this.gmN = pb.div(this.gmG, pb.max(pb.length(this.gmG), 1e-6));\r\n this.gmS = pb.sub(this.gmS, pb.mul(this.gmN, this.gmD));\r\n });\r\n // Material voxels are twice the field's. The surface is a one-voxel shell, so take\r\n // the best covered of three samples along the normal\r\n this.$l.gmA = pb.vec4(0);\r\n this.$l.gmUVW = pb.vec3(0);\r\n for (const [k, tag] of [\r\n [0, 'On'],\r\n [-0.5, 'In'],\r\n [0.5, 'Out']\r\n ] as [number, string][]) {\r\n this.$l[`gmF${tag}`] = pb.clamp(\r\n pb.div(pb.sub(pb.add(this.gmS, pb.mul(this.gmN, this.gmH, 2 * k)), bmin.xyz), pb.mul(this.gmH, 2)),\r\n pb.vec3(0.5),\r\n pb.sub(matRes.xyz, pb.vec3(0.5))\r\n );\r\n this.$l[`gmUVW${tag}`] = pb.mul(pb.add(matSlot.xyz, this[`gmF${tag}`]), matAtlasInvSize);\r\n this.$l[`gmA${tag}`] = pb.textureSampleLevel(matAlbedo, this[`gmUVW${tag}`], 0);\r\n this.$if(pb.greaterThan(this[`gmA${tag}`].a, this.gmA.a), function () {\r\n this.gmA = this[`gmA${tag}`];\r\n this.gmUVW = this[`gmUVW${tag}`];\r\n });\r\n }\r\n this.$if(pb.greaterThan(this.gmA.a, 0.02), function () {\r\n this[outAlbedo] = pb.vec4(pb.div(this.gmA.rgb, this.gmA.a), 1);\r\n // RGBE cannot be filtered: manual trilinear over decoded texels, weighted by coverage\r\n this.$l.gmSize = pb.div(pb.vec3(1), matAtlasInvSize);\r\n this.$l.gmTc = pb.sub(pb.mul(this.gmUVW, this.gmSize), pb.vec3(0.5));\r\n this.$l.gmBase = pb.ivec3(pb.floor(this.gmTc));\r\n this.$l.gmFr = pb.sub(this.gmTc, pb.floor(this.gmTc));\r\n this.$l.gmEsum = pb.vec3(0);\r\n this.$l.gmWsum = pb.float(0);\r\n for (let k = 0; k < 8; k++) {\r\n const off = [k & 1, (k >> 1) & 1, (k >> 2) & 1];\r\n this.$l[`gmT${k}`] = pb.add(this.gmBase, pb.ivec3(off[0], off[1], off[2]));\r\n this.$l[`gmW${k}`] = pb.mul(\r\n off[0] ? this.gmFr.x : pb.sub(1, this.gmFr.x),\r\n off[1] ? this.gmFr.y : pb.sub(1, this.gmFr.y),\r\n off[2] ? this.gmFr.z : pb.sub(1, this.gmFr.z),\r\n pb.textureLoad(matAlbedo, this[`gmT${k}`], 0).a\r\n );\r\n this.gmEsum = pb.add(\r\n this.gmEsum,\r\n pb.mul(decodeRGBE(this, pb.textureLoad(matEmissive, this[`gmT${k}`], 0)), this[`gmW${k}`])\r\n );\r\n this.gmWsum = pb.add(this.gmWsum, this[`gmW${k}`]);\r\n }\r\n this[outEmissive] = pb.div(this.gmEsum, pb.max(this.gmWsum, 1e-4));\r\n });\r\n });\r\n}\r\n\r\n/**\r\n * Declares the voxel scene clipmaps; same layout as the global SDF (levels stacked along z,\r\n * toroidal windows, same bricks) at half resolution. Requires {@link declareGlobalSDFUniforms}.\r\n *\r\n * - albedo: rgba8unorm, rgb albedo, a = 1 where a surface is.\r\n * - emissive: rgba16float, emitted radiance.\r\n * - radiance: rgba16float, outgoing radiance summed over the six axis faces.\r\n * - aniso0, aniso1: rgba8unorm (aniso1 rg8unorm with texture-formats-tier1), per-face share\r\n * of that sum by luminance: (+x, +y, +z, -x) and (-y, -z) in rg.\r\n * @internal\r\n */\r\nexport function declareVoxelSceneUniforms(scope: PBGlobalScope, group: number) {\r\n const pb = scope.$builder;\r\n scope[VOXEL_SCENE_ALBEDO] = pb.tex3D().sampleType('unfilterable-float').uniform(group);\r\n scope[VOXEL_SCENE_EMISSIVE] = pb.tex3D().sampleType('unfilterable-float').uniform(group);\r\n scope[VOXEL_SCENE_RADIANCE] = pb.tex3D().sampleType('unfilterable-float').uniform(group);\r\n scope[VOXEL_SCENE_ANISO0] = pb.tex3D().sampleType('unfilterable-float').uniform(group);\r\n scope[VOXEL_SCENE_ANISO1] = pb.tex3D().sampleType('unfilterable-float').uniform(group);\r\n}\r\n\r\n/**\r\n * Outgoing radiance at a texel of {@link voxelSceneTexel} toward `normal`, weighted by the\r\n * per-face anisotropy shares. Zero for level -1.\r\n * @internal\r\n */\r\nexport function loadVoxelSceneRadiance(\r\n scope: PBInsideFunctionScope,\r\n texel: PBShaderExp,\r\n normal: PBShaderExp\r\n) {\r\n const pb = scope.$builder;\r\n const funcName = 'Z_loadVoxelSceneRadiance';\r\n pb.func(funcName, [pb.ivec4('t'), pb.vec3('n')], function () {\r\n this.$if(pb.lessThan(this.t.w, 0), function () {\r\n this.$return(pb.vec3(0));\r\n });\r\n this.$l.total = pb.textureLoad(this[VOXEL_SCENE_RADIANCE], this.t.xyz, 0).rgb;\r\n this.$l.a0 = pb.textureLoad(this[VOXEL_SCENE_ANISO0], this.t.xyz, 0);\r\n this.$l.a1 = pb.textureLoad(this[VOXEL_SCENE_ANISO1], this.t.xyz, 0);\r\n this.$l.pos = pb.max(pb.vec3(0), pb.mul(this.n, this.a0.xyz));\r\n this.$l.neg = pb.max(pb.vec3(0), pb.mul(pb.neg(this.n), pb.vec3(this.a0.w, this.a1.x, this.a1.y)));\r\n this.$return(pb.mul(this.total, pb.add(pb.dot(this.pos, pb.vec3(1)), pb.dot(this.neg, pb.vec3(1)))));\r\n });\r\n return scope[funcName](texel, normal) as PBShaderExp;\r\n}\r\n\r\n/**\r\n * Distant-light visibility by SDF cone tracing through the global field (Wright,\r\n * \"Dynamic Occlusion with Signed Distance Fields\", SIGGRAPH 2015).\r\n *\r\n * `start` should already be offset off the surface; `tanHalfAngle` sets softness, `minStep`\r\n * prevents stalling, `maxDistance` ends the march. Levels finer than `minLevel` are skipped.\r\n * Static geometry only.\r\n * @internal\r\n */\r\nexport function sdfConeShadow(\r\n scope: PBInsideFunctionScope,\r\n start: PBShaderExp,\r\n dir: PBShaderExp,\r\n tanHalfAngle: PBShaderExp,\r\n minStep: PBShaderExp,\r\n maxDistance: PBShaderExp,\r\n levels: number,\r\n steps = 24,\r\n minLevel?: PBShaderExp\r\n) {\r\n const pb = scope.$builder;\r\n const funcName = 'Z_sdfConeShadow';\r\n pb.func(\r\n funcName,\r\n [\r\n pb.vec3('start'),\r\n pb.vec3('dir'),\r\n pb.float('tanHalf'),\r\n pb.float('minStep'),\r\n pb.float('maxDist'),\r\n pb.int('minLevel')\r\n ],\r\n function () {\r\n this.$l.shadow = pb.float(1);\r\n this.$l.t = this.minStep;\r\n this.$l.prevD = pb.float(0);\r\n this.$for(pb.int('i'), 0, steps, function () {\r\n this.$l.sp = pb.add(this.start, pb.mul(this.dir, this.t));\r\n this.$l.s = sampleGlobalSDFHinted(this, this.sp, this.prevD, levels, this.minLevel);\r\n this.$l.d = this.s.x;\r\n this.prevD = this.d;\r\n this.$l.expand = sdfSurfaceExpand(this, this.sp, this.s, pb.sub(this.t, this.minStep), levels);\r\n this.shadow = pb.min(\r\n this.shadow,\r\n pb.clamp(pb.div(pb.sub(this.d, this.expand), pb.mul(this.t, this.tanHalf)), 0, 1)\r\n );\r\n this.$if(pb.lessThan(this.shadow, 0.01), function () {\r\n this.$break();\r\n });\r\n this.t = pb.add(this.t, pb.clamp(this.d, this.minStep, pb.mul(this.minStep, 16)));\r\n this.$if(pb.greaterThan(this.t, this.maxDist), function () {\r\n this.$break();\r\n });\r\n });\r\n this.$return(this.shadow);\r\n }\r\n );\r\n return scope[funcName](\r\n start,\r\n dir,\r\n tanHalfAngle,\r\n minStep,\r\n maxDistance,\r\n minLevel ?? pb.int(0)\r\n ) as PBShaderExp;\r\n}\r\n\r\n/**\r\n * Texel (x, y, z, level) of the finest material clipmap level holding a world position with a\r\n * current brick; level -1 when none does.\r\n * @internal\r\n */\r\nexport function voxelSceneTexel(scope: PBInsideFunctionScope, worldPos: PBShaderExp, levels: number) {\r\n const pb = scope.$builder;\r\n const funcName = 'Z_voxelSceneTexel';\r\n pb.func(funcName, [pb.vec3('p')], function () {\r\n this.$l.res = pb.int(this[GLOBAL_SDF_PARAMS].x);\r\n this.$l.half = pb.div(this.res, 2);\r\n this.$l.halfV = pb.ivec3(this.half);\r\n this.$l.result = pb.ivec4(0, 0, 0, -1);\r\n for (let i = levels - 1; i >= 0; i--) {\r\n this.$l[`info${i}`] = this[GLOBAL_SDF_LEVELS].at(i);\r\n this.$l[`vf${i}`] = pb.ivec3(pb.floor(pb.div(this.p, this[`info${i}`].w)));\r\n this.$l[`o${i}`] = pb.ivec3(this[`info${i}`].xyz);\r\n this.$l[`in${i}`] = pb.and(\r\n pb.all(pb.greaterThanEqual(this[`vf${i}`], this[`o${i}`])),\r\n pb.all(pb.lessThan(this[`vf${i}`], pb.add(this[`o${i}`], pb.ivec3(this.res))))\r\n );\r\n this.$if(this[`in${i}`], function () {\r\n this.$if(globalSDFVoxelCurrent(this, this[`vf${i}`], i), function () {\r\n this.$l.vc = pb.ivec3(pb.floor(pb.div(pb.vec3(this[`vf${i}`]), 2)));\r\n this.$l.t = pb.mod(pb.add(pb.mod(this.vc, this.halfV), this.halfV), this.halfV);\r\n this.result = pb.ivec4(this.t.x, this.t.y, pb.add(this.t.z, pb.mul(this.half, i)), i);\r\n });\r\n });\r\n }\r\n this.$return(this.result);\r\n });\r\n return scope[funcName](worldPos) as PBShaderExp;\r\n}\r\n\r\n/**\r\n * Voxel scene radiance at a world position toward `normal` (see {@link loadVoxelSceneRadiance}),\r\n * blended across levels like {@link sampleGlobalSDF} within {@link SDF_LEVEL_BLEND_VOXELS} of a\r\n * window edge. Zero where no level holds the point with a current brick.\r\n * @internal\r\n */\r\nexport function sampleVoxelSceneRadiance(\r\n scope: PBInsideFunctionScope,\r\n worldPos: PBShaderExp,\r\n normal: PBShaderExp,\r\n levels: number\r\n) {\r\n const pb = scope.$builder;\r\n const funcName = 'Z_sampleVoxelSceneRadiance';\r\n pb.func(funcName, [pb.vec3('p'), pb.vec3('n')], function () {\r\n this.$l.res = pb.int(this[GLOBAL_SDF_PARAMS].x);\r\n this.$l.resF = this[GLOBAL_SDF_PARAMS].x;\r\n this.$l.half = pb.div(this.res, 2);\r\n this.$l.halfV = pb.ivec3(this.half);\r\n this.$l.sum = pb.vec3(0);\r\n this.$l.remaining = pb.float(1);\r\n for (let i = 0; i < levels; i++) {\r\n // Finest first, each level taking the share its finer levels left\r\n this.$if(pb.greaterThan(this.remaining, 1e-4), function () {\r\n this.$l.info = this[GLOBAL_SDF_LEVELS].at(i);\r\n this.$l.vf = pb.ivec3(pb.floor(pb.div(this.p, this.info.w)));\r\n this.$l.o = pb.ivec3(this.info.xyz);\r\n this.$l.inside = pb.and(\r\n pb.all(pb.greaterThanEqual(this.vf, this.o)),\r\n pb.all(pb.lessThan(this.vf, pb.add(this.o, pb.ivec3(this.res))))\r\n );\r\n this.$if(this.inside, function () {\r\n this.$if(globalSDFVoxelCurrent(this, this.vf, i), function () {\r\n this.$l.vc = pb.ivec3(pb.floor(pb.div(pb.vec3(this.vf), 2)));\r\n this.$l.t = pb.mod(pb.add(pb.mod(this.vc, this.halfV), this.halfV), this.halfV);\r\n this.$l.rad = loadVoxelSceneRadiance(\r\n this,\r\n pb.ivec4(this.t.x, this.t.y, pb.add(this.t.z, pb.mul(this.half, i)), i),\r\n this.n\r\n );\r\n if (i === levels - 1) {\r\n this.$l.w = pb.float(1);\r\n } else {\r\n // Field voxels to the window edge, sample centres at integers\r\n this.$l.f = pb.sub(pb.div(this.p, this.info.w), pb.add(this.info.xyz, pb.vec3(0.5)));\r\n this.$l.lo = pb.min(pb.min(this.f.x, this.f.y), this.f.z);\r\n this.$l.hi = pb.sub(pb.sub(this.resF, 1), pb.max(pb.max(this.f.x, this.f.y), this.f.z));\r\n this.$l.w = pb.smoothStep(1, 1 + SDF_LEVEL_BLEND_VOXELS, pb.min(this.lo, this.hi));\r\n }\r\n this.$l.share = pb.mul(this.remaining, this.w);\r\n this.sum = pb.add(this.sum, pb.mul(this.rad, this.share));\r\n this.remaining = pb.sub(this.remaining, this.share);\r\n });\r\n });\r\n });\r\n }\r\n this.$return(this.sum);\r\n });\r\n return scope[funcName](worldPos, normal) as PBShaderExp;\r\n}\r\n\r\n/**\r\n * Albedo (rgb) and presence (a) at a texel of {@link voxelSceneTexel}; zero\r\n * for level -1.\r\n * @internal\r\n */\r\nexport function loadVoxelSceneAlbedo(scope: PBInsideFunctionScope, texel: PBShaderExp) {\r\n const pb = scope.$builder;\r\n const funcName = 'Z_loadVoxelSceneAlbedo';\r\n pb.func(funcName, [pb.ivec4('t')], function () {\r\n this.$if(pb.lessThan(this.t.w, 0), function () {\r\n this.$return(pb.vec4(0));\r\n });\r\n this.$return(pb.textureLoad(this[VOXEL_SCENE_ALBEDO], this.t.xyz, 0));\r\n });\r\n return scope[funcName](texel) as PBShaderExp;\r\n}\r\n\r\n/**\r\n * Emitted radiance at a texel of {@link voxelSceneTexel}; zero for level -1.\r\n * @internal\r\n */\r\nexport function loadVoxelSceneEmissive(scope: PBInsideFunctionScope, texel: PBShaderExp) {\r\n const pb = scope.$builder;\r\n const funcName = 'Z_loadVoxelSceneEmissive';\r\n pb.func(funcName, [pb.ivec4('t')], function () {\r\n this.$if(pb.lessThan(this.t.w, 0), function () {\r\n this.$return(pb.vec3(0));\r\n });\r\n this.$return(pb.textureLoad(this[VOXEL_SCENE_EMISSIVE], this.t.xyz, 0).rgb);\r\n });\r\n return scope[funcName](texel) as PBShaderExp;\r\n}\r\n"],"names":["VOXELIZE_ALBEDO","VOXELIZE_EMISSIVE","VOXELIZE_PARAMS","VOXEL_SCENE_ALBEDO","VOXEL_SCENE_EMISSIVE","VOXEL_SCENE_RADIANCE","VOXEL_SCENE_ANISO0","VOXEL_SCENE_ANISO1","declareVoxelizeUniforms","scope","group","pb","$builder","texStorage3D","rgba8unorm","storage","vec4","uniform","encodeRGBE","color","funcName","func","vec3","$l","m","max","c","r","g","b","$if","lessThanEqual","$return","e","clamp","ceil","log2","div","exp2","add","decodeRGBE","value","v","a","mul","rgb","sub","storeVoxelMaterial","localPos","albedo","emissive","p0","at","p1","p2","floor","pos","xyz","w","and","all","greaterThanEqual","lessThan","t","uvec3","textureStore","sampleInstanceMaterial","lp","bmin","bmax","slot","matSlot","matRes","sdfAtlas","sdfAtlasInvSize","matAlbedo","matEmissive","matAtlasInvSize","outAlbedo","outEmissive","greaterThan","gmH","gmS","gmN","$for","int","gmD","sampleInstanceField","gmG","length","gmA","gmUVW","k","tag","textureSampleLevel","gmSize","gmTc","gmBase","ivec3","gmFr","gmEsum","gmWsum","float","off","x","y","z","textureLoad","declareVoxelSceneUniforms","tex3D","sampleType","loadVoxelSceneRadiance","texel","normal","ivec4","total","a0","a1","n","neg","dot","sdfConeShadow","start","dir","tanHalfAngle","minStep","maxDistance","levels","steps","minLevel","shadow","prevD","sp","s","sampleGlobalSDFHinted","d","expand","sdfSurfaceExpand","min","tanHalf","$break","maxDist","voxelSceneTexel","worldPos","res","GLOBAL_SDF_PARAMS","half","halfV","result","i","GLOBAL_SDF_LEVELS","p","globalSDFVoxelCurrent","vc","mod","sampleVoxelSceneRadiance","resF","sum","remaining","info","vf","o","inside","rad","f","lo","hi","smoothStep","SDF_LEVEL_BLEND_VOXELS","share","loadVoxelSceneAlbedo","loadVoxelSceneEmissive"],"mappings":";;AAWA;;;IAIaA,MAAAA,eAAAA,GAAkB;AAC/B,iBACaC,MAAAA,iBAAAA,GAAoB;AACjC,iBACaC,MAAAA,eAAAA,GAAkB;AAE/B;;;;IAKaC,MAAAA,kBAAAA,GAAqB;AAClC,iBACaC,MAAAA,oBAAAA,GAAuB;AACpC,iBACaC,MAAAA,oBAAAA,GAAuB;AACpC,iBACaC,MAAAA,kBAAAA,GAAqB;AAClC,iBACaC,MAAAA,kBAAAA,GAAqB;AAElC;;;;;;;;;;AAUC,IACM,SAASC,uBAAwBC,CAAAA,KAAoB,EAAEC,KAAa,EAAA;IACzE,MAAMC,EAAAA,GAAKF,MAAMG,QAAQ;IACzBH,KAAK,CAACT,gBAAgB,GAAGW,EAAAA,CAAGE,YAAY,CAACC,UAAU,EAAGC,CAAAA,OAAO,CAACL,KAAAA,CAAAA;IAC9DD,KAAK,CAACR,kBAAkB,GAAGU,EAAAA,CAAGE,YAAY,CAACC,UAAU,EAAGC,CAAAA,OAAO,CAACL,KAAAA,CAAAA;IAChED,KAAK,CAACP,gBAAgB,GAAGS,EAAAA,CAAGK,IAAI,CAAC,CAAA,CAAE,EAAGC,CAAAA,OAAO,CAACP,KAAAA,CAAAA;AAChD;AAEA;;;;;AAKC,IACM,SAASQ,UAAWT,CAAAA,KAA4B,EAAEU,KAAkB,EAAA;IACzE,MAAMR,EAAAA,GAAKF,MAAMG,QAAQ;AACzB,IAAA,MAAMQ,QAAW,GAAA,cAAA;IACjBT,EAAGU,CAAAA,IAAI,CAACD,QAAU,EAAA;AAACT,QAAAA,EAAAA,CAAGW,IAAI,CAAC,GAAA;KAAK,EAAE,WAAA;QAChC,IAAI,CAACC,EAAE,CAACC,CAAC,GAAGb,EAAGc,CAAAA,GAAG,CAACd,EAAAA,CAAGc,GAAG,CAAC,IAAI,CAACC,CAAC,CAACC,CAAC,EAAE,IAAI,CAACD,CAAC,CAACE,CAAC,CAAA,EAAG,IAAI,CAACF,CAAC,CAACG,CAAC,CAAA;QACvD,IAAI,CAACC,GAAG,CAACnB,EAAGoB,CAAAA,aAAa,CAAC,IAAI,CAACP,CAAC,EAAE,IAAO,CAAA,EAAA,WAAA;AACvC,YAAA,IAAI,CAACQ,OAAO,CAACrB,EAAAA,CAAGK,IAAI,CAAC,CAAA,CAAA,CAAA;AACvB,SAAA,CAAA;AACA,QAAA,IAAI,CAACO,EAAE,CAACU,CAAC,GAAGtB,EAAAA,CAAGuB,KAAK,CAACvB,EAAAA,CAAGwB,IAAI,CAACxB,EAAAA,CAAGyB,IAAI,CAAC,IAAI,CAACZ,CAAC,CAAA,CAAA,EAAI,IAAM,EAAA,GAAA,CAAA;AACrD,QAAA,IAAI,CAACQ,OAAO,CAACrB,EAAAA,CAAGK,IAAI,CAACL,EAAG0B,CAAAA,GAAG,CAAC,IAAI,CAACX,CAAC,EAAEf,EAAG2B,CAAAA,IAAI,CAAC,IAAI,CAACL,CAAC,CAAItB,CAAAA,EAAAA,EAAAA,CAAG0B,GAAG,CAAC1B,EAAG4B,CAAAA,GAAG,CAAC,IAAI,CAACN,CAAC,EAAE,GAAM,CAAA,EAAA,GAAA,CAAA,CAAA,CAAA;AACpF,KAAA,CAAA;IACA,OAAOxB,KAAK,CAACW,QAAAA,CAAS,CAACD,KAAAA,CAAAA;AACzB;AAEA;;;AAGC,IACM,SAASqB,UAAW/B,CAAAA,KAA4B,EAAEgC,KAAkB,EAAA;IACzE,MAAM9B,EAAAA,GAAKF,MAAMG,QAAQ;AACzB,IAAA,MAAMQ,QAAW,GAAA,cAAA;IACjBT,EAAGU,CAAAA,IAAI,CAACD,QAAU,EAAA;AAACT,QAAAA,EAAAA,CAAGK,IAAI,CAAC,GAAA;KAAK,EAAE,WAAA;AAChC,QAAA,IAAI,CAACc,GAAG,CAACnB,EAAAA,CAAGoB,aAAa,CAAC,IAAI,CAACW,CAAC,CAACC,CAAC,EAAE,CAAI,CAAA,EAAA,WAAA;AACtC,YAAA,IAAI,CAACX,OAAO,CAACrB,EAAAA,CAAGW,IAAI,CAAC,CAAA,CAAA,CAAA;AACvB,SAAA,CAAA;QACA,IAAI,CAACU,OAAO,CAACrB,EAAGiC,CAAAA,GAAG,CAAC,IAAI,CAACF,CAAC,CAACG,GAAG,EAAElC,EAAAA,CAAG2B,IAAI,CAAC3B,EAAGmC,CAAAA,GAAG,CAACnC,EAAAA,CAAGiC,GAAG,CAAC,IAAI,CAACF,CAAC,CAACC,CAAC,EAAE,GAAM,CAAA,EAAA,GAAA,CAAA,CAAA,CAAA,CAAA;AACxE,KAAA,CAAA;IACA,OAAOlC,KAAK,CAACW,QAAAA,CAAS,CAACqB,KAAAA,CAAAA;AACzB;AAEA;;;;IAKO,SAASM,kBACdtC,CAAAA,KAA4B,EAC5BuC,QAAqB,EACrBC,MAAmB,EACnBC,QAAqB,EAAA;IAErB,MAAMvC,EAAAA,GAAKF,MAAMG,QAAQ;AACzB,IAAA,MAAMQ,QAAW,GAAA,sBAAA;IACjBT,EAAGU,CAAAA,IAAI,CAACD,QAAU,EAAA;AAACT,QAAAA,EAAAA,CAAGW,IAAI,CAAC,KAAA,CAAA;AAAQX,QAAAA,EAAAA,CAAGW,IAAI,CAAC,QAAA,CAAA;AAAWX,QAAAA,EAAAA,CAAGW,IAAI,CAAC,UAAA;KAAY,EAAE,WAAA;QAC1E,IAAI,CAACC,EAAE,CAAC4B,EAAE,GAAG,IAAI,CAACjD,eAAAA,CAAgB,CAACkD,EAAE,CAAC,CAAA,CAAA;QACtC,IAAI,CAAC7B,EAAE,CAAC8B,EAAE,GAAG,IAAI,CAACnD,eAAAA,CAAgB,CAACkD,EAAE,CAAC,CAAA,CAAA;QACtC,IAAI,CAAC7B,EAAE,CAAC+B,EAAE,GAAG,IAAI,CAACpD,eAAAA,CAAgB,CAACkD,EAAE,CAAC,CAAA,CAAA;AACtC,QAAA,IAAI,CAAC7B,EAAE,CAACmB,CAAC,GAAG/B,EAAAA,CAAG4C,KAAK,CAAC5C,EAAG0B,CAAAA,GAAG,CAAC1B,EAAAA,CAAGmC,GAAG,CAAC,IAAI,CAACU,GAAG,EAAE,IAAI,CAACL,EAAE,CAACM,GAAG,CAAA,EAAG,IAAI,CAACN,EAAE,CAACO,CAAC,CAAA,CAAA;AACpE,QAAA,IAAI,CAAC5B,GAAG,CACNnB,EAAAA,CAAGgD,GAAG,CAAChD,EAAAA,CAAGiD,GAAG,CAACjD,GAAGkD,gBAAgB,CAAC,IAAI,CAACnB,CAAC,EAAE/B,EAAAA,CAAGW,IAAI,CAAC,MAAMX,EAAGiD,CAAAA,GAAG,CAACjD,EAAAA,CAAGmD,QAAQ,CAAC,IAAI,CAACpB,CAAC,EAAE,IAAI,CAACY,EAAE,CAACG,GAAG,CAC9F,CAAA,CAAA,EAAA,WAAA;AACE,YAAA,IAAI,CAAClC,EAAE,CAACwC,CAAC,GAAGpD,EAAAA,CAAGqD,KAAK,CAACrD,EAAAA,CAAG4B,GAAG,CAAC,IAAI,CAACc,EAAE,CAACI,GAAG,EAAE,IAAI,CAACf,CAAC,CAAA,CAAA;AAC/C/B,YAAAA,EAAAA,CAAGsD,YAAY,CAAC,IAAI,CAACjE,eAAAA,CAAgB,EAAE,IAAI,CAAC+D,CAAC,EAAEpD,GAAGK,IAAI,CAAC,IAAI,CAACiC,MAAM,EAAE,CAAA,CAAA,CAAA;AACpEtC,YAAAA,EAAAA,CAAGsD,YAAY,CAAC,IAAI,CAAChE,kBAAkB,EAAE,IAAI,CAAC8D,CAAC,EAAE7C,UAAW,CAAA,IAAI,EAAE,IAAI,CAACgC,QAAQ,CAAA,CAAA;AACjF,SAAA,CAAA;AAEJ,KAAA,CAAA;AACAzC,IAAAA,KAAK,CAACW,QAAAA,CAAS,CAAC4B,QAAAA,EAAUC,MAAQC,EAAAA,QAAAA,CAAAA;AACpC;AAEA;;;;;;;AAOC,IACM,SAASgB,sBACdzD,CAAAA,KAA4B,EAC5B0D,EAAe,EACfC,IAAiB,EACjBC,IAAiB,EACjBC,IAAiB,EACjBC,OAAoB,EACpBC,MAAmB,EACnBC,QAAqB,EACrBC,eAA4B,EAC5BC,SAAsB,EACtBC,WAAwB,EACxBC,eAA4B,EAC5BC,SAAiB,EACjBC,WAAmB,EAAA;IAEnB,MAAMpE,EAAAA,GAAKF,MAAMG,QAAQ;AACzBH,IAAAA,KAAAA,CAAMc,EAAE,CAACuD,SAAAA,CAAU,GAAGnE,EAAAA,CAAGK,IAAI,CAAC,CAAA,CAAA;AAC9BP,IAAAA,KAAAA,CAAMc,EAAE,CAACwD,WAAAA,CAAY,GAAGpE,EAAAA,CAAGW,IAAI,CAAC,CAAA,CAAA;IAChCb,KAAMqB,CAAAA,GAAG,CAACnB,EAAGqE,CAAAA,WAAW,CAACT,OAAQb,CAAAA,CAAC,EAAE,CAAI,CAAA,EAAA,WAAA;;;AAGtC,QAAA,IAAI,CAACnC,EAAE,CAAC0D,GAAG,GAAGb,KAAKV,CAAC;AACpB,QAAA,IAAI,CAACnC,EAAE,CAAC2D,GAAG,GAAGf,EAAAA;QACd,IAAI,CAAC5C,EAAE,CAAC4D,GAAG,GAAGxE,EAAGW,CAAAA,IAAI,CAAC,CAAA,EAAG,CAAG,EAAA,CAAA,CAAA;QAC5B,IAAI,CAAC8D,IAAI,CAACzE,EAAAA,CAAG0E,GAAG,CAAC,MAAA,CAAA,EAAS,GAAG,CAAG,EAAA,WAAA;AAC9B,YAAA,IAAI,CAAC9D,EAAE,CAAC+D,GAAG,GAAGC,mBAAoB,CAAA,IAAI,EAAE,IAAI,CAACL,GAAG,EAAEd,IAAMC,EAAAA,IAAAA,EAAMC,MAAMG,QAAUC,EAAAA,eAAAA,CAAAA;YAC9E,IAAI,CAACnD,EAAE,CAACiE,GAAG,GAAG7E,EAAGW,CAAAA,IAAI,CACnBX,EAAGmC,CAAAA,GAAG,CACJyC,mBACE,CAAA,IAAI,EACJ5E,EAAG4B,CAAAA,GAAG,CAAC,IAAI,CAAC2C,GAAG,EAAEvE,EAAGW,CAAAA,IAAI,CAAC,IAAI,CAAC2D,GAAG,EAAE,CAAA,EAAG,KACtCb,IACAC,EAAAA,IAAAA,EACAC,IACAG,EAAAA,QAAAA,EACAC,eAEF,CAAA,EAAA,IAAI,CAACY,GAAG,CAAA,EAEV3E,GAAGmC,GAAG,CACJyC,oBACE,IAAI,EACJ5E,EAAG4B,CAAAA,GAAG,CAAC,IAAI,CAAC2C,GAAG,EAAEvE,GAAGW,IAAI,CAAC,GAAG,IAAI,CAAC2D,GAAG,EAAE,CACtCb,CAAAA,CAAAA,EAAAA,IAAAA,EACAC,MACAC,IACAG,EAAAA,QAAAA,EACAC,kBAEF,IAAI,CAACY,GAAG,CAEV3E,EAAAA,EAAAA,CAAGmC,GAAG,CACJyC,mBACE,CAAA,IAAI,EACJ5E,EAAG4B,CAAAA,GAAG,CAAC,IAAI,CAAC2C,GAAG,EAAEvE,EAAAA,CAAGW,IAAI,CAAC,CAAG,EAAA,CAAA,EAAG,IAAI,CAAC2D,GAAG,IACvCb,IACAC,EAAAA,IAAAA,EACAC,MACAG,QACAC,EAAAA,eAAAA,CAAAA,EAEF,IAAI,CAACY,GAAG,CAAA,CAAA;AAGZ,YAAA,IAAI,CAACH,GAAG,GAAGxE,GAAG0B,GAAG,CAAC,IAAI,CAACmD,GAAG,EAAE7E,EAAGc,CAAAA,GAAG,CAACd,EAAG8E,CAAAA,MAAM,CAAC,IAAI,CAACD,GAAG,CAAG,EAAA,IAAA,CAAA,CAAA;AACxD,YAAA,IAAI,CAACN,GAAG,GAAGvE,GAAGmC,GAAG,CAAC,IAAI,CAACoC,GAAG,EAAEvE,EAAGiC,CAAAA,GAAG,CAAC,IAAI,CAACuC,GAAG,EAAE,IAAI,CAACG,GAAG,CAAA,CAAA;AACvD,SAAA,CAAA;;;AAGA,QAAA,IAAI,CAAC/D,EAAE,CAACmE,GAAG,GAAG/E,EAAAA,CAAGK,IAAI,CAAC,CAAA,CAAA;AACtB,QAAA,IAAI,CAACO,EAAE,CAACoE,KAAK,GAAGhF,EAAAA,CAAGW,IAAI,CAAC,CAAA,CAAA;AACxB,QAAA,KAAK,MAAM,CAACsE,CAAGC,EAAAA,GAAAA,CAAI,IAAI;AACrB,YAAA;AAAC,gBAAA,CAAA;AAAG,gBAAA;AAAK,aAAA;AACT,YAAA;gBAAC,IAAC;AAAK,gBAAA;AAAK,aAAA;AACZ,YAAA;AAAC,gBAAA,GAAA;AAAK,gBAAA;AAAM;SACb,CAAwB;AACvB,YAAA,IAAI,CAACtE,EAAE,CAAC,CAAC,GAAG,EAAEsE,GAAK,CAAA,CAAA,CAAC,GAAGlF,EAAAA,CAAGuB,KAAK,CAC7BvB,EAAG0B,CAAAA,GAAG,CAAC1B,EAAAA,CAAGmC,GAAG,CAACnC,EAAG4B,CAAAA,GAAG,CAAC,IAAI,CAAC2C,GAAG,EAAEvE,EAAAA,CAAGiC,GAAG,CAAC,IAAI,CAACuC,GAAG,EAAE,IAAI,CAACF,GAAG,EAAE,CAAIW,GAAAA,CAAAA,CAAAA,CAAAA,EAAKxB,IAAKX,CAAAA,GAAG,CAAG9C,EAAAA,EAAAA,CAAGiC,GAAG,CAAC,IAAI,CAACqC,GAAG,EAAE,CAC/FtE,CAAAA,CAAAA,EAAAA,EAAAA,CAAGW,IAAI,CAAC,GACRX,CAAAA,EAAAA,EAAAA,CAAGmC,GAAG,CAAC0B,MAAOf,CAAAA,GAAG,EAAE9C,EAAAA,CAAGW,IAAI,CAAC,GAAA,CAAA,CAAA,CAAA;YAE7B,IAAI,CAACC,EAAE,CAAC,CAAC,KAAK,EAAEsE,GAAK,CAAA,CAAA,CAAC,GAAGlF,EAAAA,CAAGiC,GAAG,CAACjC,GAAG4B,GAAG,CAACgC,OAAQd,CAAAA,GAAG,EAAE,IAAI,CAAC,CAAC,GAAG,EAAEoC,GAAK,CAAA,CAAA,CAAC,CAAGhB,EAAAA,eAAAA,CAAAA;YACxE,IAAI,CAACtD,EAAE,CAAC,CAAC,GAAG,EAAEsE,GAAAA,CAAAA,CAAK,CAAC,GAAGlF,EAAAA,CAAGmF,kBAAkB,CAACnB,SAAAA,EAAW,IAAI,CAAC,CAAC,KAAK,EAAEkB,GAAAA,CAAAA,CAAK,CAAC,EAAE,CAAA,CAAA;YAC7E,IAAI,CAAC/D,GAAG,CAACnB,EAAAA,CAAGqE,WAAW,CAAC,IAAI,CAAC,CAAC,GAAG,EAAEa,GAAK,CAAA,CAAA,CAAC,CAAClD,CAAC,EAAE,IAAI,CAAC+C,GAAG,CAAC/C,CAAC,CAAG,EAAA,WAAA;gBACxD,IAAI,CAAC+C,GAAG,GAAG,IAAI,CAAC,CAAC,GAAG,EAAEG,GAAAA,CAAAA,CAAK,CAAC;gBAC5B,IAAI,CAACF,KAAK,GAAG,IAAI,CAAC,CAAC,KAAK,EAAEE,GAAAA,CAAAA,CAAK,CAAC;AAClC,aAAA,CAAA;AACF;AACA,QAAA,IAAI,CAAC/D,GAAG,CAACnB,EAAAA,CAAGqE,WAAW,CAAC,IAAI,CAACU,GAAG,CAAC/C,CAAC,EAAE,IAAO,CAAA,EAAA,WAAA;YACzC,IAAI,CAACmC,UAAU,GAAGnE,EAAAA,CAAGK,IAAI,CAACL,EAAAA,CAAG0B,GAAG,CAAC,IAAI,CAACqD,GAAG,CAAC7C,GAAG,EAAE,IAAI,CAAC6C,GAAG,CAAC/C,CAAC,CAAG,EAAA,CAAA,CAAA;;YAE5D,IAAI,CAACpB,EAAE,CAACwE,MAAM,GAAGpF,EAAG0B,CAAAA,GAAG,CAAC1B,EAAAA,CAAGW,IAAI,CAAC,CAAIuD,CAAAA,EAAAA,eAAAA,CAAAA;YACpC,IAAI,CAACtD,EAAE,CAACyE,IAAI,GAAGrF,EAAGmC,CAAAA,GAAG,CAACnC,EAAGiC,CAAAA,GAAG,CAAC,IAAI,CAAC+C,KAAK,EAAE,IAAI,CAACI,MAAM,CAAA,EAAGpF,EAAGW,CAAAA,IAAI,CAAC,GAAA,CAAA,CAAA;AAC/D,YAAA,IAAI,CAACC,EAAE,CAAC0E,MAAM,GAAGtF,EAAAA,CAAGuF,KAAK,CAACvF,EAAG4C,CAAAA,KAAK,CAAC,IAAI,CAACyC,IAAI,CAAA,CAAA;AAC5C,YAAA,IAAI,CAACzE,EAAE,CAAC4E,IAAI,GAAGxF,GAAGmC,GAAG,CAAC,IAAI,CAACkD,IAAI,EAAErF,EAAAA,CAAG4C,KAAK,CAAC,IAAI,CAACyC,IAAI,CAAA,CAAA;AACnD,YAAA,IAAI,CAACzE,EAAE,CAAC6E,MAAM,GAAGzF,EAAAA,CAAGW,IAAI,CAAC,CAAA,CAAA;AACzB,YAAA,IAAI,CAACC,EAAE,CAAC8E,MAAM,GAAG1F,EAAAA,CAAG2F,KAAK,CAAC,CAAA,CAAA;AAC1B,YAAA,IAAK,IAAIV,CAAAA,GAAI,CAAGA,EAAAA,CAAAA,GAAI,GAAGA,CAAK,EAAA,CAAA;AAC1B,gBAAA,MAAMW,GAAM,GAAA;oBAACX,CAAI,GAAA,CAAA;AAAIA,oBAAAA,CAAAA,IAAK,CAAK,GAAA,CAAA;AAAIA,oBAAAA,CAAAA,IAAK,CAAK,GAAA;AAAE,iBAAA;AAC/C,gBAAA,IAAI,CAACrE,EAAE,CAAC,CAAC,GAAG,EAAEqE,CAAG,CAAA,CAAA,CAAC,GAAGjF,EAAAA,CAAG4B,GAAG,CAAC,IAAI,CAAC0D,MAAM,EAAEtF,EAAGuF,CAAAA,KAAK,CAACK,GAAG,CAAC,CAAA,CAAE,EAAEA,GAAG,CAAC,CAAA,CAAE,EAAEA,GAAG,CAAC,CAAE,CAAA,CAAA,CAAA;AACxE,gBAAA,IAAI,CAAChF,EAAE,CAAC,CAAC,GAAG,EAAEqE,GAAG,CAAC,GAAGjF,EAAGiC,CAAAA,GAAG,CACzB2D,GAAG,CAAC,EAAE,GAAG,IAAI,CAACJ,IAAI,CAACK,CAAC,GAAG7F,GAAGmC,GAAG,CAAC,GAAG,IAAI,CAACqD,IAAI,CAACK,CAAC,CAC5CD,EAAAA,GAAG,CAAC,CAAE,CAAA,GAAG,IAAI,CAACJ,IAAI,CAACM,CAAC,GAAG9F,EAAGmC,CAAAA,GAAG,CAAC,CAAG,EAAA,IAAI,CAACqD,IAAI,CAACM,CAAC,CAC5CF,EAAAA,GAAG,CAAC,CAAA,CAAE,GAAG,IAAI,CAACJ,IAAI,CAACO,CAAC,GAAG/F,EAAGmC,CAAAA,GAAG,CAAC,CAAA,EAAG,IAAI,CAACqD,IAAI,CAACO,CAAC,CAAA,EAC5C/F,GAAGgG,WAAW,CAAChC,WAAW,IAAI,CAAC,CAAC,GAAG,EAAEiB,GAAG,CAAC,EAAE,GAAGjD,CAAC,CAAA;AAEjD,gBAAA,IAAI,CAACyD,MAAM,GAAGzF,EAAAA,CAAG4B,GAAG,CAClB,IAAI,CAAC6D,MAAM,EACXzF,EAAGiC,CAAAA,GAAG,CAACJ,UAAAA,CAAW,IAAI,EAAE7B,EAAAA,CAAGgG,WAAW,CAAC/B,aAAa,IAAI,CAAC,CAAC,GAAG,EAAEgB,CAAG,CAAA,CAAA,CAAC,EAAE,CAAA,CAAA,CAAA,EAAK,IAAI,CAAC,CAAC,GAAG,EAAEA,GAAG,CAAC,CAAA,CAAA;AAE3F,gBAAA,IAAI,CAACS,MAAM,GAAG1F,EAAG4B,CAAAA,GAAG,CAAC,IAAI,CAAC8D,MAAM,EAAE,IAAI,CAAC,CAAC,GAAG,EAAET,GAAG,CAAC,CAAA;AACnD;AACA,YAAA,IAAI,CAACb,WAAY,CAAA,GAAGpE,EAAG0B,CAAAA,GAAG,CAAC,IAAI,CAAC+D,MAAM,EAAEzF,GAAGc,GAAG,CAAC,IAAI,CAAC4E,MAAM,EAAE,IAAA,CAAA,CAAA;AAC9D,SAAA,CAAA;AACF,KAAA,CAAA;AACF;AAEA;;;;;;;;;;AAUC,IACM,SAASO,yBAA0BnG,CAAAA,KAAoB,EAAEC,KAAa,EAAA;IAC3E,MAAMC,EAAAA,GAAKF,MAAMG,QAAQ;IACzBH,KAAK,CAACN,kBAAmB,CAAA,GAAGQ,EAAGkG,CAAAA,KAAK,GAAGC,UAAU,CAAC,oBAAsB7F,CAAAA,CAAAA,OAAO,CAACP,KAAAA,CAAAA;IAChFD,KAAK,CAACL,oBAAqB,CAAA,GAAGO,EAAGkG,CAAAA,KAAK,GAAGC,UAAU,CAAC,oBAAsB7F,CAAAA,CAAAA,OAAO,CAACP,KAAAA,CAAAA;IAClFD,KAAK,CAACJ,oBAAqB,CAAA,GAAGM,EAAGkG,CAAAA,KAAK,GAAGC,UAAU,CAAC,oBAAsB7F,CAAAA,CAAAA,OAAO,CAACP,KAAAA,CAAAA;IAClFD,KAAK,CAACH,kBAAmB,CAAA,GAAGK,EAAGkG,CAAAA,KAAK,GAAGC,UAAU,CAAC,oBAAsB7F,CAAAA,CAAAA,OAAO,CAACP,KAAAA,CAAAA;IAChFD,KAAK,CAACF,kBAAmB,CAAA,GAAGI,EAAGkG,CAAAA,KAAK,GAAGC,UAAU,CAAC,oBAAsB7F,CAAAA,CAAAA,OAAO,CAACP,KAAAA,CAAAA;AAClF;AAEA;;;;AAIC,IACM,SAASqG,sBAAAA,CACdtG,KAA4B,EAC5BuG,KAAkB,EAClBC,MAAmB,EAAA;IAEnB,MAAMtG,EAAAA,GAAKF,MAAMG,QAAQ;AACzB,IAAA,MAAMQ,QAAW,GAAA,0BAAA;IACjBT,EAAGU,CAAAA,IAAI,CAACD,QAAU,EAAA;AAACT,QAAAA,EAAAA,CAAGuG,KAAK,CAAC,GAAA,CAAA;AAAMvG,QAAAA,EAAAA,CAAGW,IAAI,CAAC,GAAA;KAAK,EAAE,WAAA;AAC/C,QAAA,IAAI,CAACQ,GAAG,CAACnB,EAAAA,CAAGmD,QAAQ,CAAC,IAAI,CAACC,CAAC,CAACL,CAAC,EAAE,CAAI,CAAA,EAAA,WAAA;AACjC,YAAA,IAAI,CAAC1B,OAAO,CAACrB,EAAAA,CAAGW,IAAI,CAAC,CAAA,CAAA,CAAA;AACvB,SAAA,CAAA;AACA,QAAA,IAAI,CAACC,EAAE,CAAC4F,KAAK,GAAGxG,EAAAA,CAAGgG,WAAW,CAAC,IAAI,CAACtG,oBAAqB,CAAA,EAAE,IAAI,CAAC0D,CAAC,CAACN,GAAG,EAAE,GAAGZ,GAAG;AAC7E,QAAA,IAAI,CAACtB,EAAE,CAAC6F,EAAE,GAAGzG,GAAGgG,WAAW,CAAC,IAAI,CAACrG,mBAAmB,EAAE,IAAI,CAACyD,CAAC,CAACN,GAAG,EAAE,CAAA,CAAA;AAClE,QAAA,IAAI,CAAClC,EAAE,CAAC8F,EAAE,GAAG1G,GAAGgG,WAAW,CAAC,IAAI,CAACpG,mBAAmB,EAAE,IAAI,CAACwD,CAAC,CAACN,GAAG,EAAE,CAAA,CAAA;QAClE,IAAI,CAAClC,EAAE,CAACiC,GAAG,GAAG7C,EAAGc,CAAAA,GAAG,CAACd,EAAAA,CAAGW,IAAI,CAAC,IAAIX,EAAGiC,CAAAA,GAAG,CAAC,IAAI,CAAC0E,CAAC,EAAE,IAAI,CAACF,EAAE,CAAC3D,GAAG,CAAA,CAAA;AAC3D,QAAA,IAAI,CAAClC,EAAE,CAACgG,GAAG,GAAG5G,EAAAA,CAAGc,GAAG,CAACd,EAAAA,CAAGW,IAAI,CAAC,IAAIX,EAAGiC,CAAAA,GAAG,CAACjC,EAAG4G,CAAAA,GAAG,CAAC,IAAI,CAACD,CAAC,CAAA,EAAG3G,GAAGW,IAAI,CAAC,IAAI,CAAC8F,EAAE,CAAC1D,CAAC,EAAE,IAAI,CAAC2D,EAAE,CAACb,CAAC,EAAE,IAAI,CAACa,EAAE,CAACZ,CAAC,CAAA,CAAA,CAAA;AAC/F,QAAA,IAAI,CAACzE,OAAO,CAACrB,EAAAA,CAAGiC,GAAG,CAAC,IAAI,CAACuE,KAAK,EAAExG,EAAAA,CAAG4B,GAAG,CAAC5B,GAAG6G,GAAG,CAAC,IAAI,CAAChE,GAAG,EAAE7C,EAAGW,CAAAA,IAAI,CAAC,CAAKX,CAAAA,CAAAA,EAAAA,EAAAA,CAAG6G,GAAG,CAAC,IAAI,CAACD,GAAG,EAAE5G,EAAAA,CAAGW,IAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AAChG,KAAA,CAAA;AACA,IAAA,OAAOb,KAAK,CAACW,QAAS,CAAA,CAAC4F,KAAOC,EAAAA,MAAAA,CAAAA;AAChC;AAEA;;;;;;;;IASO,SAASQ,aACdhH,CAAAA,KAA4B,EAC5BiH,KAAkB,EAClBC,GAAgB,EAChBC,YAAyB,EACzBC,OAAoB,EACpBC,WAAwB,EACxBC,MAAc,EACdC,KAAQ,GAAA,EAAE,EACVC,QAAsB,EAAA;IAEtB,MAAMtH,EAAAA,GAAKF,MAAMG,QAAQ;AACzB,IAAA,MAAMQ,QAAW,GAAA,iBAAA;IACjBT,EAAGU,CAAAA,IAAI,CACLD,QACA,EAAA;AACET,QAAAA,EAAAA,CAAGW,IAAI,CAAC,OAAA,CAAA;AACRX,QAAAA,EAAAA,CAAGW,IAAI,CAAC,KAAA,CAAA;AACRX,QAAAA,EAAAA,CAAG2F,KAAK,CAAC,SAAA,CAAA;AACT3F,QAAAA,EAAAA,CAAG2F,KAAK,CAAC,SAAA,CAAA;AACT3F,QAAAA,EAAAA,CAAG2F,KAAK,CAAC,SAAA,CAAA;AACT3F,QAAAA,EAAAA,CAAG0E,GAAG,CAAC,UAAA;KACR,EACD,WAAA;AACE,QAAA,IAAI,CAAC9D,EAAE,CAAC2G,MAAM,GAAGvH,EAAAA,CAAG2F,KAAK,CAAC,CAAA,CAAA;AAC1B,QAAA,IAAI,CAAC/E,EAAE,CAACwC,CAAC,GAAG,IAAI,CAAC8D,OAAO;AACxB,QAAA,IAAI,CAACtG,EAAE,CAAC4G,KAAK,GAAGxH,EAAAA,CAAG2F,KAAK,CAAC,CAAA,CAAA;QACzB,IAAI,CAAClB,IAAI,CAACzE,EAAAA,CAAG0E,GAAG,CAAC,GAAA,CAAA,EAAM,GAAG2C,KAAO,EAAA,WAAA;YAC/B,IAAI,CAACzG,EAAE,CAAC6G,EAAE,GAAGzH,EAAG4B,CAAAA,GAAG,CAAC,IAAI,CAACmF,KAAK,EAAE/G,EAAAA,CAAGiC,GAAG,CAAC,IAAI,CAAC+E,GAAG,EAAE,IAAI,CAAC5D,CAAC,CAAA,CAAA;AACvD,YAAA,IAAI,CAACxC,EAAE,CAAC8G,CAAC,GAAGC,qBAAAA,CAAsB,IAAI,EAAE,IAAI,CAACF,EAAE,EAAE,IAAI,CAACD,KAAK,EAAEJ,MAAQ,EAAA,IAAI,CAACE,QAAQ,CAAA;YAClF,IAAI,CAAC1G,EAAE,CAACgH,CAAC,GAAG,IAAI,CAACF,CAAC,CAAC7B,CAAC;AACpB,YAAA,IAAI,CAAC2B,KAAK,GAAG,IAAI,CAACI,CAAC;YACnB,IAAI,CAAChH,EAAE,CAACiH,MAAM,GAAGC,gBAAiB,CAAA,IAAI,EAAE,IAAI,CAACL,EAAE,EAAE,IAAI,CAACC,CAAC,EAAE1H,EAAGmC,CAAAA,GAAG,CAAC,IAAI,CAACiB,CAAC,EAAE,IAAI,CAAC8D,OAAO,CAAGE,EAAAA,MAAAA,CAAAA;AACvF,YAAA,IAAI,CAACG,MAAM,GAAGvH,EAAG+H,CAAAA,GAAG,CAClB,IAAI,CAACR,MAAM,EACXvH,GAAGuB,KAAK,CAACvB,GAAG0B,GAAG,CAAC1B,GAAGmC,GAAG,CAAC,IAAI,CAACyF,CAAC,EAAE,IAAI,CAACC,MAAM,GAAG7H,EAAGiC,CAAAA,GAAG,CAAC,IAAI,CAACmB,CAAC,EAAE,IAAI,CAAC4E,OAAO,IAAI,CAAG,EAAA,CAAA,CAAA,CAAA;YAEjF,IAAI,CAAC7G,GAAG,CAACnB,EAAGmD,CAAAA,QAAQ,CAAC,IAAI,CAACoE,MAAM,EAAE,IAAO,CAAA,EAAA,WAAA;AACvC,gBAAA,IAAI,CAACU,MAAM,EAAA;AACb,aAAA,CAAA;YACA,IAAI,CAAC7E,CAAC,GAAGpD,EAAG4B,CAAAA,GAAG,CAAC,IAAI,CAACwB,CAAC,EAAEpD,EAAAA,CAAGuB,KAAK,CAAC,IAAI,CAACqG,CAAC,EAAE,IAAI,CAACV,OAAO,EAAElH,EAAGiC,CAAAA,GAAG,CAAC,IAAI,CAACiF,OAAO,EAAE,EAAA,CAAA,CAAA,CAAA;AAC5E,YAAA,IAAI,CAAC/F,GAAG,CAACnB,EAAAA,CAAGqE,WAAW,CAAC,IAAI,CAACjB,CAAC,EAAE,IAAI,CAAC8E,OAAO,CAAG,EAAA,WAAA;AAC7C,gBAAA,IAAI,CAACD,MAAM,EAAA;AACb,aAAA,CAAA;AACF,SAAA,CAAA;AACA,QAAA,IAAI,CAAC5G,OAAO,CAAC,IAAI,CAACkG,MAAM,CAAA;AAC1B,KAAA,CAAA;AAEF,IAAA,OAAOzH,KAAK,CAACW,QAAS,CAAA,CACpBsG,KACAC,EAAAA,GAAAA,EACAC,YACAC,EAAAA,OAAAA,EACAC,WACAG,EAAAA,QAAAA,IAAYtH,EAAG0E,CAAAA,GAAG,CAAC,CAAA,CAAA,CAAA;AAEvB;AAEA;;;;AAIC,IACM,SAASyD,eAAAA,CAAgBrI,KAA4B,EAAEsI,QAAqB,EAAEhB,MAAc,EAAA;IACjG,MAAMpH,EAAAA,GAAKF,MAAMG,QAAQ;AACzB,IAAA,MAAMQ,QAAW,GAAA,mBAAA;IACjBT,EAAGU,CAAAA,IAAI,CAACD,QAAU,EAAA;AAACT,QAAAA,EAAAA,CAAGW,IAAI,CAAC,GAAA;KAAK,EAAE,WAAA;AAChC,QAAA,IAAI,CAACC,EAAE,CAACyH,GAAG,GAAGrI,EAAAA,CAAG0E,GAAG,CAAC,IAAI,CAAC4D,iBAAkB,CAAA,CAACzC,CAAC,CAAA;QAC9C,IAAI,CAACjF,EAAE,CAAC2H,IAAI,GAAGvI,EAAG0B,CAAAA,GAAG,CAAC,IAAI,CAAC2G,GAAG,EAAE,CAAA,CAAA;QAChC,IAAI,CAACzH,EAAE,CAAC4H,KAAK,GAAGxI,GAAGuF,KAAK,CAAC,IAAI,CAACgD,IAAI,CAAA;QAClC,IAAI,CAAC3H,EAAE,CAAC6H,MAAM,GAAGzI,EAAGuG,CAAAA,KAAK,CAAC,CAAA,EAAG,CAAG,EAAA,CAAA,EAAG,EAAC,CAAA;AACpC,QAAA,IAAK,IAAImC,CAAItB,GAAAA,MAAAA,GAAS,CAAGsB,EAAAA,CAAAA,IAAK,GAAGA,CAAK,EAAA,CAAA;AACpC,YAAA,IAAI,CAAC9H,EAAE,CAAC,CAAC,IAAI,EAAE8H,CAAAA,CAAAA,CAAG,CAAC,GAAG,IAAI,CAACC,iBAAkB,CAAA,CAAClG,EAAE,CAACiG,CAAAA,CAAAA;AACjD,YAAA,IAAI,CAAC9H,EAAE,CAAC,CAAC,EAAE,EAAE8H,CAAG,CAAA,CAAA,CAAC,GAAG1I,EAAAA,CAAGuF,KAAK,CAACvF,GAAG4C,KAAK,CAAC5C,EAAG0B,CAAAA,GAAG,CAAC,IAAI,CAACkH,CAAC,EAAE,IAAI,CAAC,CAAC,IAAI,EAAEF,CAAG,CAAA,CAAA,CAAC,CAAC3F,CAAC,CAAA,CAAA,CAAA;YACvE,IAAI,CAACnC,EAAE,CAAC,CAAC,CAAC,EAAE8H,CAAAA,CAAAA,CAAG,CAAC,GAAG1I,EAAAA,CAAGuF,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,EAAEmD,CAAG,CAAA,CAAA,CAAC,CAAC5F,GAAG,CAAA;AAChD,YAAA,IAAI,CAAClC,EAAE,CAAC,CAAC,EAAE,EAAE8H,CAAG,CAAA,CAAA,CAAC,GAAG1I,EAAAA,CAAGgD,GAAG,CACxBhD,GAAGiD,GAAG,CAACjD,EAAGkD,CAAAA,gBAAgB,CAAC,IAAI,CAAC,CAAC,EAAE,EAAEwF,CAAG,CAAA,CAAA,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC,EAAEA,CAAAA,CAAAA,CAAG,CAAC,CAAA,CAAA,EACxD1I,EAAGiD,CAAAA,GAAG,CAACjD,EAAAA,CAAGmD,QAAQ,CAAC,IAAI,CAAC,CAAC,EAAE,EAAEuF,CAAAA,CAAAA,CAAG,CAAC,EAAE1I,EAAAA,CAAG4B,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE8G,CAAAA,CAAAA,CAAG,CAAC,EAAE1I,EAAGuF,CAAAA,KAAK,CAAC,IAAI,CAAC8C,GAAG,CAAA,CAAA,CAAA,CAAA,CAAA;YAE5E,IAAI,CAAClH,GAAG,CAAC,IAAI,CAAC,CAAC,EAAE,EAAEuH,CAAG,CAAA,CAAA,CAAC,EAAE,WAAA;AACvB,gBAAA,IAAI,CAACvH,GAAG,CAAC0H,qBAAAA,CAAsB,IAAI,EAAE,IAAI,CAAC,CAAC,EAAE,EAAEH,CAAG,CAAA,CAAA,CAAC,EAAEA,CAAI,CAAA,EAAA,WAAA;oBACvD,IAAI,CAAC9H,EAAE,CAACkI,EAAE,GAAG9I,GAAGuF,KAAK,CAACvF,EAAG4C,CAAAA,KAAK,CAAC5C,EAAAA,CAAG0B,GAAG,CAAC1B,EAAAA,CAAGW,IAAI,CAAC,IAAI,CAAC,CAAC,EAAE,EAAE+H,CAAG,CAAA,CAAA,CAAC,CAAG,EAAA,CAAA,CAAA,CAAA,CAAA;AAC/D,oBAAA,IAAI,CAAC9H,EAAE,CAACwC,CAAC,GAAGpD,EAAAA,CAAG+I,GAAG,CAAC/I,EAAG4B,CAAAA,GAAG,CAAC5B,EAAAA,CAAG+I,GAAG,CAAC,IAAI,CAACD,EAAE,EAAE,IAAI,CAACN,KAAK,CAAA,EAAG,IAAI,CAACA,KAAK,CAAA,EAAG,IAAI,CAACA,KAAK,CAAA;AAC9E,oBAAA,IAAI,CAACC,MAAM,GAAGzI,EAAAA,CAAGuG,KAAK,CAAC,IAAI,CAACnD,CAAC,CAACyC,CAAC,EAAE,IAAI,CAACzC,CAAC,CAAC0C,CAAC,EAAE9F,EAAAA,CAAG4B,GAAG,CAAC,IAAI,CAACwB,CAAC,CAAC2C,CAAC,EAAE/F,EAAAA,CAAGiC,GAAG,CAAC,IAAI,CAACsG,IAAI,EAAEG,CAAKA,CAAAA,CAAAA,EAAAA,CAAAA,CAAAA;AACrF,iBAAA,CAAA;AACF,aAAA,CAAA;AACF;AACA,QAAA,IAAI,CAACrH,OAAO,CAAC,IAAI,CAACoH,MAAM,CAAA;AAC1B,KAAA,CAAA;IACA,OAAO3I,KAAK,CAACW,QAAAA,CAAS,CAAC2H,QAAAA,CAAAA;AACzB;AAEA;;;;;IAMO,SAASY,wBACdlJ,CAAAA,KAA4B,EAC5BsI,QAAqB,EACrB9B,MAAmB,EACnBc,MAAc,EAAA;IAEd,MAAMpH,EAAAA,GAAKF,MAAMG,QAAQ;AACzB,IAAA,MAAMQ,QAAW,GAAA,4BAAA;IACjBT,EAAGU,CAAAA,IAAI,CAACD,QAAU,EAAA;AAACT,QAAAA,EAAAA,CAAGW,IAAI,CAAC,GAAA,CAAA;AAAMX,QAAAA,EAAAA,CAAGW,IAAI,CAAC,GAAA;KAAK,EAAE,WAAA;AAC9C,QAAA,IAAI,CAACC,EAAE,CAACyH,GAAG,GAAGrI,EAAAA,CAAG0E,GAAG,CAAC,IAAI,CAAC4D,iBAAkB,CAAA,CAACzC,CAAC,CAAA;QAC9C,IAAI,CAACjF,EAAE,CAACqI,IAAI,GAAG,IAAI,CAACX,iBAAkB,CAAA,CAACzC,CAAC;QACxC,IAAI,CAACjF,EAAE,CAAC2H,IAAI,GAAGvI,EAAG0B,CAAAA,GAAG,CAAC,IAAI,CAAC2G,GAAG,EAAE,CAAA,CAAA;QAChC,IAAI,CAACzH,EAAE,CAAC4H,KAAK,GAAGxI,GAAGuF,KAAK,CAAC,IAAI,CAACgD,IAAI,CAAA;AAClC,QAAA,IAAI,CAAC3H,EAAE,CAACsI,GAAG,GAAGlJ,EAAAA,CAAGW,IAAI,CAAC,CAAA,CAAA;AACtB,QAAA,IAAI,CAACC,EAAE,CAACuI,SAAS,GAAGnJ,EAAAA,CAAG2F,KAAK,CAAC,CAAA,CAAA;AAC7B,QAAA,IAAK,IAAI+C,CAAAA,GAAI,CAAGA,EAAAA,CAAAA,GAAItB,QAAQsB,CAAK,EAAA,CAAA;;YAE/B,IAAI,CAACvH,GAAG,CAACnB,EAAGqE,CAAAA,WAAW,CAAC,IAAI,CAAC8E,SAAS,EAAE,IAAO,CAAA,EAAA,WAAA;gBAC7C,IAAI,CAACvI,EAAE,CAACwI,IAAI,GAAG,IAAI,CAACT,iBAAAA,CAAkB,CAAClG,EAAE,CAACiG,CAAAA,CAAAA;gBAC1C,IAAI,CAAC9H,EAAE,CAACyI,EAAE,GAAGrJ,EAAGuF,CAAAA,KAAK,CAACvF,EAAAA,CAAG4C,KAAK,CAAC5C,GAAG0B,GAAG,CAAC,IAAI,CAACkH,CAAC,EAAE,IAAI,CAACQ,IAAI,CAACrG,CAAC,CAAA,CAAA,CAAA;AACzD,gBAAA,IAAI,CAACnC,EAAE,CAAC0I,CAAC,GAAGtJ,EAAAA,CAAGuF,KAAK,CAAC,IAAI,CAAC6D,IAAI,CAACtG,GAAG,CAAA;gBAClC,IAAI,CAAClC,EAAE,CAAC2I,MAAM,GAAGvJ,EAAGgD,CAAAA,GAAG,CACrBhD,EAAGiD,CAAAA,GAAG,CAACjD,EAAGkD,CAAAA,gBAAgB,CAAC,IAAI,CAACmG,EAAE,EAAE,IAAI,CAACC,CAAC,CAAA,CAAA,EAC1CtJ,GAAGiD,GAAG,CAACjD,GAAGmD,QAAQ,CAAC,IAAI,CAACkG,EAAE,EAAErJ,EAAG4B,CAAAA,GAAG,CAAC,IAAI,CAAC0H,CAAC,EAAEtJ,EAAAA,CAAGuF,KAAK,CAAC,IAAI,CAAC8C,GAAG,CAAA,CAAA,CAAA,CAAA,CAAA;AAE9D,gBAAA,IAAI,CAAClH,GAAG,CAAC,IAAI,CAACoI,MAAM,EAAE,WAAA;oBACpB,IAAI,CAACpI,GAAG,CAAC0H,qBAAsB,CAAA,IAAI,EAAE,IAAI,CAACQ,EAAE,EAAEX,CAAI,CAAA,EAAA,WAAA;wBAChD,IAAI,CAAC9H,EAAE,CAACkI,EAAE,GAAG9I,EAAGuF,CAAAA,KAAK,CAACvF,EAAG4C,CAAAA,KAAK,CAAC5C,EAAG0B,CAAAA,GAAG,CAAC1B,EAAGW,CAAAA,IAAI,CAAC,IAAI,CAAC0I,EAAE,CAAG,EAAA,CAAA,CAAA,CAAA,CAAA;AACxD,wBAAA,IAAI,CAACzI,EAAE,CAACwC,CAAC,GAAGpD,EAAAA,CAAG+I,GAAG,CAAC/I,EAAG4B,CAAAA,GAAG,CAAC5B,EAAAA,CAAG+I,GAAG,CAAC,IAAI,CAACD,EAAE,EAAE,IAAI,CAACN,KAAK,CAAA,EAAG,IAAI,CAACA,KAAK,CAAA,EAAG,IAAI,CAACA,KAAK,CAAA;AAC9E,wBAAA,IAAI,CAAC5H,EAAE,CAAC4I,GAAG,GAAGpD,sBAAAA,CACZ,IAAI,EACJpG,EAAAA,CAAGuG,KAAK,CAAC,IAAI,CAACnD,CAAC,CAACyC,CAAC,EAAE,IAAI,CAACzC,CAAC,CAAC0C,CAAC,EAAE9F,EAAAA,CAAG4B,GAAG,CAAC,IAAI,CAACwB,CAAC,CAAC2C,CAAC,EAAE/F,EAAAA,CAAGiC,GAAG,CAAC,IAAI,CAACsG,IAAI,EAAEG,KAAKA,CACrE,CAAA,EAAA,IAAI,CAAC/B,CAAC,CAAA;wBAER,IAAI+B,CAAAA,KAAMtB,SAAS,CAAG,EAAA;AACpB,4BAAA,IAAI,CAACxG,EAAE,CAACmC,CAAC,GAAG/C,EAAAA,CAAG2F,KAAK,CAAC,CAAA,CAAA;yBAChB,MAAA;;AAEL,4BAAA,IAAI,CAAC/E,EAAE,CAAC6I,CAAC,GAAGzJ,EAAGmC,CAAAA,GAAG,CAACnC,EAAAA,CAAG0B,GAAG,CAAC,IAAI,CAACkH,CAAC,EAAE,IAAI,CAACQ,IAAI,CAACrG,CAAC,CAAG/C,EAAAA,EAAAA,CAAG4B,GAAG,CAAC,IAAI,CAACwH,IAAI,CAACtG,GAAG,EAAE9C,EAAAA,CAAGW,IAAI,CAAC,GAAA,CAAA,CAAA,CAAA;4BAC9E,IAAI,CAACC,EAAE,CAAC8I,EAAE,GAAG1J,EAAG+H,CAAAA,GAAG,CAAC/H,EAAAA,CAAG+H,GAAG,CAAC,IAAI,CAAC0B,CAAC,CAAC5D,CAAC,EAAE,IAAI,CAAC4D,CAAC,CAAC3D,CAAC,CAAA,EAAG,IAAI,CAAC2D,CAAC,CAAC1D,CAAC,CAAA;AACxD,4BAAA,IAAI,CAACnF,EAAE,CAAC+I,EAAE,GAAG3J,GAAGmC,GAAG,CAACnC,EAAGmC,CAAAA,GAAG,CAAC,IAAI,CAAC8G,IAAI,EAAE,CAAA,CAAA,EAAIjJ,GAAGc,GAAG,CAACd,EAAGc,CAAAA,GAAG,CAAC,IAAI,CAAC2I,CAAC,CAAC5D,CAAC,EAAE,IAAI,CAAC4D,CAAC,CAAC3D,CAAC,CAAA,EAAG,IAAI,CAAC2D,CAAC,CAAC1D,CAAC,CAAA,CAAA;4BACrF,IAAI,CAACnF,EAAE,CAACmC,CAAC,GAAG/C,EAAG4J,CAAAA,UAAU,CAAC,CAAG,EAAA,CAAA,GAAIC,wBAAwB7J,EAAG+H,CAAAA,GAAG,CAAC,IAAI,CAAC2B,EAAE,EAAE,IAAI,CAACC,EAAE,CAAA,CAAA;AAClF;AACA,wBAAA,IAAI,CAAC/I,EAAE,CAACkJ,KAAK,GAAG9J,EAAGiC,CAAAA,GAAG,CAAC,IAAI,CAACkH,SAAS,EAAE,IAAI,CAACpG,CAAC,CAAA;AAC7C,wBAAA,IAAI,CAACmG,GAAG,GAAGlJ,GAAG4B,GAAG,CAAC,IAAI,CAACsH,GAAG,EAAElJ,EAAGiC,CAAAA,GAAG,CAAC,IAAI,CAACuH,GAAG,EAAE,IAAI,CAACM,KAAK,CAAA,CAAA;AACvD,wBAAA,IAAI,CAACX,SAAS,GAAGnJ,EAAAA,CAAGmC,GAAG,CAAC,IAAI,CAACgH,SAAS,EAAE,IAAI,CAACW,KAAK,CAAA;AACpD,qBAAA,CAAA;AACF,iBAAA,CAAA;AACF,aAAA,CAAA;AACF;AACA,QAAA,IAAI,CAACzI,OAAO,CAAC,IAAI,CAAC6H,GAAG,CAAA;AACvB,KAAA,CAAA;AACA,IAAA,OAAOpJ,KAAK,CAACW,QAAS,CAAA,CAAC2H,QAAU9B,EAAAA,MAAAA,CAAAA;AACnC;AAEA;;;;AAIC,IACM,SAASyD,oBAAqBjK,CAAAA,KAA4B,EAAEuG,KAAkB,EAAA;IACnF,MAAMrG,EAAAA,GAAKF,MAAMG,QAAQ;AACzB,IAAA,MAAMQ,QAAW,GAAA,wBAAA;IACjBT,EAAGU,CAAAA,IAAI,CAACD,QAAU,EAAA;AAACT,QAAAA,EAAAA,CAAGuG,KAAK,CAAC,GAAA;KAAK,EAAE,WAAA;AACjC,QAAA,IAAI,CAACpF,GAAG,CAACnB,EAAAA,CAAGmD,QAAQ,CAAC,IAAI,CAACC,CAAC,CAACL,CAAC,EAAE,CAAI,CAAA,EAAA,WAAA;AACjC,YAAA,IAAI,CAAC1B,OAAO,CAACrB,EAAAA,CAAGK,IAAI,CAAC,CAAA,CAAA,CAAA;AACvB,SAAA,CAAA;AACA,QAAA,IAAI,CAACgB,OAAO,CAACrB,EAAAA,CAAGgG,WAAW,CAAC,IAAI,CAACxG,kBAAAA,CAAmB,EAAE,IAAI,CAAC4D,CAAC,CAACN,GAAG,EAAE,CAAA,CAAA,CAAA;AACpE,KAAA,CAAA;IACA,OAAOhD,KAAK,CAACW,QAAAA,CAAS,CAAC4F,KAAAA,CAAAA;AACzB;AAEA;;;AAGC,IACM,SAAS2D,sBAAuBlK,CAAAA,KAA4B,EAAEuG,KAAkB,EAAA;IACrF,MAAMrG,EAAAA,GAAKF,MAAMG,QAAQ;AACzB,IAAA,MAAMQ,QAAW,GAAA,0BAAA;IACjBT,EAAGU,CAAAA,IAAI,CAACD,QAAU,EAAA;AAACT,QAAAA,EAAAA,CAAGuG,KAAK,CAAC,GAAA;KAAK,EAAE,WAAA;AACjC,QAAA,IAAI,CAACpF,GAAG,CAACnB,EAAAA,CAAGmD,QAAQ,CAAC,IAAI,CAACC,CAAC,CAACL,CAAC,EAAE,CAAI,CAAA,EAAA,WAAA;AACjC,YAAA,IAAI,CAAC1B,OAAO,CAACrB,EAAAA,CAAGW,IAAI,CAAC,CAAA,CAAA,CAAA;AACvB,SAAA,CAAA;AACA,QAAA,IAAI,CAACU,OAAO,CAACrB,EAAGgG,CAAAA,WAAW,CAAC,IAAI,CAACvG,oBAAqB,CAAA,EAAE,IAAI,CAAC2D,CAAC,CAACN,GAAG,EAAE,GAAGZ,GAAG,CAAA;AAC5E,KAAA,CAAA;IACA,OAAOpC,KAAK,CAACW,QAAAA,CAAS,CAAC4F,KAAAA,CAAAA;AACzB;;;;"}