@zephyr3d/scene 0.9.2 → 0.9.3

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 (420) hide show
  1. package/dist/animation/animationset.js +135 -135
  2. package/dist/animation/animationset.js.map +1 -1
  3. package/dist/animation/ik/ik_chain_builder.js +68 -0
  4. package/dist/animation/ik/ik_chain_builder.js.map +1 -0
  5. package/dist/animation/ik/ik_pole_constraint.js +2 -7
  6. package/dist/animation/ik/ik_pole_constraint.js.map +1 -1
  7. package/dist/animation/joint_dynamics/controller.js +146 -146
  8. package/dist/animation/joint_dynamics/controller.js.map +1 -1
  9. package/dist/animation/joint_dynamics/math.js +16 -0
  10. package/dist/animation/joint_dynamics/math.js.map +1 -0
  11. package/dist/animation/spring/spring_particle.js +4 -4
  12. package/dist/animation/spring/spring_particle.js.map +1 -1
  13. package/dist/animation/spring/spring_system.js +75 -75
  14. package/dist/animation/spring/spring_system.js.map +1 -1
  15. package/dist/animation/spring2/constraints.js.map +1 -1
  16. package/dist/animation/spring2/controller.js +64 -64
  17. package/dist/animation/spring2/controller.js.map +1 -1
  18. package/dist/animation/spring2/math.js.map +1 -1
  19. package/dist/animation/spring2/spring_system.js +8 -8
  20. package/dist/animation/spring2/spring_system.js.map +1 -1
  21. package/dist/asset/model.js +57 -57
  22. package/dist/asset/model.js.map +1 -1
  23. package/dist/camera/camera.js +184 -184
  24. package/dist/camera/camera.js.map +1 -1
  25. package/dist/index.d.ts +2 -6
  26. package/dist/index.js +1 -1
  27. package/dist/material/material.js +288 -288
  28. package/dist/material/material.js.map +1 -1
  29. package/dist/material/shader/helper.js +281 -278
  30. package/dist/material/shader/helper.js.map +1 -1
  31. package/dist/node_modules/@zephyr3d/runtime/dist/runtime/runtimemgr.js +38 -0
  32. package/dist/node_modules/@zephyr3d/runtime/dist/runtime/runtimemgr.js.map +1 -0
  33. package/dist/node_modules/@zephyr3d/runtime/dist/runtime/runtimescript.js +10 -0
  34. package/dist/node_modules/@zephyr3d/runtime/dist/runtime/runtimescript.js.map +1 -0
  35. package/dist/node_modules/@zephyr3d/runtime/dist/runtime/scriptingsystem.js +127 -0
  36. package/dist/node_modules/@zephyr3d/runtime/dist/runtime/scriptingsystem.js.map +1 -0
  37. package/dist/node_modules/@zephyr3d/runtime/dist/runtime/scriptregistry.js +263 -0
  38. package/dist/node_modules/@zephyr3d/runtime/dist/runtime/scriptregistry.js.map +1 -0
  39. package/dist/render/cluster_light.js +3 -4
  40. package/dist/render/cluster_light.js.map +1 -1
  41. package/dist/render/rendergraph/history_resource_manager.js +93 -93
  42. package/dist/render/rendergraph/history_resource_manager.js.map +1 -1
  43. package/dist/render/rendergraph/history_resources.js +3 -3
  44. package/dist/render/rendergraph/history_resources.js.map +1 -1
  45. package/dist/render/rendergraph/types.js +22 -22
  46. package/dist/render/rendergraph/types.js.map +1 -1
  47. package/dist/scene/mesh.js +80 -80
  48. package/dist/scene/mesh.js.map +1 -1
  49. package/dist/scene/scene_node.js +228 -228
  50. package/dist/scene/scene_node.js.map +1 -1
  51. package/dist/shapes/torus.js +90 -59
  52. package/dist/shapes/torus.js.map +1 -1
  53. package/dist/src/animation/animation.js +127 -0
  54. package/dist/src/animation/animation.js.map +1 -0
  55. package/dist/src/animation/animationset.js +255 -0
  56. package/dist/src/animation/animationset.js.map +1 -0
  57. package/dist/src/animation/animationtrack.js +34 -0
  58. package/dist/src/animation/animationtrack.js.map +1 -0
  59. package/dist/src/animation/eulerrotationtrack.js +52 -0
  60. package/dist/src/animation/eulerrotationtrack.js.map +1 -0
  61. package/dist/src/animation/morphtarget.js +93 -0
  62. package/dist/src/animation/morphtarget.js.map +1 -0
  63. package/dist/src/animation/morphtrack.js +70 -0
  64. package/dist/src/animation/morphtrack.js.map +1 -0
  65. package/dist/src/animation/proptrack.js +161 -0
  66. package/dist/src/animation/proptrack.js.map +1 -0
  67. package/dist/src/animation/rotationtrack.js +51 -0
  68. package/dist/src/animation/rotationtrack.js.map +1 -0
  69. package/dist/src/animation/scaletrack.js +50 -0
  70. package/dist/src/animation/scaletrack.js.map +1 -0
  71. package/dist/src/animation/skeleton.js +204 -0
  72. package/dist/src/animation/skeleton.js.map +1 -0
  73. package/dist/src/animation/translationtrack.js +50 -0
  74. package/dist/src/animation/translationtrack.js.map +1 -0
  75. package/dist/src/app/app.js +129 -0
  76. package/dist/src/app/app.js.map +1 -0
  77. package/dist/src/app/inputmgr.js +267 -0
  78. package/dist/src/app/inputmgr.js.map +1 -0
  79. package/dist/src/asset/assetmanager.js +404 -0
  80. package/dist/src/asset/assetmanager.js.map +1 -0
  81. package/dist/src/asset/builtin.js +337 -0
  82. package/dist/src/asset/builtin.js.map +1 -0
  83. package/dist/src/asset/loaders/dds/dds.js +470 -0
  84. package/dist/src/asset/loaders/dds/dds.js.map +1 -0
  85. package/dist/src/asset/loaders/dds/dds_loader.js +28 -0
  86. package/dist/src/asset/loaders/dds/dds_loader.js.map +1 -0
  87. package/dist/src/asset/loaders/gltf/gltf_loader.js +1265 -0
  88. package/dist/src/asset/loaders/gltf/gltf_loader.js.map +1 -0
  89. package/dist/src/asset/loaders/gltf/helpers.js +327 -0
  90. package/dist/src/asset/loaders/gltf/helpers.js.map +1 -0
  91. package/dist/src/asset/loaders/hdr/hdr.js +180 -0
  92. package/dist/src/asset/loaders/hdr/hdr.js.map +1 -0
  93. package/dist/src/asset/loaders/image/tga_Loader.js +116 -0
  94. package/dist/src/asset/loaders/image/tga_Loader.js.map +1 -0
  95. package/dist/src/asset/loaders/image/webimage_loader.js +63 -0
  96. package/dist/src/asset/loaders/image/webimage_loader.js.map +1 -0
  97. package/dist/src/asset/loaders/loader.js +45 -0
  98. package/dist/src/asset/loaders/loader.js.map +1 -0
  99. package/dist/src/asset/model.js +414 -0
  100. package/dist/src/asset/model.js.map +1 -0
  101. package/dist/src/blitter/bilateralblur.js +221 -0
  102. package/dist/src/blitter/bilateralblur.js.map +1 -0
  103. package/dist/src/blitter/blitter.js +390 -0
  104. package/dist/src/blitter/blitter.js.map +1 -0
  105. package/dist/src/blitter/box.js +118 -0
  106. package/dist/src/blitter/box.js.map +1 -0
  107. package/dist/src/blitter/copy.js +22 -0
  108. package/dist/src/blitter/copy.js.map +1 -0
  109. package/dist/src/blitter/gaussianblur.js +228 -0
  110. package/dist/src/blitter/gaussianblur.js.map +1 -0
  111. package/dist/src/camera/base.js +92 -0
  112. package/dist/src/camera/base.js.map +1 -0
  113. package/dist/src/camera/camera.js +1005 -0
  114. package/dist/src/camera/camera.js.map +1 -0
  115. package/dist/src/camera/fps.js +238 -0
  116. package/dist/src/camera/fps.js.map +1 -0
  117. package/dist/src/camera/orbit.js +245 -0
  118. package/dist/src/camera/orbit.js.map +1 -0
  119. package/dist/src/camera/orthocamera.js +167 -0
  120. package/dist/src/camera/orthocamera.js.map +1 -0
  121. package/dist/src/camera/perspectivecamera.js +141 -0
  122. package/dist/src/camera/perspectivecamera.js.map +1 -0
  123. package/dist/src/index.js +120 -0
  124. package/dist/src/index.js.map +1 -0
  125. package/dist/src/material/blinn.js +81 -0
  126. package/dist/src/material/blinn.js.map +1 -0
  127. package/dist/src/material/grassmaterial.js +113 -0
  128. package/dist/src/material/grassmaterial.js.map +1 -0
  129. package/dist/src/material/lambert.js +92 -0
  130. package/dist/src/material/lambert.js.map +1 -0
  131. package/dist/src/material/material.js +301 -0
  132. package/dist/src/material/material.js.map +1 -0
  133. package/dist/src/material/meshmaterial.js +704 -0
  134. package/dist/src/material/meshmaterial.js.map +1 -0
  135. package/dist/src/material/mixins/albedocolor.js +76 -0
  136. package/dist/src/material/mixins/albedocolor.js.map +1 -0
  137. package/dist/src/material/mixins/foliage.js +47 -0
  138. package/dist/src/material/mixins/foliage.js.map +1 -0
  139. package/dist/src/material/mixins/lightmodel/blinnphong.js +112 -0
  140. package/dist/src/material/mixins/lightmodel/blinnphong.js.map +1 -0
  141. package/dist/src/material/mixins/lightmodel/lambert.js +58 -0
  142. package/dist/src/material/mixins/lightmodel/lambert.js.map +1 -0
  143. package/dist/src/material/mixins/lightmodel/pbrmetallicroughness.js +178 -0
  144. package/dist/src/material/mixins/lightmodel/pbrmetallicroughness.js.map +1 -0
  145. package/dist/src/material/mixins/lightmodel/pbrspecularglossness.js +139 -0
  146. package/dist/src/material/mixins/lightmodel/pbrspecularglossness.js.map +1 -0
  147. package/dist/src/material/mixins/lit.js +476 -0
  148. package/dist/src/material/mixins/lit.js.map +1 -0
  149. package/dist/src/material/mixins/pbr/common.js +918 -0
  150. package/dist/src/material/mixins/pbr/common.js.map +1 -0
  151. package/dist/src/material/mixins/texture.js +172 -0
  152. package/dist/src/material/mixins/texture.js.map +1 -0
  153. package/dist/src/material/mixins/vertexcolor.js +56 -0
  154. package/dist/src/material/mixins/vertexcolor.js.map +1 -0
  155. package/dist/src/material/particle.js +178 -0
  156. package/dist/src/material/particle.js.map +1 -0
  157. package/dist/src/material/pbrmr.js +97 -0
  158. package/dist/src/material/pbrmr.js.map +1 -0
  159. package/dist/src/material/pbrsg.js +97 -0
  160. package/dist/src/material/pbrsg.js.map +1 -0
  161. package/dist/src/material/shader/helper.js +1209 -0
  162. package/dist/src/material/shader/helper.js.map +1 -0
  163. package/dist/src/material/terrain-cm.js +606 -0
  164. package/dist/src/material/terrain-cm.js.map +1 -0
  165. package/dist/src/material/terrainmaterial.js +375 -0
  166. package/dist/src/material/terrainmaterial.js.map +1 -0
  167. package/dist/src/material/unlit.js +41 -0
  168. package/dist/src/material/unlit.js.map +1 -0
  169. package/dist/src/material/water.js +417 -0
  170. package/dist/src/material/water.js.map +1 -0
  171. package/dist/src/posteffect/bloom.js +361 -0
  172. package/dist/src/posteffect/bloom.js.map +1 -0
  173. package/dist/src/posteffect/compositor.js +226 -0
  174. package/dist/src/posteffect/compositor.js.map +1 -0
  175. package/dist/src/posteffect/fxaa.js +273 -0
  176. package/dist/src/posteffect/fxaa.js.map +1 -0
  177. package/dist/src/posteffect/grayscale.js +69 -0
  178. package/dist/src/posteffect/grayscale.js.map +1 -0
  179. package/dist/src/posteffect/motionblur.js +96 -0
  180. package/dist/src/posteffect/motionblur.js.map +1 -0
  181. package/dist/src/posteffect/posteffect.js +126 -0
  182. package/dist/src/posteffect/posteffect.js.map +1 -0
  183. package/dist/src/posteffect/sao.js +324 -0
  184. package/dist/src/posteffect/sao.js.map +1 -0
  185. package/dist/src/posteffect/ssr.js +489 -0
  186. package/dist/src/posteffect/ssr.js.map +1 -0
  187. package/dist/src/posteffect/taa.js +172 -0
  188. package/dist/src/posteffect/taa.js.map +1 -0
  189. package/dist/src/posteffect/tonemap.js +94 -0
  190. package/dist/src/posteffect/tonemap.js.map +1 -0
  191. package/dist/src/render/abuffer_oit.js +361 -0
  192. package/dist/src/render/abuffer_oit.js.map +1 -0
  193. package/dist/src/render/clipmap.js +851 -0
  194. package/dist/src/render/clipmap.js.map +1 -0
  195. package/dist/src/render/cluster_light.js +333 -0
  196. package/dist/src/render/cluster_light.js.map +1 -0
  197. package/dist/src/render/cull_visitor.js +187 -0
  198. package/dist/src/render/cull_visitor.js.map +1 -0
  199. package/dist/src/render/depthpass.js +68 -0
  200. package/dist/src/render/depthpass.js.map +1 -0
  201. package/dist/src/render/drawable_mixin.js +227 -0
  202. package/dist/src/render/drawable_mixin.js.map +1 -0
  203. package/dist/src/render/envlight.js +463 -0
  204. package/dist/src/render/envlight.js.map +1 -0
  205. package/dist/src/render/fbm_wavegenerator.js +251 -0
  206. package/dist/src/render/fbm_wavegenerator.js.map +1 -0
  207. package/dist/src/render/fft_wavegenerator.js +1006 -0
  208. package/dist/src/render/fft_wavegenerator.js.map +1 -0
  209. package/dist/src/render/fullscreenquad.js +38 -0
  210. package/dist/src/render/fullscreenquad.js.map +1 -0
  211. package/dist/src/render/gerstner_wavegenerator.js +314 -0
  212. package/dist/src/render/gerstner_wavegenerator.js.map +1 -0
  213. package/dist/src/render/globalbindgroup_allocator.js +60 -0
  214. package/dist/src/render/globalbindgroup_allocator.js.map +1 -0
  215. package/dist/src/render/hzb.js +273 -0
  216. package/dist/src/render/hzb.js.map +1 -0
  217. package/dist/src/render/lightpass.js +172 -0
  218. package/dist/src/render/lightpass.js.map +1 -0
  219. package/dist/src/render/objectcolorpass.js +51 -0
  220. package/dist/src/render/objectcolorpass.js.map +1 -0
  221. package/dist/src/render/primitive.js +364 -0
  222. package/dist/src/render/primitive.js.map +1 -0
  223. package/dist/src/render/render_queue.js +467 -0
  224. package/dist/src/render/render_queue.js.map +1 -0
  225. package/dist/src/render/renderbundle_wrapper.js +152 -0
  226. package/dist/src/render/renderbundle_wrapper.js.map +1 -0
  227. package/dist/src/render/renderer.js +455 -0
  228. package/dist/src/render/renderer.js.map +1 -0
  229. package/dist/src/render/renderpass.js +200 -0
  230. package/dist/src/render/renderpass.js.map +1 -0
  231. package/dist/src/render/shadowmap_pass.js +56 -0
  232. package/dist/src/render/shadowmap_pass.js.map +1 -0
  233. package/dist/src/render/sky.js +1103 -0
  234. package/dist/src/render/sky.js.map +1 -0
  235. package/dist/src/render/weightedblended_oit.js +168 -0
  236. package/dist/src/render/weightedblended_oit.js.map +1 -0
  237. package/dist/src/scene/batchgroup.js +162 -0
  238. package/dist/src/scene/batchgroup.js.map +1 -0
  239. package/dist/src/scene/environment.js +209 -0
  240. package/dist/src/scene/environment.js.map +1 -0
  241. package/dist/src/scene/graph_node.js +72 -0
  242. package/dist/src/scene/graph_node.js.map +1 -0
  243. package/dist/src/scene/light.js +416 -0
  244. package/dist/src/scene/light.js.map +1 -0
  245. package/dist/src/scene/mesh.js +341 -0
  246. package/dist/src/scene/mesh.js.map +1 -0
  247. package/dist/src/scene/octree.js +649 -0
  248. package/dist/src/scene/octree.js.map +1 -0
  249. package/dist/src/scene/particlesys.js +738 -0
  250. package/dist/src/scene/particlesys.js.map +1 -0
  251. package/dist/src/scene/raycast_visitor.js +103 -0
  252. package/dist/src/scene/raycast_visitor.js.map +1 -0
  253. package/dist/src/scene/scene.js +284 -0
  254. package/dist/src/scene/scene.js.map +1 -0
  255. package/dist/src/scene/scene_node.js +732 -0
  256. package/dist/src/scene/scene_node.js.map +1 -0
  257. package/dist/src/scene/terrain/grass.js +278 -0
  258. package/dist/src/scene/terrain/grass.js.map +1 -0
  259. package/dist/src/scene/terrain/heightfield.js +475 -0
  260. package/dist/src/scene/terrain/heightfield.js.map +1 -0
  261. package/dist/src/scene/terrain/patch.js +530 -0
  262. package/dist/src/scene/terrain/patch.js.map +1 -0
  263. package/dist/src/scene/terrain/quadtree.js +461 -0
  264. package/dist/src/scene/terrain/quadtree.js.map +1 -0
  265. package/dist/src/scene/terrain/terrain.js +246 -0
  266. package/dist/src/scene/terrain/terrain.js.map +1 -0
  267. package/dist/src/scene/terrain-cm/grass.js +594 -0
  268. package/dist/src/scene/terrain-cm/grass.js.map +1 -0
  269. package/dist/src/scene/terrain-cm/grassmaterial.js +159 -0
  270. package/dist/src/scene/terrain-cm/grassmaterial.js.map +1 -0
  271. package/dist/src/scene/terrain-cm/terrain-cm.js +538 -0
  272. package/dist/src/scene/terrain-cm/terrain-cm.js.map +1 -0
  273. package/dist/src/scene/water.js +374 -0
  274. package/dist/src/scene/water.js.map +1 -0
  275. package/dist/src/shaders/atmosphere.js +957 -0
  276. package/dist/src/shaders/atmosphere.js.map +1 -0
  277. package/dist/src/shaders/fog.js +112 -0
  278. package/dist/src/shaders/fog.js.map +1 -0
  279. package/dist/src/shaders/misc.js +266 -0
  280. package/dist/src/shaders/misc.js.map +1 -0
  281. package/dist/src/shaders/noise.js +222 -0
  282. package/dist/src/shaders/noise.js.map +1 -0
  283. package/dist/src/shaders/pbr.js +51 -0
  284. package/dist/src/shaders/pbr.js.map +1 -0
  285. package/dist/src/shaders/shadow.js +636 -0
  286. package/dist/src/shaders/shadow.js.map +1 -0
  287. package/dist/src/shaders/ssr.js +490 -0
  288. package/dist/src/shaders/ssr.js.map +1 -0
  289. package/dist/src/shaders/temporal.js +215 -0
  290. package/dist/src/shaders/temporal.js.map +1 -0
  291. package/dist/src/shaders/water.js +756 -0
  292. package/dist/src/shaders/water.js.map +1 -0
  293. package/dist/src/shadow/esm.js +237 -0
  294. package/dist/src/shadow/esm.js.map +1 -0
  295. package/dist/src/shadow/pcf_opt.js +181 -0
  296. package/dist/src/shadow/pcf_opt.js.map +1 -0
  297. package/dist/src/shadow/pcf_pd.js +189 -0
  298. package/dist/src/shadow/pcf_pd.js.map +1 -0
  299. package/dist/src/shadow/shader.js +37 -0
  300. package/dist/src/shadow/shader.js.map +1 -0
  301. package/dist/src/shadow/shadow_impl.js +15 -0
  302. package/dist/src/shadow/shadow_impl.js.map +1 -0
  303. package/dist/src/shadow/shadowmapper.js +790 -0
  304. package/dist/src/shadow/shadowmapper.js.map +1 -0
  305. package/dist/src/shadow/ssm.js +159 -0
  306. package/dist/src/shadow/ssm.js.map +1 -0
  307. package/dist/src/shadow/vsm.js +297 -0
  308. package/dist/src/shadow/vsm.js.map +1 -0
  309. package/dist/src/shapes/box.js +386 -0
  310. package/dist/src/shapes/box.js.map +1 -0
  311. package/dist/src/shapes/cylinder.js +125 -0
  312. package/dist/src/shapes/cylinder.js.map +1 -0
  313. package/dist/src/shapes/plane.js +88 -0
  314. package/dist/src/shapes/plane.js.map +1 -0
  315. package/dist/src/shapes/shape.js +87 -0
  316. package/dist/src/shapes/shape.js.map +1 -0
  317. package/dist/src/shapes/sphere.js +114 -0
  318. package/dist/src/shapes/sphere.js.map +1 -0
  319. package/dist/src/shapes/tetrahedron.js +188 -0
  320. package/dist/src/shapes/tetrahedron.js.map +1 -0
  321. package/dist/src/shapes/torus.js +111 -0
  322. package/dist/src/shapes/torus.js.map +1 -0
  323. package/dist/src/utility/aabbtree.js +400 -0
  324. package/dist/src/utility/aabbtree.js.map +1 -0
  325. package/dist/src/utility/bounding_volume.js +29 -0
  326. package/dist/src/utility/bounding_volume.js.map +1 -0
  327. package/dist/src/utility/debug.js +28 -0
  328. package/dist/src/utility/debug.js.map +1 -0
  329. package/dist/src/utility/draco/decoder.js +116 -0
  330. package/dist/src/utility/draco/decoder.js.map +1 -0
  331. package/dist/src/utility/misc.js +105 -0
  332. package/dist/src/utility/misc.js.map +1 -0
  333. package/dist/src/utility/panorama.js +163 -0
  334. package/dist/src/utility/panorama.js.map +1 -0
  335. package/dist/src/utility/pmrem.js +354 -0
  336. package/dist/src/utility/pmrem.js.map +1 -0
  337. package/dist/src/utility/rendermipmap.js +115 -0
  338. package/dist/src/utility/rendermipmap.js.map +1 -0
  339. package/dist/src/utility/serialization/json.js +402 -0
  340. package/dist/src/utility/serialization/json.js.map +1 -0
  341. package/dist/src/utility/serialization/manager.js +623 -0
  342. package/dist/src/utility/serialization/manager.js.map +1 -0
  343. package/dist/src/utility/serialization/scene/animation.js +248 -0
  344. package/dist/src/utility/serialization/scene/animation.js.map +1 -0
  345. package/dist/src/utility/serialization/scene/batch.js +59 -0
  346. package/dist/src/utility/serialization/scene/batch.js.map +1 -0
  347. package/dist/src/utility/serialization/scene/camera.js +790 -0
  348. package/dist/src/utility/serialization/scene/camera.js.map +1 -0
  349. package/dist/src/utility/serialization/scene/common.js +222 -0
  350. package/dist/src/utility/serialization/scene/common.js.map +1 -0
  351. package/dist/src/utility/serialization/scene/light.js +575 -0
  352. package/dist/src/utility/serialization/scene/light.js.map +1 -0
  353. package/dist/src/utility/serialization/scene/material.js +1111 -0
  354. package/dist/src/utility/serialization/scene/material.js.map +1 -0
  355. package/dist/src/utility/serialization/scene/mesh.js +148 -0
  356. package/dist/src/utility/serialization/scene/mesh.js.map +1 -0
  357. package/dist/src/utility/serialization/scene/misc.js +39 -0
  358. package/dist/src/utility/serialization/scene/misc.js.map +1 -0
  359. package/dist/src/utility/serialization/scene/node.js +451 -0
  360. package/dist/src/utility/serialization/scene/node.js.map +1 -0
  361. package/dist/src/utility/serialization/scene/particle.js +425 -0
  362. package/dist/src/utility/serialization/scene/particle.js.map +1 -0
  363. package/dist/src/utility/serialization/scene/primitive.js +692 -0
  364. package/dist/src/utility/serialization/scene/primitive.js.map +1 -0
  365. package/dist/src/utility/serialization/scene/scene.js +704 -0
  366. package/dist/src/utility/serialization/scene/scene.js.map +1 -0
  367. package/dist/src/utility/serialization/scene/terrain.js +488 -0
  368. package/dist/src/utility/serialization/scene/terrain.js.map +1 -0
  369. package/dist/src/utility/serialization/scene/water.js +465 -0
  370. package/dist/src/utility/serialization/scene/water.js.map +1 -0
  371. package/dist/src/utility/shprojector.js +297 -0
  372. package/dist/src/utility/shprojector.js.map +1 -0
  373. package/dist/src/utility/textures/ggxlut.js +213 -0
  374. package/dist/src/utility/textures/ggxlut.js.map +1 -0
  375. package/dist/src/utility/textures/gradientnoise.js +62 -0
  376. package/dist/src/utility/textures/gradientnoise.js.map +1 -0
  377. package/dist/src/utility/textures/randomnoise.js +41 -0
  378. package/dist/src/utility/textures/randomnoise.js.map +1 -0
  379. package/dist/src/values.js +162 -0
  380. package/dist/src/values.js.map +1 -0
  381. package/dist/utility/blueprint/material/common.js +7 -0
  382. package/dist/utility/blueprint/material/common.js.map +1 -0
  383. package/dist/utility/blueprint/material/ir.js +489 -489
  384. package/dist/utility/blueprint/material/ir.js.map +1 -1
  385. package/dist/utility/serialization/blueprint/constants.js +255 -0
  386. package/dist/utility/serialization/blueprint/constants.js.map +1 -0
  387. package/dist/utility/serialization/blueprint/material/constants.js +203 -0
  388. package/dist/utility/serialization/blueprint/material/constants.js.map +1 -0
  389. package/dist/utility/serialization/blueprint/material/texture.js +165 -0
  390. package/dist/utility/serialization/blueprint/material/texture.js.map +1 -0
  391. package/dist/utility/serialization/manager.js +271 -271
  392. package/dist/utility/serialization/manager.js.map +1 -1
  393. package/dist/utility/serialization/scene/animation.js.map +1 -1
  394. package/dist/utility/serialization/scene/camera.js.map +1 -1
  395. package/dist/utility/serialization/scene/common.js.map +1 -1
  396. package/dist/utility/serialization/scene/light.js.map +1 -1
  397. package/dist/utility/serialization/scene/material.js.map +1 -1
  398. package/dist/utility/serialization/scene/mesh.js.map +1 -1
  399. package/dist/utility/serialization/scene/node.js.map +1 -1
  400. package/dist/utility/serialization/scene/particle.js.map +1 -1
  401. package/dist/utility/serialization/scene/primitive.js.map +1 -1
  402. package/dist/utility/serialization/scene/scene.js.map +1 -1
  403. package/dist/utility/serialization/scene/terrain.js.map +1 -1
  404. package/dist/utility/serialization/types.js +4 -4
  405. package/dist/utility/serialization/types.js.map +1 -1
  406. package/dist/values.js +49 -53
  407. package/dist/values.js.map +1 -1
  408. package/package.json +1 -1
  409. package/dist/animation/joint_dynamics/vrm_spring_bone.js +0 -46
  410. package/dist/animation/joint_dynamics/vrm_spring_bone.js.map +0 -1
  411. package/dist/animation/spring/spring_bone.js +0 -240
  412. package/dist/animation/spring/spring_bone.js.map +0 -1
  413. package/dist/animation/spring/spring_bone_collider.js +0 -198
  414. package/dist/animation/spring/spring_bone_collider.js.map +0 -1
  415. package/dist/animation/spring/spring_bone_constraint.js +0 -170
  416. package/dist/animation/spring/spring_bone_constraint.js.map +0 -1
  417. package/dist/animation/spring/spring_bone_system.js +0 -328
  418. package/dist/animation/spring/spring_bone_system.js.map +0 -1
  419. package/dist/render/sky_motion_vector.js +0 -85
  420. package/dist/render/sky_motion_vector.js.map +0 -1
@@ -0,0 +1,297 @@
1
+ import { Application } from '../app/app.js';
2
+ import { Primitive } from '../render/primitive.js';
3
+ import { DRef, Vector4 } from '@zephyr3d/base';
4
+ import { fetchSampler } from './misc.js';
5
+
6
+ /**
7
+ * CubemapSHProjector is responsible for projecting a cubemap texture into spherical harmonics (SH) coefficients.
8
+ * This is commonly used for efficient environment lighting approximation in real-time rendering.
9
+ *
10
+ * The class uses Monte Carlo sampling to compute the first 9 spherical harmonics coefficients (up to order 2)
11
+ * from a cubemap texture, which can then be used for ambient lighting calculations.
12
+ *
13
+ * @example
14
+ * ```typescript
15
+ * const projector = new CubemapSHProjector(10000);
16
+ * const shBuffer = device.createBuffer(4 * 4 * 9, { usage: 'uniform' });
17
+ * projector.projectCubemap(environmentCubemap, shBuffer);
18
+ * // shBuffer now contains the 9 SH coefficients as RGB values
19
+ * projector.dispose();
20
+ * ```
21
+ *
22
+ * @public
23
+ */ class CubemapSHProjector {
24
+ static _programInst = null;
25
+ static _bindGroupInst = null;
26
+ static _renderStats = null;
27
+ _primitive;
28
+ _renderTarget;
29
+ _numSamples;
30
+ /**
31
+ * Creates a new CubemapSHProjector instance.
32
+ *
33
+ * @param numSamples - Number of Monte Carlo samples to use for SH projection.
34
+ * Higher values provide better accuracy but slower computation.
35
+ * Default is 10000.
36
+ */ constructor(numSamples = 10000){
37
+ this._numSamples = numSamples;
38
+ this._primitive = new DRef();
39
+ this._renderTarget = new DRef();
40
+ }
41
+ /**
42
+ * Disposes of all resources allocated by this projector instance.
43
+ * Should be called when the projector is no longer needed to prevent memory leaks.
44
+ */ dispose() {
45
+ this._primitive.dispose();
46
+ if (this._renderTarget.get()) {
47
+ this._renderTarget.get().getColorAttachments()[0].dispose();
48
+ this._renderTarget.dispose();
49
+ }
50
+ }
51
+ /**
52
+ * Projects a cubemap texture into spherical harmonics coefficients and stores them in a GPUBuffer.
53
+ *
54
+ * The method performs Monte Carlo integration over the sphere to compute the first 9 SH coefficients.
55
+ * The results are written to a 3x3 render target where each pixel contains RGB values for one SH coefficient.
56
+ * The layout is:
57
+ * - (0,0): Y₀₀ (0,1): Y₁₋₁ (0,2): Y₁₀
58
+ * - (1,0): Y₁₁ (1,1): Y₂₋₂ (1,2): Y₂₋₁
59
+ * - (2,0): Y₂₀ (2,1): Y₂₁ (2,2): Y₂₂
60
+ *
61
+ * @param cubemap - The input cubemap texture to project
62
+ * @param outBuffer - GPU data buffer to receive the computed SH coefficients.
63
+ * Must be large enough to hold 9 RGB values (36 floats for RGBA32F format).
64
+ *
65
+ * @example
66
+ * ```typescript
67
+ * const shBuffer = device.createDataBuffer(9 * 4 * 4); // 9 coefficients * 4 components * 4 bytes
68
+ * projector.projectCubemap(environmentMap, shBuffer);
69
+ * ```
70
+ */ projectCubemap(cubemap, outBuffer) {
71
+ this.projectCubemapToTexture(cubemap, this._renderTarget.get());
72
+ this._renderTarget.get().getColorAttachments()[0].readPixelsToBuffer(0, 0, 3, 3, 0, 0, outBuffer);
73
+ }
74
+ /**
75
+ * Projects a cubemap texture into spherical harmonics coefficients and stores them in a 3x3 texture.
76
+ *
77
+ * The method performs Monte Carlo integration over the sphere to compute the first 9 SH coefficients.
78
+ * The results are written to a 3x3 render target where each pixel contains RGB values for one SH coefficient.
79
+ * The layout is:
80
+ * - (0,0): Y₀₀ (0,1): Y₁₋₁ (0,2): Y₁₀
81
+ * - (1,0): Y₁₁ (1,1): Y₂₋₂ (1,2): Y₂₋₁
82
+ * - (2,0): Y₂₀ (2,1): Y₂₁ (2,2): Y₂₂
83
+ *
84
+ * @param cubemap - The input cubemap texture to project
85
+ * @param outFramebuffer - Framebuffer that contains the 3x3 texture to receive the computed SH coefficients in color attachment slot 0.
86
+ *
87
+ * @example
88
+ * ```typescript
89
+ * const shTexture = device.createTexture2D('rgba32f', 3, 3); // 9 coefficients * 4 components * 4 bytes
90
+ * const shFramebuffer = device.createFrameBuffer([shTexture], null);
91
+ * projector.projectCubemapToTexture(environmentMap, shFramebuffer);
92
+ * ```
93
+ */ projectCubemapToTexture(cubemap, framebuffer) {
94
+ const device = Application.instance.device;
95
+ const clearColor = new Vector4(0, 0, 0, 1);
96
+ this.init(device);
97
+ device.pushDeviceStates();
98
+ device.setRenderStates(CubemapSHProjector._renderStats);
99
+ device.setProgram(CubemapSHProjector._programInst);
100
+ device.setFramebuffer(framebuffer);
101
+ device.clearFrameBuffer(clearColor, null, null);
102
+ const bindGroup = CubemapSHProjector._bindGroupInst;
103
+ bindGroup.setTexture('cubemap', cubemap, fetchSampler('clamp_linear_nomip'));
104
+ device.setBindGroup(0, bindGroup);
105
+ this._primitive.get().drawInstanced(9);
106
+ device.popDeviceStates();
107
+ }
108
+ /**
109
+ * Initializes the GPU resources needed for SH projection.
110
+ * This method is called automatically by projectCubemap() and sets up:
111
+ * - Sample directions primitive (Monte Carlo samples on unit sphere)
112
+ * - Render target (3x3 RGBA32F texture)
113
+ * - Render states (additive blending, no depth test)
114
+ * - GPU program for SH evaluation
115
+ *
116
+ * @param device - The graphics device to create resources with
117
+ * @internal
118
+ */ init(device) {
119
+ if (!this._primitive.get()) {
120
+ const samples = new Float32Array(this._numSamples * 4);
121
+ for(let i = 0; i < this._numSamples; i++){
122
+ let x1, x2, s;
123
+ do {
124
+ x1 = Math.random() * 2 - 1;
125
+ x2 = Math.random() * 2 - 1;
126
+ s = x1 * x1 + x2 * x2;
127
+ }while (s >= 1)
128
+ const sqrtS = Math.sqrt(1 - s);
129
+ samples[i * 4 + 0] = 2 * x1 * sqrtS;
130
+ samples[i * 4 + 1] = 2 * x2 * sqrtS;
131
+ samples[i * 4 + 2] = 1 - 2 * s;
132
+ samples[i * 4 + 3] = 4 * Math.PI / this._numSamples;
133
+ }
134
+ const primitive = new Primitive();
135
+ primitive.createAndSetVertexBuffer('position_f32x4', samples);
136
+ if (device.type === 'webgl') {
137
+ primitive.createAndSetVertexBuffer('tex0_f32', new Float32Array([
138
+ 0,
139
+ 1,
140
+ 2,
141
+ 3,
142
+ 4,
143
+ 5,
144
+ 6,
145
+ 7,
146
+ 8
147
+ ]), 'instance');
148
+ }
149
+ primitive.indexCount = this._numSamples;
150
+ primitive.indexStart = 0;
151
+ primitive.primitiveType = 'point-list';
152
+ this._primitive.set(primitive);
153
+ }
154
+ if (!this._renderTarget.get()) {
155
+ const texture = device.createTexture2D('rgba32f', 3, 3, {
156
+ samplerOptions: {
157
+ mipFilter: 'none'
158
+ }
159
+ });
160
+ this._renderTarget.set(device.createFrameBuffer([
161
+ texture
162
+ ], null));
163
+ }
164
+ if (!CubemapSHProjector._renderStats) {
165
+ CubemapSHProjector._renderStats = device.createRenderStateSet();
166
+ CubemapSHProjector._renderStats.useDepthState().enableTest(false).enableWrite(false);
167
+ CubemapSHProjector._renderStats.useBlendingState().enable(true).setBlendEquation('add', 'add').setBlendFuncRGB('one', 'one').setBlendFuncAlpha('zero', 'one');
168
+ CubemapSHProjector._renderStats.useRasterizerState().setCullMode('none');
169
+ }
170
+ if (!CubemapSHProjector._programInst) {
171
+ CubemapSHProjector._programInst = CubemapSHProjector._createProgram(device);
172
+ CubemapSHProjector._bindGroupInst = device.createBindGroup(CubemapSHProjector._programInst.bindGroupLayouts[0]);
173
+ }
174
+ }
175
+ /**
176
+ * Creates the GPU program for spherical harmonics evaluation.
177
+ *
178
+ * The vertex shader uses instanced rendering to generate 9 instances (one per SH coefficient).
179
+ * Each instance renders all sample points, but the vertex shader maps them to different
180
+ * pixels in the 3x3 output texture based on the instance ID.
181
+ *
182
+ * The fragment shader evaluates the appropriate SH basis function based on the pixel location,
183
+ * samples the cubemap in the sample direction, and multiplies by the integration weight.
184
+ *
185
+ * @param device - The graphics device to create the program with
186
+ * @returns The compiled GPU program
187
+ * @internal
188
+ */ static _createProgram(device) {
189
+ return device.buildRenderProgram({
190
+ vertex (pb) {
191
+ this.$inputs.directionWeight = pb.vec4().attrib('position');
192
+ if (device.type === 'webgl') {
193
+ this.$inputs.instanceId = pb.float().attrib('texCoord0');
194
+ }
195
+ pb.main(function() {
196
+ this.$outputs.direction = this.$inputs.directionWeight.xyz;
197
+ this.$outputs.weight = this.$inputs.directionWeight.w;
198
+ if (pb.getDevice().type !== 'webgpu') {
199
+ this.$builtins.pointSize = 1;
200
+ }
201
+ this.$outputs.shIndex = device.type === 'webgl' ? this.$inputs.instanceId : pb.int(this.$builtins.instanceIndex);
202
+ this.$l.x = pb.mod(this.$outputs.shIndex, 3);
203
+ this.$l.y = pb.div(this.$outputs.shIndex, 3);
204
+ this.$l.ndcX = pb.sub(pb.div(pb.add(pb.float(this.x), 0.5), 1.5), 1);
205
+ this.$l.ndcY = pb.sub(pb.div(pb.add(pb.float(this.y), 0.5), 1.5), 1);
206
+ this.$l.$builtins.position = pb.vec4(this.ndcX, this.ndcY, 0, 1);
207
+ if (pb.getDevice().type === 'webgpu') {
208
+ this.$builtins.position = pb.mul(this.$builtins.position, pb.vec4(1, -1, 1, 1));
209
+ }
210
+ });
211
+ },
212
+ fragment (pb) {
213
+ this.$outputs.color = pb.vec4();
214
+ this.cubemap = pb.texCube().uniform(0);
215
+ pb.func('Y0', [
216
+ pb.vec3('v')
217
+ ], function() {
218
+ this.$return(0.282094791773878);
219
+ });
220
+ pb.func('Y1', [
221
+ pb.vec3('v')
222
+ ], function() {
223
+ this.$return(pb.mul(this.v.y, -0.4886025119));
224
+ });
225
+ pb.func('Y2', [
226
+ pb.vec3('v')
227
+ ], function() {
228
+ this.$return(pb.mul(this.v.z, 0.4886025119));
229
+ });
230
+ pb.func('Y3', [
231
+ pb.vec3('v')
232
+ ], function() {
233
+ this.$return(pb.mul(this.v.x, -0.4886025119));
234
+ });
235
+ pb.func('Y4', [
236
+ pb.vec3('v')
237
+ ], function() {
238
+ this.$return(pb.mul(this.v.x, this.v.y, 1.0925484306));
239
+ });
240
+ pb.func('Y5', [
241
+ pb.vec3('v')
242
+ ], function() {
243
+ this.$return(pb.mul(this.v.y, this.v.z, -1.0925484306));
244
+ });
245
+ pb.func('Y6', [
246
+ pb.vec3('v')
247
+ ], function() {
248
+ this.$return(pb.mul(pb.sub(pb.mul(this.v.z, this.v.z, 3), 1), 0.3153915652));
249
+ });
250
+ pb.func('Y7', [
251
+ pb.vec3('v')
252
+ ], function() {
253
+ this.$return(pb.mul(this.v.x, this.v.z, -1.0925484306));
254
+ });
255
+ pb.func('Y8', [
256
+ pb.vec3('v')
257
+ ], function() {
258
+ this.$return(pb.mul(pb.sub(pb.mul(this.v.x, this.v.x), pb.mul(this.v.y, this.v.y)), 0.5462742153));
259
+ });
260
+ pb.func('evalBasis', [
261
+ pb.vec3('dir'),
262
+ pb.int('c')
263
+ ], function() {
264
+ this.$if(pb.equal(this.c, 0), function() {
265
+ this.$return(this.Y0(this.dir));
266
+ }).$elseif(pb.equal(this.c, 1), function() {
267
+ this.$return(this.Y1(this.dir));
268
+ }).$elseif(pb.equal(this.c, 2), function() {
269
+ this.$return(this.Y2(this.dir));
270
+ }).$elseif(pb.equal(this.c, 3), function() {
271
+ this.$return(this.Y3(this.dir));
272
+ }).$elseif(pb.equal(this.c, 4), function() {
273
+ this.$return(this.Y4(this.dir));
274
+ }).$elseif(pb.equal(this.c, 5), function() {
275
+ this.$return(this.Y5(this.dir));
276
+ }).$elseif(pb.equal(this.c, 6), function() {
277
+ this.$return(this.Y6(this.dir));
278
+ }).$elseif(pb.equal(this.c, 7), function() {
279
+ this.$return(this.Y7(this.dir));
280
+ }).$elseif(pb.equal(this.c, 8), function() {
281
+ this.$return(this.Y8(this.dir));
282
+ }).$else(function() {
283
+ this.$return(0);
284
+ });
285
+ });
286
+ pb.main(function() {
287
+ this.$l.radiance = pb.textureSampleLevel(this.cubemap, this.$inputs.direction, 0).rgb;
288
+ this.$l.sh = this.evalBasis(this.$inputs.direction, pb.getDevice().type === 'webgl' ? pb.int(this.$inputs.shIndex) : this.$inputs.shIndex);
289
+ this.$outputs.color = pb.vec4(pb.mul(this.radiance, this.sh, this.$inputs.weight), 1);
290
+ });
291
+ }
292
+ });
293
+ }
294
+ }
295
+
296
+ export { CubemapSHProjector };
297
+ //# sourceMappingURL=shprojector.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shprojector.js","sources":["../../../src/utility/shprojector.ts"],"sourcesContent":["import type {\r\n AbstractDevice,\r\n BindGroup,\r\n FrameBuffer,\r\n GPUDataBuffer,\r\n GPUProgram,\r\n RenderStateSet,\r\n TextureCube\r\n} from '@zephyr3d/device';\r\nimport { Application } from '../app';\r\nimport { Primitive } from '../render/primitive';\r\nimport { DRef, Vector4 } from '@zephyr3d/base';\r\nimport { fetchSampler } from './misc';\r\n\r\n/**\r\n * CubemapSHProjector is responsible for projecting a cubemap texture into spherical harmonics (SH) coefficients.\r\n * This is commonly used for efficient environment lighting approximation in real-time rendering.\r\n *\r\n * The class uses Monte Carlo sampling to compute the first 9 spherical harmonics coefficients (up to order 2)\r\n * from a cubemap texture, which can then be used for ambient lighting calculations.\r\n *\r\n * @example\r\n * ```typescript\r\n * const projector = new CubemapSHProjector(10000);\r\n * const shBuffer = device.createBuffer(4 * 4 * 9, { usage: 'uniform' });\r\n * projector.projectCubemap(environmentCubemap, shBuffer);\r\n * // shBuffer now contains the 9 SH coefficients as RGB values\r\n * projector.dispose();\r\n * ```\r\n *\r\n * @public\r\n */\r\nexport class CubemapSHProjector {\r\n private static _programInst: GPUProgram = null;\r\n private static _bindGroupInst: BindGroup = null;\r\n private static _renderStats: RenderStateSet = null;\r\n private readonly _primitive: DRef<Primitive>;\r\n private readonly _renderTarget: DRef<FrameBuffer>;\r\n private readonly _numSamples: number;\r\n /**\r\n * Creates a new CubemapSHProjector instance.\r\n *\r\n * @param numSamples - Number of Monte Carlo samples to use for SH projection.\r\n * Higher values provide better accuracy but slower computation.\r\n * Default is 10000.\r\n */\r\n constructor(numSamples = 10000) {\r\n this._numSamples = numSamples;\r\n this._primitive = new DRef();\r\n this._renderTarget = new DRef();\r\n }\r\n /**\r\n * Disposes of all resources allocated by this projector instance.\r\n * Should be called when the projector is no longer needed to prevent memory leaks.\r\n */\r\n dispose() {\r\n this._primitive.dispose();\r\n if (this._renderTarget.get()) {\r\n this._renderTarget.get().getColorAttachments()[0].dispose();\r\n this._renderTarget.dispose();\r\n }\r\n }\r\n /**\r\n * Projects a cubemap texture into spherical harmonics coefficients and stores them in a GPUBuffer.\r\n *\r\n * The method performs Monte Carlo integration over the sphere to compute the first 9 SH coefficients.\r\n * The results are written to a 3x3 render target where each pixel contains RGB values for one SH coefficient.\r\n * The layout is:\r\n * - (0,0): Y₀₀ (0,1): Y₁₋₁ (0,2): Y₁₀\r\n * - (1,0): Y₁₁ (1,1): Y₂₋₂ (1,2): Y₂₋₁\r\n * - (2,0): Y₂₀ (2,1): Y₂₁ (2,2): Y₂₂\r\n *\r\n * @param cubemap - The input cubemap texture to project\r\n * @param outBuffer - GPU data buffer to receive the computed SH coefficients.\r\n * Must be large enough to hold 9 RGB values (36 floats for RGBA32F format).\r\n *\r\n * @example\r\n * ```typescript\r\n * const shBuffer = device.createDataBuffer(9 * 4 * 4); // 9 coefficients * 4 components * 4 bytes\r\n * projector.projectCubemap(environmentMap, shBuffer);\r\n * ```\r\n */\r\n projectCubemap(cubemap: TextureCube, outBuffer: GPUDataBuffer) {\r\n this.projectCubemapToTexture(cubemap, this._renderTarget.get());\r\n this._renderTarget.get().getColorAttachments()[0].readPixelsToBuffer(0, 0, 3, 3, 0, 0, outBuffer);\r\n }\r\n /**\r\n * Projects a cubemap texture into spherical harmonics coefficients and stores them in a 3x3 texture.\r\n *\r\n * The method performs Monte Carlo integration over the sphere to compute the first 9 SH coefficients.\r\n * The results are written to a 3x3 render target where each pixel contains RGB values for one SH coefficient.\r\n * The layout is:\r\n * - (0,0): Y₀₀ (0,1): Y₁₋₁ (0,2): Y₁₀\r\n * - (1,0): Y₁₁ (1,1): Y₂₋₂ (1,2): Y₂₋₁\r\n * - (2,0): Y₂₀ (2,1): Y₂₁ (2,2): Y₂₂\r\n *\r\n * @param cubemap - The input cubemap texture to project\r\n * @param outFramebuffer - Framebuffer that contains the 3x3 texture to receive the computed SH coefficients in color attachment slot 0.\r\n *\r\n * @example\r\n * ```typescript\r\n * const shTexture = device.createTexture2D('rgba32f', 3, 3); // 9 coefficients * 4 components * 4 bytes\r\n * const shFramebuffer = device.createFrameBuffer([shTexture], null);\r\n * projector.projectCubemapToTexture(environmentMap, shFramebuffer);\r\n * ```\r\n */\r\n projectCubemapToTexture(cubemap: TextureCube, framebuffer: FrameBuffer) {\r\n const device = Application.instance.device;\r\n const clearColor = new Vector4(0, 0, 0, 1);\r\n this.init(device);\r\n device.pushDeviceStates();\r\n device.setRenderStates(CubemapSHProjector._renderStats);\r\n device.setProgram(CubemapSHProjector._programInst);\r\n device.setFramebuffer(framebuffer);\r\n device.clearFrameBuffer(clearColor, null, null);\r\n const bindGroup = CubemapSHProjector._bindGroupInst;\r\n bindGroup.setTexture('cubemap', cubemap, fetchSampler('clamp_linear_nomip'));\r\n device.setBindGroup(0, bindGroup);\r\n this._primitive.get().drawInstanced(9);\r\n device.popDeviceStates();\r\n }\r\n /**\r\n * Initializes the GPU resources needed for SH projection.\r\n * This method is called automatically by projectCubemap() and sets up:\r\n * - Sample directions primitive (Monte Carlo samples on unit sphere)\r\n * - Render target (3x3 RGBA32F texture)\r\n * - Render states (additive blending, no depth test)\r\n * - GPU program for SH evaluation\r\n *\r\n * @param device - The graphics device to create resources with\r\n * @internal\r\n */\r\n private init(device: AbstractDevice) {\r\n if (!this._primitive.get()) {\r\n const samples = new Float32Array(this._numSamples * 4);\r\n for (let i = 0; i < this._numSamples; i++) {\r\n let x1: number, x2: number, s: number;\r\n do {\r\n x1 = Math.random() * 2 - 1;\r\n x2 = Math.random() * 2 - 1;\r\n s = x1 * x1 + x2 * x2;\r\n } while (s >= 1);\r\n const sqrtS = Math.sqrt(1 - s);\r\n samples[i * 4 + 0] = 2 * x1 * sqrtS;\r\n samples[i * 4 + 1] = 2 * x2 * sqrtS;\r\n samples[i * 4 + 2] = 1 - 2 * s;\r\n samples[i * 4 + 3] = (4 * Math.PI) / this._numSamples;\r\n }\r\n const primitive = new Primitive();\r\n primitive.createAndSetVertexBuffer('position_f32x4', samples);\r\n if (device.type === 'webgl') {\r\n primitive.createAndSetVertexBuffer(\r\n 'tex0_f32',\r\n new Float32Array([0, 1, 2, 3, 4, 5, 6, 7, 8]),\r\n 'instance'\r\n );\r\n }\r\n primitive.indexCount = this._numSamples;\r\n primitive.indexStart = 0;\r\n primitive.primitiveType = 'point-list';\r\n this._primitive.set(primitive);\r\n }\r\n\r\n if (!this._renderTarget.get()) {\r\n const texture = device.createTexture2D('rgba32f', 3, 3, {\r\n samplerOptions: { mipFilter: 'none' }\r\n });\r\n this._renderTarget.set(device.createFrameBuffer([texture], null));\r\n }\r\n\r\n if (!CubemapSHProjector._renderStats) {\r\n CubemapSHProjector._renderStats = device.createRenderStateSet();\r\n CubemapSHProjector._renderStats.useDepthState().enableTest(false).enableWrite(false);\r\n CubemapSHProjector._renderStats\r\n .useBlendingState()\r\n .enable(true)\r\n .setBlendEquation('add', 'add')\r\n .setBlendFuncRGB('one', 'one')\r\n .setBlendFuncAlpha('zero', 'one');\r\n CubemapSHProjector._renderStats.useRasterizerState().setCullMode('none');\r\n }\r\n\r\n if (!CubemapSHProjector._programInst) {\r\n CubemapSHProjector._programInst = CubemapSHProjector._createProgram(device);\r\n CubemapSHProjector._bindGroupInst = device.createBindGroup(\r\n CubemapSHProjector._programInst.bindGroupLayouts[0]\r\n );\r\n }\r\n }\r\n /**\r\n * Creates the GPU program for spherical harmonics evaluation.\r\n *\r\n * The vertex shader uses instanced rendering to generate 9 instances (one per SH coefficient).\r\n * Each instance renders all sample points, but the vertex shader maps them to different\r\n * pixels in the 3x3 output texture based on the instance ID.\r\n *\r\n * The fragment shader evaluates the appropriate SH basis function based on the pixel location,\r\n * samples the cubemap in the sample direction, and multiplies by the integration weight.\r\n *\r\n * @param device - The graphics device to create the program with\r\n * @returns The compiled GPU program\r\n * @internal\r\n */\r\n private static _createProgram(device: AbstractDevice) {\r\n return device.buildRenderProgram({\r\n vertex(pb) {\r\n this.$inputs.directionWeight = pb.vec4().attrib('position');\r\n if (device.type === 'webgl') {\r\n this.$inputs.instanceId = pb.float().attrib('texCoord0');\r\n }\r\n pb.main(function () {\r\n this.$outputs.direction = this.$inputs.directionWeight.xyz;\r\n this.$outputs.weight = this.$inputs.directionWeight.w;\r\n if (pb.getDevice().type !== 'webgpu') {\r\n this.$builtins.pointSize = 1;\r\n }\r\n this.$outputs.shIndex =\r\n device.type === 'webgl' ? this.$inputs.instanceId : pb.int(this.$builtins.instanceIndex);\r\n this.$l.x = pb.mod(this.$outputs.shIndex, 3);\r\n this.$l.y = pb.div(this.$outputs.shIndex, 3);\r\n this.$l.ndcX = pb.sub(pb.div(pb.add(pb.float(this.x), 0.5), 1.5), 1);\r\n this.$l.ndcY = pb.sub(pb.div(pb.add(pb.float(this.y), 0.5), 1.5), 1);\r\n this.$l.$builtins.position = pb.vec4(this.ndcX, this.ndcY, 0, 1);\r\n if (pb.getDevice().type === 'webgpu') {\r\n this.$builtins.position = pb.mul(this.$builtins.position, pb.vec4(1, -1, 1, 1));\r\n }\r\n });\r\n },\r\n fragment(pb) {\r\n this.$outputs.color = pb.vec4();\r\n this.cubemap = pb.texCube().uniform(0);\r\n pb.func('Y0', [pb.vec3('v')], function () {\r\n this.$return(0.282094791773878);\r\n });\r\n pb.func('Y1', [pb.vec3('v')], function () {\r\n this.$return(pb.mul(this.v.y, -0.4886025119));\r\n });\r\n pb.func('Y2', [pb.vec3('v')], function () {\r\n this.$return(pb.mul(this.v.z, 0.4886025119));\r\n });\r\n pb.func('Y3', [pb.vec3('v')], function () {\r\n this.$return(pb.mul(this.v.x, -0.4886025119));\r\n });\r\n pb.func('Y4', [pb.vec3('v')], function () {\r\n this.$return(pb.mul(this.v.x, this.v.y, 1.0925484306));\r\n });\r\n pb.func('Y5', [pb.vec3('v')], function () {\r\n this.$return(pb.mul(this.v.y, this.v.z, -1.0925484306));\r\n });\r\n pb.func('Y6', [pb.vec3('v')], function () {\r\n this.$return(pb.mul(pb.sub(pb.mul(this.v.z, this.v.z, 3), 1), 0.3153915652));\r\n });\r\n pb.func('Y7', [pb.vec3('v')], function () {\r\n this.$return(pb.mul(this.v.x, this.v.z, -1.0925484306));\r\n });\r\n pb.func('Y8', [pb.vec3('v')], function () {\r\n this.$return(pb.mul(pb.sub(pb.mul(this.v.x, this.v.x), pb.mul(this.v.y, this.v.y)), 0.5462742153));\r\n });\r\n pb.func('evalBasis', [pb.vec3('dir'), pb.int('c')], function () {\r\n this.$if(pb.equal(this.c, 0), function () {\r\n this.$return(this.Y0(this.dir));\r\n })\r\n .$elseif(pb.equal(this.c, 1), function () {\r\n this.$return(this.Y1(this.dir));\r\n })\r\n .$elseif(pb.equal(this.c, 2), function () {\r\n this.$return(this.Y2(this.dir));\r\n })\r\n .$elseif(pb.equal(this.c, 3), function () {\r\n this.$return(this.Y3(this.dir));\r\n })\r\n .$elseif(pb.equal(this.c, 4), function () {\r\n this.$return(this.Y4(this.dir));\r\n })\r\n .$elseif(pb.equal(this.c, 5), function () {\r\n this.$return(this.Y5(this.dir));\r\n })\r\n .$elseif(pb.equal(this.c, 6), function () {\r\n this.$return(this.Y6(this.dir));\r\n })\r\n .$elseif(pb.equal(this.c, 7), function () {\r\n this.$return(this.Y7(this.dir));\r\n })\r\n .$elseif(pb.equal(this.c, 8), function () {\r\n this.$return(this.Y8(this.dir));\r\n })\r\n .$else(function () {\r\n this.$return(0);\r\n });\r\n });\r\n pb.main(function () {\r\n this.$l.radiance = pb.textureSampleLevel(this.cubemap, this.$inputs.direction, 0).rgb;\r\n this.$l.sh = this.evalBasis(\r\n this.$inputs.direction,\r\n pb.getDevice().type === 'webgl' ? pb.int(this.$inputs.shIndex) : this.$inputs.shIndex\r\n );\r\n this.$outputs.color = pb.vec4(pb.mul(this.radiance, this.sh, this.$inputs.weight), 1);\r\n });\r\n }\r\n });\r\n }\r\n}\r\n"],"names":["CubemapSHProjector","_programInst","_bindGroupInst","_renderStats","_primitive","_renderTarget","_numSamples","numSamples","DRef","dispose","get","getColorAttachments","projectCubemap","cubemap","outBuffer","projectCubemapToTexture","readPixelsToBuffer","framebuffer","device","Application","instance","clearColor","Vector4","init","pushDeviceStates","setRenderStates","setProgram","setFramebuffer","clearFrameBuffer","bindGroup","setTexture","fetchSampler","setBindGroup","drawInstanced","popDeviceStates","samples","Float32Array","i","x1","x2","s","Math","random","sqrtS","sqrt","PI","primitive","Primitive","createAndSetVertexBuffer","type","indexCount","indexStart","primitiveType","set","texture","createTexture2D","samplerOptions","mipFilter","createFrameBuffer","createRenderStateSet","useDepthState","enableTest","enableWrite","useBlendingState","enable","setBlendEquation","setBlendFuncRGB","setBlendFuncAlpha","useRasterizerState","setCullMode","_createProgram","createBindGroup","bindGroupLayouts","buildRenderProgram","vertex","pb","$inputs","directionWeight","vec4","attrib","instanceId","float","main","$outputs","direction","xyz","weight","w","getDevice","$builtins","pointSize","shIndex","int","instanceIndex","$l","x","mod","y","div","ndcX","sub","add","ndcY","position","mul","fragment","color","texCube","uniform","func","vec3","$return","v","z","$if","equal","c","Y0","dir","$elseif","Y1","Y2","Y3","Y4","Y5","Y6","Y7","Y8","$else","radiance","textureSampleLevel","rgb","sh","evalBasis"],"mappings":"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"}
@@ -0,0 +1,213 @@
1
+ import { Application } from '../../app/app.js';
2
+
3
+ const ggxLut = new Map();
4
+ function getGGXLUT(size) {
5
+ let lut = ggxLut.get(size);
6
+ if (!lut) {
7
+ lut = createGGXLUT(size);
8
+ ggxLut.set(size, lut);
9
+ }
10
+ return lut;
11
+ }
12
+ function createGGXLUT(size) {
13
+ const device = Application.instance.device;
14
+ const program = device.buildRenderProgram({
15
+ vertex (pb) {
16
+ this.$inputs.pos = pb.vec2().attrib('position');
17
+ this.$outputs.uv = pb.vec2();
18
+ pb.main(function() {
19
+ this.$builtins.position = pb.vec4(this.$inputs.pos, 0, 1);
20
+ this.$outputs.uv = pb.add(pb.mul(this.$inputs.pos.xy, 0.5), pb.vec2(0.5));
21
+ if (device.type === 'webgpu') {
22
+ this.$builtins.position.y = pb.neg(this.$builtins.position.y);
23
+ }
24
+ });
25
+ },
26
+ fragment (pb) {
27
+ this.$outputs.color = pb.vec4();
28
+ const SAMPLE_COUNT = 1024;
29
+ if (device.type === 'webgl') {
30
+ pb.func('radicalInverse_VdC', [
31
+ pb.int('bits')
32
+ ], function() {
33
+ this.$l.rand = pb.float(0);
34
+ this.$l.denom = pb.float(1);
35
+ this.$l.invBase = pb.float(0.5);
36
+ this.$l.n = this.bits;
37
+ this.$for(pb.int('i'), 0, 32, function() {
38
+ this.denom = pb.mul(this.denom, 2);
39
+ this.rand = pb.add(this.rand, pb.div(pb.mod(pb.float(this.n), 2), this.denom));
40
+ this.n = pb.div(this.n, 2);
41
+ this.$if(pb.equal(this.n, 0), function() {
42
+ this.$break();
43
+ });
44
+ });
45
+ this.$return(this.rand);
46
+ });
47
+ pb.func('hammersley2d', [
48
+ pb.int('i'),
49
+ pb.int('N')
50
+ ], function() {
51
+ this.$return(pb.vec2(pb.div(pb.float(this.i), pb.float(this.N)), this.radicalInverse_VdC(this.i)));
52
+ });
53
+ } else {
54
+ pb.func('radicalInverse_VdC', [
55
+ pb.uint('bits')
56
+ ], function() {
57
+ this.$l.n = this.bits;
58
+ this.n = pb.compOr(pb.sal(this.n, 16), pb.sar(this.n, 16));
59
+ this.n = pb.compOr(pb.sal(pb.compAnd(this.n, 0x55555555), 1), pb.sar(pb.compAnd(this.n, 0xaaaaaaaa), 1));
60
+ this.n = pb.compOr(pb.sal(pb.compAnd(this.n, 0x33333333), 2), pb.sar(pb.compAnd(this.n, 0xcccccccc), 2));
61
+ this.n = pb.compOr(pb.sal(pb.compAnd(this.n, 0x0f0f0f0f), 4), pb.sar(pb.compAnd(this.n, 0xf0f0f0f0), 4));
62
+ this.n = pb.compOr(pb.sal(pb.compAnd(this.n, 0x00ff00ff), 8), pb.sar(pb.compAnd(this.n, 0xff00ff00), 8));
63
+ this.$return(pb.mul(pb.float(this.n), 2.3283064365386963e-10));
64
+ });
65
+ pb.func('hammersley2d', [
66
+ pb.int('i'),
67
+ pb.int('N')
68
+ ], function() {
69
+ this.$return(pb.vec2(pb.div(pb.float(this.i), pb.float(this.N)), this.radicalInverse_VdC(pb.uint(this.i))));
70
+ });
71
+ }
72
+ pb.func('generateTBN', [
73
+ pb.vec3('normal')
74
+ ], function() {
75
+ this.$l.bitangent = pb.vec3(0, 1, 0);
76
+ this.$l.NoU = this.normal.y;
77
+ this.$l.epsl = 0.0000001;
78
+ this.$if(pb.lessThanEqual(pb.sub(1, pb.abs(this.normal.y)), this.epsl), function() {
79
+ this.bitangent = this.$choice(pb.greaterThan(this.normal.y, 0), pb.vec3(0, 0, 1), pb.vec3(0, 0, -1));
80
+ });
81
+ this.$l.tangent = pb.normalize(pb.cross(this.bitangent, this.normal));
82
+ this.bitangent = pb.cross(this.normal, this.tangent);
83
+ this.$return(pb.mat3(this.tangent, this.bitangent, this.normal));
84
+ });
85
+ pb.func('D_Charlie', [
86
+ pb.float('sheenRoughness'),
87
+ pb.float('NdotH')
88
+ ], function() {
89
+ this.$l.roughness = pb.max(this.sheenRoughness, 0.000001);
90
+ this.$l.invR = pb.div(1, this.roughness);
91
+ this.$l.cos2h = pb.mul(this.NdotH, this.NdotH);
92
+ this.$l.sin2h = pb.sub(1, this.cos2h);
93
+ this.$return(pb.div(pb.mul(pb.add(this.invR, 2), pb.pow(this.sin2h, pb.mul(this.invR, 0.5))), Math.PI * 2));
94
+ });
95
+ pb.func('smithGGXCorrelated', [
96
+ pb.float('NoV'),
97
+ pb.float('NoL'),
98
+ pb.float('roughness')
99
+ ], function() {
100
+ this.$l.a2 = pb.mul(this.roughness, this.roughness, this.roughness, this.roughness);
101
+ this.$l.GGXV = pb.mul(this.NoL, pb.sqrt(pb.add(pb.mul(this.NoV, this.NoV, pb.sub(1, this.a2)), this.a2)));
102
+ this.$l.GGXL = pb.mul(this.NoV, pb.sqrt(pb.add(pb.mul(this.NoL, this.NoL, pb.sub(1, this.a2)), this.a2)));
103
+ this.$return(pb.div(0.5, pb.add(this.GGXV, this.GGXL)));
104
+ });
105
+ pb.func('V_Ashikhmin', [
106
+ pb.float('NdotL'),
107
+ pb.float('NdotV')
108
+ ], function() {
109
+ this.$return(pb.clamp(pb.div(1, pb.mul(pb.sub(pb.add(this.NdotL, this.NdotV), pb.mul(this.NdotL, this.NdotV)), 4)), 0, 1));
110
+ });
111
+ pb.func('importanceSample', [
112
+ pb.vec2('xi'),
113
+ pb.vec3('normal'),
114
+ pb.float('roughness'),
115
+ pb.vec3('ggx').out(),
116
+ pb.vec3('charlie').out()
117
+ ], function() {
118
+ this.$l.alphaRoughness = pb.mul(this.roughness, this.roughness);
119
+ this.$l.cosTheta = pb.clamp(pb.sqrt(pb.div(pb.sub(1, this.xi.y), pb.add(1, pb.mul(pb.sub(pb.mul(this.alphaRoughness, this.alphaRoughness), 1), this.xi.y)))), 0, 1);
120
+ this.$l.sinTheta = pb.sqrt(pb.sub(1, pb.mul(this.cosTheta, this.cosTheta)));
121
+ this.$l.phi = pb.mul(this.xi.x, Math.PI * 2);
122
+ this.$l.TBN = this.generateTBN(this.normal);
123
+ this.$l.localSpaceDir = pb.normalize(pb.vec3(pb.mul(this.sinTheta, pb.cos(this.phi)), pb.mul(this.sinTheta, pb.sin(this.phi)), this.cosTheta));
124
+ this.ggx = pb.mul(this.TBN, this.localSpaceDir);
125
+ this.sinTheta = pb.pow(this.xi.y, pb.div(this.alphaRoughness, pb.add(pb.mul(this.alphaRoughness, 2), 1)));
126
+ this.cosTheta = pb.sqrt(pb.sub(1, pb.mul(this.sinTheta, this.sinTheta)));
127
+ this.localSpaceDir = pb.normalize(pb.vec3(pb.mul(this.sinTheta, pb.cos(this.phi)), pb.mul(this.sinTheta, pb.sin(this.phi)), this.cosTheta));
128
+ this.charlie = pb.mul(this.TBN, this.localSpaceDir);
129
+ });
130
+ pb.func('integrateBRDF', [
131
+ pb.float('NoV'),
132
+ pb.float('roughness')
133
+ ], function() {
134
+ this.$l.V = pb.vec3(pb.sub(1, pb.mul(this.NoV, this.NoV)), 0, this.NoV);
135
+ this.$l.a = pb.float(0);
136
+ this.$l.b = pb.float(0);
137
+ this.$l.c = pb.float(0);
138
+ this.$l.n = pb.vec3(0, 0, 1);
139
+ this.$for(pb.int('i'), 0, SAMPLE_COUNT, function() {
140
+ this.$l.xi = this.hammersley2d(this.i, SAMPLE_COUNT);
141
+ this.$l.ggxSample = pb.vec3();
142
+ this.$l.charlieSample = pb.vec3();
143
+ this.importanceSample(this.xi, this.n, this.roughness, this.ggxSample, this.charlieSample);
144
+ this.$l.ggxL = pb.normalize(pb.reflect(pb.neg(this.V), this.ggxSample.xyz));
145
+ this.$l.ggxNoL = pb.clamp(this.ggxL.z, 0, 1);
146
+ this.$l.ggxNoH = pb.clamp(this.ggxSample.z, 0, 1);
147
+ this.$l.ggxVoH = pb.clamp(pb.dot(this.V, this.ggxSample.xyz), 0, 1);
148
+ this.$l.charlieL = pb.normalize(pb.reflect(pb.neg(this.V), this.charlieSample.xyz));
149
+ this.$l.charlieNoL = pb.clamp(this.charlieL.z, 0, 1);
150
+ this.$l.charlieNoH = pb.clamp(this.charlieSample.z, 0, 1);
151
+ this.$l.charlieVoH = pb.clamp(pb.dot(this.V, this.charlieSample.xyz), 0, 1);
152
+ this.$if(pb.greaterThan(this.ggxNoL, 0), function() {
153
+ this.$l.pdf = pb.div(pb.mul(this.smithGGXCorrelated(this.NoV, this.ggxNoL, this.roughness), this.ggxVoH, this.ggxNoL), this.ggxNoH);
154
+ this.$l.Fc = pb.pow(pb.sub(1, this.ggxVoH), 5);
155
+ this.a = pb.add(this.a, pb.mul(pb.sub(1, this.Fc), this.pdf));
156
+ this.b = pb.add(this.b, pb.mul(this.Fc, this.pdf));
157
+ });
158
+ this.$if(pb.greaterThan(this.charlieNoL, 0), function() {
159
+ this.$l.sheenDistribution = this.D_Charlie(this.roughness, this.charlieNoH);
160
+ this.$l.sheenVis = this.V_Ashikhmin(this.charlieNoL, this.NoV);
161
+ this.c = pb.add(this.c, pb.mul(this.sheenVis, this.sheenDistribution, this.charlieNoL, this.charlieVoH));
162
+ });
163
+ });
164
+ this.$return(pb.div(pb.vec3(pb.mul(this.a, 4), pb.mul(this.b, 4), pb.mul(this.c, 8 * Math.PI)), SAMPLE_COUNT));
165
+ });
166
+ pb.main(function() {
167
+ this.$outputs.color = pb.vec4(this.integrateBRDF(this.$inputs.uv.x, this.$inputs.uv.y), 1);
168
+ });
169
+ }
170
+ });
171
+ const vertexLayout = device.createVertexLayout({
172
+ vertexBuffers: [
173
+ {
174
+ buffer: device.createVertexBuffer('position_f32x2', new Float32Array([
175
+ -1,
176
+ -1,
177
+ 1,
178
+ -1,
179
+ -1,
180
+ 1,
181
+ 1,
182
+ 1
183
+ ]))
184
+ }
185
+ ]
186
+ });
187
+ const rs = device.createRenderStateSet();
188
+ rs.useRasterizerState().setCullMode('none');
189
+ rs.useDepthState().enableTest(false).enableWrite(false);
190
+ const tex = device.createTexture2D('rgba8unorm', size, size, {
191
+ samplerOptions: {
192
+ mipFilter: 'none'
193
+ }
194
+ });
195
+ tex.name = 'GGXLUT';
196
+ const fb = device.createFrameBuffer([
197
+ tex
198
+ ], null);
199
+ device.pushDeviceStates();
200
+ device.setProgram(program);
201
+ device.setVertexLayout(vertexLayout);
202
+ device.setRenderStates(rs);
203
+ device.setFramebuffer(fb);
204
+ device.draw('triangle-strip', 0, 4);
205
+ device.popDeviceStates();
206
+ fb.dispose();
207
+ vertexLayout.dispose();
208
+ program.dispose();
209
+ return tex;
210
+ }
211
+
212
+ export { getGGXLUT };
213
+ //# sourceMappingURL=ggxlut.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ggxlut.js","sources":["../../../../src/utility/textures/ggxlut.ts"],"sourcesContent":["import type { Texture2D } from '@zephyr3d/device';\r\nimport { Application } from '../../app';\r\n\r\nconst ggxLut: Map<number, Texture2D> = new Map();\r\nexport function getGGXLUT(size: number): Texture2D {\r\n let lut = ggxLut.get(size);\r\n if (!lut) {\r\n lut = createGGXLUT(size);\r\n ggxLut.set(size, lut);\r\n }\r\n return lut;\r\n}\r\nfunction createGGXLUT(size: number) {\r\n const device = Application.instance.device;\r\n const program = 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.$outputs.color = pb.vec4();\r\n const SAMPLE_COUNT = 1024;\r\n if (device.type === 'webgl') {\r\n pb.func('radicalInverse_VdC', [pb.int('bits')], function () {\r\n this.$l.rand = pb.float(0);\r\n this.$l.denom = pb.float(1);\r\n this.$l.invBase = pb.float(0.5);\r\n this.$l.n = this.bits;\r\n this.$for(pb.int('i'), 0, 32, function () {\r\n this.denom = pb.mul(this.denom, 2);\r\n this.rand = pb.add(this.rand, pb.div(pb.mod(pb.float(this.n), 2), this.denom));\r\n this.n = pb.div(this.n, 2);\r\n this.$if(pb.equal(this.n, 0), function () {\r\n this.$break();\r\n });\r\n });\r\n this.$return(this.rand);\r\n });\r\n pb.func('hammersley2d', [pb.int('i'), pb.int('N')], function () {\r\n this.$return(pb.vec2(pb.div(pb.float(this.i), pb.float(this.N)), this.radicalInverse_VdC(this.i)));\r\n });\r\n } else {\r\n pb.func('radicalInverse_VdC', [pb.uint('bits')], function () {\r\n this.$l.n = this.bits;\r\n this.n = pb.compOr(pb.sal(this.n, 16), pb.sar(this.n, 16));\r\n this.n = pb.compOr(\r\n pb.sal(pb.compAnd(this.n, 0x55555555), 1),\r\n pb.sar(pb.compAnd(this.n, 0xaaaaaaaa), 1)\r\n );\r\n this.n = pb.compOr(\r\n pb.sal(pb.compAnd(this.n, 0x33333333), 2),\r\n pb.sar(pb.compAnd(this.n, 0xcccccccc), 2)\r\n );\r\n this.n = pb.compOr(\r\n pb.sal(pb.compAnd(this.n, 0x0f0f0f0f), 4),\r\n pb.sar(pb.compAnd(this.n, 0xf0f0f0f0), 4)\r\n );\r\n this.n = pb.compOr(\r\n pb.sal(pb.compAnd(this.n, 0x00ff00ff), 8),\r\n pb.sar(pb.compAnd(this.n, 0xff00ff00), 8)\r\n );\r\n this.$return(pb.mul(pb.float(this.n), 2.3283064365386963e-10));\r\n });\r\n pb.func('hammersley2d', [pb.int('i'), pb.int('N')], function () {\r\n this.$return(\r\n pb.vec2(pb.div(pb.float(this.i), pb.float(this.N)), this.radicalInverse_VdC(pb.uint(this.i)))\r\n );\r\n });\r\n }\r\n pb.func('generateTBN', [pb.vec3('normal')], function () {\r\n this.$l.bitangent = pb.vec3(0, 1, 0);\r\n this.$l.NoU = this.normal.y;\r\n this.$l.epsl = 0.0000001;\r\n this.$if(pb.lessThanEqual(pb.sub(1, pb.abs(this.normal.y)), this.epsl), function () {\r\n this.bitangent = this.$choice(\r\n pb.greaterThan(this.normal.y, 0),\r\n pb.vec3(0, 0, 1),\r\n pb.vec3(0, 0, -1)\r\n );\r\n });\r\n this.$l.tangent = pb.normalize(pb.cross(this.bitangent, this.normal));\r\n this.bitangent = pb.cross(this.normal, this.tangent);\r\n this.$return(pb.mat3(this.tangent, this.bitangent, this.normal));\r\n });\r\n pb.func('D_Charlie', [pb.float('sheenRoughness'), pb.float('NdotH')], function () {\r\n this.$l.roughness = pb.max(this.sheenRoughness, 0.000001);\r\n this.$l.invR = pb.div(1, this.roughness);\r\n this.$l.cos2h = pb.mul(this.NdotH, this.NdotH);\r\n this.$l.sin2h = pb.sub(1, this.cos2h);\r\n this.$return(\r\n pb.div(pb.mul(pb.add(this.invR, 2), pb.pow(this.sin2h, pb.mul(this.invR, 0.5))), Math.PI * 2)\r\n );\r\n });\r\n pb.func('smithGGXCorrelated', [pb.float('NoV'), pb.float('NoL'), pb.float('roughness')], function () {\r\n this.$l.a2 = pb.mul(this.roughness, this.roughness, this.roughness, this.roughness);\r\n this.$l.GGXV = pb.mul(\r\n this.NoL,\r\n pb.sqrt(pb.add(pb.mul(this.NoV, this.NoV, pb.sub(1, this.a2)), this.a2))\r\n );\r\n this.$l.GGXL = pb.mul(\r\n this.NoV,\r\n pb.sqrt(pb.add(pb.mul(this.NoL, this.NoL, pb.sub(1, this.a2)), this.a2))\r\n );\r\n this.$return(pb.div(0.5, pb.add(this.GGXV, this.GGXL)));\r\n });\r\n pb.func('V_Ashikhmin', [pb.float('NdotL'), pb.float('NdotV')], function () {\r\n this.$return(\r\n pb.clamp(\r\n pb.div(1, pb.mul(pb.sub(pb.add(this.NdotL, this.NdotV), pb.mul(this.NdotL, this.NdotV)), 4)),\r\n 0,\r\n 1\r\n )\r\n );\r\n });\r\n pb.func(\r\n 'importanceSample',\r\n [\r\n pb.vec2('xi'),\r\n pb.vec3('normal'),\r\n pb.float('roughness'),\r\n pb.vec3('ggx').out(),\r\n pb.vec3('charlie').out()\r\n ],\r\n function () {\r\n this.$l.alphaRoughness = pb.mul(this.roughness, this.roughness);\r\n this.$l.cosTheta = pb.clamp(\r\n pb.sqrt(\r\n pb.div(\r\n pb.sub(1, this.xi.y),\r\n pb.add(1, pb.mul(pb.sub(pb.mul(this.alphaRoughness, this.alphaRoughness), 1), this.xi.y))\r\n )\r\n ),\r\n 0,\r\n 1\r\n );\r\n this.$l.sinTheta = pb.sqrt(pb.sub(1, pb.mul(this.cosTheta, this.cosTheta)));\r\n this.$l.phi = pb.mul(this.xi.x, Math.PI * 2);\r\n this.$l.TBN = this.generateTBN(this.normal);\r\n this.$l.localSpaceDir = pb.normalize(\r\n pb.vec3(\r\n pb.mul(this.sinTheta, pb.cos(this.phi)),\r\n pb.mul(this.sinTheta, pb.sin(this.phi)),\r\n this.cosTheta\r\n )\r\n );\r\n this.ggx = pb.mul(this.TBN, this.localSpaceDir);\r\n this.sinTheta = pb.pow(\r\n this.xi.y,\r\n pb.div(this.alphaRoughness, pb.add(pb.mul(this.alphaRoughness, 2), 1))\r\n );\r\n this.cosTheta = pb.sqrt(pb.sub(1, pb.mul(this.sinTheta, this.sinTheta)));\r\n this.localSpaceDir = pb.normalize(\r\n pb.vec3(\r\n pb.mul(this.sinTheta, pb.cos(this.phi)),\r\n pb.mul(this.sinTheta, pb.sin(this.phi)),\r\n this.cosTheta\r\n )\r\n );\r\n this.charlie = pb.mul(this.TBN, this.localSpaceDir);\r\n }\r\n );\r\n pb.func('integrateBRDF', [pb.float('NoV'), pb.float('roughness')], function () {\r\n this.$l.V = pb.vec3(pb.sub(1, pb.mul(this.NoV, this.NoV)), 0, this.NoV);\r\n this.$l.a = pb.float(0);\r\n this.$l.b = pb.float(0);\r\n this.$l.c = pb.float(0);\r\n this.$l.n = pb.vec3(0, 0, 1);\r\n this.$for(pb.int('i'), 0, SAMPLE_COUNT, function () {\r\n this.$l.xi = this.hammersley2d(this.i, SAMPLE_COUNT);\r\n this.$l.ggxSample = pb.vec3();\r\n this.$l.charlieSample = pb.vec3();\r\n this.importanceSample(this.xi, this.n, this.roughness, this.ggxSample, this.charlieSample);\r\n this.$l.ggxL = pb.normalize(pb.reflect(pb.neg(this.V), this.ggxSample.xyz));\r\n this.$l.ggxNoL = pb.clamp(this.ggxL.z, 0, 1);\r\n this.$l.ggxNoH = pb.clamp(this.ggxSample.z, 0, 1);\r\n this.$l.ggxVoH = pb.clamp(pb.dot(this.V, this.ggxSample.xyz), 0, 1);\r\n this.$l.charlieL = pb.normalize(pb.reflect(pb.neg(this.V), this.charlieSample.xyz));\r\n this.$l.charlieNoL = pb.clamp(this.charlieL.z, 0, 1);\r\n this.$l.charlieNoH = pb.clamp(this.charlieSample.z, 0, 1);\r\n this.$l.charlieVoH = pb.clamp(pb.dot(this.V, this.charlieSample.xyz), 0, 1);\r\n this.$if(pb.greaterThan(this.ggxNoL, 0), function () {\r\n this.$l.pdf = pb.div(\r\n pb.mul(\r\n this.smithGGXCorrelated(this.NoV, this.ggxNoL, this.roughness),\r\n this.ggxVoH,\r\n this.ggxNoL\r\n ),\r\n this.ggxNoH\r\n );\r\n this.$l.Fc = pb.pow(pb.sub(1, this.ggxVoH), 5);\r\n this.a = pb.add(this.a, pb.mul(pb.sub(1, this.Fc), this.pdf));\r\n this.b = pb.add(this.b, pb.mul(this.Fc, this.pdf));\r\n });\r\n this.$if(pb.greaterThan(this.charlieNoL, 0), function () {\r\n this.$l.sheenDistribution = this.D_Charlie(this.roughness, this.charlieNoH);\r\n this.$l.sheenVis = this.V_Ashikhmin(this.charlieNoL, this.NoV);\r\n this.c = pb.add(\r\n this.c,\r\n pb.mul(this.sheenVis, this.sheenDistribution, this.charlieNoL, this.charlieVoH)\r\n );\r\n });\r\n });\r\n this.$return(\r\n pb.div(pb.vec3(pb.mul(this.a, 4), pb.mul(this.b, 4), pb.mul(this.c, 8 * Math.PI)), SAMPLE_COUNT)\r\n );\r\n });\r\n pb.main(function () {\r\n this.$outputs.color = pb.vec4(this.integrateBRDF(this.$inputs.uv.x, this.$inputs.uv.y), 1);\r\n });\r\n }\r\n });\r\n const vertexLayout = device.createVertexLayout({\r\n vertexBuffers: [\r\n { buffer: device.createVertexBuffer('position_f32x2', new Float32Array([-1, -1, 1, -1, -1, 1, 1, 1])) }\r\n ]\r\n });\r\n const rs = device.createRenderStateSet();\r\n rs.useRasterizerState().setCullMode('none');\r\n rs.useDepthState().enableTest(false).enableWrite(false);\r\n const tex = device.createTexture2D('rgba8unorm', size, size, { samplerOptions: { mipFilter: 'none' } });\r\n tex.name = 'GGXLUT';\r\n const fb = device.createFrameBuffer([tex], null);\r\n device.pushDeviceStates();\r\n device.setProgram(program);\r\n device.setVertexLayout(vertexLayout);\r\n device.setRenderStates(rs);\r\n device.setFramebuffer(fb);\r\n device.draw('triangle-strip', 0, 4);\r\n device.popDeviceStates();\r\n fb.dispose();\r\n vertexLayout.dispose();\r\n program.dispose();\r\n return tex;\r\n}\r\n"],"names":["ggxLut","Map","getGGXLUT","size","lut","get","createGGXLUT","set","device","Application","instance","program","buildRenderProgram","vertex","pb","$inputs","pos","vec2","attrib","$outputs","uv","main","$builtins","position","vec4","add","mul","xy","type","y","neg","fragment","color","SAMPLE_COUNT","func","int","$l","rand","float","denom","invBase","n","bits","$for","div","mod","$if","equal","$break","$return","i","N","radicalInverse_VdC","uint","compOr","sal","sar","compAnd","vec3","bitangent","NoU","normal","epsl","lessThanEqual","sub","abs","$choice","greaterThan","tangent","normalize","cross","mat3","roughness","max","sheenRoughness","invR","cos2h","NdotH","sin2h","pow","Math","PI","a2","GGXV","NoL","sqrt","NoV","GGXL","clamp","NdotL","NdotV","out","alphaRoughness","cosTheta","xi","sinTheta","phi","x","TBN","generateTBN","localSpaceDir","cos","sin","ggx","charlie","V","a","b","c","hammersley2d","ggxSample","charlieSample","importanceSample","ggxL","reflect","xyz","ggxNoL","z","ggxNoH","ggxVoH","dot","charlieL","charlieNoL","charlieNoH","charlieVoH","pdf","smithGGXCorrelated","Fc","sheenDistribution","D_Charlie","sheenVis","V_Ashikhmin","integrateBRDF","vertexLayout","createVertexLayout","vertexBuffers","buffer","createVertexBuffer","Float32Array","rs","createRenderStateSet","useRasterizerState","setCullMode","useDepthState","enableTest","enableWrite","tex","createTexture2D","samplerOptions","mipFilter","name","fb","createFrameBuffer","pushDeviceStates","setProgram","setVertexLayout","setRenderStates","setFramebuffer","draw","popDeviceStates","dispose"],"mappings":";;AAGA,MAAMA,SAAiC,IAAIC,GAAAA,EAAAA;AACpC,SAASC,UAAUC,IAAY,EAAA;IACpC,IAAIC,GAAAA,GAAMJ,MAAOK,CAAAA,GAAG,CAACF,IAAAA,CAAAA;AACrB,IAAA,IAAI,CAACC,GAAK,EAAA;AACRA,QAAAA,GAAAA,GAAME,YAAaH,CAAAA,IAAAA,CAAAA;QACnBH,MAAOO,CAAAA,GAAG,CAACJ,IAAMC,EAAAA,GAAAA,CAAAA;AACnB;IACA,OAAOA,GAAAA;AACT;AACA,SAASE,aAAaH,IAAY,EAAA;AAChC,IAAA,MAAMK,MAASC,GAAAA,WAAAA,CAAYC,QAAQ,CAACF,MAAM;IAC1C,MAAMG,OAAAA,GAAUH,MAAOI,CAAAA,kBAAkB,CAAC;AACxCC,QAAAA,MAAAA,CAAAA,CAAOC,EAAE,EAAA;YACP,IAAI,CAACC,OAAO,CAACC,GAAG,GAAGF,EAAGG,CAAAA,IAAI,EAAGC,CAAAA,MAAM,CAAC,UAAA,CAAA;AACpC,YAAA,IAAI,CAACC,QAAQ,CAACC,EAAE,GAAGN,GAAGG,IAAI,EAAA;AAC1BH,YAAAA,EAAAA,CAAGO,IAAI,CAAC,WAAA;AACN,gBAAA,IAAI,CAACC,SAAS,CAACC,QAAQ,GAAGT,EAAGU,CAAAA,IAAI,CAAC,IAAI,CAACT,OAAO,CAACC,GAAG,EAAE,CAAG,EAAA,CAAA,CAAA;gBACvD,IAAI,CAACG,QAAQ,CAACC,EAAE,GAAGN,EAAGW,CAAAA,GAAG,CAACX,EAAAA,CAAGY,GAAG,CAAC,IAAI,CAACX,OAAO,CAACC,GAAG,CAACW,EAAE,EAAE,GAAA,CAAA,EAAMb,EAAGG,CAAAA,IAAI,CAAC,GAAA,CAAA,CAAA;gBACpE,IAAIT,MAAAA,CAAOoB,IAAI,KAAK,QAAU,EAAA;AAC5B,oBAAA,IAAI,CAACN,SAAS,CAACC,QAAQ,CAACM,CAAC,GAAGf,EAAAA,CAAGgB,GAAG,CAAC,IAAI,CAACR,SAAS,CAACC,QAAQ,CAACM,CAAC,CAAA;AAC9D;AACF,aAAA,CAAA;AACF,SAAA;AACAE,QAAAA,QAAAA,CAAAA,CAASjB,EAAE,EAAA;AACT,YAAA,IAAI,CAACK,QAAQ,CAACa,KAAK,GAAGlB,GAAGU,IAAI,EAAA;AAC7B,YAAA,MAAMS,YAAe,GAAA,IAAA;YACrB,IAAIzB,MAAAA,CAAOoB,IAAI,KAAK,OAAS,EAAA;gBAC3Bd,EAAGoB,CAAAA,IAAI,CAAC,oBAAsB,EAAA;AAACpB,oBAAAA,EAAAA,CAAGqB,GAAG,CAAC,MAAA;iBAAQ,EAAE,WAAA;AAC9C,oBAAA,IAAI,CAACC,EAAE,CAACC,IAAI,GAAGvB,EAAAA,CAAGwB,KAAK,CAAC,CAAA,CAAA;AACxB,oBAAA,IAAI,CAACF,EAAE,CAACG,KAAK,GAAGzB,EAAAA,CAAGwB,KAAK,CAAC,CAAA,CAAA;AACzB,oBAAA,IAAI,CAACF,EAAE,CAACI,OAAO,GAAG1B,EAAAA,CAAGwB,KAAK,CAAC,GAAA,CAAA;AAC3B,oBAAA,IAAI,CAACF,EAAE,CAACK,CAAC,GAAG,IAAI,CAACC,IAAI;oBACrB,IAAI,CAACC,IAAI,CAAC7B,EAAAA,CAAGqB,GAAG,CAAC,GAAA,CAAA,EAAM,GAAG,EAAI,EAAA,WAAA;wBAC5B,IAAI,CAACI,KAAK,GAAGzB,EAAAA,CAAGY,GAAG,CAAC,IAAI,CAACa,KAAK,EAAE,CAAA,CAAA;wBAChC,IAAI,CAACF,IAAI,GAAGvB,EAAGW,CAAAA,GAAG,CAAC,IAAI,CAACY,IAAI,EAAEvB,EAAAA,CAAG8B,GAAG,CAAC9B,GAAG+B,GAAG,CAAC/B,EAAGwB,CAAAA,KAAK,CAAC,IAAI,CAACG,CAAC,CAAG,EAAA,CAAA,CAAA,EAAI,IAAI,CAACF,KAAK,CAAA,CAAA;wBAC5E,IAAI,CAACE,CAAC,GAAG3B,EAAAA,CAAG8B,GAAG,CAAC,IAAI,CAACH,CAAC,EAAE,CAAA,CAAA;wBACxB,IAAI,CAACK,GAAG,CAAChC,EAAGiC,CAAAA,KAAK,CAAC,IAAI,CAACN,CAAC,EAAE,CAAI,CAAA,EAAA,WAAA;AAC5B,4BAAA,IAAI,CAACO,MAAM,EAAA;AACb,yBAAA,CAAA;AACF,qBAAA,CAAA;AACA,oBAAA,IAAI,CAACC,OAAO,CAAC,IAAI,CAACZ,IAAI,CAAA;AACxB,iBAAA,CAAA;gBACAvB,EAAGoB,CAAAA,IAAI,CAAC,cAAgB,EAAA;AAACpB,oBAAAA,EAAAA,CAAGqB,GAAG,CAAC,GAAA,CAAA;AAAMrB,oBAAAA,EAAAA,CAAGqB,GAAG,CAAC,GAAA;iBAAK,EAAE,WAAA;AAClD,oBAAA,IAAI,CAACc,OAAO,CAACnC,EAAAA,CAAGG,IAAI,CAACH,EAAG8B,CAAAA,GAAG,CAAC9B,EAAAA,CAAGwB,KAAK,CAAC,IAAI,CAACY,CAAC,CAAA,EAAGpC,EAAGwB,CAAAA,KAAK,CAAC,IAAI,CAACa,CAAC,CAAI,CAAA,EAAA,IAAI,CAACC,kBAAkB,CAAC,IAAI,CAACF,CAAC,CAAA,CAAA,CAAA;AACjG,iBAAA,CAAA;aACK,MAAA;gBACLpC,EAAGoB,CAAAA,IAAI,CAAC,oBAAsB,EAAA;AAACpB,oBAAAA,EAAAA,CAAGuC,IAAI,CAAC,MAAA;iBAAQ,EAAE,WAAA;AAC/C,oBAAA,IAAI,CAACjB,EAAE,CAACK,CAAC,GAAG,IAAI,CAACC,IAAI;oBACrB,IAAI,CAACD,CAAC,GAAG3B,EAAAA,CAAGwC,MAAM,CAACxC,EAAAA,CAAGyC,GAAG,CAAC,IAAI,CAACd,CAAC,EAAE,KAAK3B,EAAG0C,CAAAA,GAAG,CAAC,IAAI,CAACf,CAAC,EAAE,EAAA,CAAA,CAAA;AACtD,oBAAA,IAAI,CAACA,CAAC,GAAG3B,EAAAA,CAAGwC,MAAM,CAChBxC,EAAGyC,CAAAA,GAAG,CAACzC,EAAAA,CAAG2C,OAAO,CAAC,IAAI,CAAChB,CAAC,EAAE,UAAa,CAAA,EAAA,CAAA,CAAA,EACvC3B,EAAG0C,CAAAA,GAAG,CAAC1C,EAAAA,CAAG2C,OAAO,CAAC,IAAI,CAAChB,CAAC,EAAE,UAAa,CAAA,EAAA,CAAA,CAAA,CAAA;AAEzC,oBAAA,IAAI,CAACA,CAAC,GAAG3B,EAAAA,CAAGwC,MAAM,CAChBxC,EAAGyC,CAAAA,GAAG,CAACzC,EAAAA,CAAG2C,OAAO,CAAC,IAAI,CAAChB,CAAC,EAAE,UAAa,CAAA,EAAA,CAAA,CAAA,EACvC3B,EAAG0C,CAAAA,GAAG,CAAC1C,EAAAA,CAAG2C,OAAO,CAAC,IAAI,CAAChB,CAAC,EAAE,UAAa,CAAA,EAAA,CAAA,CAAA,CAAA;AAEzC,oBAAA,IAAI,CAACA,CAAC,GAAG3B,EAAAA,CAAGwC,MAAM,CAChBxC,EAAGyC,CAAAA,GAAG,CAACzC,EAAAA,CAAG2C,OAAO,CAAC,IAAI,CAAChB,CAAC,EAAE,UAAa,CAAA,EAAA,CAAA,CAAA,EACvC3B,EAAG0C,CAAAA,GAAG,CAAC1C,EAAAA,CAAG2C,OAAO,CAAC,IAAI,CAAChB,CAAC,EAAE,UAAa,CAAA,EAAA,CAAA,CAAA,CAAA;AAEzC,oBAAA,IAAI,CAACA,CAAC,GAAG3B,EAAAA,CAAGwC,MAAM,CAChBxC,EAAGyC,CAAAA,GAAG,CAACzC,EAAAA,CAAG2C,OAAO,CAAC,IAAI,CAAChB,CAAC,EAAE,UAAa,CAAA,EAAA,CAAA,CAAA,EACvC3B,EAAG0C,CAAAA,GAAG,CAAC1C,EAAAA,CAAG2C,OAAO,CAAC,IAAI,CAAChB,CAAC,EAAE,UAAa,CAAA,EAAA,CAAA,CAAA,CAAA;AAEzC,oBAAA,IAAI,CAACQ,OAAO,CAACnC,EAAAA,CAAGY,GAAG,CAACZ,EAAGwB,CAAAA,KAAK,CAAC,IAAI,CAACG,CAAC,CAAG,EAAA,sBAAA,CAAA,CAAA;AACxC,iBAAA,CAAA;gBACA3B,EAAGoB,CAAAA,IAAI,CAAC,cAAgB,EAAA;AAACpB,oBAAAA,EAAAA,CAAGqB,GAAG,CAAC,GAAA,CAAA;AAAMrB,oBAAAA,EAAAA,CAAGqB,GAAG,CAAC,GAAA;iBAAK,EAAE,WAAA;AAClD,oBAAA,IAAI,CAACc,OAAO,CACVnC,EAAAA,CAAGG,IAAI,CAACH,EAAAA,CAAG8B,GAAG,CAAC9B,EAAGwB,CAAAA,KAAK,CAAC,IAAI,CAACY,CAAC,CAAA,EAAGpC,EAAGwB,CAAAA,KAAK,CAAC,IAAI,CAACa,CAAC,IAAI,IAAI,CAACC,kBAAkB,CAACtC,EAAGuC,CAAAA,IAAI,CAAC,IAAI,CAACH,CAAC,CAAA,CAAA,CAAA,CAAA;AAE9F,iBAAA,CAAA;AACF;YACApC,EAAGoB,CAAAA,IAAI,CAAC,aAAe,EAAA;AAACpB,gBAAAA,EAAAA,CAAG4C,IAAI,CAAC,QAAA;aAAU,EAAE,WAAA;gBAC1C,IAAI,CAACtB,EAAE,CAACuB,SAAS,GAAG7C,EAAG4C,CAAAA,IAAI,CAAC,CAAA,EAAG,CAAG,EAAA,CAAA,CAAA;gBAClC,IAAI,CAACtB,EAAE,CAACwB,GAAG,GAAG,IAAI,CAACC,MAAM,CAAChC,CAAC;AAC3B,gBAAA,IAAI,CAACO,EAAE,CAAC0B,IAAI,GAAG,SAAA;gBACf,IAAI,CAAChB,GAAG,CAAChC,EAAAA,CAAGiD,aAAa,CAACjD,EAAAA,CAAGkD,GAAG,CAAC,CAAGlD,EAAAA,EAAAA,CAAGmD,GAAG,CAAC,IAAI,CAACJ,MAAM,CAAChC,CAAC,CAAI,CAAA,EAAA,IAAI,CAACiC,IAAI,CAAG,EAAA,WAAA;AACtE,oBAAA,IAAI,CAACH,SAAS,GAAG,IAAI,CAACO,OAAO,CAC3BpD,EAAAA,CAAGqD,WAAW,CAAC,IAAI,CAACN,MAAM,CAAChC,CAAC,EAAE,CAC9Bf,CAAAA,EAAAA,EAAAA,CAAG4C,IAAI,CAAC,CAAG,EAAA,CAAA,EAAG,CACd5C,CAAAA,EAAAA,EAAAA,CAAG4C,IAAI,CAAC,CAAG,EAAA,CAAA,EAAG,EAAC,CAAA,CAAA;AAEnB,iBAAA,CAAA;AACA,gBAAA,IAAI,CAACtB,EAAE,CAACgC,OAAO,GAAGtD,GAAGuD,SAAS,CAACvD,EAAGwD,CAAAA,KAAK,CAAC,IAAI,CAACX,SAAS,EAAE,IAAI,CAACE,MAAM,CAAA,CAAA;AACnE,gBAAA,IAAI,CAACF,SAAS,GAAG7C,EAAAA,CAAGwD,KAAK,CAAC,IAAI,CAACT,MAAM,EAAE,IAAI,CAACO,OAAO,CAAA;AACnD,gBAAA,IAAI,CAACnB,OAAO,CAACnC,EAAGyD,CAAAA,IAAI,CAAC,IAAI,CAACH,OAAO,EAAE,IAAI,CAACT,SAAS,EAAE,IAAI,CAACE,MAAM,CAAA,CAAA;AAChE,aAAA,CAAA;YACA/C,EAAGoB,CAAAA,IAAI,CAAC,WAAa,EAAA;AAACpB,gBAAAA,EAAAA,CAAGwB,KAAK,CAAC,gBAAA,CAAA;AAAmBxB,gBAAAA,EAAAA,CAAGwB,KAAK,CAAC,OAAA;aAAS,EAAE,WAAA;gBACpE,IAAI,CAACF,EAAE,CAACoC,SAAS,GAAG1D,EAAG2D,CAAAA,GAAG,CAAC,IAAI,CAACC,cAAc,EAAE,QAAA,CAAA;gBAChD,IAAI,CAACtC,EAAE,CAACuC,IAAI,GAAG7D,EAAG8B,CAAAA,GAAG,CAAC,CAAA,EAAG,IAAI,CAAC4B,SAAS,CAAA;AACvC,gBAAA,IAAI,CAACpC,EAAE,CAACwC,KAAK,GAAG9D,EAAGY,CAAAA,GAAG,CAAC,IAAI,CAACmD,KAAK,EAAE,IAAI,CAACA,KAAK,CAAA;gBAC7C,IAAI,CAACzC,EAAE,CAAC0C,KAAK,GAAGhE,EAAGkD,CAAAA,GAAG,CAAC,CAAA,EAAG,IAAI,CAACY,KAAK,CAAA;AACpC,gBAAA,IAAI,CAAC3B,OAAO,CACVnC,EAAAA,CAAG8B,GAAG,CAAC9B,EAAAA,CAAGY,GAAG,CAACZ,GAAGW,GAAG,CAAC,IAAI,CAACkD,IAAI,EAAE,CAAA,CAAA,EAAI7D,EAAGiE,CAAAA,GAAG,CAAC,IAAI,CAACD,KAAK,EAAEhE,EAAGY,CAAAA,GAAG,CAAC,IAAI,CAACiD,IAAI,EAAE,GAAQK,CAAAA,CAAAA,CAAAA,EAAAA,IAAAA,CAAKC,EAAE,GAAG,CAAA,CAAA,CAAA;AAE/F,aAAA,CAAA;YACAnE,EAAGoB,CAAAA,IAAI,CAAC,oBAAsB,EAAA;AAACpB,gBAAAA,EAAAA,CAAGwB,KAAK,CAAC,KAAA,CAAA;AAAQxB,gBAAAA,EAAAA,CAAGwB,KAAK,CAAC,KAAA,CAAA;AAAQxB,gBAAAA,EAAAA,CAAGwB,KAAK,CAAC,WAAA;aAAa,EAAE,WAAA;gBACvF,IAAI,CAACF,EAAE,CAAC8C,EAAE,GAAGpE,EAAGY,CAAAA,GAAG,CAAC,IAAI,CAAC8C,SAAS,EAAE,IAAI,CAACA,SAAS,EAAE,IAAI,CAACA,SAAS,EAAE,IAAI,CAACA,SAAS,CAAA;AAClF,gBAAA,IAAI,CAACpC,EAAE,CAAC+C,IAAI,GAAGrE,GAAGY,GAAG,CACnB,IAAI,CAAC0D,GAAG,EACRtE,EAAAA,CAAGuE,IAAI,CAACvE,EAAAA,CAAGW,GAAG,CAACX,EAAAA,CAAGY,GAAG,CAAC,IAAI,CAAC4D,GAAG,EAAE,IAAI,CAACA,GAAG,EAAExE,EAAAA,CAAGkD,GAAG,CAAC,GAAG,IAAI,CAACkB,EAAE,CAAI,CAAA,EAAA,IAAI,CAACA,EAAE,CAAA,CAAA,CAAA;AAExE,gBAAA,IAAI,CAAC9C,EAAE,CAACmD,IAAI,GAAGzE,GAAGY,GAAG,CACnB,IAAI,CAAC4D,GAAG,EACRxE,EAAAA,CAAGuE,IAAI,CAACvE,EAAAA,CAAGW,GAAG,CAACX,EAAAA,CAAGY,GAAG,CAAC,IAAI,CAAC0D,GAAG,EAAE,IAAI,CAACA,GAAG,EAAEtE,EAAAA,CAAGkD,GAAG,CAAC,GAAG,IAAI,CAACkB,EAAE,CAAI,CAAA,EAAA,IAAI,CAACA,EAAE,CAAA,CAAA,CAAA;AAExE,gBAAA,IAAI,CAACjC,OAAO,CAACnC,EAAG8B,CAAAA,GAAG,CAAC,GAAK9B,EAAAA,EAAAA,CAAGW,GAAG,CAAC,IAAI,CAAC0D,IAAI,EAAE,IAAI,CAACI,IAAI,CAAA,CAAA,CAAA;AACtD,aAAA,CAAA;YACAzE,EAAGoB,CAAAA,IAAI,CAAC,aAAe,EAAA;AAACpB,gBAAAA,EAAAA,CAAGwB,KAAK,CAAC,OAAA,CAAA;AAAUxB,gBAAAA,EAAAA,CAAGwB,KAAK,CAAC,OAAA;aAAS,EAAE,WAAA;AAC7D,gBAAA,IAAI,CAACW,OAAO,CACVnC,EAAG0E,CAAAA,KAAK,CACN1E,EAAG8B,CAAAA,GAAG,CAAC,CAAA,EAAG9B,GAAGY,GAAG,CAACZ,GAAGkD,GAAG,CAAClD,GAAGW,GAAG,CAAC,IAAI,CAACgE,KAAK,EAAE,IAAI,CAACC,KAAK,CAAA,EAAG5E,GAAGY,GAAG,CAAC,IAAI,CAAC+D,KAAK,EAAE,IAAI,CAACC,KAAK,CAAA,CAAA,EAAI,KACzF,CACA,EAAA,CAAA,CAAA,CAAA;AAGN,aAAA,CAAA;YACA5E,EAAGoB,CAAAA,IAAI,CACL,kBACA,EAAA;AACEpB,gBAAAA,EAAAA,CAAGG,IAAI,CAAC,IAAA,CAAA;AACRH,gBAAAA,EAAAA,CAAG4C,IAAI,CAAC,QAAA,CAAA;AACR5C,gBAAAA,EAAAA,CAAGwB,KAAK,CAAC,WAAA,CAAA;gBACTxB,EAAG4C,CAAAA,IAAI,CAAC,KAAA,CAAA,CAAOiC,GAAG,EAAA;gBAClB7E,EAAG4C,CAAAA,IAAI,CAAC,SAAA,CAAA,CAAWiC,GAAG;aACvB,EACD,WAAA;AACE,gBAAA,IAAI,CAACvD,EAAE,CAACwD,cAAc,GAAG9E,EAAGY,CAAAA,GAAG,CAAC,IAAI,CAAC8C,SAAS,EAAE,IAAI,CAACA,SAAS,CAAA;gBAC9D,IAAI,CAACpC,EAAE,CAACyD,QAAQ,GAAG/E,GAAG0E,KAAK,CACzB1E,EAAGuE,CAAAA,IAAI,CACLvE,EAAAA,CAAG8B,GAAG,CACJ9B,EAAAA,CAAGkD,GAAG,CAAC,CAAG,EAAA,IAAI,CAAC8B,EAAE,CAACjE,CAAC,CAAA,EACnBf,EAAGW,CAAAA,GAAG,CAAC,CAAGX,EAAAA,EAAAA,CAAGY,GAAG,CAACZ,EAAGkD,CAAAA,GAAG,CAAClD,EAAGY,CAAAA,GAAG,CAAC,IAAI,CAACkE,cAAc,EAAE,IAAI,CAACA,cAAc,CAAA,EAAG,CAAI,CAAA,EAAA,IAAI,CAACE,EAAE,CAACjE,CAAC,CAAA,CAAA,CAAA,CAAA,EAG3F,CACA,EAAA,CAAA,CAAA;gBAEF,IAAI,CAACO,EAAE,CAAC2D,QAAQ,GAAGjF,EAAGuE,CAAAA,IAAI,CAACvE,EAAGkD,CAAAA,GAAG,CAAC,CAAGlD,EAAAA,EAAAA,CAAGY,GAAG,CAAC,IAAI,CAACmE,QAAQ,EAAE,IAAI,CAACA,QAAQ,CAAA,CAAA,CAAA;AACxE,gBAAA,IAAI,CAACzD,EAAE,CAAC4D,GAAG,GAAGlF,GAAGY,GAAG,CAAC,IAAI,CAACoE,EAAE,CAACG,CAAC,EAAEjB,IAAAA,CAAKC,EAAE,GAAG,CAAA,CAAA;gBAC1C,IAAI,CAAC7C,EAAE,CAAC8D,GAAG,GAAG,IAAI,CAACC,WAAW,CAAC,IAAI,CAACtC,MAAM,CAAA;AAC1C,gBAAA,IAAI,CAACzB,EAAE,CAACgE,aAAa,GAAGtF,EAAAA,CAAGuD,SAAS,CAClCvD,EAAAA,CAAG4C,IAAI,CACL5C,GAAGY,GAAG,CAAC,IAAI,CAACqE,QAAQ,EAAEjF,EAAGuF,CAAAA,GAAG,CAAC,IAAI,CAACL,GAAG,CAAA,CAAA,EACrClF,GAAGY,GAAG,CAAC,IAAI,CAACqE,QAAQ,EAAEjF,EAAGwF,CAAAA,GAAG,CAAC,IAAI,CAACN,GAAG,CACrC,CAAA,EAAA,IAAI,CAACH,QAAQ,CAAA,CAAA;AAGjB,gBAAA,IAAI,CAACU,GAAG,GAAGzF,EAAAA,CAAGY,GAAG,CAAC,IAAI,CAACwE,GAAG,EAAE,IAAI,CAACE,aAAa,CAAA;AAC9C,gBAAA,IAAI,CAACL,QAAQ,GAAGjF,EAAAA,CAAGiE,GAAG,CACpB,IAAI,CAACe,EAAE,CAACjE,CAAC,EACTf,EAAG8B,CAAAA,GAAG,CAAC,IAAI,CAACgD,cAAc,EAAE9E,EAAAA,CAAGW,GAAG,CAACX,EAAGY,CAAAA,GAAG,CAAC,IAAI,CAACkE,cAAc,EAAE,CAAI,CAAA,EAAA,CAAA,CAAA,CAAA,CAAA;AAErE,gBAAA,IAAI,CAACC,QAAQ,GAAG/E,GAAGuE,IAAI,CAACvE,GAAGkD,GAAG,CAAC,GAAGlD,EAAGY,CAAAA,GAAG,CAAC,IAAI,CAACqE,QAAQ,EAAE,IAAI,CAACA,QAAQ,CAAA,CAAA,CAAA;AACrE,gBAAA,IAAI,CAACK,aAAa,GAAGtF,EAAGuD,CAAAA,SAAS,CAC/BvD,EAAG4C,CAAAA,IAAI,CACL5C,EAAAA,CAAGY,GAAG,CAAC,IAAI,CAACqE,QAAQ,EAAEjF,GAAGuF,GAAG,CAAC,IAAI,CAACL,GAAG,CACrClF,CAAAA,EAAAA,EAAAA,CAAGY,GAAG,CAAC,IAAI,CAACqE,QAAQ,EAAEjF,EAAGwF,CAAAA,GAAG,CAAC,IAAI,CAACN,GAAG,CACrC,CAAA,EAAA,IAAI,CAACH,QAAQ,CAAA,CAAA;AAGjB,gBAAA,IAAI,CAACW,OAAO,GAAG1F,EAAAA,CAAGY,GAAG,CAAC,IAAI,CAACwE,GAAG,EAAE,IAAI,CAACE,aAAa,CAAA;AACpD,aAAA,CAAA;YAEFtF,EAAGoB,CAAAA,IAAI,CAAC,eAAiB,EAAA;AAACpB,gBAAAA,EAAAA,CAAGwB,KAAK,CAAC,KAAA,CAAA;AAAQxB,gBAAAA,EAAAA,CAAGwB,KAAK,CAAC,WAAA;aAAa,EAAE,WAAA;gBACjE,IAAI,CAACF,EAAE,CAACqE,CAAC,GAAG3F,EAAG4C,CAAAA,IAAI,CAAC5C,EAAAA,CAAGkD,GAAG,CAAC,CAAGlD,EAAAA,EAAAA,CAAGY,GAAG,CAAC,IAAI,CAAC4D,GAAG,EAAE,IAAI,CAACA,GAAG,CAAI,CAAA,EAAA,CAAA,EAAG,IAAI,CAACA,GAAG,CAAA;AACtE,gBAAA,IAAI,CAAClD,EAAE,CAACsE,CAAC,GAAG5F,EAAAA,CAAGwB,KAAK,CAAC,CAAA,CAAA;AACrB,gBAAA,IAAI,CAACF,EAAE,CAACuE,CAAC,GAAG7F,EAAAA,CAAGwB,KAAK,CAAC,CAAA,CAAA;AACrB,gBAAA,IAAI,CAACF,EAAE,CAACwE,CAAC,GAAG9F,EAAAA,CAAGwB,KAAK,CAAC,CAAA,CAAA;gBACrB,IAAI,CAACF,EAAE,CAACK,CAAC,GAAG3B,EAAG4C,CAAAA,IAAI,CAAC,CAAA,EAAG,CAAG,EAAA,CAAA,CAAA;gBAC1B,IAAI,CAACf,IAAI,CAAC7B,EAAAA,CAAGqB,GAAG,CAAC,GAAA,CAAA,EAAM,GAAGF,YAAc,EAAA,WAAA;AACtC,oBAAA,IAAI,CAACG,EAAE,CAAC0D,EAAE,GAAG,IAAI,CAACe,YAAY,CAAC,IAAI,CAAC3D,CAAC,EAAEjB,YAAAA,CAAAA;AACvC,oBAAA,IAAI,CAACG,EAAE,CAAC0E,SAAS,GAAGhG,GAAG4C,IAAI,EAAA;AAC3B,oBAAA,IAAI,CAACtB,EAAE,CAAC2E,aAAa,GAAGjG,GAAG4C,IAAI,EAAA;oBAC/B,IAAI,CAACsD,gBAAgB,CAAC,IAAI,CAAClB,EAAE,EAAE,IAAI,CAACrD,CAAC,EAAE,IAAI,CAAC+B,SAAS,EAAE,IAAI,CAACsC,SAAS,EAAE,IAAI,CAACC,aAAa,CAAA;oBACzF,IAAI,CAAC3E,EAAE,CAAC6E,IAAI,GAAGnG,EAAGuD,CAAAA,SAAS,CAACvD,EAAAA,CAAGoG,OAAO,CAACpG,GAAGgB,GAAG,CAAC,IAAI,CAAC2E,CAAC,GAAG,IAAI,CAACK,SAAS,CAACK,GAAG,CAAA,CAAA;AACzE,oBAAA,IAAI,CAAC/E,EAAE,CAACgF,MAAM,GAAGtG,EAAG0E,CAAAA,KAAK,CAAC,IAAI,CAACyB,IAAI,CAACI,CAAC,EAAE,CAAG,EAAA,CAAA,CAAA;AAC1C,oBAAA,IAAI,CAACjF,EAAE,CAACkF,MAAM,GAAGxG,EAAG0E,CAAAA,KAAK,CAAC,IAAI,CAACsB,SAAS,CAACO,CAAC,EAAE,CAAG,EAAA,CAAA,CAAA;oBAC/C,IAAI,CAACjF,EAAE,CAACmF,MAAM,GAAGzG,EAAG0E,CAAAA,KAAK,CAAC1E,EAAG0G,CAAAA,GAAG,CAAC,IAAI,CAACf,CAAC,EAAE,IAAI,CAACK,SAAS,CAACK,GAAG,CAAA,EAAG,CAAG,EAAA,CAAA,CAAA;oBACjE,IAAI,CAAC/E,EAAE,CAACqF,QAAQ,GAAG3G,EAAGuD,CAAAA,SAAS,CAACvD,EAAAA,CAAGoG,OAAO,CAACpG,GAAGgB,GAAG,CAAC,IAAI,CAAC2E,CAAC,GAAG,IAAI,CAACM,aAAa,CAACI,GAAG,CAAA,CAAA;AACjF,oBAAA,IAAI,CAAC/E,EAAE,CAACsF,UAAU,GAAG5G,EAAG0E,CAAAA,KAAK,CAAC,IAAI,CAACiC,QAAQ,CAACJ,CAAC,EAAE,CAAG,EAAA,CAAA,CAAA;AAClD,oBAAA,IAAI,CAACjF,EAAE,CAACuF,UAAU,GAAG7G,EAAG0E,CAAAA,KAAK,CAAC,IAAI,CAACuB,aAAa,CAACM,CAAC,EAAE,CAAG,EAAA,CAAA,CAAA;oBACvD,IAAI,CAACjF,EAAE,CAACwF,UAAU,GAAG9G,EAAG0E,CAAAA,KAAK,CAAC1E,EAAG0G,CAAAA,GAAG,CAAC,IAAI,CAACf,CAAC,EAAE,IAAI,CAACM,aAAa,CAACI,GAAG,CAAA,EAAG,CAAG,EAAA,CAAA,CAAA;oBACzE,IAAI,CAACrE,GAAG,CAAChC,EAAGqD,CAAAA,WAAW,CAAC,IAAI,CAACiD,MAAM,EAAE,CAAI,CAAA,EAAA,WAAA;AACvC,wBAAA,IAAI,CAAChF,EAAE,CAACyF,GAAG,GAAG/G,GAAG8B,GAAG,CAClB9B,EAAGY,CAAAA,GAAG,CACJ,IAAI,CAACoG,kBAAkB,CAAC,IAAI,CAACxC,GAAG,EAAE,IAAI,CAAC8B,MAAM,EAAE,IAAI,CAAC5C,SAAS,CAC7D,EAAA,IAAI,CAAC+C,MAAM,EACX,IAAI,CAACH,MAAM,CAEb,EAAA,IAAI,CAACE,MAAM,CAAA;AAEb,wBAAA,IAAI,CAAClF,EAAE,CAAC2F,EAAE,GAAGjH,EAAGiE,CAAAA,GAAG,CAACjE,EAAAA,CAAGkD,GAAG,CAAC,CAAA,EAAG,IAAI,CAACuD,MAAM,CAAG,EAAA,CAAA,CAAA;wBAC5C,IAAI,CAACb,CAAC,GAAG5F,EAAAA,CAAGW,GAAG,CAAC,IAAI,CAACiF,CAAC,EAAE5F,EAAAA,CAAGY,GAAG,CAACZ,EAAAA,CAAGkD,GAAG,CAAC,CAAG,EAAA,IAAI,CAAC+D,EAAE,CAAA,EAAG,IAAI,CAACF,GAAG,CAAA,CAAA;AAC3D,wBAAA,IAAI,CAAClB,CAAC,GAAG7F,GAAGW,GAAG,CAAC,IAAI,CAACkF,CAAC,EAAE7F,EAAGY,CAAAA,GAAG,CAAC,IAAI,CAACqG,EAAE,EAAE,IAAI,CAACF,GAAG,CAAA,CAAA;AAClD,qBAAA,CAAA;oBACA,IAAI,CAAC/E,GAAG,CAAChC,EAAGqD,CAAAA,WAAW,CAAC,IAAI,CAACuD,UAAU,EAAE,CAAI,CAAA,EAAA,WAAA;AAC3C,wBAAA,IAAI,CAACtF,EAAE,CAAC4F,iBAAiB,GAAG,IAAI,CAACC,SAAS,CAAC,IAAI,CAACzD,SAAS,EAAE,IAAI,CAACmD,UAAU,CAAA;AAC1E,wBAAA,IAAI,CAACvF,EAAE,CAAC8F,QAAQ,GAAG,IAAI,CAACC,WAAW,CAAC,IAAI,CAACT,UAAU,EAAE,IAAI,CAACpC,GAAG,CAAA;wBAC7D,IAAI,CAACsB,CAAC,GAAG9F,EAAGW,CAAAA,GAAG,CACb,IAAI,CAACmF,CAAC,EACN9F,EAAAA,CAAGY,GAAG,CAAC,IAAI,CAACwG,QAAQ,EAAE,IAAI,CAACF,iBAAiB,EAAE,IAAI,CAACN,UAAU,EAAE,IAAI,CAACE,UAAU,CAAA,CAAA;AAElF,qBAAA,CAAA;AACF,iBAAA,CAAA;AACA,gBAAA,IAAI,CAAC3E,OAAO,CACVnC,EAAAA,CAAG8B,GAAG,CAAC9B,EAAAA,CAAG4C,IAAI,CAAC5C,GAAGY,GAAG,CAAC,IAAI,CAACgF,CAAC,EAAE,CAAA,CAAA,EAAI5F,EAAGY,CAAAA,GAAG,CAAC,IAAI,CAACiF,CAAC,EAAE,IAAI7F,EAAGY,CAAAA,GAAG,CAAC,IAAI,CAACkF,CAAC,EAAE,CAAI5B,GAAAA,IAAAA,CAAKC,EAAE,CAAIhD,CAAAA,EAAAA,YAAAA,CAAAA,CAAAA;AAEvF,aAAA,CAAA;AACAnB,YAAAA,EAAAA,CAAGO,IAAI,CAAC,WAAA;gBACN,IAAI,CAACF,QAAQ,CAACa,KAAK,GAAGlB,EAAGU,CAAAA,IAAI,CAAC,IAAI,CAAC4G,aAAa,CAAC,IAAI,CAACrH,OAAO,CAACK,EAAE,CAAC6E,CAAC,EAAE,IAAI,CAAClF,OAAO,CAACK,EAAE,CAACS,CAAC,CAAG,EAAA,CAAA,CAAA;AAC1F,aAAA,CAAA;AACF;AACF,KAAA,CAAA;IACA,MAAMwG,YAAAA,GAAe7H,MAAO8H,CAAAA,kBAAkB,CAAC;QAC7CC,aAAe,EAAA;AACb,YAAA;AAAEC,gBAAAA,MAAAA,EAAQhI,MAAOiI,CAAAA,kBAAkB,CAAC,gBAAA,EAAkB,IAAIC,YAAa,CAAA;oBAAC,EAAC;oBAAG,EAAC;AAAG,oBAAA,CAAA;oBAAG,EAAC;oBAAG,EAAC;AAAG,oBAAA,CAAA;AAAG,oBAAA,CAAA;AAAG,oBAAA;AAAE,iBAAA,CAAA;AAAG;AACvG;AACH,KAAA,CAAA;IACA,MAAMC,EAAAA,GAAKnI,OAAOoI,oBAAoB,EAAA;IACtCD,EAAGE,CAAAA,kBAAkB,EAAGC,CAAAA,WAAW,CAAC,MAAA,CAAA;AACpCH,IAAAA,EAAAA,CAAGI,aAAa,EAAGC,CAAAA,UAAU,CAAC,KAAA,CAAA,CAAOC,WAAW,CAAC,KAAA,CAAA;AACjD,IAAA,MAAMC,MAAM1I,MAAO2I,CAAAA,eAAe,CAAC,YAAA,EAAchJ,MAAMA,IAAM,EAAA;QAAEiJ,cAAgB,EAAA;YAAEC,SAAW,EAAA;AAAO;AAAE,KAAA,CAAA;AACrGH,IAAAA,GAAAA,CAAII,IAAI,GAAG,QAAA;IACX,MAAMC,EAAAA,GAAK/I,MAAOgJ,CAAAA,iBAAiB,CAAC;AAACN,QAAAA;KAAI,EAAE,IAAA,CAAA;AAC3C1I,IAAAA,MAAAA,CAAOiJ,gBAAgB,EAAA;AACvBjJ,IAAAA,MAAAA,CAAOkJ,UAAU,CAAC/I,OAAAA,CAAAA;AAClBH,IAAAA,MAAAA,CAAOmJ,eAAe,CAACtB,YAAAA,CAAAA;AACvB7H,IAAAA,MAAAA,CAAOoJ,eAAe,CAACjB,EAAAA,CAAAA;AACvBnI,IAAAA,MAAAA,CAAOqJ,cAAc,CAACN,EAAAA,CAAAA;IACtB/I,MAAOsJ,CAAAA,IAAI,CAAC,gBAAA,EAAkB,CAAG,EAAA,CAAA,CAAA;AACjCtJ,IAAAA,MAAAA,CAAOuJ,eAAe,EAAA;AACtBR,IAAAA,EAAAA,CAAGS,OAAO,EAAA;AACV3B,IAAAA,YAAAA,CAAa2B,OAAO,EAAA;AACpBrJ,IAAAA,OAAAA,CAAQqJ,OAAO,EAAA;IACf,OAAOd,GAAAA;AACT;;;;"}