@zephyr3d/scene 0.9.26 → 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 (506) 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 +146 -30
  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 +300 -56
  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 +177 -3
  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 +178 -200
  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 +30475 -19865
  109. package/dist/index.js +67 -12
  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/hairstrand.js +235 -235
  118. package/dist/material/hairstrand.js.map +1 -1
  119. package/dist/material/lambert.js +4 -1
  120. package/dist/material/lambert.js.map +1 -1
  121. package/dist/material/material.js +362 -300
  122. package/dist/material/material.js.map +1 -1
  123. package/dist/material/meshmaterial.js +118 -45
  124. package/dist/material/meshmaterial.js.map +1 -1
  125. package/dist/material/mixins/lightmodel/blinnphong.js +1 -1
  126. package/dist/material/mixins/lightmodel/blinnphong.js.map +1 -1
  127. package/dist/material/mixins/lightmodel/lambert.js +1 -1
  128. package/dist/material/mixins/lightmodel/lambert.js.map +1 -1
  129. package/dist/material/mixins/lightmodel/pbrblueprintmixin.js +34 -61
  130. package/dist/material/mixins/lightmodel/pbrblueprintmixin.js.map +1 -1
  131. package/dist/material/mixins/lightmodel/pbrmetallicroughness.js +16 -2
  132. package/dist/material/mixins/lightmodel/pbrmetallicroughness.js.map +1 -1
  133. package/dist/material/mixins/lightmodel/pbrspecularglossness.js +2 -1
  134. package/dist/material/mixins/lightmodel/pbrspecularglossness.js.map +1 -1
  135. package/dist/material/mixins/lit.js +223 -83
  136. package/dist/material/mixins/lit.js.map +1 -1
  137. package/dist/material/mixins/pbr/common.js +31 -206
  138. package/dist/material/mixins/pbr/common.js.map +1 -1
  139. package/dist/material/mtoon.js +1 -1
  140. package/dist/material/mtoon.js.map +1 -1
  141. package/dist/material/pbrmr.js +3 -0
  142. package/dist/material/pbrmr.js.map +1 -1
  143. package/dist/material/pbrsg.js +3 -0
  144. package/dist/material/pbrsg.js.map +1 -1
  145. package/dist/material/sdf_debug.js +78 -0
  146. package/dist/material/sdf_debug.js.map +1 -0
  147. package/dist/material/shader/helper.js +733 -190
  148. package/dist/material/shader/helper.js.map +1 -1
  149. package/dist/material/shader/terrain_blend.js +204 -43
  150. package/dist/material/shader/terrain_blend.js.map +1 -1
  151. package/dist/material/skin.js +331 -297
  152. package/dist/material/skin.js.map +1 -1
  153. package/dist/material/skinprofile.js +1058 -0
  154. package/dist/material/skinprofile.js.map +1 -0
  155. package/dist/material/sss.js +353 -0
  156. package/dist/material/sss.js.map +1 -0
  157. package/dist/material/sss_kernel.js +265 -0
  158. package/dist/material/sss_kernel.js.map +1 -0
  159. package/dist/material/sssprofile.js +879 -0
  160. package/dist/material/sssprofile.js.map +1 -0
  161. package/dist/material/subsurfaceprofile.js +4 -8
  162. package/dist/material/subsurfaceprofile.js.map +1 -1
  163. package/dist/material/terrain-cm.js +464 -188
  164. package/dist/material/terrain-cm.js.map +1 -1
  165. package/dist/material/unlit.js +3 -0
  166. package/dist/material/unlit.js.map +1 -1
  167. package/dist/material/water.js +2009 -201
  168. package/dist/material/water.js.map +1 -1
  169. package/dist/node_modules/meshoptimizer/LICENSE +21 -0
  170. package/dist/node_modules/meshoptimizer/meshopt_decoder.js +197 -0
  171. package/dist/node_modules/meshoptimizer/meshopt_decoder.js.map +1 -0
  172. package/dist/node_modules/meshoptimizer/meshopt_simplifier.js +677 -0
  173. package/dist/node_modules/meshoptimizer/meshopt_simplifier.js.map +1 -0
  174. package/dist/physics/character.js +226 -0
  175. package/dist/physics/character.js.map +1 -0
  176. package/dist/physics/collider.js +209 -0
  177. package/dist/physics/collider.js.map +1 -0
  178. package/dist/physics/events.js +79 -0
  179. package/dist/physics/events.js.map +1 -0
  180. package/dist/physics/joint.js +272 -0
  181. package/dist/physics/joint.js.map +1 -0
  182. package/dist/physics/node_physics.js +234 -0
  183. package/dist/physics/node_physics.js.map +1 -0
  184. package/dist/physics/part.js +91 -0
  185. package/dist/physics/part.js.map +1 -0
  186. package/dist/physics/rigid_body.js +379 -0
  187. package/dist/physics/rigid_body.js.map +1 -0
  188. package/dist/physics/vehicle.js +335 -0
  189. package/dist/physics/vehicle.js.map +1 -0
  190. package/dist/physics/world.js +25 -0
  191. package/dist/physics/world.js.map +1 -0
  192. package/dist/posteffect/bloom.js +49 -14
  193. package/dist/posteffect/bloom.js.map +1 -1
  194. package/dist/posteffect/motionblur.js +668 -63
  195. package/dist/posteffect/motionblur.js.map +1 -1
  196. package/dist/posteffect/posteffect.js +12 -1
  197. package/dist/posteffect/posteffect.js.map +1 -1
  198. package/dist/posteffect/postsss.js +572 -0
  199. package/dist/posteffect/postsss.js.map +1 -0
  200. package/dist/posteffect/sao.js +48 -50
  201. package/dist/posteffect/sao.js.map +1 -1
  202. package/dist/posteffect/skinsss.js +605 -355
  203. package/dist/posteffect/skinsss.js.map +1 -1
  204. package/dist/posteffect/ssgi.js +91 -162
  205. package/dist/posteffect/ssgi.js.map +1 -1
  206. package/dist/posteffect/ssr.js +3 -11
  207. package/dist/posteffect/ssr.js.map +1 -1
  208. package/dist/posteffect/sss.js +34 -15
  209. package/dist/posteffect/sss.js.map +1 -1
  210. package/dist/posteffect/taa.js +1 -0
  211. package/dist/posteffect/taa.js.map +1 -1
  212. package/dist/render/abuffer_oit.js +40 -39
  213. package/dist/render/abuffer_oit.js.map +1 -1
  214. package/dist/render/clipmap.js +328 -62
  215. package/dist/render/clipmap.js.map +1 -1
  216. package/dist/render/cluster_light.js +958 -224
  217. package/dist/render/cluster_light.js.map +1 -1
  218. package/dist/render/cull_visitor.js +26 -5
  219. package/dist/render/cull_visitor.js.map +1 -1
  220. package/dist/render/debug_views.js +37 -0
  221. package/dist/render/debug_views.js.map +1 -0
  222. package/dist/render/depthpass.js +5 -1
  223. package/dist/render/depthpass.js.map +1 -1
  224. package/dist/render/drawable_mixin.js +53 -6
  225. package/dist/render/drawable_mixin.js.map +1 -1
  226. package/dist/render/dualdepthpeeling_oit.js +53 -53
  227. package/dist/render/dualdepthpeeling_oit.js.map +1 -1
  228. package/dist/render/envlight.js +196 -113
  229. package/dist/render/envlight.js.map +1 -1
  230. package/dist/render/fbm_wavegenerator.js +8 -13
  231. package/dist/render/fbm_wavegenerator.js.map +1 -1
  232. package/dist/render/fft_wavegenerator.js +268 -136
  233. package/dist/render/fft_wavegenerator.js.map +1 -1
  234. package/dist/render/gerstner_wavegenerator.js +113 -28
  235. package/dist/render/gerstner_wavegenerator.js.map +1 -1
  236. package/dist/render/gi/probe_volume.js +1334 -0
  237. package/dist/render/gi/probe_volume.js.map +1 -0
  238. package/dist/render/gi/scene_gi.js +282 -0
  239. package/dist/render/gi/scene_gi.js.map +1 -0
  240. package/dist/render/gi/voxel_atlas.js +198 -0
  241. package/dist/render/gi/voxel_atlas.js.map +1 -0
  242. package/dist/render/gi/voxel_lighting.js +652 -0
  243. package/dist/render/gi/voxel_lighting.js.map +1 -0
  244. package/dist/render/gi/voxel_scene.js +642 -0
  245. package/dist/render/gi/voxel_scene.js.map +1 -0
  246. package/dist/render/gi/voxelize_pass.js +223 -0
  247. package/dist/render/gi/voxelize_pass.js.map +1 -0
  248. package/dist/render/globalbindgroup_allocator.js +3 -2
  249. package/dist/render/globalbindgroup_allocator.js.map +1 -1
  250. package/dist/render/gpu_picking.js +9 -36
  251. package/dist/render/gpu_picking.js.map +1 -1
  252. package/dist/render/hzb.js +80 -22
  253. package/dist/render/hzb.js.map +1 -1
  254. package/dist/render/instance_culling.js +499 -0
  255. package/dist/render/instance_culling.js.map +1 -0
  256. package/dist/render/lightpass.js +23 -9
  257. package/dist/render/lightpass.js.map +1 -1
  258. package/dist/render/lod.js +46 -0
  259. package/dist/render/lod.js.map +1 -0
  260. package/dist/render/oit.js +11 -11
  261. package/dist/render/oit.js.map +1 -1
  262. package/dist/render/primitive.js +301 -9
  263. package/dist/render/primitive.js.map +1 -1
  264. package/dist/render/primitive_readback.js +209 -0
  265. package/dist/render/primitive_readback.js.map +1 -0
  266. package/dist/render/render_queue.js +198 -11
  267. package/dist/render/render_queue.js.map +1 -1
  268. package/dist/render/renderer.js +14 -7
  269. package/dist/render/renderer.js.map +1 -1
  270. package/dist/render/rendergraph/blackboard.js +15 -1
  271. package/dist/render/rendergraph/blackboard.js.map +1 -1
  272. package/dist/render/rendergraph/executor.js +136 -0
  273. package/dist/render/rendergraph/executor.js.map +1 -1
  274. package/dist/render/rendergraph/forward_plus_builder.js +585 -59
  275. package/dist/render/rendergraph/forward_plus_builder.js.map +1 -1
  276. package/dist/render/rendergraph/frame_resource_requirements.js +1 -0
  277. package/dist/render/rendergraph/frame_resource_requirements.js.map +1 -1
  278. package/dist/render/rendergraph/history_resources.js +8 -1
  279. package/dist/render/rendergraph/history_resources.js.map +1 -1
  280. package/dist/render/rendergraph/scene_render_context.js +31 -2
  281. package/dist/render/rendergraph/scene_render_context.js.map +1 -1
  282. package/dist/render/rendergraph/types.js.map +1 -1
  283. package/dist/render/renderpass.js +28 -5
  284. package/dist/render/renderpass.js.map +1 -1
  285. package/dist/render/sdf/box_allocator.js +98 -0
  286. package/dist/render/sdf/box_allocator.js.map +1 -0
  287. package/dist/render/sdf/global_sdf.js +865 -0
  288. package/dist/render/sdf/global_sdf.js.map +1 -0
  289. package/dist/render/sdf/scene_sdf.js +562 -0
  290. package/dist/render/sdf/scene_sdf.js.map +1 -0
  291. package/dist/render/sdf/sdf_atlas.js +227 -0
  292. package/dist/render/sdf/sdf_atlas.js.map +1 -0
  293. package/dist/render/sdf/sdf_programs.js +42 -0
  294. package/dist/render/sdf/sdf_programs.js.map +1 -0
  295. package/dist/render/sdf/sdf_view.js +199 -0
  296. package/dist/render/sdf/sdf_view.js.map +1 -0
  297. package/dist/render/sdf/waterline.js +610 -0
  298. package/dist/render/sdf/waterline.js.map +1 -0
  299. package/dist/render/shadow_mask_pass.js +142 -25
  300. package/dist/render/shadow_mask_pass.js.map +1 -1
  301. package/dist/render/shore_wave_generator.js +1193 -0
  302. package/dist/render/shore_wave_generator.js.map +1 -0
  303. package/dist/render/sky.js +516 -86
  304. package/dist/render/sky.js.map +1 -1
  305. package/dist/render/transmission_thickness_pass.js +477 -0
  306. package/dist/render/transmission_thickness_pass.js.map +1 -0
  307. package/dist/render/underwater.js +524 -0
  308. package/dist/render/underwater.js.map +1 -0
  309. package/dist/render/virtualtexture/virtual_texture.js +1214 -0
  310. package/dist/render/virtualtexture/virtual_texture.js.map +1 -0
  311. package/dist/render/volumetric_cloud/cloud_common.js +472 -0
  312. package/dist/render/volumetric_cloud/cloud_common.js.map +1 -0
  313. package/dist/render/volumetric_cloud/cloud_noise.js +189 -0
  314. package/dist/render/volumetric_cloud/cloud_noise.js.map +1 -0
  315. package/dist/render/volumetric_cloud/debug_view.js +131 -0
  316. package/dist/render/volumetric_cloud/debug_view.js.map +1 -0
  317. package/dist/render/volumetric_cloud/resources.js +380 -0
  318. package/dist/render/volumetric_cloud/resources.js.map +1 -0
  319. package/dist/render/volumetric_cloud/sky_cache.js +380 -0
  320. package/dist/render/volumetric_cloud/sky_cache.js.map +1 -0
  321. package/dist/render/volumetric_cloud/volumetric_cloud.js +318 -0
  322. package/dist/render/volumetric_cloud/volumetric_cloud.js.map +1 -0
  323. package/dist/render/water_caustics.js +1195 -0
  324. package/dist/render/water_caustics.js.map +1 -0
  325. package/dist/render/water_foam.js +627 -0
  326. package/dist/render/water_foam.js.map +1 -0
  327. package/dist/render/water_interaction.js +1795 -0
  328. package/dist/render/water_interaction.js.map +1 -0
  329. package/dist/render/weightedblended_oit.js +36 -36
  330. package/dist/render/weightedblended_oit.js.map +1 -1
  331. package/dist/scene/basesprite.js +9 -4
  332. package/dist/scene/basesprite.js.map +1 -1
  333. package/dist/scene/batchgroup.js +108 -12
  334. package/dist/scene/batchgroup.js.map +1 -1
  335. package/dist/scene/environment.js +28 -7
  336. package/dist/scene/environment.js.map +1 -1
  337. package/dist/scene/foliage.js +1020 -0
  338. package/dist/scene/foliage.js.map +1 -0
  339. package/dist/scene/foliage_buckets.js +147 -0
  340. package/dist/scene/foliage_buckets.js.map +1 -0
  341. package/dist/scene/foliage_mask.js +358 -0
  342. package/dist/scene/foliage_mask.js.map +1 -0
  343. package/dist/scene/hair.js +15 -4
  344. package/dist/scene/hair.js.map +1 -1
  345. package/dist/scene/light.js +179 -13
  346. package/dist/scene/light.js.map +1 -1
  347. package/dist/scene/mesh.js +327 -45
  348. package/dist/scene/mesh.js.map +1 -1
  349. package/dist/scene/meshdrawable.js +6 -0
  350. package/dist/scene/meshdrawable.js.map +1 -1
  351. package/dist/scene/msdftext.js +9 -3
  352. package/dist/scene/msdftext.js.map +1 -1
  353. package/dist/scene/msdftextsprite.js +9 -3
  354. package/dist/scene/msdftextsprite.js.map +1 -1
  355. package/dist/scene/particlesys.js +8 -2
  356. package/dist/scene/particlesys.js.map +1 -1
  357. package/dist/scene/physics_settings.js +157 -0
  358. package/dist/scene/physics_settings.js.map +1 -0
  359. package/dist/scene/scene.js +190 -44
  360. package/dist/scene/scene.js.map +1 -1
  361. package/dist/scene/scene_node.js +147 -6
  362. package/dist/scene/scene_node.js.map +1 -1
  363. package/dist/scene/terrain-cm/bladegrassmaterial.js +735 -0
  364. package/dist/scene/terrain-cm/bladegrassmaterial.js.map +1 -0
  365. package/dist/scene/terrain-cm/grass.js +881 -42
  366. package/dist/scene/terrain-cm/grass.js.map +1 -1
  367. package/dist/scene/terrain-cm/grass_gpu.js +929 -0
  368. package/dist/scene/terrain-cm/grass_gpu.js.map +1 -0
  369. package/dist/scene/terrain-cm/grassmaterial.js +180 -9
  370. package/dist/scene/terrain-cm/grassmaterial.js.map +1 -1
  371. package/dist/scene/terrain-cm/terrain-cm.js +465 -36
  372. package/dist/scene/terrain-cm/terrain-cm.js.map +1 -1
  373. package/dist/scene/terrain-cm/terrain_gi_albedo.js +257 -0
  374. package/dist/scene/terrain-cm/terrain_gi_albedo.js.map +1 -0
  375. package/dist/scene/terrain-cm/terrain_rvt.js +395 -0
  376. package/dist/scene/terrain-cm/terrain_rvt.js.map +1 -0
  377. package/dist/scene/update_queue.js +54 -0
  378. package/dist/scene/update_queue.js.map +1 -0
  379. package/dist/scene/water.js +997 -96
  380. package/dist/scene/water.js.map +1 -1
  381. package/dist/scene/water_surface_sampler.js +324 -0
  382. package/dist/scene/water_surface_sampler.js.map +1 -0
  383. package/dist/scene/wind.js +317 -0
  384. package/dist/scene/wind.js.map +1 -0
  385. package/dist/shaders/atmosphere.js +388 -166
  386. package/dist/shaders/atmosphere.js.map +1 -1
  387. package/dist/shaders/fog.js +100 -32
  388. package/dist/shaders/fog.js.map +1 -1
  389. package/dist/shaders/gi.js +365 -0
  390. package/dist/shaders/gi.js.map +1 -0
  391. package/dist/shaders/ltc_rect.js +202 -0
  392. package/dist/shaders/ltc_rect.js.map +1 -0
  393. package/dist/shaders/misc.js +1 -10
  394. package/dist/shaders/misc.js.map +1 -1
  395. package/dist/shaders/noise.js +5 -1
  396. package/dist/shaders/noise.js.map +1 -1
  397. package/dist/shaders/probes.js +309 -0
  398. package/dist/shaders/probes.js.map +1 -0
  399. package/dist/shaders/sdf.js +537 -0
  400. package/dist/shaders/sdf.js.map +1 -0
  401. package/dist/shaders/shadow.js +104 -70
  402. package/dist/shaders/shadow.js.map +1 -1
  403. package/dist/shaders/skin_brdf.js +243 -0
  404. package/dist/shaders/skin_brdf.js.map +1 -0
  405. package/dist/shaders/ssr.js +6 -159
  406. package/dist/shaders/ssr.js.map +1 -1
  407. package/dist/shaders/temporal.js +38 -27
  408. package/dist/shaders/temporal.js.map +1 -1
  409. package/dist/shaders/water.js +40 -87
  410. package/dist/shaders/water.js.map +1 -1
  411. package/dist/shaders/water_medium.js +42 -0
  412. package/dist/shaders/water_medium.js.map +1 -0
  413. package/dist/shadow/dom.js +110 -19
  414. package/dist/shadow/dom.js.map +1 -1
  415. package/dist/shadow/esm.js +3 -3
  416. package/dist/shadow/esm.js.map +1 -1
  417. package/dist/shadow/pcf_opt.js +15 -48
  418. package/dist/shadow/pcf_opt.js.map +1 -1
  419. package/dist/shadow/pcf_pd.js +15 -53
  420. package/dist/shadow/pcf_pd.js.map +1 -1
  421. package/dist/shadow/pcss.js +34 -9
  422. package/dist/shadow/pcss.js.map +1 -1
  423. package/dist/shadow/shadow_impl.js +3 -8
  424. package/dist/shadow/shadow_impl.js.map +1 -1
  425. package/dist/shadow/shadow_region.js +87 -49
  426. package/dist/shadow/shadow_region.js.map +1 -1
  427. package/dist/shadow/shadowmapper.js +93 -53
  428. package/dist/shadow/shadowmapper.js.map +1 -1
  429. package/dist/shadow/ssm.js +18 -72
  430. package/dist/shadow/ssm.js.map +1 -1
  431. package/dist/shadow/vsm.js +3 -3
  432. package/dist/shadow/vsm.js.map +1 -1
  433. package/dist/shapes/shape.js +44 -1
  434. package/dist/shapes/shape.js.map +1 -1
  435. package/dist/utility/buoyancy.js +287 -0
  436. package/dist/utility/buoyancy.js.map +1 -0
  437. package/dist/utility/physical.js +10 -1
  438. package/dist/utility/physical.js.map +1 -1
  439. package/dist/utility/pmrem.js +17 -43
  440. package/dist/utility/pmrem.js.map +1 -1
  441. package/dist/utility/sdf/bake.js +435 -0
  442. package/dist/utility/sdf/bake.js.map +1 -0
  443. package/dist/utility/sdf/bvh.js +576 -0
  444. package/dist/utility/sdf/bvh.js.map +1 -0
  445. package/dist/utility/serialization/manager.js +36 -6
  446. package/dist/utility/serialization/manager.js.map +1 -1
  447. package/dist/utility/serialization/scene/animation.js +77 -7
  448. package/dist/utility/serialization/scene/animation.js.map +1 -1
  449. package/dist/utility/serialization/scene/batch.js +11 -4
  450. package/dist/utility/serialization/scene/batch.js.map +1 -1
  451. package/dist/utility/serialization/scene/camera.js +140 -279
  452. package/dist/utility/serialization/scene/camera.js.map +1 -1
  453. package/dist/utility/serialization/scene/cloth.js +25 -0
  454. package/dist/utility/serialization/scene/cloth.js.map +1 -0
  455. package/dist/utility/serialization/scene/common.js +14 -6
  456. package/dist/utility/serialization/scene/common.js.map +1 -1
  457. package/dist/utility/serialization/scene/foliage.js +821 -0
  458. package/dist/utility/serialization/scene/foliage.js.map +1 -0
  459. package/dist/utility/serialization/scene/hair.js +11 -4
  460. package/dist/utility/serialization/scene/hair.js.map +1 -1
  461. package/dist/utility/serialization/scene/light.js +115 -7
  462. package/dist/utility/serialization/scene/light.js.map +1 -1
  463. package/dist/utility/serialization/scene/material.js +388 -220
  464. package/dist/utility/serialization/scene/material.js.map +1 -1
  465. package/dist/utility/serialization/scene/mesh.js +69 -4
  466. package/dist/utility/serialization/scene/mesh.js.map +1 -1
  467. package/dist/utility/serialization/scene/node.js +140 -5
  468. package/dist/utility/serialization/scene/node.js.map +1 -1
  469. package/dist/utility/serialization/scene/node_physics.js +1318 -0
  470. package/dist/utility/serialization/scene/node_physics.js.map +1 -0
  471. package/dist/utility/serialization/scene/particle.js +11 -4
  472. package/dist/utility/serialization/scene/particle.js.map +1 -1
  473. package/dist/utility/serialization/scene/physics.js +120 -0
  474. package/dist/utility/serialization/scene/physics.js.map +1 -0
  475. package/dist/utility/serialization/scene/primitive.js +124 -10
  476. package/dist/utility/serialization/scene/primitive.js.map +1 -1
  477. package/dist/utility/serialization/scene/scene.js +1687 -51
  478. package/dist/utility/serialization/scene/scene.js.map +1 -1
  479. package/dist/utility/serialization/scene/sprite.js +11 -4
  480. package/dist/utility/serialization/scene/sprite.js.map +1 -1
  481. package/dist/utility/serialization/scene/terrain.js +163 -33
  482. package/dist/utility/serialization/scene/terrain.js.map +1 -1
  483. package/dist/utility/serialization/scene/text.js +11 -4
  484. package/dist/utility/serialization/scene/text.js.map +1 -1
  485. package/dist/utility/serialization/scene/water.js +2473 -114
  486. package/dist/utility/serialization/scene/water.js.map +1 -1
  487. package/dist/utility/serialization/types.js.map +1 -1
  488. package/dist/utility/shprojector.js +97 -109
  489. package/dist/utility/shprojector.js.map +1 -1
  490. package/dist/utility/textures/foam.js +170 -0
  491. package/dist/utility/textures/foam.js.map +1 -0
  492. package/dist/utility/textures/ggxlut.js +17 -43
  493. package/dist/utility/textures/ggxlut.js.map +1 -1
  494. package/dist/utility/textures/ltcdata.js +4 -4
  495. package/dist/utility/textures/ltcdata.js.map +1 -1
  496. package/dist/utility/textures/ltclut.js +16 -6
  497. package/dist/utility/textures/ltclut.js.map +1 -1
  498. package/dist/utility/unsupported.js +24 -0
  499. package/dist/utility/unsupported.js.map +1 -0
  500. package/dist/values.js +13 -1
  501. package/dist/values.js.map +1 -1
  502. package/package.json +25 -12
  503. package/src/asset/loaders/ktx2/basis/LICENSE +201 -0
  504. package/src/asset/loaders/ktx2/basis/basis_transcoder.js +2 -0
  505. package/src/asset/loaders/ktx2/basis/basis_transcoder.wasm +0 -0
  506. package/src/asset/meshoptimizer/LICENSE +21 -0
@@ -1 +1 @@
1
- {"version":3,"file":"grass.js","sources":["../../../src/scene/terrain-cm/grass.ts"],"sourcesContent":["import type { IndexBuffer, StructuredBuffer, Texture2D } from '@zephyr3d/device';\r\nimport type { Vector4 } from '@zephyr3d/base';\r\nimport { AABB, ClipState, nextPowerOf2, DRef, DWeakRef, Disposable } from '@zephyr3d/base';\r\nimport type { DrawContext } from '../../render';\r\nimport { Primitive } from '../../render';\r\nimport { ClipmapGrassMaterial } from './grassmaterial';\r\nimport type { ClipmapTerrain } from './terrain-cm';\r\nimport { getDevice } from '../../app/api';\r\n\r\nconst INSTANCE_BYTES = 4 * 4;\r\n/** Number of placement cells along each axis of a grass tile */\r\nconst TILE_CELLS = 64;\r\n/** Default number of placement cells per density map texel along each axis */\r\nconst DEFAULT_CELLS_PER_TEXEL = 2;\r\nconst MAX_CELLS_PER_TEXEL = 8;\r\n\r\n/**\r\n * Deterministic 2D integer hash, returns a value in [0, 1).\r\n * Grass placement derives everything (jitter, survival threshold, rotation)\r\n * from this hash so that blade positions are stable across edits and reloads.\r\n */\r\nfunction hashCell(x: number, z: number, seed: number): number {\r\n let h = (Math.imul(x, 0x27d4eb2d) ^ Math.imul(z, 0x165667b1) ^ Math.imul(seed, 0x9e3779b9)) | 0;\r\n h = Math.imul(h ^ (h >>> 15), 0x85ebca6b);\r\n h = Math.imul(h ^ (h >>> 13), 0xc2b2ae35);\r\n h ^= h >>> 16;\r\n return (h >>> 0) / 4294967296;\r\n}\r\n\r\n/**\r\n * Grass blade instance buffer for a single tile\r\n * @internal\r\n */\r\nexport class GrassInstances extends Disposable {\r\n private _numInstances: number;\r\n private readonly _baseVertexBuffer: DRef<StructuredBuffer>;\r\n private readonly _indexBuffer: DRef<IndexBuffer>;\r\n private readonly _instanceBuffer: DRef<StructuredBuffer>;\r\n private readonly _primitive: DRef<Primitive>;\r\n constructor(baseVertexBuffer: StructuredBuffer, indexBuffer: IndexBuffer) {\r\n super();\r\n this._numInstances = 0;\r\n this._baseVertexBuffer = new DRef(baseVertexBuffer);\r\n this._indexBuffer = new DRef(indexBuffer);\r\n this._instanceBuffer = new DRef();\r\n this._primitive = new DRef();\r\n }\r\n get numInstances() {\r\n return this._numInstances;\r\n }\r\n setBaseVertexBuffer(baseVertexBuffer: StructuredBuffer) {\r\n if (baseVertexBuffer !== this._baseVertexBuffer.get()) {\r\n this._baseVertexBuffer.set(baseVertexBuffer);\r\n this._primitive.dispose();\r\n }\r\n }\r\n /**\r\n * Sets the packed instance data (x, y, sin, cos per instance)\r\n */\r\n setData(data: Float32Array<ArrayBuffer>, count: number) {\r\n this._numInstances = count;\r\n if (count === 0) {\r\n return;\r\n }\r\n const device = getDevice();\r\n const bytesRequired = count * INSTANCE_BYTES;\r\n let buffer = this._instanceBuffer.get();\r\n if (!buffer || buffer.byteLength < bytesRequired) {\r\n buffer = device.createVertexBuffer('tex1_f32x4', new Uint8Array(nextPowerOf2(bytesRequired)))!;\r\n this._instanceBuffer.set(buffer);\r\n this._primitive.dispose();\r\n }\r\n buffer.bufferSubData(0, data.subarray(0, count * 4));\r\n }\r\n draw() {\r\n if (this._numInstances > 0) {\r\n if (!this._primitive.get()) {\r\n const primitive = new Primitive();\r\n primitive.setVertexBuffer(this._baseVertexBuffer.get()!);\r\n primitive.setVertexBuffer(this._instanceBuffer.get()!, 'instance');\r\n primitive.setIndexBuffer(this._indexBuffer.get());\r\n primitive.primitiveType = 'triangle-list';\r\n primitive.indexStart = 0;\r\n primitive.indexCount = this._indexBuffer.get()!.length;\r\n this._primitive.set(primitive);\r\n }\r\n this._primitive.get()!.drawInstanced(this._numInstances);\r\n }\r\n }\r\n protected onDispose() {\r\n super.onDispose();\r\n this._baseVertexBuffer.dispose();\r\n this._indexBuffer.dispose();\r\n this._instanceBuffer.dispose();\r\n this._primitive.dispose();\r\n }\r\n}\r\n\r\n/**\r\n * Grass layer class\r\n *\r\n * @public\r\n */\r\nexport class GrassLayer extends Disposable {\r\n private static readonly _indexBuffer: DRef<IndexBuffer> = new DRef();\r\n private static readonly _cullAABB = new AABB();\r\n private static readonly _visibleTiles: GrassInstances[] = [];\r\n private static readonly _instanceData = new Float32Array(TILE_CELLS * TILE_CELLS * 4);\r\n private readonly _material: DRef<ClipmapGrassMaterial>;\r\n private readonly _seed: number;\r\n private _bladeWidth: number;\r\n private _bladeHeight: number;\r\n private readonly _baseVertexBuffer: DRef<StructuredBuffer>;\r\n private _densityWidth: number;\r\n private _densityHeight: number;\r\n private _cellsPerTexel: number;\r\n private _densityMap: Uint8Array;\r\n private readonly _tiles: Map<number, GrassInstances>;\r\n private _tilesX: number;\r\n private _tilesZ: number;\r\n private _numBlades: number;\r\n /**\r\n * Creates an instance of GrassLayer\r\n * @param terrain - Clipmap terrain object\r\n * @param seed - Seed for deterministic blade placement, usually the layer index\r\n * @param bladeWidth - Grass blade width\r\n * @param bladeHeight - Grass blade height\r\n * @param albedoMap - Albedo texture for the blade\r\n */\r\n constructor(\r\n terrain: ClipmapTerrain,\r\n seed: number,\r\n bladeWidth: number,\r\n bladeHeight: number,\r\n albedoMap?: Texture2D\r\n ) {\r\n super();\r\n this._material = new DRef(new ClipmapGrassMaterial(terrain));\r\n this._material.get()!.albedoTexture = albedoMap ?? null;\r\n if (albedoMap) {\r\n this._material.get()!.setTextureSize(albedoMap.width, albedoMap.height);\r\n }\r\n this._seed = seed;\r\n this._bladeWidth = bladeWidth;\r\n this._bladeHeight = bladeHeight;\r\n this._baseVertexBuffer = new DRef(this.createBaseVertexBuffer(this._bladeWidth, this._bladeHeight));\r\n this._densityWidth = Math.max(1, terrain.sizeX);\r\n this._densityHeight = Math.max(1, terrain.sizeZ);\r\n this._cellsPerTexel = DEFAULT_CELLS_PER_TEXEL;\r\n this._densityMap = new Uint8Array(this._densityWidth * this._densityHeight);\r\n this._tiles = new Map();\r\n this._tilesX = 0;\r\n this._tilesZ = 0;\r\n this._numBlades = 0;\r\n this.updateTileGrid();\r\n }\r\n /** @internal */\r\n updateMaterial() {\r\n this._material.get()!.uniformChanged();\r\n }\r\n /**\r\n * Sets the albedo texture of grass blades in this layer\r\n * @param albedoMap - Albedo texture to set\r\n */\r\n setAlbedoMap(albedoMap: Texture2D) {\r\n this._material.get()!.albedoTexture = albedoMap;\r\n if (albedoMap) {\r\n this._material.get()!.setTextureSize(albedoMap.width, albedoMap.height);\r\n }\r\n }\r\n /**\r\n * Gets the albedo texture of grass blades in this layer\r\n * @returns - Albedo texture of grass blades in this layer\r\n */\r\n getAlbedoMap() {\r\n return this._material.get()!.albedoTexture;\r\n }\r\n /** How many grass blades are currently generated in this layer */\r\n get numBlades() {\r\n return this._numBlades;\r\n }\r\n /**\r\n * Density map of this layer, one byte per texel (0 = no grass, 255 = full density).\r\n * Texel (x, z) covers the normalized terrain region [x/w..(x+1)/w, z/h..(z+1)/h].\r\n * After modifying the data, call {@link GrassLayer.updateDensityRegion} to\r\n * regenerate the affected blade instances.\r\n */\r\n get densityMap() {\r\n return this._densityMap;\r\n }\r\n /** Width of the density map in texels */\r\n get densityMapWidth() {\r\n return this._densityWidth;\r\n }\r\n /** Height of the density map in texels */\r\n get densityMapHeight() {\r\n return this._densityHeight;\r\n }\r\n /**\r\n * Number of placement cells per density map texel along each axis.\r\n * The maximum blade count per texel is the square of this value.\r\n */\r\n get cellsPerTexel() {\r\n return this._cellsPerTexel;\r\n }\r\n set cellsPerTexel(val: number) {\r\n val = Math.max(1, Math.min(MAX_CELLS_PER_TEXEL, val | 0));\r\n if (val !== this._cellsPerTexel) {\r\n this._cellsPerTexel = val;\r\n this.rebuild();\r\n }\r\n }\r\n /**\r\n * Replaces the density map and regenerates all blade instances\r\n * @param width - Density map width in texels\r\n * @param height - Density map height in texels\r\n * @param cellsPerTexel - Placement cells per texel along each axis\r\n * @param data - Density data, one byte per texel\r\n */\r\n setDensityData(width: number, height: number, cellsPerTexel: number, data: Uint8Array) {\r\n if (width < 1 || height < 1 || width * height !== data.length) {\r\n console.error('Invalid grass density data');\r\n return;\r\n }\r\n this._densityWidth = width;\r\n this._densityHeight = height;\r\n this._cellsPerTexel = Math.max(1, Math.min(MAX_CELLS_PER_TEXEL, cellsPerTexel | 0));\r\n this._densityMap = data;\r\n this.rebuild();\r\n }\r\n /**\r\n * Regenerates blade instances for all tiles overlapping a density map region\r\n * @param minTexelX - Minimum x texel of the region (inclusive)\r\n * @param minTexelZ - Minimum z texel of the region (inclusive)\r\n * @param maxTexelX - Maximum x texel of the region (exclusive)\r\n * @param maxTexelZ - Maximum z texel of the region (exclusive)\r\n */\r\n updateDensityRegion(minTexelX: number, minTexelZ: number, maxTexelX: number, maxTexelZ: number) {\r\n const k = this._cellsPerTexel;\r\n // expand by one texel to cover the bilinear sampling footprint\r\n const cx0 = Math.max(0, (minTexelX - 1) * k);\r\n const cz0 = Math.max(0, (minTexelZ - 1) * k);\r\n const cx1 = Math.min(this._densityWidth * k, (maxTexelX + 1) * k);\r\n const cz1 = Math.min(this._densityHeight * k, (maxTexelZ + 1) * k);\r\n if (cx1 <= cx0 || cz1 <= cz0) {\r\n return;\r\n }\r\n const tx0 = Math.floor(cx0 / TILE_CELLS);\r\n const tz0 = Math.floor(cz0 / TILE_CELLS);\r\n const tx1 = Math.min(this._tilesX, Math.ceil(cx1 / TILE_CELLS));\r\n const tz1 = Math.min(this._tilesZ, Math.ceil(cz1 / TILE_CELLS));\r\n for (let tz = tz0; tz < tz1; tz++) {\r\n for (let tx = tx0; tx < tx1; tx++) {\r\n this.generateTile(tx, tz);\r\n }\r\n }\r\n }\r\n /**\r\n * Regenerates blade instances for the entire layer\r\n */\r\n rebuild() {\r\n for (const tile of this._tiles.values()) {\r\n tile.dispose();\r\n }\r\n this._tiles.clear();\r\n this._numBlades = 0;\r\n this.updateTileGrid();\r\n for (let tz = 0; tz < this._tilesZ; tz++) {\r\n for (let tx = 0; tx < this._tilesX; tx++) {\r\n this.generateTile(tx, tz);\r\n }\r\n }\r\n }\r\n /** Grass blade width in this layer */\r\n get bladeWidth() {\r\n return this._bladeWidth;\r\n }\r\n set bladeWidth(val: number) {\r\n this.setBladeSize(val, this._bladeHeight);\r\n }\r\n /** Grass blade height in this layer */\r\n get bladeHeight() {\r\n return this._bladeHeight;\r\n }\r\n set bladeHeight(val: number) {\r\n this.setBladeSize(this._bladeWidth, val);\r\n }\r\n /**\r\n * Sets the size of grass blades in this layer\r\n * @param width - Grass blade width\r\n * @param height - Grass blade height\r\n */\r\n setBladeSize(width: number, height: number) {\r\n if (width !== this._bladeWidth || height !== this._bladeHeight) {\r\n this._bladeWidth = width;\r\n this._bladeHeight = height;\r\n this._baseVertexBuffer.set(this.createBaseVertexBuffer(this._bladeWidth, this._bladeHeight));\r\n for (const tile of this._tiles.values()) {\r\n tile.setBaseVertexBuffer(this._baseVertexBuffer.get()!);\r\n }\r\n }\r\n }\r\n /** @internal */\r\n private updateTileGrid() {\r\n this._tilesX = Math.ceil((this._densityWidth * this._cellsPerTexel) / TILE_CELLS);\r\n this._tilesZ = Math.ceil((this._densityHeight * this._cellsPerTexel) / TILE_CELLS);\r\n }\r\n /** @internal */\r\n private sampleDensity(u: number, v: number): number {\r\n const w = this._densityWidth;\r\n const h = this._densityHeight;\r\n const x = u * w - 0.5;\r\n const z = v * h - 0.5;\r\n const ix = Math.floor(x);\r\n const iz = Math.floor(z);\r\n const fx = x - ix;\r\n const fz = z - iz;\r\n const x0 = Math.min(Math.max(ix, 0), w - 1);\r\n const x1 = Math.min(Math.max(ix + 1, 0), w - 1);\r\n const z0 = Math.min(Math.max(iz, 0), h - 1);\r\n const z1 = Math.min(Math.max(iz + 1, 0), h - 1);\r\n const d = this._densityMap;\r\n const a = d[z0 * w + x0] + (d[z0 * w + x1] - d[z0 * w + x0]) * fx;\r\n const b = d[z1 * w + x0] + (d[z1 * w + x1] - d[z1 * w + x0]) * fx;\r\n return (a + (b - a) * fz) * (1 / 255);\r\n }\r\n /** @internal */\r\n private regionIsEmpty(cx0: number, cz0: number, cx1: number, cz1: number): boolean {\r\n const k = this._cellsPerTexel;\r\n const x0 = Math.max(0, Math.floor(cx0 / k) - 1);\r\n const z0 = Math.max(0, Math.floor(cz0 / k) - 1);\r\n const x1 = Math.min(this._densityWidth, Math.ceil(cx1 / k) + 1);\r\n const z1 = Math.min(this._densityHeight, Math.ceil(cz1 / k) + 1);\r\n for (let z = z0; z < z1; z++) {\r\n const rowBase = z * this._densityWidth;\r\n for (let x = x0; x < x1; x++) {\r\n if (this._densityMap[rowBase + x] !== 0) {\r\n return false;\r\n }\r\n }\r\n }\r\n return true;\r\n }\r\n /** @internal */\r\n private generateTile(tx: number, tz: number) {\r\n const k = this._cellsPerTexel;\r\n const cw = this._densityWidth * k;\r\n const ch = this._densityHeight * k;\r\n const cx0 = tx * TILE_CELLS;\r\n const cz0 = tz * TILE_CELLS;\r\n const cx1 = Math.min(cx0 + TILE_CELLS, cw);\r\n const cz1 = Math.min(cz0 + TILE_CELLS, ch);\r\n const key = tz * this._tilesX + tx;\r\n let tile = this._tiles.get(key);\r\n // fast path: nothing to generate if there is no tile yet and no density\r\n if (!tile && this.regionIsEmpty(cx0, cz0, cx1, cz1)) {\r\n return;\r\n }\r\n const data = GrassLayer._instanceData;\r\n const seed = this._seed * 4;\r\n let count = 0;\r\n for (let cz = cz0; cz < cz1; cz++) {\r\n for (let cx = cx0; cx < cx1; cx++) {\r\n const u = (cx + hashCell(cx, cz, seed)) / cw;\r\n const v = (cz + hashCell(cx, cz, seed + 1)) / ch;\r\n if (this.sampleDensity(u, v) > hashCell(cx, cz, seed + 2)) {\r\n const angle = hashCell(cx, cz, seed + 3) * Math.PI * 2;\r\n data[count * 4 + 0] = u;\r\n data[count * 4 + 1] = v;\r\n data[count * 4 + 2] = Math.sin(angle);\r\n data[count * 4 + 3] = Math.cos(angle);\r\n count++;\r\n }\r\n }\r\n }\r\n this._numBlades += count - (tile?.numInstances ?? 0);\r\n if (count === 0) {\r\n if (tile) {\r\n tile.dispose();\r\n this._tiles.delete(key);\r\n }\r\n } else {\r\n if (!tile) {\r\n tile = new GrassInstances(this._baseVertexBuffer.get()!, GrassLayer._getIndexBuffer()!);\r\n this._tiles.set(key, tile);\r\n }\r\n tile.setData(data, count);\r\n }\r\n }\r\n /** @internal */\r\n private static _getIndexBuffer() {\r\n if (!this._indexBuffer.get()) {\r\n this._indexBuffer.set(\r\n getDevice().createIndexBuffer(\r\n new Uint16Array([0, 1, 2, 0, 2, 3, 4, 5, 6, 4, 6, 7, 8, 9, 10, 8, 10, 11])\r\n )\r\n );\r\n }\r\n return this._indexBuffer.get();\r\n }\r\n /** @internal */\r\n private createBaseVertexBuffer(bladeWidth: number, bladeHeight: number) {\r\n const device = getDevice();\r\n const r = bladeWidth * 0.5;\r\n const t = bladeHeight;\r\n const c = r * Math.cos(Math.PI / 3);\r\n const s = r * Math.sin(Math.PI / 3);\r\n const vertices = new Float32Array([\r\n r,\r\n 0,\r\n 0,\r\n 0,\r\n 1,\r\n r,\r\n t,\r\n 0,\r\n 0,\r\n 0,\r\n -r,\r\n t,\r\n 0,\r\n 1,\r\n 0,\r\n -r,\r\n 0,\r\n 0,\r\n 1,\r\n 1,\r\n\r\n c,\r\n 0,\r\n s,\r\n 0,\r\n 1,\r\n -c,\r\n 0,\r\n -s,\r\n 1,\r\n 1,\r\n -c,\r\n t,\r\n -s,\r\n 1,\r\n 0,\r\n c,\r\n t,\r\n s,\r\n 0,\r\n 0,\r\n\r\n -c,\r\n 0,\r\n s,\r\n 0,\r\n 1,\r\n c,\r\n 0,\r\n -s,\r\n 1,\r\n 1,\r\n c,\r\n t,\r\n -s,\r\n 1,\r\n 0,\r\n -c,\r\n t,\r\n s,\r\n 0,\r\n 0\r\n ]);\r\n return device.createInterleavedVertexBuffer(['position_f32x3', 'tex0_f32x2'], vertices);\r\n }\r\n /** @internal */\r\n draw(ctx: DrawContext, region: Vector4, minY: number, maxY: number) {\r\n const visible = GrassLayer._visibleTiles;\r\n visible.length = 0;\r\n const camera = ctx.camera;\r\n const cullAABB = GrassLayer._cullAABB;\r\n const cellsW = this._densityWidth * this._cellsPerTexel;\r\n const cellsH = this._densityHeight * this._cellsPerTexel;\r\n const rx = region.x;\r\n const rz = region.y;\r\n const rw = region.z - region.x;\r\n const rh = region.w - region.y;\r\n for (const [key, tile] of this._tiles) {\r\n const tx = key % this._tilesX;\r\n const tz = (key - tx) / this._tilesX;\r\n const u0 = (tx * TILE_CELLS) / cellsW;\r\n const v0 = (tz * TILE_CELLS) / cellsH;\r\n const u1 = Math.min(1, ((tx + 1) * TILE_CELLS) / cellsW);\r\n const v1 = Math.min(1, ((tz + 1) * TILE_CELLS) / cellsH);\r\n cullAABB.minPoint.setXYZ(rx + u0 * rw, minY, rz + v0 * rh);\r\n cullAABB.maxPoint.setXYZ(rx + u1 * rw, maxY, rz + v1 * rh);\r\n const clipState = camera.clipMask\r\n ? cullAABB.getClipStateWithFrustumMask(camera.frustum, camera.clipMask)\r\n : cullAABB.getClipStateWithFrustum(camera.frustum);\r\n if (clipState !== ClipState.NOT_CLIPPED) {\r\n visible.push(tile);\r\n }\r\n }\r\n if (visible.length === 0) {\r\n return;\r\n }\r\n this._material.get()!.apply(ctx);\r\n for (let pass = 0; pass < this._material.get()!.numPasses; pass++) {\r\n this._material.get()!.bind(ctx.device, pass);\r\n for (const tile of visible) {\r\n tile.draw();\r\n }\r\n }\r\n visible.length = 0;\r\n }\r\n /** @internal */\r\n protected onDispose() {\r\n super.onDispose();\r\n this._material.dispose();\r\n for (const tile of this._tiles.values()) {\r\n tile.dispose();\r\n }\r\n this._tiles.clear();\r\n this._baseVertexBuffer.dispose();\r\n }\r\n}\r\n/**\r\n * Grass renderer for clipmap terrain\r\n * @public\r\n */\r\nexport class GrassRenderer extends Disposable {\r\n private readonly _terrain: DWeakRef<ClipmapTerrain>;\r\n private _layers: GrassLayer[];\r\n /**\r\n * Creates an instance of GrassRenderer\r\n * @param terrain - Clipmap terrain object\r\n */\r\n constructor(terrain: ClipmapTerrain) {\r\n super();\r\n this._terrain = new DWeakRef(terrain);\r\n this._layers = [];\r\n }\r\n /** @internal */\r\n updateMaterial() {\r\n for (const layer of this._layers) {\r\n layer.updateMaterial();\r\n }\r\n }\r\n /** How many grass blades */\r\n get numGrassBlades() {\r\n return this._layers.reduce((sum, layer) => sum + layer.numBlades, 0);\r\n }\r\n /** How many grass layers */\r\n get numLayers() {\r\n return this._layers.length;\r\n }\r\n /**\r\n * Gets the grass layer at given index\r\n * @param index - Index of the grass layer\r\n * @returns The grass layer at the index\r\n */\r\n getLayer(index: number) {\r\n return this._layers[index];\r\n }\r\n /**\r\n * Adds a grass layer\r\n * @param bladeWidth - Width of grass blades in this layer\r\n * @param bladeHeight - Height of grass blades in this layer\r\n * @param albedoMap - Albedo texture of grass blades in this layer\r\n * @returns Index of the added grass layer\r\n */\r\n addLayer(bladeWidth: number, bladeHeight: number, albedoMap?: Texture2D) {\r\n const layer = new GrassLayer(\r\n this._terrain.get()!,\r\n this._layers.length,\r\n bladeWidth,\r\n bladeHeight,\r\n albedoMap\r\n );\r\n this._layers.push(layer);\r\n return this._layers.length - 1;\r\n }\r\n /**\r\n * Gets the albedo texture of grass blades in the grass layer at given index\r\n * @param layer - Index of the grass layer to get\r\n * @returns Albedo texture of grass blades in the grass layer\r\n */\r\n getGrassTexture(layer: number) {\r\n return this._layers[layer]?.getAlbedoMap() ?? null;\r\n }\r\n /**\r\n * Sets the albedo texture of grass blades in the grass layer at given index\r\n * @param layer - Index of the grass layer to set\r\n * @param texture - Albedo texture to set\r\n */\r\n setGrassTexture(layer: number, texture: Texture2D) {\r\n const grassLayer = this._layers[layer];\r\n if (grassLayer) {\r\n grassLayer.setAlbedoMap(texture);\r\n } else {\r\n console.error(`Invalid grass layer: ${layer}`);\r\n }\r\n }\r\n /**\r\n * Gets width of the grass blades in the grass layer at given index\r\n * @param layer - Index of the grass layer\r\n * @returns Width of the grass blades in the layer\r\n */\r\n getBladeWidth(layer: number) {\r\n return this._layers[layer]?.bladeWidth ?? 0;\r\n }\r\n /**\r\n * Gets height of the grass blades in the grass layer at given index\r\n * @param layer - Index of the grass layer\r\n * @returns Height of the grass blades in the layer\r\n */\r\n getBladeHeight(layer: number) {\r\n return this._layers[layer]?.bladeHeight ?? 0;\r\n }\r\n /**\r\n * Sets size of the grass blades in the grass layer at given index\r\n * @param layer - Index of the grass layer\r\n * @param width - Width to set\r\n * @param height - Height to set\r\n */\r\n setBladeSize(layer: number, width: number, height: number) {\r\n const grassLayer = this._layers[layer];\r\n if (grassLayer) {\r\n grassLayer.setBladeSize(width, height);\r\n } else {\r\n console.error(`Invalid grass layer: ${layer}`);\r\n }\r\n }\r\n /** @internal */\r\n draw(ctx: DrawContext) {\r\n const bv = this._terrain.get()!.getWorldBoundingVolume()!.toAABB();\r\n const minY = bv.minPoint.y;\r\n const maxY = bv.maxPoint.y;\r\n for (const layer of this._layers) {\r\n layer.draw(ctx, this._terrain.get()!.worldRegion, minY - layer.bladeHeight, maxY + layer.bladeHeight);\r\n }\r\n }\r\n protected onDispose() {\r\n super.onDispose();\r\n this._terrain.dispose();\r\n for (const layer of this._layers) {\r\n layer.dispose();\r\n }\r\n }\r\n}\r\n"],"names":["INSTANCE_BYTES","TILE_CELLS","DEFAULT_CELLS_PER_TEXEL","MAX_CELLS_PER_TEXEL","hashCell","x","z","seed","h","Math","imul","GrassInstances","Disposable","_numInstances","_baseVertexBuffer","_indexBuffer","_instanceBuffer","_primitive","baseVertexBuffer","indexBuffer","DRef","numInstances","setBaseVertexBuffer","get","set","dispose","setData","data","count","device","getDevice","bytesRequired","buffer","byteLength","createVertexBuffer","Uint8Array","nextPowerOf2","bufferSubData","subarray","draw","primitive","Primitive","setVertexBuffer","setIndexBuffer","primitiveType","indexStart","indexCount","length","drawInstanced","onDispose","GrassLayer","_cullAABB","AABB","_visibleTiles","_instanceData","Float32Array","_material","_seed","_bladeWidth","_bladeHeight","_densityWidth","_densityHeight","_cellsPerTexel","_densityMap","_tiles","_tilesX","_tilesZ","_numBlades","terrain","bladeWidth","bladeHeight","albedoMap","ClipmapGrassMaterial","albedoTexture","setTextureSize","width","height","createBaseVertexBuffer","max","sizeX","sizeZ","Map","updateTileGrid","updateMaterial","uniformChanged","setAlbedoMap","getAlbedoMap","numBlades","densityMap","densityMapWidth","densityMapHeight","cellsPerTexel","val","min","rebuild","setDensityData","console","error","updateDensityRegion","minTexelX","minTexelZ","maxTexelX","maxTexelZ","k","cx0","cz0","cx1","cz1","tx0","floor","tz0","tx1","ceil","tz1","tz","tx","generateTile","tile","values","clear","setBladeSize","sampleDensity","u","v","w","ix","iz","fx","fz","x0","x1","z0","z1","d","a","b","regionIsEmpty","rowBase","cw","ch","key","cz","cx","angle","PI","sin","cos","delete","_getIndexBuffer","createIndexBuffer","Uint16Array","r","t","c","s","vertices","createInterleavedVertexBuffer","ctx","region","minY","maxY","visible","camera","cullAABB","cellsW","cellsH","rx","rz","y","rw","rh","u0","v0","u1","v1","minPoint","setXYZ","maxPoint","clipState","clipMask","getClipStateWithFrustumMask","frustum","getClipStateWithFrustum","ClipState","NOT_CLIPPED","push","apply","pass","numPasses","bind","GrassRenderer","_terrain","_layers","DWeakRef","layer","numGrassBlades","reduce","sum","numLayers","getLayer","index","addLayer","getGrassTexture","setGrassTexture","texture","grassLayer","getBladeWidth","getBladeHeight","bv","getWorldBoundingVolume","toAABB","worldRegion"],"mappings":"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"}
1
+ {"version":3,"file":"grass.js","sources":["../../../src/scene/terrain-cm/grass.ts"],"sourcesContent":["import type { IndexBuffer, StructuredBuffer, Texture2D } from '@zephyr3d/device';\r\nimport type { Nullable } from '@zephyr3d/base';\r\nimport { AABB, ClipState, nextPowerOf2, DRef, DWeakRef, Disposable, Vector3, Vector4 } from '@zephyr3d/base';\r\nimport type { DrawContext, ShadowMapPass } from '../../render';\r\nimport type { Camera } from '../../camera';\r\nimport { Primitive } from '../../render';\r\nimport { ClipmapGrassMaterial } from './grassmaterial';\r\nimport type { ClipmapTerrain } from './terrain-cm';\r\nimport { getDevice } from '../../app/api';\r\nimport type { GrassBladeShape, GrassLayerKind } from './grass_gpu';\r\nimport { GRASS_CULL_PLANES, GrassGpuPlacement, GrassOcclusionMode, grassHash } from './grass_gpu';\r\nimport { DirectionalLight } from '../light';\r\nimport { RENDER_PASS_TYPE_SHADOWMAP } from '../../values';\r\nimport { BLADE_LOD_INDEX_COUNTS, ClipmapBladeGrassMaterial, createBladeIndices } from './bladegrassmaterial';\r\nimport { warnUnsupported } from '../../utility/unsupported';\r\n\r\nconst INSTANCE_BYTES = 4 * 4;\r\n/** Number of placement cells along each axis of a grass tile */\r\nconst TILE_CELLS = 64;\r\n/** Default number of placement cells per density map texel along each axis */\r\nconst DEFAULT_CELLS_PER_TEXEL = 2;\r\nconst MAX_CELLS_PER_TEXEL = 8;\r\n/** Default distance from the camera beyond which grass is not drawn */\r\nconst DEFAULT_DRAW_DISTANCE = 150;\r\n/** Default fraction of blades kept at the draw distance */\r\nconst DEFAULT_FAR_DENSITY = 0.25;\r\n/**\r\n * Number of the nearest cascades of the sun's shadow map procedural blades cast shadows into.\r\n * Farther cascades have texels too coarse for single blades.\r\n */\r\nconst GRASS_SHADOW_CASCADES = 2;\r\n/** Default shape and clumping of procedural blades, see GrassBladeShape */\r\nconst DEFAULT_BLADE_SHAPE = [\r\n 1.5, 0.3, 0.08, 0.2, 0.25, 0.2, 0.15, 0.1, 1.9, 0.48, 0.2, 0.3, 0.2, 0.5, 0.15, 80\r\n];\r\n/**\r\n * Default width of procedural blades\r\n * @internal\r\n */\r\nexport const DEFAULT_BLADE_WIDTH = 0.08;\r\n/**\r\n * Default height of procedural blades\r\n * @internal\r\n */\r\nexport const DEFAULT_BLADE_HEIGHT = 1.5;\r\n\r\nfunction distanceSqToAABB(x: number, y: number, z: number, aabb: AABB) {\r\n const dx = Math.max(aabb.minPoint.x - x, 0, x - aabb.maxPoint.x);\r\n const dy = Math.max(aabb.minPoint.y - y, 0, y - aabb.maxPoint.y);\r\n const dz = Math.max(aabb.minPoint.z - z, 0, z - aabb.maxPoint.z);\r\n return dx * dx + dy * dy + dz * dz;\r\n}\r\n\r\n/**\r\n * Grass blade instance buffer for a single tile\r\n * @internal\r\n */\r\nexport class GrassInstances extends Disposable {\r\n private _numInstances: number;\r\n private readonly _baseVertexBuffer: DRef<StructuredBuffer>;\r\n private readonly _indexBuffer: DRef<IndexBuffer>;\r\n private readonly _instanceBuffer: DRef<StructuredBuffer>;\r\n private readonly _primitive: DRef<Primitive>;\r\n constructor(baseVertexBuffer: StructuredBuffer, indexBuffer: IndexBuffer) {\r\n super();\r\n this._numInstances = 0;\r\n this._baseVertexBuffer = new DRef(baseVertexBuffer);\r\n this._indexBuffer = new DRef(indexBuffer);\r\n this._instanceBuffer = new DRef();\r\n this._primitive = new DRef();\r\n }\r\n get numInstances() {\r\n return this._numInstances;\r\n }\r\n setBaseVertexBuffer(baseVertexBuffer: StructuredBuffer) {\r\n if (baseVertexBuffer !== this._baseVertexBuffer.get()) {\r\n this._baseVertexBuffer.set(baseVertexBuffer);\r\n this._primitive.dispose();\r\n }\r\n }\r\n /**\r\n * Sets the packed instance data (x, y, sin, cos per instance)\r\n */\r\n setData(data: Float32Array<ArrayBuffer>, count: number) {\r\n this._numInstances = count;\r\n if (count === 0) {\r\n return;\r\n }\r\n const device = getDevice();\r\n const bytesRequired = count * INSTANCE_BYTES;\r\n let buffer = this._instanceBuffer.get();\r\n if (!buffer || buffer.byteLength < bytesRequired) {\r\n buffer = device.createVertexBuffer('tex1_f32x4', new Uint8Array(nextPowerOf2(bytesRequired)))!;\r\n this._instanceBuffer.set(buffer);\r\n this._primitive.dispose();\r\n }\r\n buffer.bufferSubData(0, data.subarray(0, count * 4));\r\n }\r\n draw() {\r\n if (this._numInstances > 0) {\r\n if (!this._primitive.get()) {\r\n const primitive = new Primitive();\r\n primitive.setVertexBuffer(this._baseVertexBuffer.get()!);\r\n primitive.setVertexBuffer(this._instanceBuffer.get()!, 'instance');\r\n primitive.setIndexBuffer(this._indexBuffer.get());\r\n primitive.primitiveType = 'triangle-list';\r\n primitive.indexStart = 0;\r\n primitive.indexCount = this._indexBuffer.get()!.length;\r\n this._primitive.set(primitive);\r\n }\r\n this._primitive.get()!.drawInstanced(this._numInstances);\r\n }\r\n }\r\n protected onDispose() {\r\n super.onDispose();\r\n this._baseVertexBuffer.dispose();\r\n this._indexBuffer.dispose();\r\n this._instanceBuffer.dispose();\r\n this._primitive.dispose();\r\n }\r\n}\r\n\r\n/**\r\n * Grass layer class\r\n *\r\n * @public\r\n */\r\nexport class GrassLayer extends Disposable {\r\n private static readonly _indexBuffer: DRef<IndexBuffer> = new DRef();\r\n private static readonly _bladeIndexBuffer: DRef<IndexBuffer> = new DRef();\r\n private static readonly _bladeVertexBuffer: DRef<StructuredBuffer> = new DRef();\r\n private static readonly _cullAABB = new AABB();\r\n private static readonly _cameraPos = new Vector3();\r\n private static readonly _visibleTiles: GrassInstances[] = [];\r\n private static readonly _instanceData = new Float32Array(TILE_CELLS * TILE_CELLS * 4);\r\n private readonly _kind: GrassLayerKind;\r\n private readonly _material: DRef<ClipmapGrassMaterial | ClipmapBladeGrassMaterial>;\r\n private readonly _bladeShape: GrassBladeShape;\r\n private readonly _seed: number;\r\n private _bladeWidth: number;\r\n private _bladeHeight: number;\r\n private readonly _baseVertexBuffer: DRef<StructuredBuffer>;\r\n private _densityWidth: number;\r\n private _densityHeight: number;\r\n private _cellsPerTexel: number;\r\n private _densityMap: Uint8Array;\r\n private readonly _tiles: Map<number, GrassInstances>;\r\n private _tilesX: number;\r\n private _tilesZ: number;\r\n private _numBlades: number;\r\n private _drawDistance: number;\r\n private _farDensity: number;\r\n /** Set on WebGPU with indirect draw: blades are placed on the GPU instead of in CPU tiles */\r\n private readonly _gpu: Nullable<GrassGpuPlacement>;\r\n /** Number of shadow maps the blades were placed for by the last updatePerCamera() call */\r\n private _numShadowTargets: number;\r\n /**\r\n * Creates an instance of GrassLayer\r\n * @param terrain - Clipmap terrain object\r\n * @param seed - Seed for deterministic blade placement, usually the layer index\r\n * @param bladeWidth - Grass blade width\r\n * @param bladeHeight - Grass blade height\r\n * @param albedoMap - Albedo texture for the blade, card layers only\r\n * @param kind - Textured cards, or procedural blades (drawn on WebGPU only)\r\n */\r\n constructor(\r\n terrain: ClipmapTerrain,\r\n seed: number,\r\n bladeWidth: number,\r\n bladeHeight: number,\r\n albedoMap?: Nullable<Texture2D>,\r\n kind: GrassLayerKind = 'card'\r\n ) {\r\n super();\r\n this._kind = kind;\r\n this._bladeShape = new Float32Array(DEFAULT_BLADE_SHAPE);\r\n if (kind === 'blade') {\r\n const material = new ClipmapBladeGrassMaterial(terrain);\r\n material.colorMap = albedoMap ?? null;\r\n this._material = new DRef(material);\r\n } else {\r\n const material = new ClipmapGrassMaterial(terrain);\r\n material.albedoTexture = albedoMap ?? null;\r\n if (albedoMap) {\r\n material.setTextureSize(albedoMap.width, albedoMap.height);\r\n }\r\n this._material = new DRef(material);\r\n }\r\n this._seed = seed;\r\n this._bladeWidth = bladeWidth;\r\n this._bladeHeight = bladeHeight;\r\n this._baseVertexBuffer = new DRef(this.createBaseVertexBuffer(this._bladeWidth, this._bladeHeight));\r\n this._densityWidth = Math.max(1, terrain.sizeX);\r\n this._densityHeight = Math.max(1, terrain.sizeZ);\r\n this._cellsPerTexel = DEFAULT_CELLS_PER_TEXEL;\r\n this._densityMap = new Uint8Array(this._densityWidth * this._densityHeight);\r\n this._tiles = new Map();\r\n this._tilesX = 0;\r\n this._tilesZ = 0;\r\n this._numBlades = 0;\r\n this._drawDistance = 0;\r\n this._farDensity = 1;\r\n this._numShadowTargets = 0;\r\n if (!GrassGpuPlacement.isSupported()) {\r\n this._gpu = null;\r\n if (kind === 'blade') {\r\n warnUnsupported(\r\n \"Procedural grass blades (grass layer kind 'blade')\",\r\n 'WebGPU with indirect draw',\r\n 'blade layers are not drawn'\r\n );\r\n }\r\n } else if (kind === 'blade') {\r\n this._gpu = new GrassGpuPlacement(\r\n 'blade',\r\n GrassLayer._getBladeVertexBuffer()!,\r\n GrassLayer._getBladeIndexBuffer()!,\r\n BLADE_LOD_INDEX_COUNTS\r\n );\r\n } else {\r\n this._gpu = new GrassGpuPlacement('card', this._baseVertexBuffer.get()!, GrassLayer._getIndexBuffer()!);\r\n }\r\n if (kind === 'blade') {\r\n this._bladeShape[0] = bladeHeight;\r\n this._bladeShape[2] = bladeWidth;\r\n this.bladeMaterial!.lodDistance = this._bladeShape[15];\r\n }\r\n this._gpu?.setDensity(this._densityWidth, this._densityHeight, this._densityMap);\r\n this.drawDistance = DEFAULT_DRAW_DISTANCE;\r\n this.farDensity = DEFAULT_FAR_DENSITY;\r\n this.updateTileGrid();\r\n }\r\n /**\r\n * Distance from the camera beyond which blades of this layer are not drawn. Blades shrink\r\n * into the ground over the last quarter of it. Zero draws the layer at any distance.\r\n */\r\n get drawDistance() {\r\n return this._drawDistance;\r\n }\r\n set drawDistance(val: number) {\r\n val = Math.max(0, Number(val) || 0);\r\n if (val !== this._drawDistance) {\r\n this._drawDistance = val;\r\n this._material.get()!.setDrawDistance(val);\r\n }\r\n }\r\n /**\r\n * Fraction of the blades of this layer still drawn at the draw distance, 1 to draw them all.\r\n *\r\n * From a quarter of the draw distance on, blades thin out towards this fraction, each leaving\r\n * at its own fixed distance, and the remaining ones widen to keep the ground covered. Saves\r\n * most of the distant grass geometry where blades are placed on the GPU (WebGPU); elsewhere\r\n * the dropped blades are still drawn, only shrunk to nothing. Has no effect without a draw\r\n * distance, nor on blade layers, which thin out by their detail levels (see\r\n * {@link GrassLayer.lodDistance}).\r\n */\r\n get farDensity() {\r\n return this._farDensity;\r\n }\r\n set farDensity(val: number) {\r\n val = Math.min(1, Math.max(0.01, Number(val) || 0));\r\n if (val !== this._farDensity) {\r\n this._farDensity = val;\r\n this._material.get()!.setFarDensity(val);\r\n }\r\n }\r\n /** Kind of the blades of this layer, fixed at creation */\r\n get kind() {\r\n return this._kind;\r\n }\r\n /** @internal */\r\n updateMaterial() {\r\n this._material.get()!.uniformChanged();\r\n }\r\n /**\r\n * Sets the albedo texture of grass blades in this layer: the card texture of card layers, the\r\n * color map of blade layers (see {@link GrassLayer.colorMap})\r\n * @param albedoMap - Albedo texture to set\r\n */\r\n setAlbedoMap(albedoMap: Nullable<Texture2D>) {\r\n const material = this._material.get()!;\r\n if (material instanceof ClipmapGrassMaterial) {\r\n material.albedoTexture = albedoMap;\r\n if (albedoMap) {\r\n material.setTextureSize(albedoMap.width, albedoMap.height);\r\n }\r\n } else {\r\n material.colorMap = albedoMap;\r\n }\r\n }\r\n /**\r\n * Gets the albedo texture of grass blades in this layer\r\n * @returns - The card texture of card layers, the color map of blade layers\r\n */\r\n getAlbedoMap() {\r\n const material = this._material.get()!;\r\n return material instanceof ClipmapGrassMaterial ? material.albedoTexture : material.colorMap;\r\n }\r\n /** @internal */\r\n private get bladeMaterial() {\r\n const material = this._material.get()!;\r\n return material instanceof ClipmapBladeGrassMaterial ? material : null;\r\n }\r\n /** @internal */\r\n private setShape(index: number, value: number) {\r\n if (Number.isFinite(value)) {\r\n this._bladeShape[index] = value;\r\n }\r\n }\r\n /**\r\n * How much blade heights vary around the layer's blade height, as a fraction of it.\r\n * Blade layers only.\r\n */\r\n get heightRandomness() {\r\n return this._bladeShape[1];\r\n }\r\n set heightRandomness(val: number) {\r\n this.setShape(1, Math.min(1, Math.max(0, val)));\r\n }\r\n /** How much blade widths vary around the layer's blade width, as a fraction of it. Blade layers only. */\r\n get widthRandomness() {\r\n return this._bladeShape[3];\r\n }\r\n set widthRandomness(val: number) {\r\n this.setShape(3, Math.min(1, Math.max(0, val)));\r\n }\r\n /**\r\n * How far the blades lean over: 0 stands them upright, 1 lays their tips on the ground.\r\n * Blade layers only.\r\n */\r\n get tilt() {\r\n return this._bladeShape[4];\r\n }\r\n set tilt(val: number) {\r\n this.setShape(4, Math.min(1, Math.max(0, val)));\r\n }\r\n /** How much the lean varies from blade to blade. Blade layers only. */\r\n get tiltRandomness() {\r\n return this._bladeShape[5];\r\n }\r\n set tiltRandomness(val: number) {\r\n this.setShape(5, Math.min(1, Math.max(0, val)));\r\n }\r\n /**\r\n * How much the blades arch: 0 keeps them straight, higher values bow the middle up so the tips\r\n * droop. Blade layers only.\r\n */\r\n get bend() {\r\n return this._bladeShape[6];\r\n }\r\n set bend(val: number) {\r\n this.setShape(6, Math.min(1, Math.max(-1, val)));\r\n }\r\n /** How much the arch varies from blade to blade. Blade layers only. */\r\n get bendRandomness() {\r\n return this._bladeShape[7];\r\n }\r\n set bendRandomness(val: number) {\r\n this.setShape(7, Math.min(1, Math.max(0, val)));\r\n }\r\n /**\r\n * Typical size of a clump of blades, in world units. Blades of a clump share their height,\r\n * direction and color, so the field breaks up into patches this big. Blade layers only.\r\n */\r\n get clumpSize() {\r\n return this._bladeShape[8];\r\n }\r\n set clumpSize(val: number) {\r\n this.setShape(8, Math.max(0.01, val));\r\n }\r\n /**\r\n * How much the height changes from clump to clump: 0 keeps every patch the same height,\r\n * higher values give taller and shorter patches. Blade layers only.\r\n */\r\n get clumpHeightVariation() {\r\n return this._bladeShape[9];\r\n }\r\n set clumpHeightVariation(val: number) {\r\n this.setShape(9, Math.min(1, Math.max(0, val)));\r\n }\r\n /**\r\n * How much the blades of a clump gather toward its center: 0 spreads them evenly, 1 bunches\r\n * them into tufts. Blade layers only.\r\n */\r\n get clumpPull() {\r\n return this._bladeShape[10];\r\n }\r\n set clumpPull(val: number) {\r\n this.setShape(10, Math.min(1, Math.max(0, val)));\r\n }\r\n /**\r\n * How much the blades of a clump lean the same way: 0 lets each blade face its own random way,\r\n * 1 combs the whole patch in one direction. Blade layers only.\r\n */\r\n get clumpSameDirection() {\r\n return this._bladeShape[11];\r\n }\r\n set clumpSameDirection(val: number) {\r\n this.setShape(11, Math.min(1, Math.max(0, val)));\r\n }\r\n /**\r\n * How much the blades lean out from the center of their clump, so each patch splays open like a\r\n * tuft. Blade layers only.\r\n */\r\n get clumpFaceAway() {\r\n return this._bladeShape[12];\r\n }\r\n set clumpFaceAway(val: number) {\r\n this.setShape(12, Math.min(1, Math.max(0, val)));\r\n }\r\n /**\r\n * How much the brightness changes from clump to clump, giving the field a patchy look.\r\n * Blade layers only.\r\n */\r\n get clumpColorVariation() {\r\n return this.bladeMaterial?.clumpColorVariation ?? 0;\r\n }\r\n set clumpColorVariation(val: number) {\r\n const material = this.bladeMaterial;\r\n if (material) {\r\n material.clumpColorVariation = val;\r\n }\r\n }\r\n /**\r\n * Optional color texture of the blades: V runs from the root (0) to the tip (1), U picks a\r\n * column per clump. Replaces the root and tip colors when set. Blade layers only.\r\n */\r\n get colorMap(): Nullable<Texture2D> {\r\n return this.bladeMaterial?.colorMap ?? null;\r\n }\r\n set colorMap(val: Nullable<Texture2D>) {\r\n const material = this.bladeMaterial;\r\n if (material) {\r\n material.colorMap = val;\r\n }\r\n }\r\n /**\r\n * How much the ambient light darkens toward the root, where the neighboring blades hide the\r\n * sky: 0 lights the whole blade evenly, 1 leaves the root black. Blade layers only.\r\n */\r\n get rootOcclusion() {\r\n return this.bladeMaterial?.rootOcclusion ?? 0;\r\n }\r\n set rootOcclusion(val: number) {\r\n const material = this.bladeMaterial;\r\n if (material) {\r\n material.rootOcclusion = val;\r\n }\r\n }\r\n /**\r\n * How much the blades narrow toward the tip: 0 keeps them wide to the end, 1 narrows them evenly\r\n * to a point. Blade layers only.\r\n */\r\n get taper() {\r\n return this.bladeMaterial?.taper ?? 0;\r\n }\r\n set taper(val: number) {\r\n const material = this.bladeMaterial;\r\n if (material) {\r\n material.taper = val;\r\n }\r\n }\r\n /**\r\n * Spends more of each blade's vertices near the tip, where it curves most. 1 spaces them\r\n * evenly; higher values give smoother drooping tips. Blade layers only.\r\n */\r\n get tipDetail() {\r\n return this.bladeMaterial?.tipDetail ?? 1;\r\n }\r\n set tipDetail(val: number) {\r\n const material = this.bladeMaterial;\r\n if (material) {\r\n material.tipDetail = val;\r\n }\r\n }\r\n /**\r\n * How much the blade normals tilt outward across the width, so flat blades shade as if\r\n * curved. 0 shades them flat. Blade layers only.\r\n */\r\n get roundness() {\r\n return this.bladeMaterial?.roundness ?? 0;\r\n }\r\n set roundness(val: number) {\r\n const material = this.bladeMaterial;\r\n if (material) {\r\n material.roundness = val;\r\n }\r\n }\r\n /**\r\n * How much blades seen edge-on widen toward the viewer, keeping fields full from low\r\n * angles. 0 disables it. Blade layers only.\r\n */\r\n get viewThickening() {\r\n return this.bladeMaterial?.viewThickening ?? 0;\r\n }\r\n set viewThickening(val: number) {\r\n const material = this.bladeMaterial;\r\n if (material) {\r\n material.viewThickening = val;\r\n }\r\n }\r\n /**\r\n * Distance at which the blades start shading as one surface per clump, which calms the\r\n * glitter of distant fields. Blade layers only.\r\n */\r\n get farNormalStart() {\r\n return this.bladeMaterial?.farNormalStart ?? 0;\r\n }\r\n set farNormalStart(val: number) {\r\n const material = this.bladeMaterial;\r\n if (material) {\r\n material.farNormalStart = val;\r\n }\r\n }\r\n /**\r\n * Distance beyond which the blades shade fully as one surface per clump. Blade layers only.\r\n */\r\n get farNormalEnd() {\r\n return this.bladeMaterial?.farNormalEnd ?? 0;\r\n }\r\n set farNormalEnd(val: number) {\r\n const material = this.bladeMaterial;\r\n if (material) {\r\n material.farNormalEnd = val;\r\n }\r\n }\r\n /**\r\n * How dull the highlights of distant blades get, reached at the far normal end distance. Blade layers only.\r\n */\r\n get farRoughness() {\r\n return this.bladeMaterial?.farRoughness ?? 0;\r\n }\r\n set farRoughness(val: number) {\r\n const material = this.bladeMaterial;\r\n if (material) {\r\n material.farRoughness = val;\r\n }\r\n }\r\n /**\r\n * Minimum width of a blade on screen, in pixels: distant blades are widened to it instead of\r\n * thinning below a pixel, which makes them flicker. Larger values calm the flicker more but make\r\n * distant fields look thicker. 0 disables it. Blade layers only.\r\n */\r\n get minScreenWidth() {\r\n return this.bladeMaterial?.minScreenWidth ?? 0;\r\n }\r\n set minScreenWidth(val: number) {\r\n const material = this.bladeMaterial;\r\n if (material) {\r\n material.minScreenWidth = val;\r\n }\r\n }\r\n /**\r\n * How much the wind turns the blades to lean downwind, per unit of wind push: 0 keeps their own\r\n * directions, higher values comb the field along the wind. Blade layers only.\r\n */\r\n get windFacing() {\r\n return this._bladeShape[13];\r\n }\r\n set windFacing(val: number) {\r\n this.setShape(13, Math.min(4, Math.max(0, val)));\r\n }\r\n /**\r\n * How far the wind lays the blades over, per unit of wind push: 0 leaves them standing, higher\r\n * values flatten them in strong gusts.\r\n */\r\n get windLean() {\r\n return this._material.get()!.windLean;\r\n }\r\n set windLean(val: number) {\r\n this._material.get()!.windLean = val;\r\n }\r\n /** How far the blade tips bob in the wind, as a fraction of their height per unit of wind push */\r\n get swayAmplitude() {\r\n return this._material.get()!.swayAmplitude;\r\n }\r\n set swayAmplitude(val: number) {\r\n const material = this._material.get()!;\r\n material.swayAmplitude = val;\r\n this.setShape(14, material.swayAmplitude);\r\n }\r\n /**\r\n * Distance from the camera at which blades switch to their low detail level: a quarter as many\r\n * blades, each four times as wide and with fewer vertices, blending in over the last quarter of this\r\n * distance. 0 keeps every blade at high detail up to the draw distance. Blade layers only.\r\n */\r\n get lodDistance() {\r\n return this._bladeShape[15];\r\n }\r\n set lodDistance(val: number) {\r\n val = Math.max(0, Number(val) || 0);\r\n this.setShape(15, val);\r\n const material = this.bladeMaterial;\r\n if (material) {\r\n material.lodDistance = val;\r\n }\r\n }\r\n /** How fast the blades bob in the wind, in radians per second */\r\n get swaySpeed() {\r\n return this._material.get()!.swaySpeed;\r\n }\r\n set swaySpeed(val: number) {\r\n this._material.get()!.swaySpeed = val;\r\n }\r\n /** Color at the root of the blades. Blade layers only. */\r\n get rootColor(): Vector4 {\r\n return this.bladeMaterial?.rootColor ?? Vector4.one();\r\n }\r\n set rootColor(val: Vector4) {\r\n const material = this.bladeMaterial;\r\n if (material) {\r\n material.rootColor = val;\r\n }\r\n }\r\n /** Color at the tip of the blades. Blade layers only. */\r\n get tipColor(): Vector4 {\r\n return this.bladeMaterial?.tipColor ?? Vector4.one();\r\n }\r\n set tipColor(val: Vector4) {\r\n const material = this.bladeMaterial;\r\n if (material) {\r\n material.tipColor = val;\r\n }\r\n }\r\n /**\r\n * Color of the light the blades let through when lit from behind, strongest at the tips, so a\r\n * field glows against a low sun. Black lets no light through. Blade layers only.\r\n */\r\n get transmissionColor(): Vector4 {\r\n return this.bladeMaterial?.transmissionColor ?? Vector4.zero();\r\n }\r\n set transmissionColor(val: Vector4) {\r\n const material = this.bladeMaterial;\r\n if (material) {\r\n material.transmissionColor = val;\r\n }\r\n }\r\n /**\r\n * How many grass blades are currently generated in this layer.\r\n *\r\n * Only counts the CPU placement path. Where blades are placed on the GPU (WebGPU) they are\r\n * generated around the camera every frame and this stays 0.\r\n */\r\n get numBlades() {\r\n return this._numBlades;\r\n }\r\n /**\r\n * Density map of this layer, one byte per texel (0 = no grass, 255 = full density).\r\n * Texel (x, z) covers the normalized terrain region [x/w..(x+1)/w, z/h..(z+1)/h].\r\n * After modifying the data, call {@link GrassLayer.updateDensityRegion} to\r\n * regenerate the affected blade instances.\r\n */\r\n get densityMap() {\r\n return this._densityMap;\r\n }\r\n /** Width of the density map in texels */\r\n get densityMapWidth() {\r\n return this._densityWidth;\r\n }\r\n /** Height of the density map in texels */\r\n get densityMapHeight() {\r\n return this._densityHeight;\r\n }\r\n /**\r\n * Number of placement cells per density map texel along each axis.\r\n * The maximum blade count per texel is the square of this value.\r\n */\r\n get cellsPerTexel() {\r\n return this._cellsPerTexel;\r\n }\r\n set cellsPerTexel(val: number) {\r\n val = Math.max(1, Math.min(MAX_CELLS_PER_TEXEL, val | 0));\r\n if (val !== this._cellsPerTexel) {\r\n this._cellsPerTexel = val;\r\n this.rebuild();\r\n }\r\n }\r\n /**\r\n * Replaces the density map and regenerates all blade instances\r\n * @param width - Density map width in texels\r\n * @param height - Density map height in texels\r\n * @param cellsPerTexel - Placement cells per texel along each axis\r\n * @param data - Density data, one byte per texel\r\n */\r\n setDensityData(width: number, height: number, cellsPerTexel: number, data: Uint8Array) {\r\n if (width < 1 || height < 1 || width * height !== data.length) {\r\n console.error('Invalid grass density data');\r\n return;\r\n }\r\n this._densityWidth = width;\r\n this._densityHeight = height;\r\n this._cellsPerTexel = Math.max(1, Math.min(MAX_CELLS_PER_TEXEL, cellsPerTexel | 0));\r\n this._densityMap = data;\r\n this.rebuild();\r\n }\r\n /**\r\n * Regenerates blade instances for all tiles overlapping a density map region\r\n * @param minTexelX - Minimum x texel of the region (inclusive)\r\n * @param minTexelZ - Minimum z texel of the region (inclusive)\r\n * @param maxTexelX - Maximum x texel of the region (exclusive)\r\n * @param maxTexelZ - Maximum z texel of the region (exclusive)\r\n */\r\n updateDensityRegion(minTexelX: number, minTexelZ: number, maxTexelX: number, maxTexelZ: number) {\r\n if (this._kind === 'blade' && !this._gpu) {\r\n return;\r\n }\r\n if (this._gpu) {\r\n this._gpu.updateDensityRegion(\r\n this._densityMap,\r\n this._densityWidth,\r\n Math.max(0, minTexelX),\r\n Math.max(0, minTexelZ),\r\n Math.min(this._densityWidth, maxTexelX),\r\n Math.min(this._densityHeight, maxTexelZ)\r\n );\r\n return;\r\n }\r\n const k = this._cellsPerTexel;\r\n // expand by one texel to cover the bilinear sampling footprint\r\n const cx0 = Math.max(0, (minTexelX - 1) * k);\r\n const cz0 = Math.max(0, (minTexelZ - 1) * k);\r\n const cx1 = Math.min(this._densityWidth * k, (maxTexelX + 1) * k);\r\n const cz1 = Math.min(this._densityHeight * k, (maxTexelZ + 1) * k);\r\n if (cx1 <= cx0 || cz1 <= cz0) {\r\n return;\r\n }\r\n const tx0 = Math.floor(cx0 / TILE_CELLS);\r\n const tz0 = Math.floor(cz0 / TILE_CELLS);\r\n const tx1 = Math.min(this._tilesX, Math.ceil(cx1 / TILE_CELLS));\r\n const tz1 = Math.min(this._tilesZ, Math.ceil(cz1 / TILE_CELLS));\r\n for (let tz = tz0; tz < tz1; tz++) {\r\n for (let tx = tx0; tx < tx1; tx++) {\r\n this.generateTile(tx, tz);\r\n }\r\n }\r\n }\r\n /**\r\n * Regenerates blade instances for the entire layer\r\n */\r\n rebuild() {\r\n for (const tile of this._tiles.values()) {\r\n tile.dispose();\r\n }\r\n this._tiles.clear();\r\n this._numBlades = 0;\r\n this.updateTileGrid();\r\n if (this._gpu) {\r\n this._gpu.setDensity(this._densityWidth, this._densityHeight, this._densityMap);\r\n return;\r\n }\r\n if (this._kind === 'blade') {\r\n return;\r\n }\r\n for (let tz = 0; tz < this._tilesZ; tz++) {\r\n for (let tx = 0; tx < this._tilesX; tx++) {\r\n this.generateTile(tx, tz);\r\n }\r\n }\r\n }\r\n /** Grass blade width in this layer */\r\n get bladeWidth() {\r\n return this._bladeWidth;\r\n }\r\n set bladeWidth(val: number) {\r\n this.setBladeSize(val, this._bladeHeight);\r\n }\r\n /** Grass blade height in this layer */\r\n get bladeHeight() {\r\n return this._bladeHeight;\r\n }\r\n set bladeHeight(val: number) {\r\n this.setBladeSize(this._bladeWidth, val);\r\n }\r\n /**\r\n * Sets the size of grass blades in this layer\r\n * @param width - Grass blade width\r\n * @param height - Grass blade height\r\n */\r\n setBladeSize(width: number, height: number) {\r\n if (width !== this._bladeWidth || height !== this._bladeHeight) {\r\n this._bladeWidth = width;\r\n this._bladeHeight = height;\r\n if (this._kind === 'blade') {\r\n this._bladeShape[0] = height;\r\n this._bladeShape[2] = width;\r\n return;\r\n }\r\n this._baseVertexBuffer.set(this.createBaseVertexBuffer(this._bladeWidth, this._bladeHeight));\r\n for (const tile of this._tiles.values()) {\r\n tile.setBaseVertexBuffer(this._baseVertexBuffer.get()!);\r\n }\r\n this._gpu?.setBaseVertexBuffer(this._baseVertexBuffer.get()!);\r\n }\r\n }\r\n /** @internal */\r\n private updateTileGrid() {\r\n this._tilesX = Math.ceil((this._densityWidth * this._cellsPerTexel) / TILE_CELLS);\r\n this._tilesZ = Math.ceil((this._densityHeight * this._cellsPerTexel) / TILE_CELLS);\r\n }\r\n /** @internal */\r\n private sampleDensity(u: number, v: number): number {\r\n const w = this._densityWidth;\r\n const h = this._densityHeight;\r\n const x = u * w - 0.5;\r\n const z = v * h - 0.5;\r\n const ix = Math.floor(x);\r\n const iz = Math.floor(z);\r\n const fx = x - ix;\r\n const fz = z - iz;\r\n const x0 = Math.min(Math.max(ix, 0), w - 1);\r\n const x1 = Math.min(Math.max(ix + 1, 0), w - 1);\r\n const z0 = Math.min(Math.max(iz, 0), h - 1);\r\n const z1 = Math.min(Math.max(iz + 1, 0), h - 1);\r\n const d = this._densityMap;\r\n const a = d[z0 * w + x0] + (d[z0 * w + x1] - d[z0 * w + x0]) * fx;\r\n const b = d[z1 * w + x0] + (d[z1 * w + x1] - d[z1 * w + x0]) * fx;\r\n return (a + (b - a) * fz) * (1 / 255);\r\n }\r\n /** @internal */\r\n private regionIsEmpty(cx0: number, cz0: number, cx1: number, cz1: number): boolean {\r\n const k = this._cellsPerTexel;\r\n const x0 = Math.max(0, Math.floor(cx0 / k) - 1);\r\n const z0 = Math.max(0, Math.floor(cz0 / k) - 1);\r\n const x1 = Math.min(this._densityWidth, Math.ceil(cx1 / k) + 1);\r\n const z1 = Math.min(this._densityHeight, Math.ceil(cz1 / k) + 1);\r\n for (let z = z0; z < z1; z++) {\r\n const rowBase = z * this._densityWidth;\r\n for (let x = x0; x < x1; x++) {\r\n if (this._densityMap[rowBase + x] !== 0) {\r\n return false;\r\n }\r\n }\r\n }\r\n return true;\r\n }\r\n /** @internal */\r\n private generateTile(tx: number, tz: number) {\r\n const k = this._cellsPerTexel;\r\n const cw = this._densityWidth * k;\r\n const ch = this._densityHeight * k;\r\n const cx0 = tx * TILE_CELLS;\r\n const cz0 = tz * TILE_CELLS;\r\n const cx1 = Math.min(cx0 + TILE_CELLS, cw);\r\n const cz1 = Math.min(cz0 + TILE_CELLS, ch);\r\n const key = tz * this._tilesX + tx;\r\n let tile = this._tiles.get(key);\r\n // fast path: nothing to generate if there is no tile yet and no density\r\n if (!tile && this.regionIsEmpty(cx0, cz0, cx1, cz1)) {\r\n return;\r\n }\r\n const data = GrassLayer._instanceData;\r\n const seed = this._seed * 4;\r\n let count = 0;\r\n for (let cz = cz0; cz < cz1; cz++) {\r\n for (let cx = cx0; cx < cx1; cx++) {\r\n const u = (cx + grassHash(cx, cz, seed)) / cw;\r\n const v = (cz + grassHash(cx, cz, seed + 1)) / ch;\r\n if (this.sampleDensity(u, v) > grassHash(cx, cz, seed + 2)) {\r\n const angle = grassHash(cx, cz, seed + 3) * Math.PI * 2;\r\n data[count * 4 + 0] = u;\r\n data[count * 4 + 1] = v;\r\n data[count * 4 + 2] = angle;\r\n // Density LOD hash, see ClipmapGrassMaterial\r\n data[count * 4 + 3] = grassHash(cx, cz, seed + 4);\r\n count++;\r\n }\r\n }\r\n }\r\n this._numBlades += count - (tile?.numInstances ?? 0);\r\n if (count === 0) {\r\n if (tile) {\r\n tile.dispose();\r\n this._tiles.delete(key);\r\n }\r\n } else {\r\n if (!tile) {\r\n tile = new GrassInstances(this._baseVertexBuffer.get()!, GrassLayer._getIndexBuffer()!);\r\n this._tiles.set(key, tile);\r\n }\r\n tile.setData(data, count);\r\n }\r\n }\r\n /** @internal */\r\n private static _getIndexBuffer() {\r\n if (!this._indexBuffer.get()) {\r\n this._indexBuffer.set(\r\n getDevice().createIndexBuffer(\r\n new Uint16Array([0, 1, 2, 0, 2, 3, 4, 5, 6, 4, 6, 7, 8, 9, 10, 8, 10, 11])\r\n )\r\n );\r\n }\r\n return this._indexBuffer.get();\r\n }\r\n /** @internal */\r\n private static _getBladeIndexBuffer() {\r\n if (!this._bladeIndexBuffer.get()) {\r\n this._bladeIndexBuffer.set(getDevice().createIndexBuffer(createBladeIndices()));\r\n }\r\n return this._bladeIndexBuffer.get();\r\n }\r\n /**\r\n * Procedural blades read nothing from their vertex buffer, but a draw still needs a vertex\r\n * layout, which one vertex establishes\r\n * @internal\r\n */\r\n private static _getBladeVertexBuffer() {\r\n if (!this._bladeVertexBuffer.get()) {\r\n this._bladeVertexBuffer.set(getDevice().createVertexBuffer('position_f32x3', new Float32Array(3))!);\r\n }\r\n return this._bladeVertexBuffer.get();\r\n }\r\n /** @internal */\r\n private createBaseVertexBuffer(bladeWidth: number, bladeHeight: number) {\r\n const device = getDevice();\r\n const r = bladeWidth * 0.5;\r\n const t = bladeHeight;\r\n const c = r * Math.cos(Math.PI / 3);\r\n const s = r * Math.sin(Math.PI / 3);\r\n const vertices = new Float32Array([\r\n r,\r\n 0,\r\n 0,\r\n 0,\r\n 1,\r\n r,\r\n t,\r\n 0,\r\n 0,\r\n 0,\r\n -r,\r\n t,\r\n 0,\r\n 1,\r\n 0,\r\n -r,\r\n 0,\r\n 0,\r\n 1,\r\n 1,\r\n\r\n c,\r\n 0,\r\n s,\r\n 0,\r\n 1,\r\n -c,\r\n 0,\r\n -s,\r\n 1,\r\n 1,\r\n -c,\r\n t,\r\n -s,\r\n 1,\r\n 0,\r\n c,\r\n t,\r\n s,\r\n 0,\r\n 0,\r\n\r\n -c,\r\n 0,\r\n s,\r\n 0,\r\n 1,\r\n c,\r\n 0,\r\n -s,\r\n 1,\r\n 1,\r\n c,\r\n t,\r\n -s,\r\n 1,\r\n 0,\r\n -c,\r\n t,\r\n s,\r\n 0,\r\n 0\r\n ]);\r\n return device.createInterleavedVertexBuffer(['position_f32x3', 'tex0_f32x2'], vertices);\r\n }\r\n /**\r\n * Places the blades seen from a camera on the GPU path; nothing to do on the CPU one.\r\n * @param shadowCullPlanes - For each shadow map the blades cast shadows into, the planes\r\n * bounding where its casters can be (see GrassRenderer); blade layers only\r\n * @param shadowFade - View depths over which the shadow casting blades thin out\r\n * @internal\r\n */\r\n updatePerCamera(\r\n camera: Camera,\r\n terrain: ClipmapTerrain,\r\n occlusionMode: GrassOcclusionMode,\r\n shadowCullPlanes: Float32Array<ArrayBuffer>[],\r\n shadowFade: Nullable<[number, number]>\r\n ) {\r\n if (!this._gpu) {\r\n return;\r\n }\r\n const wind = terrain.scene?.env.wind.shaderParams ?? null;\r\n const place = (\r\n target: number,\r\n mode: GrassOcclusionMode,\r\n planes: Nullable<Float32Array<ArrayBuffer>>,\r\n fade: Nullable<[number, number]>\r\n ) =>\r\n this._gpu!.generate(\r\n camera,\r\n terrain,\r\n this._seed,\r\n this._cellsPerTexel,\r\n this._drawDistance,\r\n this._bladeWidth,\r\n this._bladeHeight,\r\n mode,\r\n this._farDensity,\r\n this._bladeShape,\r\n wind,\r\n target,\r\n planes,\r\n fade\r\n );\r\n place(0, occlusionMode, null, null);\r\n // Target i + 1 holds the casters of shadow map i. Blades hidden behind the terrain from the\r\n // camera still cast shadows, so these skip the occlusion culling.\r\n const numShadowTargets = this._kind === 'blade' ? shadowCullPlanes.length : 0;\r\n for (let i = 0; i < numShadowTargets; i++) {\r\n place(i + 1, GrassOcclusionMode.Off, shadowCullPlanes[i], shadowFade);\r\n }\r\n this._gpu.trimTargets(numShadowTargets + 1);\r\n this._numShadowTargets = numShadowTargets;\r\n }\r\n /**\r\n * Draws the shadow casters of the shadow map the blades were placed for by the last\r\n * updatePerCamera() call\r\n * @param shadowMap - Index of the shadow map\r\n * @internal\r\n */\r\n drawShadow(ctx: DrawContext, shadowMap: number) {\r\n if (shadowMap < this._numShadowTargets) {\r\n this.drawGpu(ctx, shadowMap + 1);\r\n }\r\n }\r\n /** @internal */\r\n setOcclusionDebug(val: boolean) {\r\n this._material.get()!.occlusionDebug = val;\r\n }\r\n /** @internal */\r\n draw(ctx: DrawContext, region: Vector4, minY: number, maxY: number) {\r\n if (this._kind === 'blade' && !this._gpu) {\r\n return;\r\n }\r\n if (this._gpu) {\r\n this.drawGpu(ctx, 0);\r\n return;\r\n }\r\n const wind = ctx.scene?.env.wind ?? null;\r\n const visible = GrassLayer._visibleTiles;\r\n visible.length = 0;\r\n const camera = ctx.camera;\r\n const cullAABB = GrassLayer._cullAABB;\r\n const cellsW = this._densityWidth * this._cellsPerTexel;\r\n const cellsH = this._densityHeight * this._cellsPerTexel;\r\n const rx = region.x;\r\n const rz = region.y;\r\n const rw = region.z - region.x;\r\n const rh = region.w - region.y;\r\n const cameraPos = camera.getWorldPosition(GrassLayer._cameraPos);\r\n const maxDistSq = this._drawDistance > 0 ? this._drawDistance * this._drawDistance : Infinity;\r\n // The wind can lay the cards over by up to their height\r\n const windPad = wind && wind.strength > 0 ? this._bladeHeight : 0;\r\n for (const [key, tile] of this._tiles) {\r\n const tx = key % this._tilesX;\r\n const tz = (key - tx) / this._tilesX;\r\n const u0 = (tx * TILE_CELLS) / cellsW;\r\n const v0 = (tz * TILE_CELLS) / cellsH;\r\n const u1 = Math.min(1, ((tx + 1) * TILE_CELLS) / cellsW);\r\n const v1 = Math.min(1, ((tz + 1) * TILE_CELLS) / cellsH);\r\n cullAABB.minPoint.setXYZ(rx + u0 * rw - windPad, minY, rz + v0 * rh - windPad);\r\n cullAABB.maxPoint.setXYZ(rx + u1 * rw + windPad, maxY, rz + v1 * rh + windPad);\r\n if (distanceSqToAABB(cameraPos.x, cameraPos.y, cameraPos.z, cullAABB) > maxDistSq) {\r\n continue;\r\n }\r\n const clipState = camera.clipMask\r\n ? cullAABB.getClipStateWithFrustumMask(camera.frustum, camera.clipMask)\r\n : cullAABB.getClipStateWithFrustum(camera.frustum);\r\n if (clipState !== ClipState.NOT_CLIPPED) {\r\n visible.push(tile);\r\n }\r\n }\r\n if (visible.length === 0) {\r\n return;\r\n }\r\n const material = this._material.get()! as ClipmapGrassMaterial;\r\n material.prepareDraw(wind);\r\n material.apply(ctx);\r\n for (let pass = 0; pass < material.numPasses; pass++) {\r\n material.bind(ctx.device, pass);\r\n for (const tile of visible) {\r\n tile.draw();\r\n }\r\n }\r\n visible.length = 0;\r\n }\r\n /** Draws the blades placed on the GPU into a target, see GrassGpuPlacement */\r\n private drawGpu(ctx: DrawContext, target: number) {\r\n // From the scene, not ctx.env: the depth pass clears ctx.env, and the depth prepass and the\r\n // light pass must bend the grass by the same wind or the light pass's equal depth test\r\n // rejects it\r\n const wind = ctx.scene?.env.wind ?? null;\r\n const gpu = this._gpu!;\r\n const material = this._material.get()!;\r\n if (material instanceof ClipmapBladeGrassMaterial) {\r\n const instances = gpu.getInstanceBuffer(target);\r\n if (!instances) {\r\n return;\r\n }\r\n material.setInstanceBuffer(instances, gpu.getLowListBase(target));\r\n // The camera the blades were placed for, also in the shadow map passes\r\n material.prepareDraw(\r\n ctx.camera,\r\n wind,\r\n ctx.renderPass!.type === RENDER_PASS_TYPE_SHADOWMAP ? 0 : ctx.renderHeight\r\n );\r\n } else {\r\n material.prepareDraw(wind);\r\n }\r\n material.apply(ctx);\r\n for (let pass = 0; pass < material.numPasses; pass++) {\r\n material.bind(ctx.device, pass);\r\n gpu.draw(target);\r\n }\r\n }\r\n /** @internal */\r\n protected onDispose() {\r\n super.onDispose();\r\n this._material.dispose();\r\n for (const tile of this._tiles.values()) {\r\n tile.dispose();\r\n }\r\n this._tiles.clear();\r\n this._baseVertexBuffer.dispose();\r\n this._gpu?.dispose();\r\n }\r\n}\r\n/**\r\n * Grass renderer for clipmap terrain\r\n * @public\r\n */\r\nexport class GrassRenderer extends Disposable {\r\n private static readonly _lightDir = new Vector3();\r\n private static readonly _forward = new Vector3();\r\n private static readonly _eye = new Vector3();\r\n private static readonly _center = new Vector3();\r\n private static readonly _tmp = new Vector3();\r\n private static readonly _edge0 = new Vector3();\r\n private static readonly _edge1 = new Vector3();\r\n private static readonly _normal = new Vector3();\r\n private static readonly _corners = Array.from({ length: 8 }, () => new Vector3());\r\n private static readonly _faceDots = [0, 0, 0, 0, 0, 0];\r\n private static readonly _facePlane = new Float32Array(4);\r\n private static readonly _shadowCullPlanes: Float32Array<ArrayBuffer>[] = [];\r\n private readonly _terrain: DWeakRef<ClipmapTerrain>;\r\n private _layers: GrassLayer[];\r\n private _occlusionCulling: boolean;\r\n private _occlusionDebug: boolean;\r\n private _suspendOcclusionCulling: boolean;\r\n private _castShadow: boolean;\r\n private _shadowFadeFraction: number;\r\n /** View depths over which the blades casting shadows thin out, see calcShadowCullPlanes */\r\n private _shadowFade: Nullable<[number, number]>;\r\n /** The light whose shadow map casters the blades were last placed for */\r\n private readonly _shadowLight: DWeakRef<DirectionalLight>;\r\n /**\r\n * Creates an instance of GrassRenderer\r\n * @param terrain - Clipmap terrain object\r\n */\r\n constructor(terrain: ClipmapTerrain) {\r\n super();\r\n this._terrain = new DWeakRef(terrain);\r\n this._layers = [];\r\n this._occlusionCulling = true;\r\n this._occlusionDebug = false;\r\n this._suspendOcclusionCulling = false;\r\n this._castShadow = true;\r\n this._shadowFadeFraction = 0.5;\r\n this._shadowFade = null;\r\n this._shadowLight = new DWeakRef();\r\n }\r\n /**\r\n * Whether to skip grass hidden behind the terrain itself (WebGPU only).\r\n *\r\n * Tested against the terrain height field every frame, so it never culls grass that is\r\n * visible, but it does not see occluders other than the terrain.\r\n */\r\n get occlusionCulling() {\r\n return this._occlusionCulling;\r\n }\r\n set occlusionCulling(val: boolean) {\r\n this._occlusionCulling = !!val;\r\n }\r\n /**\r\n * Draws the grass the terrain occlusion culling would skip in red instead of skipping it\r\n */\r\n get occlusionDebug() {\r\n return this._occlusionDebug;\r\n }\r\n set occlusionDebug(val: boolean) {\r\n this._occlusionDebug = !!val;\r\n for (const layer of this._layers) {\r\n layer.setOcclusionDebug(this._occlusionDebug);\r\n }\r\n }\r\n /**\r\n * Pauses the terrain occlusion culling while the height map is being edited, since the\r\n * height pyramid it relies on is only rebuilt afterwards.\r\n * @internal\r\n */\r\n get suspendOcclusionCulling() {\r\n return this._suspendOcclusionCulling;\r\n }\r\n set suspendOcclusionCulling(val: boolean) {\r\n this._suspendOcclusionCulling = !!val;\r\n }\r\n /** @internal */\r\n updateMaterial() {\r\n for (const layer of this._layers) {\r\n layer.updateMaterial();\r\n }\r\n }\r\n /**\r\n * Whether procedural blades cast shadows from the sun into the nearest cascades of its shadow\r\n * map (WebGPU only). Also needs the terrain to cast shadows.\r\n */\r\n get castShadow() {\r\n return this._castShadow;\r\n }\r\n set castShadow(val: boolean) {\r\n this._castShadow = !!val;\r\n }\r\n /**\r\n * Fraction of the last shadow cascade the blades cast shadows into over which their shadows\r\n * fade out toward its far end, blade by blade. 0 ends them on a line at the far end.\r\n */\r\n get shadowFadeFraction() {\r\n return this._shadowFadeFraction;\r\n }\r\n set shadowFadeFraction(val: number) {\r\n this._shadowFadeFraction = Math.min(1, Math.max(0, Number(val) || 0));\r\n }\r\n /** @internal */\r\n updatePerCamera(camera: Camera) {\r\n const terrain = this._terrain.get();\r\n if (terrain) {\r\n const mode =\r\n !this._occlusionCulling || this._suspendOcclusionCulling\r\n ? GrassOcclusionMode.Off\r\n : this._occlusionDebug\r\n ? GrassOcclusionMode.Debug\r\n : GrassOcclusionMode.Cull;\r\n const shadowCullPlanes = this.calcShadowCullPlanes(camera, terrain);\r\n for (const layer of this._layers) {\r\n layer.updatePerCamera(camera, terrain, mode, shadowCullPlanes, this._shadowFade);\r\n }\r\n }\r\n }\r\n /**\r\n * Culling planes of the blades casting shadows into each of the nearest cascades of the sun's\r\n * shadow map, and remembers the sun as the light the blades were placed for.\r\n */\r\n private calcShadowCullPlanes(camera: Camera, terrain: ClipmapTerrain): Float32Array<ArrayBuffer>[] {\r\n this._shadowLight.set(null);\r\n this._shadowFade = null;\r\n const scene = terrain.scene;\r\n const sun = scene ? DirectionalLight.getSunLight(scene) : null;\r\n if (\r\n !this._castShadow ||\r\n !terrain.castShadow ||\r\n !sun ||\r\n !sun.castShadow ||\r\n !GrassGpuPlacement.isSupported() ||\r\n !this._layers.some((layer) => layer.kind === 'blade')\r\n ) {\r\n return [];\r\n }\r\n this._shadowLight.set(sun);\r\n const distances = sun.shadow.getCascadeDistances(camera);\r\n const numCascades = Math.min(GRASS_SHADOW_CASCADES, distances.length - 1);\r\n // The blades thin out over the far part of the last cascade they cast shadows into, so the\r\n // shadowed ground does not end on a line at its far split\r\n const fadeEnd = distances[numCascades];\r\n const fadeStart = fadeEnd - (fadeEnd - distances[numCascades - 1]) * this._shadowFadeFraction;\r\n this._shadowFade = fadeEnd > fadeStart ? [fadeStart, fadeEnd] : null;\r\n // Direction the light travels in\r\n const lightDir = GrassRenderer._lightDir;\r\n lightDir.set(sun.directionAndCutoff.xyz());\r\n lightDir.inplaceNormalize();\r\n const m = camera.worldMatrix;\r\n // Camera forward, the view axis the split distances are measured along\r\n const forward = GrassRenderer._forward.setXYZ(-m.m02, -m.m12, -m.m22).inplaceNormalize();\r\n const eye = camera.getWorldPosition(GrassRenderer._eye);\r\n const perspective = camera.isPerspective();\r\n const nearCorners = camera.frustum.corners;\r\n const corners = GrassRenderer._corners;\r\n const center = GrassRenderer._center;\r\n const tmp = GrassRenderer._tmp;\r\n const result: Float32Array<ArrayBuffer>[] = [];\r\n for (let i = 0; i < numCascades; i++) {\r\n // Corners of the slice, indexed as the frustum corners: x << 2 | y << 1 | far. Each lies on\r\n // the ray through the matching near plane corner, at the split distance along the view axis.\r\n center.setXYZ(0, 0, 0);\r\n for (let c = 0; c < 8; c++) {\r\n const near = nearCorners[c & 6];\r\n const d = distances[i + (c & 1)];\r\n Vector3.sub(near, eye, tmp);\r\n const depth = Vector3.dot(tmp, forward);\r\n if (perspective) {\r\n Vector3.add(eye, Vector3.scale(tmp, d / depth, tmp), corners[c]);\r\n } else {\r\n Vector3.add(near, Vector3.scale(forward, d - depth, tmp), corners[c]);\r\n }\r\n Vector3.add(center, corners[c], center);\r\n }\r\n center.scaleBy(1 / 8);\r\n // Faces of the slice: the four corners sharing one bit, normals pointing inward\r\n const faceDots = GrassRenderer._faceDots;\r\n const planes = (GrassRenderer._shadowCullPlanes[i] ??= new Float32Array(GRASS_CULL_PLANES * 4));\r\n let numPlanes = 0;\r\n const addPlane = (a: Vector3, b: Vector3, c: Vector3) => {\r\n if (numPlanes < GRASS_CULL_PLANES) {\r\n if (GrassRenderer.planeThrough(a, b, c, center, planes, numPlanes * 4)) {\r\n numPlanes++;\r\n }\r\n }\r\n };\r\n for (let face = 0; face < 6; face++) {\r\n const bit = 1 << (face >> 1);\r\n const side = face & 1 ? bit : 0;\r\n const others = [0, 1, 2, 3].map((k) => {\r\n // The two free bits of the face, in order\r\n const free = [1, 2, 4].filter((b) => b !== bit);\r\n return side | (k & 1 ? free[0] : 0) | (k & 2 ? free[1] : 0);\r\n });\r\n GrassRenderer.planeThrough(\r\n corners[others[0]],\r\n corners[others[1]],\r\n corners[others[3]],\r\n center,\r\n GrassRenderer._facePlane,\r\n 0\r\n );\r\n const facePlane = GrassRenderer._facePlane;\r\n faceDots[face] = facePlane[0] * lightDir.x + facePlane[1] * lightDir.y + facePlane[2] * lightDir.z;\r\n // Faces the light travels away from, or along, bound the swept slice\r\n if (faceDots[face] <= 0 && numPlanes < GRASS_CULL_PLANES) {\r\n planes.set(facePlane, numPlanes * 4);\r\n numPlanes++;\r\n }\r\n }\r\n // Silhouette edges: shared by a face kept and a face dropped. Two faces are adjacent when\r\n // they fix different corner bits; their edge is the two corners with both bits fixed.\r\n for (let fa = 0; fa < 6; fa++) {\r\n for (let fb = fa + 1; fb < 6; fb++) {\r\n const bitA = 1 << (fa >> 1);\r\n const bitB = 1 << (fb >> 1);\r\n const keptA = faceDots[fa] <= 0;\r\n const keptB = faceDots[fb] <= 0;\r\n if (bitA === bitB || keptA === keptB) {\r\n continue;\r\n }\r\n const fixed = (fa & 1 ? bitA : 0) | (fb & 1 ? bitB : 0);\r\n const freeBit = 7 & ~bitA & ~bitB;\r\n const a = corners[fixed];\r\n const b = corners[fixed | freeBit];\r\n // The third point extends the edge along the light, scaled by the edge length for\r\n Vector3.add(a, Vector3.scale(lightDir, Vector3.distance(a, b), tmp), tmp);\r\n addPlane(a, b, tmp);\r\n }\r\n }\r\n // The rest are planes everything is inside of\r\n for (let k = numPlanes; k < GRASS_CULL_PLANES; k++) {\r\n planes.set([0, 0, 0, 1e30], k * 4);\r\n }\r\n result.push(planes);\r\n }\r\n return result;\r\n }\r\n /**\r\n * Writes the plane through three points, normal turned toward an inside point, as (a, b, c, d)\r\n * at an offset of an array\r\n * @returns false if the points are degenerate\r\n */\r\n private static planeThrough(\r\n p0: Vector3,\r\n p1: Vector3,\r\n p2: Vector3,\r\n inside: Vector3,\r\n out: Float32Array,\r\n offset: number\r\n ) {\r\n const e0 = Vector3.sub(p1, p0, GrassRenderer._edge0);\r\n const e1 = Vector3.sub(p2, p0, GrassRenderer._edge1);\r\n const n = Vector3.cross(e0, e1, GrassRenderer._normal);\r\n const len = n.magnitude;\r\n if (len < 1e-12) {\r\n return false;\r\n }\r\n n.scaleBy(1 / len);\r\n let d = -Vector3.dot(n, p0);\r\n if (Vector3.dot(n, inside) + d < 0) {\r\n n.scaleBy(-1);\r\n d = -d;\r\n }\r\n out[offset] = n.x;\r\n out[offset + 1] = n.y;\r\n out[offset + 2] = n.z;\r\n out[offset + 3] = d;\r\n return true;\r\n }\r\n /** How many grass blades */\r\n get numGrassBlades() {\r\n return this._layers.reduce((sum, layer) => sum + layer.numBlades, 0);\r\n }\r\n /** How many grass layers */\r\n get numLayers() {\r\n return this._layers.length;\r\n }\r\n /**\r\n * Gets the grass layer at given index\r\n * @param index - Index of the grass layer\r\n * @returns The grass layer at the index\r\n */\r\n getLayer(index: number) {\r\n return this._layers[index];\r\n }\r\n /**\r\n * Adds a grass layer\r\n * @param bladeWidth - Width of grass blades in this layer\r\n * @param bladeHeight - Height of grass blades in this layer\r\n * @param albedoMap - Albedo texture of grass blades in this layer, card layers only\r\n * @param kind - Textured cards (default), or procedural blades drawn on WebGPU only\r\n * @returns Index of the added grass layer\r\n */\r\n addLayer(\r\n bladeWidth: number,\r\n bladeHeight: number,\r\n albedoMap?: Nullable<Texture2D>,\r\n kind: GrassLayerKind = 'card'\r\n ) {\r\n const layer = new GrassLayer(\r\n this._terrain.get()!,\r\n this._layers.length,\r\n bladeWidth,\r\n bladeHeight,\r\n albedoMap,\r\n kind\r\n );\r\n layer.setOcclusionDebug(this._occlusionDebug);\r\n this._layers.push(layer);\r\n return this._layers.length - 1;\r\n }\r\n /**\r\n * Gets the albedo texture of grass blades in the grass layer at given index\r\n * @param layer - Index of the grass layer to get\r\n * @returns Albedo texture of grass blades in the grass layer\r\n */\r\n getGrassTexture(layer: number) {\r\n return this._layers[layer]?.getAlbedoMap() ?? null;\r\n }\r\n /**\r\n * Sets the albedo texture of grass blades in the grass layer at given index\r\n * @param layer - Index of the grass layer to set\r\n * @param texture - Albedo texture to set\r\n */\r\n setGrassTexture(layer: number, texture: Texture2D) {\r\n const grassLayer = this._layers[layer];\r\n if (grassLayer) {\r\n grassLayer.setAlbedoMap(texture);\r\n } else {\r\n console.error(`Invalid grass layer: ${layer}`);\r\n }\r\n }\r\n /**\r\n * Gets the draw distance of the grass layer at given index\r\n * @param layer - Index of the grass layer\r\n * @returns Distance from the camera beyond which the layer is not drawn, 0 for unlimited\r\n */\r\n getDrawDistance(layer: number) {\r\n return this._layers[layer]?.drawDistance ?? 0;\r\n }\r\n /**\r\n * Sets the draw distance of the grass layer at given index\r\n * @param layer - Index of the grass layer\r\n * @param distance - Distance from the camera beyond which the layer is not drawn, 0 for unlimited\r\n */\r\n setDrawDistance(layer: number, distance: number) {\r\n const grassLayer = this._layers[layer];\r\n if (grassLayer) {\r\n grassLayer.drawDistance = distance;\r\n } else {\r\n console.error(`Invalid grass layer: ${layer}`);\r\n }\r\n }\r\n /**\r\n * Gets the fraction of blades kept at the draw distance for the grass layer at given index\r\n * @param layer - Index of the grass layer\r\n * @returns Fraction of blades drawn at the draw distance, see GrassLayer.farDensity\r\n */\r\n getFarDensity(layer: number) {\r\n return this._layers[layer]?.farDensity ?? 1;\r\n }\r\n /**\r\n * Sets the fraction of blades kept at the draw distance for the grass layer at given index\r\n * @param layer - Index of the grass layer\r\n * @param farDensity - Fraction of blades drawn at the draw distance, see GrassLayer.farDensity\r\n */\r\n setFarDensity(layer: number, farDensity: number) {\r\n const grassLayer = this._layers[layer];\r\n if (grassLayer) {\r\n grassLayer.farDensity = farDensity;\r\n } else {\r\n console.error(`Invalid grass layer: ${layer}`);\r\n }\r\n }\r\n /**\r\n * Gets width of the grass blades in the grass layer at given index\r\n * @param layer - Index of the grass layer\r\n * @returns Width of the grass blades in the layer\r\n */\r\n getBladeWidth(layer: number) {\r\n return this._layers[layer]?.bladeWidth ?? 0;\r\n }\r\n /**\r\n * Gets height of the grass blades in the grass layer at given index\r\n * @param layer - Index of the grass layer\r\n * @returns Height of the grass blades in the layer\r\n */\r\n getBladeHeight(layer: number) {\r\n return this._layers[layer]?.bladeHeight ?? 0;\r\n }\r\n /**\r\n * Sets size of the grass blades in the grass layer at given index\r\n * @param layer - Index of the grass layer\r\n * @param width - Width to set\r\n * @param height - Height to set\r\n */\r\n setBladeSize(layer: number, width: number, height: number) {\r\n const grassLayer = this._layers[layer];\r\n if (grassLayer) {\r\n grassLayer.setBladeSize(width, height);\r\n } else {\r\n console.error(`Invalid grass layer: ${layer}`);\r\n }\r\n }\r\n /** @internal */\r\n draw(ctx: DrawContext) {\r\n if (ctx.renderPass!.type === RENDER_PASS_TYPE_SHADOWMAP) {\r\n // Only into the cascades of the light the blades were placed for\r\n const light = (ctx.renderPass as ShadowMapPass).light;\r\n if (light && light === this._shadowLight.get()) {\r\n const cascade = ctx.shadowMapInfo?.get(light)?.cascadeIndex ?? 0;\r\n for (const layer of this._layers) {\r\n layer.drawShadow(ctx, cascade);\r\n }\r\n }\r\n return;\r\n }\r\n const bv = this._terrain.get()!.getWorldBoundingVolume()!.toAABB();\r\n const minY = bv.minPoint.y;\r\n const maxY = bv.maxPoint.y;\r\n for (const layer of this._layers) {\r\n layer.draw(ctx, this._terrain.get()!.worldRegion, minY - layer.bladeHeight, maxY + layer.bladeHeight);\r\n }\r\n }\r\n protected onDispose() {\r\n super.onDispose();\r\n this._terrain.dispose();\r\n this._shadowLight.dispose();\r\n for (const layer of this._layers) {\r\n layer.dispose();\r\n }\r\n }\r\n}\r\n"],"names":["INSTANCE_BYTES","TILE_CELLS","DEFAULT_CELLS_PER_TEXEL","MAX_CELLS_PER_TEXEL","DEFAULT_DRAW_DISTANCE","DEFAULT_FAR_DENSITY","GRASS_SHADOW_CASCADES","DEFAULT_BLADE_SHAPE","DEFAULT_BLADE_WIDTH","DEFAULT_BLADE_HEIGHT","distanceSqToAABB","x","y","z","aabb","dx","Math","max","minPoint","maxPoint","dy","dz","GrassInstances","Disposable","_numInstances","_baseVertexBuffer","_indexBuffer","_instanceBuffer","_primitive","baseVertexBuffer","indexBuffer","DRef","numInstances","setBaseVertexBuffer","get","set","dispose","setData","data","count","device","getDevice","bytesRequired","buffer","byteLength","createVertexBuffer","Uint8Array","nextPowerOf2","bufferSubData","subarray","draw","primitive","Primitive","setVertexBuffer","setIndexBuffer","primitiveType","indexStart","indexCount","length","drawInstanced","onDispose","GrassLayer","_bladeIndexBuffer","_bladeVertexBuffer","_cullAABB","AABB","_cameraPos","Vector3","_visibleTiles","_instanceData","Float32Array","_kind","_material","_bladeShape","_seed","_bladeWidth","_bladeHeight","_densityWidth","_densityHeight","_cellsPerTexel","_densityMap","_tiles","_tilesX","_tilesZ","_numBlades","_drawDistance","_farDensity","terrain","seed","bladeWidth","bladeHeight","albedoMap","kind","material","ClipmapBladeGrassMaterial","colorMap","ClipmapGrassMaterial","albedoTexture","setTextureSize","width","height","createBaseVertexBuffer","sizeX","sizeZ","Map","_numShadowTargets","GrassGpuPlacement","isSupported","_gpu","warnUnsupported","_getBladeVertexBuffer","_getBladeIndexBuffer","BLADE_LOD_INDEX_COUNTS","_getIndexBuffer","bladeMaterial","lodDistance","setDensity","drawDistance","farDensity","updateTileGrid","val","Number","setDrawDistance","min","setFarDensity","updateMaterial","uniformChanged","setAlbedoMap","getAlbedoMap","setShape","index","value","isFinite","heightRandomness","widthRandomness","tilt","tiltRandomness","bend","bendRandomness","clumpSize","clumpHeightVariation","clumpPull","clumpSameDirection","clumpFaceAway","clumpColorVariation","rootOcclusion","taper","tipDetail","roundness","viewThickening","farNormalStart","farNormalEnd","farRoughness","minScreenWidth","windFacing","windLean","swayAmplitude","swaySpeed","rootColor","Vector4","one","tipColor","transmissionColor","zero","numBlades","densityMap","densityMapWidth","densityMapHeight","cellsPerTexel","rebuild","setDensityData","console","error","updateDensityRegion","minTexelX","minTexelZ","maxTexelX","maxTexelZ","k","cx0","cz0","cx1","cz1","tx0","floor","tz0","tx1","ceil","tz1","tz","tx","generateTile","tile","values","clear","setBladeSize","sampleDensity","u","v","w","h","ix","iz","fx","fz","x0","x1","z0","z1","d","a","b","regionIsEmpty","rowBase","cw","ch","key","cz","cx","grassHash","angle","PI","delete","createIndexBuffer","Uint16Array","createBladeIndices","r","t","c","cos","s","sin","vertices","createInterleavedVertexBuffer","updatePerCamera","camera","occlusionMode","shadowCullPlanes","shadowFade","wind","scene","env","shaderParams","place","target","mode","planes","fade","generate","numShadowTargets","i","GrassOcclusionMode","Off","trimTargets","drawShadow","ctx","shadowMap","drawGpu","setOcclusionDebug","occlusionDebug","region","minY","maxY","visible","cullAABB","cellsW","cellsH","rx","rz","rw","rh","cameraPos","getWorldPosition","maxDistSq","Infinity","windPad","strength","u0","v0","u1","v1","setXYZ","clipState","clipMask","getClipStateWithFrustumMask","frustum","getClipStateWithFrustum","ClipState","NOT_CLIPPED","push","prepareDraw","apply","pass","numPasses","bind","gpu","instances","getInstanceBuffer","setInstanceBuffer","getLowListBase","renderPass","type","RENDER_PASS_TYPE_SHADOWMAP","renderHeight","GrassRenderer","_lightDir","_forward","_eye","_center","_tmp","_edge0","_edge1","_normal","_corners","Array","from","_faceDots","_facePlane","_shadowCullPlanes","_terrain","_layers","_occlusionCulling","_occlusionDebug","_suspendOcclusionCulling","_castShadow","_shadowFadeFraction","DWeakRef","_shadowFade","_shadowLight","occlusionCulling","layer","suspendOcclusionCulling","castShadow","shadowFadeFraction","Debug","Cull","calcShadowCullPlanes","sun","DirectionalLight","getSunLight","some","distances","shadow","getCascadeDistances","numCascades","fadeEnd","fadeStart","lightDir","directionAndCutoff","xyz","inplaceNormalize","m","worldMatrix","forward","m02","m12","m22","eye","perspective","isPerspective","nearCorners","corners","center","tmp","result","near","sub","depth","dot","add","scale","scaleBy","faceDots","GRASS_CULL_PLANES","numPlanes","addPlane","planeThrough","face","bit","side","others","map","free","filter","facePlane","fa","fb","bitA","bitB","keptA","keptB","fixed","freeBit","distance","p0","p1","p2","inside","out","offset","e0","e1","n","cross","len","magnitude","numGrassBlades","reduce","sum","numLayers","getLayer","addLayer","getGrassTexture","setGrassTexture","texture","grassLayer","getDrawDistance","getFarDensity","getBladeWidth","getBladeHeight","light","cascade","shadowMapInfo","cascadeIndex","bv","getWorldBoundingVolume","toAABB","worldRegion"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAgBA,MAAMA,iBAAiB,CAAI,GAAA,CAAA;AAC3B,iEACA,MAAMC,UAAa,GAAA,EAAA;AACnB,+EACA,MAAMC,uBAA0B,GAAA,CAAA;AAChC,MAAMC,mBAAsB,GAAA,CAAA;AAC5B,wEACA,MAAMC,qBAAwB,GAAA,GAAA;AAC9B,4DACA,MAAMC,mBAAsB,GAAA,IAAA;AAC5B;;;AAGC,IACD,MAAMC,qBAAwB,GAAA,CAAA;AAC9B,4EACA,MAAMC,mBAAsB,GAAA;AAC1B,IAAA,GAAA;AAAK,IAAA,GAAA;AAAK,IAAA,IAAA;AAAM,IAAA,GAAA;AAAK,IAAA,IAAA;AAAM,IAAA,GAAA;AAAK,IAAA,IAAA;AAAM,IAAA,GAAA;AAAK,IAAA,GAAA;AAAK,IAAA,IAAA;AAAM,IAAA,GAAA;AAAK,IAAA,GAAA;AAAK,IAAA,GAAA;AAAK,IAAA,GAAA;AAAK,IAAA,IAAA;AAAM,IAAA;AACjF,CAAA;AACD;;;IAIaC,MAAAA,mBAAAA,GAAsB;AACnC;;;IAIaC,MAAAA,oBAAAA,GAAuB;AAEpC,SAASC,iBAAiBC,CAAS,EAAEC,CAAS,EAAEC,CAAS,EAAEC,IAAU,EAAA;AACnE,IAAA,MAAMC,EAAKC,GAAAA,IAAAA,CAAKC,GAAG,CAACH,KAAKI,QAAQ,CAACP,CAAC,GAAGA,GAAG,CAAGA,EAAAA,CAAAA,GAAIG,IAAKK,CAAAA,QAAQ,CAACR,CAAC,CAAA;AAC/D,IAAA,MAAMS,EAAKJ,GAAAA,IAAAA,CAAKC,GAAG,CAACH,KAAKI,QAAQ,CAACN,CAAC,GAAGA,GAAG,CAAGA,EAAAA,CAAAA,GAAIE,IAAKK,CAAAA,QAAQ,CAACP,CAAC,CAAA;AAC/D,IAAA,MAAMS,EAAKL,GAAAA,IAAAA,CAAKC,GAAG,CAACH,KAAKI,QAAQ,CAACL,CAAC,GAAGA,GAAG,CAAGA,EAAAA,CAAAA,GAAIC,IAAKK,CAAAA,QAAQ,CAACN,CAAC,CAAA;AAC/D,IAAA,OAAOE,EAAKA,GAAAA,EAAAA,GAAKK,EAAKA,GAAAA,EAAAA,GAAKC,EAAKA,GAAAA,EAAAA;AAClC;AAEA;;;IAIO,MAAMC,cAAuBC,SAAAA,UAAAA,CAAAA;IAC1BC,aAAsB;IACbC,iBAA0C;IAC1CC,YAAgC;IAChCC,eAAwC;IACxCC,UAA4B;IAC7C,WAAYC,CAAAA,gBAAkC,EAAEC,WAAwB,CAAE;QACxE,KAAK,EAAA;QACL,IAAI,CAACN,aAAa,GAAG,CAAA;AACrB,QAAA,IAAI,CAACC,iBAAiB,GAAG,IAAIM,IAAKF,CAAAA,gBAAAA,CAAAA;AAClC,QAAA,IAAI,CAACH,YAAY,GAAG,IAAIK,IAAKD,CAAAA,WAAAA,CAAAA;QAC7B,IAAI,CAACH,eAAe,GAAG,IAAII,IAAAA,EAAAA;QAC3B,IAAI,CAACH,UAAU,GAAG,IAAIG,IAAAA,EAAAA;AACxB;AACA,IAAA,IAAIC,YAAe,GAAA;QACjB,OAAO,IAAI,CAACR,aAAa;AAC3B;AACAS,IAAAA,mBAAAA,CAAoBJ,gBAAkC,EAAE;AACtD,QAAA,IAAIA,qBAAqB,IAAI,CAACJ,iBAAiB,CAACS,GAAG,EAAI,EAAA;AACrD,YAAA,IAAI,CAACT,iBAAiB,CAACU,GAAG,CAACN,gBAAAA,CAAAA;YAC3B,IAAI,CAACD,UAAU,CAACQ,OAAO,EAAA;AACzB;AACF;AACA;;AAEC,MACDC,OAAQC,CAAAA,IAA+B,EAAEC,KAAa,EAAE;QACtD,IAAI,CAACf,aAAa,GAAGe,KAAAA;AACrB,QAAA,IAAIA,UAAU,CAAG,EAAA;AACf,YAAA;AACF;AACA,QAAA,MAAMC,MAASC,GAAAA,SAAAA,EAAAA;AACf,QAAA,MAAMC,gBAAgBH,KAAQvC,GAAAA,cAAAA;AAC9B,QAAA,IAAI2C,MAAS,GAAA,IAAI,CAAChB,eAAe,CAACO,GAAG,EAAA;AACrC,QAAA,IAAI,CAACS,MAAAA,IAAUA,MAAOC,CAAAA,UAAU,GAAGF,aAAe,EAAA;AAChDC,YAAAA,MAAAA,GAASH,OAAOK,kBAAkB,CAAC,YAAc,EAAA,IAAIC,WAAWC,YAAaL,CAAAA,aAAAA,CAAAA,CAAAA,CAAAA;AAC7E,YAAA,IAAI,CAACf,eAAe,CAACQ,GAAG,CAACQ,MAAAA,CAAAA;YACzB,IAAI,CAACf,UAAU,CAACQ,OAAO,EAAA;AACzB;AACAO,QAAAA,MAAAA,CAAOK,aAAa,CAAC,CAAA,EAAGV,KAAKW,QAAQ,CAAC,GAAGV,KAAQ,GAAA,CAAA,CAAA,CAAA;AACnD;IACAW,IAAO,GAAA;AACL,QAAA,IAAI,IAAI,CAAC1B,aAAa,GAAG,CAAG,EAAA;AAC1B,YAAA,IAAI,CAAC,IAAI,CAACI,UAAU,CAACM,GAAG,EAAI,EAAA;AAC1B,gBAAA,MAAMiB,YAAY,IAAIC,SAAAA,EAAAA;AACtBD,gBAAAA,SAAAA,CAAUE,eAAe,CAAC,IAAI,CAAC5B,iBAAiB,CAACS,GAAG,EAAA,CAAA;AACpDiB,gBAAAA,SAAAA,CAAUE,eAAe,CAAC,IAAI,CAAC1B,eAAe,CAACO,GAAG,EAAK,EAAA,UAAA,CAAA;AACvDiB,gBAAAA,SAAAA,CAAUG,cAAc,CAAC,IAAI,CAAC5B,YAAY,CAACQ,GAAG,EAAA,CAAA;AAC9CiB,gBAAAA,SAAAA,CAAUI,aAAa,GAAG,eAAA;AAC1BJ,gBAAAA,SAAAA,CAAUK,UAAU,GAAG,CAAA;gBACvBL,SAAUM,CAAAA,UAAU,GAAG,IAAI,CAAC/B,YAAY,CAACQ,GAAG,GAAIwB,MAAM;AACtD,gBAAA,IAAI,CAAC9B,UAAU,CAACO,GAAG,CAACgB,SAAAA,CAAAA;AACtB;YACA,IAAI,CAACvB,UAAU,CAACM,GAAG,GAAIyB,aAAa,CAAC,IAAI,CAACnC,aAAa,CAAA;AACzD;AACF;IACUoC,SAAY,GAAA;AACpB,QAAA,KAAK,CAACA,SAAAA,EAAAA;QACN,IAAI,CAACnC,iBAAiB,CAACW,OAAO,EAAA;QAC9B,IAAI,CAACV,YAAY,CAACU,OAAO,EAAA;QACzB,IAAI,CAACT,eAAe,CAACS,OAAO,EAAA;QAC5B,IAAI,CAACR,UAAU,CAACQ,OAAO,EAAA;AACzB;AACF;AAEA;;;;IAKO,MAAMyB,UAAmBtC,SAAAA,UAAAA,CAAAA;IAC9B,OAAwBG,YAAAA,GAAkC,IAAIK,IAAO,EAAA;IACrE,OAAwB+B,iBAAAA,GAAuC,IAAI/B,IAAO,EAAA;IAC1E,OAAwBgC,kBAAAA,GAA6C,IAAIhC,IAAO,EAAA;IAChF,OAAwBiC,SAAAA,GAAY,IAAIC,IAAO,EAAA;IAC/C,OAAwBC,UAAAA,GAAa,IAAIC,OAAU,EAAA;IACnD,OAAwBC,aAAAA,GAAkC,EAAE;AAC5D,IAAA,OAAwBC,aAAgB,GAAA,IAAIC,YAAarE,CAAAA,UAAAA,GAAaA,aAAa,CAAG,CAAA;IACrEsE,KAAsB;IACtBC,SAAkE;IAClEC,WAA6B;IAC7BC,KAAc;IACvBC,WAAoB;IACpBC,YAAqB;IACZnD,iBAA0C;IACnDoD,aAAsB;IACtBC,cAAuB;IACvBC,cAAuB;IACvBC,WAAwB;IACfC,MAAoC;IAC7CC,OAAgB;IAChBC,OAAgB;IAChBC,UAAmB;IACnBC,aAAsB;IACtBC,WAAoB;kGAE5B,IAAmD;+FAEnD,iBAAkC;AAClC;;;;;;;;AAQC,MACD,WACEC,CAAAA,OAAuB,EACvBC,IAAY,EACZC,UAAkB,EAClBC,WAAmB,EACnBC,SAA+B,EAC/BC,IAAAA,GAAuB,MAAM,CAC7B;QACA,KAAK,EAAA;QACL,IAAI,CAACrB,KAAK,GAAGqB,IAAAA;AACb,QAAA,IAAI,CAACnB,WAAW,GAAG,IAAIH,YAAa/D,CAAAA,mBAAAA,CAAAA;AACpC,QAAA,IAAIqF,SAAS,OAAS,EAAA;YACpB,MAAMC,QAAAA,GAAW,IAAIC,yBAA0BP,CAAAA,OAAAA,CAAAA;YAC/CM,QAASE,CAAAA,QAAQ,GAAGJ,SAAa,IAAA,IAAA;AACjC,YAAA,IAAI,CAACnB,SAAS,GAAG,IAAIzC,IAAK8D,CAAAA,QAAAA,CAAAA;SACrB,MAAA;YACL,MAAMA,QAAAA,GAAW,IAAIG,oBAAqBT,CAAAA,OAAAA,CAAAA;YAC1CM,QAASI,CAAAA,aAAa,GAAGN,SAAa,IAAA,IAAA;AACtC,YAAA,IAAIA,SAAW,EAAA;AACbE,gBAAAA,QAAAA,CAASK,cAAc,CAACP,SAAAA,CAAUQ,KAAK,EAAER,UAAUS,MAAM,CAAA;AAC3D;AACA,YAAA,IAAI,CAAC5B,SAAS,GAAG,IAAIzC,IAAK8D,CAAAA,QAAAA,CAAAA;AAC5B;QACA,IAAI,CAACnB,KAAK,GAAGc,IAAAA;QACb,IAAI,CAACb,WAAW,GAAGc,UAAAA;QACnB,IAAI,CAACb,YAAY,GAAGc,WAAAA;AACpB,QAAA,IAAI,CAACjE,iBAAiB,GAAG,IAAIM,KAAK,IAAI,CAACsE,sBAAsB,CAAC,IAAI,CAAC1B,WAAW,EAAE,IAAI,CAACC,YAAY,CAAA,CAAA;QACjG,IAAI,CAACC,aAAa,GAAG7D,IAAAA,CAAKC,GAAG,CAAC,CAAA,EAAGsE,QAAQe,KAAK,CAAA;QAC9C,IAAI,CAACxB,cAAc,GAAG9D,IAAAA,CAAKC,GAAG,CAAC,CAAA,EAAGsE,QAAQgB,KAAK,CAAA;QAC/C,IAAI,CAACxB,cAAc,GAAG7E,uBAAAA;QACtB,IAAI,CAAC8E,WAAW,GAAG,IAAIlC,UAAAA,CAAW,IAAI,CAAC+B,aAAa,GAAG,IAAI,CAACC,cAAc,CAAA;QAC1E,IAAI,CAACG,MAAM,GAAG,IAAIuB,GAAAA,EAAAA;QAClB,IAAI,CAACtB,OAAO,GAAG,CAAA;QACf,IAAI,CAACC,OAAO,GAAG,CAAA;QACf,IAAI,CAACC,UAAU,GAAG,CAAA;QAClB,IAAI,CAACC,aAAa,GAAG,CAAA;QACrB,IAAI,CAACC,WAAW,GAAG,CAAA;QACnB,IAAI,CAACmB,iBAAiB,GAAG,CAAA;QACzB,IAAI,CAACC,iBAAkBC,CAAAA,WAAW,EAAI,EAAA;YACpC,IAAI,CAACC,IAAI,GAAG,IAAA;AACZ,YAAA,IAAIhB,SAAS,OAAS,EAAA;AACpBiB,gBAAAA,eAAAA,CACE,sDACA,2BACA,EAAA,4BAAA,CAAA;AAEJ;SACK,MAAA,IAAIjB,SAAS,OAAS,EAAA;YAC3B,IAAI,CAACgB,IAAI,GAAG,IAAIF,iBAAAA,CACd,OACA7C,EAAAA,UAAAA,CAAWiD,qBAAqB,EAAA,EAChCjD,UAAWkD,CAAAA,oBAAoB,EAC/BC,EAAAA,sBAAAA,CAAAA;SAEG,MAAA;AACL,YAAA,IAAI,CAACJ,IAAI,GAAG,IAAIF,iBAAkB,CAAA,MAAA,EAAQ,IAAI,CAACjF,iBAAiB,CAACS,GAAG,EAAA,EAAK2B,WAAWoD,eAAe,EAAA,CAAA;AACrG;AACA,QAAA,IAAIrB,SAAS,OAAS,EAAA;AACpB,YAAA,IAAI,CAACnB,WAAW,CAAC,CAAA,CAAE,GAAGiB,WAAAA;AACtB,YAAA,IAAI,CAACjB,WAAW,CAAC,CAAA,CAAE,GAAGgB,UAAAA;YACtB,IAAI,CAACyB,aAAa,CAAEC,WAAW,GAAG,IAAI,CAAC1C,WAAW,CAAC,EAAG,CAAA;AACxD;AACA,QAAA,IAAI,CAACmC,IAAI,EAAEQ,UAAAA,CAAW,IAAI,CAACvC,aAAa,EAAE,IAAI,CAACC,cAAc,EAAE,IAAI,CAACE,WAAW,CAAA;QAC/E,IAAI,CAACqC,YAAY,GAAGjH,qBAAAA;QACpB,IAAI,CAACkH,UAAU,GAAGjH,mBAAAA;AAClB,QAAA,IAAI,CAACkH,cAAc,EAAA;AACrB;AACA;;;AAGC,MACD,IAAIF,YAAe,GAAA;QACjB,OAAO,IAAI,CAAChC,aAAa;AAC3B;IACA,IAAIgC,YAAAA,CAAaG,GAAW,EAAE;AAC5BA,QAAAA,GAAAA,GAAMxG,IAAKC,CAAAA,GAAG,CAAC,CAAA,EAAGwG,OAAOD,GAAQ,CAAA,IAAA,CAAA,CAAA;AACjC,QAAA,IAAIA,GAAQ,KAAA,IAAI,CAACnC,aAAa,EAAE;YAC9B,IAAI,CAACA,aAAa,GAAGmC,GAAAA;AACrB,YAAA,IAAI,CAAChD,SAAS,CAACtC,GAAG,EAAA,CAAIwF,eAAe,CAACF,GAAAA,CAAAA;AACxC;AACF;AACA;;;;;;;;;AASC,MACD,IAAIF,UAAa,GAAA;QACf,OAAO,IAAI,CAAChC,WAAW;AACzB;IACA,IAAIgC,UAAAA,CAAWE,GAAW,EAAE;QAC1BA,GAAMxG,GAAAA,IAAAA,CAAK2G,GAAG,CAAC,CAAA,EAAG3G,KAAKC,GAAG,CAAC,IAAMwG,EAAAA,MAAAA,CAAOD,GAAQ,CAAA,IAAA,CAAA,CAAA,CAAA;AAChD,QAAA,IAAIA,GAAQ,KAAA,IAAI,CAAClC,WAAW,EAAE;YAC5B,IAAI,CAACA,WAAW,GAAGkC,GAAAA;AACnB,YAAA,IAAI,CAAChD,SAAS,CAACtC,GAAG,EAAA,CAAI0F,aAAa,CAACJ,GAAAA,CAAAA;AACtC;AACF;+DAEA,IAAI5B,IAAO,GAAA;QACT,OAAO,IAAI,CAACrB,KAAK;AACnB;AACA,qBACAsD,cAAiB,GAAA;AACf,QAAA,IAAI,CAACrD,SAAS,CAACtC,GAAG,GAAI4F,cAAc,EAAA;AACtC;AACA;;;;MAKAC,YAAAA,CAAapC,SAA8B,EAAE;AAC3C,QAAA,MAAME,QAAW,GAAA,IAAI,CAACrB,SAAS,CAACtC,GAAG,EAAA;AACnC,QAAA,IAAI2D,oBAAoBG,oBAAsB,EAAA;AAC5CH,YAAAA,QAAAA,CAASI,aAAa,GAAGN,SAAAA;AACzB,YAAA,IAAIA,SAAW,EAAA;AACbE,gBAAAA,QAAAA,CAASK,cAAc,CAACP,SAAAA,CAAUQ,KAAK,EAAER,UAAUS,MAAM,CAAA;AAC3D;SACK,MAAA;AACLP,YAAAA,QAAAA,CAASE,QAAQ,GAAGJ,SAAAA;AACtB;AACF;AACA;;;AAGC,MACDqC,YAAe,GAAA;AACb,QAAA,MAAMnC,QAAW,GAAA,IAAI,CAACrB,SAAS,CAACtC,GAAG,EAAA;AACnC,QAAA,OAAO2D,oBAAoBG,oBAAuBH,GAAAA,QAAAA,CAASI,aAAa,GAAGJ,SAASE,QAAQ;AAC9F;qBAEA,IAAYmB,aAAgB,GAAA;AAC1B,QAAA,MAAMrB,QAAW,GAAA,IAAI,CAACrB,SAAS,CAACtC,GAAG,EAAA;QACnC,OAAO2D,QAAAA,YAAoBC,4BAA4BD,QAAW,GAAA,IAAA;AACpE;AACA,qBACA,QAAQoC,CAASC,KAAa,EAAEC,KAAa,EAAE;QAC7C,IAAIV,MAAAA,CAAOW,QAAQ,CAACD,KAAQ,CAAA,EAAA;AAC1B,YAAA,IAAI,CAAC1D,WAAW,CAACyD,KAAAA,CAAM,GAAGC,KAAAA;AAC5B;AACF;AACA;;;AAGC,MACD,IAAIE,gBAAmB,GAAA;AACrB,QAAA,OAAO,IAAI,CAAC5D,WAAW,CAAC,CAAE,CAAA;AAC5B;IACA,IAAI4D,gBAAAA,CAAiBb,GAAW,EAAE;QAChC,IAAI,CAACS,QAAQ,CAAC,CAAGjH,EAAAA,IAAAA,CAAK2G,GAAG,CAAC,CAAG3G,EAAAA,IAAAA,CAAKC,GAAG,CAAC,CAAGuG,EAAAA,GAAAA,CAAAA,CAAAA,CAAAA;AAC3C;8GAEA,IAAIc,eAAkB,GAAA;AACpB,QAAA,OAAO,IAAI,CAAC7D,WAAW,CAAC,CAAE,CAAA;AAC5B;IACA,IAAI6D,eAAAA,CAAgBd,GAAW,EAAE;QAC/B,IAAI,CAACS,QAAQ,CAAC,CAAGjH,EAAAA,IAAAA,CAAK2G,GAAG,CAAC,CAAG3G,EAAAA,IAAAA,CAAKC,GAAG,CAAC,CAAGuG,EAAAA,GAAAA,CAAAA,CAAAA,CAAAA;AAC3C;AACA;;;AAGC,MACD,IAAIe,IAAO,GAAA;AACT,QAAA,OAAO,IAAI,CAAC9D,WAAW,CAAC,CAAE,CAAA;AAC5B;IACA,IAAI8D,IAAAA,CAAKf,GAAW,EAAE;QACpB,IAAI,CAACS,QAAQ,CAAC,CAAGjH,EAAAA,IAAAA,CAAK2G,GAAG,CAAC,CAAG3G,EAAAA,IAAAA,CAAKC,GAAG,CAAC,CAAGuG,EAAAA,GAAAA,CAAAA,CAAAA,CAAAA;AAC3C;4EAEA,IAAIgB,cAAiB,GAAA;AACnB,QAAA,OAAO,IAAI,CAAC/D,WAAW,CAAC,CAAE,CAAA;AAC5B;IACA,IAAI+D,cAAAA,CAAehB,GAAW,EAAE;QAC9B,IAAI,CAACS,QAAQ,CAAC,CAAGjH,EAAAA,IAAAA,CAAK2G,GAAG,CAAC,CAAG3G,EAAAA,IAAAA,CAAKC,GAAG,CAAC,CAAGuG,EAAAA,GAAAA,CAAAA,CAAAA,CAAAA;AAC3C;AACA;;;AAGC,MACD,IAAIiB,IAAO,GAAA;AACT,QAAA,OAAO,IAAI,CAAChE,WAAW,CAAC,CAAE,CAAA;AAC5B;IACA,IAAIgE,IAAAA,CAAKjB,GAAW,EAAE;AACpB,QAAA,IAAI,CAACS,QAAQ,CAAC,CAAA,EAAGjH,IAAK2G,CAAAA,GAAG,CAAC,CAAA,EAAG3G,IAAKC,CAAAA,GAAG,CAAC,EAAIuG,EAAAA,GAAAA,CAAAA,CAAAA,CAAAA;AAC5C;4EAEA,IAAIkB,cAAiB,GAAA;AACnB,QAAA,OAAO,IAAI,CAACjE,WAAW,CAAC,CAAE,CAAA;AAC5B;IACA,IAAIiE,cAAAA,CAAelB,GAAW,EAAE;QAC9B,IAAI,CAACS,QAAQ,CAAC,CAAGjH,EAAAA,IAAAA,CAAK2G,GAAG,CAAC,CAAG3G,EAAAA,IAAAA,CAAKC,GAAG,CAAC,CAAGuG,EAAAA,GAAAA,CAAAA,CAAAA,CAAAA;AAC3C;AACA;;;AAGC,MACD,IAAImB,SAAY,GAAA;AACd,QAAA,OAAO,IAAI,CAAClE,WAAW,CAAC,CAAE,CAAA;AAC5B;IACA,IAAIkE,SAAAA,CAAUnB,GAAW,EAAE;AACzB,QAAA,IAAI,CAACS,QAAQ,CAAC,GAAGjH,IAAKC,CAAAA,GAAG,CAAC,IAAMuG,EAAAA,GAAAA,CAAAA,CAAAA;AAClC;AACA;;;AAGC,MACD,IAAIoB,oBAAuB,GAAA;AACzB,QAAA,OAAO,IAAI,CAACnE,WAAW,CAAC,CAAE,CAAA;AAC5B;IACA,IAAImE,oBAAAA,CAAqBpB,GAAW,EAAE;QACpC,IAAI,CAACS,QAAQ,CAAC,CAAGjH,EAAAA,IAAAA,CAAK2G,GAAG,CAAC,CAAG3G,EAAAA,IAAAA,CAAKC,GAAG,CAAC,CAAGuG,EAAAA,GAAAA,CAAAA,CAAAA,CAAAA;AAC3C;AACA;;;AAGC,MACD,IAAIqB,SAAY,GAAA;AACd,QAAA,OAAO,IAAI,CAACpE,WAAW,CAAC,EAAG,CAAA;AAC7B;IACA,IAAIoE,SAAAA,CAAUrB,GAAW,EAAE;QACzB,IAAI,CAACS,QAAQ,CAAC,EAAIjH,EAAAA,IAAAA,CAAK2G,GAAG,CAAC,CAAG3G,EAAAA,IAAAA,CAAKC,GAAG,CAAC,CAAGuG,EAAAA,GAAAA,CAAAA,CAAAA,CAAAA;AAC5C;AACA;;;AAGC,MACD,IAAIsB,kBAAqB,GAAA;AACvB,QAAA,OAAO,IAAI,CAACrE,WAAW,CAAC,EAAG,CAAA;AAC7B;IACA,IAAIqE,kBAAAA,CAAmBtB,GAAW,EAAE;QAClC,IAAI,CAACS,QAAQ,CAAC,EAAIjH,EAAAA,IAAAA,CAAK2G,GAAG,CAAC,CAAG3G,EAAAA,IAAAA,CAAKC,GAAG,CAAC,CAAGuG,EAAAA,GAAAA,CAAAA,CAAAA,CAAAA;AAC5C;AACA;;;AAGC,MACD,IAAIuB,aAAgB,GAAA;AAClB,QAAA,OAAO,IAAI,CAACtE,WAAW,CAAC,EAAG,CAAA;AAC7B;IACA,IAAIsE,aAAAA,CAAcvB,GAAW,EAAE;QAC7B,IAAI,CAACS,QAAQ,CAAC,EAAIjH,EAAAA,IAAAA,CAAK2G,GAAG,CAAC,CAAG3G,EAAAA,IAAAA,CAAKC,GAAG,CAAC,CAAGuG,EAAAA,GAAAA,CAAAA,CAAAA,CAAAA;AAC5C;AACA;;;AAGC,MACD,IAAIwB,mBAAsB,GAAA;AACxB,QAAA,OAAO,IAAI,CAAC9B,aAAa,EAAE8B,mBAAuB,IAAA,CAAA;AACpD;IACA,IAAIA,mBAAAA,CAAoBxB,GAAW,EAAE;QACnC,MAAM3B,QAAAA,GAAW,IAAI,CAACqB,aAAa;AACnC,QAAA,IAAIrB,QAAU,EAAA;AACZA,YAAAA,QAAAA,CAASmD,mBAAmB,GAAGxB,GAAAA;AACjC;AACF;AACA;;;AAGC,MACD,IAAIzB,QAAgC,GAAA;AAClC,QAAA,OAAO,IAAI,CAACmB,aAAa,EAAEnB,QAAY,IAAA,IAAA;AACzC;IACA,IAAIA,QAAAA,CAASyB,GAAwB,EAAE;QACrC,MAAM3B,QAAAA,GAAW,IAAI,CAACqB,aAAa;AACnC,QAAA,IAAIrB,QAAU,EAAA;AACZA,YAAAA,QAAAA,CAASE,QAAQ,GAAGyB,GAAAA;AACtB;AACF;AACA;;;AAGC,MACD,IAAIyB,aAAgB,GAAA;AAClB,QAAA,OAAO,IAAI,CAAC/B,aAAa,EAAE+B,aAAiB,IAAA,CAAA;AAC9C;IACA,IAAIA,aAAAA,CAAczB,GAAW,EAAE;QAC7B,MAAM3B,QAAAA,GAAW,IAAI,CAACqB,aAAa;AACnC,QAAA,IAAIrB,QAAU,EAAA;AACZA,YAAAA,QAAAA,CAASoD,aAAa,GAAGzB,GAAAA;AAC3B;AACF;AACA;;;AAGC,MACD,IAAI0B,KAAQ,GAAA;AACV,QAAA,OAAO,IAAI,CAAChC,aAAa,EAAEgC,KAAS,IAAA,CAAA;AACtC;IACA,IAAIA,KAAAA,CAAM1B,GAAW,EAAE;QACrB,MAAM3B,QAAAA,GAAW,IAAI,CAACqB,aAAa;AACnC,QAAA,IAAIrB,QAAU,EAAA;AACZA,YAAAA,QAAAA,CAASqD,KAAK,GAAG1B,GAAAA;AACnB;AACF;AACA;;;AAGC,MACD,IAAI2B,SAAY,GAAA;AACd,QAAA,OAAO,IAAI,CAACjC,aAAa,EAAEiC,SAAa,IAAA,CAAA;AAC1C;IACA,IAAIA,SAAAA,CAAU3B,GAAW,EAAE;QACzB,MAAM3B,QAAAA,GAAW,IAAI,CAACqB,aAAa;AACnC,QAAA,IAAIrB,QAAU,EAAA;AACZA,YAAAA,QAAAA,CAASsD,SAAS,GAAG3B,GAAAA;AACvB;AACF;AACA;;;AAGC,MACD,IAAI4B,SAAY,GAAA;AACd,QAAA,OAAO,IAAI,CAAClC,aAAa,EAAEkC,SAAa,IAAA,CAAA;AAC1C;IACA,IAAIA,SAAAA,CAAU5B,GAAW,EAAE;QACzB,MAAM3B,QAAAA,GAAW,IAAI,CAACqB,aAAa;AACnC,QAAA,IAAIrB,QAAU,EAAA;AACZA,YAAAA,QAAAA,CAASuD,SAAS,GAAG5B,GAAAA;AACvB;AACF;AACA;;;AAGC,MACD,IAAI6B,cAAiB,GAAA;AACnB,QAAA,OAAO,IAAI,CAACnC,aAAa,EAAEmC,cAAkB,IAAA,CAAA;AAC/C;IACA,IAAIA,cAAAA,CAAe7B,GAAW,EAAE;QAC9B,MAAM3B,QAAAA,GAAW,IAAI,CAACqB,aAAa;AACnC,QAAA,IAAIrB,QAAU,EAAA;AACZA,YAAAA,QAAAA,CAASwD,cAAc,GAAG7B,GAAAA;AAC5B;AACF;AACA;;;AAGC,MACD,IAAI8B,cAAiB,GAAA;AACnB,QAAA,OAAO,IAAI,CAACpC,aAAa,EAAEoC,cAAkB,IAAA,CAAA;AAC/C;IACA,IAAIA,cAAAA,CAAe9B,GAAW,EAAE;QAC9B,MAAM3B,QAAAA,GAAW,IAAI,CAACqB,aAAa;AACnC,QAAA,IAAIrB,QAAU,EAAA;AACZA,YAAAA,QAAAA,CAASyD,cAAc,GAAG9B,GAAAA;AAC5B;AACF;AACA;;AAEC,MACD,IAAI+B,YAAe,GAAA;AACjB,QAAA,OAAO,IAAI,CAACrC,aAAa,EAAEqC,YAAgB,IAAA,CAAA;AAC7C;IACA,IAAIA,YAAAA,CAAa/B,GAAW,EAAE;QAC5B,MAAM3B,QAAAA,GAAW,IAAI,CAACqB,aAAa;AACnC,QAAA,IAAIrB,QAAU,EAAA;AACZA,YAAAA,QAAAA,CAAS0D,YAAY,GAAG/B,GAAAA;AAC1B;AACF;AACA;;AAEC,MACD,IAAIgC,YAAe,GAAA;AACjB,QAAA,OAAO,IAAI,CAACtC,aAAa,EAAEsC,YAAgB,IAAA,CAAA;AAC7C;IACA,IAAIA,YAAAA,CAAahC,GAAW,EAAE;QAC5B,MAAM3B,QAAAA,GAAW,IAAI,CAACqB,aAAa;AACnC,QAAA,IAAIrB,QAAU,EAAA;AACZA,YAAAA,QAAAA,CAAS2D,YAAY,GAAGhC,GAAAA;AAC1B;AACF;AACA;;;;AAIC,MACD,IAAIiC,cAAiB,GAAA;AACnB,QAAA,OAAO,IAAI,CAACvC,aAAa,EAAEuC,cAAkB,IAAA,CAAA;AAC/C;IACA,IAAIA,cAAAA,CAAejC,GAAW,EAAE;QAC9B,MAAM3B,QAAAA,GAAW,IAAI,CAACqB,aAAa;AACnC,QAAA,IAAIrB,QAAU,EAAA;AACZA,YAAAA,QAAAA,CAAS4D,cAAc,GAAGjC,GAAAA;AAC5B;AACF;AACA;;;AAGC,MACD,IAAIkC,UAAa,GAAA;AACf,QAAA,OAAO,IAAI,CAACjF,WAAW,CAAC,EAAG,CAAA;AAC7B;IACA,IAAIiF,UAAAA,CAAWlC,GAAW,EAAE;QAC1B,IAAI,CAACS,QAAQ,CAAC,EAAIjH,EAAAA,IAAAA,CAAK2G,GAAG,CAAC,CAAG3G,EAAAA,IAAAA,CAAKC,GAAG,CAAC,CAAGuG,EAAAA,GAAAA,CAAAA,CAAAA,CAAAA;AAC5C;AACA;;;AAGC,MACD,IAAImC,QAAW,GAAA;AACb,QAAA,OAAO,IAAI,CAACnF,SAAS,CAACtC,GAAG,GAAIyH,QAAQ;AACvC;IACA,IAAIA,QAAAA,CAASnC,GAAW,EAAE;AACxB,QAAA,IAAI,CAAChD,SAAS,CAACtC,GAAG,EAAA,CAAIyH,QAAQ,GAAGnC,GAAAA;AACnC;uGAEA,IAAIoC,aAAgB,GAAA;AAClB,QAAA,OAAO,IAAI,CAACpF,SAAS,CAACtC,GAAG,GAAI0H,aAAa;AAC5C;IACA,IAAIA,aAAAA,CAAcpC,GAAW,EAAE;AAC7B,QAAA,MAAM3B,QAAW,GAAA,IAAI,CAACrB,SAAS,CAACtC,GAAG,EAAA;AACnC2D,QAAAA,QAAAA,CAAS+D,aAAa,GAAGpC,GAAAA;AACzB,QAAA,IAAI,CAACS,QAAQ,CAAC,EAAA,EAAIpC,SAAS+D,aAAa,CAAA;AAC1C;AACA;;;;AAIC,MACD,IAAIzC,WAAc,GAAA;AAChB,QAAA,OAAO,IAAI,CAAC1C,WAAW,CAAC,EAAG,CAAA;AAC7B;IACA,IAAI0C,WAAAA,CAAYK,GAAW,EAAE;AAC3BA,QAAAA,GAAAA,GAAMxG,IAAKC,CAAAA,GAAG,CAAC,CAAA,EAAGwG,OAAOD,GAAQ,CAAA,IAAA,CAAA,CAAA;QACjC,IAAI,CAACS,QAAQ,CAAC,EAAIT,EAAAA,GAAAA,CAAAA;QAClB,MAAM3B,QAAAA,GAAW,IAAI,CAACqB,aAAa;AACnC,QAAA,IAAIrB,QAAU,EAAA;AACZA,YAAAA,QAAAA,CAASsB,WAAW,GAAGK,GAAAA;AACzB;AACF;sEAEA,IAAIqC,SAAY,GAAA;AACd,QAAA,OAAO,IAAI,CAACrF,SAAS,CAACtC,GAAG,GAAI2H,SAAS;AACxC;IACA,IAAIA,SAAAA,CAAUrC,GAAW,EAAE;AACzB,QAAA,IAAI,CAAChD,SAAS,CAACtC,GAAG,EAAA,CAAI2H,SAAS,GAAGrC,GAAAA;AACpC;+DAEA,IAAIsC,SAAqB,GAAA;AACvB,QAAA,OAAO,IAAI,CAAC5C,aAAa,EAAE4C,SAAAA,IAAaC,QAAQC,GAAG,EAAA;AACrD;IACA,IAAIF,SAAAA,CAAUtC,GAAY,EAAE;QAC1B,MAAM3B,QAAAA,GAAW,IAAI,CAACqB,aAAa;AACnC,QAAA,IAAIrB,QAAU,EAAA;AACZA,YAAAA,QAAAA,CAASiE,SAAS,GAAGtC,GAAAA;AACvB;AACF;8DAEA,IAAIyC,QAAoB,GAAA;AACtB,QAAA,OAAO,IAAI,CAAC/C,aAAa,EAAE+C,QAAAA,IAAYF,QAAQC,GAAG,EAAA;AACpD;IACA,IAAIC,QAAAA,CAASzC,GAAY,EAAE;QACzB,MAAM3B,QAAAA,GAAW,IAAI,CAACqB,aAAa;AACnC,QAAA,IAAIrB,QAAU,EAAA;AACZA,YAAAA,QAAAA,CAASoE,QAAQ,GAAGzC,GAAAA;AACtB;AACF;AACA;;;AAGC,MACD,IAAI0C,iBAA6B,GAAA;AAC/B,QAAA,OAAO,IAAI,CAAChD,aAAa,EAAEgD,iBAAAA,IAAqBH,QAAQI,IAAI,EAAA;AAC9D;IACA,IAAID,iBAAAA,CAAkB1C,GAAY,EAAE;QAClC,MAAM3B,QAAAA,GAAW,IAAI,CAACqB,aAAa;AACnC,QAAA,IAAIrB,QAAU,EAAA;AACZA,YAAAA,QAAAA,CAASqE,iBAAiB,GAAG1C,GAAAA;AAC/B;AACF;AACA;;;;;AAKC,MACD,IAAI4C,SAAY,GAAA;QACd,OAAO,IAAI,CAAChF,UAAU;AACxB;AACA;;;;;AAKC,MACD,IAAIiF,UAAa,GAAA;QACf,OAAO,IAAI,CAACrF,WAAW;AACzB;8CAEA,IAAIsF,eAAkB,GAAA;QACpB,OAAO,IAAI,CAACzF,aAAa;AAC3B;+CAEA,IAAI0F,gBAAmB,GAAA;QACrB,OAAO,IAAI,CAACzF,cAAc;AAC5B;AACA;;;AAGC,MACD,IAAI0F,aAAgB,GAAA;QAClB,OAAO,IAAI,CAACzF,cAAc;AAC5B;IACA,IAAIyF,aAAAA,CAAchD,GAAW,EAAE;QAC7BA,GAAMxG,GAAAA,IAAAA,CAAKC,GAAG,CAAC,CAAA,EAAGD,KAAK2G,GAAG,CAACxH,qBAAqBqH,GAAM,GAAA,CAAA,CAAA,CAAA;AACtD,QAAA,IAAIA,GAAQ,KAAA,IAAI,CAACzC,cAAc,EAAE;YAC/B,IAAI,CAACA,cAAc,GAAGyC,GAAAA;AACtB,YAAA,IAAI,CAACiD,OAAO,EAAA;AACd;AACF;AACA;;;;;;MAOAC,cAAAA,CAAevE,KAAa,EAAEC,MAAc,EAAEoE,aAAqB,EAAElI,IAAgB,EAAE;QACrF,IAAI6D,KAAAA,GAAQ,KAAKC,MAAS,GAAA,CAAA,IAAKD,QAAQC,MAAW9D,KAAAA,IAAAA,CAAKoB,MAAM,EAAE;AAC7DiH,YAAAA,OAAAA,CAAQC,KAAK,CAAC,4BAAA,CAAA;AACd,YAAA;AACF;QACA,IAAI,CAAC/F,aAAa,GAAGsB,KAAAA;QACrB,IAAI,CAACrB,cAAc,GAAGsB,MAAAA;QACtB,IAAI,CAACrB,cAAc,GAAG/D,IAAKC,CAAAA,GAAG,CAAC,CAAA,EAAGD,IAAK2G,CAAAA,GAAG,CAACxH,mBAAAA,EAAqBqK,aAAgB,GAAA,CAAA,CAAA,CAAA;QAChF,IAAI,CAACxF,WAAW,GAAG1C,IAAAA;AACnB,QAAA,IAAI,CAACmI,OAAO,EAAA;AACd;AACA;;;;;;MAOAI,mBAAAA,CAAoBC,SAAiB,EAAEC,SAAiB,EAAEC,SAAiB,EAAEC,SAAiB,EAAE;QAC9F,IAAI,IAAI,CAAC1G,KAAK,KAAK,WAAW,CAAC,IAAI,CAACqC,IAAI,EAAE;AACxC,YAAA;AACF;QACA,IAAI,IAAI,CAACA,IAAI,EAAE;AACb,YAAA,IAAI,CAACA,IAAI,CAACiE,mBAAmB,CAC3B,IAAI,CAAC7F,WAAW,EAChB,IAAI,CAACH,aAAa,EAClB7D,IAAKC,CAAAA,GAAG,CAAC,CAAG6J,EAAAA,SAAAA,CAAAA,EACZ9J,IAAKC,CAAAA,GAAG,CAAC,CAAG8J,EAAAA,SAAAA,CAAAA,EACZ/J,IAAK2G,CAAAA,GAAG,CAAC,IAAI,CAAC9C,aAAa,EAAEmG,YAC7BhK,IAAK2G,CAAAA,GAAG,CAAC,IAAI,CAAC7C,cAAc,EAAEmG,SAAAA,CAAAA,CAAAA;AAEhC,YAAA;AACF;QACA,MAAMC,CAAAA,GAAI,IAAI,CAACnG,cAAc;;QAE7B,MAAMoG,GAAAA,GAAMnK,KAAKC,GAAG,CAAC,GAAG,CAAC6J,SAAY,GAAA,CAAA,IAAKI,CAAAA,CAAAA;QAC1C,MAAME,GAAAA,GAAMpK,KAAKC,GAAG,CAAC,GAAG,CAAC8J,SAAY,GAAA,CAAA,IAAKG,CAAAA,CAAAA;AAC1C,QAAA,MAAMG,GAAMrK,GAAAA,IAAAA,CAAK2G,GAAG,CAAC,IAAI,CAAC9C,aAAa,GAAGqG,CAAG,EAACF,CAAAA,SAAAA,GAAY,CAAA,IAAKE,CAAAA,CAAAA;AAC/D,QAAA,MAAMI,GAAMtK,GAAAA,IAAAA,CAAK2G,GAAG,CAAC,IAAI,CAAC7C,cAAc,GAAGoG,CAAG,EAACD,CAAAA,SAAAA,GAAY,CAAA,IAAKC,CAAAA,CAAAA;QAChE,IAAIG,GAAAA,IAAOF,GAAOG,IAAAA,GAAAA,IAAOF,GAAK,EAAA;AAC5B,YAAA;AACF;AACA,QAAA,MAAMG,GAAMvK,GAAAA,IAAAA,CAAKwK,KAAK,CAACL,GAAMlL,GAAAA,UAAAA,CAAAA;AAC7B,QAAA,MAAMwL,GAAMzK,GAAAA,IAAAA,CAAKwK,KAAK,CAACJ,GAAMnL,GAAAA,UAAAA,CAAAA;QAC7B,MAAMyL,GAAAA,GAAM1K,IAAK2G,CAAAA,GAAG,CAAC,IAAI,CAACzC,OAAO,EAAElE,IAAAA,CAAK2K,IAAI,CAACN,GAAMpL,GAAAA,UAAAA,CAAAA,CAAAA;QACnD,MAAM2L,GAAAA,GAAM5K,IAAK2G,CAAAA,GAAG,CAAC,IAAI,CAACxC,OAAO,EAAEnE,IAAAA,CAAK2K,IAAI,CAACL,GAAMrL,GAAAA,UAAAA,CAAAA,CAAAA;AACnD,QAAA,IAAK,IAAI4L,EAAAA,GAAKJ,GAAKI,EAAAA,EAAAA,GAAKD,KAAKC,EAAM,EAAA,CAAA;AACjC,YAAA,IAAK,IAAIC,EAAAA,GAAKP,GAAKO,EAAAA,EAAAA,GAAKJ,KAAKI,EAAM,EAAA,CAAA;gBACjC,IAAI,CAACC,YAAY,CAACD,EAAID,EAAAA,EAAAA,CAAAA;AACxB;AACF;AACF;AACA;;AAEC,MACDpB,OAAU,GAAA;AACR,QAAA,KAAK,MAAMuB,IAAQ,IAAA,IAAI,CAAC/G,MAAM,CAACgH,MAAM,EAAI,CAAA;AACvCD,YAAAA,IAAAA,CAAK5J,OAAO,EAAA;AACd;QACA,IAAI,CAAC6C,MAAM,CAACiH,KAAK,EAAA;QACjB,IAAI,CAAC9G,UAAU,GAAG,CAAA;AAClB,QAAA,IAAI,CAACmC,cAAc,EAAA;QACnB,IAAI,IAAI,CAACX,IAAI,EAAE;AACb,YAAA,IAAI,CAACA,IAAI,CAACQ,UAAU,CAAC,IAAI,CAACvC,aAAa,EAAE,IAAI,CAACC,cAAc,EAAE,IAAI,CAACE,WAAW,CAAA;AAC9E,YAAA;AACF;AACA,QAAA,IAAI,IAAI,CAACT,KAAK,KAAK,OAAS,EAAA;AAC1B,YAAA;AACF;QACA,IAAK,IAAIsH,KAAK,CAAGA,EAAAA,EAAAA,GAAK,IAAI,CAAC1G,OAAO,EAAE0G,EAAM,EAAA,CAAA;YACxC,IAAK,IAAIC,KAAK,CAAGA,EAAAA,EAAAA,GAAK,IAAI,CAAC5G,OAAO,EAAE4G,EAAM,EAAA,CAAA;gBACxC,IAAI,CAACC,YAAY,CAACD,EAAID,EAAAA,EAAAA,CAAAA;AACxB;AACF;AACF;2CAEA,IAAIpG,UAAa,GAAA;QACf,OAAO,IAAI,CAACd,WAAW;AACzB;IACA,IAAIc,UAAAA,CAAW+B,GAAW,EAAE;AAC1B,QAAA,IAAI,CAAC2E,YAAY,CAAC3E,GAAK,EAAA,IAAI,CAAC5C,YAAY,CAAA;AAC1C;4CAEA,IAAIc,WAAc,GAAA;QAChB,OAAO,IAAI,CAACd,YAAY;AAC1B;IACA,IAAIc,WAAAA,CAAY8B,GAAW,EAAE;AAC3B,QAAA,IAAI,CAAC2E,YAAY,CAAC,IAAI,CAACxH,WAAW,EAAE6C,GAAAA,CAAAA;AACtC;AACA;;;;AAIC,MACD2E,YAAahG,CAAAA,KAAa,EAAEC,MAAc,EAAE;QAC1C,IAAID,KAAAA,KAAU,IAAI,CAACxB,WAAW,IAAIyB,MAAW,KAAA,IAAI,CAACxB,YAAY,EAAE;YAC9D,IAAI,CAACD,WAAW,GAAGwB,KAAAA;YACnB,IAAI,CAACvB,YAAY,GAAGwB,MAAAA;AACpB,YAAA,IAAI,IAAI,CAAC7B,KAAK,KAAK,OAAS,EAAA;AAC1B,gBAAA,IAAI,CAACE,WAAW,CAAC,CAAA,CAAE,GAAG2B,MAAAA;AACtB,gBAAA,IAAI,CAAC3B,WAAW,CAAC,CAAA,CAAE,GAAG0B,KAAAA;AACtB,gBAAA;AACF;AACA,YAAA,IAAI,CAAC1E,iBAAiB,CAACU,GAAG,CAAC,IAAI,CAACkE,sBAAsB,CAAC,IAAI,CAAC1B,WAAW,EAAE,IAAI,CAACC,YAAY,CAAA,CAAA;AAC1F,YAAA,KAAK,MAAMoH,IAAQ,IAAA,IAAI,CAAC/G,MAAM,CAACgH,MAAM,EAAI,CAAA;AACvCD,gBAAAA,IAAAA,CAAK/J,mBAAmB,CAAC,IAAI,CAACR,iBAAiB,CAACS,GAAG,EAAA,CAAA;AACrD;YACA,IAAI,CAAC0E,IAAI,EAAE3E,mBAAAA,CAAoB,IAAI,CAACR,iBAAiB,CAACS,GAAG,EAAA,CAAA;AAC3D;AACF;qBAEA,cAAyB,GAAA;AACvB,QAAA,IAAI,CAACgD,OAAO,GAAGlE,IAAAA,CAAK2K,IAAI,CAAE,IAAI,CAAC9G,aAAa,GAAG,IAAI,CAACE,cAAc,GAAI9E,UAAAA,CAAAA;AACtE,QAAA,IAAI,CAACkF,OAAO,GAAGnE,IAAAA,CAAK2K,IAAI,CAAE,IAAI,CAAC7G,cAAc,GAAG,IAAI,CAACC,cAAc,GAAI9E,UAAAA,CAAAA;AACzE;AACA,qBACA,aAAQmM,CAAcC,CAAS,EAAEC,CAAS,EAAU;QAClD,MAAMC,CAAAA,GAAI,IAAI,CAAC1H,aAAa;QAC5B,MAAM2H,CAAAA,GAAI,IAAI,CAAC1H,cAAc;QAC7B,MAAMnE,CAAAA,GAAI0L,IAAIE,CAAI,GAAA,GAAA;QAClB,MAAM1L,CAAAA,GAAIyL,IAAIE,CAAI,GAAA,GAAA;QAClB,MAAMC,EAAAA,GAAKzL,IAAKwK,CAAAA,KAAK,CAAC7K,CAAAA,CAAAA;QACtB,MAAM+L,EAAAA,GAAK1L,IAAKwK,CAAAA,KAAK,CAAC3K,CAAAA,CAAAA;AACtB,QAAA,MAAM8L,KAAKhM,CAAI8L,GAAAA,EAAAA;AACf,QAAA,MAAMG,KAAK/L,CAAI6L,GAAAA,EAAAA;QACf,MAAMG,EAAAA,GAAK7L,KAAK2G,GAAG,CAAC3G,KAAKC,GAAG,CAACwL,EAAI,EAAA,CAAA,CAAA,EAAIF,CAAI,GAAA,CAAA,CAAA;QACzC,MAAMO,EAAAA,GAAK9L,IAAK2G,CAAAA,GAAG,CAAC3G,IAAAA,CAAKC,GAAG,CAACwL,EAAAA,GAAK,CAAG,EAAA,CAAA,CAAA,EAAIF,CAAI,GAAA,CAAA,CAAA;QAC7C,MAAMQ,EAAAA,GAAK/L,KAAK2G,GAAG,CAAC3G,KAAKC,GAAG,CAACyL,EAAI,EAAA,CAAA,CAAA,EAAIF,CAAI,GAAA,CAAA,CAAA;QACzC,MAAMQ,EAAAA,GAAKhM,IAAK2G,CAAAA,GAAG,CAAC3G,IAAAA,CAAKC,GAAG,CAACyL,EAAAA,GAAK,CAAG,EAAA,CAAA,CAAA,EAAIF,CAAI,GAAA,CAAA,CAAA;QAC7C,MAAMS,CAAAA,GAAI,IAAI,CAACjI,WAAW;QAC1B,MAAMkI,CAAAA,GAAID,CAAC,CAACF,EAAAA,GAAKR,IAAIM,EAAG,CAAA,GAAG,CAACI,CAAC,CAACF,EAAKR,GAAAA,CAAAA,GAAIO,GAAG,GAAGG,CAAC,CAACF,EAAKR,GAAAA,CAAAA,GAAIM,EAAG,CAAD,IAAKF,EAAAA;QAC/D,MAAMQ,CAAAA,GAAIF,CAAC,CAACD,EAAAA,GAAKT,IAAIM,EAAG,CAAA,GAAG,CAACI,CAAC,CAACD,EAAKT,GAAAA,CAAAA,GAAIO,GAAG,GAAGG,CAAC,CAACD,EAAKT,GAAAA,CAAAA,GAAIM,EAAG,CAAD,IAAKF,EAAAA;AAC/D,QAAA,OAAO,CAACO,CAAI,GAACC,CAAAA,CAAAA,GAAID,CAAAA,IAAKN,EAAC,KAAM,CAAA,GAAI,GAAE,CAAA;AACrC;qBAEA,aAAQQ,CAAcjC,GAAW,EAAEC,GAAW,EAAEC,GAAW,EAAEC,GAAW,EAAW;QACjF,MAAMJ,CAAAA,GAAI,IAAI,CAACnG,cAAc;QAC7B,MAAM8H,EAAAA,GAAK7L,KAAKC,GAAG,CAAC,GAAGD,IAAKwK,CAAAA,KAAK,CAACL,GAAAA,GAAMD,CAAK,CAAA,GAAA,CAAA,CAAA;QAC7C,MAAM6B,EAAAA,GAAK/L,KAAKC,GAAG,CAAC,GAAGD,IAAKwK,CAAAA,KAAK,CAACJ,GAAAA,GAAMF,CAAK,CAAA,GAAA,CAAA,CAAA;AAC7C,QAAA,MAAM4B,EAAK9L,GAAAA,IAAAA,CAAK2G,GAAG,CAAC,IAAI,CAAC9C,aAAa,EAAE7D,IAAK2K,CAAAA,IAAI,CAACN,GAAAA,GAAMH,CAAK,CAAA,GAAA,CAAA,CAAA;AAC7D,QAAA,MAAM8B,EAAKhM,GAAAA,IAAAA,CAAK2G,GAAG,CAAC,IAAI,CAAC7C,cAAc,EAAE9D,IAAK2K,CAAAA,IAAI,CAACL,GAAAA,GAAMJ,CAAK,CAAA,GAAA,CAAA,CAAA;AAC9D,QAAA,IAAK,IAAIrK,CAAAA,GAAIkM,EAAIlM,EAAAA,CAAAA,GAAImM,IAAInM,CAAK,EAAA,CAAA;AAC5B,YAAA,MAAMwM,OAAUxM,GAAAA,CAAAA,GAAI,IAAI,CAACgE,aAAa;AACtC,YAAA,IAAK,IAAIlE,CAAAA,GAAIkM,EAAIlM,EAAAA,CAAAA,GAAImM,IAAInM,CAAK,EAAA,CAAA;AAC5B,gBAAA,IAAI,IAAI,CAACqE,WAAW,CAACqI,OAAU1M,GAAAA,CAAAA,CAAE,KAAK,CAAG,EAAA;oBACvC,OAAO,KAAA;AACT;AACF;AACF;QACA,OAAO,IAAA;AACT;AACA,qBACA,YAAQoL,CAAaD,EAAU,EAAED,EAAU,EAAE;QAC3C,MAAMX,CAAAA,GAAI,IAAI,CAACnG,cAAc;AAC7B,QAAA,MAAMuI,EAAK,GAAA,IAAI,CAACzI,aAAa,GAAGqG,CAAAA;AAChC,QAAA,MAAMqC,EAAK,GAAA,IAAI,CAACzI,cAAc,GAAGoG,CAAAA;AACjC,QAAA,MAAMC,MAAMW,EAAK7L,GAAAA,UAAAA;AACjB,QAAA,MAAMmL,MAAMS,EAAK5L,GAAAA,UAAAA;AACjB,QAAA,MAAMoL,GAAMrK,GAAAA,IAAAA,CAAK2G,GAAG,CAACwD,MAAMlL,UAAYqN,EAAAA,EAAAA,CAAAA;AACvC,QAAA,MAAMhC,GAAMtK,GAAAA,IAAAA,CAAK2G,GAAG,CAACyD,MAAMnL,UAAYsN,EAAAA,EAAAA,CAAAA;AACvC,QAAA,MAAMC,GAAM3B,GAAAA,EAAAA,GAAK,IAAI,CAAC3G,OAAO,GAAG4G,EAAAA;AAChC,QAAA,IAAIE,OAAO,IAAI,CAAC/G,MAAM,CAAC/C,GAAG,CAACsL,GAAAA,CAAAA;;QAE3B,IAAI,CAACxB,QAAQ,IAAI,CAACoB,aAAa,CAACjC,GAAAA,EAAKC,GAAKC,EAAAA,GAAAA,EAAKC,GAAM,CAAA,EAAA;AACnD,YAAA;AACF;QACA,MAAMhJ,IAAAA,GAAOuB,WAAWQ,aAAa;AACrC,QAAA,MAAMmB,IAAO,GAAA,IAAI,CAACd,KAAK,GAAG,CAAA;AAC1B,QAAA,IAAInC,KAAQ,GAAA,CAAA;AACZ,QAAA,IAAK,IAAIkL,EAAAA,GAAKrC,GAAKqC,EAAAA,EAAAA,GAAKnC,KAAKmC,EAAM,EAAA,CAAA;AACjC,YAAA,IAAK,IAAIC,EAAAA,GAAKvC,GAAKuC,EAAAA,EAAAA,GAAKrC,KAAKqC,EAAM,EAAA,CAAA;gBACjC,MAAMrB,CAAAA,GAAI,CAACqB,EAAAA,GAAKC,UAAUD,EAAID,EAAAA,EAAAA,EAAIjI,KAAI,IAAK8H,EAAAA;gBAC3C,MAAMhB,CAAAA,GAAI,CAACmB,EAAAA,GAAKE,UAAUD,EAAID,EAAAA,EAAAA,EAAIjI,IAAO,GAAA,CAAA,CAAC,IAAK+H,EAAAA;gBAC/C,IAAI,IAAI,CAACnB,aAAa,CAACC,CAAAA,EAAGC,KAAKqB,SAAUD,CAAAA,EAAAA,EAAID,EAAIjI,EAAAA,IAAAA,GAAO,CAAI,CAAA,EAAA;oBAC1D,MAAMoI,KAAAA,GAAQD,UAAUD,EAAID,EAAAA,EAAAA,EAAIjI,OAAO,CAAKxE,CAAAA,GAAAA,IAAAA,CAAK6M,EAAE,GAAG,CAAA;AACtDvL,oBAAAA,IAAI,CAACC,KAAAA,GAAQ,CAAI,GAAA,CAAA,CAAE,GAAG8J,CAAAA;AACtB/J,oBAAAA,IAAI,CAACC,KAAAA,GAAQ,CAAI,GAAA,CAAA,CAAE,GAAG+J,CAAAA;AACtBhK,oBAAAA,IAAI,CAACC,KAAAA,GAAQ,CAAI,GAAA,CAAA,CAAE,GAAGqL,KAAAA;;oBAEtBtL,IAAI,CAACC,QAAQ,CAAI,GAAA,CAAA,CAAE,GAAGoL,SAAUD,CAAAA,EAAAA,EAAID,IAAIjI,IAAO,GAAA,CAAA,CAAA;AAC/CjD,oBAAAA,KAAAA,EAAAA;AACF;AACF;AACF;AACA,QAAA,IAAI,CAAC6C,UAAU,IAAI7C,SAASyJ,IAAAA,EAAMhK,gBAAgB,CAAA,CAAA;AAClD,QAAA,IAAIO,UAAU,CAAG,EAAA;AACf,YAAA,IAAIyJ,IAAM,EAAA;AACRA,gBAAAA,IAAAA,CAAK5J,OAAO,EAAA;AACZ,gBAAA,IAAI,CAAC6C,MAAM,CAAC6I,MAAM,CAACN,GAAAA,CAAAA;AACrB;SACK,MAAA;AACL,YAAA,IAAI,CAACxB,IAAM,EAAA;gBACTA,IAAO,GAAA,IAAI1K,eAAe,IAAI,CAACG,iBAAiB,CAACS,GAAG,EAAK2B,EAAAA,UAAAA,CAAWoD,eAAe,EAAA,CAAA;AACnF,gBAAA,IAAI,CAAChC,MAAM,CAAC9C,GAAG,CAACqL,GAAKxB,EAAAA,IAAAA,CAAAA;AACvB;YACAA,IAAK3J,CAAAA,OAAO,CAACC,IAAMC,EAAAA,KAAAA,CAAAA;AACrB;AACF;qBAEA,OAAe0E,eAAkB,GAAA;AAC/B,QAAA,IAAI,CAAC,IAAI,CAACvF,YAAY,CAACQ,GAAG,EAAI,EAAA;YAC5B,IAAI,CAACR,YAAY,CAACS,GAAG,CACnBM,SAAYsL,EAAAA,CAAAA,iBAAiB,CAC3B,IAAIC,WAAY,CAAA;AAAC,gBAAA,CAAA;AAAG,gBAAA,CAAA;AAAG,gBAAA,CAAA;AAAG,gBAAA,CAAA;AAAG,gBAAA,CAAA;AAAG,gBAAA,CAAA;AAAG,gBAAA,CAAA;AAAG,gBAAA,CAAA;AAAG,gBAAA,CAAA;AAAG,gBAAA,CAAA;AAAG,gBAAA,CAAA;AAAG,gBAAA,CAAA;AAAG,gBAAA,CAAA;AAAG,gBAAA,CAAA;AAAG,gBAAA,EAAA;AAAI,gBAAA,CAAA;AAAG,gBAAA,EAAA;AAAI,gBAAA;AAAG,aAAA,CAAA,CAAA,CAAA;AAG/E;AACA,QAAA,OAAO,IAAI,CAACtM,YAAY,CAACQ,GAAG,EAAA;AAC9B;qBAEA,OAAe6E,oBAAuB,GAAA;AACpC,QAAA,IAAI,CAAC,IAAI,CAACjD,iBAAiB,CAAC5B,GAAG,EAAI,EAAA;AACjC,YAAA,IAAI,CAAC4B,iBAAiB,CAAC3B,GAAG,CAACM,SAAAA,EAAAA,CAAYsL,iBAAiB,CAACE,kBAAAA,EAAAA,CAAAA,CAAAA;AAC3D;AACA,QAAA,OAAO,IAAI,CAACnK,iBAAiB,CAAC5B,GAAG,EAAA;AACnC;AACA;;;;AAIC,MACD,OAAe4E,qBAAwB,GAAA;AACrC,QAAA,IAAI,CAAC,IAAI,CAAC/C,kBAAkB,CAAC7B,GAAG,EAAI,EAAA;YAClC,IAAI,CAAC6B,kBAAkB,CAAC5B,GAAG,CAACM,YAAYI,kBAAkB,CAAC,gBAAkB,EAAA,IAAIyB,YAAa,CAAA,CAAA,CAAA,CAAA,CAAA;AAChG;AACA,QAAA,OAAO,IAAI,CAACP,kBAAkB,CAAC7B,GAAG,EAAA;AACpC;AACA,qBACA,sBAAQmE,CAAuBZ,UAAkB,EAAEC,WAAmB,EAAE;AACtE,QAAA,MAAMlD,MAASC,GAAAA,SAAAA,EAAAA;AACf,QAAA,MAAMyL,IAAIzI,UAAa,GAAA,GAAA;AACvB,QAAA,MAAM0I,CAAIzI,GAAAA,WAAAA;AACV,QAAA,MAAM0I,IAAIF,CAAIlN,GAAAA,IAAAA,CAAKqN,GAAG,CAACrN,IAAAA,CAAK6M,EAAE,GAAG,CAAA,CAAA;AACjC,QAAA,MAAMS,IAAIJ,CAAIlN,GAAAA,IAAAA,CAAKuN,GAAG,CAACvN,IAAAA,CAAK6M,EAAE,GAAG,CAAA,CAAA;QACjC,MAAMW,QAAAA,GAAW,IAAIlK,YAAa,CAAA;AAChC4J,YAAAA,CAAAA;AACA,YAAA,CAAA;AACA,YAAA,CAAA;AACA,YAAA,CAAA;AACA,YAAA,CAAA;AACAA,YAAAA,CAAAA;AACAC,YAAAA,CAAAA;AACA,YAAA,CAAA;AACA,YAAA,CAAA;AACA,YAAA,CAAA;YACA,CAACD,CAAAA;AACDC,YAAAA,CAAAA;AACA,YAAA,CAAA;AACA,YAAA,CAAA;AACA,YAAA,CAAA;YACA,CAACD,CAAAA;AACD,YAAA,CAAA;AACA,YAAA,CAAA;AACA,YAAA,CAAA;AACA,YAAA,CAAA;AAEAE,YAAAA,CAAAA;AACA,YAAA,CAAA;AACAE,YAAAA,CAAAA;AACA,YAAA,CAAA;AACA,YAAA,CAAA;YACA,CAACF,CAAAA;AACD,YAAA,CAAA;YACA,CAACE,CAAAA;AACD,YAAA,CAAA;AACA,YAAA,CAAA;YACA,CAACF,CAAAA;AACDD,YAAAA,CAAAA;YACA,CAACG,CAAAA;AACD,YAAA,CAAA;AACA,YAAA,CAAA;AACAF,YAAAA,CAAAA;AACAD,YAAAA,CAAAA;AACAG,YAAAA,CAAAA;AACA,YAAA,CAAA;AACA,YAAA,CAAA;YAEA,CAACF,CAAAA;AACD,YAAA,CAAA;AACAE,YAAAA,CAAAA;AACA,YAAA,CAAA;AACA,YAAA,CAAA;AACAF,YAAAA,CAAAA;AACA,YAAA,CAAA;YACA,CAACE,CAAAA;AACD,YAAA,CAAA;AACA,YAAA,CAAA;AACAF,YAAAA,CAAAA;AACAD,YAAAA,CAAAA;YACA,CAACG,CAAAA;AACD,YAAA,CAAA;AACA,YAAA,CAAA;YACA,CAACF,CAAAA;AACDD,YAAAA,CAAAA;AACAG,YAAAA,CAAAA;AACA,YAAA,CAAA;AACA,YAAA;AACD,SAAA,CAAA;QACD,OAAO9L,MAAAA,CAAOiM,6BAA6B,CAAC;AAAC,YAAA,gBAAA;AAAkB,YAAA;SAAa,EAAED,QAAAA,CAAAA;AAChF;AACA;;;;;;MAOAE,eAAAA,CACEC,MAAc,EACdpJ,OAAuB,EACvBqJ,aAAiC,EACjCC,gBAA6C,EAC7CC,UAAsC,EACtC;AACA,QAAA,IAAI,CAAC,IAAI,CAAClI,IAAI,EAAE;AACd,YAAA;AACF;AACA,QAAA,MAAMmI,OAAOxJ,OAAQyJ,CAAAA,KAAK,EAAEC,GAAAA,CAAIF,KAAKG,YAAgB,IAAA,IAAA;QACrD,MAAMC,KAAAA,GAAQ,CACZC,MACAC,EAAAA,IAAAA,EACAC,QACAC,IAEA,GAAA,IAAI,CAAC3I,IAAI,CAAE4I,QAAQ,CACjBb,MAAAA,EACApJ,SACA,IAAI,CAACb,KAAK,EACV,IAAI,CAACK,cAAc,EACnB,IAAI,CAACM,aAAa,EAClB,IAAI,CAACV,WAAW,EAChB,IAAI,CAACC,YAAY,EACjByK,MACA,IAAI,CAAC/J,WAAW,EAChB,IAAI,CAACb,WAAW,EAChBsK,IACAK,EAAAA,MAAAA,EACAE,MACAC,EAAAA,IAAAA,CAAAA;QAEJJ,KAAM,CAAA,CAAA,EAAGP,eAAe,IAAM,EAAA,IAAA,CAAA;;;QAG9B,MAAMa,gBAAAA,GAAmB,IAAI,CAAClL,KAAK,KAAK,OAAUsK,GAAAA,gBAAAA,CAAiBnL,MAAM,GAAG,CAAA;AAC5E,QAAA,IAAK,IAAIgM,CAAAA,GAAI,CAAGA,EAAAA,CAAAA,GAAID,kBAAkBC,CAAK,EAAA,CAAA;YACzCP,KAAMO,CAAAA,CAAAA,GAAI,GAAGC,kBAAmBC,CAAAA,GAAG,EAAEf,gBAAgB,CAACa,EAAE,EAAEZ,UAAAA,CAAAA;AAC5D;AACA,QAAA,IAAI,CAAClI,IAAI,CAACiJ,WAAW,CAACJ,gBAAmB,GAAA,CAAA,CAAA;QACzC,IAAI,CAAChJ,iBAAiB,GAAGgJ,gBAAAA;AAC3B;AACA;;;;;AAKC,MACDK,UAAWC,CAAAA,GAAgB,EAAEC,SAAiB,EAAE;AAC9C,QAAA,IAAIA,SAAY,GAAA,IAAI,CAACvJ,iBAAiB,EAAE;AACtC,YAAA,IAAI,CAACwJ,OAAO,CAACF,GAAAA,EAAKC,SAAY,GAAA,CAAA,CAAA;AAChC;AACF;qBAEAE,iBAAkB1I,CAAAA,GAAY,EAAE;AAC9B,QAAA,IAAI,CAAChD,SAAS,CAACtC,GAAG,EAAA,CAAIiO,cAAc,GAAG3I,GAAAA;AACzC;qBAEAtE,KAAK6M,GAAgB,EAAEK,MAAe,EAAEC,IAAY,EAAEC,IAAY,EAAE;QAClE,IAAI,IAAI,CAAC/L,KAAK,KAAK,WAAW,CAAC,IAAI,CAACqC,IAAI,EAAE;AACxC,YAAA;AACF;QACA,IAAI,IAAI,CAACA,IAAI,EAAE;YACb,IAAI,CAACqJ,OAAO,CAACF,GAAK,EAAA,CAAA,CAAA;AAClB,YAAA;AACF;AACA,QAAA,MAAMhB,IAAOgB,GAAAA,GAAAA,CAAIf,KAAK,EAAEC,IAAIF,IAAQ,IAAA,IAAA;QACpC,MAAMwB,OAAAA,GAAU1M,WAAWO,aAAa;AACxCmM,QAAAA,OAAAA,CAAQ7M,MAAM,GAAG,CAAA;QACjB,MAAMiL,MAAAA,GAASoB,IAAIpB,MAAM;QACzB,MAAM6B,QAAAA,GAAW3M,WAAWG,SAAS;AACrC,QAAA,MAAMyM,SAAS,IAAI,CAAC5L,aAAa,GAAG,IAAI,CAACE,cAAc;AACvD,QAAA,MAAM2L,SAAS,IAAI,CAAC5L,cAAc,GAAG,IAAI,CAACC,cAAc;QACxD,MAAM4L,EAAAA,GAAKP,OAAOzP,CAAC;QACnB,MAAMiQ,EAAAA,GAAKR,OAAOxP,CAAC;AACnB,QAAA,MAAMiQ,EAAKT,GAAAA,MAAAA,CAAOvP,CAAC,GAAGuP,OAAOzP,CAAC;AAC9B,QAAA,MAAMmQ,EAAKV,GAAAA,MAAAA,CAAO7D,CAAC,GAAG6D,OAAOxP,CAAC;AAC9B,QAAA,MAAMmQ,SAAYpC,GAAAA,MAAAA,CAAOqC,gBAAgB,CAACnN,WAAWK,UAAU,CAAA;AAC/D,QAAA,MAAM+M,SAAY,GAAA,IAAI,CAAC5L,aAAa,GAAG,CAAA,GAAI,IAAI,CAACA,aAAa,GAAG,IAAI,CAACA,aAAa,GAAG6L,QAAAA;;QAErF,MAAMC,OAAAA,GAAUpC,QAAQA,IAAKqC,CAAAA,QAAQ,GAAG,CAAI,GAAA,IAAI,CAACxM,YAAY,GAAG,CAAA;QAChE,KAAK,MAAM,CAAC4I,GAAKxB,EAAAA,IAAAA,CAAK,IAAI,IAAI,CAAC/G,MAAM,CAAE;AACrC,YAAA,MAAM6G,EAAK0B,GAAAA,GAAAA,GAAM,IAAI,CAACtI,OAAO;YAC7B,MAAM2G,EAAAA,GAAK,CAAC2B,GAAAA,GAAM1B,EAAC,IAAK,IAAI,CAAC5G,OAAO;YACpC,MAAMmM,EAAAA,GAAK,EAACvF,GAAK7L,UAAcwQ,GAAAA,MAAAA;YAC/B,MAAMa,EAAAA,GAAK,EAACzF,GAAK5L,UAAcyQ,GAAAA,MAAAA;YAC/B,MAAMa,EAAAA,GAAKvQ,IAAK2G,CAAAA,GAAG,CAAC,CAAA,EAAG,CAAEmE,EAAAA,GAAK,CAAA,IAAK7L,UAAcwQ,GAAAA,MAAAA,CAAAA;YACjD,MAAMe,EAAAA,GAAKxQ,IAAK2G,CAAAA,GAAG,CAAC,CAAA,EAAG,CAAEkE,EAAAA,GAAK,CAAA,IAAK5L,UAAcyQ,GAAAA,MAAAA,CAAAA;YACjDF,QAAStP,CAAAA,QAAQ,CAACuQ,MAAM,CAACd,EAAAA,GAAKU,EAAKR,GAAAA,EAAAA,GAAKM,OAASd,EAAAA,IAAAA,EAAMO,EAAKU,GAAAA,EAAAA,GAAKR,EAAKK,GAAAA,OAAAA,CAAAA;YACtEX,QAASrP,CAAAA,QAAQ,CAACsQ,MAAM,CAACd,EAAAA,GAAKY,EAAKV,GAAAA,EAAAA,GAAKM,OAASb,EAAAA,IAAAA,EAAMM,EAAKY,GAAAA,EAAAA,GAAKV,EAAKK,GAAAA,OAAAA,CAAAA;YACtE,IAAIzQ,gBAAAA,CAAiBqQ,SAAUpQ,CAAAA,CAAC,EAAEoQ,SAAAA,CAAUnQ,CAAC,EAAEmQ,SAAUlQ,CAAAA,CAAC,EAAE2P,QAAAA,CAAAA,GAAYS,SAAW,EAAA;AACjF,gBAAA;AACF;AACA,YAAA,MAAMS,YAAY/C,MAAOgD,CAAAA,QAAQ,GAC7BnB,QAAAA,CAASoB,2BAA2B,CAACjD,MAAAA,CAAOkD,OAAO,EAAElD,OAAOgD,QAAQ,CAAA,GACpEnB,SAASsB,uBAAuB,CAACnD,OAAOkD,OAAO,CAAA;YACnD,IAAIH,SAAAA,KAAcK,SAAUC,CAAAA,WAAW,EAAE;AACvCzB,gBAAAA,OAAAA,CAAQ0B,IAAI,CAACjG,IAAAA,CAAAA;AACf;AACF;QACA,IAAIuE,OAAAA,CAAQ7M,MAAM,KAAK,CAAG,EAAA;AACxB,YAAA;AACF;AACA,QAAA,MAAMmC,QAAW,GAAA,IAAI,CAACrB,SAAS,CAACtC,GAAG,EAAA;AACnC2D,QAAAA,QAAAA,CAASqM,WAAW,CAACnD,IAAAA,CAAAA;AACrBlJ,QAAAA,QAAAA,CAASsM,KAAK,CAACpC,GAAAA,CAAAA;AACf,QAAA,IAAK,IAAIqC,IAAO,GAAA,CAAA,EAAGA,OAAOvM,QAASwM,CAAAA,SAAS,EAAED,IAAQ,EAAA,CAAA;AACpDvM,YAAAA,QAAAA,CAASyM,IAAI,CAACvC,GAAIvN,CAAAA,MAAM,EAAE4P,IAAAA,CAAAA;YAC1B,KAAK,MAAMpG,QAAQuE,OAAS,CAAA;AAC1BvE,gBAAAA,IAAAA,CAAK9I,IAAI,EAAA;AACX;AACF;AACAqN,QAAAA,OAAAA,CAAQ7M,MAAM,GAAG,CAAA;AACnB;AACA,mFACA,OAAQuM,CAAQF,GAAgB,EAAEX,MAAc,EAAE;;;;AAIhD,QAAA,MAAML,IAAOgB,GAAAA,GAAAA,CAAIf,KAAK,EAAEC,IAAIF,IAAQ,IAAA,IAAA;QACpC,MAAMwD,GAAAA,GAAM,IAAI,CAAC3L,IAAI;AACrB,QAAA,MAAMf,QAAW,GAAA,IAAI,CAACrB,SAAS,CAACtC,GAAG,EAAA;AACnC,QAAA,IAAI2D,oBAAoBC,yBAA2B,EAAA;YACjD,MAAM0M,SAAAA,GAAYD,GAAIE,CAAAA,iBAAiB,CAACrD,MAAAA,CAAAA;AACxC,YAAA,IAAI,CAACoD,SAAW,EAAA;AACd,gBAAA;AACF;AACA3M,YAAAA,QAAAA,CAAS6M,iBAAiB,CAACF,SAAWD,EAAAA,GAAAA,CAAII,cAAc,CAACvD,MAAAA,CAAAA,CAAAA;;AAEzDvJ,YAAAA,QAAAA,CAASqM,WAAW,CAClBnC,GAAIpB,CAAAA,MAAM,EACVI,IACAgB,EAAAA,GAAAA,CAAI6C,UAAU,CAAEC,IAAI,KAAKC,0BAA6B,GAAA,CAAA,GAAI/C,IAAIgD,YAAY,CAAA;SAEvE,MAAA;AACLlN,YAAAA,QAAAA,CAASqM,WAAW,CAACnD,IAAAA,CAAAA;AACvB;AACAlJ,QAAAA,QAAAA,CAASsM,KAAK,CAACpC,GAAAA,CAAAA;AACf,QAAA,IAAK,IAAIqC,IAAO,GAAA,CAAA,EAAGA,OAAOvM,QAASwM,CAAAA,SAAS,EAAED,IAAQ,EAAA,CAAA;AACpDvM,YAAAA,QAAAA,CAASyM,IAAI,CAACvC,GAAIvN,CAAAA,MAAM,EAAE4P,IAAAA,CAAAA;AAC1BG,YAAAA,GAAAA,CAAIrP,IAAI,CAACkM,MAAAA,CAAAA;AACX;AACF;qBAEA,SAAsB,GAAA;AACpB,QAAA,KAAK,CAACxL,SAAAA,EAAAA;QACN,IAAI,CAACY,SAAS,CAACpC,OAAO,EAAA;AACtB,QAAA,KAAK,MAAM4J,IAAQ,IAAA,IAAI,CAAC/G,MAAM,CAACgH,MAAM,EAAI,CAAA;AACvCD,YAAAA,IAAAA,CAAK5J,OAAO,EAAA;AACd;QACA,IAAI,CAAC6C,MAAM,CAACiH,KAAK,EAAA;QACjB,IAAI,CAACzK,iBAAiB,CAACW,OAAO,EAAA;QAC9B,IAAI,CAACwE,IAAI,EAAExE,OAAAA,EAAAA;AACb;AACF;AACA;;;IAIO,MAAM4Q,aAAsBzR,SAAAA,UAAAA,CAAAA;IACjC,OAAwB0R,SAAAA,GAAY,IAAI9O,OAAU,EAAA;IAClD,OAAwB+O,QAAAA,GAAW,IAAI/O,OAAU,EAAA;IACjD,OAAwBgP,IAAAA,GAAO,IAAIhP,OAAU,EAAA;IAC7C,OAAwBiP,OAAAA,GAAU,IAAIjP,OAAU,EAAA;IAChD,OAAwBkP,IAAAA,GAAO,IAAIlP,OAAU,EAAA;IAC7C,OAAwBmP,MAAAA,GAAS,IAAInP,OAAU,EAAA;IAC/C,OAAwBoP,MAAAA,GAAS,IAAIpP,OAAU,EAAA;IAC/C,OAAwBqP,OAAAA,GAAU,IAAIrP,OAAU,EAAA;IAChD,OAAwBsP,QAAAA,GAAWC,KAAMC,CAAAA,IAAI,CAAC;QAAEjQ,MAAQ,EAAA;KAAK,EAAA,IAAM,IAAIS,OAAW,EAAA,CAAA;AAClF,IAAA,OAAwByP,SAAY,GAAA;AAAC,QAAA,CAAA;AAAG,QAAA,CAAA;AAAG,QAAA,CAAA;AAAG,QAAA,CAAA;AAAG,QAAA,CAAA;AAAG,QAAA;KAAE;IACtD,OAAwBC,UAAAA,GAAa,IAAIvP,YAAAA,CAAa,CAAG,CAAA;IACzD,OAAwBwP,iBAAAA,GAAiD,EAAE;IAC1DC,QAAmC;IAC5CC,OAAsB;IACtBC,iBAA2B;IAC3BC,eAAyB;IACzBC,wBAAkC;IAClCC,WAAqB;IACrBC,mBAA4B;gGAEpC,WAAgD;8EAEhD,YAA0D;AAC1D;;;MAIA,WAAA,CAAY9O,OAAuB,CAAE;QACnC,KAAK,EAAA;AACL,QAAA,IAAI,CAACwO,QAAQ,GAAG,IAAIO,QAAS/O,CAAAA,OAAAA,CAAAA;QAC7B,IAAI,CAACyO,OAAO,GAAG,EAAE;QACjB,IAAI,CAACC,iBAAiB,GAAG,IAAA;QACzB,IAAI,CAACC,eAAe,GAAG,KAAA;QACvB,IAAI,CAACC,wBAAwB,GAAG,KAAA;QAChC,IAAI,CAACC,WAAW,GAAG,IAAA;QACnB,IAAI,CAACC,mBAAmB,GAAG,GAAA;QAC3B,IAAI,CAACE,WAAW,GAAG,IAAA;QACnB,IAAI,CAACC,YAAY,GAAG,IAAIF,QAAAA,EAAAA;AAC1B;AACA;;;;;AAKC,MACD,IAAIG,gBAAmB,GAAA;QACrB,OAAO,IAAI,CAACR,iBAAiB;AAC/B;IACA,IAAIQ,gBAAAA,CAAiBjN,GAAY,EAAE;AACjC,QAAA,IAAI,CAACyM,iBAAiB,GAAG,CAAC,CAACzM,GAAAA;AAC7B;AACA;;AAEC,MACD,IAAI2I,cAAiB,GAAA;QACnB,OAAO,IAAI,CAAC+D,eAAe;AAC7B;IACA,IAAI/D,cAAAA,CAAe3I,GAAY,EAAE;AAC/B,QAAA,IAAI,CAAC0M,eAAe,GAAG,CAAC,CAAC1M,GAAAA;AACzB,QAAA,KAAK,MAAMkN,KAAAA,IAAS,IAAI,CAACV,OAAO,CAAE;AAChCU,YAAAA,KAAAA,CAAMxE,iBAAiB,CAAC,IAAI,CAACgE,eAAe,CAAA;AAC9C;AACF;AACA;;;;AAIC,MACD,IAAIS,uBAA0B,GAAA;QAC5B,OAAO,IAAI,CAACR,wBAAwB;AACtC;IACA,IAAIQ,uBAAAA,CAAwBnN,GAAY,EAAE;AACxC,QAAA,IAAI,CAAC2M,wBAAwB,GAAG,CAAC,CAAC3M,GAAAA;AACpC;AACA,qBACAK,cAAiB,GAAA;AACf,QAAA,KAAK,MAAM6M,KAAAA,IAAS,IAAI,CAACV,OAAO,CAAE;AAChCU,YAAAA,KAAAA,CAAM7M,cAAc,EAAA;AACtB;AACF;AACA;;;AAGC,MACD,IAAI+M,UAAa,GAAA;QACf,OAAO,IAAI,CAACR,WAAW;AACzB;IACA,IAAIQ,UAAAA,CAAWpN,GAAY,EAAE;AAC3B,QAAA,IAAI,CAAC4M,WAAW,GAAG,CAAC,CAAC5M,GAAAA;AACvB;AACA;;;AAGC,MACD,IAAIqN,kBAAqB,GAAA;QACvB,OAAO,IAAI,CAACR,mBAAmB;AACjC;IACA,IAAIQ,kBAAAA,CAAmBrN,GAAW,EAAE;AAClC,QAAA,IAAI,CAAC6M,mBAAmB,GAAGrT,IAAAA,CAAK2G,GAAG,CAAC,CAAG3G,EAAAA,IAAAA,CAAKC,GAAG,CAAC,CAAGwG,EAAAA,MAAAA,CAAOD,GAAQ,CAAA,IAAA,CAAA,CAAA,CAAA;AACpE;qBAEAkH,eAAgBC,CAAAA,MAAc,EAAE;AAC9B,QAAA,MAAMpJ,OAAU,GAAA,IAAI,CAACwO,QAAQ,CAAC7R,GAAG,EAAA;AACjC,QAAA,IAAIqD,OAAS,EAAA;YACX,MAAM8J,IAAAA,GACJ,CAAC,IAAI,CAAC4E,iBAAiB,IAAI,IAAI,CAACE,wBAAwB,GACpDxE,mBAAmBC,GAAG,GACtB,IAAI,CAACsE,eAAe,GAClBvE,kBAAmBmF,CAAAA,KAAK,GACxBnF,kBAAAA,CAAmBoF,IAAI;AAC/B,YAAA,MAAMlG,gBAAmB,GAAA,IAAI,CAACmG,oBAAoB,CAACrG,MAAQpJ,EAAAA,OAAAA,CAAAA;AAC3D,YAAA,KAAK,MAAMmP,KAAAA,IAAS,IAAI,CAACV,OAAO,CAAE;gBAChCU,KAAMhG,CAAAA,eAAe,CAACC,MAAQpJ,EAAAA,OAAAA,EAAS8J,MAAMR,gBAAkB,EAAA,IAAI,CAAC0F,WAAW,CAAA;AACjF;AACF;AACF;AACA;;;AAGC,MACD,oBAAQS,CAAqBrG,MAAc,EAAEpJ,OAAuB,EAA+B;AACjG,QAAA,IAAI,CAACiP,YAAY,CAACrS,GAAG,CAAC,IAAA,CAAA;QACtB,IAAI,CAACoS,WAAW,GAAG,IAAA;QACnB,MAAMvF,KAAAA,GAAQzJ,QAAQyJ,KAAK;AAC3B,QAAA,MAAMiG,GAAMjG,GAAAA,KAAAA,GAAQkG,gBAAiBC,CAAAA,WAAW,CAACnG,KAAS,CAAA,GAAA,IAAA;AAC1D,QAAA,IACE,CAAC,IAAI,CAACoF,WAAW,IACjB,CAAC7O,OAAQqP,CAAAA,UAAU,IACnB,CAACK,GACD,IAAA,CAACA,IAAIL,UAAU,IACf,CAAClO,iBAAAA,CAAkBC,WAAW,EAAA,IAC9B,CAAC,IAAI,CAACqN,OAAO,CAACoB,IAAI,CAAC,CAACV,KAAAA,GAAUA,KAAM9O,CAAAA,IAAI,KAAK,OAC7C,CAAA,EAAA;AACA,YAAA,OAAO,EAAE;AACX;AACA,QAAA,IAAI,CAAC4O,YAAY,CAACrS,GAAG,CAAC8S,GAAAA,CAAAA;AACtB,QAAA,MAAMI,SAAYJ,GAAAA,GAAAA,CAAIK,MAAM,CAACC,mBAAmB,CAAC5G,MAAAA,CAAAA;AACjD,QAAA,MAAM6G,cAAcxU,IAAK2G,CAAAA,GAAG,CAACrH,qBAAuB+U,EAAAA,SAAAA,CAAU3R,MAAM,GAAG,CAAA,CAAA;;;QAGvE,MAAM+R,OAAAA,GAAUJ,SAAS,CAACG,WAAY,CAAA;AACtC,QAAA,MAAME,SAAYD,GAAAA,OAAAA,GAAU,CAACA,OAAUJ,GAAAA,SAAS,CAACG,WAAAA,GAAc,CAAE,CAAD,IAAK,IAAI,CAACnB,mBAAmB;AAC7F,QAAA,IAAI,CAACE,WAAW,GAAGkB,OAAAA,GAAUC,SAAY,GAAA;AAACA,YAAAA,SAAAA;AAAWD,YAAAA;SAAQ,GAAG,IAAA;;QAEhE,MAAME,QAAAA,GAAW3C,cAAcC,SAAS;AACxC0C,QAAAA,QAAAA,CAASxT,GAAG,CAAC8S,GAAIW,CAAAA,kBAAkB,CAACC,GAAG,EAAA,CAAA;AACvCF,QAAAA,QAAAA,CAASG,gBAAgB,EAAA;QACzB,MAAMC,CAAAA,GAAIpH,OAAOqH,WAAW;;AAE5B,QAAA,MAAMC,UAAUjD,aAAcE,CAAAA,QAAQ,CAACzB,MAAM,CAAC,CAACsE,CAAEG,CAAAA,GAAG,EAAE,CAACH,EAAEI,GAAG,EAAE,CAACJ,CAAEK,CAAAA,GAAG,EAAEN,gBAAgB,EAAA;AACtF,QAAA,MAAMO,GAAM1H,GAAAA,MAAAA,CAAOqC,gBAAgB,CAACgC,cAAcG,IAAI,CAAA;QACtD,MAAMmD,WAAAA,GAAc3H,OAAO4H,aAAa,EAAA;AACxC,QAAA,MAAMC,WAAc7H,GAAAA,MAAAA,CAAOkD,OAAO,CAAC4E,OAAO;QAC1C,MAAMA,OAAAA,GAAUzD,cAAcS,QAAQ;QACtC,MAAMiD,MAAAA,GAAS1D,cAAcI,OAAO;QACpC,MAAMuD,GAAAA,GAAM3D,cAAcK,IAAI;AAC9B,QAAA,MAAMuD,SAAsC,EAAE;AAC9C,QAAA,IAAK,IAAIlH,CAAAA,GAAI,CAAGA,EAAAA,CAAAA,GAAI8F,aAAa9F,CAAK,EAAA,CAAA;;;YAGpCgH,MAAOjF,CAAAA,MAAM,CAAC,CAAA,EAAG,CAAG,EAAA,CAAA,CAAA;AACpB,YAAA,IAAK,IAAIrD,CAAAA,GAAI,CAAGA,EAAAA,CAAAA,GAAI,GAAGA,CAAK,EAAA,CAAA;AAC1B,gBAAA,MAAMyI,IAAOL,GAAAA,WAAW,CAACpI,CAAAA,GAAI,CAAE,CAAA;AAC/B,gBAAA,MAAMnB,IAAIoI,SAAS,CAAC3F,KAAKtB,CAAAA,GAAI,CAAA,CAAG,CAAA;gBAChCjK,OAAQ2S,CAAAA,GAAG,CAACD,IAAAA,EAAMR,GAAKM,EAAAA,GAAAA,CAAAA;AACvB,gBAAA,MAAMI,KAAQ5S,GAAAA,OAAAA,CAAQ6S,GAAG,CAACL,GAAKV,EAAAA,OAAAA,CAAAA;AAC/B,gBAAA,IAAIK,WAAa,EAAA;AACfnS,oBAAAA,OAAAA,CAAQ8S,GAAG,CAACZ,GAAKlS,EAAAA,OAAAA,CAAQ+S,KAAK,CAACP,GAAK1J,EAAAA,CAAAA,GAAI8J,KAAOJ,EAAAA,GAAAA,CAAAA,EAAMF,OAAO,CAACrI,CAAE,CAAA,CAAA;iBAC1D,MAAA;AACLjK,oBAAAA,OAAAA,CAAQ8S,GAAG,CAACJ,IAAM1S,EAAAA,OAAAA,CAAQ+S,KAAK,CAACjB,OAAShJ,EAAAA,CAAAA,GAAI8J,KAAOJ,EAAAA,GAAAA,CAAAA,EAAMF,OAAO,CAACrI,CAAE,CAAA,CAAA;AACtE;AACAjK,gBAAAA,OAAAA,CAAQ8S,GAAG,CAACP,MAAAA,EAAQD,OAAO,CAACrI,EAAE,EAAEsI,MAAAA,CAAAA;AAClC;YACAA,MAAOS,CAAAA,OAAO,CAAC,CAAI,GAAA,CAAA,CAAA;;YAEnB,MAAMC,QAAAA,GAAWpE,cAAcY,SAAS;YACxC,MAAMtE,MAAAA,GAAU0D,cAAcc,iBAAiB,CAACpE,EAAE,KAAK,IAAIpL,aAAa+S,iBAAoB,GAAA,CAAA,CAAA;AAC5F,YAAA,IAAIC,SAAY,GAAA,CAAA;YAChB,MAAMC,QAAAA,GAAW,CAACrK,CAAAA,EAAYC,CAAYiB,EAAAA,CAAAA,GAAAA;AACxC,gBAAA,IAAIkJ,YAAYD,iBAAmB,EAAA;oBACjC,IAAIrE,aAAAA,CAAcwE,YAAY,CAACtK,CAAAA,EAAGC,GAAGiB,CAAGsI,EAAAA,MAAAA,EAAQpH,MAAQgI,EAAAA,SAAAA,GAAY,CAAI,CAAA,EAAA;AACtEA,wBAAAA,SAAAA,EAAAA;AACF;AACF;AACF,aAAA;AACA,YAAA,IAAK,IAAIG,IAAAA,GAAO,CAAGA,EAAAA,IAAAA,GAAO,GAAGA,IAAQ,EAAA,CAAA;AACnC,gBAAA,MAAMC,GAAM,GAAA,CAAA,KAAMD,IAAAA,IAAQ,CAAA,CAAA;gBAC1B,MAAME,IAAAA,GAAOF,IAAO,GAAA,CAAA,GAAIC,GAAM,GAAA,CAAA;AAC9B,gBAAA,MAAME,MAAS,GAAA;AAAC,oBAAA,CAAA;AAAG,oBAAA,CAAA;AAAG,oBAAA,CAAA;AAAG,oBAAA;iBAAE,CAACC,GAAG,CAAC,CAAC3M,CAAAA,GAAAA;;AAE/B,oBAAA,MAAM4M,IAAO,GAAA;AAAC,wBAAA,CAAA;AAAG,wBAAA,CAAA;AAAG,wBAAA;AAAE,qBAAA,CAACC,MAAM,CAAC,CAAC5K,CAAAA,GAAMA,CAAMuK,KAAAA,GAAAA,CAAAA;AAC3C,oBAAA,OAAOC,QAAQzM,CAAAA,GAAI,CAAI4M,GAAAA,IAAI,CAAC,CAAE,CAAA,GAAG,CAAA,CAAA,IAAM5M,CAAI,GAAA,CAAA,GAAI4M,IAAI,CAAC,CAAA,CAAE,GAAG,CAAA,CAAA;AAC3D,iBAAA,CAAA;gBACA9E,aAAcwE,CAAAA,YAAY,CACxBf,OAAO,CAACmB,MAAM,CAAC,CAAA,CAAE,CAAC,EAClBnB,OAAO,CAACmB,MAAM,CAAC,EAAE,CAAC,EAClBnB,OAAO,CAACmB,MAAM,CAAC,CAAE,CAAA,CAAC,EAClBlB,MAAAA,EACA1D,aAAca,CAAAA,UAAU,EACxB,CAAA,CAAA;gBAEF,MAAMmE,SAAAA,GAAYhF,cAAca,UAAU;gBAC1CuD,QAAQ,CAACK,KAAK,GAAGO,SAAS,CAAC,CAAE,CAAA,GAAGrC,QAAShV,CAAAA,CAAC,GAAGqX,SAAS,CAAC,CAAE,CAAA,GAAGrC,SAAS/U,CAAC,GAAGoX,SAAS,CAAC,CAAA,CAAE,GAAGrC,QAAAA,CAAS9U,CAAC;;AAElG,gBAAA,IAAIuW,QAAQ,CAACK,IAAAA,CAAK,IAAI,CAAA,IAAKH,YAAYD,iBAAmB,EAAA;oBACxD/H,MAAOnN,CAAAA,GAAG,CAAC6V,SAAAA,EAAWV,SAAY,GAAA,CAAA,CAAA;AAClCA,oBAAAA,SAAAA,EAAAA;AACF;AACF;;;AAGA,YAAA,IAAK,IAAIW,EAAAA,GAAK,CAAGA,EAAAA,EAAAA,GAAK,GAAGA,EAAM,EAAA,CAAA;AAC7B,gBAAA,IAAK,IAAIC,EAAKD,GAAAA,EAAAA,GAAK,CAAGC,EAAAA,EAAAA,GAAK,GAAGA,EAAM,EAAA,CAAA;AAClC,oBAAA,MAAMC,IAAO,GAAA,CAAA,KAAMF,EAAAA,IAAM,CAAA,CAAA;AACzB,oBAAA,MAAMG,IAAO,GAAA,CAAA,KAAMF,EAAAA,IAAM,CAAA,CAAA;AACzB,oBAAA,MAAMG,KAAQjB,GAAAA,QAAQ,CAACa,EAAAA,CAAG,IAAI,CAAA;AAC9B,oBAAA,MAAMK,KAAQlB,GAAAA,QAAQ,CAACc,EAAAA,CAAG,IAAI,CAAA;oBAC9B,IAAIC,IAAAA,KAASC,IAAQC,IAAAA,KAAAA,KAAUC,KAAO,EAAA;AACpC,wBAAA;AACF;AACA,oBAAA,MAAMC,KAAQ,GAACN,CAAAA,EAAAA,GAAK,CAAIE,GAAAA,IAAAA,GAAO,CAAA,KAAMD,EAAAA,GAAK,CAAIE,GAAAA,IAAAA,GAAO,CAAA,CAAA;AACrD,oBAAA,MAAMI,OAAU,GAAA,CAAA,GAAI,CAACL,IAAAA,GAAO,CAACC,IAAAA;oBAC7B,MAAMlL,CAAAA,GAAIuJ,OAAO,CAAC8B,KAAM,CAAA;AACxB,oBAAA,MAAMpL,CAAIsJ,GAAAA,OAAO,CAAC8B,KAAAA,GAAQC,OAAQ,CAAA;;AAElCrU,oBAAAA,OAAAA,CAAQ8S,GAAG,CAAC/J,CAAG/I,EAAAA,OAAAA,CAAQ+S,KAAK,CAACvB,QAAUxR,EAAAA,OAAAA,CAAQsU,QAAQ,CAACvL,CAAGC,EAAAA,CAAAA,CAAAA,EAAIwJ,GAAMA,CAAAA,EAAAA,GAAAA,CAAAA;AACrEY,oBAAAA,QAAAA,CAASrK,GAAGC,CAAGwJ,EAAAA,GAAAA,CAAAA;AACjB;AACF;;AAEA,YAAA,IAAK,IAAIzL,CAAAA,GAAIoM,SAAWpM,EAAAA,CAAAA,GAAImM,mBAAmBnM,CAAK,EAAA,CAAA;AAClDoE,gBAAAA,MAAAA,CAAOnN,GAAG,CAAC;AAAC,oBAAA,CAAA;AAAG,oBAAA,CAAA;AAAG,oBAAA,CAAA;AAAG,oBAAA;AAAK,iBAAA,EAAE+I,CAAI,GAAA,CAAA,CAAA;AAClC;AACA0L,YAAAA,MAAAA,CAAO3E,IAAI,CAAC3C,MAAAA,CAAAA;AACd;QACA,OAAOsH,MAAAA;AACT;AACA;;;;AAIC,MACD,OAAeY,YAAAA,CACbkB,EAAW,EACXC,EAAW,EACXC,EAAW,EACXC,MAAe,EACfC,GAAiB,EACjBC,MAAc,EACd;AACA,QAAA,MAAMC,KAAK7U,OAAQ2S,CAAAA,GAAG,CAAC6B,EAAID,EAAAA,EAAAA,EAAI1F,cAAcM,MAAM,CAAA;AACnD,QAAA,MAAM2F,KAAK9U,OAAQ2S,CAAAA,GAAG,CAAC8B,EAAIF,EAAAA,EAAAA,EAAI1F,cAAcO,MAAM,CAAA;AACnD,QAAA,MAAM2F,IAAI/U,OAAQgV,CAAAA,KAAK,CAACH,EAAIC,EAAAA,EAAAA,EAAIjG,cAAcQ,OAAO,CAAA;QACrD,MAAM4F,GAAAA,GAAMF,EAAEG,SAAS;AACvB,QAAA,IAAID,MAAM,KAAO,EAAA;YACf,OAAO,KAAA;AACT;QACAF,CAAE/B,CAAAA,OAAO,CAAC,CAAIiC,GAAAA,GAAAA,CAAAA;AACd,QAAA,IAAInM,CAAI,GAAA,CAAC9I,OAAQ6S,CAAAA,GAAG,CAACkC,CAAGR,EAAAA,EAAAA,CAAAA;AACxB,QAAA,IAAIvU,QAAQ6S,GAAG,CAACkC,CAAGL,EAAAA,MAAAA,CAAAA,GAAU5L,IAAI,CAAG,EAAA;YAClCiM,CAAE/B,CAAAA,OAAO,CAAC,EAAC,CAAA;AACXlK,YAAAA,CAAAA,GAAI,CAACA,CAAAA;AACP;AACA6L,QAAAA,GAAG,CAACC,MAAAA,CAAO,GAAGG,CAAAA,CAAEvY,CAAC;AACjBmY,QAAAA,GAAG,CAACC,MAAAA,GAAS,CAAE,CAAA,GAAGG,EAAEtY,CAAC;AACrBkY,QAAAA,GAAG,CAACC,MAAAA,GAAS,CAAE,CAAA,GAAGG,EAAErY,CAAC;QACrBiY,GAAG,CAACC,MAAS,GAAA,CAAA,CAAE,GAAG9L,CAAAA;QAClB,OAAO,IAAA;AACT;iCAEA,IAAIqM,cAAiB,GAAA;AACnB,QAAA,OAAO,IAAI,CAACtF,OAAO,CAACuF,MAAM,CAAC,CAACC,GAAAA,EAAK9E,KAAU8E,GAAAA,GAAAA,GAAM9E,KAAMtK,CAAAA,SAAS,EAAE,CAAA,CAAA;AACpE;iCAEA,IAAIqP,SAAY,GAAA;AACd,QAAA,OAAO,IAAI,CAACzF,OAAO,CAACtQ,MAAM;AAC5B;AACA;;;;MAKAgW,QAAAA,CAASxR,KAAa,EAAE;AACtB,QAAA,OAAO,IAAI,CAAC8L,OAAO,CAAC9L,KAAM,CAAA;AAC5B;AACA;;;;;;;MAQAyR,QAAAA,CACElU,UAAkB,EAClBC,WAAmB,EACnBC,SAA+B,EAC/BC,IAAuB,GAAA,MAAM,EAC7B;AACA,QAAA,MAAM8O,QAAQ,IAAI7Q,UAAAA,CAChB,IAAI,CAACkQ,QAAQ,CAAC7R,GAAG,EACjB,EAAA,IAAI,CAAC8R,OAAO,CAACtQ,MAAM,EACnB+B,UAAAA,EACAC,aACAC,SACAC,EAAAA,IAAAA,CAAAA;AAEF8O,QAAAA,KAAAA,CAAMxE,iBAAiB,CAAC,IAAI,CAACgE,eAAe,CAAA;AAC5C,QAAA,IAAI,CAACF,OAAO,CAAC/B,IAAI,CAACyC,KAAAA,CAAAA;AAClB,QAAA,OAAO,IAAI,CAACV,OAAO,CAACtQ,MAAM,GAAG,CAAA;AAC/B;AACA;;;;MAKAkW,eAAAA,CAAgBlF,KAAa,EAAE;AAC7B,QAAA,OAAO,IAAI,CAACV,OAAO,CAACU,KAAAA,CAAM,EAAE1M,YAAkB,EAAA,IAAA,IAAA;AAChD;AACA;;;;AAIC,MACD6R,eAAgBnF,CAAAA,KAAa,EAAEoF,OAAkB,EAAE;AACjD,QAAA,MAAMC,UAAa,GAAA,IAAI,CAAC/F,OAAO,CAACU,KAAM,CAAA;AACtC,QAAA,IAAIqF,UAAY,EAAA;AACdA,YAAAA,UAAAA,CAAWhS,YAAY,CAAC+R,OAAAA,CAAAA;SACnB,MAAA;AACLnP,YAAAA,OAAAA,CAAQC,KAAK,CAAC,CAAC,qBAAqB,EAAE8J,KAAO,CAAA,CAAA,CAAA;AAC/C;AACF;AACA;;;;MAKAsF,eAAAA,CAAgBtF,KAAa,EAAE;AAC7B,QAAA,OAAO,IAAI,CAACV,OAAO,CAACU,KAAAA,CAAM,EAAErN,YAAgB,IAAA,CAAA;AAC9C;AACA;;;;AAIC,MACDK,eAAgBgN,CAAAA,KAAa,EAAE+D,QAAgB,EAAE;AAC/C,QAAA,MAAMsB,UAAa,GAAA,IAAI,CAAC/F,OAAO,CAACU,KAAM,CAAA;AACtC,QAAA,IAAIqF,UAAY,EAAA;AACdA,YAAAA,UAAAA,CAAW1S,YAAY,GAAGoR,QAAAA;SACrB,MAAA;AACL9N,YAAAA,OAAAA,CAAQC,KAAK,CAAC,CAAC,qBAAqB,EAAE8J,KAAO,CAAA,CAAA,CAAA;AAC/C;AACF;AACA;;;;MAKAuF,aAAAA,CAAcvF,KAAa,EAAE;AAC3B,QAAA,OAAO,IAAI,CAACV,OAAO,CAACU,KAAAA,CAAM,EAAEpN,UAAc,IAAA,CAAA;AAC5C;AACA;;;;AAIC,MACDM,aAAc8M,CAAAA,KAAa,EAAEpN,UAAkB,EAAE;AAC/C,QAAA,MAAMyS,UAAa,GAAA,IAAI,CAAC/F,OAAO,CAACU,KAAM,CAAA;AACtC,QAAA,IAAIqF,UAAY,EAAA;AACdA,YAAAA,UAAAA,CAAWzS,UAAU,GAAGA,UAAAA;SACnB,MAAA;AACLqD,YAAAA,OAAAA,CAAQC,KAAK,CAAC,CAAC,qBAAqB,EAAE8J,KAAO,CAAA,CAAA,CAAA;AAC/C;AACF;AACA;;;;MAKAwF,aAAAA,CAAcxF,KAAa,EAAE;AAC3B,QAAA,OAAO,IAAI,CAACV,OAAO,CAACU,KAAAA,CAAM,EAAEjP,UAAc,IAAA,CAAA;AAC5C;AACA;;;;MAKA0U,cAAAA,CAAezF,KAAa,EAAE;AAC5B,QAAA,OAAO,IAAI,CAACV,OAAO,CAACU,KAAAA,CAAM,EAAEhP,WAAe,IAAA,CAAA;AAC7C;AACA;;;;;AAKC,MACDyG,aAAauI,KAAa,EAAEvO,KAAa,EAAEC,MAAc,EAAE;AACzD,QAAA,MAAM2T,UAAa,GAAA,IAAI,CAAC/F,OAAO,CAACU,KAAM,CAAA;AACtC,QAAA,IAAIqF,UAAY,EAAA;YACdA,UAAW5N,CAAAA,YAAY,CAAChG,KAAOC,EAAAA,MAAAA,CAAAA;SAC1B,MAAA;AACLuE,YAAAA,OAAAA,CAAQC,KAAK,CAAC,CAAC,qBAAqB,EAAE8J,KAAO,CAAA,CAAA,CAAA;AAC/C;AACF;qBAEAxR,IAAK6M,CAAAA,GAAgB,EAAE;AACrB,QAAA,IAAIA,GAAI6C,CAAAA,UAAU,CAAEC,IAAI,KAAKC,0BAA4B,EAAA;;AAEvD,YAAA,MAAMsH,KAAQ,GAACrK,GAAI6C,CAAAA,UAAU,CAAmBwH,KAAK;AACrD,YAAA,IAAIA,SAASA,KAAU,KAAA,IAAI,CAAC5F,YAAY,CAACtS,GAAG,EAAI,EAAA;AAC9C,gBAAA,MAAMmY,UAAUtK,GAAIuK,CAAAA,aAAa,EAAEpY,GAAAA,CAAIkY,QAAQG,YAAgB,IAAA,CAAA;AAC/D,gBAAA,KAAK,MAAM7F,KAAAA,IAAS,IAAI,CAACV,OAAO,CAAE;oBAChCU,KAAM5E,CAAAA,UAAU,CAACC,GAAKsK,EAAAA,OAAAA,CAAAA;AACxB;AACF;AACA,YAAA;AACF;QACA,MAAMG,EAAAA,GAAK,IAAI,CAACzG,QAAQ,CAAC7R,GAAG,EAAA,CAAIuY,sBAAsB,EAAA,CAAIC,MAAM,EAAA;AAChE,QAAA,MAAMrK,IAAOmK,GAAAA,EAAAA,CAAGtZ,QAAQ,CAACN,CAAC;AAC1B,QAAA,MAAM0P,IAAOkK,GAAAA,EAAAA,CAAGrZ,QAAQ,CAACP,CAAC;AAC1B,QAAA,KAAK,MAAM8T,KAAAA,IAAS,IAAI,CAACV,OAAO,CAAE;AAChCU,YAAAA,KAAAA,CAAMxR,IAAI,CAAC6M,GAAAA,EAAK,IAAI,CAACgE,QAAQ,CAAC7R,GAAG,EAAIyY,CAAAA,WAAW,EAAEtK,IAAOqE,GAAAA,KAAAA,CAAMhP,WAAW,EAAE4K,IAAAA,GAAOoE,MAAMhP,WAAW,CAAA;AACtG;AACF;IACU9B,SAAY,GAAA;AACpB,QAAA,KAAK,CAACA,SAAAA,EAAAA;QACN,IAAI,CAACmQ,QAAQ,CAAC3R,OAAO,EAAA;QACrB,IAAI,CAACoS,YAAY,CAACpS,OAAO,EAAA;AACzB,QAAA,KAAK,MAAMsS,KAAAA,IAAS,IAAI,CAACV,OAAO,CAAE;AAChCU,YAAAA,KAAAA,CAAMtS,OAAO,EAAA;AACf;AACF;AACF;;;;"}