@zephyr3d/scene 0.8.0 → 0.8.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (387) hide show
  1. package/dist/animation/animationset.js +198 -1
  2. package/dist/animation/animationset.js.map +1 -1
  3. package/dist/animation/ik/ccd_solver.js +3 -4
  4. package/dist/animation/ik/ccd_solver.js.map +1 -1
  5. package/dist/animation/ik/fabrik_solver.js +3 -4
  6. package/dist/animation/ik/fabrik_solver.js.map +1 -1
  7. package/dist/animation/ik/ik_pole_constraint.js +7 -2
  8. package/dist/animation/ik/ik_pole_constraint.js.map +1 -1
  9. package/dist/animation/ik/ik_utils.js +0 -79
  10. package/dist/animation/ik/ik_utils.js.map +1 -1
  11. package/dist/animation/ik/two_bone_ik_solver.js +3 -4
  12. package/dist/animation/ik/two_bone_ik_solver.js.map +1 -1
  13. package/dist/animation/spring/spring_bone.js +240 -0
  14. package/dist/animation/spring/spring_bone.js.map +1 -0
  15. package/dist/animation/spring/spring_bone_collider.js +198 -0
  16. package/dist/animation/spring/spring_bone_collider.js.map +1 -0
  17. package/dist/animation/spring/spring_bone_constraint.js +170 -0
  18. package/dist/animation/spring/spring_bone_constraint.js.map +1 -0
  19. package/dist/animation/spring/spring_bone_system.js +328 -0
  20. package/dist/animation/spring/spring_bone_system.js.map +1 -0
  21. package/dist/asset/model.js +2 -2
  22. package/dist/index.d.ts +15 -0
  23. package/dist/material/mixins/pbr/common.js +20 -17
  24. package/dist/material/mixins/pbr/common.js.map +1 -1
  25. package/dist/render/gpu_picking.js +100 -0
  26. package/dist/render/gpu_picking.js.map +1 -0
  27. package/dist/render/rendergraph/device_pool_allocator.js +41 -0
  28. package/dist/render/rendergraph/device_pool_allocator.js.map +1 -0
  29. package/dist/render/rendergraph/executor.js +146 -0
  30. package/dist/render/rendergraph/executor.js.map +1 -0
  31. package/dist/render/rendergraph/forward_plus_builder.js +414 -0
  32. package/dist/render/rendergraph/forward_plus_builder.js.map +1 -0
  33. package/dist/render/rendergraph/rendergraph.js +306 -0
  34. package/dist/render/rendergraph/rendergraph.js.map +1 -0
  35. package/dist/render/rendergraph/types.js +57 -0
  36. package/dist/render/rendergraph/types.js.map +1 -0
  37. package/dist/render/sky_motion_vector.js +85 -0
  38. package/dist/render/sky_motion_vector.js.map +1 -0
  39. package/dist/utility/serialization/scene/animation.js +3 -3
  40. package/dist/utility/serialization/scene/node.js +1 -1
  41. package/package.json +2 -2
  42. package/dist/animation/ik/ik_chain_builder.js +0 -68
  43. package/dist/animation/ik/ik_chain_builder.js.map +0 -1
  44. package/dist/node_modules/@zephyr3d/runtime/dist/runtime/runtimemgr.js +0 -38
  45. package/dist/node_modules/@zephyr3d/runtime/dist/runtime/runtimemgr.js.map +0 -1
  46. package/dist/node_modules/@zephyr3d/runtime/dist/runtime/runtimescript.js +0 -10
  47. package/dist/node_modules/@zephyr3d/runtime/dist/runtime/runtimescript.js.map +0 -1
  48. package/dist/node_modules/@zephyr3d/runtime/dist/runtime/scriptingsystem.js +0 -127
  49. package/dist/node_modules/@zephyr3d/runtime/dist/runtime/scriptingsystem.js.map +0 -1
  50. package/dist/node_modules/@zephyr3d/runtime/dist/runtime/scriptregistry.js +0 -263
  51. package/dist/node_modules/@zephyr3d/runtime/dist/runtime/scriptregistry.js.map +0 -1
  52. package/dist/src/animation/animation.js +0 -127
  53. package/dist/src/animation/animation.js.map +0 -1
  54. package/dist/src/animation/animationset.js +0 -255
  55. package/dist/src/animation/animationset.js.map +0 -1
  56. package/dist/src/animation/animationtrack.js +0 -34
  57. package/dist/src/animation/animationtrack.js.map +0 -1
  58. package/dist/src/animation/eulerrotationtrack.js +0 -52
  59. package/dist/src/animation/eulerrotationtrack.js.map +0 -1
  60. package/dist/src/animation/morphtarget.js +0 -93
  61. package/dist/src/animation/morphtarget.js.map +0 -1
  62. package/dist/src/animation/morphtrack.js +0 -70
  63. package/dist/src/animation/morphtrack.js.map +0 -1
  64. package/dist/src/animation/proptrack.js +0 -161
  65. package/dist/src/animation/proptrack.js.map +0 -1
  66. package/dist/src/animation/rotationtrack.js +0 -51
  67. package/dist/src/animation/rotationtrack.js.map +0 -1
  68. package/dist/src/animation/scaletrack.js +0 -50
  69. package/dist/src/animation/scaletrack.js.map +0 -1
  70. package/dist/src/animation/skeleton.js +0 -204
  71. package/dist/src/animation/skeleton.js.map +0 -1
  72. package/dist/src/animation/translationtrack.js +0 -50
  73. package/dist/src/animation/translationtrack.js.map +0 -1
  74. package/dist/src/app/app.js +0 -129
  75. package/dist/src/app/app.js.map +0 -1
  76. package/dist/src/app/inputmgr.js +0 -267
  77. package/dist/src/app/inputmgr.js.map +0 -1
  78. package/dist/src/asset/assetmanager.js +0 -404
  79. package/dist/src/asset/assetmanager.js.map +0 -1
  80. package/dist/src/asset/builtin.js +0 -337
  81. package/dist/src/asset/builtin.js.map +0 -1
  82. package/dist/src/asset/loaders/dds/dds.js +0 -470
  83. package/dist/src/asset/loaders/dds/dds.js.map +0 -1
  84. package/dist/src/asset/loaders/dds/dds_loader.js +0 -28
  85. package/dist/src/asset/loaders/dds/dds_loader.js.map +0 -1
  86. package/dist/src/asset/loaders/gltf/gltf_loader.js +0 -1265
  87. package/dist/src/asset/loaders/gltf/gltf_loader.js.map +0 -1
  88. package/dist/src/asset/loaders/gltf/helpers.js +0 -327
  89. package/dist/src/asset/loaders/gltf/helpers.js.map +0 -1
  90. package/dist/src/asset/loaders/hdr/hdr.js +0 -180
  91. package/dist/src/asset/loaders/hdr/hdr.js.map +0 -1
  92. package/dist/src/asset/loaders/image/tga_Loader.js +0 -116
  93. package/dist/src/asset/loaders/image/tga_Loader.js.map +0 -1
  94. package/dist/src/asset/loaders/image/webimage_loader.js +0 -63
  95. package/dist/src/asset/loaders/image/webimage_loader.js.map +0 -1
  96. package/dist/src/asset/loaders/loader.js +0 -45
  97. package/dist/src/asset/loaders/loader.js.map +0 -1
  98. package/dist/src/asset/model.js +0 -414
  99. package/dist/src/asset/model.js.map +0 -1
  100. package/dist/src/blitter/bilateralblur.js +0 -221
  101. package/dist/src/blitter/bilateralblur.js.map +0 -1
  102. package/dist/src/blitter/blitter.js +0 -390
  103. package/dist/src/blitter/blitter.js.map +0 -1
  104. package/dist/src/blitter/box.js +0 -118
  105. package/dist/src/blitter/box.js.map +0 -1
  106. package/dist/src/blitter/copy.js +0 -22
  107. package/dist/src/blitter/copy.js.map +0 -1
  108. package/dist/src/blitter/gaussianblur.js +0 -228
  109. package/dist/src/blitter/gaussianblur.js.map +0 -1
  110. package/dist/src/camera/base.js +0 -92
  111. package/dist/src/camera/base.js.map +0 -1
  112. package/dist/src/camera/camera.js +0 -1005
  113. package/dist/src/camera/camera.js.map +0 -1
  114. package/dist/src/camera/fps.js +0 -238
  115. package/dist/src/camera/fps.js.map +0 -1
  116. package/dist/src/camera/orbit.js +0 -245
  117. package/dist/src/camera/orbit.js.map +0 -1
  118. package/dist/src/camera/orthocamera.js +0 -167
  119. package/dist/src/camera/orthocamera.js.map +0 -1
  120. package/dist/src/camera/perspectivecamera.js +0 -141
  121. package/dist/src/camera/perspectivecamera.js.map +0 -1
  122. package/dist/src/index.js +0 -120
  123. package/dist/src/index.js.map +0 -1
  124. package/dist/src/material/blinn.js +0 -81
  125. package/dist/src/material/blinn.js.map +0 -1
  126. package/dist/src/material/grassmaterial.js +0 -113
  127. package/dist/src/material/grassmaterial.js.map +0 -1
  128. package/dist/src/material/lambert.js +0 -92
  129. package/dist/src/material/lambert.js.map +0 -1
  130. package/dist/src/material/material.js +0 -301
  131. package/dist/src/material/material.js.map +0 -1
  132. package/dist/src/material/meshmaterial.js +0 -704
  133. package/dist/src/material/meshmaterial.js.map +0 -1
  134. package/dist/src/material/mixins/albedocolor.js +0 -76
  135. package/dist/src/material/mixins/albedocolor.js.map +0 -1
  136. package/dist/src/material/mixins/foliage.js +0 -47
  137. package/dist/src/material/mixins/foliage.js.map +0 -1
  138. package/dist/src/material/mixins/lightmodel/blinnphong.js +0 -112
  139. package/dist/src/material/mixins/lightmodel/blinnphong.js.map +0 -1
  140. package/dist/src/material/mixins/lightmodel/lambert.js +0 -58
  141. package/dist/src/material/mixins/lightmodel/lambert.js.map +0 -1
  142. package/dist/src/material/mixins/lightmodel/pbrmetallicroughness.js +0 -178
  143. package/dist/src/material/mixins/lightmodel/pbrmetallicroughness.js.map +0 -1
  144. package/dist/src/material/mixins/lightmodel/pbrspecularglossness.js +0 -139
  145. package/dist/src/material/mixins/lightmodel/pbrspecularglossness.js.map +0 -1
  146. package/dist/src/material/mixins/lit.js +0 -476
  147. package/dist/src/material/mixins/lit.js.map +0 -1
  148. package/dist/src/material/mixins/pbr/common.js +0 -918
  149. package/dist/src/material/mixins/pbr/common.js.map +0 -1
  150. package/dist/src/material/mixins/texture.js +0 -172
  151. package/dist/src/material/mixins/texture.js.map +0 -1
  152. package/dist/src/material/mixins/vertexcolor.js +0 -56
  153. package/dist/src/material/mixins/vertexcolor.js.map +0 -1
  154. package/dist/src/material/particle.js +0 -178
  155. package/dist/src/material/particle.js.map +0 -1
  156. package/dist/src/material/pbrmr.js +0 -97
  157. package/dist/src/material/pbrmr.js.map +0 -1
  158. package/dist/src/material/pbrsg.js +0 -97
  159. package/dist/src/material/pbrsg.js.map +0 -1
  160. package/dist/src/material/shader/helper.js +0 -1209
  161. package/dist/src/material/shader/helper.js.map +0 -1
  162. package/dist/src/material/terrain-cm.js +0 -606
  163. package/dist/src/material/terrain-cm.js.map +0 -1
  164. package/dist/src/material/terrainmaterial.js +0 -375
  165. package/dist/src/material/terrainmaterial.js.map +0 -1
  166. package/dist/src/material/unlit.js +0 -41
  167. package/dist/src/material/unlit.js.map +0 -1
  168. package/dist/src/material/water.js +0 -417
  169. package/dist/src/material/water.js.map +0 -1
  170. package/dist/src/posteffect/bloom.js +0 -361
  171. package/dist/src/posteffect/bloom.js.map +0 -1
  172. package/dist/src/posteffect/compositor.js +0 -226
  173. package/dist/src/posteffect/compositor.js.map +0 -1
  174. package/dist/src/posteffect/fxaa.js +0 -273
  175. package/dist/src/posteffect/fxaa.js.map +0 -1
  176. package/dist/src/posteffect/grayscale.js +0 -69
  177. package/dist/src/posteffect/grayscale.js.map +0 -1
  178. package/dist/src/posteffect/motionblur.js +0 -96
  179. package/dist/src/posteffect/motionblur.js.map +0 -1
  180. package/dist/src/posteffect/posteffect.js +0 -126
  181. package/dist/src/posteffect/posteffect.js.map +0 -1
  182. package/dist/src/posteffect/sao.js +0 -324
  183. package/dist/src/posteffect/sao.js.map +0 -1
  184. package/dist/src/posteffect/ssr.js +0 -489
  185. package/dist/src/posteffect/ssr.js.map +0 -1
  186. package/dist/src/posteffect/taa.js +0 -172
  187. package/dist/src/posteffect/taa.js.map +0 -1
  188. package/dist/src/posteffect/tonemap.js +0 -94
  189. package/dist/src/posteffect/tonemap.js.map +0 -1
  190. package/dist/src/render/abuffer_oit.js +0 -361
  191. package/dist/src/render/abuffer_oit.js.map +0 -1
  192. package/dist/src/render/clipmap.js +0 -851
  193. package/dist/src/render/clipmap.js.map +0 -1
  194. package/dist/src/render/cluster_light.js +0 -333
  195. package/dist/src/render/cluster_light.js.map +0 -1
  196. package/dist/src/render/cull_visitor.js +0 -187
  197. package/dist/src/render/cull_visitor.js.map +0 -1
  198. package/dist/src/render/depthpass.js +0 -68
  199. package/dist/src/render/depthpass.js.map +0 -1
  200. package/dist/src/render/drawable_mixin.js +0 -227
  201. package/dist/src/render/drawable_mixin.js.map +0 -1
  202. package/dist/src/render/envlight.js +0 -463
  203. package/dist/src/render/envlight.js.map +0 -1
  204. package/dist/src/render/fbm_wavegenerator.js +0 -251
  205. package/dist/src/render/fbm_wavegenerator.js.map +0 -1
  206. package/dist/src/render/fft_wavegenerator.js +0 -1006
  207. package/dist/src/render/fft_wavegenerator.js.map +0 -1
  208. package/dist/src/render/fullscreenquad.js +0 -38
  209. package/dist/src/render/fullscreenquad.js.map +0 -1
  210. package/dist/src/render/gerstner_wavegenerator.js +0 -314
  211. package/dist/src/render/gerstner_wavegenerator.js.map +0 -1
  212. package/dist/src/render/globalbindgroup_allocator.js +0 -60
  213. package/dist/src/render/globalbindgroup_allocator.js.map +0 -1
  214. package/dist/src/render/hzb.js +0 -273
  215. package/dist/src/render/hzb.js.map +0 -1
  216. package/dist/src/render/lightpass.js +0 -172
  217. package/dist/src/render/lightpass.js.map +0 -1
  218. package/dist/src/render/objectcolorpass.js +0 -51
  219. package/dist/src/render/objectcolorpass.js.map +0 -1
  220. package/dist/src/render/primitive.js +0 -364
  221. package/dist/src/render/primitive.js.map +0 -1
  222. package/dist/src/render/render_queue.js +0 -467
  223. package/dist/src/render/render_queue.js.map +0 -1
  224. package/dist/src/render/renderbundle_wrapper.js +0 -152
  225. package/dist/src/render/renderbundle_wrapper.js.map +0 -1
  226. package/dist/src/render/renderer.js +0 -455
  227. package/dist/src/render/renderer.js.map +0 -1
  228. package/dist/src/render/renderpass.js +0 -200
  229. package/dist/src/render/renderpass.js.map +0 -1
  230. package/dist/src/render/shadowmap_pass.js +0 -56
  231. package/dist/src/render/shadowmap_pass.js.map +0 -1
  232. package/dist/src/render/sky.js +0 -1103
  233. package/dist/src/render/sky.js.map +0 -1
  234. package/dist/src/render/weightedblended_oit.js +0 -168
  235. package/dist/src/render/weightedblended_oit.js.map +0 -1
  236. package/dist/src/scene/batchgroup.js +0 -162
  237. package/dist/src/scene/batchgroup.js.map +0 -1
  238. package/dist/src/scene/environment.js +0 -209
  239. package/dist/src/scene/environment.js.map +0 -1
  240. package/dist/src/scene/graph_node.js +0 -72
  241. package/dist/src/scene/graph_node.js.map +0 -1
  242. package/dist/src/scene/light.js +0 -416
  243. package/dist/src/scene/light.js.map +0 -1
  244. package/dist/src/scene/mesh.js +0 -341
  245. package/dist/src/scene/mesh.js.map +0 -1
  246. package/dist/src/scene/octree.js +0 -649
  247. package/dist/src/scene/octree.js.map +0 -1
  248. package/dist/src/scene/particlesys.js +0 -738
  249. package/dist/src/scene/particlesys.js.map +0 -1
  250. package/dist/src/scene/raycast_visitor.js +0 -103
  251. package/dist/src/scene/raycast_visitor.js.map +0 -1
  252. package/dist/src/scene/scene.js +0 -284
  253. package/dist/src/scene/scene.js.map +0 -1
  254. package/dist/src/scene/scene_node.js +0 -732
  255. package/dist/src/scene/scene_node.js.map +0 -1
  256. package/dist/src/scene/terrain/grass.js +0 -278
  257. package/dist/src/scene/terrain/grass.js.map +0 -1
  258. package/dist/src/scene/terrain/heightfield.js +0 -475
  259. package/dist/src/scene/terrain/heightfield.js.map +0 -1
  260. package/dist/src/scene/terrain/patch.js +0 -530
  261. package/dist/src/scene/terrain/patch.js.map +0 -1
  262. package/dist/src/scene/terrain/quadtree.js +0 -461
  263. package/dist/src/scene/terrain/quadtree.js.map +0 -1
  264. package/dist/src/scene/terrain/terrain.js +0 -246
  265. package/dist/src/scene/terrain/terrain.js.map +0 -1
  266. package/dist/src/scene/terrain-cm/grass.js +0 -594
  267. package/dist/src/scene/terrain-cm/grass.js.map +0 -1
  268. package/dist/src/scene/terrain-cm/grassmaterial.js +0 -159
  269. package/dist/src/scene/terrain-cm/grassmaterial.js.map +0 -1
  270. package/dist/src/scene/terrain-cm/terrain-cm.js +0 -538
  271. package/dist/src/scene/terrain-cm/terrain-cm.js.map +0 -1
  272. package/dist/src/scene/water.js +0 -374
  273. package/dist/src/scene/water.js.map +0 -1
  274. package/dist/src/shaders/atmosphere.js +0 -957
  275. package/dist/src/shaders/atmosphere.js.map +0 -1
  276. package/dist/src/shaders/fog.js +0 -112
  277. package/dist/src/shaders/fog.js.map +0 -1
  278. package/dist/src/shaders/misc.js +0 -266
  279. package/dist/src/shaders/misc.js.map +0 -1
  280. package/dist/src/shaders/noise.js +0 -222
  281. package/dist/src/shaders/noise.js.map +0 -1
  282. package/dist/src/shaders/pbr.js +0 -51
  283. package/dist/src/shaders/pbr.js.map +0 -1
  284. package/dist/src/shaders/shadow.js +0 -636
  285. package/dist/src/shaders/shadow.js.map +0 -1
  286. package/dist/src/shaders/ssr.js +0 -490
  287. package/dist/src/shaders/ssr.js.map +0 -1
  288. package/dist/src/shaders/temporal.js +0 -215
  289. package/dist/src/shaders/temporal.js.map +0 -1
  290. package/dist/src/shaders/water.js +0 -756
  291. package/dist/src/shaders/water.js.map +0 -1
  292. package/dist/src/shadow/esm.js +0 -237
  293. package/dist/src/shadow/esm.js.map +0 -1
  294. package/dist/src/shadow/pcf_opt.js +0 -181
  295. package/dist/src/shadow/pcf_opt.js.map +0 -1
  296. package/dist/src/shadow/pcf_pd.js +0 -189
  297. package/dist/src/shadow/pcf_pd.js.map +0 -1
  298. package/dist/src/shadow/shader.js +0 -37
  299. package/dist/src/shadow/shader.js.map +0 -1
  300. package/dist/src/shadow/shadow_impl.js +0 -15
  301. package/dist/src/shadow/shadow_impl.js.map +0 -1
  302. package/dist/src/shadow/shadowmapper.js +0 -790
  303. package/dist/src/shadow/shadowmapper.js.map +0 -1
  304. package/dist/src/shadow/ssm.js +0 -159
  305. package/dist/src/shadow/ssm.js.map +0 -1
  306. package/dist/src/shadow/vsm.js +0 -297
  307. package/dist/src/shadow/vsm.js.map +0 -1
  308. package/dist/src/shapes/box.js +0 -386
  309. package/dist/src/shapes/box.js.map +0 -1
  310. package/dist/src/shapes/cylinder.js +0 -125
  311. package/dist/src/shapes/cylinder.js.map +0 -1
  312. package/dist/src/shapes/plane.js +0 -88
  313. package/dist/src/shapes/plane.js.map +0 -1
  314. package/dist/src/shapes/shape.js +0 -87
  315. package/dist/src/shapes/shape.js.map +0 -1
  316. package/dist/src/shapes/sphere.js +0 -114
  317. package/dist/src/shapes/sphere.js.map +0 -1
  318. package/dist/src/shapes/tetrahedron.js +0 -188
  319. package/dist/src/shapes/tetrahedron.js.map +0 -1
  320. package/dist/src/shapes/torus.js +0 -111
  321. package/dist/src/shapes/torus.js.map +0 -1
  322. package/dist/src/utility/aabbtree.js +0 -400
  323. package/dist/src/utility/aabbtree.js.map +0 -1
  324. package/dist/src/utility/bounding_volume.js +0 -29
  325. package/dist/src/utility/bounding_volume.js.map +0 -1
  326. package/dist/src/utility/debug.js +0 -28
  327. package/dist/src/utility/debug.js.map +0 -1
  328. package/dist/src/utility/draco/decoder.js +0 -116
  329. package/dist/src/utility/draco/decoder.js.map +0 -1
  330. package/dist/src/utility/misc.js +0 -105
  331. package/dist/src/utility/misc.js.map +0 -1
  332. package/dist/src/utility/panorama.js +0 -163
  333. package/dist/src/utility/panorama.js.map +0 -1
  334. package/dist/src/utility/pmrem.js +0 -354
  335. package/dist/src/utility/pmrem.js.map +0 -1
  336. package/dist/src/utility/rendermipmap.js +0 -115
  337. package/dist/src/utility/rendermipmap.js.map +0 -1
  338. package/dist/src/utility/serialization/json.js +0 -402
  339. package/dist/src/utility/serialization/json.js.map +0 -1
  340. package/dist/src/utility/serialization/manager.js +0 -623
  341. package/dist/src/utility/serialization/manager.js.map +0 -1
  342. package/dist/src/utility/serialization/scene/animation.js +0 -248
  343. package/dist/src/utility/serialization/scene/animation.js.map +0 -1
  344. package/dist/src/utility/serialization/scene/batch.js +0 -59
  345. package/dist/src/utility/serialization/scene/batch.js.map +0 -1
  346. package/dist/src/utility/serialization/scene/camera.js +0 -790
  347. package/dist/src/utility/serialization/scene/camera.js.map +0 -1
  348. package/dist/src/utility/serialization/scene/common.js +0 -222
  349. package/dist/src/utility/serialization/scene/common.js.map +0 -1
  350. package/dist/src/utility/serialization/scene/light.js +0 -575
  351. package/dist/src/utility/serialization/scene/light.js.map +0 -1
  352. package/dist/src/utility/serialization/scene/material.js +0 -1111
  353. package/dist/src/utility/serialization/scene/material.js.map +0 -1
  354. package/dist/src/utility/serialization/scene/mesh.js +0 -148
  355. package/dist/src/utility/serialization/scene/mesh.js.map +0 -1
  356. package/dist/src/utility/serialization/scene/misc.js +0 -39
  357. package/dist/src/utility/serialization/scene/misc.js.map +0 -1
  358. package/dist/src/utility/serialization/scene/node.js +0 -451
  359. package/dist/src/utility/serialization/scene/node.js.map +0 -1
  360. package/dist/src/utility/serialization/scene/particle.js +0 -425
  361. package/dist/src/utility/serialization/scene/particle.js.map +0 -1
  362. package/dist/src/utility/serialization/scene/primitive.js +0 -692
  363. package/dist/src/utility/serialization/scene/primitive.js.map +0 -1
  364. package/dist/src/utility/serialization/scene/scene.js +0 -704
  365. package/dist/src/utility/serialization/scene/scene.js.map +0 -1
  366. package/dist/src/utility/serialization/scene/terrain.js +0 -488
  367. package/dist/src/utility/serialization/scene/terrain.js.map +0 -1
  368. package/dist/src/utility/serialization/scene/water.js +0 -465
  369. package/dist/src/utility/serialization/scene/water.js.map +0 -1
  370. package/dist/src/utility/shprojector.js +0 -297
  371. package/dist/src/utility/shprojector.js.map +0 -1
  372. package/dist/src/utility/textures/ggxlut.js +0 -213
  373. package/dist/src/utility/textures/ggxlut.js.map +0 -1
  374. package/dist/src/utility/textures/gradientnoise.js +0 -62
  375. package/dist/src/utility/textures/gradientnoise.js.map +0 -1
  376. package/dist/src/utility/textures/randomnoise.js +0 -41
  377. package/dist/src/utility/textures/randomnoise.js.map +0 -1
  378. package/dist/src/values.js +0 -162
  379. package/dist/src/values.js.map +0 -1
  380. package/dist/utility/blueprint/material/common.js +0 -7
  381. package/dist/utility/blueprint/material/common.js.map +0 -1
  382. package/dist/utility/serialization/blueprint/constants.js +0 -255
  383. package/dist/utility/serialization/blueprint/constants.js.map +0 -1
  384. package/dist/utility/serialization/blueprint/material/constants.js +0 -203
  385. package/dist/utility/serialization/blueprint/material/constants.js.map +0 -1
  386. package/dist/utility/serialization/blueprint/material/texture.js +0 -165
  387. package/dist/utility/serialization/blueprint/material/texture.js.map +0 -1
@@ -0,0 +1,240 @@
1
+ import { Vector3, Quaternion } from '@zephyr3d/base';
2
+
3
+ /**
4
+ * Spring bone for physics-based animation.
5
+ *
6
+ * @remarks
7
+ * A spring bone simulates physics on a bone node, commonly used for:
8
+ * - Skirts and dresses
9
+ * - Hair strands
10
+ * - Tails
11
+ * - Capes and cloth
12
+ *
13
+ * The bone follows its parent's animation but adds secondary motion
14
+ * based on physics simulation (springs, gravity, inertia).
15
+ *
16
+ * @public
17
+ */ class SpringBone {
18
+ /** The bone node this spring controls */ _bone;
19
+ /** Current position in world space */ _currentPosition;
20
+ /** Previous position in world space (for velocity calculation) */ _previousPosition;
21
+ /** Initial local position relative to parent */ _initialLocalPosition;
22
+ /** Initial bone length (distance from parent) */ _boneLength;
23
+ /** Spring stiffness (0-1, higher = stiffer) */ _stiffness;
24
+ /** Damping factor (0-1, higher = more damping) */ _damping;
25
+ /** Mass of the bone (affects inertia) */ _mass;
26
+ /** Gravity scale (1 = normal gravity, 0 = no gravity) */ _gravityScale;
27
+ /** Radius for collision detection */ _radius;
28
+ /**
29
+ * Create a spring bone.
30
+ *
31
+ * @param bone - The bone node to control
32
+ * @param stiffness - Spring stiffness (0-1, default: 0.1)
33
+ * @param damping - Damping factor (0-1, default: 0.5)
34
+ * @param mass - Mass of the bone (default: 1)
35
+ * @param gravityScale - Gravity scale (default: 1)
36
+ * @param radius - Collision radius (default: 0.05)
37
+ */ constructor(bone, stiffness = 0.1, damping = 0.5, mass = 1, gravityScale = 1, radius = 0.05){
38
+ this._bone = bone;
39
+ this._stiffness = Math.max(0, Math.min(1, stiffness));
40
+ this._damping = Math.max(0, Math.min(1, damping));
41
+ this._mass = Math.max(0.01, mass);
42
+ this._gravityScale = gravityScale;
43
+ this._radius = Math.max(0, radius);
44
+ // Store initial local transform
45
+ this._initialLocalPosition = bone.position.clone();
46
+ this._boneLength = this._initialLocalPosition.magnitude;
47
+ // Initialize positions in world space
48
+ const worldPos = new Vector3();
49
+ bone.worldMatrix.decompose(null, null, worldPos);
50
+ this._currentPosition = worldPos.clone();
51
+ this._previousPosition = worldPos.clone();
52
+ }
53
+ /**
54
+ * Get the bone node.
55
+ */ get bone() {
56
+ return this._bone;
57
+ }
58
+ /**
59
+ * Get/set spring stiffness (0-1).
60
+ */ get stiffness() {
61
+ return this._stiffness;
62
+ }
63
+ set stiffness(value) {
64
+ this._stiffness = Math.max(0, Math.min(1, value));
65
+ }
66
+ /**
67
+ * Get/set damping factor (0-1).
68
+ */ get damping() {
69
+ return this._damping;
70
+ }
71
+ set damping(value) {
72
+ this._damping = Math.max(0, Math.min(1, value));
73
+ }
74
+ /**
75
+ * Get/set mass.
76
+ */ get mass() {
77
+ return this._mass;
78
+ }
79
+ set mass(value) {
80
+ this._mass = Math.max(0.01, value);
81
+ }
82
+ /**
83
+ * Get/set gravity scale.
84
+ */ get gravityScale() {
85
+ return this._gravityScale;
86
+ }
87
+ set gravityScale(value) {
88
+ this._gravityScale = value;
89
+ }
90
+ /**
91
+ * Get/set collision radius.
92
+ */ get radius() {
93
+ return this._radius;
94
+ }
95
+ set radius(value) {
96
+ this._radius = Math.max(0, value);
97
+ }
98
+ /**
99
+ * Get current position in world space.
100
+ */ get currentPosition() {
101
+ return this._currentPosition;
102
+ }
103
+ /**
104
+ * Get initial local position relative to parent.
105
+ */ get initialLocalPosition() {
106
+ return this._initialLocalPosition;
107
+ }
108
+ /**
109
+ * Reset the spring bone to its initial state.
110
+ */ reset() {
111
+ const worldPos = new Vector3();
112
+ this._bone.worldMatrix.decompose(null, null, worldPos);
113
+ this._currentPosition.set(worldPos);
114
+ this._previousPosition.set(worldPos);
115
+ }
116
+ /**
117
+ * Update spring physics.
118
+ *
119
+ * @param deltaTime - Time step in seconds
120
+ * @param gravity - Gravity vector in world space
121
+ * @param windForce - Wind force vector in world space
122
+ */ update(deltaTime, gravity, windForce) {
123
+ // Clamp delta time to avoid instability (1ms to 100ms)
124
+ if (deltaTime <= 0.001 || deltaTime > 0.1) {
125
+ return; // Skip invalid or too large time steps
126
+ }
127
+ // Get parent's world position
128
+ const parent = this._bone.parent;
129
+ if (!parent) {
130
+ return; // Root bone, no spring simulation
131
+ }
132
+ const parentWorldPos = new Vector3();
133
+ parent.worldMatrix.decompose(null, null, parentWorldPos);
134
+ // Calculate velocity from previous frame
135
+ const velocity = Vector3.sub(this._currentPosition, this._previousPosition, new Vector3());
136
+ Vector3.scale(velocity, 1 / deltaTime, velocity);
137
+ // Store current position as previous
138
+ this._previousPosition.set(this._currentPosition);
139
+ // Calculate forces
140
+ const totalForce = new Vector3();
141
+ // 1. Gravity force
142
+ const gravityForce = Vector3.scale(gravity, this._gravityScale * this._mass, new Vector3());
143
+ totalForce.addBy(gravityForce);
144
+ // 2. Wind force
145
+ totalForce.addBy(windForce);
146
+ // 3. Damping force (opposes velocity)
147
+ const dampingForce = Vector3.scale(velocity, -this._damping * this._mass, new Vector3());
148
+ totalForce.addBy(dampingForce);
149
+ // 4. Spring force (only if stretched beyond bone length)
150
+ const toChild = Vector3.sub(this._currentPosition, parentWorldPos, new Vector3());
151
+ const currentLength = toChild.magnitude;
152
+ if (currentLength > this._boneLength + 0.001) {
153
+ // Bone is stretched, apply restoring force
154
+ const stretchAmount = currentLength - this._boneLength;
155
+ const direction = Vector3.scale(toChild, -1 / currentLength, new Vector3());
156
+ const springForce = Vector3.scale(direction, stretchAmount * this._stiffness * 100, new Vector3());
157
+ totalForce.addBy(springForce);
158
+ }
159
+ // Calculate acceleration (F = ma, a = F/m)
160
+ const acceleration = Vector3.scale(totalForce, 1 / this._mass, new Vector3());
161
+ // Update velocity
162
+ velocity.addBy(Vector3.scale(acceleration, deltaTime, new Vector3()));
163
+ // Apply velocity damping (additional damping to prevent oscillation)
164
+ const velocityMagnitude = velocity.magnitude;
165
+ if (velocityMagnitude > 0.001) {
166
+ const dampingFactor = Math.max(0, 1 - this._damping * deltaTime * 10);
167
+ velocity.scaleBy(dampingFactor);
168
+ }
169
+ // Update position
170
+ this._currentPosition.addBy(Vector3.scale(velocity, deltaTime, new Vector3()));
171
+ // Constrain to bone length (hard constraint)
172
+ const finalToChild = Vector3.sub(this._currentPosition, parentWorldPos, new Vector3());
173
+ const finalLength = finalToChild.magnitude;
174
+ if (finalLength > 0.000001) {
175
+ const direction = Vector3.scale(finalToChild, 1 / finalLength, new Vector3());
176
+ const targetPos = Vector3.add(parentWorldPos, Vector3.scale(direction, this._boneLength, new Vector3()), new Vector3());
177
+ // Soft constraint: blend toward target position
178
+ // This prevents the hard snap that causes oscillation
179
+ const constraintStrength = 0.5; // 0 = no constraint, 1 = hard constraint
180
+ this._currentPosition.x += (targetPos.x - this._currentPosition.x) * constraintStrength;
181
+ this._currentPosition.y += (targetPos.y - this._currentPosition.y) * constraintStrength;
182
+ this._currentPosition.z += (targetPos.z - this._currentPosition.z) * constraintStrength;
183
+ }
184
+ }
185
+ /**
186
+ * Apply the simulated position to the bone node.
187
+ *
188
+ * @remarks
189
+ * This converts the world space position back to local rotation.
190
+ */ applyToNode() {
191
+ const parent = this._bone.parent;
192
+ if (!parent) {
193
+ return;
194
+ }
195
+ // Get parent's world position and rotation
196
+ const parentWorldPos = new Vector3();
197
+ const parentWorldRot = new Quaternion();
198
+ parent.worldMatrix.decompose(null, parentWorldRot, parentWorldPos);
199
+ // Calculate current direction from parent to simulated position (in world space)
200
+ const currentDir = Vector3.sub(this._currentPosition, parentWorldPos, new Vector3());
201
+ const currentLength = currentDir.magnitude;
202
+ if (currentLength < 0.000001) {
203
+ return; // Too close to parent
204
+ }
205
+ currentDir.scaleBy(1 / currentLength);
206
+ // Transform current direction to parent's local space
207
+ const parentInvRot = Quaternion.conjugate(parentWorldRot, new Quaternion());
208
+ const currentDirLocal = parentInvRot.transform(currentDir, new Vector3());
209
+ // Original direction in local space (normalized)
210
+ const originalDirLocal = Vector3.normalize(this._initialLocalPosition, new Vector3());
211
+ // Calculate local rotation from original to current
212
+ const localRotation = new Quaternion();
213
+ this._fromToRotation(originalDirLocal, currentDirLocal, localRotation);
214
+ // Apply to bone
215
+ this._bone.rotation = localRotation;
216
+ }
217
+ /**
218
+ * Calculate rotation from one direction to another.
219
+ */ _fromToRotation(from, to, result) {
220
+ const dot = Vector3.dot(from, to);
221
+ if (dot >= 0.999999) {
222
+ return result.identity();
223
+ }
224
+ if (dot <= -0.999999) {
225
+ let axis = Vector3.cross(Vector3.axisPX(), from, new Vector3());
226
+ const lenSq = axis.x * axis.x + axis.y * axis.y + axis.z * axis.z;
227
+ if (lenSq < 0.000001) {
228
+ axis = Vector3.cross(Vector3.axisPY(), from, new Vector3());
229
+ }
230
+ axis.inplaceNormalize();
231
+ return result.fromAxisAngle(axis, Math.PI);
232
+ }
233
+ const axis = Vector3.cross(from, to).inplaceNormalize();
234
+ const angle = Math.acos(dot);
235
+ return result.fromAxisAngle(axis, angle);
236
+ }
237
+ }
238
+
239
+ export { SpringBone };
240
+ //# sourceMappingURL=spring_bone.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"spring_bone.js","sources":["../../../src/animation/spring/spring_bone.ts"],"sourcesContent":["import { Vector3, Quaternion } from '@zephyr3d/base';\r\nimport type { SceneNode } from '../../scene/scene_node';\r\n\r\n/**\r\n * Spring bone for physics-based animation.\r\n *\r\n * @remarks\r\n * A spring bone simulates physics on a bone node, commonly used for:\r\n * - Skirts and dresses\r\n * - Hair strands\r\n * - Tails\r\n * - Capes and cloth\r\n *\r\n * The bone follows its parent's animation but adds secondary motion\r\n * based on physics simulation (springs, gravity, inertia).\r\n *\r\n * @public\r\n */\r\nexport class SpringBone {\r\n /** The bone node this spring controls */\r\n private _bone: SceneNode;\r\n /** Current position in world space */\r\n private _currentPosition: Vector3;\r\n /** Previous position in world space (for velocity calculation) */\r\n private _previousPosition: Vector3;\r\n /** Initial local position relative to parent */\r\n private _initialLocalPosition: Vector3;\r\n /** Initial bone length (distance from parent) */\r\n private _boneLength: number;\r\n\r\n /** Spring stiffness (0-1, higher = stiffer) */\r\n private _stiffness: number;\r\n /** Damping factor (0-1, higher = more damping) */\r\n private _damping: number;\r\n /** Mass of the bone (affects inertia) */\r\n private _mass: number;\r\n /** Gravity scale (1 = normal gravity, 0 = no gravity) */\r\n private _gravityScale: number;\r\n\r\n /** Radius for collision detection */\r\n private _radius: number;\r\n\r\n /**\r\n * Create a spring bone.\r\n *\r\n * @param bone - The bone node to control\r\n * @param stiffness - Spring stiffness (0-1, default: 0.1)\r\n * @param damping - Damping factor (0-1, default: 0.5)\r\n * @param mass - Mass of the bone (default: 1)\r\n * @param gravityScale - Gravity scale (default: 1)\r\n * @param radius - Collision radius (default: 0.05)\r\n */\r\n constructor(\r\n bone: SceneNode,\r\n stiffness = 0.1,\r\n damping = 0.5,\r\n mass = 1,\r\n gravityScale = 1,\r\n radius = 0.05\r\n ) {\r\n this._bone = bone;\r\n this._stiffness = Math.max(0, Math.min(1, stiffness));\r\n this._damping = Math.max(0, Math.min(1, damping));\r\n this._mass = Math.max(0.01, mass);\r\n this._gravityScale = gravityScale;\r\n this._radius = Math.max(0, radius);\r\n\r\n // Store initial local transform\r\n this._initialLocalPosition = bone.position.clone();\r\n this._boneLength = this._initialLocalPosition.magnitude;\r\n\r\n // Initialize positions in world space\r\n const worldPos = new Vector3();\r\n bone.worldMatrix.decompose(null, null, worldPos);\r\n this._currentPosition = worldPos.clone();\r\n this._previousPosition = worldPos.clone();\r\n }\r\n\r\n /**\r\n * Get the bone node.\r\n */\r\n get bone(): SceneNode {\r\n return this._bone;\r\n }\r\n\r\n /**\r\n * Get/set spring stiffness (0-1).\r\n */\r\n get stiffness(): number {\r\n return this._stiffness;\r\n }\r\n\r\n set stiffness(value: number) {\r\n this._stiffness = Math.max(0, Math.min(1, value));\r\n }\r\n\r\n /**\r\n * Get/set damping factor (0-1).\r\n */\r\n get damping(): number {\r\n return this._damping;\r\n }\r\n\r\n set damping(value: number) {\r\n this._damping = Math.max(0, Math.min(1, value));\r\n }\r\n\r\n /**\r\n * Get/set mass.\r\n */\r\n get mass(): number {\r\n return this._mass;\r\n }\r\n\r\n set mass(value: number) {\r\n this._mass = Math.max(0.01, value);\r\n }\r\n\r\n /**\r\n * Get/set gravity scale.\r\n */\r\n get gravityScale(): number {\r\n return this._gravityScale;\r\n }\r\n\r\n set gravityScale(value: number) {\r\n this._gravityScale = value;\r\n }\r\n\r\n /**\r\n * Get/set collision radius.\r\n */\r\n get radius(): number {\r\n return this._radius;\r\n }\r\n\r\n set radius(value: number) {\r\n this._radius = Math.max(0, value);\r\n }\r\n\r\n /**\r\n * Get current position in world space.\r\n */\r\n get currentPosition(): Vector3 {\r\n return this._currentPosition;\r\n }\r\n\r\n /**\r\n * Get initial local position relative to parent.\r\n */\r\n get initialLocalPosition(): Vector3 {\r\n return this._initialLocalPosition;\r\n }\r\n\r\n /**\r\n * Reset the spring bone to its initial state.\r\n */\r\n reset(): void {\r\n const worldPos = new Vector3();\r\n this._bone.worldMatrix.decompose(null, null, worldPos);\r\n this._currentPosition.set(worldPos);\r\n this._previousPosition.set(worldPos);\r\n }\r\n\r\n /**\r\n * Update spring physics.\r\n *\r\n * @param deltaTime - Time step in seconds\r\n * @param gravity - Gravity vector in world space\r\n * @param windForce - Wind force vector in world space\r\n */\r\n update(deltaTime: number, gravity: Vector3, windForce: Vector3): void {\r\n // Clamp delta time to avoid instability (1ms to 100ms)\r\n if (deltaTime <= 0.001 || deltaTime > 0.1) {\r\n return; // Skip invalid or too large time steps\r\n }\r\n\r\n // Get parent's world position\r\n const parent = this._bone.parent;\r\n if (!parent) {\r\n return; // Root bone, no spring simulation\r\n }\r\n\r\n const parentWorldPos = new Vector3();\r\n parent.worldMatrix.decompose(null, null, parentWorldPos);\r\n\r\n // Calculate velocity from previous frame\r\n const velocity = Vector3.sub(this._currentPosition, this._previousPosition, new Vector3());\r\n Vector3.scale(velocity, 1 / deltaTime, velocity);\r\n\r\n // Store current position as previous\r\n this._previousPosition.set(this._currentPosition);\r\n\r\n // Calculate forces\r\n const totalForce = new Vector3();\r\n\r\n // 1. Gravity force\r\n const gravityForce = Vector3.scale(gravity, this._gravityScale * this._mass, new Vector3());\r\n totalForce.addBy(gravityForce);\r\n\r\n // 2. Wind force\r\n totalForce.addBy(windForce);\r\n\r\n // 3. Damping force (opposes velocity)\r\n const dampingForce = Vector3.scale(velocity, -this._damping * this._mass, new Vector3());\r\n totalForce.addBy(dampingForce);\r\n\r\n // 4. Spring force (only if stretched beyond bone length)\r\n const toChild = Vector3.sub(this._currentPosition, parentWorldPos, new Vector3());\r\n const currentLength = toChild.magnitude;\r\n\r\n if (currentLength > this._boneLength + 0.001) {\r\n // Bone is stretched, apply restoring force\r\n const stretchAmount = currentLength - this._boneLength;\r\n const direction = Vector3.scale(toChild, -1 / currentLength, new Vector3());\r\n const springForce = Vector3.scale(direction, stretchAmount * this._stiffness * 100, new Vector3());\r\n totalForce.addBy(springForce);\r\n }\r\n\r\n // Calculate acceleration (F = ma, a = F/m)\r\n const acceleration = Vector3.scale(totalForce, 1 / this._mass, new Vector3());\r\n\r\n // Update velocity\r\n velocity.addBy(Vector3.scale(acceleration, deltaTime, new Vector3()));\r\n\r\n // Apply velocity damping (additional damping to prevent oscillation)\r\n const velocityMagnitude = velocity.magnitude;\r\n if (velocityMagnitude > 0.001) {\r\n const dampingFactor = Math.max(0, 1 - this._damping * deltaTime * 10);\r\n velocity.scaleBy(dampingFactor);\r\n }\r\n\r\n // Update position\r\n this._currentPosition.addBy(Vector3.scale(velocity, deltaTime, new Vector3()));\r\n\r\n // Constrain to bone length (hard constraint)\r\n const finalToChild = Vector3.sub(this._currentPosition, parentWorldPos, new Vector3());\r\n const finalLength = finalToChild.magnitude;\r\n\r\n if (finalLength > 0.000001) {\r\n const direction = Vector3.scale(finalToChild, 1 / finalLength, new Vector3());\r\n const targetPos = Vector3.add(\r\n parentWorldPos,\r\n Vector3.scale(direction, this._boneLength, new Vector3()),\r\n new Vector3()\r\n );\r\n\r\n // Soft constraint: blend toward target position\r\n // This prevents the hard snap that causes oscillation\r\n const constraintStrength = 0.5; // 0 = no constraint, 1 = hard constraint\r\n this._currentPosition.x += (targetPos.x - this._currentPosition.x) * constraintStrength;\r\n this._currentPosition.y += (targetPos.y - this._currentPosition.y) * constraintStrength;\r\n this._currentPosition.z += (targetPos.z - this._currentPosition.z) * constraintStrength;\r\n }\r\n }\r\n\r\n /**\r\n * Apply the simulated position to the bone node.\r\n *\r\n * @remarks\r\n * This converts the world space position back to local rotation.\r\n */\r\n applyToNode(): void {\r\n const parent = this._bone.parent;\r\n if (!parent) {\r\n return;\r\n }\r\n\r\n // Get parent's world position and rotation\r\n const parentWorldPos = new Vector3();\r\n const parentWorldRot = new Quaternion();\r\n parent.worldMatrix.decompose(null, parentWorldRot, parentWorldPos);\r\n\r\n // Calculate current direction from parent to simulated position (in world space)\r\n const currentDir = Vector3.sub(this._currentPosition, parentWorldPos, new Vector3());\r\n const currentLength = currentDir.magnitude;\r\n\r\n if (currentLength < 0.000001) {\r\n return; // Too close to parent\r\n }\r\n\r\n currentDir.scaleBy(1 / currentLength);\r\n\r\n // Transform current direction to parent's local space\r\n const parentInvRot = Quaternion.conjugate(parentWorldRot, new Quaternion());\r\n const currentDirLocal = parentInvRot.transform(currentDir, new Vector3());\r\n\r\n // Original direction in local space (normalized)\r\n const originalDirLocal = Vector3.normalize(this._initialLocalPosition, new Vector3());\r\n\r\n // Calculate local rotation from original to current\r\n const localRotation = new Quaternion();\r\n this._fromToRotation(originalDirLocal, currentDirLocal, localRotation);\r\n\r\n // Apply to bone\r\n this._bone.rotation = localRotation;\r\n }\r\n\r\n /**\r\n * Calculate rotation from one direction to another.\r\n */\r\n private _fromToRotation(from: Vector3, to: Vector3, result: Quaternion): Quaternion {\r\n const dot = Vector3.dot(from, to);\r\n\r\n if (dot >= 0.999999) {\r\n return result.identity();\r\n }\r\n\r\n if (dot <= -0.999999) {\r\n let axis = Vector3.cross(Vector3.axisPX(), from, new Vector3());\r\n const lenSq = axis.x * axis.x + axis.y * axis.y + axis.z * axis.z;\r\n if (lenSq < 0.000001) {\r\n axis = Vector3.cross(Vector3.axisPY(), from, new Vector3());\r\n }\r\n axis.inplaceNormalize();\r\n return result.fromAxisAngle(axis, Math.PI);\r\n }\r\n\r\n const axis = Vector3.cross(from, to).inplaceNormalize();\r\n const angle = Math.acos(dot);\r\n return result.fromAxisAngle(axis, angle);\r\n }\r\n}\r\n\r\n"],"names":["SpringBone","bone","stiffness","damping","mass","gravityScale","radius","_bone","_stiffness","Math","max","min","_damping","_mass","_gravityScale","_radius","_initialLocalPosition","position","clone","_boneLength","magnitude","worldPos","Vector3","worldMatrix","decompose","_currentPosition","_previousPosition","value","currentPosition","initialLocalPosition","reset","set","update","deltaTime","gravity","windForce","parent","parentWorldPos","velocity","sub","scale","totalForce","gravityForce","addBy","dampingForce","toChild","currentLength","stretchAmount","direction","springForce","acceleration","velocityMagnitude","dampingFactor","scaleBy","finalToChild","finalLength","targetPos","add","constraintStrength","x","y","z","applyToNode","parentWorldRot","Quaternion","currentDir","parentInvRot","conjugate","currentDirLocal","transform","originalDirLocal","normalize","localRotation","_fromToRotation","rotation","from","to","result","dot","identity","axis","cross","axisPX","lenSq","axisPY","inplaceNormalize","fromAxisAngle","PI","angle","acos"],"mappings":"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"}
@@ -0,0 +1,198 @@
1
+ import { Vector3 } from '@zephyr3d/base';
2
+
3
+ /**
4
+ * Base class for spring bone colliders.
5
+ *
6
+ * @public
7
+ */ class SpringBoneCollider {
8
+ }
9
+ /**
10
+ * Sphere collider for spring bones.
11
+ *
12
+ * @public
13
+ */ class SphereCollider extends SpringBoneCollider {
14
+ /** Center position in world space */ _center;
15
+ /** Sphere radius */ _radius;
16
+ /** Optional bone node to follow */ _bone;
17
+ /** Local offset from bone (if bone is set) */ _localOffset;
18
+ /**
19
+ * Create a sphere collider.
20
+ *
21
+ * @param center - Center position in world space (or local offset if bone is provided)
22
+ * @param radius - Sphere radius
23
+ * @param bone - Optional bone node to follow
24
+ */ constructor(center, radius, bone = null){
25
+ super();
26
+ this._center = center.clone();
27
+ this._radius = Math.max(0, radius);
28
+ this._bone = bone;
29
+ this._localOffset = bone ? center.clone() : new Vector3();
30
+ }
31
+ /**
32
+ * Get/set center position.
33
+ */ get center() {
34
+ if (this._bone) {
35
+ // Calculate world position from bone
36
+ const worldPos = new Vector3();
37
+ const matrix = this._bone.worldMatrix;
38
+ const offset = this._localOffset;
39
+ worldPos.x = matrix.m00 * offset.x + matrix.m01 * offset.y + matrix.m02 * offset.z + matrix.m03;
40
+ worldPos.y = matrix.m10 * offset.x + matrix.m11 * offset.y + matrix.m12 * offset.z + matrix.m13;
41
+ worldPos.z = matrix.m20 * offset.x + matrix.m21 * offset.y + matrix.m22 * offset.z + matrix.m23;
42
+ return worldPos;
43
+ }
44
+ return this._center;
45
+ }
46
+ set center(value) {
47
+ if (this._bone) {
48
+ this._localOffset.set(value);
49
+ } else {
50
+ this._center.set(value);
51
+ }
52
+ }
53
+ /**
54
+ * Get/set radius.
55
+ */ get radius() {
56
+ return this._radius;
57
+ }
58
+ set radius(value) {
59
+ this._radius = Math.max(0, value);
60
+ }
61
+ /**
62
+ * Get/set bone node.
63
+ */ get bone() {
64
+ return this._bone;
65
+ }
66
+ set bone(value) {
67
+ this._bone = value;
68
+ }
69
+ /**
70
+ * Test collision with a point and resolve it.
71
+ */ collide(position, radius) {
72
+ const center = this.center;
73
+ const direction = Vector3.sub(position, center, new Vector3());
74
+ const distance = direction.magnitude;
75
+ const minDistance = this._radius + radius;
76
+ if (distance < minDistance && distance > 0.000001) {
77
+ // Collision detected, push the point out
78
+ direction.scaleBy(1 / distance);
79
+ const penetration = minDistance - distance;
80
+ position.addBy(Vector3.scale(direction, penetration, new Vector3()));
81
+ return true;
82
+ }
83
+ return false;
84
+ }
85
+ }
86
+ /**
87
+ * Capsule collider for spring bones.
88
+ *
89
+ * @remarks
90
+ * A capsule is defined by two sphere centers and a radius.
91
+ * Useful for limbs like arms and legs.
92
+ *
93
+ * @public
94
+ */ class CapsuleCollider extends SpringBoneCollider {
95
+ /** Start point in world space */ _start;
96
+ /** End point in world space */ _end;
97
+ /** Capsule radius */ _radius;
98
+ /** Optional bone node for start point */ _startBone;
99
+ /** Optional bone node for end point */ _endBone;
100
+ /** Local offset for start point */ _startOffset;
101
+ /** Local offset for end point */ _endOffset;
102
+ /**
103
+ * Create a capsule collider.
104
+ *
105
+ * @param start - Start point in world space (or local offset if startBone is provided)
106
+ * @param end - End point in world space (or local offset if endBone is provided)
107
+ * @param radius - Capsule radius
108
+ * @param startBone - Optional bone node for start point
109
+ * @param endBone - Optional bone node for end point
110
+ */ constructor(start, end, radius, startBone = null, endBone = null){
111
+ super();
112
+ this._start = start.clone();
113
+ this._end = end.clone();
114
+ this._radius = Math.max(0, radius);
115
+ this._startBone = startBone;
116
+ this._endBone = endBone;
117
+ this._startOffset = startBone ? start.clone() : new Vector3();
118
+ this._endOffset = endBone ? end.clone() : new Vector3();
119
+ }
120
+ /**
121
+ * Get start point in world space.
122
+ */ get start() {
123
+ if (this._startBone) {
124
+ const worldPos = new Vector3();
125
+ const matrix = this._startBone.worldMatrix;
126
+ const offset = this._startOffset;
127
+ worldPos.x = matrix.m00 * offset.x + matrix.m01 * offset.y + matrix.m02 * offset.z + matrix.m03;
128
+ worldPos.y = matrix.m10 * offset.x + matrix.m11 * offset.y + matrix.m12 * offset.z + matrix.m13;
129
+ worldPos.z = matrix.m20 * offset.x + matrix.m21 * offset.y + matrix.m22 * offset.z + matrix.m23;
130
+ return worldPos;
131
+ }
132
+ return this._start;
133
+ }
134
+ /**
135
+ * Get end point in world space.
136
+ */ get end() {
137
+ if (this._endBone) {
138
+ const worldPos = new Vector3();
139
+ const matrix = this._endBone.worldMatrix;
140
+ const offset = this._endOffset;
141
+ worldPos.x = matrix.m00 * offset.x + matrix.m01 * offset.y + matrix.m02 * offset.z + matrix.m03;
142
+ worldPos.y = matrix.m10 * offset.x + matrix.m11 * offset.y + matrix.m12 * offset.z + matrix.m13;
143
+ worldPos.z = matrix.m20 * offset.x + matrix.m21 * offset.y + matrix.m22 * offset.z + matrix.m23;
144
+ return worldPos;
145
+ }
146
+ return this._end;
147
+ }
148
+ /**
149
+ * Get/set radius.
150
+ */ get radius() {
151
+ return this._radius;
152
+ }
153
+ set radius(value) {
154
+ this._radius = Math.max(0, value);
155
+ }
156
+ /**
157
+ * Test collision with a point and resolve it.
158
+ */ collide(position, radius) {
159
+ const start = this.start;
160
+ const end = this.end;
161
+ // Calculate closest point on capsule line segment
162
+ const line = Vector3.sub(end, start, new Vector3());
163
+ const lineLength = line.magnitude;
164
+ if (lineLength < 0.000001) {
165
+ // Degenerate capsule, treat as sphere
166
+ const direction = Vector3.sub(position, start, new Vector3());
167
+ const distance = direction.magnitude;
168
+ const minDistance = this._radius + radius;
169
+ if (distance < minDistance && distance > 0.000001) {
170
+ direction.scaleBy(1 / distance);
171
+ const penetration = minDistance - distance;
172
+ position.addBy(Vector3.scale(direction, penetration, new Vector3()));
173
+ return true;
174
+ }
175
+ return false;
176
+ }
177
+ const lineDir = Vector3.scale(line, 1 / lineLength, new Vector3());
178
+ const toPoint = Vector3.sub(position, start, new Vector3());
179
+ const t = Math.max(0, Math.min(lineLength, Vector3.dot(toPoint, lineDir)));
180
+ // Closest point on line segment
181
+ const closestPoint = Vector3.add(start, Vector3.scale(lineDir, t, new Vector3()), new Vector3());
182
+ // Check distance from closest point
183
+ const direction = Vector3.sub(position, closestPoint, new Vector3());
184
+ const distance = direction.magnitude;
185
+ const minDistance = this._radius + radius;
186
+ if (distance < minDistance && distance > 0.000001) {
187
+ // Collision detected, push the point out
188
+ direction.scaleBy(1 / distance);
189
+ const penetration = minDistance - distance;
190
+ position.addBy(Vector3.scale(direction, penetration, new Vector3()));
191
+ return true;
192
+ }
193
+ return false;
194
+ }
195
+ }
196
+
197
+ export { CapsuleCollider, SphereCollider, SpringBoneCollider };
198
+ //# sourceMappingURL=spring_bone_collider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"spring_bone_collider.js","sources":["../../../src/animation/spring/spring_bone_collider.ts"],"sourcesContent":["import { Vector3 } from '@zephyr3d/base';\r\nimport type { SceneNode } from '../../scene/scene_node';\r\n\r\n/**\r\n * Base class for spring bone colliders.\r\n *\r\n * @public\r\n */\r\nexport abstract class SpringBoneCollider {\r\n /**\r\n * Test collision with a point and resolve it.\r\n *\r\n * @param position - Point position in world space\r\n * @param radius - Point radius\r\n * @returns True if collision occurred and was resolved\r\n */\r\n abstract collide(position: Vector3, radius: number): boolean;\r\n}\r\n\r\n/**\r\n * Sphere collider for spring bones.\r\n *\r\n * @public\r\n */\r\nexport class SphereCollider extends SpringBoneCollider {\r\n /** Center position in world space */\r\n private _center: Vector3;\r\n /** Sphere radius */\r\n private _radius: number;\r\n /** Optional bone node to follow */\r\n private _bone: SceneNode | null;\r\n /** Local offset from bone (if bone is set) */\r\n private _localOffset: Vector3;\r\n\r\n /**\r\n * Create a sphere collider.\r\n *\r\n * @param center - Center position in world space (or local offset if bone is provided)\r\n * @param radius - Sphere radius\r\n * @param bone - Optional bone node to follow\r\n */\r\n constructor(center: Vector3, radius: number, bone: SceneNode | null = null) {\r\n super();\r\n this._center = center.clone();\r\n this._radius = Math.max(0, radius);\r\n this._bone = bone;\r\n this._localOffset = bone ? center.clone() : new Vector3();\r\n }\r\n\r\n /**\r\n * Get/set center position.\r\n */\r\n get center(): Vector3 {\r\n if (this._bone) {\r\n // Calculate world position from bone\r\n const worldPos = new Vector3();\r\n const matrix = this._bone.worldMatrix;\r\n const offset = this._localOffset;\r\n worldPos.x = matrix.m00 * offset.x + matrix.m01 * offset.y + matrix.m02 * offset.z + matrix.m03;\r\n worldPos.y = matrix.m10 * offset.x + matrix.m11 * offset.y + matrix.m12 * offset.z + matrix.m13;\r\n worldPos.z = matrix.m20 * offset.x + matrix.m21 * offset.y + matrix.m22 * offset.z + matrix.m23;\r\n return worldPos;\r\n }\r\n return this._center;\r\n }\r\n\r\n set center(value: Vector3) {\r\n if (this._bone) {\r\n this._localOffset.set(value);\r\n } else {\r\n this._center.set(value);\r\n }\r\n }\r\n\r\n /**\r\n * Get/set radius.\r\n */\r\n get radius(): number {\r\n return this._radius;\r\n }\r\n\r\n set radius(value: number) {\r\n this._radius = Math.max(0, value);\r\n }\r\n\r\n /**\r\n * Get/set bone node.\r\n */\r\n get bone(): SceneNode | null {\r\n return this._bone;\r\n }\r\n\r\n set bone(value: SceneNode | null) {\r\n this._bone = value;\r\n }\r\n\r\n /**\r\n * Test collision with a point and resolve it.\r\n */\r\n collide(position: Vector3, radius: number): boolean {\r\n const center = this.center;\r\n const direction = Vector3.sub(position, center, new Vector3());\r\n const distance = direction.magnitude;\r\n const minDistance = this._radius + radius;\r\n\r\n if (distance < minDistance && distance > 0.000001) {\r\n // Collision detected, push the point out\r\n direction.scaleBy(1 / distance);\r\n const penetration = minDistance - distance;\r\n position.addBy(Vector3.scale(direction, penetration, new Vector3()));\r\n return true;\r\n }\r\n\r\n return false;\r\n }\r\n}\r\n\r\n/**\r\n * Capsule collider for spring bones.\r\n *\r\n * @remarks\r\n * A capsule is defined by two sphere centers and a radius.\r\n * Useful for limbs like arms and legs.\r\n *\r\n * @public\r\n */\r\nexport class CapsuleCollider extends SpringBoneCollider {\r\n /** Start point in world space */\r\n private _start: Vector3;\r\n /** End point in world space */\r\n private _end: Vector3;\r\n /** Capsule radius */\r\n private _radius: number;\r\n /** Optional bone node for start point */\r\n private _startBone: SceneNode | null;\r\n /** Optional bone node for end point */\r\n private _endBone: SceneNode | null;\r\n /** Local offset for start point */\r\n private _startOffset: Vector3;\r\n /** Local offset for end point */\r\n private _endOffset: Vector3;\r\n\r\n /**\r\n * Create a capsule collider.\r\n *\r\n * @param start - Start point in world space (or local offset if startBone is provided)\r\n * @param end - End point in world space (or local offset if endBone is provided)\r\n * @param radius - Capsule radius\r\n * @param startBone - Optional bone node for start point\r\n * @param endBone - Optional bone node for end point\r\n */\r\n constructor(\r\n start: Vector3,\r\n end: Vector3,\r\n radius: number,\r\n startBone: SceneNode | null = null,\r\n endBone: SceneNode | null = null\r\n ) {\r\n super();\r\n this._start = start.clone();\r\n this._end = end.clone();\r\n this._radius = Math.max(0, radius);\r\n this._startBone = startBone;\r\n this._endBone = endBone;\r\n this._startOffset = startBone ? start.clone() : new Vector3();\r\n this._endOffset = endBone ? end.clone() : new Vector3();\r\n }\r\n\r\n /**\r\n * Get start point in world space.\r\n */\r\n get start(): Vector3 {\r\n if (this._startBone) {\r\n const worldPos = new Vector3();\r\n const matrix = this._startBone.worldMatrix;\r\n const offset = this._startOffset;\r\n worldPos.x = matrix.m00 * offset.x + matrix.m01 * offset.y + matrix.m02 * offset.z + matrix.m03;\r\n worldPos.y = matrix.m10 * offset.x + matrix.m11 * offset.y + matrix.m12 * offset.z + matrix.m13;\r\n worldPos.z = matrix.m20 * offset.x + matrix.m21 * offset.y + matrix.m22 * offset.z + matrix.m23;\r\n return worldPos;\r\n }\r\n return this._start;\r\n }\r\n\r\n /**\r\n * Get end point in world space.\r\n */\r\n get end(): Vector3 {\r\n if (this._endBone) {\r\n const worldPos = new Vector3();\r\n const matrix = this._endBone.worldMatrix;\r\n const offset = this._endOffset;\r\n worldPos.x = matrix.m00 * offset.x + matrix.m01 * offset.y + matrix.m02 * offset.z + matrix.m03;\r\n worldPos.y = matrix.m10 * offset.x + matrix.m11 * offset.y + matrix.m12 * offset.z + matrix.m13;\r\n worldPos.z = matrix.m20 * offset.x + matrix.m21 * offset.y + matrix.m22 * offset.z + matrix.m23;\r\n return worldPos;\r\n }\r\n return this._end;\r\n }\r\n\r\n /**\r\n * Get/set radius.\r\n */\r\n get radius(): number {\r\n return this._radius;\r\n }\r\n\r\n set radius(value: number) {\r\n this._radius = Math.max(0, value);\r\n }\r\n\r\n /**\r\n * Test collision with a point and resolve it.\r\n */\r\n collide(position: Vector3, radius: number): boolean {\r\n const start = this.start;\r\n const end = this.end;\r\n\r\n // Calculate closest point on capsule line segment\r\n const line = Vector3.sub(end, start, new Vector3());\r\n const lineLength = line.magnitude;\r\n\r\n if (lineLength < 0.000001) {\r\n // Degenerate capsule, treat as sphere\r\n const direction = Vector3.sub(position, start, new Vector3());\r\n const distance = direction.magnitude;\r\n const minDistance = this._radius + radius;\r\n\r\n if (distance < minDistance && distance > 0.000001) {\r\n direction.scaleBy(1 / distance);\r\n const penetration = minDistance - distance;\r\n position.addBy(Vector3.scale(direction, penetration, new Vector3()));\r\n return true;\r\n }\r\n return false;\r\n }\r\n\r\n const lineDir = Vector3.scale(line, 1 / lineLength, new Vector3());\r\n const toPoint = Vector3.sub(position, start, new Vector3());\r\n const t = Math.max(0, Math.min(lineLength, Vector3.dot(toPoint, lineDir)));\r\n\r\n // Closest point on line segment\r\n const closestPoint = Vector3.add(start, Vector3.scale(lineDir, t, new Vector3()), new Vector3());\r\n\r\n // Check distance from closest point\r\n const direction = Vector3.sub(position, closestPoint, new Vector3());\r\n const distance = direction.magnitude;\r\n const minDistance = this._radius + radius;\r\n\r\n if (distance < minDistance && distance > 0.000001) {\r\n // Collision detected, push the point out\r\n direction.scaleBy(1 / distance);\r\n const penetration = minDistance - distance;\r\n position.addBy(Vector3.scale(direction, penetration, new Vector3()));\r\n return true;\r\n }\r\n\r\n return false;\r\n }\r\n}\r\n"],"names":["SpringBoneCollider","SphereCollider","center","radius","bone","_center","clone","_radius","Math","max","_bone","_localOffset","Vector3","worldPos","matrix","worldMatrix","offset","x","m00","m01","y","m02","z","m03","m10","m11","m12","m13","m20","m21","m22","m23","value","set","collide","position","direction","sub","distance","magnitude","minDistance","scaleBy","penetration","addBy","scale","CapsuleCollider","start","end","startBone","endBone","_start","_end","_startBone","_endBone","_startOffset","_endOffset","line","lineLength","lineDir","toPoint","t","min","dot","closestPoint","add"],"mappings":";;AAGA;;;;AAIC,IACM,MAAeA,kBAAAA,CAAAA;AAStB;AAEA;;;;IAKO,MAAMC,cAAuBD,SAAAA,kBAAAA,CAAAA;0CAElC,OAAyB;yBAEzB,OAAwB;wCAExB,KAAgC;mDAEhC,YAA8B;AAE9B;;;;;;AAMC,MACD,YAAYE,MAAe,EAAEC,MAAc,EAAEC,IAAAA,GAAyB,IAAI,CAAE;QAC1E,KAAK,EAAA;AACL,QAAA,IAAI,CAACC,OAAO,GAAGH,MAAAA,CAAOI,KAAK,EAAA;AAC3B,QAAA,IAAI,CAACC,OAAO,GAAGC,IAAKC,CAAAA,GAAG,CAAC,CAAGN,EAAAA,MAAAA,CAAAA;QAC3B,IAAI,CAACO,KAAK,GAAGN,IAAAA;AACb,QAAA,IAAI,CAACO,YAAY,GAAGP,OAAOF,MAAOI,CAAAA,KAAK,KAAK,IAAIM,OAAAA,EAAAA;AAClD;AAEA;;AAEC,MACD,IAAIV,MAAkB,GAAA;QACpB,IAAI,IAAI,CAACQ,KAAK,EAAE;;AAEd,YAAA,MAAMG,WAAW,IAAID,OAAAA,EAAAA;AACrB,YAAA,MAAME,MAAS,GAAA,IAAI,CAACJ,KAAK,CAACK,WAAW;YACrC,MAAMC,MAAAA,GAAS,IAAI,CAACL,YAAY;YAChCE,QAASI,CAAAA,CAAC,GAAGH,MAAOI,CAAAA,GAAG,GAAGF,MAAOC,CAAAA,CAAC,GAAGH,MAAOK,CAAAA,GAAG,GAAGH,MAAOI,CAAAA,CAAC,GAAGN,MAAOO,CAAAA,GAAG,GAAGL,MAAOM,CAAAA,CAAC,GAAGR,MAAAA,CAAOS,GAAG;YAC/FV,QAASO,CAAAA,CAAC,GAAGN,MAAOU,CAAAA,GAAG,GAAGR,MAAOC,CAAAA,CAAC,GAAGH,MAAOW,CAAAA,GAAG,GAAGT,MAAOI,CAAAA,CAAC,GAAGN,MAAOY,CAAAA,GAAG,GAAGV,MAAOM,CAAAA,CAAC,GAAGR,MAAAA,CAAOa,GAAG;YAC/Fd,QAASS,CAAAA,CAAC,GAAGR,MAAOc,CAAAA,GAAG,GAAGZ,MAAOC,CAAAA,CAAC,GAAGH,MAAOe,CAAAA,GAAG,GAAGb,MAAOI,CAAAA,CAAC,GAAGN,MAAOgB,CAAAA,GAAG,GAAGd,MAAOM,CAAAA,CAAC,GAAGR,MAAAA,CAAOiB,GAAG;YAC/F,OAAOlB,QAAAA;AACT;QACA,OAAO,IAAI,CAACR,OAAO;AACrB;IAEA,IAAIH,MAAAA,CAAO8B,KAAc,EAAE;QACzB,IAAI,IAAI,CAACtB,KAAK,EAAE;AACd,YAAA,IAAI,CAACC,YAAY,CAACsB,GAAG,CAACD,KAAAA,CAAAA;SACjB,MAAA;AACL,YAAA,IAAI,CAAC3B,OAAO,CAAC4B,GAAG,CAACD,KAAAA,CAAAA;AACnB;AACF;AAEA;;AAEC,MACD,IAAI7B,MAAiB,GAAA;QACnB,OAAO,IAAI,CAACI,OAAO;AACrB;IAEA,IAAIJ,MAAAA,CAAO6B,KAAa,EAAE;AACxB,QAAA,IAAI,CAACzB,OAAO,GAAGC,IAAKC,CAAAA,GAAG,CAAC,CAAGuB,EAAAA,KAAAA,CAAAA;AAC7B;AAEA;;AAEC,MACD,IAAI5B,IAAyB,GAAA;QAC3B,OAAO,IAAI,CAACM,KAAK;AACnB;IAEA,IAAIN,IAAAA,CAAK4B,KAAuB,EAAE;QAChC,IAAI,CAACtB,KAAK,GAAGsB,KAAAA;AACf;AAEA;;AAEC,MACDE,OAAQC,CAAAA,QAAiB,EAAEhC,MAAc,EAAW;QAClD,MAAMD,MAAAA,GAAS,IAAI,CAACA,MAAM;AAC1B,QAAA,MAAMkC,YAAYxB,OAAQyB,CAAAA,GAAG,CAACF,QAAAA,EAAUjC,QAAQ,IAAIU,OAAAA,EAAAA,CAAAA;QACpD,MAAM0B,QAAAA,GAAWF,UAAUG,SAAS;AACpC,QAAA,MAAMC,WAAc,GAAA,IAAI,CAACjC,OAAO,GAAGJ,MAAAA;QAEnC,IAAImC,QAAAA,GAAWE,WAAeF,IAAAA,QAAAA,GAAW,QAAU,EAAA;;YAEjDF,SAAUK,CAAAA,OAAO,CAAC,CAAIH,GAAAA,QAAAA,CAAAA;AACtB,YAAA,MAAMI,cAAcF,WAAcF,GAAAA,QAAAA;AAClCH,YAAAA,QAAAA,CAASQ,KAAK,CAAC/B,OAAAA,CAAQgC,KAAK,CAACR,SAAAA,EAAWM,aAAa,IAAI9B,OAAAA,EAAAA,CAAAA,CAAAA;YACzD,OAAO,IAAA;AACT;QAEA,OAAO,KAAA;AACT;AACF;AAEA;;;;;;;;IASO,MAAMiC,eAAwB7C,SAAAA,kBAAAA,CAAAA;sCAEnC,MAAwB;oCAExB,IAAsB;0BAEtB,OAAwB;8CAExB,UAAqC;4CAErC,QAAmC;wCAEnC,YAA8B;sCAE9B,UAA4B;AAE5B;;;;;;;;AAQC,MACD,WACE8C,CAAAA,KAAc,EACdC,GAAY,EACZ5C,MAAc,EACd6C,SAAAA,GAA8B,IAAI,EAClCC,OAA4B,GAAA,IAAI,CAChC;QACA,KAAK,EAAA;AACL,QAAA,IAAI,CAACC,MAAM,GAAGJ,KAAAA,CAAMxC,KAAK,EAAA;AACzB,QAAA,IAAI,CAAC6C,IAAI,GAAGJ,GAAAA,CAAIzC,KAAK,EAAA;AACrB,QAAA,IAAI,CAACC,OAAO,GAAGC,IAAKC,CAAAA,GAAG,CAAC,CAAGN,EAAAA,MAAAA,CAAAA;QAC3B,IAAI,CAACiD,UAAU,GAAGJ,SAAAA;QAClB,IAAI,CAACK,QAAQ,GAAGJ,OAAAA;AAChB,QAAA,IAAI,CAACK,YAAY,GAAGN,YAAYF,KAAMxC,CAAAA,KAAK,KAAK,IAAIM,OAAAA,EAAAA;AACpD,QAAA,IAAI,CAAC2C,UAAU,GAAGN,UAAUF,GAAIzC,CAAAA,KAAK,KAAK,IAAIM,OAAAA,EAAAA;AAChD;AAEA;;AAEC,MACD,IAAIkC,KAAiB,GAAA;QACnB,IAAI,IAAI,CAACM,UAAU,EAAE;AACnB,YAAA,MAAMvC,WAAW,IAAID,OAAAA,EAAAA;AACrB,YAAA,MAAME,MAAS,GAAA,IAAI,CAACsC,UAAU,CAACrC,WAAW;YAC1C,MAAMC,MAAAA,GAAS,IAAI,CAACsC,YAAY;YAChCzC,QAASI,CAAAA,CAAC,GAAGH,MAAOI,CAAAA,GAAG,GAAGF,MAAOC,CAAAA,CAAC,GAAGH,MAAOK,CAAAA,GAAG,GAAGH,MAAOI,CAAAA,CAAC,GAAGN,MAAOO,CAAAA,GAAG,GAAGL,MAAOM,CAAAA,CAAC,GAAGR,MAAAA,CAAOS,GAAG;YAC/FV,QAASO,CAAAA,CAAC,GAAGN,MAAOU,CAAAA,GAAG,GAAGR,MAAOC,CAAAA,CAAC,GAAGH,MAAOW,CAAAA,GAAG,GAAGT,MAAOI,CAAAA,CAAC,GAAGN,MAAOY,CAAAA,GAAG,GAAGV,MAAOM,CAAAA,CAAC,GAAGR,MAAAA,CAAOa,GAAG;YAC/Fd,QAASS,CAAAA,CAAC,GAAGR,MAAOc,CAAAA,GAAG,GAAGZ,MAAOC,CAAAA,CAAC,GAAGH,MAAOe,CAAAA,GAAG,GAAGb,MAAOI,CAAAA,CAAC,GAAGN,MAAOgB,CAAAA,GAAG,GAAGd,MAAOM,CAAAA,CAAC,GAAGR,MAAAA,CAAOiB,GAAG;YAC/F,OAAOlB,QAAAA;AACT;QACA,OAAO,IAAI,CAACqC,MAAM;AACpB;AAEA;;AAEC,MACD,IAAIH,GAAe,GAAA;QACjB,IAAI,IAAI,CAACM,QAAQ,EAAE;AACjB,YAAA,MAAMxC,WAAW,IAAID,OAAAA,EAAAA;AACrB,YAAA,MAAME,MAAS,GAAA,IAAI,CAACuC,QAAQ,CAACtC,WAAW;YACxC,MAAMC,MAAAA,GAAS,IAAI,CAACuC,UAAU;YAC9B1C,QAASI,CAAAA,CAAC,GAAGH,MAAOI,CAAAA,GAAG,GAAGF,MAAOC,CAAAA,CAAC,GAAGH,MAAOK,CAAAA,GAAG,GAAGH,MAAOI,CAAAA,CAAC,GAAGN,MAAOO,CAAAA,GAAG,GAAGL,MAAOM,CAAAA,CAAC,GAAGR,MAAAA,CAAOS,GAAG;YAC/FV,QAASO,CAAAA,CAAC,GAAGN,MAAOU,CAAAA,GAAG,GAAGR,MAAOC,CAAAA,CAAC,GAAGH,MAAOW,CAAAA,GAAG,GAAGT,MAAOI,CAAAA,CAAC,GAAGN,MAAOY,CAAAA,GAAG,GAAGV,MAAOM,CAAAA,CAAC,GAAGR,MAAAA,CAAOa,GAAG;YAC/Fd,QAASS,CAAAA,CAAC,GAAGR,MAAOc,CAAAA,GAAG,GAAGZ,MAAOC,CAAAA,CAAC,GAAGH,MAAOe,CAAAA,GAAG,GAAGb,MAAOI,CAAAA,CAAC,GAAGN,MAAOgB,CAAAA,GAAG,GAAGd,MAAOM,CAAAA,CAAC,GAAGR,MAAAA,CAAOiB,GAAG;YAC/F,OAAOlB,QAAAA;AACT;QACA,OAAO,IAAI,CAACsC,IAAI;AAClB;AAEA;;AAEC,MACD,IAAIhD,MAAiB,GAAA;QACnB,OAAO,IAAI,CAACI,OAAO;AACrB;IAEA,IAAIJ,MAAAA,CAAO6B,KAAa,EAAE;AACxB,QAAA,IAAI,CAACzB,OAAO,GAAGC,IAAKC,CAAAA,GAAG,CAAC,CAAGuB,EAAAA,KAAAA,CAAAA;AAC7B;AAEA;;AAEC,MACDE,OAAQC,CAAAA,QAAiB,EAAEhC,MAAc,EAAW;QAClD,MAAM2C,KAAAA,GAAQ,IAAI,CAACA,KAAK;QACxB,MAAMC,GAAAA,GAAM,IAAI,CAACA,GAAG;;AAGpB,QAAA,MAAMS,OAAO5C,OAAQyB,CAAAA,GAAG,CAACU,GAAAA,EAAKD,OAAO,IAAIlC,OAAAA,EAAAA,CAAAA;QACzC,MAAM6C,UAAAA,GAAaD,KAAKjB,SAAS;AAEjC,QAAA,IAAIkB,aAAa,QAAU,EAAA;;AAEzB,YAAA,MAAMrB,YAAYxB,OAAQyB,CAAAA,GAAG,CAACF,QAAAA,EAAUW,OAAO,IAAIlC,OAAAA,EAAAA,CAAAA;YACnD,MAAM0B,QAAAA,GAAWF,UAAUG,SAAS;AACpC,YAAA,MAAMC,WAAc,GAAA,IAAI,CAACjC,OAAO,GAAGJ,MAAAA;YAEnC,IAAImC,QAAAA,GAAWE,WAAeF,IAAAA,QAAAA,GAAW,QAAU,EAAA;gBACjDF,SAAUK,CAAAA,OAAO,CAAC,CAAIH,GAAAA,QAAAA,CAAAA;AACtB,gBAAA,MAAMI,cAAcF,WAAcF,GAAAA,QAAAA;AAClCH,gBAAAA,QAAAA,CAASQ,KAAK,CAAC/B,OAAAA,CAAQgC,KAAK,CAACR,SAAAA,EAAWM,aAAa,IAAI9B,OAAAA,EAAAA,CAAAA,CAAAA;gBACzD,OAAO,IAAA;AACT;YACA,OAAO,KAAA;AACT;AAEA,QAAA,MAAM8C,UAAU9C,OAAQgC,CAAAA,KAAK,CAACY,IAAM,EAAA,CAAA,GAAIC,YAAY,IAAI7C,OAAAA,EAAAA,CAAAA;AACxD,QAAA,MAAM+C,UAAU/C,OAAQyB,CAAAA,GAAG,CAACF,QAAAA,EAAUW,OAAO,IAAIlC,OAAAA,EAAAA,CAAAA;AACjD,QAAA,MAAMgD,CAAIpD,GAAAA,IAAAA,CAAKC,GAAG,CAAC,CAAGD,EAAAA,IAAAA,CAAKqD,GAAG,CAACJ,UAAY7C,EAAAA,OAAAA,CAAQkD,GAAG,CAACH,OAASD,EAAAA,OAAAA,CAAAA,CAAAA,CAAAA;;AAGhE,QAAA,MAAMK,YAAenD,GAAAA,OAAAA,CAAQoD,GAAG,CAAClB,KAAOlC,EAAAA,OAAAA,CAAQgC,KAAK,CAACc,OAASE,EAAAA,CAAAA,EAAG,IAAIhD,OAAAA,EAAAA,CAAAA,EAAY,IAAIA,OAAAA,EAAAA,CAAAA;;AAGtF,QAAA,MAAMwB,YAAYxB,OAAQyB,CAAAA,GAAG,CAACF,QAAAA,EAAU4B,cAAc,IAAInD,OAAAA,EAAAA,CAAAA;QAC1D,MAAM0B,QAAAA,GAAWF,UAAUG,SAAS;AACpC,QAAA,MAAMC,WAAc,GAAA,IAAI,CAACjC,OAAO,GAAGJ,MAAAA;QAEnC,IAAImC,QAAAA,GAAWE,WAAeF,IAAAA,QAAAA,GAAW,QAAU,EAAA;;YAEjDF,SAAUK,CAAAA,OAAO,CAAC,CAAIH,GAAAA,QAAAA,CAAAA;AACtB,YAAA,MAAMI,cAAcF,WAAcF,GAAAA,QAAAA;AAClCH,YAAAA,QAAAA,CAASQ,KAAK,CAAC/B,OAAAA,CAAQgC,KAAK,CAACR,SAAAA,EAAWM,aAAa,IAAI9B,OAAAA,EAAAA,CAAAA,CAAAA;YACzD,OAAO,IAAA;AACT;QAEA,OAAO,KAAA;AACT;AACF;;;;"}