@zephyr3d/scene 0.9.5 → 0.9.7

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 (621) hide show
  1. package/dist/animation/joint_dynamics/controller.js +92 -32
  2. package/dist/animation/joint_dynamics/controller.js.map +1 -1
  3. package/dist/animation/joint_dynamics/convex_collider.js +320 -0
  4. package/dist/animation/joint_dynamics/convex_collider.js.map +1 -0
  5. package/dist/animation/joint_dynamics/joint_dynamics_system.js +57 -19
  6. package/dist/animation/joint_dynamics/joint_dynamics_system.js.map +1 -1
  7. package/dist/animation/joint_dynamics/solver.js +71 -27
  8. package/dist/animation/joint_dynamics/solver.js.map +1 -1
  9. package/dist/animation/joint_dynamics_modifier.js +21 -20
  10. package/dist/animation/joint_dynamics_modifier.js.map +1 -1
  11. package/dist/animation/skeleton.js +7 -10
  12. package/dist/animation/skeleton.js.map +1 -1
  13. package/dist/app/engine.js +134 -140
  14. package/dist/app/engine.js.map +1 -1
  15. package/dist/app/scriptregistry.js +47 -16
  16. package/dist/app/scriptregistry.js.map +1 -1
  17. package/dist/asset/assetmanager.js +3 -1
  18. package/dist/asset/assetmanager.js.map +1 -1
  19. package/dist/asset/model.js +346 -7
  20. package/dist/asset/model.js.map +1 -1
  21. package/dist/avatar/wardrobe.js +20 -16
  22. package/dist/avatar/wardrobe.js.map +1 -1
  23. package/dist/camera/camera.js +416 -210
  24. package/dist/camera/camera.js.map +1 -1
  25. package/dist/index.d.ts +1350 -621
  26. package/dist/index.js +6 -11
  27. package/dist/index.js.map +1 -1
  28. package/dist/material/blinn.js +1 -1
  29. package/dist/material/blinn.js.map +1 -1
  30. package/dist/material/lambert.js +1 -1
  31. package/dist/material/lambert.js.map +1 -1
  32. package/dist/material/material.js +23 -1
  33. package/dist/material/material.js.map +1 -1
  34. package/dist/material/meshmaterial.js +178 -23
  35. package/dist/material/meshmaterial.js.map +1 -1
  36. package/dist/material/mixins/albedocolor.js +4 -4
  37. package/dist/material/mixins/albedocolor.js.map +1 -1
  38. package/dist/material/mixins/lightmodel/blinnphong.js +2 -1
  39. package/dist/material/mixins/lightmodel/blinnphong.js.map +1 -1
  40. package/dist/material/mixins/lightmodel/lambert.js +2 -1
  41. package/dist/material/mixins/lightmodel/lambert.js.map +1 -1
  42. package/dist/material/mixins/lightmodel/pbrblueprintmixin.js +63 -16
  43. package/dist/material/mixins/lightmodel/pbrblueprintmixin.js.map +1 -1
  44. package/dist/material/mixins/lightmodel/pbrmetallicroughness.js +105 -32
  45. package/dist/material/mixins/lightmodel/pbrmetallicroughness.js.map +1 -1
  46. package/dist/material/mixins/lightmodel/pbrspecularglossness.js +16 -6
  47. package/dist/material/mixins/lightmodel/pbrspecularglossness.js.map +1 -1
  48. package/dist/material/mixins/lit.js +1 -1
  49. package/dist/material/mixins/lit.js.map +1 -1
  50. package/dist/material/mixins/pbr/common.js +276 -65
  51. package/dist/material/mixins/pbr/common.js.map +1 -1
  52. package/dist/material/mixins/texture.js +3 -3
  53. package/dist/material/mixins/texture.js.map +1 -1
  54. package/dist/material/mixins/vertexcolor.js +2 -2
  55. package/dist/material/mixins/vertexcolor.js.map +1 -1
  56. package/dist/material/msdf_text.js +3 -3
  57. package/dist/material/msdf_text.js.map +1 -1
  58. package/dist/material/mtoon.js +574 -0
  59. package/dist/material/mtoon.js.map +1 -0
  60. package/dist/material/pbrblueprint.js +499 -336
  61. package/dist/material/pbrblueprint.js.map +1 -1
  62. package/dist/material/pbrmr.js +118 -100
  63. package/dist/material/pbrmr.js.map +1 -1
  64. package/dist/material/pbrsg.js +1 -1
  65. package/dist/material/pbrsg.js.map +1 -1
  66. package/dist/material/shader/helper.js +324 -294
  67. package/dist/material/shader/helper.js.map +1 -1
  68. package/dist/material/subsurfaceprofile.js +812 -0
  69. package/dist/material/subsurfaceprofile.js.map +1 -0
  70. package/dist/material/unlit.js +1 -1
  71. package/dist/material/unlit.js.map +1 -1
  72. package/dist/posteffect/compositor.js +46 -11
  73. package/dist/posteffect/compositor.js.map +1 -1
  74. package/dist/posteffect/ssr.js +422 -96
  75. package/dist/posteffect/ssr.js.map +1 -1
  76. package/dist/posteffect/sss.js +1053 -0
  77. package/dist/posteffect/sss.js.map +1 -0
  78. package/dist/posteffect/taa.js +61 -60
  79. package/dist/posteffect/taa.js.map +1 -1
  80. package/dist/render/abuffer_oit.js +63 -12
  81. package/dist/render/abuffer_oit.js.map +1 -1
  82. package/dist/render/cluster_light.js +6 -5
  83. package/dist/render/cluster_light.js.map +1 -1
  84. package/dist/render/drawable.js +1 -5
  85. package/dist/render/drawable.js.map +1 -1
  86. package/dist/render/drawable_mixin.js +2 -1
  87. package/dist/render/drawable_mixin.js.map +1 -1
  88. package/dist/render/fbm_wavegenerator.js +2 -1
  89. package/dist/render/fbm_wavegenerator.js.map +1 -1
  90. package/dist/render/gerstner_wavegenerator.js +2 -1
  91. package/dist/render/gerstner_wavegenerator.js.map +1 -1
  92. package/dist/render/globalbindgroup_allocator.js +2 -1
  93. package/dist/render/globalbindgroup_allocator.js.map +1 -1
  94. package/dist/render/lightpass.js +110 -23
  95. package/dist/render/lightpass.js.map +1 -1
  96. package/dist/render/render_queue.js +51 -8
  97. package/dist/render/render_queue.js.map +1 -1
  98. package/dist/render/renderer.js +80 -66
  99. package/dist/render/renderer.js.map +1 -1
  100. package/dist/render/rendergraph/device_pool_allocator.js +8 -0
  101. package/dist/render/rendergraph/device_pool_allocator.js.map +1 -1
  102. package/dist/render/rendergraph/forward_plus_builder.js +481 -95
  103. package/dist/render/rendergraph/forward_plus_builder.js.map +1 -1
  104. package/dist/render/rendergraph/history_resource_manager.js +55 -0
  105. package/dist/render/rendergraph/history_resource_manager.js.map +1 -1
  106. package/dist/render/rendergraph/history_resources.js +3 -1
  107. package/dist/render/rendergraph/history_resources.js.map +1 -1
  108. package/dist/render/rendergraph/types.js.map +1 -1
  109. package/dist/render/renderpass.js +10 -4
  110. package/dist/render/renderpass.js.map +1 -1
  111. package/dist/render/sky.js +31 -1
  112. package/dist/render/sky.js.map +1 -1
  113. package/dist/render/weightedblended_oit.js +23 -5
  114. package/dist/render/weightedblended_oit.js.map +1 -1
  115. package/dist/scene/basesprite.js +4 -2
  116. package/dist/scene/basesprite.js.map +1 -1
  117. package/dist/scene/batchgroup.js +3 -1
  118. package/dist/scene/batchgroup.js.map +1 -1
  119. package/dist/scene/environment.js +11 -1
  120. package/dist/scene/environment.js.map +1 -1
  121. package/dist/scene/light.js +21 -3
  122. package/dist/scene/light.js.map +1 -1
  123. package/dist/scene/mesh.js +29 -14
  124. package/dist/scene/mesh.js.map +1 -1
  125. package/dist/scene/meshdrawable.js +6 -0
  126. package/dist/scene/meshdrawable.js.map +1 -1
  127. package/dist/scene/msdftext.js +5 -2
  128. package/dist/scene/msdftext.js.map +1 -1
  129. package/dist/scene/msdftextsprite.js +5 -3
  130. package/dist/scene/msdftextsprite.js.map +1 -1
  131. package/dist/scene/particlesys.js +3 -1
  132. package/dist/scene/particlesys.js.map +1 -1
  133. package/dist/scene/scene.js +6 -5
  134. package/dist/scene/scene.js.map +1 -1
  135. package/dist/scene/terrain-cm/grass.js +4 -2
  136. package/dist/scene/terrain-cm/grass.js.map +1 -1
  137. package/dist/scene/terrain-cm/grassmaterial.js +2 -1
  138. package/dist/scene/terrain-cm/grassmaterial.js.map +1 -1
  139. package/dist/scene/terrain-cm/terrain-cm.js +4 -2
  140. package/dist/scene/terrain-cm/terrain-cm.js.map +1 -1
  141. package/dist/scene/water.js +4 -2
  142. package/dist/scene/water.js.map +1 -1
  143. package/dist/shaders/shadow.js +26 -393
  144. package/dist/shaders/shadow.js.map +1 -1
  145. package/dist/shadow/esm.js +112 -12
  146. package/dist/shadow/esm.js.map +1 -1
  147. package/dist/shadow/pcf_opt.js +2 -2
  148. package/dist/shadow/pcf_opt.js.map +1 -1
  149. package/dist/shadow/pcf_pd.js +19 -10
  150. package/dist/shadow/pcf_pd.js.map +1 -1
  151. package/dist/shadow/shader.js +58 -7
  152. package/dist/shadow/shader.js.map +1 -1
  153. package/dist/shadow/shadow_impl.js +6 -0
  154. package/dist/shadow/shadow_impl.js.map +1 -1
  155. package/dist/shadow/shadow_region.js +229 -0
  156. package/dist/shadow/shadow_region.js.map +1 -0
  157. package/dist/shadow/shadowmapper.js +67 -59
  158. package/dist/shadow/shadowmapper.js.map +1 -1
  159. package/dist/shadow/vsm.js +45 -19
  160. package/dist/shadow/vsm.js.map +1 -1
  161. package/dist/text/font/cff_font.js +890 -0
  162. package/dist/text/font/cff_font.js.map +1 -0
  163. package/dist/text/font/font_asset.js +17 -3
  164. package/dist/text/font/font_asset.js.map +1 -1
  165. package/dist/utility/blueprint/common/constants.js +8 -8
  166. package/dist/utility/blueprint/common/constants.js.map +1 -1
  167. package/dist/utility/blueprint/material/pbr.js +31 -4
  168. package/dist/utility/blueprint/material/pbr.js.map +1 -1
  169. package/dist/utility/blueprint/material/texture.js +1 -17
  170. package/dist/utility/blueprint/material/texture.js.map +1 -1
  171. package/dist/utility/serialization/manager.js +327 -359
  172. package/dist/utility/serialization/manager.js.map +1 -1
  173. package/dist/utility/serialization/scene/animation.js +5 -2
  174. package/dist/utility/serialization/scene/animation.js.map +1 -1
  175. package/dist/utility/serialization/scene/batch.js +4 -1
  176. package/dist/utility/serialization/scene/batch.js.map +1 -1
  177. package/dist/utility/serialization/scene/camera.js +249 -54
  178. package/dist/utility/serialization/scene/camera.js.map +1 -1
  179. package/dist/utility/serialization/scene/common.js +37 -1
  180. package/dist/utility/serialization/scene/common.js.map +1 -1
  181. package/dist/utility/serialization/scene/light.js +42 -3
  182. package/dist/utility/serialization/scene/light.js.map +1 -1
  183. package/dist/utility/serialization/scene/material.js +1112 -646
  184. package/dist/utility/serialization/scene/material.js.map +1 -1
  185. package/dist/utility/serialization/scene/mesh.js +7 -4
  186. package/dist/utility/serialization/scene/mesh.js.map +1 -1
  187. package/dist/utility/serialization/scene/node.js +31 -12
  188. package/dist/utility/serialization/scene/node.js.map +1 -1
  189. package/dist/utility/serialization/scene/particle.js +4 -1
  190. package/dist/utility/serialization/scene/particle.js.map +1 -1
  191. package/dist/utility/serialization/scene/primitive.js +3 -1
  192. package/dist/utility/serialization/scene/primitive.js.map +1 -1
  193. package/dist/utility/serialization/scene/scene.js +18 -0
  194. package/dist/utility/serialization/scene/scene.js.map +1 -1
  195. package/dist/utility/serialization/scene/sprite.js +6 -3
  196. package/dist/utility/serialization/scene/sprite.js.map +1 -1
  197. package/dist/utility/serialization/scene/terrain.js +5 -2
  198. package/dist/utility/serialization/scene/terrain.js.map +1 -1
  199. package/dist/utility/serialization/scene/text.js +3 -1
  200. package/dist/utility/serialization/scene/text.js.map +1 -1
  201. package/dist/utility/serialization/scene/water.js +4 -1
  202. package/dist/utility/serialization/scene/water.js.map +1 -1
  203. package/dist/utility/textures/ltcdata.js +6 -0
  204. package/dist/utility/textures/ltcdata.js.map +1 -0
  205. package/dist/utility/textures/ltclut.js +61 -0
  206. package/dist/utility/textures/ltclut.js.map +1 -0
  207. package/dist/values.js +9 -1
  208. package/dist/values.js.map +1 -1
  209. package/package.json +3 -3
  210. package/dist/animation/ik/ik_chain_builder.js +0 -68
  211. package/dist/animation/ik/ik_chain_builder.js.map +0 -1
  212. package/dist/animation/ik/ik_pole_constraint.js +0 -123
  213. package/dist/animation/ik/ik_pole_constraint.js.map +0 -1
  214. package/dist/animation/ik/ik_track.js +0 -96
  215. package/dist/animation/ik/ik_track.js.map +0 -1
  216. package/dist/animation/ik_postprocessor.js +0 -71
  217. package/dist/animation/ik_postprocessor.js.map +0 -1
  218. package/dist/animation/joint_dynamics/math.js +0 -16
  219. package/dist/animation/joint_dynamics/math.js.map +0 -1
  220. package/dist/animation/manual_transform_processor.js +0 -156
  221. package/dist/animation/manual_transform_processor.js.map +0 -1
  222. package/dist/animation/skeleton_postprocessor.js +0 -50
  223. package/dist/animation/skeleton_postprocessor.js.map +0 -1
  224. package/dist/animation/spring2/collision.js +0 -469
  225. package/dist/animation/spring2/collision.js.map +0 -1
  226. package/dist/animation/spring2/constraints.js +0 -329
  227. package/dist/animation/spring2/constraints.js.map +0 -1
  228. package/dist/animation/spring2/controller.js +0 -434
  229. package/dist/animation/spring2/controller.js.map +0 -1
  230. package/dist/animation/spring2/math.js +0 -16
  231. package/dist/animation/spring2/math.js.map +0 -1
  232. package/dist/animation/spring2/solver.js +0 -624
  233. package/dist/animation/spring2/solver.js.map +0 -1
  234. package/dist/animation/spring2/spring_system.js +0 -118
  235. package/dist/animation/spring2/spring_system.js.map +0 -1
  236. package/dist/animation/spring2/types.js +0 -19
  237. package/dist/animation/spring2/types.js.map +0 -1
  238. package/dist/animation/spring_postprocessor.js +0 -54
  239. package/dist/animation/spring_postprocessor.js.map +0 -1
  240. package/dist/asset/loaders/gltf/gltf_loader.js +0 -1276
  241. package/dist/asset/loaders/gltf/gltf_loader.js.map +0 -1
  242. package/dist/asset/loaders/gltf/helpers.js +0 -331
  243. package/dist/asset/loaders/gltf/helpers.js.map +0 -1
  244. package/dist/material/sprite3d.js +0 -301
  245. package/dist/material/sprite3d.js.map +0 -1
  246. package/dist/material/sprite3d_std.js +0 -116
  247. package/dist/material/sprite3d_std.js.map +0 -1
  248. package/dist/material/sprite3dblueprint.js +0 -235
  249. package/dist/material/sprite3dblueprint.js.map +0 -1
  250. package/dist/material/sprite_sdf.js +0 -106
  251. package/dist/material/sprite_sdf.js.map +0 -1
  252. package/dist/material/terrainmaterial.js +0 -368
  253. package/dist/material/terrainmaterial.js.map +0 -1
  254. package/dist/node_modules/@zephyr3d/runtime/dist/runtime/runtimemgr.js +0 -38
  255. package/dist/node_modules/@zephyr3d/runtime/dist/runtime/runtimemgr.js.map +0 -1
  256. package/dist/node_modules/@zephyr3d/runtime/dist/runtime/runtimescript.js +0 -10
  257. package/dist/node_modules/@zephyr3d/runtime/dist/runtime/runtimescript.js.map +0 -1
  258. package/dist/node_modules/@zephyr3d/runtime/dist/runtime/scriptingsystem.js +0 -127
  259. package/dist/node_modules/@zephyr3d/runtime/dist/runtime/scriptingsystem.js.map +0 -1
  260. package/dist/node_modules/@zephyr3d/runtime/dist/runtime/scriptregistry.js +0 -263
  261. package/dist/node_modules/@zephyr3d/runtime/dist/runtime/scriptregistry.js.map +0 -1
  262. package/dist/render/deferredlightpass.js +0 -510
  263. package/dist/render/deferredlightpass.js.map +0 -1
  264. package/dist/render/deferredshadowlightpass.js +0 -428
  265. package/dist/render/deferredshadowlightpass.js.map +0 -1
  266. package/dist/render/gbufferpass.js +0 -50
  267. package/dist/render/gbufferpass.js.map +0 -1
  268. package/dist/scene/sdftextsprite.js +0 -322
  269. package/dist/scene/sdftextsprite.js.map +0 -1
  270. package/dist/scene/sprite3d.js +0 -18
  271. package/dist/scene/sprite3d.js.map +0 -1
  272. package/dist/scene/terrain/grass.js +0 -280
  273. package/dist/scene/terrain/grass.js.map +0 -1
  274. package/dist/scene/terrain/heightfield.js +0 -475
  275. package/dist/scene/terrain/heightfield.js.map +0 -1
  276. package/dist/scene/terrain/patch.js +0 -532
  277. package/dist/scene/terrain/patch.js.map +0 -1
  278. package/dist/scene/terrain/quadtree.js +0 -461
  279. package/dist/scene/terrain/quadtree.js.map +0 -1
  280. package/dist/scene/terrain/terrain.js +0 -231
  281. package/dist/scene/terrain/terrain.js.map +0 -1
  282. package/dist/src/animation/animation.js +0 -127
  283. package/dist/src/animation/animation.js.map +0 -1
  284. package/dist/src/animation/animationset.js +0 -255
  285. package/dist/src/animation/animationset.js.map +0 -1
  286. package/dist/src/animation/animationtrack.js +0 -34
  287. package/dist/src/animation/animationtrack.js.map +0 -1
  288. package/dist/src/animation/eulerrotationtrack.js +0 -52
  289. package/dist/src/animation/eulerrotationtrack.js.map +0 -1
  290. package/dist/src/animation/morphtarget.js +0 -93
  291. package/dist/src/animation/morphtarget.js.map +0 -1
  292. package/dist/src/animation/morphtrack.js +0 -70
  293. package/dist/src/animation/morphtrack.js.map +0 -1
  294. package/dist/src/animation/proptrack.js +0 -161
  295. package/dist/src/animation/proptrack.js.map +0 -1
  296. package/dist/src/animation/rotationtrack.js +0 -51
  297. package/dist/src/animation/rotationtrack.js.map +0 -1
  298. package/dist/src/animation/scaletrack.js +0 -50
  299. package/dist/src/animation/scaletrack.js.map +0 -1
  300. package/dist/src/animation/skeleton.js +0 -204
  301. package/dist/src/animation/skeleton.js.map +0 -1
  302. package/dist/src/animation/translationtrack.js +0 -50
  303. package/dist/src/animation/translationtrack.js.map +0 -1
  304. package/dist/src/app/app.js +0 -129
  305. package/dist/src/app/app.js.map +0 -1
  306. package/dist/src/app/inputmgr.js +0 -267
  307. package/dist/src/app/inputmgr.js.map +0 -1
  308. package/dist/src/asset/assetmanager.js +0 -404
  309. package/dist/src/asset/assetmanager.js.map +0 -1
  310. package/dist/src/asset/builtin.js +0 -337
  311. package/dist/src/asset/builtin.js.map +0 -1
  312. package/dist/src/asset/loaders/dds/dds.js +0 -470
  313. package/dist/src/asset/loaders/dds/dds.js.map +0 -1
  314. package/dist/src/asset/loaders/dds/dds_loader.js +0 -28
  315. package/dist/src/asset/loaders/dds/dds_loader.js.map +0 -1
  316. package/dist/src/asset/loaders/gltf/gltf_loader.js +0 -1265
  317. package/dist/src/asset/loaders/gltf/gltf_loader.js.map +0 -1
  318. package/dist/src/asset/loaders/gltf/helpers.js +0 -327
  319. package/dist/src/asset/loaders/gltf/helpers.js.map +0 -1
  320. package/dist/src/asset/loaders/hdr/hdr.js +0 -180
  321. package/dist/src/asset/loaders/hdr/hdr.js.map +0 -1
  322. package/dist/src/asset/loaders/image/tga_Loader.js +0 -116
  323. package/dist/src/asset/loaders/image/tga_Loader.js.map +0 -1
  324. package/dist/src/asset/loaders/image/webimage_loader.js +0 -63
  325. package/dist/src/asset/loaders/image/webimage_loader.js.map +0 -1
  326. package/dist/src/asset/loaders/loader.js +0 -45
  327. package/dist/src/asset/loaders/loader.js.map +0 -1
  328. package/dist/src/asset/model.js +0 -414
  329. package/dist/src/asset/model.js.map +0 -1
  330. package/dist/src/blitter/bilateralblur.js +0 -221
  331. package/dist/src/blitter/bilateralblur.js.map +0 -1
  332. package/dist/src/blitter/blitter.js +0 -390
  333. package/dist/src/blitter/blitter.js.map +0 -1
  334. package/dist/src/blitter/box.js +0 -118
  335. package/dist/src/blitter/box.js.map +0 -1
  336. package/dist/src/blitter/copy.js +0 -22
  337. package/dist/src/blitter/copy.js.map +0 -1
  338. package/dist/src/blitter/gaussianblur.js +0 -228
  339. package/dist/src/blitter/gaussianblur.js.map +0 -1
  340. package/dist/src/camera/base.js +0 -92
  341. package/dist/src/camera/base.js.map +0 -1
  342. package/dist/src/camera/camera.js +0 -1005
  343. package/dist/src/camera/camera.js.map +0 -1
  344. package/dist/src/camera/fps.js +0 -238
  345. package/dist/src/camera/fps.js.map +0 -1
  346. package/dist/src/camera/orbit.js +0 -245
  347. package/dist/src/camera/orbit.js.map +0 -1
  348. package/dist/src/camera/orthocamera.js +0 -167
  349. package/dist/src/camera/orthocamera.js.map +0 -1
  350. package/dist/src/camera/perspectivecamera.js +0 -141
  351. package/dist/src/camera/perspectivecamera.js.map +0 -1
  352. package/dist/src/index.js +0 -120
  353. package/dist/src/index.js.map +0 -1
  354. package/dist/src/material/blinn.js +0 -81
  355. package/dist/src/material/blinn.js.map +0 -1
  356. package/dist/src/material/grassmaterial.js +0 -113
  357. package/dist/src/material/grassmaterial.js.map +0 -1
  358. package/dist/src/material/lambert.js +0 -92
  359. package/dist/src/material/lambert.js.map +0 -1
  360. package/dist/src/material/material.js +0 -301
  361. package/dist/src/material/material.js.map +0 -1
  362. package/dist/src/material/meshmaterial.js +0 -704
  363. package/dist/src/material/meshmaterial.js.map +0 -1
  364. package/dist/src/material/mixins/albedocolor.js +0 -76
  365. package/dist/src/material/mixins/albedocolor.js.map +0 -1
  366. package/dist/src/material/mixins/foliage.js +0 -47
  367. package/dist/src/material/mixins/foliage.js.map +0 -1
  368. package/dist/src/material/mixins/lightmodel/blinnphong.js +0 -112
  369. package/dist/src/material/mixins/lightmodel/blinnphong.js.map +0 -1
  370. package/dist/src/material/mixins/lightmodel/lambert.js +0 -58
  371. package/dist/src/material/mixins/lightmodel/lambert.js.map +0 -1
  372. package/dist/src/material/mixins/lightmodel/pbrmetallicroughness.js +0 -178
  373. package/dist/src/material/mixins/lightmodel/pbrmetallicroughness.js.map +0 -1
  374. package/dist/src/material/mixins/lightmodel/pbrspecularglossness.js +0 -139
  375. package/dist/src/material/mixins/lightmodel/pbrspecularglossness.js.map +0 -1
  376. package/dist/src/material/mixins/lit.js +0 -476
  377. package/dist/src/material/mixins/lit.js.map +0 -1
  378. package/dist/src/material/mixins/pbr/common.js +0 -918
  379. package/dist/src/material/mixins/pbr/common.js.map +0 -1
  380. package/dist/src/material/mixins/texture.js +0 -172
  381. package/dist/src/material/mixins/texture.js.map +0 -1
  382. package/dist/src/material/mixins/vertexcolor.js +0 -56
  383. package/dist/src/material/mixins/vertexcolor.js.map +0 -1
  384. package/dist/src/material/particle.js +0 -178
  385. package/dist/src/material/particle.js.map +0 -1
  386. package/dist/src/material/pbrmr.js +0 -97
  387. package/dist/src/material/pbrmr.js.map +0 -1
  388. package/dist/src/material/pbrsg.js +0 -97
  389. package/dist/src/material/pbrsg.js.map +0 -1
  390. package/dist/src/material/shader/helper.js +0 -1209
  391. package/dist/src/material/shader/helper.js.map +0 -1
  392. package/dist/src/material/terrain-cm.js +0 -606
  393. package/dist/src/material/terrain-cm.js.map +0 -1
  394. package/dist/src/material/terrainmaterial.js +0 -375
  395. package/dist/src/material/terrainmaterial.js.map +0 -1
  396. package/dist/src/material/unlit.js +0 -41
  397. package/dist/src/material/unlit.js.map +0 -1
  398. package/dist/src/material/water.js +0 -417
  399. package/dist/src/material/water.js.map +0 -1
  400. package/dist/src/posteffect/bloom.js +0 -361
  401. package/dist/src/posteffect/bloom.js.map +0 -1
  402. package/dist/src/posteffect/compositor.js +0 -226
  403. package/dist/src/posteffect/compositor.js.map +0 -1
  404. package/dist/src/posteffect/fxaa.js +0 -273
  405. package/dist/src/posteffect/fxaa.js.map +0 -1
  406. package/dist/src/posteffect/grayscale.js +0 -69
  407. package/dist/src/posteffect/grayscale.js.map +0 -1
  408. package/dist/src/posteffect/motionblur.js +0 -96
  409. package/dist/src/posteffect/motionblur.js.map +0 -1
  410. package/dist/src/posteffect/posteffect.js +0 -126
  411. package/dist/src/posteffect/posteffect.js.map +0 -1
  412. package/dist/src/posteffect/sao.js +0 -324
  413. package/dist/src/posteffect/sao.js.map +0 -1
  414. package/dist/src/posteffect/ssr.js +0 -489
  415. package/dist/src/posteffect/ssr.js.map +0 -1
  416. package/dist/src/posteffect/taa.js +0 -172
  417. package/dist/src/posteffect/taa.js.map +0 -1
  418. package/dist/src/posteffect/tonemap.js +0 -94
  419. package/dist/src/posteffect/tonemap.js.map +0 -1
  420. package/dist/src/render/abuffer_oit.js +0 -361
  421. package/dist/src/render/abuffer_oit.js.map +0 -1
  422. package/dist/src/render/clipmap.js +0 -851
  423. package/dist/src/render/clipmap.js.map +0 -1
  424. package/dist/src/render/cluster_light.js +0 -333
  425. package/dist/src/render/cluster_light.js.map +0 -1
  426. package/dist/src/render/cull_visitor.js +0 -187
  427. package/dist/src/render/cull_visitor.js.map +0 -1
  428. package/dist/src/render/depthpass.js +0 -68
  429. package/dist/src/render/depthpass.js.map +0 -1
  430. package/dist/src/render/drawable_mixin.js +0 -227
  431. package/dist/src/render/drawable_mixin.js.map +0 -1
  432. package/dist/src/render/envlight.js +0 -463
  433. package/dist/src/render/envlight.js.map +0 -1
  434. package/dist/src/render/fbm_wavegenerator.js +0 -251
  435. package/dist/src/render/fbm_wavegenerator.js.map +0 -1
  436. package/dist/src/render/fft_wavegenerator.js +0 -1006
  437. package/dist/src/render/fft_wavegenerator.js.map +0 -1
  438. package/dist/src/render/fullscreenquad.js +0 -38
  439. package/dist/src/render/fullscreenquad.js.map +0 -1
  440. package/dist/src/render/gerstner_wavegenerator.js +0 -314
  441. package/dist/src/render/gerstner_wavegenerator.js.map +0 -1
  442. package/dist/src/render/globalbindgroup_allocator.js +0 -60
  443. package/dist/src/render/globalbindgroup_allocator.js.map +0 -1
  444. package/dist/src/render/hzb.js +0 -273
  445. package/dist/src/render/hzb.js.map +0 -1
  446. package/dist/src/render/lightpass.js +0 -172
  447. package/dist/src/render/lightpass.js.map +0 -1
  448. package/dist/src/render/objectcolorpass.js +0 -51
  449. package/dist/src/render/objectcolorpass.js.map +0 -1
  450. package/dist/src/render/primitive.js +0 -364
  451. package/dist/src/render/primitive.js.map +0 -1
  452. package/dist/src/render/render_queue.js +0 -467
  453. package/dist/src/render/render_queue.js.map +0 -1
  454. package/dist/src/render/renderbundle_wrapper.js +0 -152
  455. package/dist/src/render/renderbundle_wrapper.js.map +0 -1
  456. package/dist/src/render/renderer.js +0 -455
  457. package/dist/src/render/renderer.js.map +0 -1
  458. package/dist/src/render/renderpass.js +0 -200
  459. package/dist/src/render/renderpass.js.map +0 -1
  460. package/dist/src/render/shadowmap_pass.js +0 -56
  461. package/dist/src/render/shadowmap_pass.js.map +0 -1
  462. package/dist/src/render/sky.js +0 -1103
  463. package/dist/src/render/sky.js.map +0 -1
  464. package/dist/src/render/weightedblended_oit.js +0 -168
  465. package/dist/src/render/weightedblended_oit.js.map +0 -1
  466. package/dist/src/scene/batchgroup.js +0 -162
  467. package/dist/src/scene/batchgroup.js.map +0 -1
  468. package/dist/src/scene/environment.js +0 -209
  469. package/dist/src/scene/environment.js.map +0 -1
  470. package/dist/src/scene/graph_node.js +0 -72
  471. package/dist/src/scene/graph_node.js.map +0 -1
  472. package/dist/src/scene/light.js +0 -416
  473. package/dist/src/scene/light.js.map +0 -1
  474. package/dist/src/scene/mesh.js +0 -341
  475. package/dist/src/scene/mesh.js.map +0 -1
  476. package/dist/src/scene/octree.js +0 -649
  477. package/dist/src/scene/octree.js.map +0 -1
  478. package/dist/src/scene/particlesys.js +0 -738
  479. package/dist/src/scene/particlesys.js.map +0 -1
  480. package/dist/src/scene/raycast_visitor.js +0 -103
  481. package/dist/src/scene/raycast_visitor.js.map +0 -1
  482. package/dist/src/scene/scene.js +0 -284
  483. package/dist/src/scene/scene.js.map +0 -1
  484. package/dist/src/scene/scene_node.js +0 -732
  485. package/dist/src/scene/scene_node.js.map +0 -1
  486. package/dist/src/scene/terrain/grass.js +0 -278
  487. package/dist/src/scene/terrain/grass.js.map +0 -1
  488. package/dist/src/scene/terrain/heightfield.js +0 -475
  489. package/dist/src/scene/terrain/heightfield.js.map +0 -1
  490. package/dist/src/scene/terrain/patch.js +0 -530
  491. package/dist/src/scene/terrain/patch.js.map +0 -1
  492. package/dist/src/scene/terrain/quadtree.js +0 -461
  493. package/dist/src/scene/terrain/quadtree.js.map +0 -1
  494. package/dist/src/scene/terrain/terrain.js +0 -246
  495. package/dist/src/scene/terrain/terrain.js.map +0 -1
  496. package/dist/src/scene/terrain-cm/grass.js +0 -594
  497. package/dist/src/scene/terrain-cm/grass.js.map +0 -1
  498. package/dist/src/scene/terrain-cm/grassmaterial.js +0 -159
  499. package/dist/src/scene/terrain-cm/grassmaterial.js.map +0 -1
  500. package/dist/src/scene/terrain-cm/terrain-cm.js +0 -538
  501. package/dist/src/scene/terrain-cm/terrain-cm.js.map +0 -1
  502. package/dist/src/scene/water.js +0 -374
  503. package/dist/src/scene/water.js.map +0 -1
  504. package/dist/src/shaders/atmosphere.js +0 -957
  505. package/dist/src/shaders/atmosphere.js.map +0 -1
  506. package/dist/src/shaders/fog.js +0 -112
  507. package/dist/src/shaders/fog.js.map +0 -1
  508. package/dist/src/shaders/misc.js +0 -266
  509. package/dist/src/shaders/misc.js.map +0 -1
  510. package/dist/src/shaders/noise.js +0 -222
  511. package/dist/src/shaders/noise.js.map +0 -1
  512. package/dist/src/shaders/pbr.js +0 -51
  513. package/dist/src/shaders/pbr.js.map +0 -1
  514. package/dist/src/shaders/shadow.js +0 -636
  515. package/dist/src/shaders/shadow.js.map +0 -1
  516. package/dist/src/shaders/ssr.js +0 -490
  517. package/dist/src/shaders/ssr.js.map +0 -1
  518. package/dist/src/shaders/temporal.js +0 -215
  519. package/dist/src/shaders/temporal.js.map +0 -1
  520. package/dist/src/shaders/water.js +0 -756
  521. package/dist/src/shaders/water.js.map +0 -1
  522. package/dist/src/shadow/esm.js +0 -237
  523. package/dist/src/shadow/esm.js.map +0 -1
  524. package/dist/src/shadow/pcf_opt.js +0 -181
  525. package/dist/src/shadow/pcf_opt.js.map +0 -1
  526. package/dist/src/shadow/pcf_pd.js +0 -189
  527. package/dist/src/shadow/pcf_pd.js.map +0 -1
  528. package/dist/src/shadow/shader.js +0 -37
  529. package/dist/src/shadow/shader.js.map +0 -1
  530. package/dist/src/shadow/shadow_impl.js +0 -15
  531. package/dist/src/shadow/shadow_impl.js.map +0 -1
  532. package/dist/src/shadow/shadowmapper.js +0 -790
  533. package/dist/src/shadow/shadowmapper.js.map +0 -1
  534. package/dist/src/shadow/ssm.js +0 -159
  535. package/dist/src/shadow/ssm.js.map +0 -1
  536. package/dist/src/shadow/vsm.js +0 -297
  537. package/dist/src/shadow/vsm.js.map +0 -1
  538. package/dist/src/shapes/box.js +0 -386
  539. package/dist/src/shapes/box.js.map +0 -1
  540. package/dist/src/shapes/cylinder.js +0 -125
  541. package/dist/src/shapes/cylinder.js.map +0 -1
  542. package/dist/src/shapes/plane.js +0 -88
  543. package/dist/src/shapes/plane.js.map +0 -1
  544. package/dist/src/shapes/shape.js +0 -87
  545. package/dist/src/shapes/shape.js.map +0 -1
  546. package/dist/src/shapes/sphere.js +0 -114
  547. package/dist/src/shapes/sphere.js.map +0 -1
  548. package/dist/src/shapes/tetrahedron.js +0 -188
  549. package/dist/src/shapes/tetrahedron.js.map +0 -1
  550. package/dist/src/shapes/torus.js +0 -111
  551. package/dist/src/shapes/torus.js.map +0 -1
  552. package/dist/src/utility/aabbtree.js +0 -400
  553. package/dist/src/utility/aabbtree.js.map +0 -1
  554. package/dist/src/utility/bounding_volume.js +0 -29
  555. package/dist/src/utility/bounding_volume.js.map +0 -1
  556. package/dist/src/utility/debug.js +0 -28
  557. package/dist/src/utility/debug.js.map +0 -1
  558. package/dist/src/utility/draco/decoder.js +0 -116
  559. package/dist/src/utility/draco/decoder.js.map +0 -1
  560. package/dist/src/utility/misc.js +0 -105
  561. package/dist/src/utility/misc.js.map +0 -1
  562. package/dist/src/utility/panorama.js +0 -163
  563. package/dist/src/utility/panorama.js.map +0 -1
  564. package/dist/src/utility/pmrem.js +0 -354
  565. package/dist/src/utility/pmrem.js.map +0 -1
  566. package/dist/src/utility/rendermipmap.js +0 -115
  567. package/dist/src/utility/rendermipmap.js.map +0 -1
  568. package/dist/src/utility/serialization/json.js +0 -402
  569. package/dist/src/utility/serialization/json.js.map +0 -1
  570. package/dist/src/utility/serialization/manager.js +0 -623
  571. package/dist/src/utility/serialization/manager.js.map +0 -1
  572. package/dist/src/utility/serialization/scene/animation.js +0 -248
  573. package/dist/src/utility/serialization/scene/animation.js.map +0 -1
  574. package/dist/src/utility/serialization/scene/batch.js +0 -59
  575. package/dist/src/utility/serialization/scene/batch.js.map +0 -1
  576. package/dist/src/utility/serialization/scene/camera.js +0 -790
  577. package/dist/src/utility/serialization/scene/camera.js.map +0 -1
  578. package/dist/src/utility/serialization/scene/common.js +0 -222
  579. package/dist/src/utility/serialization/scene/common.js.map +0 -1
  580. package/dist/src/utility/serialization/scene/light.js +0 -575
  581. package/dist/src/utility/serialization/scene/light.js.map +0 -1
  582. package/dist/src/utility/serialization/scene/material.js +0 -1111
  583. package/dist/src/utility/serialization/scene/material.js.map +0 -1
  584. package/dist/src/utility/serialization/scene/mesh.js +0 -148
  585. package/dist/src/utility/serialization/scene/mesh.js.map +0 -1
  586. package/dist/src/utility/serialization/scene/misc.js +0 -39
  587. package/dist/src/utility/serialization/scene/misc.js.map +0 -1
  588. package/dist/src/utility/serialization/scene/node.js +0 -451
  589. package/dist/src/utility/serialization/scene/node.js.map +0 -1
  590. package/dist/src/utility/serialization/scene/particle.js +0 -425
  591. package/dist/src/utility/serialization/scene/particle.js.map +0 -1
  592. package/dist/src/utility/serialization/scene/primitive.js +0 -692
  593. package/dist/src/utility/serialization/scene/primitive.js.map +0 -1
  594. package/dist/src/utility/serialization/scene/scene.js +0 -704
  595. package/dist/src/utility/serialization/scene/scene.js.map +0 -1
  596. package/dist/src/utility/serialization/scene/terrain.js +0 -488
  597. package/dist/src/utility/serialization/scene/terrain.js.map +0 -1
  598. package/dist/src/utility/serialization/scene/water.js +0 -465
  599. package/dist/src/utility/serialization/scene/water.js.map +0 -1
  600. package/dist/src/utility/shprojector.js +0 -297
  601. package/dist/src/utility/shprojector.js.map +0 -1
  602. package/dist/src/utility/textures/ggxlut.js +0 -213
  603. package/dist/src/utility/textures/ggxlut.js.map +0 -1
  604. package/dist/src/utility/textures/gradientnoise.js +0 -62
  605. package/dist/src/utility/textures/gradientnoise.js.map +0 -1
  606. package/dist/src/utility/textures/randomnoise.js +0 -41
  607. package/dist/src/utility/textures/randomnoise.js.map +0 -1
  608. package/dist/src/values.js +0 -162
  609. package/dist/src/values.js.map +0 -1
  610. package/dist/utility/blueprint/material/common.js +0 -7
  611. package/dist/utility/blueprint/material/common.js.map +0 -1
  612. package/dist/utility/serialization/blueprint/constants.js +0 -255
  613. package/dist/utility/serialization/blueprint/constants.js.map +0 -1
  614. package/dist/utility/serialization/blueprint/material/constants.js +0 -203
  615. package/dist/utility/serialization/blueprint/material/constants.js.map +0 -1
  616. package/dist/utility/serialization/blueprint/material/texture.js +0 -165
  617. package/dist/utility/serialization/blueprint/material/texture.js.map +0 -1
  618. package/dist/utility/serialization/scene/cloth_script.js +0 -834
  619. package/dist/utility/serialization/scene/cloth_script.js.map +0 -1
  620. package/dist/utility/serialization/scene/spring_script.js +0 -596
  621. package/dist/utility/serialization/scene/spring_script.js.map +0 -1
@@ -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 { Nullable, 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 type { Camera } from '../../camera';\r\nimport { getDevice } from '../../app/api';\r\n\r\nconst MAX_INSTANCES_PER_NODE = 2048;\r\n\r\n/**\r\n * Grass blade instance information\r\n * @public\r\n */\r\nexport type GrassInstanceInfo = {\r\n /** x position of the blade */\r\n x: number;\r\n /** y position of the blade */\r\n y: number;\r\n /** Rotation angle of the blade */\r\n angle: number;\r\n};\r\n// Two floats\r\nconst INSTANCE_BYTES = 4 * 4;\r\n\r\n/**\r\n * Grass glade instance manager class\r\n * @internal\r\n */\r\nexport class GrassInstances extends Disposable {\r\n private readonly _instances: GrassInstanceInfo[];\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._instances = [];\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._instances.length;\r\n }\r\n get instanceBuffer() {\r\n return this._instanceBuffer.get()!;\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 draw() {\r\n if (this._instances.length > 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._instances.length);\r\n }\r\n }\r\n updateBuffers() {\r\n const device = getDevice();\r\n if (this._instances.length === 0) {\r\n this._instanceBuffer.set(null);\r\n return;\r\n }\r\n if (this._instances.length > 0 && !this._instanceBuffer.get()) {\r\n this._instanceBuffer.set(\r\n device.createVertexBuffer('tex1_f32x4', new Uint8Array(this._instances.length * INSTANCE_BYTES))\r\n );\r\n }\r\n let buffer = this._instanceBuffer.get()!;\r\n const currentBytes = buffer.byteLength;\r\n const bytesRequired = this._instances.length * INSTANCE_BYTES;\r\n if (currentBytes < 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 const data = new Float32Array(4 * this._instances.length);\r\n for (let i = 0; i < this._instances.length; i++) {\r\n data[i * 4 + 0] = this._instances[i].x;\r\n data[i * 4 + 1] = this._instances[i].y;\r\n data[i * 4 + 2] = Math.sin(this._instances[i].angle);\r\n data[i * 4 + 3] = Math.cos(this._instances[i].angle);\r\n }\r\n buffer.bufferSubData(0, data);\r\n }\r\n removeInstances(minX: number, minZ: number, maxX: number, maxZ: number, num: number) {\r\n if (num <= 0) {\r\n return 0;\r\n }\r\n let removed = 0;\r\n for (let i = this._instances.length - 1; i >= 0; i--) {\r\n const instance = this._instances[i];\r\n if (instance.x >= minX && instance.x <= maxX && instance.y >= minZ && instance.y <= maxZ) {\r\n this._instances.splice(i, 1);\r\n removed++;\r\n if (removed === num) {\r\n break;\r\n }\r\n }\r\n }\r\n if (removed > 0) {\r\n this.updateBuffers();\r\n }\r\n return removed;\r\n }\r\n addInstances(instances: GrassInstanceInfo[]) {\r\n this._instances.push(...instances);\r\n this.updateBuffers();\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 * @public\r\n */\r\nexport class GrassLayer extends Disposable {\r\n private static readonly _indexBuffer: DRef<IndexBuffer> = new DRef();\r\n private readonly _material: DRef<ClipmapGrassMaterial>;\r\n private readonly _quadtree: DRef<GrassQuadtreeNode>;\r\n private _bladeWidth: number;\r\n private _bladeHeight: number;\r\n private readonly _baseVertexBuffer: DRef<StructuredBuffer>;\r\n /**\r\n * Creates an instance of GrassLayer\r\n * @param terrain - Clipmap terrain object\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(terrain: ClipmapTerrain, bladeWidth: number, bladeHeight: number, albedoMap?: Texture2D) {\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._bladeWidth = bladeWidth;\r\n this._bladeHeight = bladeHeight;\r\n this._baseVertexBuffer = new DRef(this.createBaseVertexBuffer(this._bladeWidth, this._bladeHeight));\r\n this._quadtree = new DRef(\r\n new GrassQuadtreeNode(this._baseVertexBuffer.get()!, GrassLayer._getIndexBuffer()!)\r\n );\r\n }\r\n /** @internal */\r\n get quadtree() {\r\n return this._quadtree.get();\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 /**\r\n * Add grass blades to this layer in a region\r\n * @param instances - Grass blade instances to add\r\n */\r\n addInstances(instances: GrassInstanceInfo[]) {\r\n return this._quadtree.get()!.addInstances(instances);\r\n }\r\n /**\r\n * Remove grass blades to this layer in a region\r\n * @param minX - Minimum x position of the region\r\n * @param minZ - Minimum z position of the region\r\n * @param maxX - Maximum x position of the region\r\n * @param maxZ - Maximum z position of the region\r\n * @param numInstances - How many grass blades to add\r\n */\r\n removeInstances(minX: number, minZ: number, maxX: number, maxZ: number, numInstances: number) {\r\n this._quadtree.get()!.removeInstances(minX, minZ, maxX, maxZ, numInstances);\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 this._quadtree.get()!.setBaseVertexBuffer(this._baseVertexBuffer.get()!);\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 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 this._quadtree.get()!.draw(ctx.camera, region, minY, maxY, false);\r\n }\r\n }\r\n /** @internal */\r\n protected onDispose() {\r\n super.onDispose();\r\n this._material.dispose();\r\n this._quadtree.dispose();\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 _numGrassBlades: number;\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._numGrassBlades = 0;\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._numGrassBlades;\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(this._terrain.get()!, bladeWidth, bladeHeight, albedoMap);\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 /**\r\n * Add grass instances to the grass layer at given index\r\n * @param layer - Index of the grass layer\r\n * @param instances - Grass blade instances to add\r\n */\r\n addInstances(layer: number, instances: GrassInstanceInfo[]) {\r\n const grassLayer = this._layers[layer];\r\n if (!grassLayer) {\r\n console.error(`Invalid grass layer: ${layer}`);\r\n } else {\r\n this._numGrassBlades += grassLayer.addInstances(instances);\r\n }\r\n }\r\n /**\r\n * Remove grass instances from the grass layer at given index within a region\r\n * @param layer - Index of the grass layer\r\n * @param minX - Minimum x of the region\r\n * @param minZ - Minimum z of the region\r\n * @param maxX - Maximum x of the region\r\n * @param maxZ - Maximum z of the region\r\n * @param num - How many grass blades to remove\r\n */\r\n removeInstances(layer: number, minX: number, minZ: number, maxX: number, maxZ: number, num: number) {\r\n const grassLayer = this._layers[layer];\r\n if (!grassLayer) {\r\n console.error(`Invalid grass layer: ${layer}`);\r\n } else {\r\n grassLayer.removeInstances(minX, minZ, maxX, maxZ, num);\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\r\n/** @internal */\r\nexport class GrassQuadtreeNode extends Disposable {\r\n private static readonly _cullAABB = new AABB();\r\n private readonly _grassInstances: DRef<GrassInstances>;\r\n private _children: Nullable<GrassQuadtreeNode[]>;\r\n private readonly _baseVertexBuffer: DRef<StructuredBuffer>;\r\n private readonly _indexBuffer: DRef<IndexBuffer>;\r\n private _minX: number;\r\n private _minZ: number;\r\n private _maxX: number;\r\n private _maxZ: number;\r\n constructor(baseVertexBuffer: StructuredBuffer, indexBuffer: IndexBuffer) {\r\n super();\r\n this._baseVertexBuffer = new DRef(baseVertexBuffer);\r\n this._indexBuffer = new DRef(indexBuffer);\r\n this._grassInstances = new DRef(new GrassInstances(baseVertexBuffer, indexBuffer));\r\n this._children = null;\r\n this._minX = 0;\r\n this._minZ = 0;\r\n this._maxX = 1;\r\n this._maxZ = 1;\r\n }\r\n get grassInstances() {\r\n return this._grassInstances.get();\r\n }\r\n get children() {\r\n return this._children;\r\n }\r\n draw(camera: Camera, region: Vector4, minY: number, maxY: number, skipClipTest: boolean) {\r\n if (!skipClipTest) {\r\n const cullAABB = GrassQuadtreeNode._cullAABB;\r\n const x = region.x;\r\n const z = region.y;\r\n const dx = region.z - x;\r\n const dz = region.w - z;\r\n cullAABB.minPoint.setXYZ(x + this._minX * dx, minY, z + this._minZ * dz);\r\n cullAABB.maxPoint.setXYZ(x + this._maxX * dx, maxY, z + this._maxZ * dz);\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 return;\r\n }\r\n skipClipTest = clipState === ClipState.A_INSIDE_B;\r\n }\r\n if (this._grassInstances.get()!.numInstances > 0) {\r\n this._grassInstances.get()!.draw();\r\n }\r\n if (this._children) {\r\n for (const child of this._children) {\r\n child.draw(camera, region, minY, maxY, skipClipTest);\r\n }\r\n }\r\n }\r\n setBaseVertexBuffer(baseVertexBuffer: StructuredBuffer) {\r\n if (baseVertexBuffer !== this._baseVertexBuffer.get()) {\r\n this._baseVertexBuffer.set(baseVertexBuffer);\r\n this._grassInstances.get()!.setBaseVertexBuffer(baseVertexBuffer);\r\n if (this._children) {\r\n for (const child of this._children) {\r\n child.setBaseVertexBuffer(baseVertexBuffer);\r\n }\r\n }\r\n }\r\n }\r\n removeInstances(minX: number, minZ: number, maxX: number, maxZ: number, numInstances: number) {\r\n let n = Math.min(this._grassInstances.get()!.numInstances, numInstances);\r\n if (n <= 0) {\r\n return 0;\r\n }\r\n let removed = 0;\r\n if (this._children) {\r\n for (const child of this._children) {\r\n if (child._minX < maxX && child._minZ < maxZ && child._maxX > minX && child._maxZ > minZ) {\r\n removed += child.removeInstances(minX, minZ, maxX, maxZ, n);\r\n n -= removed;\r\n }\r\n }\r\n }\r\n if (n > 0) {\r\n removed += this._grassInstances.get()!.removeInstances(minX, minZ, maxX, maxZ, n);\r\n }\r\n return removed;\r\n }\r\n addInstances(instances: GrassInstanceInfo[]) {\r\n if (instances.length === 0) {\r\n return 0;\r\n }\r\n let n = Math.min(instances.length, MAX_INSTANCES_PER_NODE - this._grassInstances.get()!.numInstances);\r\n this._grassInstances.get()!.addInstances(instances.slice(0, n));\r\n if (n < instances.length) {\r\n if (!this._children) {\r\n this._children = [\r\n new GrassQuadtreeNode(this._baseVertexBuffer.get()!, this._indexBuffer.get()!),\r\n new GrassQuadtreeNode(this._baseVertexBuffer.get()!, this._indexBuffer.get()!),\r\n new GrassQuadtreeNode(this._baseVertexBuffer.get()!, this._indexBuffer.get()!),\r\n new GrassQuadtreeNode(this._baseVertexBuffer.get()!, this._indexBuffer.get()!)\r\n ];\r\n this._children[0]._minX = this._minX;\r\n this._children[0]._minZ = this._minZ;\r\n this._children[0]._maxX = (this._minX + this._maxX) * 0.5;\r\n this._children[0]._maxZ = (this._minZ + this._maxZ) * 0.5;\r\n this._children[1]._minX = this._children[0]._maxX;\r\n this._children[1]._minZ = this._minZ;\r\n this._children[1]._maxX = this._maxX;\r\n this._children[1]._maxZ = this._children[0]._maxZ;\r\n this._children[2]._minX = this._minX;\r\n this._children[2]._minZ = this._children[0]._maxZ;\r\n this._children[2]._maxX = this._children[0]._maxX;\r\n this._children[2]._maxZ = this._maxZ;\r\n this._children[3]._minX = this._children[0]._maxX;\r\n this._children[3]._minZ = this._children[0]._maxZ;\r\n this._children[3]._maxX = this._maxX;\r\n this._children[3]._maxZ = this._maxZ;\r\n }\r\n instances = instances.slice(n);\r\n for (const child of this._children) {\r\n if (instances.length > 0) {\r\n const childInstances = instances.filter(\r\n (val) =>\r\n val.x >= child._minX && val.y >= child._minZ && val.x < child._maxX && val.y < child._maxZ\r\n );\r\n n += child.addInstances(childInstances);\r\n instances = instances.filter(\r\n (val) =>\r\n !(val.x >= child._minX && val.y >= child._minZ && val.x < child._maxX && val.y < child._maxZ)\r\n );\r\n }\r\n }\r\n }\r\n return n;\r\n }\r\n protected onDispose() {\r\n super.onDispose();\r\n this._baseVertexBuffer.dispose();\r\n this._indexBuffer.dispose();\r\n this._grassInstances.dispose();\r\n if (this._children) {\r\n for (const child of this._children) {\r\n child.dispose();\r\n }\r\n }\r\n }\r\n}\r\n"],"names":["MAX_INSTANCES_PER_NODE","INSTANCE_BYTES","GrassInstances","Disposable","_instances","_baseVertexBuffer","_indexBuffer","_instanceBuffer","_primitive","baseVertexBuffer","indexBuffer","DRef","numInstances","length","instanceBuffer","get","setBaseVertexBuffer","set","dispose","draw","primitive","Primitive","setVertexBuffer","setIndexBuffer","primitiveType","indexStart","indexCount","drawInstanced","updateBuffers","device","getDevice","createVertexBuffer","Uint8Array","buffer","currentBytes","byteLength","bytesRequired","nextPowerOf2","data","Float32Array","i","x","y","Math","sin","angle","cos","bufferSubData","removeInstances","minX","minZ","maxX","maxZ","num","removed","instance","splice","addInstances","instances","push","onDispose","GrassLayer","_material","_quadtree","_bladeWidth","_bladeHeight","terrain","bladeWidth","bladeHeight","albedoMap","ClipmapGrassMaterial","albedoTexture","setTextureSize","width","height","createBaseVertexBuffer","GrassQuadtreeNode","_getIndexBuffer","quadtree","updateMaterial","uniformChanged","setAlbedoMap","getAlbedoMap","val","setBladeSize","createIndexBuffer","Uint16Array","r","t","c","PI","s","vertices","createInterleavedVertexBuffer","ctx","region","minY","maxY","apply","pass","numPasses","bind","camera","GrassRenderer","_terrain","_numGrassBlades","_layers","DWeakRef","layer","numGrassBlades","numLayers","getLayer","index","addLayer","getGrassTexture","setGrassTexture","texture","grassLayer","console","error","getBladeWidth","getBladeHeight","bv","getWorldBoundingVolume","toAABB","minPoint","maxPoint","worldRegion","_cullAABB","AABB","_grassInstances","_children","_minX","_minZ","_maxX","_maxZ","grassInstances","children","skipClipTest","cullAABB","z","dx","dz","w","setXYZ","clipState","clipMask","getClipStateWithFrustumMask","frustum","getClipStateWithFrustum","ClipState","NOT_CLIPPED","A_INSIDE_B","child","n","min","slice","childInstances","filter"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;AAUA,MAAMA,sBAAyB,GAAA,IAAA;AAc/B;AACA,MAAMC,iBAAiB,CAAI,GAAA,CAAA;AAE3B;;;IAIO,MAAMC,cAAuBC,SAAAA,UAAAA,CAAAA;IACjBC,UAAgC;IAChCC,iBAA0C;IAC1CC,YAAgC;IAChCC,eAAwC;IACxCC,UAA4B;IAC7C,WAAYC,CAAAA,gBAAkC,EAAEC,WAAwB,CAAE;QACxE,KAAK,EAAA;QACL,IAAI,CAACN,UAAU,GAAG,EAAE;AACpB,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;AACjB,QAAA,OAAO,IAAI,CAACR,UAAU,CAACS,MAAM;AAC/B;AACA,IAAA,IAAIC,cAAiB,GAAA;AACnB,QAAA,OAAO,IAAI,CAACP,eAAe,CAACQ,GAAG,EAAA;AACjC;AACAC,IAAAA,mBAAAA,CAAoBP,gBAAkC,EAAE;AACtD,QAAA,IAAIA,qBAAqB,IAAI,CAACJ,iBAAiB,CAACU,GAAG,EAAI,EAAA;AACrD,YAAA,IAAI,CAACV,iBAAiB,CAACY,GAAG,CAACR,gBAAAA,CAAAA;YAC3B,IAAI,CAACD,UAAU,CAACU,OAAO,EAAA;AACzB;AACF;IACAC,IAAO,GAAA;AACL,QAAA,IAAI,IAAI,CAACf,UAAU,CAACS,MAAM,GAAG,CAAG,EAAA;AAC9B,YAAA,IAAI,CAAC,IAAI,CAACL,UAAU,CAACO,GAAG,EAAI,EAAA;AAC1B,gBAAA,MAAMK,YAAY,IAAIC,SAAAA,EAAAA;AACtBD,gBAAAA,SAAAA,CAAUE,eAAe,CAAC,IAAI,CAACjB,iBAAiB,CAACU,GAAG,EAAA,CAAA;AACpDK,gBAAAA,SAAAA,CAAUE,eAAe,CAAC,IAAI,CAACf,eAAe,CAACQ,GAAG,EAAK,EAAA,UAAA,CAAA;AACvDK,gBAAAA,SAAAA,CAAUG,cAAc,CAAC,IAAI,CAACjB,YAAY,CAACS,GAAG,EAAA,CAAA;AAC9CK,gBAAAA,SAAAA,CAAUI,aAAa,GAAG,eAAA;AAC1BJ,gBAAAA,SAAAA,CAAUK,UAAU,GAAG,CAAA;gBACvBL,SAAUM,CAAAA,UAAU,GAAG,IAAI,CAACpB,YAAY,CAACS,GAAG,GAAIF,MAAM;AACtD,gBAAA,IAAI,CAACL,UAAU,CAACS,GAAG,CAACG,SAAAA,CAAAA;AACtB;YACA,IAAI,CAACZ,UAAU,CAACO,GAAG,EAAA,CAAIY,aAAa,CAAC,IAAI,CAACvB,UAAU,CAACS,MAAM,CAAA;AAC7D;AACF;IACAe,aAAgB,GAAA;AACd,QAAA,MAAMC,MAASC,GAAAA,SAAAA,EAAAA;AACf,QAAA,IAAI,IAAI,CAAC1B,UAAU,CAACS,MAAM,KAAK,CAAG,EAAA;AAChC,YAAA,IAAI,CAACN,eAAe,CAACU,GAAG,CAAC,IAAA,CAAA;AACzB,YAAA;AACF;AACA,QAAA,IAAI,IAAI,CAACb,UAAU,CAACS,MAAM,GAAG,CAAK,IAAA,CAAC,IAAI,CAACN,eAAe,CAACQ,GAAG,EAAI,EAAA;AAC7D,YAAA,IAAI,CAACR,eAAe,CAACU,GAAG,CACtBY,OAAOE,kBAAkB,CAAC,YAAc,EAAA,IAAIC,WAAW,IAAI,CAAC5B,UAAU,CAACS,MAAM,GAAGZ,cAAAA,CAAAA,CAAAA,CAAAA;AAEpF;AACA,QAAA,IAAIgC,MAAS,GAAA,IAAI,CAAC1B,eAAe,CAACQ,GAAG,EAAA;QACrC,MAAMmB,YAAAA,GAAeD,OAAOE,UAAU;AACtC,QAAA,MAAMC,gBAAgB,IAAI,CAAChC,UAAU,CAACS,MAAM,GAAGZ,cAAAA;AAC/C,QAAA,IAAIiC,eAAeE,aAAe,EAAA;AAChCH,YAAAA,MAAAA,GAASJ,OAAOE,kBAAkB,CAAC,YAAc,EAAA,IAAIC,WAAWK,YAAaD,CAAAA,aAAAA,CAAAA,CAAAA,CAAAA;AAC7E,YAAA,IAAI,CAAC7B,eAAe,CAACU,GAAG,CAACgB,MAAAA,CAAAA;YACzB,IAAI,CAACzB,UAAU,CAACU,OAAO,EAAA;AACzB;QACA,MAAMoB,IAAAA,GAAO,IAAIC,YAAa,CAAA,CAAA,GAAI,IAAI,CAACnC,UAAU,CAACS,MAAM,CAAA;QACxD,IAAK,IAAI2B,CAAI,GAAA,CAAA,EAAGA,CAAI,GAAA,IAAI,CAACpC,UAAU,CAACS,MAAM,EAAE2B,CAAK,EAAA,CAAA;YAC/CF,IAAI,CAACE,CAAI,GAAA,CAAA,GAAI,CAAE,CAAA,GAAG,IAAI,CAACpC,UAAU,CAACoC,CAAE,CAAA,CAACC,CAAC;YACtCH,IAAI,CAACE,CAAI,GAAA,CAAA,GAAI,CAAE,CAAA,GAAG,IAAI,CAACpC,UAAU,CAACoC,CAAE,CAAA,CAACE,CAAC;AACtCJ,YAAAA,IAAI,CAACE,CAAAA,GAAI,CAAI,GAAA,CAAA,CAAE,GAAGG,IAAKC,CAAAA,GAAG,CAAC,IAAI,CAACxC,UAAU,CAACoC,CAAAA,CAAE,CAACK,KAAK,CAAA;AACnDP,YAAAA,IAAI,CAACE,CAAAA,GAAI,CAAI,GAAA,CAAA,CAAE,GAAGG,IAAKG,CAAAA,GAAG,CAAC,IAAI,CAAC1C,UAAU,CAACoC,CAAAA,CAAE,CAACK,KAAK,CAAA;AACrD;QACAZ,MAAOc,CAAAA,aAAa,CAAC,CAAGT,EAAAA,IAAAA,CAAAA;AAC1B;IACAU,eAAgBC,CAAAA,IAAY,EAAEC,IAAY,EAAEC,IAAY,EAAEC,IAAY,EAAEC,GAAW,EAAE;AACnF,QAAA,IAAIA,OAAO,CAAG,EAAA;YACZ,OAAO,CAAA;AACT;AACA,QAAA,IAAIC,OAAU,GAAA,CAAA;QACd,IAAK,IAAId,CAAI,GAAA,IAAI,CAACpC,UAAU,CAACS,MAAM,GAAG,CAAA,EAAG2B,CAAK,IAAA,CAAA,EAAGA,CAAK,EAAA,CAAA;AACpD,YAAA,MAAMe,QAAW,GAAA,IAAI,CAACnD,UAAU,CAACoC,CAAE,CAAA;AACnC,YAAA,IAAIe,QAASd,CAAAA,CAAC,IAAIQ,IAAAA,IAAQM,SAASd,CAAC,IAAIU,IAAQI,IAAAA,QAAAA,CAASb,CAAC,IAAIQ,IAAAA,IAAQK,QAASb,CAAAA,CAAC,IAAIU,IAAM,EAAA;AACxF,gBAAA,IAAI,CAAChD,UAAU,CAACoD,MAAM,CAAChB,CAAG,EAAA,CAAA,CAAA;AAC1Bc,gBAAAA,OAAAA,EAAAA;AACA,gBAAA,IAAIA,YAAYD,GAAK,EAAA;AACnB,oBAAA;AACF;AACF;AACF;AACA,QAAA,IAAIC,UAAU,CAAG,EAAA;AACf,YAAA,IAAI,CAAC1B,aAAa,EAAA;AACpB;QACA,OAAO0B,OAAAA;AACT;AACAG,IAAAA,YAAAA,CAAaC,SAA8B,EAAE;AAC3C,QAAA,IAAI,CAACtD,UAAU,CAACuD,IAAI,CAAID,GAAAA,SAAAA,CAAAA;AACxB,QAAA,IAAI,CAAC9B,aAAa,EAAA;AACpB;IACUgC,SAAY,GAAA;AACpB,QAAA,KAAK,CAACA,SAAAA,EAAAA;QACN,IAAI,CAACvD,iBAAiB,CAACa,OAAO,EAAA;QAC9B,IAAI,CAACZ,YAAY,CAACY,OAAO,EAAA;QACzB,IAAI,CAACX,eAAe,CAACW,OAAO,EAAA;QAC5B,IAAI,CAACV,UAAU,CAACU,OAAO,EAAA;AACzB;AACF;AAEA;;;IAIO,MAAM2C,UAAmB1D,SAAAA,UAAAA,CAAAA;IAC9B,OAAwBG,YAAAA,GAAkC,IAAIK,IAAO,EAAA;IACpDmD,SAAsC;IACtCC,SAAmC;IAC5CC,WAAoB;IACpBC,YAAqB;IACZ5D,iBAA0C;AAC3D;;;;;;MAOA,WAAA,CAAY6D,OAAuB,EAAEC,UAAkB,EAAEC,WAAmB,EAAEC,SAAqB,CAAE;QACnG,KAAK,EAAA;AACL,QAAA,IAAI,CAACP,SAAS,GAAG,IAAInD,IAAAA,CAAK,IAAI2D,oBAAqBJ,CAAAA,OAAAA,CAAAA,CAAAA;AACnD,QAAA,IAAI,CAACJ,SAAS,CAAC/C,GAAG,EAAIwD,CAAAA,aAAa,GAAGF,SAAa,IAAA,IAAA;AACnD,QAAA,IAAIA,SAAW,EAAA;YACb,IAAI,CAACP,SAAS,CAAC/C,GAAG,EAAA,CAAIyD,cAAc,CAACH,SAAUI,CAAAA,KAAK,EAAEJ,SAAAA,CAAUK,MAAM,CAAA;AACxE;QACA,IAAI,CAACV,WAAW,GAAGG,UAAAA;QACnB,IAAI,CAACF,YAAY,GAAGG,WAAAA;AACpB,QAAA,IAAI,CAAC/D,iBAAiB,GAAG,IAAIM,KAAK,IAAI,CAACgE,sBAAsB,CAAC,IAAI,CAACX,WAAW,EAAE,IAAI,CAACC,YAAY,CAAA,CAAA;AACjG,QAAA,IAAI,CAACF,SAAS,GAAG,IAAIpD,KACnB,IAAIiE,iBAAAA,CAAkB,IAAI,CAACvE,iBAAiB,CAACU,GAAG,EAAA,EAAK8C,WAAWgB,eAAe,EAAA,CAAA,CAAA;AAEnF;qBAEA,IAAIC,QAAW,GAAA;AACb,QAAA,OAAO,IAAI,CAACf,SAAS,CAAChD,GAAG,EAAA;AAC3B;AACA,qBACAgE,cAAiB,GAAA;AACf,QAAA,IAAI,CAACjB,SAAS,CAAC/C,GAAG,GAAIiE,cAAc,EAAA;AACtC;AACA;;;MAIAC,YAAAA,CAAaZ,SAAoB,EAAE;AACjC,QAAA,IAAI,CAACP,SAAS,CAAC/C,GAAG,EAAA,CAAIwD,aAAa,GAAGF,SAAAA;AACtC,QAAA,IAAIA,SAAW,EAAA;YACb,IAAI,CAACP,SAAS,CAAC/C,GAAG,EAAA,CAAIyD,cAAc,CAACH,SAAUI,CAAAA,KAAK,EAAEJ,SAAAA,CAAUK,MAAM,CAAA;AACxE;AACF;AACA;;;AAGC,MACDQ,YAAe,GAAA;AACb,QAAA,OAAO,IAAI,CAACpB,SAAS,CAAC/C,GAAG,GAAIwD,aAAa;AAC5C;AACA;;;MAIAd,YAAAA,CAAaC,SAA8B,EAAE;AAC3C,QAAA,OAAO,IAAI,CAACK,SAAS,CAAChD,GAAG,EAAA,CAAI0C,YAAY,CAACC,SAAAA,CAAAA;AAC5C;AACA;;;;;;;MAQAV,eAAAA,CAAgBC,IAAY,EAAEC,IAAY,EAAEC,IAAY,EAAEC,IAAY,EAAExC,YAAoB,EAAE;QAC5F,IAAI,CAACmD,SAAS,CAAChD,GAAG,EAAA,CAAIiC,eAAe,CAACC,IAAAA,EAAMC,IAAMC,EAAAA,IAAAA,EAAMC,IAAMxC,EAAAA,YAAAA,CAAAA;AAChE;2CAEA,IAAIuD,UAAa,GAAA;QACf,OAAO,IAAI,CAACH,WAAW;AACzB;IACA,IAAIG,UAAAA,CAAWgB,GAAW,EAAE;AAC1B,QAAA,IAAI,CAACC,YAAY,CAACD,GAAK,EAAA,IAAI,CAAClB,YAAY,CAAA;AAC1C;4CAEA,IAAIG,WAAc,GAAA;QAChB,OAAO,IAAI,CAACH,YAAY;AAC1B;IACA,IAAIG,WAAAA,CAAYe,GAAW,EAAE;AAC3B,QAAA,IAAI,CAACC,YAAY,CAAC,IAAI,CAACpB,WAAW,EAAEmB,GAAAA,CAAAA;AACtC;AACA;;;;AAIC,MACDC,YAAaX,CAAAA,KAAa,EAAEC,MAAc,EAAE;QAC1C,IAAID,KAAAA,KAAU,IAAI,CAACT,WAAW,IAAIU,MAAW,KAAA,IAAI,CAACT,YAAY,EAAE;YAC9D,IAAI,CAACD,WAAW,GAAGS,KAAAA;YACnB,IAAI,CAACR,YAAY,GAAGS,MAAAA;AACpB,YAAA,IAAI,CAACrE,iBAAiB,CAACY,GAAG,CAAC,IAAI,CAAC0D,sBAAsB,CAAC,IAAI,CAACX,WAAW,EAAE,IAAI,CAACC,YAAY,CAAA,CAAA;YAC1F,IAAI,CAACF,SAAS,CAAChD,GAAG,EAAA,CAAIC,mBAAmB,CAAC,IAAI,CAACX,iBAAiB,CAACU,GAAG,EAAA,CAAA;AACtE;AACF;qBAEA,OAAe8D,eAAkB,GAAA;AAC/B,QAAA,IAAI,CAAC,IAAI,CAACvE,YAAY,CAACS,GAAG,EAAI,EAAA;YAC5B,IAAI,CAACT,YAAY,CAACW,GAAG,CACnBa,SAAYuD,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,CAAChF,YAAY,CAACS,GAAG,EAAA;AAC9B;AACA,qBACA,sBAAQ4D,CAAuBR,UAAkB,EAAEC,WAAmB,EAAE;AACtE,QAAA,MAAMvC,MAASC,GAAAA,SAAAA,EAAAA;AACf,QAAA,MAAMyD,IAAIpB,UAAa,GAAA,GAAA;AACvB,QAAA,MAAMqB,CAAIpB,GAAAA,WAAAA;AACV,QAAA,MAAMqB,IAAIF,CAAI5C,GAAAA,IAAAA,CAAKG,GAAG,CAACH,IAAAA,CAAK+C,EAAE,GAAG,CAAA,CAAA;AACjC,QAAA,MAAMC,IAAIJ,CAAI5C,GAAAA,IAAAA,CAAKC,GAAG,CAACD,IAAAA,CAAK+C,EAAE,GAAG,CAAA,CAAA;QACjC,MAAME,QAAAA,GAAW,IAAIrD,YAAa,CAAA;AAChCgD,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,OAAO9D,MAAAA,CAAOgE,6BAA6B,CAAC;AAAC,YAAA,gBAAA;AAAkB,YAAA;SAAa,EAAED,QAAAA,CAAAA;AAChF;qBAEAzE,KAAK2E,GAAgB,EAAEC,MAAe,EAAEC,IAAY,EAAEC,IAAY,EAAE;AAClE,QAAA,IAAI,CAACnC,SAAS,CAAC/C,GAAG,EAAA,CAAImF,KAAK,CAACJ,GAAAA,CAAAA;AAC5B,QAAA,IAAK,IAAIK,IAAAA,GAAO,CAAGA,EAAAA,IAAAA,GAAO,IAAI,CAACrC,SAAS,CAAC/C,GAAG,EAAA,CAAIqF,SAAS,EAAED,IAAQ,EAAA,CAAA;YACjE,IAAI,CAACrC,SAAS,CAAC/C,GAAG,GAAIsF,IAAI,CAACP,GAAIjE,CAAAA,MAAM,EAAEsE,IAAAA,CAAAA;AACvC,YAAA,IAAI,CAACpC,SAAS,CAAChD,GAAG,EAAII,CAAAA,IAAI,CAAC2E,GAAAA,CAAIQ,MAAM,EAAEP,MAAQC,EAAAA,IAAAA,EAAMC,IAAM,EAAA,KAAA,CAAA;AAC7D;AACF;qBAEA,SAAsB,GAAA;AACpB,QAAA,KAAK,CAACrC,SAAAA,EAAAA;QACN,IAAI,CAACE,SAAS,CAAC5C,OAAO,EAAA;QACtB,IAAI,CAAC6C,SAAS,CAAC7C,OAAO,EAAA;QACtB,IAAI,CAACb,iBAAiB,CAACa,OAAO,EAAA;AAChC;AACF;AACA;;;IAIO,MAAMqF,aAAsBpG,SAAAA,UAAAA,CAAAA;IAChBqG,QAAmC;IAC5CC,eAAwB;IACxBC,OAAsB;AAC9B;;;MAIA,WAAA,CAAYxC,OAAuB,CAAE;QACnC,KAAK,EAAA;AACL,QAAA,IAAI,CAACsC,QAAQ,GAAG,IAAIG,QAASzC,CAAAA,OAAAA,CAAAA;QAC7B,IAAI,CAACuC,eAAe,GAAG,CAAA;QACvB,IAAI,CAACC,OAAO,GAAG,EAAE;AACnB;AACA,qBACA3B,cAAiB,GAAA;AACf,QAAA,KAAK,MAAM6B,KAAAA,IAAS,IAAI,CAACF,OAAO,CAAE;AAChCE,YAAAA,KAAAA,CAAM7B,cAAc,EAAA;AACtB;AACF;iCAEA,IAAI8B,cAAiB,GAAA;QACnB,OAAO,IAAI,CAACJ,eAAe;AAC7B;iCAEA,IAAIK,SAAY,GAAA;AACd,QAAA,OAAO,IAAI,CAACJ,OAAO,CAAC7F,MAAM;AAC5B;AACA;;;;MAKAkG,QAAAA,CAASC,KAAa,EAAE;AACtB,QAAA,OAAO,IAAI,CAACN,OAAO,CAACM,KAAM,CAAA;AAC5B;AACA;;;;;;AAMC,MACDC,SAAS9C,UAAkB,EAAEC,WAAmB,EAAEC,SAAqB,EAAE;QACvE,MAAMuC,KAAAA,GAAQ,IAAI/C,UAAAA,CAAW,IAAI,CAAC2C,QAAQ,CAACzF,GAAG,EAAKoD,EAAAA,UAAAA,EAAYC,WAAaC,EAAAA,SAAAA,CAAAA;AAC5E,QAAA,IAAI,CAACqC,OAAO,CAAC/C,IAAI,CAACiD,KAAAA,CAAAA;AAClB,QAAA,OAAO,IAAI,CAACF,OAAO,CAAC7F,MAAM,GAAG,CAAA;AAC/B;AACA;;;;MAKAqG,eAAAA,CAAgBN,KAAa,EAAE;AAC7B,QAAA,OAAO,IAAI,CAACF,OAAO,CAACE,KAAAA,CAAM,EAAE1B,YAAkB,EAAA,IAAA,IAAA;AAChD;AACA;;;;AAIC,MACDiC,eAAgBP,CAAAA,KAAa,EAAEQ,OAAkB,EAAE;AACjD,QAAA,MAAMC,UAAa,GAAA,IAAI,CAACX,OAAO,CAACE,KAAM,CAAA;AACtC,QAAA,IAAIS,UAAY,EAAA;AACdA,YAAAA,UAAAA,CAAWpC,YAAY,CAACmC,OAAAA,CAAAA;SACnB,MAAA;AACLE,YAAAA,OAAAA,CAAQC,KAAK,CAAC,CAAC,qBAAqB,EAAEX,KAAO,CAAA,CAAA,CAAA;AAC/C;AACF;AACA;;;;MAKAY,aAAAA,CAAcZ,KAAa,EAAE;AAC3B,QAAA,OAAO,IAAI,CAACF,OAAO,CAACE,KAAAA,CAAM,EAAEzC,UAAc,IAAA,CAAA;AAC5C;AACA;;;;MAKAsD,cAAAA,CAAeb,KAAa,EAAE;AAC5B,QAAA,OAAO,IAAI,CAACF,OAAO,CAACE,KAAAA,CAAM,EAAExC,WAAe,IAAA,CAAA;AAC7C;AACA;;;;;AAKC,MACDgB,aAAawB,KAAa,EAAEnC,KAAa,EAAEC,MAAc,EAAE;AACzD,QAAA,MAAM2C,UAAa,GAAA,IAAI,CAACX,OAAO,CAACE,KAAM,CAAA;AACtC,QAAA,IAAIS,UAAY,EAAA;YACdA,UAAWjC,CAAAA,YAAY,CAACX,KAAOC,EAAAA,MAAAA,CAAAA;SAC1B,MAAA;AACL4C,YAAAA,OAAAA,CAAQC,KAAK,CAAC,CAAC,qBAAqB,EAAEX,KAAO,CAAA,CAAA,CAAA;AAC/C;AACF;AACA;;;;AAIC,MACDnD,YAAamD,CAAAA,KAAa,EAAElD,SAA8B,EAAE;AAC1D,QAAA,MAAM2D,UAAa,GAAA,IAAI,CAACX,OAAO,CAACE,KAAM,CAAA;AACtC,QAAA,IAAI,CAACS,UAAY,EAAA;AACfC,YAAAA,OAAAA,CAAQC,KAAK,CAAC,CAAC,qBAAqB,EAAEX,KAAO,CAAA,CAAA,CAAA;SACxC,MAAA;AACL,YAAA,IAAI,CAACH,eAAe,IAAIY,UAAAA,CAAW5D,YAAY,CAACC,SAAAA,CAAAA;AAClD;AACF;AACA;;;;;;;;AAQC,MACDV,eAAgB4D,CAAAA,KAAa,EAAE3D,IAAY,EAAEC,IAAY,EAAEC,IAAY,EAAEC,IAAY,EAAEC,GAAW,EAAE;AAClG,QAAA,MAAMgE,UAAa,GAAA,IAAI,CAACX,OAAO,CAACE,KAAM,CAAA;AACtC,QAAA,IAAI,CAACS,UAAY,EAAA;AACfC,YAAAA,OAAAA,CAAQC,KAAK,CAAC,CAAC,qBAAqB,EAAEX,KAAO,CAAA,CAAA,CAAA;SACxC,MAAA;AACLS,YAAAA,UAAAA,CAAWrE,eAAe,CAACC,IAAMC,EAAAA,IAAAA,EAAMC,MAAMC,IAAMC,EAAAA,GAAAA,CAAAA;AACrD;AACF;qBAEAlC,IAAK2E,CAAAA,GAAgB,EAAE;QACrB,MAAM4B,EAAAA,GAAK,IAAI,CAAClB,QAAQ,CAACzF,GAAG,EAAA,CAAI4G,sBAAsB,EAAA,CAAIC,MAAM,EAAA;AAChE,QAAA,MAAM5B,IAAO0B,GAAAA,EAAAA,CAAGG,QAAQ,CAACnF,CAAC;AAC1B,QAAA,MAAMuD,IAAOyB,GAAAA,EAAAA,CAAGI,QAAQ,CAACpF,CAAC;AAC1B,QAAA,KAAK,MAAMkE,KAAAA,IAAS,IAAI,CAACF,OAAO,CAAE;AAChCE,YAAAA,KAAAA,CAAMzF,IAAI,CAAC2E,GAAAA,EAAK,IAAI,CAACU,QAAQ,CAACzF,GAAG,EAAIgH,CAAAA,WAAW,EAAE/B,IAAOY,GAAAA,KAAAA,CAAMxC,WAAW,EAAE6B,IAAAA,GAAOW,MAAMxC,WAAW,CAAA;AACtG;AACF;IACUR,SAAY,GAAA;AACpB,QAAA,KAAK,CAACA,SAAAA,EAAAA;QACN,IAAI,CAAC4C,QAAQ,CAACtF,OAAO,EAAA;AACrB,QAAA,KAAK,MAAM0F,KAAAA,IAAS,IAAI,CAACF,OAAO,CAAE;AAChCE,YAAAA,KAAAA,CAAM1F,OAAO,EAAA;AACf;AACF;AACF;AAEA,iBACO,MAAM0D,iBAA0BzE,SAAAA,UAAAA,CAAAA;IACrC,OAAwB6H,SAAAA,GAAY,IAAIC,IAAO,EAAA;IAC9BC,eAAsC;IAC/CC,SAAyC;IAChC9H,iBAA0C;IAC1CC,YAAgC;IACzC8H,KAAc;IACdC,KAAc;IACdC,KAAc;IACdC,KAAc;IACtB,WAAY9H,CAAAA,gBAAkC,EAAEC,WAAwB,CAAE;QACxE,KAAK,EAAA;AACL,QAAA,IAAI,CAACL,iBAAiB,GAAG,IAAIM,IAAKF,CAAAA,gBAAAA,CAAAA;AAClC,QAAA,IAAI,CAACH,YAAY,GAAG,IAAIK,IAAKD,CAAAA,WAAAA,CAAAA;AAC7B,QAAA,IAAI,CAACwH,eAAe,GAAG,IAAIvH,IAAK,CAAA,IAAIT,eAAeO,gBAAkBC,EAAAA,WAAAA,CAAAA,CAAAA;QACrE,IAAI,CAACyH,SAAS,GAAG,IAAA;QACjB,IAAI,CAACC,KAAK,GAAG,CAAA;QACb,IAAI,CAACC,KAAK,GAAG,CAAA;QACb,IAAI,CAACC,KAAK,GAAG,CAAA;QACb,IAAI,CAACC,KAAK,GAAG,CAAA;AACf;AACA,IAAA,IAAIC,cAAiB,GAAA;AACnB,QAAA,OAAO,IAAI,CAACN,eAAe,CAACnH,GAAG,EAAA;AACjC;AACA,IAAA,IAAI0H,QAAW,GAAA;QACb,OAAO,IAAI,CAACN,SAAS;AACvB;IACAhH,IAAKmF,CAAAA,MAAc,EAAEP,MAAe,EAAEC,IAAY,EAAEC,IAAY,EAAEyC,YAAqB,EAAE;AACvF,QAAA,IAAI,CAACA,YAAc,EAAA;YACjB,MAAMC,QAAAA,GAAW/D,kBAAkBoD,SAAS;YAC5C,MAAMvF,CAAAA,GAAIsD,OAAOtD,CAAC;YAClB,MAAMmG,CAAAA,GAAI7C,OAAOrD,CAAC;YAClB,MAAMmG,EAAAA,GAAK9C,MAAO6C,CAAAA,CAAC,GAAGnG,CAAAA;YACtB,MAAMqG,EAAAA,GAAK/C,MAAOgD,CAAAA,CAAC,GAAGH,CAAAA;AACtBD,YAAAA,QAAAA,CAASd,QAAQ,CAACmB,MAAM,CAACvG,IAAI,IAAI,CAAC2F,KAAK,GAAGS,IAAI7C,IAAM4C,EAAAA,CAAAA,GAAI,IAAI,CAACP,KAAK,GAAGS,EAAAA,CAAAA;AACrEH,YAAAA,QAAAA,CAASb,QAAQ,CAACkB,MAAM,CAACvG,IAAI,IAAI,CAAC6F,KAAK,GAAGO,IAAI5C,IAAM2C,EAAAA,CAAAA,GAAI,IAAI,CAACL,KAAK,GAAGO,EAAAA,CAAAA;AACrE,YAAA,MAAMG,YAAY3C,MAAO4C,CAAAA,QAAQ,GAC7BP,QAAAA,CAASQ,2BAA2B,CAAC7C,MAAAA,CAAO8C,OAAO,EAAE9C,OAAO4C,QAAQ,CAAA,GACpEP,SAASU,uBAAuB,CAAC/C,OAAO8C,OAAO,CAAA;YACnD,IAAIH,SAAAA,KAAcK,SAAUC,CAAAA,WAAW,EAAE;AACvC,gBAAA;AACF;YACAb,YAAeO,GAAAA,SAAAA,KAAcK,UAAUE,UAAU;AACnD;QACA,IAAI,IAAI,CAACtB,eAAe,CAACnH,GAAG,EAAIH,CAAAA,YAAY,GAAG,CAAG,EAAA;AAChD,YAAA,IAAI,CAACsH,eAAe,CAACnH,GAAG,GAAII,IAAI,EAAA;AAClC;QACA,IAAI,IAAI,CAACgH,SAAS,EAAE;AAClB,YAAA,KAAK,MAAMsB,KAAAA,IAAS,IAAI,CAACtB,SAAS,CAAE;AAClCsB,gBAAAA,KAAAA,CAAMtI,IAAI,CAACmF,MAAQP,EAAAA,MAAAA,EAAQC,MAAMC,IAAMyC,EAAAA,YAAAA,CAAAA;AACzC;AACF;AACF;AACA1H,IAAAA,mBAAAA,CAAoBP,gBAAkC,EAAE;AACtD,QAAA,IAAIA,qBAAqB,IAAI,CAACJ,iBAAiB,CAACU,GAAG,EAAI,EAAA;AACrD,YAAA,IAAI,CAACV,iBAAiB,CAACY,GAAG,CAACR,gBAAAA,CAAAA;AAC3B,YAAA,IAAI,CAACyH,eAAe,CAACnH,GAAG,EAAA,CAAIC,mBAAmB,CAACP,gBAAAA,CAAAA;YAChD,IAAI,IAAI,CAAC0H,SAAS,EAAE;AAClB,gBAAA,KAAK,MAAMsB,KAAAA,IAAS,IAAI,CAACtB,SAAS,CAAE;AAClCsB,oBAAAA,KAAAA,CAAMzI,mBAAmB,CAACP,gBAAAA,CAAAA;AAC5B;AACF;AACF;AACF;IACAuC,eAAgBC,CAAAA,IAAY,EAAEC,IAAY,EAAEC,IAAY,EAAEC,IAAY,EAAExC,YAAoB,EAAE;QAC5F,IAAI8I,CAAAA,GAAI/G,IAAKgH,CAAAA,GAAG,CAAC,IAAI,CAACzB,eAAe,CAACnH,GAAG,EAAIH,CAAAA,YAAY,EAAEA,YAAAA,CAAAA;AAC3D,QAAA,IAAI8I,KAAK,CAAG,EAAA;YACV,OAAO,CAAA;AACT;AACA,QAAA,IAAIpG,OAAU,GAAA,CAAA;QACd,IAAI,IAAI,CAAC6E,SAAS,EAAE;AAClB,YAAA,KAAK,MAAMsB,KAAAA,IAAS,IAAI,CAACtB,SAAS,CAAE;AAClC,gBAAA,IAAIsB,KAAMrB,CAAAA,KAAK,GAAGjF,IAAAA,IAAQsG,MAAMpB,KAAK,GAAGjF,IAAQqG,IAAAA,KAAAA,CAAMnB,KAAK,GAAGrF,IAAAA,IAAQwG,KAAMlB,CAAAA,KAAK,GAAGrF,IAAM,EAAA;AACxFI,oBAAAA,OAAAA,IAAWmG,MAAMzG,eAAe,CAACC,IAAMC,EAAAA,IAAAA,EAAMC,MAAMC,IAAMsG,EAAAA,CAAAA,CAAAA;oBACzDA,CAAKpG,IAAAA,OAAAA;AACP;AACF;AACF;AACA,QAAA,IAAIoG,IAAI,CAAG,EAAA;YACTpG,OAAW,IAAA,IAAI,CAAC4E,eAAe,CAACnH,GAAG,EAAIiC,CAAAA,eAAe,CAACC,IAAAA,EAAMC,IAAMC,EAAAA,IAAAA,EAAMC,IAAMsG,EAAAA,CAAAA,CAAAA;AACjF;QACA,OAAOpG,OAAAA;AACT;AACAG,IAAAA,YAAAA,CAAaC,SAA8B,EAAE;QAC3C,IAAIA,SAAAA,CAAU7C,MAAM,KAAK,CAAG,EAAA;YAC1B,OAAO,CAAA;AACT;AACA,QAAA,IAAI6I,CAAI/G,GAAAA,IAAAA,CAAKgH,GAAG,CAACjG,UAAU7C,MAAM,EAAEb,sBAAyB,GAAA,IAAI,CAACkI,eAAe,CAACnH,GAAG,GAAIH,YAAY,CAAA;QACpG,IAAI,CAACsH,eAAe,CAACnH,GAAG,EAAA,CAAI0C,YAAY,CAACC,SAAAA,CAAUkG,KAAK,CAAC,CAAGF,EAAAA,CAAAA,CAAAA,CAAAA;QAC5D,IAAIA,CAAAA,GAAIhG,SAAU7C,CAAAA,MAAM,EAAE;AACxB,YAAA,IAAI,CAAC,IAAI,CAACsH,SAAS,EAAE;gBACnB,IAAI,CAACA,SAAS,GAAG;oBACf,IAAIvD,iBAAAA,CAAkB,IAAI,CAACvE,iBAAiB,CAACU,GAAG,EAAA,EAAK,IAAI,CAACT,YAAY,CAACS,GAAG,EAAA,CAAA;oBAC1E,IAAI6D,iBAAAA,CAAkB,IAAI,CAACvE,iBAAiB,CAACU,GAAG,EAAA,EAAK,IAAI,CAACT,YAAY,CAACS,GAAG,EAAA,CAAA;oBAC1E,IAAI6D,iBAAAA,CAAkB,IAAI,CAACvE,iBAAiB,CAACU,GAAG,EAAA,EAAK,IAAI,CAACT,YAAY,CAACS,GAAG,EAAA,CAAA;oBAC1E,IAAI6D,iBAAAA,CAAkB,IAAI,CAACvE,iBAAiB,CAACU,GAAG,EAAA,EAAK,IAAI,CAACT,YAAY,CAACS,GAAG,EAAA;AAC3E,iBAAA;gBACD,IAAI,CAACoH,SAAS,CAAC,CAAA,CAAE,CAACC,KAAK,GAAG,IAAI,CAACA,KAAK;gBACpC,IAAI,CAACD,SAAS,CAAC,CAAA,CAAE,CAACE,KAAK,GAAG,IAAI,CAACA,KAAK;AACpC,gBAAA,IAAI,CAACF,SAAS,CAAC,CAAE,CAAA,CAACG,KAAK,GAAI,CAAA,IAAI,CAACF,KAAK,GAAG,IAAI,CAACE,KAAK,IAAI,GAAA;AACtD,gBAAA,IAAI,CAACH,SAAS,CAAC,CAAE,CAAA,CAACI,KAAK,GAAI,CAAA,IAAI,CAACF,KAAK,GAAG,IAAI,CAACE,KAAK,IAAI,GAAA;AACtD,gBAAA,IAAI,CAACJ,SAAS,CAAC,CAAA,CAAE,CAACC,KAAK,GAAG,IAAI,CAACD,SAAS,CAAC,CAAA,CAAE,CAACG,KAAK;gBACjD,IAAI,CAACH,SAAS,CAAC,CAAA,CAAE,CAACE,KAAK,GAAG,IAAI,CAACA,KAAK;gBACpC,IAAI,CAACF,SAAS,CAAC,CAAA,CAAE,CAACG,KAAK,GAAG,IAAI,CAACA,KAAK;AACpC,gBAAA,IAAI,CAACH,SAAS,CAAC,CAAA,CAAE,CAACI,KAAK,GAAG,IAAI,CAACJ,SAAS,CAAC,CAAA,CAAE,CAACI,KAAK;gBACjD,IAAI,CAACJ,SAAS,CAAC,CAAA,CAAE,CAACC,KAAK,GAAG,IAAI,CAACA,KAAK;AACpC,gBAAA,IAAI,CAACD,SAAS,CAAC,CAAA,CAAE,CAACE,KAAK,GAAG,IAAI,CAACF,SAAS,CAAC,CAAA,CAAE,CAACI,KAAK;AACjD,gBAAA,IAAI,CAACJ,SAAS,CAAC,CAAA,CAAE,CAACG,KAAK,GAAG,IAAI,CAACH,SAAS,CAAC,CAAA,CAAE,CAACG,KAAK;gBACjD,IAAI,CAACH,SAAS,CAAC,CAAA,CAAE,CAACI,KAAK,GAAG,IAAI,CAACA,KAAK;AACpC,gBAAA,IAAI,CAACJ,SAAS,CAAC,CAAA,CAAE,CAACC,KAAK,GAAG,IAAI,CAACD,SAAS,CAAC,CAAA,CAAE,CAACG,KAAK;AACjD,gBAAA,IAAI,CAACH,SAAS,CAAC,CAAA,CAAE,CAACE,KAAK,GAAG,IAAI,CAACF,SAAS,CAAC,CAAA,CAAE,CAACI,KAAK;gBACjD,IAAI,CAACJ,SAAS,CAAC,CAAA,CAAE,CAACG,KAAK,GAAG,IAAI,CAACA,KAAK;gBACpC,IAAI,CAACH,SAAS,CAAC,CAAA,CAAE,CAACI,KAAK,GAAG,IAAI,CAACA,KAAK;AACtC;YACA7E,SAAYA,GAAAA,SAAAA,CAAUkG,KAAK,CAACF,CAAAA,CAAAA;AAC5B,YAAA,KAAK,MAAMD,KAAAA,IAAS,IAAI,CAACtB,SAAS,CAAE;gBAClC,IAAIzE,SAAAA,CAAU7C,MAAM,GAAG,CAAG,EAAA;AACxB,oBAAA,MAAMgJ,cAAiBnG,GAAAA,SAAAA,CAAUoG,MAAM,CACrC,CAAC3E,GAAAA,GACCA,GAAI1C,CAAAA,CAAC,IAAIgH,KAAAA,CAAMrB,KAAK,IAAIjD,GAAIzC,CAAAA,CAAC,IAAI+G,KAAAA,CAAMpB,KAAK,IAAIlD,GAAI1C,CAAAA,CAAC,GAAGgH,KAAAA,CAAMnB,KAAK,IAAInD,GAAIzC,CAAAA,CAAC,GAAG+G,KAAAA,CAAMlB,KAAK,CAAA;oBAE9FmB,CAAKD,IAAAA,KAAAA,CAAMhG,YAAY,CAACoG,cAAAA,CAAAA;AACxBnG,oBAAAA,SAAAA,GAAYA,SAAUoG,CAAAA,MAAM,CAC1B,CAAC3E,GACC,GAAA,EAAEA,GAAAA,CAAI1C,CAAC,IAAIgH,KAAMrB,CAAAA,KAAK,IAAIjD,GAAIzC,CAAAA,CAAC,IAAI+G,KAAAA,CAAMpB,KAAK,IAAIlD,GAAI1C,CAAAA,CAAC,GAAGgH,KAAAA,CAAMnB,KAAK,IAAInD,GAAIzC,CAAAA,CAAC,GAAG+G,KAAAA,CAAMlB,KAAK,CAAD,CAAA;AAEjG;AACF;AACF;QACA,OAAOmB,CAAAA;AACT;IACU9F,SAAY,GAAA;AACpB,QAAA,KAAK,CAACA,SAAAA,EAAAA;QACN,IAAI,CAACvD,iBAAiB,CAACa,OAAO,EAAA;QAC9B,IAAI,CAACZ,YAAY,CAACY,OAAO,EAAA;QACzB,IAAI,CAACgH,eAAe,CAAChH,OAAO,EAAA;QAC5B,IAAI,IAAI,CAACiH,SAAS,EAAE;AAClB,YAAA,KAAK,MAAMsB,KAAAA,IAAS,IAAI,CAACtB,SAAS,CAAE;AAClCsB,gBAAAA,KAAAA,CAAMvI,OAAO,EAAA;AACf;AACF;AACF;AACF;;;;"}
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, 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 type { Camera } from '../../camera';\r\nimport { getDevice } from '../../app/api';\r\n\r\nconst MAX_INSTANCES_PER_NODE = 2048;\r\n\r\n/**\r\n * Grass blade instance information\r\n * @public\r\n */\r\nexport type GrassInstanceInfo = {\r\n /** x position of the blade */\r\n x: number;\r\n /** y position of the blade */\r\n y: number;\r\n /** Rotation angle of the blade */\r\n angle: number;\r\n};\r\n// Two floats\r\nconst INSTANCE_BYTES = 4 * 4;\r\n\r\n/**\r\n * Grass glade instance manager class\r\n * @internal\r\n */\r\nexport class GrassInstances extends Disposable {\r\n private readonly _instances: GrassInstanceInfo[];\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._instances = [];\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._instances.length;\r\n }\r\n get instanceBuffer() {\r\n return this._instanceBuffer.get()!;\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 draw() {\r\n if (this._instances.length > 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._instances.length);\r\n }\r\n }\r\n updateBuffers() {\r\n const device = getDevice();\r\n if (this._instances.length === 0) {\r\n this._instanceBuffer.set(null);\r\n return;\r\n }\r\n if (this._instances.length > 0 && !this._instanceBuffer.get()) {\r\n this._instanceBuffer.set(\r\n device.createVertexBuffer('tex1_f32x4', new Uint8Array(this._instances.length * INSTANCE_BYTES))\r\n );\r\n }\r\n let buffer = this._instanceBuffer.get()!;\r\n const currentBytes = buffer.byteLength;\r\n const bytesRequired = this._instances.length * INSTANCE_BYTES;\r\n if (currentBytes < 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 const data = new Float32Array(4 * this._instances.length);\r\n for (let i = 0; i < this._instances.length; i++) {\r\n data[i * 4 + 0] = this._instances[i].x;\r\n data[i * 4 + 1] = this._instances[i].y;\r\n data[i * 4 + 2] = Math.sin(this._instances[i].angle);\r\n data[i * 4 + 3] = Math.cos(this._instances[i].angle);\r\n }\r\n buffer.bufferSubData(0, data);\r\n }\r\n removeInstances(minX: number, minZ: number, maxX: number, maxZ: number, num: number) {\r\n if (num <= 0) {\r\n return 0;\r\n }\r\n let removed = 0;\r\n for (let i = this._instances.length - 1; i >= 0; i--) {\r\n const instance = this._instances[i];\r\n if (instance.x >= minX && instance.x <= maxX && instance.y >= minZ && instance.y <= maxZ) {\r\n this._instances.splice(i, 1);\r\n removed++;\r\n if (removed === num) {\r\n break;\r\n }\r\n }\r\n }\r\n if (removed > 0) {\r\n this.updateBuffers();\r\n }\r\n return removed;\r\n }\r\n addInstances(instances: GrassInstanceInfo[]) {\r\n this._instances.push(...instances);\r\n this.updateBuffers();\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 * @public\r\n */\r\nexport class GrassLayer extends Disposable {\r\n private static readonly _indexBuffer: DRef<IndexBuffer> = new DRef();\r\n private readonly _material: DRef<ClipmapGrassMaterial>;\r\n private readonly _quadtree: DRef<GrassQuadtreeNode>;\r\n private _bladeWidth: number;\r\n private _bladeHeight: number;\r\n private readonly _baseVertexBuffer: DRef<StructuredBuffer>;\r\n /**\r\n * Creates an instance of GrassLayer\r\n * @param terrain - Clipmap terrain object\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(terrain: ClipmapTerrain, bladeWidth: number, bladeHeight: number, albedoMap?: Texture2D) {\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._bladeWidth = bladeWidth;\r\n this._bladeHeight = bladeHeight;\r\n this._baseVertexBuffer = new DRef(this.createBaseVertexBuffer(this._bladeWidth, this._bladeHeight));\r\n this._quadtree = new DRef(\r\n new GrassQuadtreeNode(this._baseVertexBuffer.get()!, GrassLayer._getIndexBuffer()!)\r\n );\r\n }\r\n /** @internal */\r\n get quadtree() {\r\n return this._quadtree.get();\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 /**\r\n * Add grass blades to this layer in a region\r\n * @param instances - Grass blade instances to add\r\n */\r\n addInstances(instances: GrassInstanceInfo[]) {\r\n return this._quadtree.get()!.addInstances(instances);\r\n }\r\n /**\r\n * Remove grass blades to this layer in a region\r\n * @param minX - Minimum x position of the region\r\n * @param minZ - Minimum z position of the region\r\n * @param maxX - Maximum x position of the region\r\n * @param maxZ - Maximum z position of the region\r\n * @param numInstances - How many grass blades to add\r\n */\r\n removeInstances(minX: number, minZ: number, maxX: number, maxZ: number, numInstances: number) {\r\n this._quadtree.get()!.removeInstances(minX, minZ, maxX, maxZ, numInstances);\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 this._quadtree.get()!.setBaseVertexBuffer(this._baseVertexBuffer.get()!);\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 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 this._quadtree.get()!.draw(ctx.camera, region, minY, maxY, false);\r\n }\r\n }\r\n /** @internal */\r\n protected onDispose() {\r\n super.onDispose();\r\n this._material.dispose();\r\n this._quadtree.dispose();\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 _numGrassBlades: number;\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._numGrassBlades = 0;\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._numGrassBlades;\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(this._terrain.get()!, bladeWidth, bladeHeight, albedoMap);\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 /**\r\n * Add grass instances to the grass layer at given index\r\n * @param layer - Index of the grass layer\r\n * @param instances - Grass blade instances to add\r\n */\r\n addInstances(layer: number, instances: GrassInstanceInfo[]) {\r\n const grassLayer = this._layers[layer];\r\n if (!grassLayer) {\r\n console.error(`Invalid grass layer: ${layer}`);\r\n } else {\r\n this._numGrassBlades += grassLayer.addInstances(instances);\r\n }\r\n }\r\n /**\r\n * Remove grass instances from the grass layer at given index within a region\r\n * @param layer - Index of the grass layer\r\n * @param minX - Minimum x of the region\r\n * @param minZ - Minimum z of the region\r\n * @param maxX - Maximum x of the region\r\n * @param maxZ - Maximum z of the region\r\n * @param num - How many grass blades to remove\r\n */\r\n removeInstances(layer: number, minX: number, minZ: number, maxX: number, maxZ: number, num: number) {\r\n const grassLayer = this._layers[layer];\r\n if (!grassLayer) {\r\n console.error(`Invalid grass layer: ${layer}`);\r\n } else {\r\n grassLayer.removeInstances(minX, minZ, maxX, maxZ, num);\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\r\n/** @internal */\r\nexport class GrassQuadtreeNode extends Disposable {\r\n private static readonly _cullAABB = new AABB();\r\n private readonly _grassInstances: DRef<GrassInstances>;\r\n private _children: Nullable<GrassQuadtreeNode[]>;\r\n private readonly _baseVertexBuffer: DRef<StructuredBuffer>;\r\n private readonly _indexBuffer: DRef<IndexBuffer>;\r\n private _minX: number;\r\n private _minZ: number;\r\n private _maxX: number;\r\n private _maxZ: number;\r\n constructor(baseVertexBuffer: StructuredBuffer, indexBuffer: IndexBuffer) {\r\n super();\r\n this._baseVertexBuffer = new DRef(baseVertexBuffer);\r\n this._indexBuffer = new DRef(indexBuffer);\r\n this._grassInstances = new DRef(new GrassInstances(baseVertexBuffer, indexBuffer));\r\n this._children = null;\r\n this._minX = 0;\r\n this._minZ = 0;\r\n this._maxX = 1;\r\n this._maxZ = 1;\r\n }\r\n get grassInstances() {\r\n return this._grassInstances.get();\r\n }\r\n get children() {\r\n return this._children;\r\n }\r\n draw(camera: Camera, region: Vector4, minY: number, maxY: number, skipClipTest: boolean) {\r\n if (!skipClipTest) {\r\n const cullAABB = GrassQuadtreeNode._cullAABB;\r\n const x = region.x;\r\n const z = region.y;\r\n const dx = region.z - x;\r\n const dz = region.w - z;\r\n cullAABB.minPoint.setXYZ(x + this._minX * dx, minY, z + this._minZ * dz);\r\n cullAABB.maxPoint.setXYZ(x + this._maxX * dx, maxY, z + this._maxZ * dz);\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 return;\r\n }\r\n skipClipTest = clipState === ClipState.A_INSIDE_B;\r\n }\r\n if (this._grassInstances.get()!.numInstances > 0) {\r\n this._grassInstances.get()!.draw();\r\n }\r\n if (this._children) {\r\n for (const child of this._children) {\r\n child.draw(camera, region, minY, maxY, skipClipTest);\r\n }\r\n }\r\n }\r\n setBaseVertexBuffer(baseVertexBuffer: StructuredBuffer) {\r\n if (baseVertexBuffer !== this._baseVertexBuffer.get()) {\r\n this._baseVertexBuffer.set(baseVertexBuffer);\r\n this._grassInstances.get()!.setBaseVertexBuffer(baseVertexBuffer);\r\n if (this._children) {\r\n for (const child of this._children) {\r\n child.setBaseVertexBuffer(baseVertexBuffer);\r\n }\r\n }\r\n }\r\n }\r\n removeInstances(minX: number, minZ: number, maxX: number, maxZ: number, numInstances: number) {\r\n let n = Math.min(this._grassInstances.get()!.numInstances, numInstances);\r\n if (n <= 0) {\r\n return 0;\r\n }\r\n let removed = 0;\r\n if (this._children) {\r\n for (const child of this._children) {\r\n if (child._minX < maxX && child._minZ < maxZ && child._maxX > minX && child._maxZ > minZ) {\r\n removed += child.removeInstances(minX, minZ, maxX, maxZ, n);\r\n n -= removed;\r\n }\r\n }\r\n }\r\n if (n > 0) {\r\n removed += this._grassInstances.get()!.removeInstances(minX, minZ, maxX, maxZ, n);\r\n }\r\n return removed;\r\n }\r\n addInstances(instances: GrassInstanceInfo[]) {\r\n if (instances.length === 0) {\r\n return 0;\r\n }\r\n let n = Math.min(instances.length, MAX_INSTANCES_PER_NODE - this._grassInstances.get()!.numInstances);\r\n this._grassInstances.get()!.addInstances(instances.slice(0, n));\r\n if (n < instances.length) {\r\n if (!this._children) {\r\n this._children = [\r\n new GrassQuadtreeNode(this._baseVertexBuffer.get()!, this._indexBuffer.get()!),\r\n new GrassQuadtreeNode(this._baseVertexBuffer.get()!, this._indexBuffer.get()!),\r\n new GrassQuadtreeNode(this._baseVertexBuffer.get()!, this._indexBuffer.get()!),\r\n new GrassQuadtreeNode(this._baseVertexBuffer.get()!, this._indexBuffer.get()!)\r\n ];\r\n this._children[0]._minX = this._minX;\r\n this._children[0]._minZ = this._minZ;\r\n this._children[0]._maxX = (this._minX + this._maxX) * 0.5;\r\n this._children[0]._maxZ = (this._minZ + this._maxZ) * 0.5;\r\n this._children[1]._minX = this._children[0]._maxX;\r\n this._children[1]._minZ = this._minZ;\r\n this._children[1]._maxX = this._maxX;\r\n this._children[1]._maxZ = this._children[0]._maxZ;\r\n this._children[2]._minX = this._minX;\r\n this._children[2]._minZ = this._children[0]._maxZ;\r\n this._children[2]._maxX = this._children[0]._maxX;\r\n this._children[2]._maxZ = this._maxZ;\r\n this._children[3]._minX = this._children[0]._maxX;\r\n this._children[3]._minZ = this._children[0]._maxZ;\r\n this._children[3]._maxX = this._maxX;\r\n this._children[3]._maxZ = this._maxZ;\r\n }\r\n instances = instances.slice(n);\r\n for (const child of this._children) {\r\n if (instances.length > 0) {\r\n const childInstances = instances.filter(\r\n (val) =>\r\n val.x >= child._minX && val.y >= child._minZ && val.x < child._maxX && val.y < child._maxZ\r\n );\r\n n += child.addInstances(childInstances);\r\n instances = instances.filter(\r\n (val) =>\r\n !(val.x >= child._minX && val.y >= child._minZ && val.x < child._maxX && val.y < child._maxZ)\r\n );\r\n }\r\n }\r\n }\r\n return n;\r\n }\r\n protected onDispose() {\r\n super.onDispose();\r\n this._baseVertexBuffer.dispose();\r\n this._indexBuffer.dispose();\r\n this._grassInstances.dispose();\r\n if (this._children) {\r\n for (const child of this._children) {\r\n child.dispose();\r\n }\r\n }\r\n }\r\n}\r\n"],"names":["MAX_INSTANCES_PER_NODE","INSTANCE_BYTES","GrassInstances","Disposable","_instances","_baseVertexBuffer","_indexBuffer","_instanceBuffer","_primitive","baseVertexBuffer","indexBuffer","DRef","numInstances","length","instanceBuffer","get","setBaseVertexBuffer","set","dispose","draw","primitive","Primitive","setVertexBuffer","setIndexBuffer","primitiveType","indexStart","indexCount","drawInstanced","updateBuffers","device","getDevice","createVertexBuffer","Uint8Array","buffer","currentBytes","byteLength","bytesRequired","nextPowerOf2","data","Float32Array","i","x","y","Math","sin","angle","cos","bufferSubData","removeInstances","minX","minZ","maxX","maxZ","num","removed","instance","splice","addInstances","instances","push","onDispose","GrassLayer","_material","_quadtree","_bladeWidth","_bladeHeight","terrain","bladeWidth","bladeHeight","albedoMap","ClipmapGrassMaterial","albedoTexture","setTextureSize","width","height","createBaseVertexBuffer","GrassQuadtreeNode","_getIndexBuffer","quadtree","updateMaterial","uniformChanged","setAlbedoMap","getAlbedoMap","val","setBladeSize","createIndexBuffer","Uint16Array","r","t","c","PI","s","vertices","createInterleavedVertexBuffer","ctx","region","minY","maxY","apply","pass","numPasses","bind","camera","GrassRenderer","_terrain","_numGrassBlades","_layers","DWeakRef","layer","numGrassBlades","numLayers","getLayer","index","addLayer","getGrassTexture","setGrassTexture","texture","grassLayer","console","error","getBladeWidth","getBladeHeight","bv","getWorldBoundingVolume","toAABB","minPoint","maxPoint","worldRegion","_cullAABB","AABB","_grassInstances","_children","_minX","_minZ","_maxX","_maxZ","grassInstances","children","skipClipTest","cullAABB","z","dx","dz","w","setXYZ","clipState","clipMask","getClipStateWithFrustumMask","frustum","getClipStateWithFrustum","ClipState","NOT_CLIPPED","A_INSIDE_B","child","n","min","slice","childInstances","filter"],"mappings":"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"}
@@ -4,6 +4,7 @@ import '../../material/lambert.js';
4
4
  import '../../material/blinn.js';
5
5
  import '../../material/unlit.js';
6
6
  import '../../material/particle.js';
7
+ import '../../material/subsurfaceprofile.js';
7
8
  import '@zephyr3d/device';
8
9
  import { RENDER_PASS_TYPE_LIGHT } from '../../values.js';
9
10
  import { applyMaterialMixins, MeshMaterial } from '../../material/meshmaterial.js';
@@ -11,10 +12,10 @@ import '../../material/grassmaterial.js';
11
12
  import '../../material/terrain-cm.js';
12
13
  import '../../material/pbrmr.js';
13
14
  import '../../material/pbrsg.js';
15
+ import '../../material/mtoon.js';
14
16
  import '../../material/pbrblueprint.js';
15
17
  import '../../material/sprite.js';
16
18
  import '../../material/sprite_std.js';
17
- import '../../material/msdf_text.js';
18
19
  import '../../utility/blueprint/material/texture.js';
19
20
  import { mixinPBRMetallicRoughness } from '../../material/mixins/lightmodel/pbrmetallicroughness.js';
20
21
  import { mixinFoliage } from '../../material/mixins/foliage.js';
@@ -1 +1 @@
1
- {"version":3,"file":"grassmaterial.js","sources":["../../../src/scene/terrain-cm/grassmaterial.ts"],"sourcesContent":["import type { Clonable } from '@zephyr3d/base';\r\nimport { Vector2, Vector4, DWeakRef } from '@zephyr3d/base';\r\nimport type { BindGroup, PBFunctionScope, RenderStateSet } from '@zephyr3d/device';\r\nimport {\r\n applyMaterialMixins,\r\n MeshMaterial,\r\n mixinFoliage,\r\n mixinPBRMetallicRoughness,\r\n ShaderHelper\r\n} from '../../material';\r\nimport type { DrawContext } from '../../render';\r\nimport { RENDER_PASS_TYPE_LIGHT } from '../../values';\r\nimport type { ClipmapTerrain } from './terrain-cm';\r\nimport { fetchSampler } from '../../utility/misc';\r\n\r\n/**\r\n * Terrain grass material\r\n * @public\r\n */\r\nexport class ClipmapGrassMaterial\r\n extends applyMaterialMixins(MeshMaterial, mixinPBRMetallicRoughness, mixinFoliage)\r\n implements Clonable<ClipmapGrassMaterial>\r\n{\r\n /** @internal */\r\n private readonly _terrain: DWeakRef<ClipmapTerrain>;\r\n /** @internal */\r\n private readonly _terrainPosScale: Vector4;\r\n /** @internal */\r\n private readonly _heightMapSize: Vector2;\r\n /** @internal */\r\n private readonly _textureSize: Vector2;\r\n /**\r\n * Creates an instance of GrassMaterial class\r\n * @param terrain - Clipmap terrain object\r\n * @param heightMap - height map\r\n * @param grassTexture - grass texture\r\n */\r\n constructor(terrain: ClipmapTerrain) {\r\n super();\r\n this.metallic = 0;\r\n this.roughness = 1;\r\n this.doubleSidedLighting = false;\r\n this.specularFactor = new Vector4(1, 1, 1, 0.2);\r\n this._terrain = new DWeakRef(terrain);\r\n this._terrainPosScale = new Vector4();\r\n this._heightMapSize = new Vector2(1 / terrain.heightMap!.width, 1 / terrain.heightMap!.height);\r\n this._textureSize = Vector2.one();\r\n }\r\n clone() {\r\n const other = new ClipmapGrassMaterial(this._terrain.get()!);\r\n other.copyFrom(this);\r\n return other;\r\n }\r\n copyFrom(other: this) {\r\n super.copyFrom(other);\r\n this._terrainPosScale.set(other._terrainPosScale);\r\n this._heightMapSize.set(other._heightMapSize);\r\n this._textureSize.set(other._textureSize);\r\n }\r\n setTextureSize(w: number, h: number) {\r\n this._textureSize.setXY(w, h);\r\n this.uniformChanged();\r\n }\r\n /**\r\n * {@inheritDoc MeshMaterial.isTransparentPass}\r\n * @override\r\n */\r\n isTransparentPass(_pass: number) {\r\n return false;\r\n }\r\n /**\r\n * {@inheritDoc Material.supportLighting}\r\n * @override\r\n */\r\n supportLighting() {\r\n return true;\r\n }\r\n /**\r\n * {@inheritDoc Material.supportInstancing}\r\n * @override\r\n */\r\n supportInstancing() {\r\n return false;\r\n }\r\n applyUniformValues(bindGroup: BindGroup, ctx: DrawContext, pass: number) {\r\n super.applyUniformValues(bindGroup, ctx, pass);\r\n const terrain = this._terrain.get()!;\r\n this._terrainPosScale.setXYZW(terrain.scale.x, terrain.scale.y, terrain.scale.z, terrain.worldMatrix.m13);\r\n bindGroup.setTexture('terrainHeightMap', terrain.heightMap!, fetchSampler('clamp_linear_nomip'));\r\n bindGroup.setValue('heightMapSize', this._heightMapSize);\r\n bindGroup.setValue('terrainRegion', terrain.worldRegion);\r\n bindGroup.setValue('terrainPosScale', this._terrainPosScale);\r\n if (this.needFragmentColor(ctx)) {\r\n bindGroup.setValue('albedoTextureSize', this._textureSize);\r\n }\r\n }\r\n vertexShader(scope: PBFunctionScope) {\r\n super.vertexShader(scope);\r\n const pb = scope.$builder;\r\n scope.$inputs.pos = pb.vec3().attrib('position');\r\n scope.$inputs.albedoUV = pb.vec2().attrib('texCoord0');\r\n scope.$inputs.placement = pb.vec4().attrib('texCoord1');\r\n scope.terrainHeightMap = pb.tex2D().uniform(2);\r\n scope.heightMapSize = pb.vec2().uniform(2);\r\n scope.terrainRegion = pb.vec4().uniform(2);\r\n scope.terrainPosScale = pb.vec4().uniform(2);\r\n\r\n pb.func('calcHeightMapNormal', [pb.vec2('uv'), pb.vec2('texelSize'), pb.vec3('scale')], function () {\r\n this.$l.hL = pb.textureSampleLevel(\r\n this.terrainHeightMap,\r\n pb.sub(this.uv, pb.vec2(this.texelSize.x, 0)),\r\n 0\r\n ).r;\r\n this.$l.hR = pb.textureSampleLevel(\r\n this.terrainHeightMap,\r\n pb.add(this.uv, pb.vec2(this.texelSize.x, 0)),\r\n 0\r\n ).r;\r\n this.$l.hD = pb.textureSampleLevel(\r\n this.terrainHeightMap,\r\n pb.add(this.uv, pb.vec2(0, this.texelSize.y)),\r\n 0\r\n ).r;\r\n this.$l.hU = pb.textureSampleLevel(\r\n this.terrainHeightMap,\r\n pb.sub(this.uv, pb.vec2(0, this.texelSize.y)),\r\n 0\r\n ).r;\r\n this.$l.dHdU = pb.div(pb.mul(pb.sub(this.hR, this.hL), this.scale.y), pb.mul(this.scale.x, 2));\r\n this.$l.dHdV = pb.div(pb.mul(pb.sub(this.hD, this.hU), this.scale.y), pb.mul(this.scale.z, 2));\r\n this.t = pb.normalize(pb.vec3(1, this.dHdU, 0));\r\n this.b = pb.normalize(pb.vec3(0, this.dHdV, 1));\r\n this.$return(pb.normalize(pb.cross(this.b, this.t)));\r\n });\r\n\r\n scope.$l.uv = scope.$inputs.placement.xy;\r\n scope.$l.heightSample = pb.textureSampleLevel(scope.terrainHeightMap, scope.uv, 0);\r\n scope.$l.height = pb.add(pb.mul(scope.heightSample.r, scope.terrainPosScale.y), scope.terrainPosScale.w);\r\n scope.$l.normal = scope.calcHeightMapNormal(scope.uv, scope.heightMapSize, scope.terrainPosScale.xyz);\r\n scope.$l.axisX = pb.vec3(scope.$inputs.placement.z, 0, scope.$inputs.placement.w);\r\n scope.$l.axisZ = pb.cross(scope.axisX, scope.normal);\r\n scope.$l.axisX = pb.cross(scope.normal, scope.axisZ);\r\n scope.$l.rotPos = pb.mul(pb.mat3(scope.axisX, scope.normal, scope.axisZ), scope.$inputs.pos);\r\n scope.$l.posXZ = pb.add(\r\n pb.mul(scope.$inputs.placement.xy, pb.sub(scope.terrainRegion.zw, scope.terrainRegion.xy)),\r\n scope.terrainRegion.xy\r\n );\r\n scope.$outputs.zAlbedoTexCoord = scope.$inputs.albedoUV;\r\n scope.$outputs.worldPos = pb.add(scope.rotPos, pb.vec3(scope.posXZ.x, scope.height, scope.posXZ.y));\r\n ShaderHelper.setClipSpacePosition(\r\n scope,\r\n pb.mul(ShaderHelper.getViewProjectionMatrix(scope), pb.vec4(scope.$outputs.worldPos, 1))\r\n );\r\n scope.$outputs.worldNorm = scope.normal;\r\n ShaderHelper.resolveMotionVector(scope, scope.$outputs.worldPos, scope.$outputs.worldPos);\r\n }\r\n fragmentShader(scope: PBFunctionScope) {\r\n super.fragmentShader(scope);\r\n const pb = scope.$builder;\r\n const that = this;\r\n if (this.needFragmentColor()) {\r\n scope.albedoTextureSize = pb.vec2().uniform(2);\r\n scope.$l.albedo = this.calculateAlbedoColor(scope);\r\n scope.albedo = that.calculateFoliageAlbedo(\r\n scope,\r\n scope.albedo,\r\n pb.mul(that.getAlbedoTexCoord(scope), scope.albedoTextureSize)\r\n );\r\n scope.$l.litColor = pb.vec3(0);\r\n if (this.drawContext.renderPass!.type === RENDER_PASS_TYPE_LIGHT) {\r\n scope.$l.normalInfo = this.calculateNormalAndTBN(\r\n scope,\r\n scope.$inputs.worldPos,\r\n scope.$inputs.worldNorm\r\n );\r\n scope.$l.viewVec = this.calculateViewVector(scope, scope.$inputs.worldPos);\r\n scope.$l.litColor = this.PBRLight(\r\n scope,\r\n scope.$inputs.worldPos,\r\n scope.normalInfo.normal,\r\n scope.viewVec,\r\n scope.albedo,\r\n scope.normalInfo.TBN\r\n );\r\n }\r\n this.outputFragmentColor(scope, scope.$inputs.worldPos, pb.vec4(scope.litColor, scope.albedo.a));\r\n } else {\r\n this.outputFragmentColor(scope, scope.$inputs.worldPos, null);\r\n }\r\n }\r\n apply(ctx: DrawContext) {\r\n this.alphaToCoverage = ctx.device.getFrameBufferSampleCount() > 1;\r\n this.alphaCutoff = this.alphaToCoverage ? 1 : 0.8;\r\n return super.apply(ctx);\r\n }\r\n protected updateRenderStates(pass: number, stateSet: RenderStateSet, ctx: DrawContext) {\r\n super.updateRenderStates(pass, stateSet, ctx);\r\n stateSet.useRasterizerState().setCullMode('none');\r\n }\r\n}\r\n"],"names":["ClipmapGrassMaterial","applyMaterialMixins","MeshMaterial","mixinPBRMetallicRoughness","mixinFoliage","terrain","metallic","roughness","doubleSidedLighting","specularFactor","Vector4","_terrain","DWeakRef","_terrainPosScale","_heightMapSize","Vector2","heightMap","width","height","_textureSize","one","clone","other","get","copyFrom","set","setTextureSize","w","h","setXY","uniformChanged","isTransparentPass","_pass","supportLighting","supportInstancing","applyUniformValues","bindGroup","ctx","pass","setXYZW","scale","x","y","z","worldMatrix","m13","setTexture","fetchSampler","setValue","worldRegion","needFragmentColor","vertexShader","scope","pb","$builder","$inputs","pos","vec3","attrib","albedoUV","vec2","placement","vec4","terrainHeightMap","tex2D","uniform","heightMapSize","terrainRegion","terrainPosScale","func","$l","hL","textureSampleLevel","sub","uv","texelSize","r","hR","add","hD","hU","dHdU","div","mul","dHdV","t","normalize","b","$return","cross","xy","heightSample","normal","calcHeightMapNormal","xyz","axisX","axisZ","rotPos","mat3","posXZ","zw","$outputs","zAlbedoTexCoord","worldPos","ShaderHelper","setClipSpacePosition","getViewProjectionMatrix","worldNorm","resolveMotionVector","fragmentShader","that","albedoTextureSize","albedo","calculateAlbedoColor","calculateFoliageAlbedo","getAlbedoTexCoord","litColor","drawContext","renderPass","type","RENDER_PASS_TYPE_LIGHT","normalInfo","calculateNormalAndTBN","viewVec","calculateViewVector","PBRLight","TBN","outputFragmentColor","a","apply","alphaToCoverage","device","getFrameBufferSampleCount","alphaCutoff","updateRenderStates","stateSet","useRasterizerState","setCullMode"],"mappings":"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"}
1
+ {"version":3,"file":"grassmaterial.js","sources":["../../../src/scene/terrain-cm/grassmaterial.ts"],"sourcesContent":["import type { Clonable } from '@zephyr3d/base';\r\nimport { Vector2, Vector4, DWeakRef } from '@zephyr3d/base';\r\nimport type { BindGroup, PBFunctionScope, RenderStateSet } from '@zephyr3d/device';\r\nimport {\r\n applyMaterialMixins,\r\n MeshMaterial,\r\n mixinFoliage,\r\n mixinPBRMetallicRoughness,\r\n ShaderHelper\r\n} from '../../material';\r\nimport type { DrawContext } from '../../render';\r\nimport { RENDER_PASS_TYPE_LIGHT } from '../../values';\r\nimport type { ClipmapTerrain } from './terrain-cm';\r\nimport { fetchSampler } from '../../utility/misc';\r\n\r\n/**\r\n * Terrain grass material\r\n * @public\r\n */\r\nexport class ClipmapGrassMaterial\r\n extends applyMaterialMixins(MeshMaterial, mixinPBRMetallicRoughness, mixinFoliage)\r\n implements Clonable<ClipmapGrassMaterial>\r\n{\r\n /** @internal */\r\n private readonly _terrain: DWeakRef<ClipmapTerrain>;\r\n /** @internal */\r\n private readonly _terrainPosScale: Vector4;\r\n /** @internal */\r\n private readonly _heightMapSize: Vector2;\r\n /** @internal */\r\n private readonly _textureSize: Vector2;\r\n /**\r\n * Creates an instance of GrassMaterial class\r\n * @param terrain - Clipmap terrain object\r\n * @param heightMap - height map\r\n * @param grassTexture - grass texture\r\n */\r\n constructor(terrain: ClipmapTerrain) {\r\n super();\r\n this.metallic = 0;\r\n this.roughness = 1;\r\n this.doubleSidedLighting = false;\r\n this.specularFactor = new Vector4(1, 1, 1, 0.2);\r\n this._terrain = new DWeakRef(terrain);\r\n this._terrainPosScale = new Vector4();\r\n this._heightMapSize = new Vector2(1 / terrain.heightMap!.width, 1 / terrain.heightMap!.height);\r\n this._textureSize = Vector2.one();\r\n }\r\n clone() {\r\n const other = new ClipmapGrassMaterial(this._terrain.get()!);\r\n other.copyFrom(this);\r\n return other;\r\n }\r\n copyFrom(other: this) {\r\n super.copyFrom(other);\r\n this._terrainPosScale.set(other._terrainPosScale);\r\n this._heightMapSize.set(other._heightMapSize);\r\n this._textureSize.set(other._textureSize);\r\n }\r\n setTextureSize(w: number, h: number) {\r\n this._textureSize.setXY(w, h);\r\n this.uniformChanged();\r\n }\r\n /**\r\n * {@inheritDoc MeshMaterial.isTransparentPass}\r\n * @override\r\n */\r\n isTransparentPass(_pass: number) {\r\n return false;\r\n }\r\n /**\r\n * {@inheritDoc Material.supportLighting}\r\n * @override\r\n */\r\n supportLighting() {\r\n return true;\r\n }\r\n /**\r\n * {@inheritDoc Material.supportInstancing}\r\n * @override\r\n */\r\n supportInstancing() {\r\n return false;\r\n }\r\n applyUniformValues(bindGroup: BindGroup, ctx: DrawContext, pass: number) {\r\n super.applyUniformValues(bindGroup, ctx, pass);\r\n const terrain = this._terrain.get()!;\r\n this._terrainPosScale.setXYZW(terrain.scale.x, terrain.scale.y, terrain.scale.z, terrain.worldMatrix.m13);\r\n bindGroup.setTexture('terrainHeightMap', terrain.heightMap!, fetchSampler('clamp_linear_nomip'));\r\n bindGroup.setValue('heightMapSize', this._heightMapSize);\r\n bindGroup.setValue('terrainRegion', terrain.worldRegion);\r\n bindGroup.setValue('terrainPosScale', this._terrainPosScale);\r\n if (this.needFragmentColor(ctx)) {\r\n bindGroup.setValue('albedoTextureSize', this._textureSize);\r\n }\r\n }\r\n vertexShader(scope: PBFunctionScope) {\r\n super.vertexShader(scope);\r\n const pb = scope.$builder;\r\n scope.$inputs.pos = pb.vec3().attrib('position');\r\n scope.$inputs.albedoUV = pb.vec2().attrib('texCoord0');\r\n scope.$inputs.placement = pb.vec4().attrib('texCoord1');\r\n scope.terrainHeightMap = pb.tex2D().uniform(2);\r\n scope.heightMapSize = pb.vec2().uniform(2);\r\n scope.terrainRegion = pb.vec4().uniform(2);\r\n scope.terrainPosScale = pb.vec4().uniform(2);\r\n\r\n pb.func('calcHeightMapNormal', [pb.vec2('uv'), pb.vec2('texelSize'), pb.vec3('scale')], function () {\r\n this.$l.hL = pb.textureSampleLevel(\r\n this.terrainHeightMap,\r\n pb.sub(this.uv, pb.vec2(this.texelSize.x, 0)),\r\n 0\r\n ).r;\r\n this.$l.hR = pb.textureSampleLevel(\r\n this.terrainHeightMap,\r\n pb.add(this.uv, pb.vec2(this.texelSize.x, 0)),\r\n 0\r\n ).r;\r\n this.$l.hD = pb.textureSampleLevel(\r\n this.terrainHeightMap,\r\n pb.add(this.uv, pb.vec2(0, this.texelSize.y)),\r\n 0\r\n ).r;\r\n this.$l.hU = pb.textureSampleLevel(\r\n this.terrainHeightMap,\r\n pb.sub(this.uv, pb.vec2(0, this.texelSize.y)),\r\n 0\r\n ).r;\r\n this.$l.dHdU = pb.div(pb.mul(pb.sub(this.hR, this.hL), this.scale.y), pb.mul(this.scale.x, 2));\r\n this.$l.dHdV = pb.div(pb.mul(pb.sub(this.hD, this.hU), this.scale.y), pb.mul(this.scale.z, 2));\r\n this.t = pb.normalize(pb.vec3(1, this.dHdU, 0));\r\n this.b = pb.normalize(pb.vec3(0, this.dHdV, 1));\r\n this.$return(pb.normalize(pb.cross(this.b, this.t)));\r\n });\r\n\r\n scope.$l.uv = scope.$inputs.placement.xy;\r\n scope.$l.heightSample = pb.textureSampleLevel(scope.terrainHeightMap, scope.uv, 0);\r\n scope.$l.height = pb.add(pb.mul(scope.heightSample.r, scope.terrainPosScale.y), scope.terrainPosScale.w);\r\n scope.$l.normal = scope.calcHeightMapNormal(scope.uv, scope.heightMapSize, scope.terrainPosScale.xyz);\r\n scope.$l.axisX = pb.vec3(scope.$inputs.placement.z, 0, scope.$inputs.placement.w);\r\n scope.$l.axisZ = pb.cross(scope.axisX, scope.normal);\r\n scope.$l.axisX = pb.cross(scope.normal, scope.axisZ);\r\n scope.$l.rotPos = pb.mul(pb.mat3(scope.axisX, scope.normal, scope.axisZ), scope.$inputs.pos);\r\n scope.$l.posXZ = pb.add(\r\n pb.mul(scope.$inputs.placement.xy, pb.sub(scope.terrainRegion.zw, scope.terrainRegion.xy)),\r\n scope.terrainRegion.xy\r\n );\r\n scope.$outputs.zAlbedoTexCoord = scope.$inputs.albedoUV;\r\n scope.$outputs.worldPos = pb.add(scope.rotPos, pb.vec3(scope.posXZ.x, scope.height, scope.posXZ.y));\r\n ShaderHelper.setClipSpacePosition(\r\n scope,\r\n pb.mul(ShaderHelper.getViewProjectionMatrix(scope), pb.vec4(scope.$outputs.worldPos, 1))\r\n );\r\n scope.$outputs.worldNorm = scope.normal;\r\n ShaderHelper.resolveMotionVector(scope, scope.$outputs.worldPos, scope.$outputs.worldPos);\r\n }\r\n fragmentShader(scope: PBFunctionScope) {\r\n super.fragmentShader(scope);\r\n const pb = scope.$builder;\r\n const that = this;\r\n if (this.needFragmentColor()) {\r\n scope.albedoTextureSize = pb.vec2().uniform(2);\r\n scope.$l.albedo = this.calculateAlbedoColor(scope);\r\n scope.albedo = that.calculateFoliageAlbedo(\r\n scope,\r\n scope.albedo,\r\n pb.mul(that.getAlbedoTexCoord(scope), scope.albedoTextureSize)\r\n );\r\n scope.$l.litColor = pb.vec3(0);\r\n if (this.drawContext.renderPass!.type === RENDER_PASS_TYPE_LIGHT) {\r\n scope.$l.normalInfo = this.calculateNormalAndTBN(\r\n scope,\r\n scope.$inputs.worldPos,\r\n scope.$inputs.worldNorm\r\n );\r\n scope.$l.viewVec = this.calculateViewVector(scope, scope.$inputs.worldPos);\r\n scope.$l.litColor = this.PBRLight(\r\n scope,\r\n scope.$inputs.worldPos,\r\n scope.normalInfo.normal,\r\n scope.viewVec,\r\n scope.albedo,\r\n scope.normalInfo.TBN\r\n );\r\n }\r\n this.outputFragmentColor(scope, scope.$inputs.worldPos, pb.vec4(scope.litColor, scope.albedo.a));\r\n } else {\r\n this.outputFragmentColor(scope, scope.$inputs.worldPos, null);\r\n }\r\n }\r\n apply(ctx: DrawContext) {\r\n this.alphaToCoverage = ctx.device.getFrameBufferSampleCount() > 1;\r\n this.alphaCutoff = this.alphaToCoverage ? 1 : 0.8;\r\n return super.apply(ctx);\r\n }\r\n protected updateRenderStates(pass: number, stateSet: RenderStateSet, ctx: DrawContext) {\r\n super.updateRenderStates(pass, stateSet, ctx);\r\n stateSet.useRasterizerState().setCullMode('none');\r\n }\r\n}\r\n"],"names":["ClipmapGrassMaterial","applyMaterialMixins","MeshMaterial","mixinPBRMetallicRoughness","mixinFoliage","terrain","metallic","roughness","doubleSidedLighting","specularFactor","Vector4","_terrain","DWeakRef","_terrainPosScale","_heightMapSize","Vector2","heightMap","width","height","_textureSize","one","clone","other","get","copyFrom","set","setTextureSize","w","h","setXY","uniformChanged","isTransparentPass","_pass","supportLighting","supportInstancing","applyUniformValues","bindGroup","ctx","pass","setXYZW","scale","x","y","z","worldMatrix","m13","setTexture","fetchSampler","setValue","worldRegion","needFragmentColor","vertexShader","scope","pb","$builder","$inputs","pos","vec3","attrib","albedoUV","vec2","placement","vec4","terrainHeightMap","tex2D","uniform","heightMapSize","terrainRegion","terrainPosScale","func","$l","hL","textureSampleLevel","sub","uv","texelSize","r","hR","add","hD","hU","dHdU","div","mul","dHdV","t","normalize","b","$return","cross","xy","heightSample","normal","calcHeightMapNormal","xyz","axisX","axisZ","rotPos","mat3","posXZ","zw","$outputs","zAlbedoTexCoord","worldPos","ShaderHelper","setClipSpacePosition","getViewProjectionMatrix","worldNorm","resolveMotionVector","fragmentShader","that","albedoTextureSize","albedo","calculateAlbedoColor","calculateFoliageAlbedo","getAlbedoTexCoord","litColor","drawContext","renderPass","type","RENDER_PASS_TYPE_LIGHT","normalInfo","calculateNormalAndTBN","viewVec","calculateViewVector","PBRLight","TBN","outputFragmentColor","a","apply","alphaToCoverage","device","getFrameBufferSampleCount","alphaCutoff","updateRenderStates","stateSet","useRasterizerState","setCullMode"],"mappings":"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"}
@@ -1,9 +1,9 @@
1
1
  import { applyMixins, DRef, randomUUID, Vector3, Vector4 } from '@zephyr3d/base';
2
2
  import { GraphNode } from '../graph_node.js';
3
3
  import { mixinDrawable } from '../../render/drawable_mixin.js';
4
- import { getDevice } from '../../app/api.js';
5
4
  import { MAX_TERRAIN_MIPMAP_LEVELS, QUEUE_OPAQUE, RENDER_PASS_TYPE_OBJECT_COLOR, RENDER_PASS_TYPE_SHADOWMAP } from '../../values.js';
6
5
  import '../../render/render_queue.js';
6
+ import { getDevice } from '../../app/api.js';
7
7
  import '../../render/primitive.js';
8
8
  import '@zephyr3d/device';
9
9
  import { CopyBlitter } from '../../blitter/copy.js';
@@ -12,18 +12,20 @@ import '../../material/lambert.js';
12
12
  import '../../material/blinn.js';
13
13
  import '../../material/unlit.js';
14
14
  import '../../material/particle.js';
15
+ import '../../material/subsurfaceprofile.js';
15
16
  import '../../material/meshmaterial.js';
16
17
  import '../../material/grassmaterial.js';
17
18
  import { ClipmapTerrainMaterial } from '../../material/terrain-cm.js';
18
19
  import '../../material/pbrmr.js';
19
20
  import '../../material/pbrsg.js';
21
+ import '../../material/mtoon.js';
20
22
  import '../../material/pbrblueprint.js';
21
23
  import '../../material/sprite.js';
22
24
  import '../../material/sprite_std.js';
23
- import '../../material/msdf_text.js';
24
25
  import '../../utility/blueprint/material/texture.js';
25
26
  import { fetchSampler } from '../../utility/misc.js';
26
27
  import '../../render/rendergraph/forward_plus_builder.js';
28
+ import '../../render/lightpass.js';
27
29
  import '../../render/sky.js';
28
30
  import { Clipmap } from '../../render/clipmap.js';
29
31
  import '../../shaders/atmosphere.js';
@@ -1 +1 @@
1
- {"version":3,"file":"terrain-cm.js","sources":["../../../src/scene/terrain-cm/terrain-cm.ts"],"sourcesContent":["import type { Immutable, Matrix4x4, Nullable } from '@zephyr3d/base';\r\nimport { Vector4, applyMixins, Vector3, DRef, randomUUID } from '@zephyr3d/base';\r\nimport type { PBInsideFunctionScope, PBShaderExp, Texture2D } from '@zephyr3d/device';\r\nimport type { Scene } from '../scene';\r\nimport { GraphNode } from '../graph_node';\r\nimport { mixinDrawable } from '../../render/drawable_mixin';\r\nimport type { Drawable, DrawContext, PickTarget, PrimitiveInstanceInfo, RenderQueue } from '../../render';\r\nimport { Clipmap } from '../../render';\r\nimport { ClipmapTerrainMaterial } from '../../material/terrain-cm';\r\nimport { BoundingBox } from '../../utility/bounding_volume';\r\nimport {\r\n MAX_TERRAIN_MIPMAP_LEVELS,\r\n QUEUE_OPAQUE,\r\n RENDER_PASS_TYPE_OBJECT_COLOR,\r\n RENDER_PASS_TYPE_SHADOWMAP\r\n} from '../../values';\r\nimport type { BlitType } from '../../blitter';\r\nimport { CopyBlitter } from '../../blitter';\r\nimport { fetchSampler } from '../../utility/misc';\r\nimport { RenderMipmap } from '../../utility/rendermipmap';\r\nimport { GrassRenderer } from './grass';\r\nimport type { Camera } from '../../camera';\r\nimport { getDevice } from '../../app/api';\r\n\r\nclass HeightMinMaxBlitter extends CopyBlitter {\r\n filter(\r\n scope: PBInsideFunctionScope,\r\n type: BlitType,\r\n srcTex: PBShaderExp,\r\n srcUV: PBShaderExp,\r\n srcLayer: PBShaderExp,\r\n sampleType: 'float' | 'int' | 'uint'\r\n ) {\r\n return this.readTexel(scope, type, srcTex, srcUV, srcLayer, sampleType).xxxx as PBShaderExp;\r\n }\r\n}\r\n\r\nclass HeightBoundingGenerator extends RenderMipmap {\r\n renderPixel(\r\n scope: PBInsideFunctionScope,\r\n leftTop: PBShaderExp,\r\n rightTop: PBShaderExp,\r\n leftBottom: PBShaderExp,\r\n rightBottom: PBShaderExp\r\n ) {\r\n const pb = scope.$builder;\r\n scope.$l.maxHeight = pb.max(pb.max(leftTop.r, rightTop.r), pb.max(leftBottom.r, rightBottom.r));\r\n scope.$l.minHeight = pb.min(pb.min(leftTop.g, rightTop.g), pb.min(leftBottom.g, rightBottom.g));\r\n return pb.vec4(scope.maxHeight, scope.minHeight, leftTop.r, 1);\r\n }\r\n}\r\n\r\n/**\r\n * ClipmapTerrain implements an efficient terrain rendering system using clipmaps.\r\n *\r\n * Clipmaps provide level-of-detail (LOD) rendering for large terrains by using\r\n * multiple nested grids at different resolutions. The terrain automatically\r\n * adjusts detail levels based on camera distance, providing high detail near\r\n * the camera and lower detail in the distance.\r\n *\r\n * Key features:\r\n * - Automatic LOD management based on camera position\r\n * - Support for height maps, splat maps, and detail textures\r\n * - Integrated grass rendering system\r\n *\r\n * @public\r\n */\r\nexport class ClipmapTerrain extends applyMixins(GraphNode, mixinDrawable) implements Drawable {\r\n private static readonly _heightBoundingGenerator = new HeightBoundingGenerator();\r\n private static readonly _copyBlitter = new HeightMinMaxBlitter();\r\n private static readonly _tmpBuffer = new Float32Array(MAX_TERRAIN_MIPMAP_LEVELS * 2 * 4);\r\n private readonly _pickTarget: PickTarget;\r\n private _clipmap: Clipmap;\r\n private _renderData: Nullable<PrimitiveInstanceInfo[]>;\r\n private _gridScale: number;\r\n private _material: DRef<ClipmapTerrainMaterial>;\r\n private _grassRenderer: DRef<GrassRenderer>;\r\n private _castShadow: boolean;\r\n private _sizeX: number;\r\n private _sizeZ: number;\r\n private _heightMapAssetId: string;\r\n private _splatMapAssetId: string;\r\n private _grassAssetId: string;\r\n private _minHeight: number;\r\n private _maxHeight: number;\r\n private _tmpTexture: DRef<Texture2D>;\r\n /**\r\n * Creates a new clipmap terrain instance.\r\n *\r\n * @param scene - Scene to add the terrain to\r\n * @param sizeX - Terrain width in world units (default: 256)\r\n * @param sizeZ - Terrain depth in world units (default: 256)\r\n * @param clipMapTileSize - Size of each clipmap tile in vertices (default: 64)\r\n * Larger values use more memory but reduce draw calls\r\n *\r\n */\r\n constructor(scene: Scene, sizeX = 256, sizeZ = 256, clipMapTileSize = 64) {\r\n super(scene);\r\n this._pickTarget = { node: this };\r\n this._clipmap = new Clipmap(clipMapTileSize, ['tex1_f32'], MAX_TERRAIN_MIPMAP_LEVELS);\r\n this._renderData = null;\r\n this._grassRenderer = new DRef(new GrassRenderer(this));\r\n this._gridScale = 1;\r\n this._castShadow = true;\r\n this._sizeX = sizeX;\r\n this._sizeZ = sizeZ;\r\n this._heightMapAssetId = `assets/.embedded.dir/${this.persistentId}-heightmap.bin`;\r\n this._grassAssetId = `assets/.embedded.dir/${this.persistentId}-grass.bin`;\r\n this._splatMapAssetId = `assets/.embedded.dir/${this.persistentId}-splatmap.bin`;\r\n this._minHeight = 0;\r\n this._maxHeight = 0;\r\n this._material = new DRef(\r\n new ClipmapTerrainMaterial(this.createHeightMapTexture(this._sizeX, this._sizeZ))\r\n );\r\n this._tmpTexture = new DRef();\r\n this.updateRegion();\r\n scene.queuePerCameraUpdateNode(this);\r\n }\r\n /**\r\n * Gets the integrated grass renderer for this terrain.\r\n * The grass renderer handles vegetation rendering on the terrain surface.\r\n *\r\n * @returns The grass renderer instance\r\n */\r\n get grassRenderer() {\r\n return this._grassRenderer.get()!;\r\n }\r\n /**\r\n * Gets the maximum number of detail maps supported by the terrain material.\r\n * Detail maps provide surface texturing (grass, rock, sand, etc.).\r\n *\r\n * @returns Maximum number of detail maps\r\n */\r\n get MAX_DETAIL_MAP_COUNT() {\r\n return ClipmapTerrainMaterial.MAX_DETAIL_MAP_COUNT;\r\n }\r\n /**\r\n * Gets the asset ID for the height map texture.\r\n * Generates a random UUID if not previously set.\r\n *\r\n * @returns Height map asset ID\r\n * @internal\r\n */\r\n get heightMapAssetId() {\r\n if (!this._heightMapAssetId) {\r\n this._heightMapAssetId = randomUUID();\r\n }\r\n return this._heightMapAssetId;\r\n }\r\n /** @internal */\r\n set heightMapAssetId(val: string) {\r\n this._heightMapAssetId = val;\r\n }\r\n /**\r\n * Gets the asset ID for the splat map texture.\r\n * Generates a random UUID if not previously set.\r\n *\r\n * @returns Splat map asset ID\r\n * @internal\r\n */\r\n get splatMapAssetId() {\r\n if (!this._splatMapAssetId) {\r\n this._splatMapAssetId = randomUUID();\r\n }\r\n return this._splatMapAssetId;\r\n }\r\n /** @internal */\r\n set splatMapAssetId(val: string) {\r\n this._splatMapAssetId = val;\r\n }\r\n /**\r\n * Gets the asset ID for grass configuration.\r\n * Generates a random UUID if not previously set.\r\n *\r\n * @returns Grass asset ID\r\n * @internal\r\n */\r\n get grassAssetId() {\r\n if (!this._grassAssetId) {\r\n this._grassAssetId = randomUUID();\r\n }\r\n return this._grassAssetId;\r\n }\r\n /** @internal */\r\n set grassAssetId(val: string) {\r\n this._grassAssetId = val;\r\n }\r\n /**\r\n * The current number of active detail maps.\r\n * Detail maps define different surface materials (grass, rock, etc.).\r\n *\r\n * @returns Number of active detail maps\r\n */\r\n get numDetailMaps() {\r\n return this.material?.numDetailMaps ?? 0;\r\n }\r\n set numDetailMaps(val) {\r\n if (this.material) {\r\n this.material.numDetailMaps = val;\r\n }\r\n }\r\n /** {@inheritDoc SceneNode.clone} */\r\n async clone(): Promise<this> {\r\n throw new Error('Cloning clipmap terrain not implemented');\r\n }\r\n /**\r\n * Sets the terrain size.\r\n * Triggers height map resize if dimensions change.\r\n *\r\n * @param sizeX - New width\r\n * @param sizeZ - New depth\r\n */\r\n setSize(sizeX: number, sizeZ: number) {\r\n if (sizeX !== this._sizeX || sizeZ !== this._sizeZ) {\r\n this._sizeX = sizeX;\r\n this._sizeZ = sizeZ;\r\n this.resizeHeightMap(this._sizeX, this._sizeZ);\r\n }\r\n }\r\n /** Wether the mesh node casts shadows */\r\n get castShadow() {\r\n return this._castShadow;\r\n }\r\n set castShadow(val) {\r\n this._castShadow = !!val;\r\n }\r\n /** The terrain width. */\r\n get sizeX() {\r\n return this._sizeX;\r\n }\r\n set sizeX(val) {\r\n if (val !== this._sizeX) {\r\n this._sizeX = val;\r\n this.resizeHeightMap(this._sizeX, this._sizeZ);\r\n }\r\n }\r\n /** The terrain depth. */\r\n get sizeZ() {\r\n return this._sizeZ;\r\n }\r\n set sizeZ(val) {\r\n if (val !== this._sizeZ) {\r\n this._sizeZ = val;\r\n this.resizeHeightMap(this._sizeX, this._sizeZ);\r\n }\r\n }\r\n /** The current height map texture. */\r\n get heightMap() {\r\n return this.material?.heightMap ?? null;\r\n }\r\n set heightMap(val) {\r\n if (this.material && val) {\r\n this.material.heightMap = val;\r\n this.updateRegion();\r\n }\r\n }\r\n /** The splat map texture */\r\n get splatMap() {\r\n return this.material?.getSplatMap() ?? null;\r\n }\r\n /** Material instance of the terrain */\r\n get material() {\r\n return this._material?.get() ?? null;\r\n }\r\n /** whether wireframe rendering is enabled */\r\n get wireframe() {\r\n return this._clipmap.wireframe;\r\n }\r\n set wireframe(val) {\r\n this._clipmap.wireframe = val;\r\n }\r\n /**\r\n * {@inheritDoc Drawable.getPickTarget }\r\n */\r\n getPickTarget() {\r\n return this._pickTarget;\r\n }\r\n /**\r\n * {@inheritDoc Drawable.getMorphData}\r\n */\r\n getMorphData() {\r\n return null;\r\n }\r\n /**\r\n * {@inheritDoc Drawable.getMorphInfo}\r\n */\r\n getMorphInfo() {\r\n return null;\r\n }\r\n /**\r\n * {@inheritDoc Drawable.getQueueType}\r\n */\r\n getQueueType() {\r\n return this.material?.getQueueType() ?? QUEUE_OPAQUE;\r\n }\r\n /**\r\n * {@inheritDoc Drawable.isUnlit}\r\n */\r\n isUnlit() {\r\n return this.material ? !this.material.supportLighting() : false;\r\n }\r\n /**\r\n * {@inheritDoc Drawable.needSceneColor}\r\n */\r\n needSceneColor() {\r\n return this.material?.needSceneColor() ?? false;\r\n }\r\n /**\r\n * {@inheritDoc Drawable.needSceneDepth}\r\n */\r\n needSceneDepth() {\r\n return this.material?.needSceneDepth() ?? false;\r\n }\r\n /**\r\n * {@inheritDoc Drawable.getMaterial}\r\n */\r\n getMaterial() {\r\n return this._material.get();\r\n }\r\n /**\r\n * {@inheritDoc Drawable.getPrimitive}\r\n */\r\n getPrimitive() {\r\n return null;\r\n }\r\n /**\r\n * {@inheritDoc SceneNode.isClipmapTerrain}\r\n */\r\n isClipmapTerrain(): this is ClipmapTerrain {\r\n return true;\r\n }\r\n /**\r\n * {@inheritDoc SceneNode.computeBoundingVolume}\r\n */\r\n computeBoundingVolume() {\r\n return null;\r\n }\r\n /**\r\n * {@inheritDoc SceneNode.computeWorldBoundingVolume}\r\n */\r\n computeWorldBoundingVolume() {\r\n if (this.material) {\r\n const p = this.worldMatrix.transformPointAffine(Vector3.zero());\r\n const minHeight = this._minHeight * this.scale.y;\r\n const maxHeight = this._maxHeight * this.scale.y;\r\n return new BoundingBox(\r\n new Vector3(this.material.region.x, p.y + Math.min(minHeight, maxHeight), this.material.region.y),\r\n new Vector3(this.material.region.z, p.y + Math.max(minHeight, maxHeight), this.material.region.w)\r\n );\r\n } else {\r\n return null;\r\n }\r\n }\r\n /**\r\n * the actual world-space region covered by this terrain (After applying world transform).\r\n */\r\n get worldRegion(): Immutable<Vector4> {\r\n return this.material?.region ?? Vector4.zero();\r\n }\r\n /**\r\n * Calculates the local transformation matrix.\r\n * For terrains, this only includes translation.\r\n *\r\n * @param outMatrix - Output matrix to store the result\r\n */\r\n calculateLocalTransform(outMatrix: Matrix4x4) {\r\n outMatrix.translation(this._position);\r\n }\r\n /**\r\n * Calculates the world transformation matrix.\r\n * Terrains inherit only translation from parent nodes.\r\n *\r\n * @param outMatrix - Output matrix to store the result\r\n */\r\n calculateWorldTransform(outMatrix: Matrix4x4) {\r\n outMatrix.set(this.localMatrix);\r\n if (this.parent) {\r\n outMatrix.m03 += this.parent.worldMatrix.m03;\r\n outMatrix.m13 += this.parent.worldMatrix.m13;\r\n outMatrix.m23 += this.parent.worldMatrix.m23;\r\n }\r\n }\r\n /**\r\n * Updates the terrain's bounding box by analyzing the height map.\r\n * This is an asynchronous operation that reads back GPU data.\r\n *\r\n * @param tmpTexture - Optional temporary texture to reuse (optimization)\r\n *\r\n * @example\r\n * ```typescript\r\n * // Update bounding box after changing height map\r\n * terrain.heightMap = newHeightMap;\r\n * terrain.updateBoundingBox();\r\n * ```\r\n */\r\n updateBoundingBox() {\r\n const heightMap = this.heightMap;\r\n if (!heightMap) {\r\n return;\r\n }\r\n const device = getDevice();\r\n let tmp = this._tmpTexture.get();\r\n if (tmp && (tmp.width !== heightMap.width || tmp.height !== heightMap.height)) {\r\n this._tmpTexture.dispose();\r\n }\r\n if (!this._tmpTexture.get()) {\r\n tmp = getDevice().createTexture2D(\r\n device.type === 'webgl' ? 'rgba32f' : 'rg32f',\r\n heightMap.width,\r\n heightMap.height\r\n )!;\r\n tmp.name = 'TerrainBoundingBoxTexture';\r\n this._tmpTexture.set(tmp);\r\n }\r\n const tmpFB = device.createFrameBuffer([tmp!], null);\r\n ClipmapTerrain._copyBlitter.blit(heightMap, tmpFB, fetchSampler('clamp_nearest_nomip'));\r\n tmpFB.dispose();\r\n ClipmapTerrain._heightBoundingGenerator.render(tmp!);\r\n const data = new Float32Array(4);\r\n tmp!\r\n .readPixels(0, 0, 1, 1, 0, tmp!.mipLevelCount - 1, data)\r\n .then(() => {\r\n this._minHeight = data[0];\r\n this._maxHeight = data[1];\r\n this.invalidateWorldBoundingVolume(false);\r\n })\r\n .catch((_err) => {\r\n console.error('Read pixels failed');\r\n });\r\n }\r\n /** @internal */\r\n createHeightMapTexture(width: number, height: number) {\r\n return getDevice().createTexture2D(getDevice().type === 'webgl' ? 'rgba16f' : 'r16f', width, height)!;\r\n }\r\n /** @internal */\r\n protected _onTransformChanged(invalidateLocal: boolean) {\r\n super._onTransformChanged(invalidateLocal);\r\n this.updateRegion();\r\n }\r\n /** {@inheritDoc SceneNode.updatePerCamera} */\r\n updatePerCamera(camera: Camera, _elapsedInSeconds: number, _deltaInSeconds: number) {\r\n const mat = this._material.get();\r\n if (!mat) {\r\n return;\r\n }\r\n const that = this;\r\n const bv = this.getWorldBoundingVolume()!.toAABB();\r\n this._renderData = this._clipmap.gather({\r\n camera: camera,\r\n minMaxWorldPos: mat.region,\r\n gridScale: this._gridScale,\r\n userData: this,\r\n frustumCulling: !this.castShadow,\r\n calcAABB(userData: unknown, minX, maxX, minZ, maxZ, outAABB) {\r\n const p = that.worldMatrix.transformPointAffine(Vector3.zero());\r\n outAABB.minPoint.setXYZ(minX, bv ? bv.minPoint.y : p.y - 9999, minZ);\r\n outAABB.maxPoint.setXYZ(maxX, bv ? bv.maxPoint.y : p.y + 9999, maxZ);\r\n }\r\n });\r\n let maxMipLevel = 0;\r\n for (const info of this._renderData) {\r\n const buffer = info.primitive.getVertexBuffer('texCoord1')!;\r\n buffer.bufferSubData(0, info.mipLevels, 0, info.numInstances);\r\n if (info.maxMiplevel > maxMipLevel) {\r\n maxMipLevel = info.maxMiplevel;\r\n }\r\n }\r\n const levelAABB = this._clipmap.calcLevelAABB(camera, mat.region, this._gridScale);\r\n const cameraPos = camera.getWorldPosition();\r\n const tmpBuffer = ClipmapTerrain._tmpBuffer;\r\n\r\n for (let i = 0; i <= maxMipLevel; i++) {\r\n if (i === 0) {\r\n tmpBuffer[i * 8 + 0] = cameraPos.x;\r\n tmpBuffer[i * 8 + 1] = cameraPos.z;\r\n tmpBuffer[i * 8 + 2] = cameraPos.x;\r\n tmpBuffer[i * 8 + 3] = cameraPos.z;\r\n } else {\r\n const prevAABB = levelAABB[i - 1];\r\n tmpBuffer[i * 8 + 0] = prevAABB.minPoint.x;\r\n tmpBuffer[i * 8 + 1] = prevAABB.minPoint.z;\r\n tmpBuffer[i * 8 + 2] = prevAABB.maxPoint.x;\r\n tmpBuffer[i * 8 + 3] = prevAABB.maxPoint.z;\r\n }\r\n const currentAABB = levelAABB[i];\r\n tmpBuffer[i * 8 + 4] = 1 / (currentAABB.minPoint.x - tmpBuffer[i * 8 + 0]);\r\n tmpBuffer[i * 8 + 5] = 1 / (currentAABB.minPoint.z - tmpBuffer[i * 8 + 1]);\r\n tmpBuffer[i * 8 + 6] = 1 / (currentAABB.maxPoint.x - tmpBuffer[i * 8 + 2]);\r\n tmpBuffer[i * 8 + 7] = 1 / (currentAABB.maxPoint.z - tmpBuffer[i * 8 + 3]);\r\n }\r\n mat.setLevelData(tmpBuffer, 8 * (maxMipLevel + 1));\r\n\r\n this.scene?.queuePerCameraUpdateNode(this);\r\n }\r\n /**\r\n * Updates the terrain material region based on current position and scale.\r\n * Should be called after changing position, scale, or height map.\r\n */\r\n updateRegion() {\r\n if (this.material) {\r\n const x = Math.abs(this.scale.x);\r\n const z = Math.abs(this.scale.z);\r\n const px = this.position.x + (this.parent?.worldMatrix.m03 ?? 0);\r\n const pz = this.position.z + (this.parent?.worldMatrix.m23 ?? 0);\r\n this._gridScale = Math.max(\r\n (x * this._sizeX) / this.material.heightMap.width,\r\n (z * this._sizeZ) / this.material.heightMap.height\r\n );\r\n this.material.update(new Vector4(px, pz, px + x * this._sizeX, pz + z * this._sizeZ), this.scale);\r\n this.grassRenderer.updateMaterial();\r\n }\r\n }\r\n /** {@inheritDoc Drawable.draw} */\r\n draw(ctx: DrawContext, renderQueue: Nullable<RenderQueue>) {\r\n const mat = this._material?.get();\r\n if (mat) {\r\n this.bind(ctx, renderQueue);\r\n mat.setClipmapGridInfo(this._gridScale, this.worldMatrix.m03, this.worldMatrix.m23);\r\n mat.apply(ctx);\r\n for (const info of this._renderData!) {\r\n mat.draw(info.primitive, ctx, info.numInstances);\r\n }\r\n if (\r\n ctx.renderPass!.type !== RENDER_PASS_TYPE_OBJECT_COLOR &&\r\n ctx.renderPass!.type !== RENDER_PASS_TYPE_SHADOWMAP\r\n ) {\r\n this.grassRenderer.draw(ctx);\r\n }\r\n }\r\n }\r\n /** @internal */\r\n private resizeHeightMap(sizeX: number, sizeZ: number) {\r\n if (this.material) {\r\n const oldHeightMap = this.material.heightMap;\r\n const device = getDevice();\r\n const maxTextureSize = device.getDeviceCaps().textureCaps.maxTextureSize;\r\n sizeX = Math.min(Math.max(sizeX, 1), maxTextureSize) >> 0;\r\n sizeZ = Math.min(Math.max(sizeZ, 1), maxTextureSize) >> 0;\r\n if (sizeX !== oldHeightMap.width || sizeZ !== oldHeightMap.height) {\r\n const newHeightMap = device.createTexture2D(\r\n device.type === 'webgl' ? 'rgba16f' : 'r16f',\r\n sizeX,\r\n sizeZ\r\n )!;\r\n const fb = device.createFrameBuffer([newHeightMap], null);\r\n ClipmapTerrain._copyBlitter.blit(oldHeightMap, fb, fetchSampler('clamp_linear_nomip'));\r\n fb.dispose();\r\n this.heightMap = newHeightMap;\r\n this.updateBoundingBox();\r\n }\r\n }\r\n }\r\n /*\r\n private calcNormalHeightMap(): Texture2D {\r\n const device = getDevice();\r\n if (!ClipmapTerrain._normalHeightMapProgram) {\r\n ClipmapTerrain._normalHeightMapProgram = device.buildRenderProgram({\r\n vertex(pb) {\r\n this.$inputs.pos = pb.vec2().attrib('position');\r\n this.$outputs.uv = pb.vec2();\r\n pb.main(function () {\r\n this.$builtins.position = pb.vec4(this.$inputs.pos, 0, 1);\r\n this.$outputs.uv = pb.add(pb.mul(this.$inputs.pos.xy, 0.5), pb.vec2(0.5));\r\n if (device.type === 'webgpu') {\r\n this.$builtins.position.y = pb.neg(this.$builtins.position.y);\r\n }\r\n });\r\n },\r\n fragment(pb) {\r\n this.heightMap = pb.tex2D().uniform(0);\r\n this.texelSize = pb.vec2().uniform(0);\r\n this.terrainScale = pb.vec3().uniform(0);\r\n this.$outputs.outColor = pb.vec4();\r\n pb.func('calcNormal', [pb.vec2('texCoord')], function () {\r\n this.$l.t = pb.textureSample(\r\n this.heightMap,\r\n pb.sub(this.texCoord, pb.vec2(0, this.texelSize.y))\r\n ).r;\r\n this.$l.l = pb.textureSample(\r\n this.heightMap,\r\n pb.sub(this.texCoord, pb.vec2(this.texelSize.x, 0))\r\n ).r;\r\n this.$l.r = pb.textureSample(\r\n this.heightMap,\r\n pb.add(this.texCoord, pb.vec2(this.texelSize.x, 0))\r\n ).r;\r\n this.$l.b = pb.textureSample(\r\n this.heightMap,\r\n pb.add(this.texCoord, pb.vec2(0, this.texelSize.y))\r\n ).r;\r\n this.$l.tx = pb.vec3(this.terrainScale.x, pb.mul(pb.sub(this.r, this.l), this.terrainScale.y), 0);\r\n this.$l.tz = pb.vec3(0, pb.mul(pb.sub(this.b, this.t), this.terrainScale.y), this.terrainScale.z);\r\n this.$l.normal = pb.normalize(pb.cross(this.tz, this.tx));\r\n this.$return(this.normal);\r\n });\r\n pb.main(function () {\r\n this.$l.normal = this.calcNormal(this.$inputs.uv);\r\n this.$outputs.outColor = pb.vec4(pb.add(pb.mul(this.normal, 0.5), pb.vec3(0.5)), 1);\r\n });\r\n }\r\n });\r\n }\r\n }\r\n */\r\n /**\r\n * Disposes of all resources used by this terrain.\r\n * Should be called when the terrain is no longer needed.\r\n */\r\n protected onDispose() {\r\n super.onDispose();\r\n this._clipmap?.dispose();\r\n this._material?.dispose();\r\n this._grassRenderer?.dispose();\r\n }\r\n}\r\n"],"names":["HeightMinMaxBlitter","CopyBlitter","filter","scope","type","srcTex","srcUV","srcLayer","sampleType","readTexel","xxxx","HeightBoundingGenerator","RenderMipmap","renderPixel","leftTop","rightTop","leftBottom","rightBottom","pb","$builder","$l","maxHeight","max","r","minHeight","min","g","vec4","ClipmapTerrain","applyMixins","GraphNode","mixinDrawable","_heightBoundingGenerator","_copyBlitter","_tmpBuffer","Float32Array","MAX_TERRAIN_MIPMAP_LEVELS","_pickTarget","_clipmap","_renderData","_gridScale","_material","_grassRenderer","_castShadow","_sizeX","_sizeZ","_heightMapAssetId","_splatMapAssetId","_grassAssetId","_minHeight","_maxHeight","_tmpTexture","scene","sizeX","sizeZ","clipMapTileSize","node","Clipmap","DRef","GrassRenderer","persistentId","ClipmapTerrainMaterial","createHeightMapTexture","updateRegion","queuePerCameraUpdateNode","grassRenderer","get","MAX_DETAIL_MAP_COUNT","heightMapAssetId","randomUUID","val","splatMapAssetId","grassAssetId","numDetailMaps","material","clone","Error","setSize","resizeHeightMap","castShadow","heightMap","splatMap","getSplatMap","wireframe","getPickTarget","getMorphData","getMorphInfo","getQueueType","QUEUE_OPAQUE","isUnlit","supportLighting","needSceneColor","needSceneDepth","getMaterial","getPrimitive","isClipmapTerrain","computeBoundingVolume","computeWorldBoundingVolume","p","worldMatrix","transformPointAffine","Vector3","zero","scale","y","BoundingBox","region","x","Math","z","w","worldRegion","Vector4","calculateLocalTransform","outMatrix","translation","_position","calculateWorldTransform","set","localMatrix","parent","m03","m13","m23","updateBoundingBox","device","getDevice","tmp","width","height","dispose","createTexture2D","name","tmpFB","createFrameBuffer","blit","fetchSampler","render","data","readPixels","mipLevelCount","then","invalidateWorldBoundingVolume","catch","_err","console","error","_onTransformChanged","invalidateLocal","updatePerCamera","camera","_elapsedInSeconds","_deltaInSeconds","mat","that","bv","getWorldBoundingVolume","toAABB","gather","minMaxWorldPos","gridScale","userData","frustumCulling","calcAABB","minX","maxX","minZ","maxZ","outAABB","minPoint","setXYZ","maxPoint","maxMipLevel","info","buffer","primitive","getVertexBuffer","bufferSubData","mipLevels","numInstances","maxMiplevel","levelAABB","calcLevelAABB","cameraPos","getWorldPosition","tmpBuffer","i","prevAABB","currentAABB","setLevelData","abs","px","position","pz","update","updateMaterial","draw","ctx","renderQueue","bind","setClipmapGridInfo","apply","renderPass","RENDER_PASS_TYPE_OBJECT_COLOR","RENDER_PASS_TYPE_SHADOWMAP","oldHeightMap","maxTextureSize","getDeviceCaps","textureCaps","newHeightMap","fb","onDispose"],"mappings":"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"}
1
+ {"version":3,"file":"terrain-cm.js","sources":["../../../src/scene/terrain-cm/terrain-cm.ts"],"sourcesContent":["import type { Immutable, Matrix4x4, Nullable } from '@zephyr3d/base';\r\nimport { Vector4, applyMixins, Vector3, DRef, randomUUID } from '@zephyr3d/base';\r\nimport type { PBInsideFunctionScope, PBShaderExp, Texture2D } from '@zephyr3d/device';\r\nimport type { Scene } from '../scene';\r\nimport { GraphNode } from '../graph_node';\r\nimport { mixinDrawable } from '../../render/drawable_mixin';\r\nimport type { Drawable, DrawContext, PickTarget, PrimitiveInstanceInfo, RenderQueue } from '../../render';\r\nimport { Clipmap } from '../../render';\r\nimport { ClipmapTerrainMaterial } from '../../material/terrain-cm';\r\nimport { BoundingBox } from '../../utility/bounding_volume';\r\nimport {\r\n MAX_TERRAIN_MIPMAP_LEVELS,\r\n QUEUE_OPAQUE,\r\n RENDER_PASS_TYPE_OBJECT_COLOR,\r\n RENDER_PASS_TYPE_SHADOWMAP\r\n} from '../../values';\r\nimport type { BlitType } from '../../blitter';\r\nimport { CopyBlitter } from '../../blitter';\r\nimport { fetchSampler } from '../../utility/misc';\r\nimport { RenderMipmap } from '../../utility/rendermipmap';\r\nimport { GrassRenderer } from './grass';\r\nimport type { Camera } from '../../camera';\r\nimport { getDevice } from '../../app/api';\r\n\r\nclass HeightMinMaxBlitter extends CopyBlitter {\r\n filter(\r\n scope: PBInsideFunctionScope,\r\n type: BlitType,\r\n srcTex: PBShaderExp,\r\n srcUV: PBShaderExp,\r\n srcLayer: PBShaderExp,\r\n sampleType: 'float' | 'int' | 'uint'\r\n ) {\r\n return this.readTexel(scope, type, srcTex, srcUV, srcLayer, sampleType).xxxx as PBShaderExp;\r\n }\r\n}\r\n\r\nclass HeightBoundingGenerator extends RenderMipmap {\r\n renderPixel(\r\n scope: PBInsideFunctionScope,\r\n leftTop: PBShaderExp,\r\n rightTop: PBShaderExp,\r\n leftBottom: PBShaderExp,\r\n rightBottom: PBShaderExp\r\n ) {\r\n const pb = scope.$builder;\r\n scope.$l.maxHeight = pb.max(pb.max(leftTop.r, rightTop.r), pb.max(leftBottom.r, rightBottom.r));\r\n scope.$l.minHeight = pb.min(pb.min(leftTop.g, rightTop.g), pb.min(leftBottom.g, rightBottom.g));\r\n return pb.vec4(scope.maxHeight, scope.minHeight, leftTop.r, 1);\r\n }\r\n}\r\n\r\n/**\r\n * ClipmapTerrain implements an efficient terrain rendering system using clipmaps.\r\n *\r\n * Clipmaps provide level-of-detail (LOD) rendering for large terrains by using\r\n * multiple nested grids at different resolutions. The terrain automatically\r\n * adjusts detail levels based on camera distance, providing high detail near\r\n * the camera and lower detail in the distance.\r\n *\r\n * Key features:\r\n * - Automatic LOD management based on camera position\r\n * - Support for height maps, splat maps, and detail textures\r\n * - Integrated grass rendering system\r\n *\r\n * @public\r\n */\r\nexport class ClipmapTerrain extends applyMixins(GraphNode, mixinDrawable) implements Drawable {\r\n private static readonly _heightBoundingGenerator = new HeightBoundingGenerator();\r\n private static readonly _copyBlitter = new HeightMinMaxBlitter();\r\n private static readonly _tmpBuffer = new Float32Array(MAX_TERRAIN_MIPMAP_LEVELS * 2 * 4);\r\n private readonly _pickTarget: PickTarget;\r\n private _clipmap: Clipmap;\r\n private _renderData: Nullable<PrimitiveInstanceInfo[]>;\r\n private _gridScale: number;\r\n private _material: DRef<ClipmapTerrainMaterial>;\r\n private _grassRenderer: DRef<GrassRenderer>;\r\n private _castShadow: boolean;\r\n private _sizeX: number;\r\n private _sizeZ: number;\r\n private _heightMapAssetId: string;\r\n private _splatMapAssetId: string;\r\n private _grassAssetId: string;\r\n private _minHeight: number;\r\n private _maxHeight: number;\r\n private _tmpTexture: DRef<Texture2D>;\r\n /**\r\n * Creates a new clipmap terrain instance.\r\n *\r\n * @param scene - Scene to add the terrain to\r\n * @param sizeX - Terrain width in world units (default: 256)\r\n * @param sizeZ - Terrain depth in world units (default: 256)\r\n * @param clipMapTileSize - Size of each clipmap tile in vertices (default: 64)\r\n * Larger values use more memory but reduce draw calls\r\n *\r\n */\r\n constructor(scene: Scene, sizeX = 256, sizeZ = 256, clipMapTileSize = 64) {\r\n super(scene);\r\n this._pickTarget = { node: this };\r\n this._clipmap = new Clipmap(clipMapTileSize, ['tex1_f32'], MAX_TERRAIN_MIPMAP_LEVELS);\r\n this._renderData = null;\r\n this._grassRenderer = new DRef(new GrassRenderer(this));\r\n this._gridScale = 1;\r\n this._castShadow = true;\r\n this._sizeX = sizeX;\r\n this._sizeZ = sizeZ;\r\n this._heightMapAssetId = `assets/.embedded.dir/${this.persistentId}-heightmap.bin`;\r\n this._grassAssetId = `assets/.embedded.dir/${this.persistentId}-grass.bin`;\r\n this._splatMapAssetId = `assets/.embedded.dir/${this.persistentId}-splatmap.bin`;\r\n this._minHeight = 0;\r\n this._maxHeight = 0;\r\n this._material = new DRef(\r\n new ClipmapTerrainMaterial(this.createHeightMapTexture(this._sizeX, this._sizeZ))\r\n );\r\n this._tmpTexture = new DRef();\r\n this.updateRegion();\r\n scene.queuePerCameraUpdateNode(this);\r\n }\r\n /**\r\n * Gets the integrated grass renderer for this terrain.\r\n * The grass renderer handles vegetation rendering on the terrain surface.\r\n *\r\n * @returns The grass renderer instance\r\n */\r\n get grassRenderer() {\r\n return this._grassRenderer.get()!;\r\n }\r\n /**\r\n * Gets the maximum number of detail maps supported by the terrain material.\r\n * Detail maps provide surface texturing (grass, rock, sand, etc.).\r\n *\r\n * @returns Maximum number of detail maps\r\n */\r\n get MAX_DETAIL_MAP_COUNT() {\r\n return ClipmapTerrainMaterial.MAX_DETAIL_MAP_COUNT;\r\n }\r\n /**\r\n * Gets the asset ID for the height map texture.\r\n * Generates a random UUID if not previously set.\r\n *\r\n * @returns Height map asset ID\r\n * @internal\r\n */\r\n get heightMapAssetId() {\r\n if (!this._heightMapAssetId) {\r\n this._heightMapAssetId = randomUUID();\r\n }\r\n return this._heightMapAssetId;\r\n }\r\n /** @internal */\r\n set heightMapAssetId(val: string) {\r\n this._heightMapAssetId = val;\r\n }\r\n /**\r\n * Gets the asset ID for the splat map texture.\r\n * Generates a random UUID if not previously set.\r\n *\r\n * @returns Splat map asset ID\r\n * @internal\r\n */\r\n get splatMapAssetId() {\r\n if (!this._splatMapAssetId) {\r\n this._splatMapAssetId = randomUUID();\r\n }\r\n return this._splatMapAssetId;\r\n }\r\n /** @internal */\r\n set splatMapAssetId(val: string) {\r\n this._splatMapAssetId = val;\r\n }\r\n /**\r\n * Gets the asset ID for grass configuration.\r\n * Generates a random UUID if not previously set.\r\n *\r\n * @returns Grass asset ID\r\n * @internal\r\n */\r\n get grassAssetId() {\r\n if (!this._grassAssetId) {\r\n this._grassAssetId = randomUUID();\r\n }\r\n return this._grassAssetId;\r\n }\r\n /** @internal */\r\n set grassAssetId(val: string) {\r\n this._grassAssetId = val;\r\n }\r\n /**\r\n * The current number of active detail maps.\r\n * Detail maps define different surface materials (grass, rock, etc.).\r\n *\r\n * @returns Number of active detail maps\r\n */\r\n get numDetailMaps() {\r\n return this.material?.numDetailMaps ?? 0;\r\n }\r\n set numDetailMaps(val) {\r\n if (this.material) {\r\n this.material.numDetailMaps = val;\r\n }\r\n }\r\n /** {@inheritDoc SceneNode.clone} */\r\n async clone(): Promise<this> {\r\n throw new Error('Cloning clipmap terrain not implemented');\r\n }\r\n /**\r\n * Sets the terrain size.\r\n * Triggers height map resize if dimensions change.\r\n *\r\n * @param sizeX - New width\r\n * @param sizeZ - New depth\r\n */\r\n setSize(sizeX: number, sizeZ: number) {\r\n if (sizeX !== this._sizeX || sizeZ !== this._sizeZ) {\r\n this._sizeX = sizeX;\r\n this._sizeZ = sizeZ;\r\n this.resizeHeightMap(this._sizeX, this._sizeZ);\r\n }\r\n }\r\n /** Wether the mesh node casts shadows */\r\n get castShadow() {\r\n return this._castShadow;\r\n }\r\n set castShadow(val) {\r\n this._castShadow = !!val;\r\n }\r\n /** The terrain width. */\r\n get sizeX() {\r\n return this._sizeX;\r\n }\r\n set sizeX(val) {\r\n if (val !== this._sizeX) {\r\n this._sizeX = val;\r\n this.resizeHeightMap(this._sizeX, this._sizeZ);\r\n }\r\n }\r\n /** The terrain depth. */\r\n get sizeZ() {\r\n return this._sizeZ;\r\n }\r\n set sizeZ(val) {\r\n if (val !== this._sizeZ) {\r\n this._sizeZ = val;\r\n this.resizeHeightMap(this._sizeX, this._sizeZ);\r\n }\r\n }\r\n /** The current height map texture. */\r\n get heightMap() {\r\n return this.material?.heightMap ?? null;\r\n }\r\n set heightMap(val) {\r\n if (this.material && val) {\r\n this.material.heightMap = val;\r\n this.updateRegion();\r\n }\r\n }\r\n /** The splat map texture */\r\n get splatMap() {\r\n return this.material?.getSplatMap() ?? null;\r\n }\r\n /** Material instance of the terrain */\r\n get material() {\r\n return this._material?.get() ?? null;\r\n }\r\n /** whether wireframe rendering is enabled */\r\n get wireframe() {\r\n return this._clipmap.wireframe;\r\n }\r\n set wireframe(val) {\r\n this._clipmap.wireframe = val;\r\n }\r\n /**\r\n * {@inheritDoc Drawable.getPickTarget }\r\n */\r\n getPickTarget() {\r\n return this._pickTarget;\r\n }\r\n /**\r\n * {@inheritDoc Drawable.getMorphData}\r\n */\r\n getMorphData() {\r\n return null;\r\n }\r\n /**\r\n * {@inheritDoc Drawable.getMorphInfo}\r\n */\r\n getMorphInfo() {\r\n return null;\r\n }\r\n /**\r\n * {@inheritDoc Drawable.getQueueType}\r\n */\r\n getQueueType() {\r\n return this.material?.getQueueType() ?? QUEUE_OPAQUE;\r\n }\r\n /**\r\n * {@inheritDoc Drawable.isUnlit}\r\n */\r\n isUnlit() {\r\n return this.material ? !this.material.supportLighting() : false;\r\n }\r\n /**\r\n * {@inheritDoc Drawable.needSceneColor}\r\n */\r\n needSceneColor() {\r\n return this.material?.needSceneColor() ?? false;\r\n }\r\n /**\r\n * {@inheritDoc Drawable.needSceneDepth}\r\n */\r\n needSceneDepth() {\r\n return this.material?.needSceneDepth() ?? false;\r\n }\r\n /**\r\n * {@inheritDoc Drawable.getMaterial}\r\n */\r\n getMaterial() {\r\n return this._material.get();\r\n }\r\n /**\r\n * {@inheritDoc Drawable.getPrimitive}\r\n */\r\n getPrimitive() {\r\n return null;\r\n }\r\n /**\r\n * {@inheritDoc SceneNode.isClipmapTerrain}\r\n */\r\n isClipmapTerrain(): this is ClipmapTerrain {\r\n return true;\r\n }\r\n /**\r\n * {@inheritDoc SceneNode.computeBoundingVolume}\r\n */\r\n computeBoundingVolume() {\r\n return null;\r\n }\r\n /**\r\n * {@inheritDoc SceneNode.computeWorldBoundingVolume}\r\n */\r\n computeWorldBoundingVolume() {\r\n if (this.material) {\r\n const p = this.worldMatrix.transformPointAffine(Vector3.zero());\r\n const minHeight = this._minHeight * this.scale.y;\r\n const maxHeight = this._maxHeight * this.scale.y;\r\n return new BoundingBox(\r\n new Vector3(this.material.region.x, p.y + Math.min(minHeight, maxHeight), this.material.region.y),\r\n new Vector3(this.material.region.z, p.y + Math.max(minHeight, maxHeight), this.material.region.w)\r\n );\r\n } else {\r\n return null;\r\n }\r\n }\r\n /**\r\n * the actual world-space region covered by this terrain (After applying world transform).\r\n */\r\n get worldRegion(): Immutable<Vector4> {\r\n return this.material?.region ?? Vector4.zero();\r\n }\r\n /**\r\n * Calculates the local transformation matrix.\r\n * For terrains, this only includes translation.\r\n *\r\n * @param outMatrix - Output matrix to store the result\r\n */\r\n calculateLocalTransform(outMatrix: Matrix4x4) {\r\n outMatrix.translation(this._position);\r\n }\r\n /**\r\n * Calculates the world transformation matrix.\r\n * Terrains inherit only translation from parent nodes.\r\n *\r\n * @param outMatrix - Output matrix to store the result\r\n */\r\n calculateWorldTransform(outMatrix: Matrix4x4) {\r\n outMatrix.set(this.localMatrix);\r\n if (this.parent) {\r\n outMatrix.m03 += this.parent.worldMatrix.m03;\r\n outMatrix.m13 += this.parent.worldMatrix.m13;\r\n outMatrix.m23 += this.parent.worldMatrix.m23;\r\n }\r\n }\r\n /**\r\n * Updates the terrain's bounding box by analyzing the height map.\r\n * This is an asynchronous operation that reads back GPU data.\r\n *\r\n * @param tmpTexture - Optional temporary texture to reuse (optimization)\r\n *\r\n * @example\r\n * ```typescript\r\n * // Update bounding box after changing height map\r\n * terrain.heightMap = newHeightMap;\r\n * terrain.updateBoundingBox();\r\n * ```\r\n */\r\n updateBoundingBox() {\r\n const heightMap = this.heightMap;\r\n if (!heightMap) {\r\n return;\r\n }\r\n const device = getDevice();\r\n let tmp = this._tmpTexture.get();\r\n if (tmp && (tmp.width !== heightMap.width || tmp.height !== heightMap.height)) {\r\n this._tmpTexture.dispose();\r\n }\r\n if (!this._tmpTexture.get()) {\r\n tmp = getDevice().createTexture2D(\r\n device.type === 'webgl' ? 'rgba32f' : 'rg32f',\r\n heightMap.width,\r\n heightMap.height\r\n )!;\r\n tmp.name = 'TerrainBoundingBoxTexture';\r\n this._tmpTexture.set(tmp);\r\n }\r\n const tmpFB = device.createFrameBuffer([tmp!], null);\r\n ClipmapTerrain._copyBlitter.blit(heightMap, tmpFB, fetchSampler('clamp_nearest_nomip'));\r\n tmpFB.dispose();\r\n ClipmapTerrain._heightBoundingGenerator.render(tmp!);\r\n const data = new Float32Array(4);\r\n tmp!\r\n .readPixels(0, 0, 1, 1, 0, tmp!.mipLevelCount - 1, data)\r\n .then(() => {\r\n this._minHeight = data[0];\r\n this._maxHeight = data[1];\r\n this.invalidateWorldBoundingVolume(false);\r\n })\r\n .catch((_err) => {\r\n console.error('Read pixels failed');\r\n });\r\n }\r\n /** @internal */\r\n createHeightMapTexture(width: number, height: number) {\r\n return getDevice().createTexture2D(getDevice().type === 'webgl' ? 'rgba16f' : 'r16f', width, height)!;\r\n }\r\n /** @internal */\r\n protected _onTransformChanged(invalidateLocal: boolean) {\r\n super._onTransformChanged(invalidateLocal);\r\n this.updateRegion();\r\n }\r\n /** {@inheritDoc SceneNode.updatePerCamera} */\r\n updatePerCamera(camera: Camera, _elapsedInSeconds: number, _deltaInSeconds: number) {\r\n const mat = this._material.get();\r\n if (!mat) {\r\n return;\r\n }\r\n const that = this;\r\n const bv = this.getWorldBoundingVolume()!.toAABB();\r\n this._renderData = this._clipmap.gather({\r\n camera: camera,\r\n minMaxWorldPos: mat.region,\r\n gridScale: this._gridScale,\r\n userData: this,\r\n frustumCulling: !this.castShadow,\r\n calcAABB(userData: unknown, minX, maxX, minZ, maxZ, outAABB) {\r\n const p = that.worldMatrix.transformPointAffine(Vector3.zero());\r\n outAABB.minPoint.setXYZ(minX, bv ? bv.minPoint.y : p.y - 9999, minZ);\r\n outAABB.maxPoint.setXYZ(maxX, bv ? bv.maxPoint.y : p.y + 9999, maxZ);\r\n }\r\n });\r\n let maxMipLevel = 0;\r\n for (const info of this._renderData) {\r\n const buffer = info.primitive.getVertexBuffer('texCoord1')!;\r\n buffer.bufferSubData(0, info.mipLevels, 0, info.numInstances);\r\n if (info.maxMiplevel > maxMipLevel) {\r\n maxMipLevel = info.maxMiplevel;\r\n }\r\n }\r\n const levelAABB = this._clipmap.calcLevelAABB(camera, mat.region, this._gridScale);\r\n const cameraPos = camera.getWorldPosition();\r\n const tmpBuffer = ClipmapTerrain._tmpBuffer;\r\n\r\n for (let i = 0; i <= maxMipLevel; i++) {\r\n if (i === 0) {\r\n tmpBuffer[i * 8 + 0] = cameraPos.x;\r\n tmpBuffer[i * 8 + 1] = cameraPos.z;\r\n tmpBuffer[i * 8 + 2] = cameraPos.x;\r\n tmpBuffer[i * 8 + 3] = cameraPos.z;\r\n } else {\r\n const prevAABB = levelAABB[i - 1];\r\n tmpBuffer[i * 8 + 0] = prevAABB.minPoint.x;\r\n tmpBuffer[i * 8 + 1] = prevAABB.minPoint.z;\r\n tmpBuffer[i * 8 + 2] = prevAABB.maxPoint.x;\r\n tmpBuffer[i * 8 + 3] = prevAABB.maxPoint.z;\r\n }\r\n const currentAABB = levelAABB[i];\r\n tmpBuffer[i * 8 + 4] = 1 / (currentAABB.minPoint.x - tmpBuffer[i * 8 + 0]);\r\n tmpBuffer[i * 8 + 5] = 1 / (currentAABB.minPoint.z - tmpBuffer[i * 8 + 1]);\r\n tmpBuffer[i * 8 + 6] = 1 / (currentAABB.maxPoint.x - tmpBuffer[i * 8 + 2]);\r\n tmpBuffer[i * 8 + 7] = 1 / (currentAABB.maxPoint.z - tmpBuffer[i * 8 + 3]);\r\n }\r\n mat.setLevelData(tmpBuffer, 8 * (maxMipLevel + 1));\r\n\r\n this.scene?.queuePerCameraUpdateNode(this);\r\n }\r\n /**\r\n * Updates the terrain material region based on current position and scale.\r\n * Should be called after changing position, scale, or height map.\r\n */\r\n updateRegion() {\r\n if (this.material) {\r\n const x = Math.abs(this.scale.x);\r\n const z = Math.abs(this.scale.z);\r\n const px = this.position.x + (this.parent?.worldMatrix.m03 ?? 0);\r\n const pz = this.position.z + (this.parent?.worldMatrix.m23 ?? 0);\r\n this._gridScale = Math.max(\r\n (x * this._sizeX) / this.material.heightMap.width,\r\n (z * this._sizeZ) / this.material.heightMap.height\r\n );\r\n this.material.update(new Vector4(px, pz, px + x * this._sizeX, pz + z * this._sizeZ), this.scale);\r\n this.grassRenderer.updateMaterial();\r\n }\r\n }\r\n /** {@inheritDoc Drawable.draw} */\r\n draw(ctx: DrawContext, renderQueue: Nullable<RenderQueue>) {\r\n const mat = this._material?.get();\r\n if (mat) {\r\n this.bind(ctx, renderQueue);\r\n mat.setClipmapGridInfo(this._gridScale, this.worldMatrix.m03, this.worldMatrix.m23);\r\n mat.apply(ctx);\r\n for (const info of this._renderData!) {\r\n mat.draw(info.primitive, ctx, info.numInstances);\r\n }\r\n if (\r\n ctx.renderPass!.type !== RENDER_PASS_TYPE_OBJECT_COLOR &&\r\n ctx.renderPass!.type !== RENDER_PASS_TYPE_SHADOWMAP\r\n ) {\r\n this.grassRenderer.draw(ctx);\r\n }\r\n }\r\n }\r\n /** @internal */\r\n private resizeHeightMap(sizeX: number, sizeZ: number) {\r\n if (this.material) {\r\n const oldHeightMap = this.material.heightMap;\r\n const device = getDevice();\r\n const maxTextureSize = device.getDeviceCaps().textureCaps.maxTextureSize;\r\n sizeX = Math.min(Math.max(sizeX, 1), maxTextureSize) >> 0;\r\n sizeZ = Math.min(Math.max(sizeZ, 1), maxTextureSize) >> 0;\r\n if (sizeX !== oldHeightMap.width || sizeZ !== oldHeightMap.height) {\r\n const newHeightMap = device.createTexture2D(\r\n device.type === 'webgl' ? 'rgba16f' : 'r16f',\r\n sizeX,\r\n sizeZ\r\n )!;\r\n const fb = device.createFrameBuffer([newHeightMap], null);\r\n ClipmapTerrain._copyBlitter.blit(oldHeightMap, fb, fetchSampler('clamp_linear_nomip'));\r\n fb.dispose();\r\n this.heightMap = newHeightMap;\r\n this.updateBoundingBox();\r\n }\r\n }\r\n }\r\n /*\r\n private calcNormalHeightMap(): Texture2D {\r\n const device = getDevice();\r\n if (!ClipmapTerrain._normalHeightMapProgram) {\r\n ClipmapTerrain._normalHeightMapProgram = device.buildRenderProgram({\r\n vertex(pb) {\r\n this.$inputs.pos = pb.vec2().attrib('position');\r\n this.$outputs.uv = pb.vec2();\r\n pb.main(function () {\r\n this.$builtins.position = pb.vec4(this.$inputs.pos, 0, 1);\r\n this.$outputs.uv = pb.add(pb.mul(this.$inputs.pos.xy, 0.5), pb.vec2(0.5));\r\n if (device.type === 'webgpu') {\r\n this.$builtins.position.y = pb.neg(this.$builtins.position.y);\r\n }\r\n });\r\n },\r\n fragment(pb) {\r\n this.heightMap = pb.tex2D().uniform(0);\r\n this.texelSize = pb.vec2().uniform(0);\r\n this.terrainScale = pb.vec3().uniform(0);\r\n this.$outputs.outColor = pb.vec4();\r\n pb.func('calcNormal', [pb.vec2('texCoord')], function () {\r\n this.$l.t = pb.textureSample(\r\n this.heightMap,\r\n pb.sub(this.texCoord, pb.vec2(0, this.texelSize.y))\r\n ).r;\r\n this.$l.l = pb.textureSample(\r\n this.heightMap,\r\n pb.sub(this.texCoord, pb.vec2(this.texelSize.x, 0))\r\n ).r;\r\n this.$l.r = pb.textureSample(\r\n this.heightMap,\r\n pb.add(this.texCoord, pb.vec2(this.texelSize.x, 0))\r\n ).r;\r\n this.$l.b = pb.textureSample(\r\n this.heightMap,\r\n pb.add(this.texCoord, pb.vec2(0, this.texelSize.y))\r\n ).r;\r\n this.$l.tx = pb.vec3(this.terrainScale.x, pb.mul(pb.sub(this.r, this.l), this.terrainScale.y), 0);\r\n this.$l.tz = pb.vec3(0, pb.mul(pb.sub(this.b, this.t), this.terrainScale.y), this.terrainScale.z);\r\n this.$l.normal = pb.normalize(pb.cross(this.tz, this.tx));\r\n this.$return(this.normal);\r\n });\r\n pb.main(function () {\r\n this.$l.normal = this.calcNormal(this.$inputs.uv);\r\n this.$outputs.outColor = pb.vec4(pb.add(pb.mul(this.normal, 0.5), pb.vec3(0.5)), 1);\r\n });\r\n }\r\n });\r\n }\r\n }\r\n */\r\n /**\r\n * Disposes of all resources used by this terrain.\r\n * Should be called when the terrain is no longer needed.\r\n */\r\n protected onDispose() {\r\n super.onDispose();\r\n this._clipmap?.dispose();\r\n this._material?.dispose();\r\n this._grassRenderer?.dispose();\r\n }\r\n}\r\n"],"names":["HeightMinMaxBlitter","CopyBlitter","filter","scope","type","srcTex","srcUV","srcLayer","sampleType","readTexel","xxxx","HeightBoundingGenerator","RenderMipmap","renderPixel","leftTop","rightTop","leftBottom","rightBottom","pb","$builder","$l","maxHeight","max","r","minHeight","min","g","vec4","ClipmapTerrain","applyMixins","GraphNode","mixinDrawable","_heightBoundingGenerator","_copyBlitter","_tmpBuffer","Float32Array","MAX_TERRAIN_MIPMAP_LEVELS","_pickTarget","_clipmap","_renderData","_gridScale","_material","_grassRenderer","_castShadow","_sizeX","_sizeZ","_heightMapAssetId","_splatMapAssetId","_grassAssetId","_minHeight","_maxHeight","_tmpTexture","scene","sizeX","sizeZ","clipMapTileSize","node","Clipmap","DRef","GrassRenderer","persistentId","ClipmapTerrainMaterial","createHeightMapTexture","updateRegion","queuePerCameraUpdateNode","grassRenderer","get","MAX_DETAIL_MAP_COUNT","heightMapAssetId","randomUUID","val","splatMapAssetId","grassAssetId","numDetailMaps","material","clone","Error","setSize","resizeHeightMap","castShadow","heightMap","splatMap","getSplatMap","wireframe","getPickTarget","getMorphData","getMorphInfo","getQueueType","QUEUE_OPAQUE","isUnlit","supportLighting","needSceneColor","needSceneDepth","getMaterial","getPrimitive","isClipmapTerrain","computeBoundingVolume","computeWorldBoundingVolume","p","worldMatrix","transformPointAffine","Vector3","zero","scale","y","BoundingBox","region","x","Math","z","w","worldRegion","Vector4","calculateLocalTransform","outMatrix","translation","_position","calculateWorldTransform","set","localMatrix","parent","m03","m13","m23","updateBoundingBox","device","getDevice","tmp","width","height","dispose","createTexture2D","name","tmpFB","createFrameBuffer","blit","fetchSampler","render","data","readPixels","mipLevelCount","then","invalidateWorldBoundingVolume","catch","_err","console","error","_onTransformChanged","invalidateLocal","updatePerCamera","camera","_elapsedInSeconds","_deltaInSeconds","mat","that","bv","getWorldBoundingVolume","toAABB","gather","minMaxWorldPos","gridScale","userData","frustumCulling","calcAABB","minX","maxX","minZ","maxZ","outAABB","minPoint","setXYZ","maxPoint","maxMipLevel","info","buffer","primitive","getVertexBuffer","bufferSubData","mipLevels","numInstances","maxMiplevel","levelAABB","calcLevelAABB","cameraPos","getWorldPosition","tmpBuffer","i","prevAABB","currentAABB","setLevelData","abs","px","position","pz","update","updateMaterial","draw","ctx","renderQueue","bind","setClipmapGridInfo","apply","renderPass","RENDER_PASS_TYPE_OBJECT_COLOR","RENDER_PASS_TYPE_SHADOWMAP","oldHeightMap","maxTextureSize","getDeviceCaps","textureCaps","newHeightMap","fb","onDispose"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAwBA,MAAMA,mBAA4BC,SAAAA,WAAAA,CAAAA;IAChCC,MACEC,CAAAA,KAA4B,EAC5BC,IAAc,EACdC,MAAmB,EACnBC,KAAkB,EAClBC,QAAqB,EACrBC,UAAoC,EACpC;QACA,OAAO,IAAI,CAACC,SAAS,CAACN,KAAAA,EAAOC,MAAMC,MAAQC,EAAAA,KAAAA,EAAOC,QAAUC,EAAAA,UAAAA,CAAAA,CAAYE,IAAI;AAC9E;AACF;AAEA,MAAMC,uBAAgCC,SAAAA,YAAAA,CAAAA;IACpCC,WACEV,CAAAA,KAA4B,EAC5BW,OAAoB,EACpBC,QAAqB,EACrBC,UAAuB,EACvBC,WAAwB,EACxB;QACA,MAAMC,EAAAA,GAAKf,MAAMgB,QAAQ;QACzBhB,KAAMiB,CAAAA,EAAE,CAACC,SAAS,GAAGH,GAAGI,GAAG,CAACJ,EAAGI,CAAAA,GAAG,CAACR,OAAAA,CAAQS,CAAC,EAAER,QAAAA,CAASQ,CAAC,CAAA,EAAGL,EAAGI,CAAAA,GAAG,CAACN,UAAWO,CAAAA,CAAC,EAAEN,WAAAA,CAAYM,CAAC,CAAA,CAAA;QAC7FpB,KAAMiB,CAAAA,EAAE,CAACI,SAAS,GAAGN,GAAGO,GAAG,CAACP,EAAGO,CAAAA,GAAG,CAACX,OAAAA,CAAQY,CAAC,EAAEX,QAAAA,CAASW,CAAC,CAAA,EAAGR,EAAGO,CAAAA,GAAG,CAACT,UAAWU,CAAAA,CAAC,EAAET,WAAAA,CAAYS,CAAC,CAAA,CAAA;QAC7F,OAAOR,EAAAA,CAAGS,IAAI,CAACxB,KAAMkB,CAAAA,SAAS,EAAElB,KAAAA,CAAMqB,SAAS,EAAEV,OAAQS,CAAAA,CAAC,EAAE,CAAA,CAAA;AAC9D;AACF;AAEA;;;;;;;;;;;;;;AAcC,IACM,MAAMK,cAAuBC,SAAAA,WAAAA,CAAYC,SAAWC,EAAAA,aAAAA,CAAAA,CAAAA;IACzD,OAAwBC,wBAAAA,GAA2B,IAAIrB,uBAA0B,EAAA;IACjF,OAAwBsB,YAAAA,GAAe,IAAIjC,mBAAsB,EAAA;AACjE,IAAA,OAAwBkC,UAAa,GAAA,IAAIC,YAAaC,CAAAA,yBAAAA,GAA4B,IAAI,CAAG,CAAA;IACxEC,WAAwB;IACjCC,QAAkB;IAClBC,WAA+C;IAC/CC,UAAmB;IACnBC,SAAwC;IACxCC,cAAoC;IACpCC,WAAqB;IACrBC,MAAe;IACfC,MAAe;IACfC,iBAA0B;IAC1BC,gBAAyB;IACzBC,aAAsB;IACtBC,UAAmB;IACnBC,UAAmB;IACnBC,WAA6B;AACrC;;;;;;;;;MAUA,WAAA,CAAYC,KAAY,EAAEC,KAAQ,GAAA,GAAG,EAAEC,KAAAA,GAAQ,GAAG,EAAEC,eAAkB,GAAA,EAAE,CAAE;AACxE,QAAA,KAAK,CAACH,KAAAA,CAAAA;QACN,IAAI,CAACf,WAAW,GAAG;AAAEmB,YAAAA,IAAAA,EAAM;AAAK,SAAA;AAChC,QAAA,IAAI,CAAClB,QAAQ,GAAG,IAAImB,QAAQF,eAAiB,EAAA;AAAC,YAAA;SAAW,EAAEnB,yBAAAA,CAAAA;QAC3D,IAAI,CAACG,WAAW,GAAG,IAAA;AACnB,QAAA,IAAI,CAACG,cAAc,GAAG,IAAIgB,IAAK,CAAA,IAAIC,cAAc,IAAI,CAAA,CAAA;QACrD,IAAI,CAACnB,UAAU,GAAG,CAAA;QAClB,IAAI,CAACG,WAAW,GAAG,IAAA;QACnB,IAAI,CAACC,MAAM,GAAGS,KAAAA;QACd,IAAI,CAACR,MAAM,GAAGS,KAAAA;QACd,IAAI,CAACR,iBAAiB,GAAG,CAAC,qBAAqB,EAAE,IAAI,CAACc,YAAY,CAAC,cAAc,CAAC;QAClF,IAAI,CAACZ,aAAa,GAAG,CAAC,qBAAqB,EAAE,IAAI,CAACY,YAAY,CAAC,UAAU,CAAC;QAC1E,IAAI,CAACb,gBAAgB,GAAG,CAAC,qBAAqB,EAAE,IAAI,CAACa,YAAY,CAAC,aAAa,CAAC;QAChF,IAAI,CAACX,UAAU,GAAG,CAAA;QAClB,IAAI,CAACC,UAAU,GAAG,CAAA;AAClB,QAAA,IAAI,CAACT,SAAS,GAAG,IAAIiB,IAAAA,CACnB,IAAIG,sBAAuB,CAAA,IAAI,CAACC,sBAAsB,CAAC,IAAI,CAAClB,MAAM,EAAE,IAAI,CAACC,MAAM,CAAA,CAAA,CAAA;QAEjF,IAAI,CAACM,WAAW,GAAG,IAAIO,IAAAA,EAAAA;AACvB,QAAA,IAAI,CAACK,YAAY,EAAA;QACjBX,KAAMY,CAAAA,wBAAwB,CAAC,IAAI,CAAA;AACrC;AACA;;;;;AAKC,MACD,IAAIC,aAAgB,GAAA;AAClB,QAAA,OAAO,IAAI,CAACvB,cAAc,CAACwB,GAAG,EAAA;AAChC;AACA;;;;;AAKC,MACD,IAAIC,oBAAuB,GAAA;AACzB,QAAA,OAAON,uBAAuBM,oBAAoB;AACpD;AACA;;;;;;AAMC,MACD,IAAIC,gBAAmB,GAAA;AACrB,QAAA,IAAI,CAAC,IAAI,CAACtB,iBAAiB,EAAE;YAC3B,IAAI,CAACA,iBAAiB,GAAGuB,UAAAA,EAAAA;AAC3B;QACA,OAAO,IAAI,CAACvB,iBAAiB;AAC/B;AACA,qBACA,IAAIsB,gBAAiBE,CAAAA,GAAW,EAAE;QAChC,IAAI,CAACxB,iBAAiB,GAAGwB,GAAAA;AAC3B;AACA;;;;;;AAMC,MACD,IAAIC,eAAkB,GAAA;AACpB,QAAA,IAAI,CAAC,IAAI,CAACxB,gBAAgB,EAAE;YAC1B,IAAI,CAACA,gBAAgB,GAAGsB,UAAAA,EAAAA;AAC1B;QACA,OAAO,IAAI,CAACtB,gBAAgB;AAC9B;AACA,qBACA,IAAIwB,eAAgBD,CAAAA,GAAW,EAAE;QAC/B,IAAI,CAACvB,gBAAgB,GAAGuB,GAAAA;AAC1B;AACA;;;;;;AAMC,MACD,IAAIE,YAAe,GAAA;AACjB,QAAA,IAAI,CAAC,IAAI,CAACxB,aAAa,EAAE;YACvB,IAAI,CAACA,aAAa,GAAGqB,UAAAA,EAAAA;AACvB;QACA,OAAO,IAAI,CAACrB,aAAa;AAC3B;AACA,qBACA,IAAIwB,YAAaF,CAAAA,GAAW,EAAE;QAC5B,IAAI,CAACtB,aAAa,GAAGsB,GAAAA;AACvB;AACA;;;;;AAKC,MACD,IAAIG,aAAgB,GAAA;AAClB,QAAA,OAAO,IAAI,CAACC,QAAQ,EAAED,aAAiB,IAAA,CAAA;AACzC;IACA,IAAIA,aAAAA,CAAcH,GAAG,EAAE;QACrB,IAAI,IAAI,CAACI,QAAQ,EAAE;AACjB,YAAA,IAAI,CAACA,QAAQ,CAACD,aAAa,GAAGH,GAAAA;AAChC;AACF;yCAEA,MAAMK,KAAuB,GAAA;AAC3B,QAAA,MAAM,IAAIC,KAAM,CAAA,yCAAA,CAAA;AAClB;AACA;;;;;;AAMC,MACDC,OAAQxB,CAAAA,KAAa,EAAEC,KAAa,EAAE;QACpC,IAAID,KAAAA,KAAU,IAAI,CAACT,MAAM,IAAIU,KAAU,KAAA,IAAI,CAACT,MAAM,EAAE;YAClD,IAAI,CAACD,MAAM,GAAGS,KAAAA;YACd,IAAI,CAACR,MAAM,GAAGS,KAAAA;YACd,IAAI,CAACwB,eAAe,CAAC,IAAI,CAAClC,MAAM,EAAE,IAAI,CAACC,MAAM,CAAA;AAC/C;AACF;8CAEA,IAAIkC,UAAa,GAAA;QACf,OAAO,IAAI,CAACpC,WAAW;AACzB;IACA,IAAIoC,UAAAA,CAAWT,GAAG,EAAE;AAClB,QAAA,IAAI,CAAC3B,WAAW,GAAG,CAAC,CAAC2B,GAAAA;AACvB;8BAEA,IAAIjB,KAAQ,GAAA;QACV,OAAO,IAAI,CAACT,MAAM;AACpB;IACA,IAAIS,KAAAA,CAAMiB,GAAG,EAAE;AACb,QAAA,IAAIA,GAAQ,KAAA,IAAI,CAAC1B,MAAM,EAAE;YACvB,IAAI,CAACA,MAAM,GAAG0B,GAAAA;YACd,IAAI,CAACQ,eAAe,CAAC,IAAI,CAAClC,MAAM,EAAE,IAAI,CAACC,MAAM,CAAA;AAC/C;AACF;8BAEA,IAAIS,KAAQ,GAAA;QACV,OAAO,IAAI,CAACT,MAAM;AACpB;IACA,IAAIS,KAAAA,CAAMgB,GAAG,EAAE;AACb,QAAA,IAAIA,GAAQ,KAAA,IAAI,CAACzB,MAAM,EAAE;YACvB,IAAI,CAACA,MAAM,GAAGyB,GAAAA;YACd,IAAI,CAACQ,eAAe,CAAC,IAAI,CAAClC,MAAM,EAAE,IAAI,CAACC,MAAM,CAAA;AAC/C;AACF;2CAEA,IAAImC,SAAY,GAAA;AACd,QAAA,OAAO,IAAI,CAACN,QAAQ,EAAEM,SAAa,IAAA,IAAA;AACrC;IACA,IAAIA,SAAAA,CAAUV,GAAG,EAAE;AACjB,QAAA,IAAI,IAAI,CAACI,QAAQ,IAAIJ,GAAK,EAAA;AACxB,YAAA,IAAI,CAACI,QAAQ,CAACM,SAAS,GAAGV,GAAAA;AAC1B,YAAA,IAAI,CAACP,YAAY,EAAA;AACnB;AACF;iCAEA,IAAIkB,QAAW,GAAA;AACb,QAAA,OAAO,IAAI,CAACP,QAAQ,EAAEQ,WAAiB,EAAA,IAAA,IAAA;AACzC;4CAEA,IAAIR,QAAW,GAAA;AACb,QAAA,OAAO,IAAI,CAACjC,SAAS,EAAEyB,GAAS,EAAA,IAAA,IAAA;AAClC;kDAEA,IAAIiB,SAAY,GAAA;AACd,QAAA,OAAO,IAAI,CAAC7C,QAAQ,CAAC6C,SAAS;AAChC;IACA,IAAIA,SAAAA,CAAUb,GAAG,EAAE;AACjB,QAAA,IAAI,CAAChC,QAAQ,CAAC6C,SAAS,GAAGb,GAAAA;AAC5B;AACA;;AAEC,MACDc,aAAgB,GAAA;QACd,OAAO,IAAI,CAAC/C,WAAW;AACzB;AACA;;AAEC,MACDgD,YAAe,GAAA;QACb,OAAO,IAAA;AACT;AACA;;AAEC,MACDC,YAAe,GAAA;QACb,OAAO,IAAA;AACT;AACA;;AAEC,MACDC,YAAe,GAAA;AACb,QAAA,OAAO,IAAI,CAACb,QAAQ,EAAEa,YAAkBC,EAAAA,IAAAA,YAAAA;AAC1C;AACA;;AAEC,MACDC,OAAU,GAAA;QACR,OAAO,IAAI,CAACf,QAAQ,GAAG,CAAC,IAAI,CAACA,QAAQ,CAACgB,eAAe,EAAK,GAAA,KAAA;AAC5D;AACA;;AAEC,MACDC,cAAiB,GAAA;AACf,QAAA,OAAO,IAAI,CAACjB,QAAQ,EAAEiB,cAAoB,EAAA,IAAA,KAAA;AAC5C;AACA;;AAEC,MACDC,cAAiB,GAAA;AACf,QAAA,OAAO,IAAI,CAAClB,QAAQ,EAAEkB,cAAoB,EAAA,IAAA,KAAA;AAC5C;AACA;;AAEC,MACDC,WAAc,GAAA;AACZ,QAAA,OAAO,IAAI,CAACpD,SAAS,CAACyB,GAAG,EAAA;AAC3B;AACA;;AAEC,MACD4B,YAAe,GAAA;QACb,OAAO,IAAA;AACT;AACA;;AAEC,MACDC,gBAA2C,GAAA;QACzC,OAAO,IAAA;AACT;AACA;;AAEC,MACDC,qBAAwB,GAAA;QACtB,OAAO,IAAA;AACT;AACA;;AAEC,MACDC,0BAA6B,GAAA;QAC3B,IAAI,IAAI,CAACvB,QAAQ,EAAE;YACjB,MAAMwB,CAAAA,GAAI,IAAI,CAACC,WAAW,CAACC,oBAAoB,CAACC,QAAQC,IAAI,EAAA,CAAA;YAC5D,MAAM9E,SAAAA,GAAY,IAAI,CAACyB,UAAU,GAAG,IAAI,CAACsD,KAAK,CAACC,CAAC;YAChD,MAAMnF,SAAAA,GAAY,IAAI,CAAC6B,UAAU,GAAG,IAAI,CAACqD,KAAK,CAACC,CAAC;YAChD,OAAO,IAAIC,WACT,CAAA,IAAIJ,OAAQ,CAAA,IAAI,CAAC3B,QAAQ,CAACgC,MAAM,CAACC,CAAC,EAAET,EAAEM,CAAC,GAAGI,IAAKnF,CAAAA,GAAG,CAACD,SAAAA,EAAWH,YAAY,IAAI,CAACqD,QAAQ,CAACgC,MAAM,CAACF,CAAC,CAChG,EAAA,IAAIH,OAAQ,CAAA,IAAI,CAAC3B,QAAQ,CAACgC,MAAM,CAACG,CAAC,EAAEX,CAAEM,CAAAA,CAAC,GAAGI,IAAKtF,CAAAA,GAAG,CAACE,SAAAA,EAAWH,SAAY,CAAA,EAAA,IAAI,CAACqD,QAAQ,CAACgC,MAAM,CAACI,CAAC,CAAA,CAAA;SAE7F,MAAA;YACL,OAAO,IAAA;AACT;AACF;AACA;;AAEC,MACD,IAAIC,WAAkC,GAAA;AACpC,QAAA,OAAO,IAAI,CAACrC,QAAQ,EAAEgC,MAAAA,IAAUM,QAAQV,IAAI,EAAA;AAC9C;AACA;;;;;MAMAW,uBAAAA,CAAwBC,SAAoB,EAAE;AAC5CA,QAAAA,SAAAA,CAAUC,WAAW,CAAC,IAAI,CAACC,SAAS,CAAA;AACtC;AACA;;;;;MAMAC,uBAAAA,CAAwBH,SAAoB,EAAE;AAC5CA,QAAAA,SAAAA,CAAUI,GAAG,CAAC,IAAI,CAACC,WAAW,CAAA;QAC9B,IAAI,IAAI,CAACC,MAAM,EAAE;YACfN,SAAUO,CAAAA,GAAG,IAAI,IAAI,CAACD,MAAM,CAACrB,WAAW,CAACsB,GAAG;YAC5CP,SAAUQ,CAAAA,GAAG,IAAI,IAAI,CAACF,MAAM,CAACrB,WAAW,CAACuB,GAAG;YAC5CR,SAAUS,CAAAA,GAAG,IAAI,IAAI,CAACH,MAAM,CAACrB,WAAW,CAACwB,GAAG;AAC9C;AACF;AACA;;;;;;;;;;;;AAYC,MACDC,iBAAoB,GAAA;QAClB,MAAM5C,SAAAA,GAAY,IAAI,CAACA,SAAS;AAChC,QAAA,IAAI,CAACA,SAAW,EAAA;AACd,YAAA;AACF;AACA,QAAA,MAAM6C,MAASC,GAAAA,SAAAA,EAAAA;AACf,QAAA,IAAIC,GAAM,GAAA,IAAI,CAAC5E,WAAW,CAACe,GAAG,EAAA;AAC9B,QAAA,IAAI6D,GAAQA,KAAAA,GAAIC,CAAAA,KAAK,KAAKhD,SAAUgD,CAAAA,KAAK,IAAID,GAAAA,CAAIE,MAAM,KAAKjD,SAAUiD,CAAAA,MAAM,CAAG,EAAA;YAC7E,IAAI,CAAC9E,WAAW,CAAC+E,OAAO,EAAA;AAC1B;AACA,QAAA,IAAI,CAAC,IAAI,CAAC/E,WAAW,CAACe,GAAG,EAAI,EAAA;AAC3B6D,YAAAA,GAAAA,GAAMD,SAAYK,EAAAA,CAAAA,eAAe,CAC/BN,MAAAA,CAAOzH,IAAI,KAAK,OAAU,GAAA,SAAA,GAAY,OACtC4E,EAAAA,SAAAA,CAAUgD,KAAK,EACfhD,UAAUiD,MAAM,CAAA;AAElBF,YAAAA,GAAAA,CAAIK,IAAI,GAAG,2BAAA;AACX,YAAA,IAAI,CAACjF,WAAW,CAACmE,GAAG,CAACS,GAAAA,CAAAA;AACvB;QACA,MAAMM,KAAAA,GAAQR,MAAOS,CAAAA,iBAAiB,CAAC;AAACP,YAAAA;SAAK,EAAE,IAAA,CAAA;AAC/CnG,QAAAA,cAAAA,CAAeK,YAAY,CAACsG,IAAI,CAACvD,SAAAA,EAAWqD,OAAOG,YAAa,CAAA,qBAAA,CAAA,CAAA;AAChEH,QAAAA,KAAAA,CAAMH,OAAO,EAAA;QACbtG,cAAeI,CAAAA,wBAAwB,CAACyG,MAAM,CAACV,GAAAA,CAAAA;QAC/C,MAAMW,IAAAA,GAAO,IAAIvG,YAAa,CAAA,CAAA,CAAA;AAC9B4F,QAAAA,GAAAA,CACGY,UAAU,CAAC,CAAG,EAAA,CAAA,EAAG,CAAG,EAAA,CAAA,EAAG,CAAGZ,EAAAA,GAAAA,CAAKa,aAAa,GAAG,CAAGF,EAAAA,IAAAA,CAAAA,CAClDG,IAAI,CAAC,IAAA;AACJ,YAAA,IAAI,CAAC5F,UAAU,GAAGyF,IAAI,CAAC,CAAE,CAAA;AACzB,YAAA,IAAI,CAACxF,UAAU,GAAGwF,IAAI,CAAC,CAAE,CAAA;YACzB,IAAI,CAACI,6BAA6B,CAAC,KAAA,CAAA;SAEpCC,CAAAA,CAAAA,KAAK,CAAC,CAACC,IAAAA,GAAAA;AACNC,YAAAA,OAAAA,CAAQC,KAAK,CAAC,oBAAA,CAAA;AAChB,SAAA,CAAA;AACJ;AACA,qBACApF,sBAAAA,CAAuBkE,KAAa,EAAEC,MAAc,EAAE;QACpD,OAAOH,SAAAA,EAAAA,CAAYK,eAAe,CAACL,SAAAA,EAAAA,CAAY1H,IAAI,KAAK,OAAA,GAAU,SAAY,GAAA,MAAA,EAAQ4H,KAAOC,EAAAA,MAAAA,CAAAA;AAC/F;AACA,qBACUkB,mBAAoBC,CAAAA,eAAwB,EAAE;AACtD,QAAA,KAAK,CAACD,mBAAoBC,CAAAA,eAAAA,CAAAA;AAC1B,QAAA,IAAI,CAACrF,YAAY,EAAA;AACnB;AACA,mDACAsF,eAAgBC,CAAAA,MAAc,EAAEC,iBAAyB,EAAEC,eAAuB,EAAE;AAClF,QAAA,MAAMC,GAAM,GAAA,IAAI,CAAChH,SAAS,CAACyB,GAAG,EAAA;AAC9B,QAAA,IAAI,CAACuF,GAAK,EAAA;AACR,YAAA;AACF;AACA,QAAA,MAAMC,OAAO,IAAI;AACjB,QAAA,MAAMC,EAAK,GAAA,IAAI,CAACC,sBAAsB,GAAIC,MAAM,EAAA;QAChD,IAAI,CAACtH,WAAW,GAAG,IAAI,CAACD,QAAQ,CAACwH,MAAM,CAAC;YACtCR,MAAQA,EAAAA,MAAAA;AACRS,YAAAA,cAAAA,EAAgBN,IAAI/C,MAAM;YAC1BsD,SAAW,EAAA,IAAI,CAACxH,UAAU;AAC1ByH,YAAAA,QAAAA,EAAU,IAAI;YACdC,cAAgB,EAAA,CAAC,IAAI,CAACnF,UAAU;YAChCoF,QAASF,CAAAA,CAAAA,QAAiB,EAAEG,IAAI,EAAEC,IAAI,EAAEC,IAAI,EAAEC,IAAI,EAAEC,OAAO,EAAA;AACzD,gBAAA,MAAMtE,IAAIwD,IAAKvD,CAAAA,WAAW,CAACC,oBAAoB,CAACC,QAAQC,IAAI,EAAA,CAAA;AAC5DkE,gBAAAA,OAAAA,CAAQC,QAAQ,CAACC,MAAM,CAACN,MAAMT,EAAKA,GAAAA,EAAAA,CAAGc,QAAQ,CAACjE,CAAC,GAAGN,CAAEM,CAAAA,CAAC,GAAG,IAAM8D,EAAAA,IAAAA,CAAAA;AAC/DE,gBAAAA,OAAAA,CAAQG,QAAQ,CAACD,MAAM,CAACL,MAAMV,EAAKA,GAAAA,EAAAA,CAAGgB,QAAQ,CAACnE,CAAC,GAAGN,CAAEM,CAAAA,CAAC,GAAG,IAAM+D,EAAAA,IAAAA,CAAAA;AACjE;AACF,SAAA,CAAA;AACA,QAAA,IAAIK,WAAc,GAAA,CAAA;AAClB,QAAA,KAAK,MAAMC,IAAAA,IAAQ,IAAI,CAACtI,WAAW,CAAE;AACnC,YAAA,MAAMuI,MAASD,GAAAA,IAAAA,CAAKE,SAAS,CAACC,eAAe,CAAC,WAAA,CAAA;YAC9CF,MAAOG,CAAAA,aAAa,CAAC,CAAGJ,EAAAA,IAAAA,CAAKK,SAAS,EAAE,CAAA,EAAGL,KAAKM,YAAY,CAAA;YAC5D,IAAIN,IAAAA,CAAKO,WAAW,GAAGR,WAAa,EAAA;AAClCA,gBAAAA,WAAAA,GAAcC,KAAKO,WAAW;AAChC;AACF;AACA,QAAA,MAAMC,SAAY,GAAA,IAAI,CAAC/I,QAAQ,CAACgJ,aAAa,CAAChC,MAAAA,EAAQG,GAAI/C,CAAAA,MAAM,EAAE,IAAI,CAAClE,UAAU,CAAA;QACjF,MAAM+I,SAAAA,GAAYjC,OAAOkC,gBAAgB,EAAA;QACzC,MAAMC,SAAAA,GAAY7J,eAAeM,UAAU;AAE3C,QAAA,IAAK,IAAIwJ,CAAAA,GAAI,CAAGA,EAAAA,CAAAA,IAAKd,aAAac,CAAK,EAAA,CAAA;AACrC,YAAA,IAAIA,MAAM,CAAG,EAAA;AACXD,gBAAAA,SAAS,CAACC,CAAI,GAAA,CAAA,GAAI,CAAE,CAAA,GAAGH,UAAU5E,CAAC;AAClC8E,gBAAAA,SAAS,CAACC,CAAI,GAAA,CAAA,GAAI,CAAE,CAAA,GAAGH,UAAU1E,CAAC;AAClC4E,gBAAAA,SAAS,CAACC,CAAI,GAAA,CAAA,GAAI,CAAE,CAAA,GAAGH,UAAU5E,CAAC;AAClC8E,gBAAAA,SAAS,CAACC,CAAI,GAAA,CAAA,GAAI,CAAE,CAAA,GAAGH,UAAU1E,CAAC;aAC7B,MAAA;AACL,gBAAA,MAAM8E,QAAWN,GAAAA,SAAS,CAACK,CAAAA,GAAI,CAAE,CAAA;gBACjCD,SAAS,CAACC,IAAI,CAAI,GAAA,CAAA,CAAE,GAAGC,QAASlB,CAAAA,QAAQ,CAAC9D,CAAC;gBAC1C8E,SAAS,CAACC,IAAI,CAAI,GAAA,CAAA,CAAE,GAAGC,QAASlB,CAAAA,QAAQ,CAAC5D,CAAC;gBAC1C4E,SAAS,CAACC,IAAI,CAAI,GAAA,CAAA,CAAE,GAAGC,QAAShB,CAAAA,QAAQ,CAAChE,CAAC;gBAC1C8E,SAAS,CAACC,IAAI,CAAI,GAAA,CAAA,CAAE,GAAGC,QAAShB,CAAAA,QAAQ,CAAC9D,CAAC;AAC5C;YACA,MAAM+E,WAAAA,GAAcP,SAAS,CAACK,CAAE,CAAA;AAChCD,YAAAA,SAAS,CAACC,CAAI,GAAA,CAAA,GAAI,CAAE,CAAA,GAAG,KAAKE,WAAAA,CAAYnB,QAAQ,CAAC9D,CAAC,GAAG8E,SAAS,CAACC,CAAI,GAAA,CAAA,GAAI,EAAE,CAAD;AACxED,YAAAA,SAAS,CAACC,CAAI,GAAA,CAAA,GAAI,CAAE,CAAA,GAAG,KAAKE,WAAAA,CAAYnB,QAAQ,CAAC5D,CAAC,GAAG4E,SAAS,CAACC,CAAI,GAAA,CAAA,GAAI,EAAE,CAAD;AACxED,YAAAA,SAAS,CAACC,CAAI,GAAA,CAAA,GAAI,CAAE,CAAA,GAAG,KAAKE,WAAAA,CAAYjB,QAAQ,CAAChE,CAAC,GAAG8E,SAAS,CAACC,CAAI,GAAA,CAAA,GAAI,EAAE,CAAD;AACxED,YAAAA,SAAS,CAACC,CAAI,GAAA,CAAA,GAAI,CAAE,CAAA,GAAG,KAAKE,WAAAA,CAAYjB,QAAQ,CAAC9D,CAAC,GAAG4E,SAAS,CAACC,CAAI,GAAA,CAAA,GAAI,EAAE,CAAD;AAC1E;AACAjC,QAAAA,GAAAA,CAAIoC,YAAY,CAACJ,SAAAA,EAAW,CAAKb,IAAAA,cAAc,CAAA,CAAA,CAAA;AAE/C,QAAA,IAAI,CAACxH,KAAK,EAAEY,wBAAAA,CAAyB,IAAI,CAAA;AAC3C;AACA;;;AAGC,MACDD,YAAe,GAAA;QACb,IAAI,IAAI,CAACW,QAAQ,EAAE;YACjB,MAAMiC,CAAAA,GAAIC,KAAKkF,GAAG,CAAC,IAAI,CAACvF,KAAK,CAACI,CAAC,CAAA;YAC/B,MAAME,CAAAA,GAAID,KAAKkF,GAAG,CAAC,IAAI,CAACvF,KAAK,CAACM,CAAC,CAAA;AAC/B,YAAA,MAAMkF,EAAK,GAAA,IAAI,CAACC,QAAQ,CAACrF,CAAC,IAAI,IAAI,CAACa,MAAM,EAAErB,WAAAA,CAAYsB,OAAO,CAAA,CAAA;AAC9D,YAAA,MAAMwE,EAAK,GAAA,IAAI,CAACD,QAAQ,CAACnF,CAAC,IAAI,IAAI,CAACW,MAAM,EAAErB,WAAAA,CAAYwB,OAAO,CAAA,CAAA;AAC9D,YAAA,IAAI,CAACnF,UAAU,GAAGoE,IAAAA,CAAKtF,GAAG,CACvBqF,CAAI,GAAA,IAAI,CAAC/D,MAAM,GAAI,IAAI,CAAC8B,QAAQ,CAACM,SAAS,CAACgD,KAAK,EACjD,CAACnB,GAAI,IAAI,CAAChE,MAAM,GAAI,IAAI,CAAC6B,QAAQ,CAACM,SAAS,CAACiD,MAAM,CAAA;YAEpD,IAAI,CAACvD,QAAQ,CAACwH,MAAM,CAAC,IAAIlF,OAAAA,CAAQ+E,EAAIE,EAAAA,EAAAA,EAAIF,EAAKpF,GAAAA,CAAAA,GAAI,IAAI,CAAC/D,MAAM,EAAEqJ,EAAAA,GAAKpF,CAAI,GAAA,IAAI,CAAChE,MAAM,CAAA,EAAG,IAAI,CAAC0D,KAAK,CAAA;YAChG,IAAI,CAACtC,aAAa,CAACkI,cAAc,EAAA;AACnC;AACF;AACA,uCACAC,IAAAA,CAAKC,GAAgB,EAAEC,WAAkC,EAAE;AACzD,QAAA,MAAM7C,GAAM,GAAA,IAAI,CAAChH,SAAS,EAAEyB,GAAAA,EAAAA;AAC5B,QAAA,IAAIuF,GAAK,EAAA;YACP,IAAI,CAAC8C,IAAI,CAACF,GAAKC,EAAAA,WAAAA,CAAAA;AACf7C,YAAAA,GAAAA,CAAI+C,kBAAkB,CAAC,IAAI,CAAChK,UAAU,EAAE,IAAI,CAAC2D,WAAW,CAACsB,GAAG,EAAE,IAAI,CAACtB,WAAW,CAACwB,GAAG,CAAA;AAClF8B,YAAAA,GAAAA,CAAIgD,KAAK,CAACJ,GAAAA,CAAAA;AACV,YAAA,KAAK,MAAMxB,IAAAA,IAAQ,IAAI,CAACtI,WAAW,CAAG;AACpCkH,gBAAAA,GAAAA,CAAI2C,IAAI,CAACvB,IAAAA,CAAKE,SAAS,EAAEsB,GAAAA,EAAKxB,KAAKM,YAAY,CAAA;AACjD;YACA,IACEkB,GAAAA,CAAIK,UAAU,CAAEtM,IAAI,KAAKuM,6BACzBN,IAAAA,GAAAA,CAAIK,UAAU,CAAEtM,IAAI,KAAKwM,0BACzB,EAAA;AACA,gBAAA,IAAI,CAAC3I,aAAa,CAACmI,IAAI,CAACC,GAAAA,CAAAA;AAC1B;AACF;AACF;AACA,qBACA,eAAQvH,CAAgBzB,KAAa,EAAEC,KAAa,EAAE;QACpD,IAAI,IAAI,CAACoB,QAAQ,EAAE;AACjB,YAAA,MAAMmI,YAAe,GAAA,IAAI,CAACnI,QAAQ,CAACM,SAAS;AAC5C,YAAA,MAAM6C,MAASC,GAAAA,SAAAA,EAAAA;AACf,YAAA,MAAMgF,iBAAiBjF,MAAOkF,CAAAA,aAAa,EAAGC,CAAAA,WAAW,CAACF,cAAc;YACxEzJ,KAAQuD,GAAAA,IAAAA,CAAKnF,GAAG,CAACmF,IAAAA,CAAKtF,GAAG,CAAC+B,KAAAA,EAAO,IAAIyJ,cAAmB,CAAA,IAAA,CAAA;YACxDxJ,KAAQsD,GAAAA,IAAAA,CAAKnF,GAAG,CAACmF,IAAAA,CAAKtF,GAAG,CAACgC,KAAAA,EAAO,IAAIwJ,cAAmB,CAAA,IAAA,CAAA;AACxD,YAAA,IAAIzJ,UAAUwJ,YAAa7E,CAAAA,KAAK,IAAI1E,KAAUuJ,KAAAA,YAAAA,CAAa5E,MAAM,EAAE;gBACjE,MAAMgF,YAAAA,GAAepF,MAAOM,CAAAA,eAAe,CACzCN,MAAAA,CAAOzH,IAAI,KAAK,OAAA,GAAU,SAAY,GAAA,MAAA,EACtCiD,KACAC,EAAAA,KAAAA,CAAAA;gBAEF,MAAM4J,EAAAA,GAAKrF,MAAOS,CAAAA,iBAAiB,CAAC;AAAC2E,oBAAAA;iBAAa,EAAE,IAAA,CAAA;AACpDrL,gBAAAA,cAAAA,CAAeK,YAAY,CAACsG,IAAI,CAACsE,YAAAA,EAAcK,IAAI1E,YAAa,CAAA,oBAAA,CAAA,CAAA;AAChE0E,gBAAAA,EAAAA,CAAGhF,OAAO,EAAA;gBACV,IAAI,CAAClD,SAAS,GAAGiI,YAAAA;AACjB,gBAAA,IAAI,CAACrF,iBAAiB,EAAA;AACxB;AACF;AACF;AACA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAuDC,MACD,SAAsB,GAAA;AACpB,QAAA,KAAK,CAACuF,SAAAA,EAAAA;QACN,IAAI,CAAC7K,QAAQ,EAAE4F,OAAAA,EAAAA;QACf,IAAI,CAACzF,SAAS,EAAEyF,OAAAA,EAAAA;QAChB,IAAI,CAACxF,cAAc,EAAEwF,OAAAA,EAAAA;AACvB;AACF;;;;"}