@zephyr3d/scene 0.9.27 → 0.10.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (502) hide show
  1. package/README.md +60 -27
  2. package/dist/animation/animation_bank.js +634 -0
  3. package/dist/animation/animation_bank.js.map +1 -0
  4. package/dist/animation/animation_bank_gpu.js +256 -0
  5. package/dist/animation/animation_bank_gpu.js.map +1 -0
  6. package/dist/animation/animationset.js +54 -0
  7. package/dist/animation/animationset.js.map +1 -1
  8. package/dist/animation/cloth/gpu_cloth_component.js +406 -0
  9. package/dist/animation/cloth/gpu_cloth_component.js.map +1 -0
  10. package/dist/animation/cloth/gpu_cloth_system.js +332 -202
  11. package/dist/animation/cloth/gpu_cloth_system.js.map +1 -1
  12. package/dist/animation/gpu_animation_driver.js +289 -0
  13. package/dist/animation/gpu_animation_driver.js.map +1 -0
  14. package/dist/animation/joint_dynamics/collision.js +112 -1
  15. package/dist/animation/joint_dynamics/collision.js.map +1 -1
  16. package/dist/animation/joint_dynamics/controller.js +6 -0
  17. package/dist/animation/joint_dynamics/controller.js.map +1 -1
  18. package/dist/animation/joint_dynamics/joint_dynamics_system.js +11 -0
  19. package/dist/animation/joint_dynamics/joint_dynamics_system.js.map +1 -1
  20. package/dist/animation/joint_dynamics/solver.js +50 -12
  21. package/dist/animation/joint_dynamics/solver.js.map +1 -1
  22. package/dist/animation/joint_dynamics/types.js.map +1 -1
  23. package/dist/animation/skeleton.js +279 -55
  24. package/dist/animation/skeleton.js.map +1 -1
  25. package/dist/animation/skin_palette_atlas.js +252 -0
  26. package/dist/animation/skin_palette_atlas.js.map +1 -0
  27. package/dist/animation/spring/multi_chain_spring_system.js +298 -38
  28. package/dist/animation/spring/multi_chain_spring_system.js.map +1 -1
  29. package/dist/animation/spring/spring_chain.js +2 -0
  30. package/dist/animation/spring/spring_chain.js.map +1 -1
  31. package/dist/animation/spring/spring_collider.js +159 -21
  32. package/dist/animation/spring/spring_collider.js.map +1 -1
  33. package/dist/animation/spring/spring_particle.js +1 -0
  34. package/dist/animation/spring/spring_particle.js.map +1 -1
  35. package/dist/animation/spring/spring_solver.js +173 -0
  36. package/dist/animation/spring/spring_solver.js.map +1 -0
  37. package/dist/animation/spring/spring_system.js +249 -24
  38. package/dist/animation/spring/spring_system.js.map +1 -1
  39. package/dist/animation/spring_modifier.js +32 -1
  40. package/dist/animation/spring_modifier.js.map +1 -1
  41. package/dist/app/app.js +26 -0
  42. package/dist/app/app.js.map +1 -1
  43. package/dist/app/engine.js +86 -15
  44. package/dist/app/engine.js.map +1 -1
  45. package/dist/app/gamepad.js +191 -0
  46. package/dist/app/gamepad.js.map +1 -0
  47. package/dist/app/inputactions.js +271 -0
  48. package/dist/app/inputactions.js.map +1 -0
  49. package/dist/app/inputmgr.js +331 -22
  50. package/dist/app/inputmgr.js.map +1 -1
  51. package/dist/app/loading.js +138 -0
  52. package/dist/app/loading.js.map +1 -0
  53. package/dist/app/pipelinecache.js +209 -0
  54. package/dist/app/pipelinecache.js.map +1 -0
  55. package/dist/app/runtimescript.js +25 -0
  56. package/dist/app/runtimescript.js.map +1 -1
  57. package/dist/app/scriptingsystem.js +54 -0
  58. package/dist/app/scriptingsystem.js.map +1 -1
  59. package/dist/app/scriptregistry.js +7 -2
  60. package/dist/app/scriptregistry.js.map +1 -1
  61. package/dist/asset/asset_manifest.js +59 -0
  62. package/dist/asset/asset_manifest.js.map +1 -0
  63. package/dist/asset/asset_preload.js +258 -0
  64. package/dist/asset/asset_preload.js.map +1 -0
  65. package/dist/asset/assetmanager.js +117 -65
  66. package/dist/asset/assetmanager.js.map +1 -1
  67. package/dist/asset/loaders/ktx2/basis/LICENSE +201 -0
  68. package/dist/asset/loaders/ktx2/basis/basis_transcoder.js +2 -0
  69. package/dist/asset/loaders/ktx2/basis/basis_transcoder.wasm +0 -0
  70. package/dist/asset/loaders/ktx2/basis_location.js +17 -0
  71. package/dist/asset/loaders/ktx2/basis_location.js.map +1 -0
  72. package/dist/asset/loaders/ktx2/ktx2_loader.js +88 -0
  73. package/dist/asset/loaders/ktx2/ktx2_loader.js.map +1 -0
  74. package/dist/asset/loaders/ktx2/ktx2_targets.js +118 -0
  75. package/dist/asset/loaders/ktx2/ktx2_targets.js.map +1 -0
  76. package/dist/asset/loaders/ktx2/transcoder_pool.js +259 -0
  77. package/dist/asset/loaders/ktx2/transcoder_pool.js.map +1 -0
  78. package/dist/asset/mesh_lod_builder.js +104 -0
  79. package/dist/asset/mesh_lod_builder.js.map +1 -0
  80. package/dist/asset/mesh_settings.js +111 -0
  81. package/dist/asset/mesh_settings.js.map +1 -0
  82. package/dist/asset/meshopt_decoder.js +18 -0
  83. package/dist/asset/meshopt_decoder.js.map +1 -0
  84. package/dist/asset/meshopt_simplifier.js +26 -0
  85. package/dist/asset/meshopt_simplifier.js.map +1 -0
  86. package/dist/asset/model.js +171 -1
  87. package/dist/asset/model.js.map +1 -1
  88. package/dist/asset/texture_settings.js +231 -0
  89. package/dist/asset/texture_settings.js.map +1 -0
  90. package/dist/asset/zmsh_binary.js +131 -0
  91. package/dist/asset/zmsh_binary.js.map +1 -0
  92. package/dist/asset/zsdf_binary.js +111 -0
  93. package/dist/asset/zsdf_binary.js.map +1 -0
  94. package/dist/blitter/bilateralblur.js +1 -2
  95. package/dist/blitter/bilateralblur.js.map +1 -1
  96. package/dist/blitter/gaussianblur.js +1 -6
  97. package/dist/blitter/gaussianblur.js.map +1 -1
  98. package/dist/camera/base.js +31 -10
  99. package/dist/camera/base.js.map +1 -1
  100. package/dist/camera/camera.js +104 -178
  101. package/dist/camera/camera.js.map +1 -1
  102. package/dist/camera/follow.js +342 -0
  103. package/dist/camera/follow.js.map +1 -0
  104. package/dist/camera/fps.js +9 -7
  105. package/dist/camera/fps.js.map +1 -1
  106. package/dist/camera/orbit.js +46 -19
  107. package/dist/camera/orbit.js.map +1 -1
  108. package/dist/index.d.ts +25436 -15990
  109. package/dist/index.js +65 -11
  110. package/dist/index.js.map +1 -1
  111. package/dist/material/blinn.js +3 -0
  112. package/dist/material/blinn.js.map +1 -1
  113. package/dist/material/eye.js +1 -1
  114. package/dist/material/eye.js.map +1 -1
  115. package/dist/material/hair.js +2 -3
  116. package/dist/material/hair.js.map +1 -1
  117. package/dist/material/lambert.js +4 -1
  118. package/dist/material/lambert.js.map +1 -1
  119. package/dist/material/material.js +66 -4
  120. package/dist/material/material.js.map +1 -1
  121. package/dist/material/meshmaterial.js +118 -45
  122. package/dist/material/meshmaterial.js.map +1 -1
  123. package/dist/material/mixins/lightmodel/blinnphong.js +1 -1
  124. package/dist/material/mixins/lightmodel/blinnphong.js.map +1 -1
  125. package/dist/material/mixins/lightmodel/lambert.js +1 -1
  126. package/dist/material/mixins/lightmodel/lambert.js.map +1 -1
  127. package/dist/material/mixins/lightmodel/pbrblueprintmixin.js +34 -61
  128. package/dist/material/mixins/lightmodel/pbrblueprintmixin.js.map +1 -1
  129. package/dist/material/mixins/lightmodel/pbrmetallicroughness.js +16 -2
  130. package/dist/material/mixins/lightmodel/pbrmetallicroughness.js.map +1 -1
  131. package/dist/material/mixins/lightmodel/pbrspecularglossness.js +2 -1
  132. package/dist/material/mixins/lightmodel/pbrspecularglossness.js.map +1 -1
  133. package/dist/material/mixins/lit.js +191 -83
  134. package/dist/material/mixins/lit.js.map +1 -1
  135. package/dist/material/mixins/pbr/common.js +31 -206
  136. package/dist/material/mixins/pbr/common.js.map +1 -1
  137. package/dist/material/mtoon.js +1 -1
  138. package/dist/material/mtoon.js.map +1 -1
  139. package/dist/material/pbrmr.js +3 -0
  140. package/dist/material/pbrmr.js.map +1 -1
  141. package/dist/material/pbrsg.js +3 -0
  142. package/dist/material/pbrsg.js.map +1 -1
  143. package/dist/material/sdf_debug.js +78 -0
  144. package/dist/material/sdf_debug.js.map +1 -0
  145. package/dist/material/shader/helper.js +333 -191
  146. package/dist/material/shader/helper.js.map +1 -1
  147. package/dist/material/shader/terrain_blend.js +204 -43
  148. package/dist/material/shader/terrain_blend.js.map +1 -1
  149. package/dist/material/skin.js +331 -297
  150. package/dist/material/skin.js.map +1 -1
  151. package/dist/material/skinprofile.js +1058 -0
  152. package/dist/material/skinprofile.js.map +1 -0
  153. package/dist/material/sss.js +353 -0
  154. package/dist/material/sss.js.map +1 -0
  155. package/dist/material/sss_kernel.js +265 -0
  156. package/dist/material/sss_kernel.js.map +1 -0
  157. package/dist/material/sssprofile.js +879 -0
  158. package/dist/material/sssprofile.js.map +1 -0
  159. package/dist/material/subsurfaceprofile.js +4 -8
  160. package/dist/material/subsurfaceprofile.js.map +1 -1
  161. package/dist/material/terrain-cm.js +464 -188
  162. package/dist/material/terrain-cm.js.map +1 -1
  163. package/dist/material/unlit.js +3 -0
  164. package/dist/material/unlit.js.map +1 -1
  165. package/dist/material/water.js +1261 -1438
  166. package/dist/material/water.js.map +1 -1
  167. package/dist/node_modules/meshoptimizer/LICENSE +21 -0
  168. package/dist/node_modules/meshoptimizer/meshopt_decoder.js +197 -0
  169. package/dist/node_modules/meshoptimizer/meshopt_decoder.js.map +1 -0
  170. package/dist/node_modules/meshoptimizer/meshopt_simplifier.js +677 -0
  171. package/dist/node_modules/meshoptimizer/meshopt_simplifier.js.map +1 -0
  172. package/dist/physics/character.js +226 -0
  173. package/dist/physics/character.js.map +1 -0
  174. package/dist/physics/collider.js +209 -0
  175. package/dist/physics/collider.js.map +1 -0
  176. package/dist/physics/events.js +79 -0
  177. package/dist/physics/events.js.map +1 -0
  178. package/dist/physics/joint.js +272 -0
  179. package/dist/physics/joint.js.map +1 -0
  180. package/dist/physics/node_physics.js +234 -0
  181. package/dist/physics/node_physics.js.map +1 -0
  182. package/dist/physics/part.js +91 -0
  183. package/dist/physics/part.js.map +1 -0
  184. package/dist/physics/rigid_body.js +379 -0
  185. package/dist/physics/rigid_body.js.map +1 -0
  186. package/dist/physics/vehicle.js +335 -0
  187. package/dist/physics/vehicle.js.map +1 -0
  188. package/dist/physics/world.js +25 -0
  189. package/dist/physics/world.js.map +1 -0
  190. package/dist/posteffect/bloom.js +49 -14
  191. package/dist/posteffect/bloom.js.map +1 -1
  192. package/dist/posteffect/motionblur.js +106 -106
  193. package/dist/posteffect/motionblur.js.map +1 -1
  194. package/dist/posteffect/postsss.js +572 -0
  195. package/dist/posteffect/postsss.js.map +1 -0
  196. package/dist/posteffect/sao.js +2 -6
  197. package/dist/posteffect/sao.js.map +1 -1
  198. package/dist/posteffect/skinsss.js +605 -355
  199. package/dist/posteffect/skinsss.js.map +1 -1
  200. package/dist/posteffect/ssgi.js +91 -162
  201. package/dist/posteffect/ssgi.js.map +1 -1
  202. package/dist/posteffect/ssr.js +3 -11
  203. package/dist/posteffect/ssr.js.map +1 -1
  204. package/dist/posteffect/sss.js +4 -13
  205. package/dist/posteffect/sss.js.map +1 -1
  206. package/dist/posteffect/taa.js +1 -0
  207. package/dist/posteffect/taa.js.map +1 -1
  208. package/dist/render/abuffer_oit.js +3 -2
  209. package/dist/render/abuffer_oit.js.map +1 -1
  210. package/dist/render/clipmap.js +179 -64
  211. package/dist/render/clipmap.js.map +1 -1
  212. package/dist/render/cluster_light.js +958 -224
  213. package/dist/render/cluster_light.js.map +1 -1
  214. package/dist/render/cull_visitor.js +25 -5
  215. package/dist/render/cull_visitor.js.map +1 -1
  216. package/dist/render/debug_views.js +37 -0
  217. package/dist/render/debug_views.js.map +1 -0
  218. package/dist/render/depthpass.js +5 -1
  219. package/dist/render/depthpass.js.map +1 -1
  220. package/dist/render/drawable_mixin.js +53 -6
  221. package/dist/render/drawable_mixin.js.map +1 -1
  222. package/dist/render/dualdepthpeeling_oit.js +5 -5
  223. package/dist/render/dualdepthpeeling_oit.js.map +1 -1
  224. package/dist/render/envlight.js +196 -113
  225. package/dist/render/envlight.js.map +1 -1
  226. package/dist/render/fbm_wavegenerator.js +5 -10
  227. package/dist/render/fbm_wavegenerator.js.map +1 -1
  228. package/dist/render/fft_wavegenerator.js +247 -157
  229. package/dist/render/fft_wavegenerator.js.map +1 -1
  230. package/dist/render/gerstner_wavegenerator.js +16 -38
  231. package/dist/render/gerstner_wavegenerator.js.map +1 -1
  232. package/dist/render/gi/probe_volume.js +1334 -0
  233. package/dist/render/gi/probe_volume.js.map +1 -0
  234. package/dist/render/gi/scene_gi.js +282 -0
  235. package/dist/render/gi/scene_gi.js.map +1 -0
  236. package/dist/render/gi/voxel_atlas.js +198 -0
  237. package/dist/render/gi/voxel_atlas.js.map +1 -0
  238. package/dist/render/gi/voxel_lighting.js +652 -0
  239. package/dist/render/gi/voxel_lighting.js.map +1 -0
  240. package/dist/render/gi/voxel_scene.js +642 -0
  241. package/dist/render/gi/voxel_scene.js.map +1 -0
  242. package/dist/render/gi/voxelize_pass.js +223 -0
  243. package/dist/render/gi/voxelize_pass.js.map +1 -0
  244. package/dist/render/globalbindgroup_allocator.js +3 -2
  245. package/dist/render/globalbindgroup_allocator.js.map +1 -1
  246. package/dist/render/gpu_picking.js +9 -36
  247. package/dist/render/gpu_picking.js.map +1 -1
  248. package/dist/render/instance_culling.js +499 -0
  249. package/dist/render/instance_culling.js.map +1 -0
  250. package/dist/render/lightpass.js +19 -8
  251. package/dist/render/lightpass.js.map +1 -1
  252. package/dist/render/lod.js +46 -0
  253. package/dist/render/lod.js.map +1 -0
  254. package/dist/render/primitive.js +301 -9
  255. package/dist/render/primitive.js.map +1 -1
  256. package/dist/render/primitive_readback.js +209 -0
  257. package/dist/render/primitive_readback.js.map +1 -0
  258. package/dist/render/render_queue.js +162 -11
  259. package/dist/render/render_queue.js.map +1 -1
  260. package/dist/render/renderer.js +10 -7
  261. package/dist/render/renderer.js.map +1 -1
  262. package/dist/render/rendergraph/blackboard.js +14 -1
  263. package/dist/render/rendergraph/blackboard.js.map +1 -1
  264. package/dist/render/rendergraph/executor.js +136 -0
  265. package/dist/render/rendergraph/executor.js.map +1 -1
  266. package/dist/render/rendergraph/forward_plus_builder.js +272 -55
  267. package/dist/render/rendergraph/forward_plus_builder.js.map +1 -1
  268. package/dist/render/rendergraph/frame_graph_context.js +41 -0
  269. package/dist/render/rendergraph/frame_graph_context.js.map +1 -0
  270. package/dist/render/rendergraph/scene_render_context.js +31 -2
  271. package/dist/render/rendergraph/scene_render_context.js.map +1 -1
  272. package/dist/render/rendergraph/types.js.map +1 -1
  273. package/dist/render/renderpass.js +28 -5
  274. package/dist/render/renderpass.js.map +1 -1
  275. package/dist/render/sdf/box_allocator.js +98 -0
  276. package/dist/render/sdf/box_allocator.js.map +1 -0
  277. package/dist/render/sdf/global_sdf.js +865 -0
  278. package/dist/render/sdf/global_sdf.js.map +1 -0
  279. package/dist/render/sdf/scene_sdf.js +562 -0
  280. package/dist/render/sdf/scene_sdf.js.map +1 -0
  281. package/dist/render/sdf/sdf_atlas.js +227 -0
  282. package/dist/render/sdf/sdf_atlas.js.map +1 -0
  283. package/dist/render/sdf/sdf_programs.js +42 -0
  284. package/dist/render/sdf/sdf_programs.js.map +1 -0
  285. package/dist/render/sdf/sdf_view.js +199 -0
  286. package/dist/render/sdf/sdf_view.js.map +1 -0
  287. package/dist/render/sdf/waterline.js +610 -0
  288. package/dist/render/sdf/waterline.js.map +1 -0
  289. package/dist/render/shadow_mask_pass.js +142 -25
  290. package/dist/render/shadow_mask_pass.js.map +1 -1
  291. package/dist/render/shore_wave_generator.js +1193 -0
  292. package/dist/render/shore_wave_generator.js.map +1 -0
  293. package/dist/render/sky.js +516 -86
  294. package/dist/render/sky.js.map +1 -1
  295. package/dist/render/transmission_thickness_pass.js +477 -0
  296. package/dist/render/transmission_thickness_pass.js.map +1 -0
  297. package/dist/render/underwater.js +58 -158
  298. package/dist/render/underwater.js.map +1 -1
  299. package/dist/render/virtualtexture/virtual_texture.js +1214 -0
  300. package/dist/render/virtualtexture/virtual_texture.js.map +1 -0
  301. package/dist/render/volumetric_cloud/cloud_common.js +472 -0
  302. package/dist/render/volumetric_cloud/cloud_common.js.map +1 -0
  303. package/dist/render/volumetric_cloud/cloud_noise.js +189 -0
  304. package/dist/render/volumetric_cloud/cloud_noise.js.map +1 -0
  305. package/dist/render/volumetric_cloud/debug_view.js +131 -0
  306. package/dist/render/volumetric_cloud/debug_view.js.map +1 -0
  307. package/dist/render/volumetric_cloud/resources.js +380 -0
  308. package/dist/render/volumetric_cloud/resources.js.map +1 -0
  309. package/dist/render/volumetric_cloud/sky_cache.js +380 -0
  310. package/dist/render/volumetric_cloud/sky_cache.js.map +1 -0
  311. package/dist/render/volumetric_cloud/volumetric_cloud.js +318 -0
  312. package/dist/render/volumetric_cloud/volumetric_cloud.js.map +1 -0
  313. package/dist/render/water_caustics.js +134 -319
  314. package/dist/render/water_caustics.js.map +1 -1
  315. package/dist/render/water_foam.js +627 -0
  316. package/dist/render/water_foam.js.map +1 -0
  317. package/dist/render/water_interaction.js +1795 -0
  318. package/dist/render/water_interaction.js.map +1 -0
  319. package/dist/render/weightedblended_oit.js +3 -3
  320. package/dist/render/weightedblended_oit.js.map +1 -1
  321. package/dist/scene/basesprite.js +9 -4
  322. package/dist/scene/basesprite.js.map +1 -1
  323. package/dist/scene/batchgroup.js +108 -12
  324. package/dist/scene/batchgroup.js.map +1 -1
  325. package/dist/scene/environment.js +28 -7
  326. package/dist/scene/environment.js.map +1 -1
  327. package/dist/scene/foliage.js +1020 -0
  328. package/dist/scene/foliage.js.map +1 -0
  329. package/dist/scene/foliage_buckets.js +147 -0
  330. package/dist/scene/foliage_buckets.js.map +1 -0
  331. package/dist/scene/foliage_mask.js +358 -0
  332. package/dist/scene/foliage_mask.js.map +1 -0
  333. package/dist/scene/hair.js +15 -4
  334. package/dist/scene/hair.js.map +1 -1
  335. package/dist/scene/light.js +179 -13
  336. package/dist/scene/light.js.map +1 -1
  337. package/dist/scene/mesh.js +327 -45
  338. package/dist/scene/mesh.js.map +1 -1
  339. package/dist/scene/meshdrawable.js +6 -0
  340. package/dist/scene/meshdrawable.js.map +1 -1
  341. package/dist/scene/msdftext.js +9 -3
  342. package/dist/scene/msdftext.js.map +1 -1
  343. package/dist/scene/msdftextsprite.js +9 -3
  344. package/dist/scene/msdftextsprite.js.map +1 -1
  345. package/dist/scene/particlesys.js +8 -2
  346. package/dist/scene/particlesys.js.map +1 -1
  347. package/dist/scene/physics_settings.js +157 -0
  348. package/dist/scene/physics_settings.js.map +1 -0
  349. package/dist/scene/scene.js +190 -44
  350. package/dist/scene/scene.js.map +1 -1
  351. package/dist/scene/scene_node.js +147 -6
  352. package/dist/scene/scene_node.js.map +1 -1
  353. package/dist/scene/terrain-cm/bladegrassmaterial.js +735 -0
  354. package/dist/scene/terrain-cm/bladegrassmaterial.js.map +1 -0
  355. package/dist/scene/terrain-cm/grass.js +881 -42
  356. package/dist/scene/terrain-cm/grass.js.map +1 -1
  357. package/dist/scene/terrain-cm/grass_gpu.js +929 -0
  358. package/dist/scene/terrain-cm/grass_gpu.js.map +1 -0
  359. package/dist/scene/terrain-cm/grassmaterial.js +180 -9
  360. package/dist/scene/terrain-cm/grassmaterial.js.map +1 -1
  361. package/dist/scene/terrain-cm/terrain-cm.js +465 -36
  362. package/dist/scene/terrain-cm/terrain-cm.js.map +1 -1
  363. package/dist/scene/terrain-cm/terrain_gi_albedo.js +257 -0
  364. package/dist/scene/terrain-cm/terrain_gi_albedo.js.map +1 -0
  365. package/dist/scene/terrain-cm/terrain_rvt.js +395 -0
  366. package/dist/scene/terrain-cm/terrain_rvt.js.map +1 -0
  367. package/dist/scene/update_queue.js +54 -0
  368. package/dist/scene/update_queue.js.map +1 -0
  369. package/dist/scene/water.js +633 -268
  370. package/dist/scene/water.js.map +1 -1
  371. package/dist/scene/water_surface_sampler.js +324 -0
  372. package/dist/scene/water_surface_sampler.js.map +1 -0
  373. package/dist/scene/wind.js +317 -0
  374. package/dist/scene/wind.js.map +1 -0
  375. package/dist/shaders/atmosphere.js +388 -166
  376. package/dist/shaders/atmosphere.js.map +1 -1
  377. package/dist/shaders/fog.js +100 -32
  378. package/dist/shaders/fog.js.map +1 -1
  379. package/dist/shaders/gi.js +365 -0
  380. package/dist/shaders/gi.js.map +1 -0
  381. package/dist/shaders/ltc_rect.js +202 -0
  382. package/dist/shaders/ltc_rect.js.map +1 -0
  383. package/dist/shaders/misc.js +1 -10
  384. package/dist/shaders/misc.js.map +1 -1
  385. package/dist/shaders/noise.js +5 -1
  386. package/dist/shaders/noise.js.map +1 -1
  387. package/dist/shaders/probes.js +309 -0
  388. package/dist/shaders/probes.js.map +1 -0
  389. package/dist/shaders/sdf.js +537 -0
  390. package/dist/shaders/sdf.js.map +1 -0
  391. package/dist/shaders/shadow.js +104 -70
  392. package/dist/shaders/shadow.js.map +1 -1
  393. package/dist/shaders/skin_brdf.js +243 -0
  394. package/dist/shaders/skin_brdf.js.map +1 -0
  395. package/dist/shaders/ssgi.js +63 -0
  396. package/dist/shaders/ssgi.js.map +1 -0
  397. package/dist/shaders/ssgi_reprojection.js +118 -0
  398. package/dist/shaders/ssgi_reprojection.js.map +1 -0
  399. package/dist/shaders/ssr.js +6 -159
  400. package/dist/shaders/ssr.js.map +1 -1
  401. package/dist/shaders/temporal.js +38 -27
  402. package/dist/shaders/temporal.js.map +1 -1
  403. package/dist/shaders/water.js +32 -82
  404. package/dist/shaders/water.js.map +1 -1
  405. package/dist/shaders/water_medium.js +7 -21
  406. package/dist/shaders/water_medium.js.map +1 -1
  407. package/dist/shadow/dom.js +110 -19
  408. package/dist/shadow/dom.js.map +1 -1
  409. package/dist/shadow/esm.js +3 -3
  410. package/dist/shadow/esm.js.map +1 -1
  411. package/dist/shadow/pcf_opt.js +15 -48
  412. package/dist/shadow/pcf_opt.js.map +1 -1
  413. package/dist/shadow/pcf_pd.js +15 -53
  414. package/dist/shadow/pcf_pd.js.map +1 -1
  415. package/dist/shadow/pcss.js +34 -9
  416. package/dist/shadow/pcss.js.map +1 -1
  417. package/dist/shadow/shadow_impl.js +3 -8
  418. package/dist/shadow/shadow_impl.js.map +1 -1
  419. package/dist/shadow/shadow_region.js +40 -2
  420. package/dist/shadow/shadow_region.js.map +1 -1
  421. package/dist/shadow/shadowmapper.js +93 -53
  422. package/dist/shadow/shadowmapper.js.map +1 -1
  423. package/dist/shadow/ssm.js +18 -72
  424. package/dist/shadow/ssm.js.map +1 -1
  425. package/dist/shadow/vsm.js +3 -3
  426. package/dist/shadow/vsm.js.map +1 -1
  427. package/dist/shapes/shape.js +44 -1
  428. package/dist/shapes/shape.js.map +1 -1
  429. package/dist/utility/buoyancy.js +287 -0
  430. package/dist/utility/buoyancy.js.map +1 -0
  431. package/dist/utility/physical.js +10 -1
  432. package/dist/utility/physical.js.map +1 -1
  433. package/dist/utility/pmrem.js +17 -43
  434. package/dist/utility/pmrem.js.map +1 -1
  435. package/dist/utility/sdf/bake.js +435 -0
  436. package/dist/utility/sdf/bake.js.map +1 -0
  437. package/dist/utility/sdf/bvh.js +576 -0
  438. package/dist/utility/sdf/bvh.js.map +1 -0
  439. package/dist/utility/serialization/manager.js +34 -6
  440. package/dist/utility/serialization/manager.js.map +1 -1
  441. package/dist/utility/serialization/scene/animation.js +46 -5
  442. package/dist/utility/serialization/scene/animation.js.map +1 -1
  443. package/dist/utility/serialization/scene/batch.js +11 -4
  444. package/dist/utility/serialization/scene/batch.js.map +1 -1
  445. package/dist/utility/serialization/scene/camera.js +87 -254
  446. package/dist/utility/serialization/scene/camera.js.map +1 -1
  447. package/dist/utility/serialization/scene/cloth.js +25 -0
  448. package/dist/utility/serialization/scene/cloth.js.map +1 -0
  449. package/dist/utility/serialization/scene/common.js +14 -6
  450. package/dist/utility/serialization/scene/common.js.map +1 -1
  451. package/dist/utility/serialization/scene/foliage.js +821 -0
  452. package/dist/utility/serialization/scene/foliage.js.map +1 -0
  453. package/dist/utility/serialization/scene/hair.js +11 -4
  454. package/dist/utility/serialization/scene/hair.js.map +1 -1
  455. package/dist/utility/serialization/scene/light.js +115 -7
  456. package/dist/utility/serialization/scene/light.js.map +1 -1
  457. package/dist/utility/serialization/scene/material.js +388 -220
  458. package/dist/utility/serialization/scene/material.js.map +1 -1
  459. package/dist/utility/serialization/scene/mesh.js +69 -4
  460. package/dist/utility/serialization/scene/mesh.js.map +1 -1
  461. package/dist/utility/serialization/scene/node.js +140 -5
  462. package/dist/utility/serialization/scene/node.js.map +1 -1
  463. package/dist/utility/serialization/scene/node_physics.js +1318 -0
  464. package/dist/utility/serialization/scene/node_physics.js.map +1 -0
  465. package/dist/utility/serialization/scene/particle.js +11 -4
  466. package/dist/utility/serialization/scene/particle.js.map +1 -1
  467. package/dist/utility/serialization/scene/physics.js +120 -0
  468. package/dist/utility/serialization/scene/physics.js.map +1 -0
  469. package/dist/utility/serialization/scene/primitive.js +124 -10
  470. package/dist/utility/serialization/scene/primitive.js.map +1 -1
  471. package/dist/utility/serialization/scene/scene.js +1687 -51
  472. package/dist/utility/serialization/scene/scene.js.map +1 -1
  473. package/dist/utility/serialization/scene/sprite.js +11 -4
  474. package/dist/utility/serialization/scene/sprite.js.map +1 -1
  475. package/dist/utility/serialization/scene/terrain.js +163 -33
  476. package/dist/utility/serialization/scene/terrain.js.map +1 -1
  477. package/dist/utility/serialization/scene/text.js +11 -4
  478. package/dist/utility/serialization/scene/text.js.map +1 -1
  479. package/dist/utility/serialization/scene/water.js +1543 -264
  480. package/dist/utility/serialization/scene/water.js.map +1 -1
  481. package/dist/utility/serialization/types.js.map +1 -1
  482. package/dist/utility/shprojector.js +10 -22
  483. package/dist/utility/shprojector.js.map +1 -1
  484. package/dist/utility/textures/foam.js +170 -0
  485. package/dist/utility/textures/foam.js.map +1 -0
  486. package/dist/utility/textures/ggxlut.js +17 -43
  487. package/dist/utility/textures/ggxlut.js.map +1 -1
  488. package/dist/utility/textures/ltcdata.js +4 -4
  489. package/dist/utility/textures/ltcdata.js.map +1 -1
  490. package/dist/utility/textures/ltclut.js +16 -6
  491. package/dist/utility/textures/ltclut.js.map +1 -1
  492. package/dist/utility/unsupported.js +24 -0
  493. package/dist/utility/unsupported.js.map +1 -0
  494. package/dist/values.js +13 -1
  495. package/dist/values.js.map +1 -1
  496. package/package.json +25 -12
  497. package/src/asset/loaders/ktx2/basis/LICENSE +201 -0
  498. package/src/asset/loaders/ktx2/basis/basis_transcoder.js +2 -0
  499. package/src/asset/loaders/ktx2/basis/basis_transcoder.wasm +0 -0
  500. package/src/asset/meshoptimizer/LICENSE +21 -0
  501. package/dist/animation/joint_dynamics/convex_collider.js +0 -320
  502. package/dist/animation/joint_dynamics/convex_collider.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"joint_dynamics_system.js","sources":["../../../src/animation/joint_dynamics/joint_dynamics_system.ts"],"sourcesContent":["import type { DeepPartial } from '@zephyr3d/base';\r\nimport { InterpolatorScalar, Vector3 } from '@zephyr3d/base';\r\nimport { Quaternion } from '@zephyr3d/base';\r\nimport { SceneNode } from '../../scene/scene_node';\r\nimport type {\r\n ControllerConfig,\r\n JointDynamicsColliderSnapshot,\r\n JointDynamicsColliderHandle,\r\n JointDynamicsFlatPlaneSnapshot,\r\n JointDynamicsFlatPlaneHandle,\r\n JointDynamicsGrabberSnapshot,\r\n JointDynamicsGrabberHandle\r\n} from './controller';\r\nimport { JointDynamicsSystemController } from './controller';\r\nimport { ColliderForce, type BoneNode, type ColliderR, type GrabberR, type TransformAccess } from './types';\r\nimport type { SkeletonBindPose } from '../skeleton';\r\n\r\nconst _quat = new Quaternion();\r\n\r\nconst _defaultTA = createTransformAccess(new SceneNode(null), false);\r\n\r\n/**\r\n * Create a transform adapter that lets the joint dynamics solver read from and write to a SceneNode.\r\n *\r\n * @param obj - Scene node to expose through the TransformAccess interface.\r\n * @returns A TransformAccess wrapper backed by the supplied scene node.\r\n *\r\n * @public\r\n */\r\nexport function createTransformAccess(obj: SceneNode, exposeNode = true): TransformAccess {\r\n return {\r\n ...(exposeNode ? { node: obj } : {}),\r\n getWorldPosition(): Vector3 {\r\n return obj.getWorldPosition();\r\n },\r\n getWorldRotation(): Quaternion {\r\n const q = new Quaternion();\r\n obj.worldMatrix.decompose(null, q, null);\r\n return q;\r\n },\r\n getWorldScale(): Vector3 {\r\n const s = new Vector3();\r\n obj.worldMatrix.decompose(s, null, null);\r\n return s;\r\n },\r\n getLocalPosition(): Vector3 {\r\n return obj.position.clone();\r\n },\r\n getLocalRotation(): Quaternion {\r\n return obj.rotation.clone();\r\n },\r\n getLocalScale(): Vector3 {\r\n return obj.scale.clone();\r\n },\r\n setWorldPosition(p: Vector3): void {\r\n if (obj.parent) {\r\n obj.position = obj.parent.invWorldMatrix.transformPointAffine(p);\r\n } else {\r\n obj.position.set(p);\r\n }\r\n },\r\n setWorldRotation(q: Quaternion): void {\r\n // Convert world rotation to local space.\r\n if (obj.parent) {\r\n obj.parent.worldMatrix.decompose(null, _quat, null);\r\n Quaternion.multiply(Quaternion.inverse(_quat), q, obj.rotation);\r\n } else {\r\n obj.rotation.set(q);\r\n }\r\n },\r\n setLocalPosition(p: Vector3): void {\r\n obj.position.set(p);\r\n },\r\n setLocalRotation(q: Quaternion): void {\r\n obj.rotation.set(q);\r\n },\r\n setLocalScale(s: Vector3): void {\r\n obj.scale.set(s);\r\n }\r\n };\r\n}\r\n\r\nfunction createOffsetTransformAccess(\r\n obj: SceneNode,\r\n localOffset: Vector3,\r\n exposeNode = true\r\n): TransformAccess {\r\n const offset = localOffset.clone();\r\n return {\r\n ...(exposeNode ? { node: obj } : {}),\r\n getWorldPosition(): Vector3 {\r\n return obj.worldMatrix.transformPointAffine(offset);\r\n },\r\n getWorldRotation(): Quaternion {\r\n const q = new Quaternion();\r\n obj.worldMatrix.decompose(null, q, null);\r\n return q;\r\n },\r\n getWorldScale(): Vector3 {\r\n const s = new Vector3();\r\n obj.worldMatrix.decompose(s, null, null);\r\n return s;\r\n },\r\n getLocalPosition(): Vector3 {\r\n return obj.position.clone();\r\n },\r\n getLocalRotation(): Quaternion {\r\n return obj.rotation.clone();\r\n },\r\n getLocalScale(): Vector3 {\r\n return obj.scale.clone();\r\n },\r\n setWorldPosition(p: Vector3): void {\r\n if (obj.parent) {\r\n obj.position = obj.parent.invWorldMatrix.transformPointAffine(p);\r\n } else {\r\n obj.position.set(p);\r\n }\r\n },\r\n setWorldRotation(q: Quaternion): void {\r\n if (obj.parent) {\r\n obj.parent.worldMatrix.decompose(null, _quat, null);\r\n Quaternion.multiply(Quaternion.inverse(_quat), q, obj.rotation);\r\n } else {\r\n obj.rotation.set(q);\r\n }\r\n },\r\n setLocalPosition(p: Vector3): void {\r\n obj.position.set(p);\r\n },\r\n setLocalRotation(q: Quaternion): void {\r\n obj.rotation.set(q);\r\n },\r\n setLocalScale(s: Vector3): void {\r\n obj.scale.set(s);\r\n }\r\n };\r\n}\r\n\r\n/**\r\n * Describes the bone chains simulated by a JointDynamicsSystem.\r\n *\r\n * Each chain is defined by an inclusive start and end node. The end node must be\r\n * a descendant of the start node.\r\n *\r\n * @public\r\n */\r\nexport type JointChainConfig = {\r\n /** Root transform used for root motion compensation. */\r\n systemRoot: SceneNode;\r\n /** Bone chains to simulate. */\r\n chains: {\r\n start: SceneNode;\r\n end: SceneNode;\r\n startAnchor?: SceneNode;\r\n endAnchor?: SceneNode;\r\n startAnchorOffset?: Vector3;\r\n endAnchorOffset?: Vector3;\r\n }[];\r\n};\r\n\r\n/**\r\n * Configuration used to construct a JointDynamicsSystem.\r\n *\r\n * @public\r\n */\r\nexport type JointDynamicSystemConfig = {\r\n /** Bone chain topology and root transform. */\r\n chainConfig: JointChainConfig;\r\n /** Optional controller configuration overrides. */\r\n controllerConfig?: DeepPartial<ControllerConfig, 2>;\r\n};\r\n\r\n/**\r\n * Physics system for spring-like joint dynamics on scene node bone chains.\r\n *\r\n * The system builds particles and constraints from one or more bone chains,\r\n * advances them with Verlet integration, solves constraints and collisions, and\r\n * writes the resulting positions and rotations back to the scene graph.\r\n *\r\n * @public\r\n */\r\nexport class JointDynamicsSystem {\r\n private _controller: JointDynamicsSystemController;\r\n private _chainConfig: JointChainConfig;\r\n private _bindPose: WeakMap<SceneNode, SkeletonBindPose>;\r\n /**\r\n * Create a joint dynamics system for one or more bone chains.\r\n *\r\n * @param config - Bone chain topology and controller configuration.\r\n * @param colliders - Optional colliders to register during initialization.\r\n * @param grabbers - Optional grabbers to register during initialization.\r\n * @param flatPlanes - Optional world-space planes that dynamic points cannot cross.\r\n */\r\n constructor(\r\n config: JointDynamicSystemConfig,\r\n colliders: { r: ColliderR; transform: TransformAccess }[] = [],\r\n grabbers: {\r\n r: GrabberR;\r\n transform: TransformAccess;\r\n enabled: boolean;\r\n }[] = [],\r\n flatPlanes: { up: Vector3; position: Vector3 }[] = []\r\n ) {\r\n this._chainConfig = {\r\n systemRoot: config.chainConfig.systemRoot,\r\n chains: config.chainConfig.chains.map((chain) => ({\r\n start: chain.start,\r\n end: chain.end,\r\n startAnchor: chain.startAnchor,\r\n endAnchor: chain.endAnchor,\r\n startAnchorOffset: chain.startAnchorOffset?.clone(),\r\n endAnchorOffset: chain.endAnchorOffset?.clone()\r\n }))\r\n };\r\n this._bindPose = new WeakMap();\r\n const rootPoints: BoneNode[] = [];\r\n const boneNodes: BoneNode[] = [];\r\n const boneToNode = new Map<BoneNode, SceneNode>();\r\n const pointTransforms: TransformAccess[] = [];\r\n const pointSourceTransforms = new Map<BoneNode, TransformAccess>();\r\n const nodeToBone = new Map<SceneNode, BoneNode>();\r\n const nodeToDepth = new Map<SceneNode, number>();\r\n for (const chain of config.chainConfig.chains) {\r\n const chainNodes = this.collectChainNodes(chain.start, chain.end);\r\n let previous: BoneNode | null = null;\r\n for (let i = 0; i < chainNodes.length; i++) {\r\n const node = chainNodes[i];\r\n const isChainStart = i === 0;\r\n const isChainEnd = i === chainNodes.length - 1;\r\n const sourceNode =\r\n (isChainStart ? chain.startAnchor : null) ?? (isChainEnd ? chain.endAnchor : null) ?? node;\r\n const sourceOffset =\r\n (isChainStart ? chain.startAnchorOffset : null) ??\r\n (isChainEnd ? chain.endAnchorOffset : null) ??\r\n null;\r\n let boneNode = nodeToBone.get(node);\r\n if (!boneNode) {\r\n this._bindPose.set(node, {\r\n position: node.position.clone(),\r\n rotation: node.rotation.clone(),\r\n scale: node.scale.clone()\r\n });\r\n boneNode = {\r\n index: boneNodes.length,\r\n position: node.getWorldPosition(),\r\n children: [],\r\n isFixed: isChainStart || !!(isChainEnd && chain.endAnchor),\r\n depth: i\r\n };\r\n nodeToBone.set(node, boneNode);\r\n nodeToDepth.set(node, i);\r\n boneNodes.push(boneNode);\r\n boneToNode.set(boneNode, node);\r\n pointSourceTransforms.set(\r\n boneNode,\r\n sourceOffset\r\n ? createOffsetTransformAccess(sourceNode, sourceOffset)\r\n : createTransformAccess(sourceNode)\r\n );\r\n } else {\r\n const depth = nodeToDepth.get(node) ?? boneNode.depth;\r\n if (i < depth) {\r\n boneNode.depth = i;\r\n nodeToDepth.set(node, i);\r\n }\r\n boneNode.isFixed = boneNode.isFixed || isChainStart || !!(isChainEnd && chain.endAnchor);\r\n const existingSource =\r\n pointSourceTransforms.get(boneNode)?.node ?? boneToNode.get(boneNode) ?? null;\r\n if (existingSource && existingSource !== sourceNode) {\r\n throw new Error(\r\n `Conflicting anchor assignment for joint dynamics node '${node.name || node.persistentId}'.`\r\n );\r\n }\r\n if (!existingSource) {\r\n pointSourceTransforms.set(\r\n boneNode,\r\n sourceOffset\r\n ? createOffsetTransformAccess(sourceNode, sourceOffset)\r\n : createTransformAccess(sourceNode)\r\n );\r\n }\r\n }\r\n if (previous && !previous.children.includes(boneNode)) {\r\n previous.children.push(boneNode);\r\n const rootIndex = rootPoints.indexOf(boneNode);\r\n if (rootIndex !== -1) {\r\n rootPoints.splice(rootIndex, 1);\r\n }\r\n } else if (!previous && !rootPoints.includes(boneNode)) {\r\n rootPoints.push(boneNode);\r\n }\r\n previous = boneNode;\r\n }\r\n }\r\n const orderedBoneNodes: BoneNode[] = [];\r\n const visitedBoneNodes = new Set<BoneNode>();\r\n const orderBoneNode = (boneNode: BoneNode) => {\r\n if (visitedBoneNodes.has(boneNode)) {\r\n return;\r\n }\r\n visitedBoneNodes.add(boneNode);\r\n boneNode.index = orderedBoneNodes.length;\r\n orderedBoneNodes.push(boneNode);\r\n for (const child of boneNode.children) {\r\n orderBoneNode(child);\r\n }\r\n };\r\n for (const root of rootPoints) {\r\n orderBoneNode(root);\r\n }\r\n boneNodes.length = 0;\r\n boneNodes.push(...orderedBoneNodes);\r\n pointTransforms.push(...boneNodes.map((boneNode) => createTransformAccess(boneToNode.get(boneNode)!)));\r\n const pointInputTransforms = boneNodes.map(\r\n (boneNode) => pointSourceTransforms.get(boneNode) ?? createTransformAccess(boneToNode.get(boneNode)!)\r\n );\r\n const systemRoot = createTransformAccess(config.chainConfig.systemRoot);\r\n const defaultConfig = this.getDefaultControllerConfig();\r\n const controllerConfig: ControllerConfig = {\r\n ...defaultConfig,\r\n ...config?.controllerConfig,\r\n angleLimitConfig: { ...defaultConfig.angleLimitConfig, ...config?.controllerConfig?.angleLimitConfig },\r\n curves: { ...defaultConfig.curves, ...config?.controllerConfig?.curves },\r\n constraintOptions: {\r\n ...defaultConfig.constraintOptions,\r\n ...config?.controllerConfig?.constraintOptions\r\n }\r\n };\r\n this._controller = new JointDynamicsSystemController(controllerConfig);\r\n this._controller.initialize(\r\n systemRoot,\r\n rootPoints,\r\n pointTransforms,\r\n pointInputTransforms,\r\n colliders,\r\n grabbers,\r\n flatPlanes\r\n );\r\n }\r\n\r\n /**\r\n * Get the low-level controller that owns simulation state and advanced runtime controls.\r\n *\r\n * Most callers should prefer the convenience methods on JointDynamicsSystem.\r\n *\r\n * @returns The underlying joint dynamics controller.\r\n */\r\n get controller(): JointDynamicsSystemController {\r\n return this._controller;\r\n }\r\n\r\n /**\r\n * Get the node chain topology used to construct this system.\r\n */\r\n get chainConfig(): JointChainConfig {\r\n return {\r\n systemRoot: this._chainConfig.systemRoot,\r\n chains: this._chainConfig.chains.map((chain) => ({\r\n start: chain.start,\r\n end: chain.end,\r\n startAnchor: chain.startAnchor,\r\n endAnchor: chain.endAnchor,\r\n startAnchorOffset: chain.startAnchorOffset?.clone(),\r\n endAnchorOffset: chain.endAnchorOffset?.clone()\r\n }))\r\n };\r\n }\r\n\r\n /**\r\n * Returns detached collider snapshots for serialization.\r\n */\r\n getColliderSnapshots(): JointDynamicsColliderSnapshot[] {\r\n return this._controller.getColliderSnapshots();\r\n }\r\n\r\n /**\r\n * Returns detached flat-plane snapshots for serialization.\r\n */\r\n getFlatPlaneSnapshots(): JointDynamicsFlatPlaneSnapshot[] {\r\n return this._controller.getFlatPlaneSnapshots();\r\n }\r\n\r\n /**\r\n * Returns detached grabber snapshots for serialization.\r\n */\r\n getGrabberSnapshots(): JointDynamicsGrabberSnapshot[] {\r\n return this._controller.getGrabberSnapshots();\r\n }\r\n\r\n /**\r\n * Reset chain nodes to bind pose\r\n */\r\n resetChains() {\r\n for (const chain of this._chainConfig.chains) {\r\n const chainNodes = this.collectChainNodes(chain.start, chain.end);\r\n for (const node of chainNodes) {\r\n const bindPose = this._bindPose.get(node);\r\n if (bindPose) {\r\n node.position = bindPose.position;\r\n node.rotation = bindPose.rotation;\r\n node.scale = bindPose.scale;\r\n }\r\n }\r\n }\r\n }\r\n /**\r\n * Add a fully configured collider at runtime.\r\n *\r\n * The collider transform is read from the supplied scene node every simula ; ion step.\r\n * If no transform is supplied, the collider is created at the identity transform.\r\n *\r\n * @param r - Read-only collider parameters.\r\n * @param transform - Optional scene node that drives the collider transform.\r\n * @returns A stable handle that remains valid until this collider is removed.\r\n */\r\n addCollider(r: ColliderR, transform?: SceneNode): JointDynamicsColliderHandle {\r\n return this._controller.addCollider(r, transform ? createTransformAccess(transform) : _defaultTA);\r\n }\r\n\r\n /**\r\n * Add a spherical collider at runtime.\r\n *\r\n * The collider transform is read from the supplied scene node every simulation step.\r\n * If no transform is supplied, the collider is created at the identity transform.\r\n *\r\n * @param radius - Sphere radius in world units before transform scaling.\r\n * @param transform - Optional scene node that drives the collider transform.\r\n * @param friction - Contact friction coefficient applied by this collider. Defaults to 0.\r\n * @param inversed - If true, points are constrained inside the sphere instead of pushed out.\r\n * @returns A stable handle that remains valid until this collider is removed.\r\n */\r\n addSphereCollider(\r\n radius: number,\r\n transform?: SceneNode,\r\n friction?: number,\r\n inversed?: boolean\r\n ): JointDynamicsColliderHandle {\r\n return this.addCollider(\r\n {\r\n forceType: ColliderForce.Off,\r\n friction: friction ?? 0,\r\n height: 0,\r\n isInverseCollider: inversed ?? false,\r\n radius,\r\n radiusTailScale: 1\r\n },\r\n transform\r\n );\r\n }\r\n\r\n /**\r\n * Add a capsule collider at runtime.\r\n *\r\n * The capsule is aligned to the collider transform's local Y axis. Its head radius is\r\n * `radius`, its tail radius is `radius * radiusTailScale`, and `height` defines the\r\n * distance between the capsule ends before transform scaling.\r\n *\r\n * @param radius - Capsule head radius in world units before transform scaling.\r\n * @param height - Capsule length in world units before transform scaling.\r\n * @param transform - Optional scene node that drives the collider transform.\r\n * @param radiusTailScale - Tail radius multiplier relative to the head radius. Defaults to 1.\r\n * @param friction - Contact friction coefficient applied by this collider. Defaults to 0.\r\n * @param inversed - If true, points are constrained inside the capsule instead of pushed out.\r\n * @returns A stable handle that remains valid until this collider is removed.\r\n */\r\n addCapsuleCollider(\r\n radius: number,\r\n height: number,\r\n transform?: SceneNode,\r\n radiusTailScale?: number,\r\n friction?: number,\r\n inversed?: boolean\r\n ): JointDynamicsColliderHandle {\r\n return this.addCollider(\r\n {\r\n forceType: ColliderForce.Off,\r\n friction: friction ?? 0,\r\n height,\r\n isInverseCollider: inversed ?? false,\r\n radius,\r\n radiusTailScale: radiusTailScale ?? 1\r\n },\r\n transform\r\n );\r\n }\r\n\r\n /**\r\n * Enable or disable a collider by stable handle.\r\n *\r\n * Disabled colliders remain registered but are ignored by simulation until re-enabled.\r\n *\r\n * @param handle - Collider handle returned by addCollider, addSphereCollider, or addCapsuleCollider.\r\n * @param enabled - Whether the collider should participate in simulation.\r\n * @returns true if the handle is valid and the enabled state was updated.\r\n */\r\n setColliderEnabled(handle: JointDynamicsColliderHandle, enabled: boolean): boolean {\r\n return this._controller.setColliderEnabled(handle, enabled);\r\n }\r\n\r\n /**\r\n * Remove a collider by stable handle.\r\n *\r\n * @param handle - Collider handle returned by addCollider, addSphereCollider, or addCapsuleCollider.\r\n * @returns true if the collider existed and was removed.\r\n */\r\n removeCollider(handle: JointDynamicsColliderHandle): boolean {\r\n return this._controller.removeCollider(handle);\r\n }\r\n\r\n /**\r\n * Remove a collider by current array index.\r\n *\r\n * Prefer removeCollider(handle) for runtime-owned colliders.\r\n *\r\n * @param index - Current collider array index.\r\n * @returns true if the collider existed and was removed.\r\n */\r\n removeColliderAt(index: number): boolean {\r\n return this._controller.removeColliderAt(index);\r\n }\r\n\r\n /**\r\n * Add a flat plane collider at runtime.\r\n *\r\n * Flat planes are infinite world-space planes. The normal points toward the allowed side,\r\n * and dynamic points are pushed back when they move behind the plane.\r\n *\r\n * @param up - Plane normal in world space.\r\n * @param position - A point on the plane in world space.\r\n * @returns A stable handle that remains valid until this flat plane is removed.\r\n */\r\n addFlatPlane(up: Vector3, position: Vector3): JointDynamicsFlatPlaneHandle {\r\n return this._controller.addFlatPlane(up, position);\r\n }\r\n\r\n /**\r\n * Enable or disable a flat plane by stable handle.\r\n *\r\n * Disabled flat planes remain registered but are ignored by simulation until re-enabled.\r\n *\r\n * @param handle - Flat plane handle returned by addFlatPlane.\r\n * @param enabled - Whether the flat plane should participate in simulation.\r\n * @returns true if the handle is valid and the enabled state was updated.\r\n */\r\n setFlatPlaneEnabled(handle: JointDynamicsFlatPlaneHandle, enabled: boolean): boolean {\r\n return this._controller.setFlatPlaneEnabled(handle, enabled);\r\n }\r\n\r\n /**\r\n * Remove a flat plane by stable handle.\r\n *\r\n * @param handle - Flat plane handle returned by addFlatPlane.\r\n * @returns true if the flat plane existed and was removed.\r\n */\r\n removeFlatPlane(handle: JointDynamicsFlatPlaneHandle): boolean {\r\n return this._controller.removeFlatPlane(handle);\r\n }\r\n\r\n /**\r\n * Remove a flat plane by current array index.\r\n * Prefer removeFlatPlane(handle) for runtime-owned flat planes.\r\n *\r\n * @param index - Current flat plane array index.\r\n * @returns true if the flat plane existed and was removed.\r\n */\r\n removeFlatPlaneAt(index: number): boolean {\r\n return this._controller.removeFlatPlaneAt(index);\r\n }\r\n\r\n /**\r\n * Add a grabber at runtime.\r\n *\r\n * The grabber transform is read from the supplied scene node every simulation step.\r\n * If no transform is supplied, the grabber is created at the identity transform.\r\n *\r\n * @param r - Read-only grabber parameters.\r\n * @param transform - Optional scene node that drives the grabber transform.\r\n * @returns A stable handle that remains valid until this grabber is removed.\r\n */\r\n addGrabber(r: GrabberR, transform?: SceneNode): JointDynamicsGrabberHandle {\r\n return this._controller.addGrabber(r, transform ? createTransformAccess(transform) : _defaultTA, false);\r\n }\r\n\r\n /**\r\n * Enable or disable a grabber by stable handle.\r\n *\r\n * Disabling a grabber also releases any points currently held by it.\r\n *\r\n * @param handle - Grabber handle returned by addGrabber.\r\n * @param enabled - Whether the grabber should participate in simulation.\r\n * @returns true if the handle is valid and the enabled state was updated.\r\n */\r\n setGrabberEnabled(handle: JointDynamicsGrabberHandle, enabled: boolean): boolean {\r\n return this._controller.setGrabberEnabled(handle, enabled);\r\n }\r\n\r\n /**\r\n * Remove a grabber by stable handle.\r\n *\r\n * @param handle - Grabber handle returned by addGrabber.\r\n * @returns true if the grabber existed and was removed.\r\n */\r\n removeGrabber(handle: JointDynamicsGrabberHandle): boolean {\r\n return this._controller.removeGrabber(handle);\r\n }\r\n\r\n /**\r\n * Remove a grabber by current array index.\r\n *\r\n * Prefer removeGrabber(handle) for runtime-owned grabbers.\r\n *\r\n * @param index - Current grabber array index.\r\n * @returns true if the grabber existed and was removed.\r\n */\r\n removeGrabberAt(index: number): boolean {\r\n return this._controller.removeGrabberAt(index);\r\n }\r\n\r\n private collectChainNodes(start: SceneNode, end: SceneNode): SceneNode[] {\r\n if (!start.isParentOf(end)) {\r\n throw new Error('Invalid chain: end node must be a descendant of start node');\r\n }\r\n const nodes: SceneNode[] = [];\r\n let current: SceneNode = end;\r\n for (;;) {\r\n nodes.unshift(current);\r\n if (current === start) {\r\n break;\r\n }\r\n current = current.parent!;\r\n }\r\n return nodes;\r\n }\r\n /**\r\n * Advance the physics simulation and write the resulting transforms back to the chain nodes.\r\n *\r\n * @param deltaTime - Frame time step in seconds. Values larger than 0.033 are clamped for stability.\r\n */\r\n update(deltaTime: number): void {\r\n const dt = Math.min(deltaTime, 0.033); // Max 30 FPS\r\n this._controller.step(dt);\r\n }\r\n /** @internal */\r\n private getDefaultControllerConfig(): ControllerConfig {\r\n return {\r\n gravity: new Vector3(0, -9.8, 0),\r\n relaxation: 3,\r\n subSteps: 3,\r\n enableSurfaceCollision: false,\r\n windForce: Vector3.zero(),\r\n rootSlideLimit: -1,\r\n rootRotateLimit: -1,\r\n constraintShrinkLimit: 1,\r\n blendRatio: 0,\r\n stabilizationFrameRate: 60,\r\n isFakeWave: false,\r\n fakeWaveSpeed: 0,\r\n fakeWavePower: 0,\r\n angleLimitConfig: { angleLimit: -1, limitFromRoot: false },\r\n enableBroadPhase: false,\r\n preserveTwist: true,\r\n curves: {\r\n gravityScale: InterpolatorScalar.constant(1),\r\n windForceScale: InterpolatorScalar.constant(1),\r\n massScale: InterpolatorScalar.constant(1),\r\n resistance: InterpolatorScalar.constant(0.95),\r\n hardness: InterpolatorScalar.constant(0.001),\r\n friction: InterpolatorScalar.constant(0.5),\r\n pointRadius: InterpolatorScalar.constant(0.05),\r\n sliderJointLength: InterpolatorScalar.constant(0),\r\n allShrinkScale: InterpolatorScalar.constant(1),\r\n allStretchScale: InterpolatorScalar.constant(1),\r\n structuralShrinkVertical: InterpolatorScalar.constant(1),\r\n structuralStretchVertical: InterpolatorScalar.constant(1),\r\n structuralShrinkHorizontal: InterpolatorScalar.constant(0.5),\r\n structuralStretchHorizontal: InterpolatorScalar.constant(0.5),\r\n shearShrink: InterpolatorScalar.constant(0.5),\r\n shearStretch: InterpolatorScalar.constant(0.5),\r\n bendingShrinkVertical: InterpolatorScalar.constant(0.5),\r\n bendingStretchVertical: InterpolatorScalar.constant(0.5),\r\n bendingShrinkHorizontal: InterpolatorScalar.constant(0.5),\r\n bendingStretchHorizontal: InterpolatorScalar.constant(0.5),\r\n fakeWavePower: InterpolatorScalar.constant(0),\r\n fakeWaveFreq: InterpolatorScalar.constant(0)\r\n },\r\n constraintOptions: {\r\n structuralVertical: false,\r\n structuralHorizontal: false,\r\n shear: false,\r\n bendingVertical: false,\r\n bendingHorizontal: false,\r\n isLoop: false,\r\n collideStructuralVertical: false,\r\n collideStructuralHorizontal: false,\r\n collideShear: false,\r\n enableSurfaceCollision: false\r\n }\r\n };\r\n }\r\n}\r\n"],"names":["_quat","Quaternion","_defaultTA","createTransformAccess","SceneNode","obj","exposeNode","node","getWorldPosition","getWorldRotation","q","worldMatrix","decompose","getWorldScale","s","Vector3","getLocalPosition","position","clone","getLocalRotation","rotation","getLocalScale","scale","setWorldPosition","p","parent","invWorldMatrix","transformPointAffine","set","setWorldRotation","multiply","inverse","setLocalPosition","setLocalRotation","setLocalScale","createOffsetTransformAccess","localOffset","offset","JointDynamicsSystem","_controller","_chainConfig","_bindPose","config","colliders","grabbers","flatPlanes","systemRoot","chainConfig","chains","map","chain","start","end","startAnchor","endAnchor","startAnchorOffset","endAnchorOffset","WeakMap","rootPoints","boneNodes","boneToNode","Map","pointTransforms","pointSourceTransforms","nodeToBone","nodeToDepth","chainNodes","collectChainNodes","previous","i","length","isChainStart","isChainEnd","sourceNode","sourceOffset","boneNode","get","index","children","isFixed","depth","push","existingSource","Error","name","persistentId","includes","rootIndex","indexOf","splice","orderedBoneNodes","visitedBoneNodes","Set","orderBoneNode","has","add","child","root","pointInputTransforms","defaultConfig","getDefaultControllerConfig","controllerConfig","angleLimitConfig","curves","constraintOptions","JointDynamicsSystemController","initialize","controller","getColliderSnapshots","getFlatPlaneSnapshots","getGrabberSnapshots","resetChains","bindPose","addCollider","r","transform","addSphereCollider","radius","friction","inversed","forceType","ColliderForce","Off","height","isInverseCollider","radiusTailScale","addCapsuleCollider","setColliderEnabled","handle","enabled","removeCollider","removeColliderAt","addFlatPlane","up","setFlatPlaneEnabled","removeFlatPlane","removeFlatPlaneAt","addGrabber","setGrabberEnabled","removeGrabber","removeGrabberAt","isParentOf","nodes","current","unshift","update","deltaTime","dt","Math","min","step","gravity","relaxation","subSteps","enableSurfaceCollision","windForce","zero","rootSlideLimit","rootRotateLimit","constraintShrinkLimit","blendRatio","stabilizationFrameRate","isFakeWave","fakeWaveSpeed","fakeWavePower","angleLimit","limitFromRoot","enableBroadPhase","preserveTwist","gravityScale","InterpolatorScalar","constant","windForceScale","massScale","resistance","hardness","pointRadius","sliderJointLength","allShrinkScale","allStretchScale","structuralShrinkVertical","structuralStretchVertical","structuralShrinkHorizontal","structuralStretchHorizontal","shearShrink","shearStretch","bendingShrinkVertical","bendingStretchVertical","bendingShrinkHorizontal","bendingStretchHorizontal","fakeWaveFreq","structuralVertical","structuralHorizontal","shear","bendingVertical","bendingHorizontal","isLoop","collideStructuralVertical","collideStructuralHorizontal","collideShear"],"mappings":";;;;;AAiBA,MAAMA,QAAQ,IAAIC,UAAAA,EAAAA;AAElB,MAAMC,UAAaC,GAAAA,qBAAAA,CAAsB,IAAIC,SAAAA,CAAU,IAAO,CAAA,EAAA,KAAA,CAAA;AAE9D;;;;;;;AAOC,IACM,SAASD,qBAAAA,CAAsBE,GAAc,EAAEC,aAAa,IAAI,EAAA;IACrE,OAAO;AACL,QAAA,GAAIA,UAAa,GAAA;YAAEC,IAAMF,EAAAA;AAAI,SAAA,GAAI,EAAE;AACnCG,QAAAA,gBAAAA,CAAAA,GAAAA;AACE,YAAA,OAAOH,IAAIG,gBAAgB,EAAA;AAC7B,SAAA;AACAC,QAAAA,gBAAAA,CAAAA,GAAAA;AACE,YAAA,MAAMC,IAAI,IAAIT,UAAAA,EAAAA;AACdI,YAAAA,GAAAA,CAAIM,WAAW,CAACC,SAAS,CAAC,MAAMF,CAAG,EAAA,IAAA,CAAA;YACnC,OAAOA,CAAAA;AACT,SAAA;AACAG,QAAAA,aAAAA,CAAAA,GAAAA;AACE,YAAA,MAAMC,IAAI,IAAIC,OAAAA,EAAAA;AACdV,YAAAA,GAAAA,CAAIM,WAAW,CAACC,SAAS,CAACE,GAAG,IAAM,EAAA,IAAA,CAAA;YACnC,OAAOA,CAAAA;AACT,SAAA;AACAE,QAAAA,gBAAAA,CAAAA,GAAAA;YACE,OAAOX,GAAAA,CAAIY,QAAQ,CAACC,KAAK,EAAA;AAC3B,SAAA;AACAC,QAAAA,gBAAAA,CAAAA,GAAAA;YACE,OAAOd,GAAAA,CAAIe,QAAQ,CAACF,KAAK,EAAA;AAC3B,SAAA;AACAG,QAAAA,aAAAA,CAAAA,GAAAA;YACE,OAAOhB,GAAAA,CAAIiB,KAAK,CAACJ,KAAK,EAAA;AACxB,SAAA;AACAK,QAAAA,gBAAAA,CAAAA,CAAiBC,CAAU,EAAA;YACzB,IAAInB,GAAAA,CAAIoB,MAAM,EAAE;gBACdpB,GAAIY,CAAAA,QAAQ,GAAGZ,GAAIoB,CAAAA,MAAM,CAACC,cAAc,CAACC,oBAAoB,CAACH,CAAAA,CAAAA;aACzD,MAAA;gBACLnB,GAAIY,CAAAA,QAAQ,CAACW,GAAG,CAACJ,CAAAA,CAAAA;AACnB;AACF,SAAA;AACAK,QAAAA,gBAAAA,CAAAA,CAAiBnB,CAAa,EAAA;;YAE5B,IAAIL,GAAAA,CAAIoB,MAAM,EAAE;AACdpB,gBAAAA,GAAAA,CAAIoB,MAAM,CAACd,WAAW,CAACC,SAAS,CAAC,MAAMZ,KAAO,EAAA,IAAA,CAAA;gBAC9CC,UAAW6B,CAAAA,QAAQ,CAAC7B,UAAW8B,CAAAA,OAAO,CAAC/B,KAAQU,CAAAA,EAAAA,CAAAA,EAAGL,IAAIe,QAAQ,CAAA;aACzD,MAAA;gBACLf,GAAIe,CAAAA,QAAQ,CAACQ,GAAG,CAAClB,CAAAA,CAAAA;AACnB;AACF,SAAA;AACAsB,QAAAA,gBAAAA,CAAAA,CAAiBR,CAAU,EAAA;YACzBnB,GAAIY,CAAAA,QAAQ,CAACW,GAAG,CAACJ,CAAAA,CAAAA;AACnB,SAAA;AACAS,QAAAA,gBAAAA,CAAAA,CAAiBvB,CAAa,EAAA;YAC5BL,GAAIe,CAAAA,QAAQ,CAACQ,GAAG,CAAClB,CAAAA,CAAAA;AACnB,SAAA;AACAwB,QAAAA,aAAAA,CAAAA,CAAcpB,CAAU,EAAA;YACtBT,GAAIiB,CAAAA,KAAK,CAACM,GAAG,CAACd,CAAAA,CAAAA;AAChB;AACF,KAAA;AACF;AAEA,SAASqB,4BACP9B,GAAc,EACd+B,WAAoB,EACpB9B,aAAa,IAAI,EAAA;IAEjB,MAAM+B,MAAAA,GAASD,YAAYlB,KAAK,EAAA;IAChC,OAAO;AACL,QAAA,GAAIZ,UAAa,GAAA;YAAEC,IAAMF,EAAAA;AAAI,SAAA,GAAI,EAAE;AACnCG,QAAAA,gBAAAA,CAAAA,GAAAA;AACE,YAAA,OAAOH,GAAIM,CAAAA,WAAW,CAACgB,oBAAoB,CAACU,MAAAA,CAAAA;AAC9C,SAAA;AACA5B,QAAAA,gBAAAA,CAAAA,GAAAA;AACE,YAAA,MAAMC,IAAI,IAAIT,UAAAA,EAAAA;AACdI,YAAAA,GAAAA,CAAIM,WAAW,CAACC,SAAS,CAAC,MAAMF,CAAG,EAAA,IAAA,CAAA;YACnC,OAAOA,CAAAA;AACT,SAAA;AACAG,QAAAA,aAAAA,CAAAA,GAAAA;AACE,YAAA,MAAMC,IAAI,IAAIC,OAAAA,EAAAA;AACdV,YAAAA,GAAAA,CAAIM,WAAW,CAACC,SAAS,CAACE,GAAG,IAAM,EAAA,IAAA,CAAA;YACnC,OAAOA,CAAAA;AACT,SAAA;AACAE,QAAAA,gBAAAA,CAAAA,GAAAA;YACE,OAAOX,GAAAA,CAAIY,QAAQ,CAACC,KAAK,EAAA;AAC3B,SAAA;AACAC,QAAAA,gBAAAA,CAAAA,GAAAA;YACE,OAAOd,GAAAA,CAAIe,QAAQ,CAACF,KAAK,EAAA;AAC3B,SAAA;AACAG,QAAAA,aAAAA,CAAAA,GAAAA;YACE,OAAOhB,GAAAA,CAAIiB,KAAK,CAACJ,KAAK,EAAA;AACxB,SAAA;AACAK,QAAAA,gBAAAA,CAAAA,CAAiBC,CAAU,EAAA;YACzB,IAAInB,GAAAA,CAAIoB,MAAM,EAAE;gBACdpB,GAAIY,CAAAA,QAAQ,GAAGZ,GAAIoB,CAAAA,MAAM,CAACC,cAAc,CAACC,oBAAoB,CAACH,CAAAA,CAAAA;aACzD,MAAA;gBACLnB,GAAIY,CAAAA,QAAQ,CAACW,GAAG,CAACJ,CAAAA,CAAAA;AACnB;AACF,SAAA;AACAK,QAAAA,gBAAAA,CAAAA,CAAiBnB,CAAa,EAAA;YAC5B,IAAIL,GAAAA,CAAIoB,MAAM,EAAE;AACdpB,gBAAAA,GAAAA,CAAIoB,MAAM,CAACd,WAAW,CAACC,SAAS,CAAC,MAAMZ,KAAO,EAAA,IAAA,CAAA;gBAC9CC,UAAW6B,CAAAA,QAAQ,CAAC7B,UAAW8B,CAAAA,OAAO,CAAC/B,KAAQU,CAAAA,EAAAA,CAAAA,EAAGL,IAAIe,QAAQ,CAAA;aACzD,MAAA;gBACLf,GAAIe,CAAAA,QAAQ,CAACQ,GAAG,CAAClB,CAAAA,CAAAA;AACnB;AACF,SAAA;AACAsB,QAAAA,gBAAAA,CAAAA,CAAiBR,CAAU,EAAA;YACzBnB,GAAIY,CAAAA,QAAQ,CAACW,GAAG,CAACJ,CAAAA,CAAAA;AACnB,SAAA;AACAS,QAAAA,gBAAAA,CAAAA,CAAiBvB,CAAa,EAAA;YAC5BL,GAAIe,CAAAA,QAAQ,CAACQ,GAAG,CAAClB,CAAAA,CAAAA;AACnB,SAAA;AACAwB,QAAAA,aAAAA,CAAAA,CAAcpB,CAAU,EAAA;YACtBT,GAAIiB,CAAAA,KAAK,CAACM,GAAG,CAACd,CAAAA,CAAAA;AAChB;AACF,KAAA;AACF;AAoCA;;;;;;;;AAQC,IACM,MAAMwB,mBAAAA,CAAAA;IACHC,WAA2C;IAC3CC,YAA+B;IAC/BC,SAAgD;AACxD;;;;;;;MAQA,WAAA,CACEC,MAAgC,EAChCC,SAA4D,GAAA,EAAE,EAC9DC,QAAAA,GAIM,EAAE,EACRC,UAAmD,GAAA,EAAE,CACrD;QACA,IAAI,CAACL,YAAY,GAAG;YAClBM,UAAYJ,EAAAA,MAAAA,CAAOK,WAAW,CAACD,UAAU;YACzCE,MAAQN,EAAAA,MAAAA,CAAOK,WAAW,CAACC,MAAM,CAACC,GAAG,CAAC,CAACC,KAAAA,IAAW;AAChDC,oBAAAA,KAAAA,EAAOD,MAAMC,KAAK;AAClBC,oBAAAA,GAAAA,EAAKF,MAAME,GAAG;AACdC,oBAAAA,WAAAA,EAAaH,MAAMG,WAAW;AAC9BC,oBAAAA,SAAAA,EAAWJ,MAAMI,SAAS;oBAC1BC,iBAAmBL,EAAAA,KAAAA,CAAMK,iBAAiB,EAAErC,KAAAA,EAAAA;oBAC5CsC,eAAiBN,EAAAA,KAAAA,CAAMM,eAAe,EAAEtC,KAAAA;iBAC1C,CAAA;AACF,SAAA;QACA,IAAI,CAACuB,SAAS,GAAG,IAAIgB,OAAAA,EAAAA;AACrB,QAAA,MAAMC,aAAyB,EAAE;AACjC,QAAA,MAAMC,YAAwB,EAAE;AAChC,QAAA,MAAMC,aAAa,IAAIC,GAAAA,EAAAA;AACvB,QAAA,MAAMC,kBAAqC,EAAE;AAC7C,QAAA,MAAMC,wBAAwB,IAAIF,GAAAA,EAAAA;AAClC,QAAA,MAAMG,aAAa,IAAIH,GAAAA,EAAAA;AACvB,QAAA,MAAMI,cAAc,IAAIJ,GAAAA,EAAAA;AACxB,QAAA,KAAK,MAAMX,KAASR,IAAAA,MAAAA,CAAOK,WAAW,CAACC,MAAM,CAAE;YAC7C,MAAMkB,UAAAA,GAAa,IAAI,CAACC,iBAAiB,CAACjB,KAAMC,CAAAA,KAAK,EAAED,KAAAA,CAAME,GAAG,CAAA;AAChE,YAAA,IAAIgB,QAA4B,GAAA,IAAA;AAChC,YAAA,IAAK,IAAIC,CAAI,GAAA,CAAA,EAAGA,IAAIH,UAAWI,CAAAA,MAAM,EAAED,CAAK,EAAA,CAAA;gBAC1C,MAAM9D,IAAAA,GAAO2D,UAAU,CAACG,CAAE,CAAA;AAC1B,gBAAA,MAAME,eAAeF,CAAM,KAAA,CAAA;AAC3B,gBAAA,MAAMG,UAAaH,GAAAA,CAAAA,KAAMH,UAAWI,CAAAA,MAAM,GAAG,CAAA;AAC7C,gBAAA,MAAMG,UACJ,GAACF,CAAAA,YAAAA,GAAerB,MAAMG,WAAW,GAAG,IAAG,MAAOmB,UAAatB,GAAAA,KAAAA,CAAMI,SAAS,GAAG,IAAG,CAAM/C,IAAAA,IAAAA;AACxF,gBAAA,MAAMmE,YACJ,GAACH,CAAAA,YAAAA,GAAerB,MAAMK,iBAAiB,GAAG,IAAG,MAC5CiB,UAAatB,GAAAA,KAAAA,CAAMM,eAAe,GAAG,IAAG,CACzC,IAAA,IAAA;gBACF,IAAImB,QAAAA,GAAWX,UAAWY,CAAAA,GAAG,CAACrE,IAAAA,CAAAA;AAC9B,gBAAA,IAAI,CAACoE,QAAU,EAAA;AACb,oBAAA,IAAI,CAAClC,SAAS,CAACb,GAAG,CAACrB,IAAM,EAAA;wBACvBU,QAAUV,EAAAA,IAAAA,CAAKU,QAAQ,CAACC,KAAK,EAAA;wBAC7BE,QAAUb,EAAAA,IAAAA,CAAKa,QAAQ,CAACF,KAAK,EAAA;wBAC7BI,KAAOf,EAAAA,IAAAA,CAAKe,KAAK,CAACJ,KAAK;AACzB,qBAAA,CAAA;oBACAyD,QAAW,GAAA;AACTE,wBAAAA,KAAAA,EAAOlB,UAAUW,MAAM;AACvBrD,wBAAAA,QAAAA,EAAUV,KAAKC,gBAAgB,EAAA;AAC/BsE,wBAAAA,QAAAA,EAAU,EAAE;AACZC,wBAAAA,OAAAA,EAASR,gBAAgB,CAAC,EAAEC,UAActB,IAAAA,KAAAA,CAAMI,SAAS,CAAD;wBACxD0B,KAAOX,EAAAA;AACT,qBAAA;oBACAL,UAAWpC,CAAAA,GAAG,CAACrB,IAAMoE,EAAAA,QAAAA,CAAAA;oBACrBV,WAAYrC,CAAAA,GAAG,CAACrB,IAAM8D,EAAAA,CAAAA,CAAAA;AACtBV,oBAAAA,SAAAA,CAAUsB,IAAI,CAACN,QAAAA,CAAAA;oBACff,UAAWhC,CAAAA,GAAG,CAAC+C,QAAUpE,EAAAA,IAAAA,CAAAA;AACzBwD,oBAAAA,qBAAAA,CAAsBnC,GAAG,CACvB+C,QAAAA,EACAD,eACIvC,2BAA4BsC,CAAAA,UAAAA,EAAYC,gBACxCvE,qBAAsBsE,CAAAA,UAAAA,CAAAA,CAAAA;iBAEvB,MAAA;AACL,oBAAA,MAAMO,QAAQf,WAAYW,CAAAA,GAAG,CAACrE,IAAAA,CAAAA,IAASoE,SAASK,KAAK;AACrD,oBAAA,IAAIX,IAAIW,KAAO,EAAA;AACbL,wBAAAA,QAAAA,CAASK,KAAK,GAAGX,CAAAA;wBACjBJ,WAAYrC,CAAAA,GAAG,CAACrB,IAAM8D,EAAAA,CAAAA,CAAAA;AACxB;AACAM,oBAAAA,QAAAA,CAASI,OAAO,GAAGJ,QAASI,CAAAA,OAAO,IAAIR,YAAAA,IAAgB,CAAC,EAAEC,UAAAA,IAActB,KAAMI,CAAAA,SAAS,CAAD;oBACtF,MAAM4B,cAAAA,GACJnB,sBAAsBa,GAAG,CAACD,WAAWpE,IAAQqD,IAAAA,UAAAA,CAAWgB,GAAG,CAACD,QAAa,CAAA,IAAA,IAAA;oBAC3E,IAAIO,cAAAA,IAAkBA,mBAAmBT,UAAY,EAAA;AACnD,wBAAA,MAAM,IAAIU,KAAAA,CACR,CAAC,uDAAuD,EAAE5E,IAAAA,CAAK6E,IAAI,IAAI7E,IAAK8E,CAAAA,YAAY,CAAC,EAAE,CAAC,CAAA;AAEhG;AACA,oBAAA,IAAI,CAACH,cAAgB,EAAA;AACnBnB,wBAAAA,qBAAAA,CAAsBnC,GAAG,CACvB+C,QAAAA,EACAD,eACIvC,2BAA4BsC,CAAAA,UAAAA,EAAYC,gBACxCvE,qBAAsBsE,CAAAA,UAAAA,CAAAA,CAAAA;AAE9B;AACF;AACA,gBAAA,IAAIL,YAAY,CAACA,QAAAA,CAASU,QAAQ,CAACQ,QAAQ,CAACX,QAAW,CAAA,EAAA;oBACrDP,QAASU,CAAAA,QAAQ,CAACG,IAAI,CAACN,QAAAA,CAAAA;oBACvB,MAAMY,SAAAA,GAAY7B,UAAW8B,CAAAA,OAAO,CAACb,QAAAA,CAAAA;oBACrC,IAAIY,SAAAA,KAAc,EAAI,EAAA;wBACpB7B,UAAW+B,CAAAA,MAAM,CAACF,SAAW,EAAA,CAAA,CAAA;AAC/B;AACF,iBAAA,MAAO,IAAI,CAACnB,QAAAA,IAAY,CAACV,UAAW4B,CAAAA,QAAQ,CAACX,QAAW,CAAA,EAAA;AACtDjB,oBAAAA,UAAAA,CAAWuB,IAAI,CAACN,QAAAA,CAAAA;AAClB;gBACAP,QAAWO,GAAAA,QAAAA;AACb;AACF;AACA,QAAA,MAAMe,mBAA+B,EAAE;AACvC,QAAA,MAAMC,mBAAmB,IAAIC,GAAAA,EAAAA;AAC7B,QAAA,MAAMC,gBAAgB,CAAClB,QAAAA,GAAAA;YACrB,IAAIgB,gBAAAA,CAAiBG,GAAG,CAACnB,QAAW,CAAA,EAAA;AAClC,gBAAA;AACF;AACAgB,YAAAA,gBAAAA,CAAiBI,GAAG,CAACpB,QAAAA,CAAAA;YACrBA,QAASE,CAAAA,KAAK,GAAGa,gBAAAA,CAAiBpB,MAAM;AACxCoB,YAAAA,gBAAAA,CAAiBT,IAAI,CAACN,QAAAA,CAAAA;AACtB,YAAA,KAAK,MAAMqB,KAAAA,IAASrB,QAASG,CAAAA,QAAQ,CAAE;gBACrCe,aAAcG,CAAAA,KAAAA,CAAAA;AAChB;AACF,SAAA;QACA,KAAK,MAAMC,QAAQvC,UAAY,CAAA;YAC7BmC,aAAcI,CAAAA,IAAAA,CAAAA;AAChB;AACAtC,QAAAA,SAAAA,CAAUW,MAAM,GAAG,CAAA;AACnBX,QAAAA,SAAAA,CAAUsB,IAAI,CAAIS,GAAAA,gBAAAA,CAAAA;QAClB5B,eAAgBmB,CAAAA,IAAI,CAAItB,GAAAA,SAAAA,CAAUV,GAAG,CAAC,CAAC0B,QAAaxE,GAAAA,qBAAAA,CAAsByD,UAAWgB,CAAAA,GAAG,CAACD,QAAAA,CAAAA,CAAAA,CAAAA,CAAAA;AACzF,QAAA,MAAMuB,oBAAuBvC,GAAAA,SAAAA,CAAUV,GAAG,CACxC,CAAC0B,QAAAA,GAAaZ,qBAAsBa,CAAAA,GAAG,CAACD,QAAAA,CAAAA,IAAaxE,qBAAsByD,CAAAA,UAAAA,CAAWgB,GAAG,CAACD,QAAAA,CAAAA,CAAAA,CAAAA;AAE5F,QAAA,MAAM7B,UAAa3C,GAAAA,qBAAAA,CAAsBuC,MAAOK,CAAAA,WAAW,CAACD,UAAU,CAAA;QACtE,MAAMqD,aAAAA,GAAgB,IAAI,CAACC,0BAA0B,EAAA;AACrD,QAAA,MAAMC,gBAAqC,GAAA;AACzC,YAAA,GAAGF,aAAa;AAChB,YAAA,GAAGzD,QAAQ2D,gBAAgB;YAC3BC,gBAAkB,EAAA;AAAE,gBAAA,GAAGH,cAAcG,gBAAgB;gBAAE,GAAG5D,MAAAA,EAAQ2D,kBAAkBC;AAAiB,aAAA;YACrGC,MAAQ,EAAA;AAAE,gBAAA,GAAGJ,cAAcI,MAAM;gBAAE,GAAG7D,MAAAA,EAAQ2D,kBAAkBE;AAAO,aAAA;YACvEC,iBAAmB,EAAA;AACjB,gBAAA,GAAGL,cAAcK,iBAAiB;gBAClC,GAAG9D,MAAAA,EAAQ2D,kBAAkBG;AAC/B;AACF,SAAA;AACA,QAAA,IAAI,CAACjE,WAAW,GAAG,IAAIkE,6BAA8BJ,CAAAA,gBAAAA,CAAAA;QACrD,IAAI,CAAC9D,WAAW,CAACmE,UAAU,CACzB5D,YACAY,UACAI,EAAAA,eAAAA,EACAoC,oBACAvD,EAAAA,SAAAA,EACAC,QACAC,EAAAA,UAAAA,CAAAA;AAEJ;AAEA;;;;;;AAMC,MACD,IAAI8D,UAA4C,GAAA;QAC9C,OAAO,IAAI,CAACpE,WAAW;AACzB;AAEA;;AAEC,MACD,IAAIQ,WAAgC,GAAA;QAClC,OAAO;AACLD,YAAAA,UAAAA,EAAY,IAAI,CAACN,YAAY,CAACM,UAAU;YACxCE,MAAQ,EAAA,IAAI,CAACR,YAAY,CAACQ,MAAM,CAACC,GAAG,CAAC,CAACC,KAAAA,IAAW;AAC/CC,oBAAAA,KAAAA,EAAOD,MAAMC,KAAK;AAClBC,oBAAAA,GAAAA,EAAKF,MAAME,GAAG;AACdC,oBAAAA,WAAAA,EAAaH,MAAMG,WAAW;AAC9BC,oBAAAA,SAAAA,EAAWJ,MAAMI,SAAS;oBAC1BC,iBAAmBL,EAAAA,KAAAA,CAAMK,iBAAiB,EAAErC,KAAAA,EAAAA;oBAC5CsC,eAAiBN,EAAAA,KAAAA,CAAMM,eAAe,EAAEtC,KAAAA;iBAC1C,CAAA;AACF,SAAA;AACF;AAEA;;AAEC,MACD0F,oBAAwD,GAAA;AACtD,QAAA,OAAO,IAAI,CAACrE,WAAW,CAACqE,oBAAoB,EAAA;AAC9C;AAEA;;AAEC,MACDC,qBAA0D,GAAA;AACxD,QAAA,OAAO,IAAI,CAACtE,WAAW,CAACsE,qBAAqB,EAAA;AAC/C;AAEA;;AAEC,MACDC,mBAAsD,GAAA;AACpD,QAAA,OAAO,IAAI,CAACvE,WAAW,CAACuE,mBAAmB,EAAA;AAC7C;AAEA;;AAEC,MACDC,WAAc,GAAA;AACZ,QAAA,KAAK,MAAM7D,KAAS,IAAA,IAAI,CAACV,YAAY,CAACQ,MAAM,CAAE;YAC5C,MAAMkB,UAAAA,GAAa,IAAI,CAACC,iBAAiB,CAACjB,KAAMC,CAAAA,KAAK,EAAED,KAAAA,CAAME,GAAG,CAAA;YAChE,KAAK,MAAM7C,QAAQ2D,UAAY,CAAA;AAC7B,gBAAA,MAAM8C,WAAW,IAAI,CAACvE,SAAS,CAACmC,GAAG,CAACrE,IAAAA,CAAAA;AACpC,gBAAA,IAAIyG,QAAU,EAAA;oBACZzG,IAAKU,CAAAA,QAAQ,GAAG+F,QAAAA,CAAS/F,QAAQ;oBACjCV,IAAKa,CAAAA,QAAQ,GAAG4F,QAAAA,CAAS5F,QAAQ;oBACjCb,IAAKe,CAAAA,KAAK,GAAG0F,QAAAA,CAAS1F,KAAK;AAC7B;AACF;AACF;AACF;AACA;;;;;;;;;AASC,MACD2F,WAAYC,CAAAA,CAAY,EAAEC,SAAqB,EAA+B;QAC5E,OAAO,IAAI,CAAC5E,WAAW,CAAC0E,WAAW,CAACC,CAAAA,EAAGC,SAAYhH,GAAAA,qBAAAA,CAAsBgH,SAAajH,CAAAA,GAAAA,UAAAA,CAAAA;AACxF;AAEA;;;;;;;;;;;MAYAkH,iBAAAA,CACEC,MAAc,EACdF,SAAqB,EACrBG,QAAiB,EACjBC,QAAkB,EACW;QAC7B,OAAO,IAAI,CAACN,WAAW,CACrB;AACEO,YAAAA,SAAAA,EAAWC,cAAcC,GAAG;AAC5BJ,YAAAA,QAAAA,EAAUA,QAAY,IAAA,CAAA;YACtBK,MAAQ,EAAA,CAAA;AACRC,YAAAA,iBAAAA,EAAmBL,QAAY,IAAA,KAAA;AAC/BF,YAAAA,MAAAA;YACAQ,eAAiB,EAAA;SAEnBV,EAAAA,SAAAA,CAAAA;AAEJ;AAEA;;;;;;;;;;;;;;AAcC,MACDW,kBACET,CAAAA,MAAc,EACdM,MAAc,EACdR,SAAqB,EACrBU,eAAwB,EACxBP,QAAiB,EACjBC,QAAkB,EACW;QAC7B,OAAO,IAAI,CAACN,WAAW,CACrB;AACEO,YAAAA,SAAAA,EAAWC,cAAcC,GAAG;AAC5BJ,YAAAA,QAAAA,EAAUA,QAAY,IAAA,CAAA;AACtBK,YAAAA,MAAAA;AACAC,YAAAA,iBAAAA,EAAmBL,QAAY,IAAA,KAAA;AAC/BF,YAAAA,MAAAA;AACAQ,YAAAA,eAAAA,EAAiBA,eAAmB,IAAA;SAEtCV,EAAAA,SAAAA,CAAAA;AAEJ;AAEA;;;;;;;;AAQC,MACDY,kBAAmBC,CAAAA,MAAmC,EAAEC,OAAgB,EAAW;AACjF,QAAA,OAAO,IAAI,CAAC1F,WAAW,CAACwF,kBAAkB,CAACC,MAAQC,EAAAA,OAAAA,CAAAA;AACrD;AAEA;;;;;MAMAC,cAAAA,CAAeF,MAAmC,EAAW;AAC3D,QAAA,OAAO,IAAI,CAACzF,WAAW,CAAC2F,cAAc,CAACF,MAAAA,CAAAA;AACzC;AAEA;;;;;;;MAQAG,gBAAAA,CAAiBtD,KAAa,EAAW;AACvC,QAAA,OAAO,IAAI,CAACtC,WAAW,CAAC4F,gBAAgB,CAACtD,KAAAA,CAAAA;AAC3C;AAEA;;;;;;;;;AASC,MACDuD,YAAaC,CAAAA,EAAW,EAAEpH,QAAiB,EAAgC;AACzE,QAAA,OAAO,IAAI,CAACsB,WAAW,CAAC6F,YAAY,CAACC,EAAIpH,EAAAA,QAAAA,CAAAA;AAC3C;AAEA;;;;;;;;AAQC,MACDqH,mBAAoBN,CAAAA,MAAoC,EAAEC,OAAgB,EAAW;AACnF,QAAA,OAAO,IAAI,CAAC1F,WAAW,CAAC+F,mBAAmB,CAACN,MAAQC,EAAAA,OAAAA,CAAAA;AACtD;AAEA;;;;;MAMAM,eAAAA,CAAgBP,MAAoC,EAAW;AAC7D,QAAA,OAAO,IAAI,CAACzF,WAAW,CAACgG,eAAe,CAACP,MAAAA,CAAAA;AAC1C;AAEA;;;;;;MAOAQ,iBAAAA,CAAkB3D,KAAa,EAAW;AACxC,QAAA,OAAO,IAAI,CAACtC,WAAW,CAACiG,iBAAiB,CAAC3D,KAAAA,CAAAA;AAC5C;AAEA;;;;;;;;;AASC,MACD4D,UAAWvB,CAAAA,CAAW,EAAEC,SAAqB,EAA8B;QACzE,OAAO,IAAI,CAAC5E,WAAW,CAACkG,UAAU,CAACvB,CAAGC,EAAAA,SAAAA,GAAYhH,qBAAsBgH,CAAAA,SAAAA,CAAAA,GAAajH,UAAY,EAAA,KAAA,CAAA;AACnG;AAEA;;;;;;;;AAQC,MACDwI,iBAAkBV,CAAAA,MAAkC,EAAEC,OAAgB,EAAW;AAC/E,QAAA,OAAO,IAAI,CAAC1F,WAAW,CAACmG,iBAAiB,CAACV,MAAQC,EAAAA,OAAAA,CAAAA;AACpD;AAEA;;;;;MAMAU,aAAAA,CAAcX,MAAkC,EAAW;AACzD,QAAA,OAAO,IAAI,CAACzF,WAAW,CAACoG,aAAa,CAACX,MAAAA,CAAAA;AACxC;AAEA;;;;;;;MAQAY,eAAAA,CAAgB/D,KAAa,EAAW;AACtC,QAAA,OAAO,IAAI,CAACtC,WAAW,CAACqG,eAAe,CAAC/D,KAAAA,CAAAA;AAC1C;IAEQV,iBAAkBhB,CAAAA,KAAgB,EAAEC,GAAc,EAAe;AACvE,QAAA,IAAI,CAACD,KAAAA,CAAM0F,UAAU,CAACzF,GAAM,CAAA,EAAA;AAC1B,YAAA,MAAM,IAAI+B,KAAM,CAAA,4DAAA,CAAA;AAClB;AACA,QAAA,MAAM2D,QAAqB,EAAE;AAC7B,QAAA,IAAIC,OAAqB3F,GAAAA,GAAAA;QACzB,OAAS;AACP0F,YAAAA,KAAAA,CAAME,OAAO,CAACD,OAAAA,CAAAA;AACd,YAAA,IAAIA,YAAY5F,KAAO,EAAA;AACrB,gBAAA;AACF;AACA4F,YAAAA,OAAAA,GAAUA,QAAQtH,MAAM;AAC1B;QACA,OAAOqH,KAAAA;AACT;AACA;;;;MAKAG,MAAAA,CAAOC,SAAiB,EAAQ;AAC9B,QAAA,MAAMC,KAAKC,IAAKC,CAAAA,GAAG,CAACH,SAAAA,EAAW;AAC/B,QAAA,IAAI,CAAC3G,WAAW,CAAC+G,IAAI,CAACH,EAAAA,CAAAA;AACxB;qBAEA,0BAAuD,GAAA;QACrD,OAAO;AACLI,YAAAA,OAAAA,EAAS,IAAIxI,OAAAA,CAAQ,CAAG,EAAA,IAAM,EAAA,CAAA,CAAA;YAC9ByI,UAAY,EAAA,CAAA;YACZC,QAAU,EAAA,CAAA;YACVC,sBAAwB,EAAA,KAAA;AACxBC,YAAAA,SAAAA,EAAW5I,QAAQ6I,IAAI,EAAA;AACvBC,YAAAA,cAAAA,EAAgB,EAAC;AACjBC,YAAAA,eAAAA,EAAiB,EAAC;YAClBC,qBAAuB,EAAA,CAAA;YACvBC,UAAY,EAAA,CAAA;YACZC,sBAAwB,EAAA,EAAA;YACxBC,UAAY,EAAA,KAAA;YACZC,aAAe,EAAA,CAAA;YACfC,aAAe,EAAA,CAAA;YACf9D,gBAAkB,EAAA;AAAE+D,gBAAAA,UAAAA,EAAY,EAAC;gBAAGC,aAAe,EAAA;AAAM,aAAA;YACzDC,gBAAkB,EAAA,KAAA;YAClBC,aAAe,EAAA,IAAA;YACfjE,MAAQ,EAAA;gBACNkE,YAAcC,EAAAA,kBAAAA,CAAmBC,QAAQ,CAAC,CAAA,CAAA;gBAC1CC,cAAgBF,EAAAA,kBAAAA,CAAmBC,QAAQ,CAAC,CAAA,CAAA;gBAC5CE,SAAWH,EAAAA,kBAAAA,CAAmBC,QAAQ,CAAC,CAAA,CAAA;gBACvCG,UAAYJ,EAAAA,kBAAAA,CAAmBC,QAAQ,CAAC,IAAA,CAAA;gBACxCI,QAAUL,EAAAA,kBAAAA,CAAmBC,QAAQ,CAAC,KAAA,CAAA;gBACtCrD,QAAUoD,EAAAA,kBAAAA,CAAmBC,QAAQ,CAAC,GAAA,CAAA;gBACtCK,WAAaN,EAAAA,kBAAAA,CAAmBC,QAAQ,CAAC,IAAA,CAAA;gBACzCM,iBAAmBP,EAAAA,kBAAAA,CAAmBC,QAAQ,CAAC,CAAA,CAAA;gBAC/CO,cAAgBR,EAAAA,kBAAAA,CAAmBC,QAAQ,CAAC,CAAA,CAAA;gBAC5CQ,eAAiBT,EAAAA,kBAAAA,CAAmBC,QAAQ,CAAC,CAAA,CAAA;gBAC7CS,wBAA0BV,EAAAA,kBAAAA,CAAmBC,QAAQ,CAAC,CAAA,CAAA;gBACtDU,yBAA2BX,EAAAA,kBAAAA,CAAmBC,QAAQ,CAAC,CAAA,CAAA;gBACvDW,0BAA4BZ,EAAAA,kBAAAA,CAAmBC,QAAQ,CAAC,GAAA,CAAA;gBACxDY,2BAA6Bb,EAAAA,kBAAAA,CAAmBC,QAAQ,CAAC,GAAA,CAAA;gBACzDa,WAAad,EAAAA,kBAAAA,CAAmBC,QAAQ,CAAC,GAAA,CAAA;gBACzCc,YAAcf,EAAAA,kBAAAA,CAAmBC,QAAQ,CAAC,GAAA,CAAA;gBAC1Ce,qBAAuBhB,EAAAA,kBAAAA,CAAmBC,QAAQ,CAAC,GAAA,CAAA;gBACnDgB,sBAAwBjB,EAAAA,kBAAAA,CAAmBC,QAAQ,CAAC,GAAA,CAAA;gBACpDiB,uBAAyBlB,EAAAA,kBAAAA,CAAmBC,QAAQ,CAAC,GAAA,CAAA;gBACrDkB,wBAA0BnB,EAAAA,kBAAAA,CAAmBC,QAAQ,CAAC,GAAA,CAAA;gBACtDP,aAAeM,EAAAA,kBAAAA,CAAmBC,QAAQ,CAAC,CAAA,CAAA;gBAC3CmB,YAAcpB,EAAAA,kBAAAA,CAAmBC,QAAQ,CAAC,CAAA;AAC5C,aAAA;YACAnE,iBAAmB,EAAA;gBACjBuF,kBAAoB,EAAA,KAAA;gBACpBC,oBAAsB,EAAA,KAAA;gBACtBC,KAAO,EAAA,KAAA;gBACPC,eAAiB,EAAA,KAAA;gBACjBC,iBAAmB,EAAA,KAAA;gBACnBC,MAAQ,EAAA,KAAA;gBACRC,yBAA2B,EAAA,KAAA;gBAC3BC,2BAA6B,EAAA,KAAA;gBAC7BC,YAAc,EAAA,KAAA;gBACd7C,sBAAwB,EAAA;AAC1B;AACF,SAAA;AACF;AACF;;;;"}
1
+ {"version":3,"file":"joint_dynamics_system.js","sources":["../../../src/animation/joint_dynamics/joint_dynamics_system.ts"],"sourcesContent":["import type { DeepPartial } from '@zephyr3d/base';\r\nimport { InterpolatorScalar, Vector3 } from '@zephyr3d/base';\r\nimport { Quaternion } from '@zephyr3d/base';\r\nimport { SceneNode } from '../../scene/scene_node';\r\nimport type {\r\n ControllerConfig,\r\n JointDynamicsColliderSnapshot,\r\n JointDynamicsColliderHandle,\r\n JointDynamicsFlatPlaneSnapshot,\r\n JointDynamicsFlatPlaneHandle,\r\n JointDynamicsGrabberSnapshot,\r\n JointDynamicsGrabberHandle\r\n} from './controller';\r\nimport { JointDynamicsSystemController } from './controller';\r\nimport { ColliderForce, type BoneNode, type ColliderR, type GrabberR, type TransformAccess } from './types';\r\nimport type { SkeletonBindPose } from '../skeleton';\r\n\r\nconst _quat = new Quaternion();\r\n\r\nconst _defaultTA = createTransformAccess(new SceneNode(null), false);\r\n\r\n/**\r\n * Create a transform adapter that lets the joint dynamics solver read from and write to a SceneNode.\r\n *\r\n * @param obj - Scene node to expose through the TransformAccess interface.\r\n * @returns A TransformAccess wrapper backed by the supplied scene node.\r\n *\r\n * @public\r\n */\r\nexport function createTransformAccess(obj: SceneNode, exposeNode = true): TransformAccess {\r\n return {\r\n ...(exposeNode ? { node: obj } : {}),\r\n getWorldPosition(): Vector3 {\r\n return obj.getWorldPosition();\r\n },\r\n getWorldRotation(): Quaternion {\r\n const q = new Quaternion();\r\n obj.worldMatrix.decompose(null, q, null);\r\n return q;\r\n },\r\n getWorldScale(): Vector3 {\r\n const s = new Vector3();\r\n obj.worldMatrix.decompose(s, null, null);\r\n return s;\r\n },\r\n getLocalPosition(): Vector3 {\r\n return obj.position.clone();\r\n },\r\n getLocalRotation(): Quaternion {\r\n return obj.rotation.clone();\r\n },\r\n getLocalScale(): Vector3 {\r\n return obj.scale.clone();\r\n },\r\n setWorldPosition(p: Vector3): void {\r\n if (obj.parent) {\r\n obj.position = obj.parent.invWorldMatrix.transformPointAffine(p);\r\n } else {\r\n obj.position.set(p);\r\n }\r\n },\r\n setWorldRotation(q: Quaternion): void {\r\n // Convert world rotation to local space.\r\n if (obj.parent) {\r\n obj.parent.worldMatrix.decompose(null, _quat, null);\r\n Quaternion.multiply(Quaternion.inverse(_quat), q, obj.rotation);\r\n } else {\r\n obj.rotation.set(q);\r\n }\r\n },\r\n setLocalPosition(p: Vector3): void {\r\n obj.position.set(p);\r\n },\r\n setLocalRotation(q: Quaternion): void {\r\n obj.rotation.set(q);\r\n },\r\n setLocalScale(s: Vector3): void {\r\n obj.scale.set(s);\r\n }\r\n };\r\n}\r\n\r\nfunction createOffsetTransformAccess(\r\n obj: SceneNode,\r\n localOffset: Vector3,\r\n exposeNode = true\r\n): TransformAccess {\r\n const offset = localOffset.clone();\r\n return {\r\n ...(exposeNode ? { node: obj } : {}),\r\n getWorldPosition(): Vector3 {\r\n return obj.worldMatrix.transformPointAffine(offset);\r\n },\r\n getWorldRotation(): Quaternion {\r\n const q = new Quaternion();\r\n obj.worldMatrix.decompose(null, q, null);\r\n return q;\r\n },\r\n getWorldScale(): Vector3 {\r\n const s = new Vector3();\r\n obj.worldMatrix.decompose(s, null, null);\r\n return s;\r\n },\r\n getLocalPosition(): Vector3 {\r\n return obj.position.clone();\r\n },\r\n getLocalRotation(): Quaternion {\r\n return obj.rotation.clone();\r\n },\r\n getLocalScale(): Vector3 {\r\n return obj.scale.clone();\r\n },\r\n setWorldPosition(p: Vector3): void {\r\n if (obj.parent) {\r\n obj.position = obj.parent.invWorldMatrix.transformPointAffine(p);\r\n } else {\r\n obj.position.set(p);\r\n }\r\n },\r\n setWorldRotation(q: Quaternion): void {\r\n if (obj.parent) {\r\n obj.parent.worldMatrix.decompose(null, _quat, null);\r\n Quaternion.multiply(Quaternion.inverse(_quat), q, obj.rotation);\r\n } else {\r\n obj.rotation.set(q);\r\n }\r\n },\r\n setLocalPosition(p: Vector3): void {\r\n obj.position.set(p);\r\n },\r\n setLocalRotation(q: Quaternion): void {\r\n obj.rotation.set(q);\r\n },\r\n setLocalScale(s: Vector3): void {\r\n obj.scale.set(s);\r\n }\r\n };\r\n}\r\n\r\n/**\r\n * Describes the bone chains simulated by a JointDynamicsSystem.\r\n *\r\n * Each chain is defined by an inclusive start and end node. The end node must be\r\n * a descendant of the start node.\r\n *\r\n * @public\r\n */\r\nexport type JointChainConfig = {\r\n /** Root transform used for root motion compensation. */\r\n systemRoot: SceneNode;\r\n /** Bone chains to simulate. */\r\n chains: {\r\n start: SceneNode;\r\n end: SceneNode;\r\n startAnchor?: SceneNode;\r\n endAnchor?: SceneNode;\r\n startAnchorOffset?: Vector3;\r\n endAnchorOffset?: Vector3;\r\n }[];\r\n};\r\n\r\n/**\r\n * Configuration used to construct a JointDynamicsSystem.\r\n *\r\n * @public\r\n */\r\nexport type JointDynamicSystemConfig = {\r\n /** Bone chain topology and root transform. */\r\n chainConfig: JointChainConfig;\r\n /** Optional controller configuration overrides. */\r\n controllerConfig?: DeepPartial<ControllerConfig, 2>;\r\n};\r\n\r\n/**\r\n * Physics system for spring-like joint dynamics on scene node bone chains.\r\n *\r\n * The system builds particles and constraints from one or more bone chains,\r\n * advances them with Verlet integration, solves constraints and collisions, and\r\n * writes the resulting positions and rotations back to the scene graph.\r\n *\r\n * @public\r\n */\r\nexport class JointDynamicsSystem {\r\n private _controller: JointDynamicsSystemController;\r\n private _chainConfig: JointChainConfig;\r\n private _bindPose: WeakMap<SceneNode, SkeletonBindPose>;\r\n /**\r\n * Create a joint dynamics system for one or more bone chains.\r\n *\r\n * @param config - Bone chain topology and controller configuration.\r\n * @param colliders - Optional colliders to register during initialization.\r\n * @param grabbers - Optional grabbers to register during initialization.\r\n * @param flatPlanes - Optional world-space planes that dynamic points cannot cross.\r\n */\r\n constructor(\r\n config: JointDynamicSystemConfig,\r\n colliders: { r: ColliderR; transform: TransformAccess }[] = [],\r\n grabbers: {\r\n r: GrabberR;\r\n transform: TransformAccess;\r\n enabled: boolean;\r\n }[] = [],\r\n flatPlanes: { up: Vector3; position: Vector3 }[] = []\r\n ) {\r\n this._chainConfig = {\r\n systemRoot: config.chainConfig.systemRoot,\r\n chains: config.chainConfig.chains.map((chain) => ({\r\n start: chain.start,\r\n end: chain.end,\r\n startAnchor: chain.startAnchor,\r\n endAnchor: chain.endAnchor,\r\n startAnchorOffset: chain.startAnchorOffset?.clone(),\r\n endAnchorOffset: chain.endAnchorOffset?.clone()\r\n }))\r\n };\r\n this._bindPose = new WeakMap();\r\n const rootPoints: BoneNode[] = [];\r\n const boneNodes: BoneNode[] = [];\r\n const boneToNode = new Map<BoneNode, SceneNode>();\r\n const pointTransforms: TransformAccess[] = [];\r\n const pointSourceTransforms = new Map<BoneNode, TransformAccess>();\r\n const nodeToBone = new Map<SceneNode, BoneNode>();\r\n const nodeToDepth = new Map<SceneNode, number>();\r\n for (const chain of config.chainConfig.chains) {\r\n const chainNodes = this.collectChainNodes(chain.start, chain.end);\r\n let previous: BoneNode | null = null;\r\n for (let i = 0; i < chainNodes.length; i++) {\r\n const node = chainNodes[i];\r\n const isChainStart = i === 0;\r\n const isChainEnd = i === chainNodes.length - 1;\r\n const sourceNode =\r\n (isChainStart ? chain.startAnchor : null) ?? (isChainEnd ? chain.endAnchor : null) ?? node;\r\n const sourceOffset =\r\n (isChainStart ? chain.startAnchorOffset : null) ??\r\n (isChainEnd ? chain.endAnchorOffset : null) ??\r\n null;\r\n let boneNode = nodeToBone.get(node);\r\n if (!boneNode) {\r\n this._bindPose.set(node, {\r\n position: node.position.clone(),\r\n rotation: node.rotation.clone(),\r\n scale: node.scale.clone()\r\n });\r\n boneNode = {\r\n index: boneNodes.length,\r\n position: node.getWorldPosition(),\r\n children: [],\r\n isFixed: isChainStart || !!(isChainEnd && chain.endAnchor),\r\n depth: i\r\n };\r\n nodeToBone.set(node, boneNode);\r\n nodeToDepth.set(node, i);\r\n boneNodes.push(boneNode);\r\n boneToNode.set(boneNode, node);\r\n pointSourceTransforms.set(\r\n boneNode,\r\n sourceOffset\r\n ? createOffsetTransformAccess(sourceNode, sourceOffset)\r\n : createTransformAccess(sourceNode)\r\n );\r\n } else {\r\n const depth = nodeToDepth.get(node) ?? boneNode.depth;\r\n if (i < depth) {\r\n boneNode.depth = i;\r\n nodeToDepth.set(node, i);\r\n }\r\n boneNode.isFixed = boneNode.isFixed || isChainStart || !!(isChainEnd && chain.endAnchor);\r\n const existingSource =\r\n pointSourceTransforms.get(boneNode)?.node ?? boneToNode.get(boneNode) ?? null;\r\n if (existingSource && existingSource !== sourceNode) {\r\n throw new Error(\r\n `Conflicting anchor assignment for joint dynamics node '${node.name || node.persistentId}'.`\r\n );\r\n }\r\n if (!existingSource) {\r\n pointSourceTransforms.set(\r\n boneNode,\r\n sourceOffset\r\n ? createOffsetTransformAccess(sourceNode, sourceOffset)\r\n : createTransformAccess(sourceNode)\r\n );\r\n }\r\n }\r\n if (previous && !previous.children.includes(boneNode)) {\r\n previous.children.push(boneNode);\r\n const rootIndex = rootPoints.indexOf(boneNode);\r\n if (rootIndex !== -1) {\r\n rootPoints.splice(rootIndex, 1);\r\n }\r\n } else if (!previous && !rootPoints.includes(boneNode)) {\r\n rootPoints.push(boneNode);\r\n }\r\n previous = boneNode;\r\n }\r\n }\r\n const orderedBoneNodes: BoneNode[] = [];\r\n const visitedBoneNodes = new Set<BoneNode>();\r\n const orderBoneNode = (boneNode: BoneNode) => {\r\n if (visitedBoneNodes.has(boneNode)) {\r\n return;\r\n }\r\n visitedBoneNodes.add(boneNode);\r\n boneNode.index = orderedBoneNodes.length;\r\n orderedBoneNodes.push(boneNode);\r\n for (const child of boneNode.children) {\r\n orderBoneNode(child);\r\n }\r\n };\r\n for (const root of rootPoints) {\r\n orderBoneNode(root);\r\n }\r\n boneNodes.length = 0;\r\n boneNodes.push(...orderedBoneNodes);\r\n pointTransforms.push(...boneNodes.map((boneNode) => createTransformAccess(boneToNode.get(boneNode)!)));\r\n const pointInputTransforms = boneNodes.map(\r\n (boneNode) => pointSourceTransforms.get(boneNode) ?? createTransformAccess(boneToNode.get(boneNode)!)\r\n );\r\n const systemRoot = createTransformAccess(config.chainConfig.systemRoot);\r\n const defaultConfig = this.getDefaultControllerConfig();\r\n const controllerConfig: ControllerConfig = {\r\n ...defaultConfig,\r\n ...config?.controllerConfig,\r\n angleLimitConfig: { ...defaultConfig.angleLimitConfig, ...config?.controllerConfig?.angleLimitConfig },\r\n curves: { ...defaultConfig.curves, ...config?.controllerConfig?.curves },\r\n constraintOptions: {\r\n ...defaultConfig.constraintOptions,\r\n ...config?.controllerConfig?.constraintOptions\r\n }\r\n };\r\n this._controller = new JointDynamicsSystemController(controllerConfig);\r\n this._controller.initialize(\r\n systemRoot,\r\n rootPoints,\r\n pointTransforms,\r\n pointInputTransforms,\r\n colliders,\r\n grabbers,\r\n flatPlanes\r\n );\r\n }\r\n\r\n /**\r\n * Get the low-level controller that owns simulation state and advanced runtime controls.\r\n *\r\n * Most callers should prefer the convenience methods on JointDynamicsSystem.\r\n *\r\n * @returns The underlying joint dynamics controller.\r\n */\r\n get controller(): JointDynamicsSystemController {\r\n return this._controller;\r\n }\r\n\r\n /**\r\n * Get the node chain topology used to construct this system.\r\n */\r\n get chainConfig(): JointChainConfig {\r\n return {\r\n systemRoot: this._chainConfig.systemRoot,\r\n chains: this._chainConfig.chains.map((chain) => ({\r\n start: chain.start,\r\n end: chain.end,\r\n startAnchor: chain.startAnchor,\r\n endAnchor: chain.endAnchor,\r\n startAnchorOffset: chain.startAnchorOffset?.clone(),\r\n endAnchorOffset: chain.endAnchorOffset?.clone()\r\n }))\r\n };\r\n }\r\n\r\n /**\r\n * Returns detached collider snapshots for serialization.\r\n */\r\n getColliderSnapshots(): JointDynamicsColliderSnapshot[] {\r\n return this._controller.getColliderSnapshots();\r\n }\r\n\r\n /**\r\n * Returns detached flat-plane snapshots for serialization.\r\n */\r\n getFlatPlaneSnapshots(): JointDynamicsFlatPlaneSnapshot[] {\r\n return this._controller.getFlatPlaneSnapshots();\r\n }\r\n\r\n /**\r\n * Returns detached grabber snapshots for serialization.\r\n */\r\n getGrabberSnapshots(): JointDynamicsGrabberSnapshot[] {\r\n return this._controller.getGrabberSnapshots();\r\n }\r\n\r\n /**\r\n * Reset chain nodes to bind pose\r\n */\r\n resetChains() {\r\n for (const chain of this._chainConfig.chains) {\r\n const chainNodes = this.collectChainNodes(chain.start, chain.end);\r\n for (const node of chainNodes) {\r\n const bindPose = this._bindPose.get(node);\r\n if (bindPose) {\r\n node.position = bindPose.position;\r\n node.rotation = bindPose.rotation;\r\n node.scale = bindPose.scale;\r\n }\r\n }\r\n }\r\n }\r\n /**\r\n * Add a fully configured collider at runtime.\r\n *\r\n * The collider transform is read from the supplied scene node every simula ; ion step.\r\n * If no transform is supplied, the collider is created at the identity transform.\r\n *\r\n * @param r - Read-only collider parameters.\r\n * @param transform - Optional scene node that drives the collider transform.\r\n * @returns A stable handle that remains valid until this collider is removed.\r\n */\r\n addCollider(r: ColliderR, transform?: SceneNode): JointDynamicsColliderHandle {\r\n return this._controller.addCollider(r, transform ? createTransformAccess(transform) : _defaultTA);\r\n }\r\n\r\n /**\r\n * Add a spherical collider at runtime.\r\n *\r\n * The collider transform is read from the supplied scene node every simulation step.\r\n * If no transform is supplied, the collider is created at the identity transform.\r\n *\r\n * @param radius - Sphere radius in world units before transform scaling.\r\n * @param transform - Optional scene node that drives the collider transform.\r\n * @param friction - Contact friction coefficient applied by this collider. Defaults to 0.\r\n * @param inversed - If true, points are constrained inside the sphere instead of pushed out.\r\n * @returns A stable handle that remains valid until this collider is removed.\r\n */\r\n addSphereCollider(\r\n radius: number,\r\n transform?: SceneNode,\r\n friction?: number,\r\n inversed?: boolean\r\n ): JointDynamicsColliderHandle {\r\n return this.addCollider(\r\n {\r\n forceType: ColliderForce.Off,\r\n friction: friction ?? 0,\r\n height: 0,\r\n isInverseCollider: inversed ?? false,\r\n radius,\r\n radiusTailScale: 1\r\n },\r\n transform\r\n );\r\n }\r\n\r\n /**\r\n * Add a capsule collider at runtime.\r\n *\r\n * The capsule is aligned to the collider transform's local Y axis. Its head radius is\r\n * `radius`, its tail radius is `radius * radiusTailScale`, and `height` defines the\r\n * distance between the capsule ends before transform scaling.\r\n *\r\n * @param radius - Capsule head radius in world units before transform scaling.\r\n * @param height - Capsule length in world units before transform scaling.\r\n * @param transform - Optional scene node that drives the collider transform.\r\n * @param radiusTailScale - Tail radius multiplier relative to the head radius. Defaults to 1.\r\n * @param friction - Contact friction coefficient applied by this collider. Defaults to 0.\r\n * @param inversed - If true, points are constrained inside the capsule instead of pushed out.\r\n * @returns A stable handle that remains valid until this collider is removed.\r\n */\r\n addCapsuleCollider(\r\n radius: number,\r\n height: number,\r\n transform?: SceneNode,\r\n radiusTailScale?: number,\r\n friction?: number,\r\n inversed?: boolean\r\n ): JointDynamicsColliderHandle {\r\n return this.addCollider(\r\n {\r\n forceType: ColliderForce.Off,\r\n friction: friction ?? 0,\r\n height,\r\n isInverseCollider: inversed ?? false,\r\n radius,\r\n radiusTailScale: radiusTailScale ?? 1\r\n },\r\n transform\r\n );\r\n }\r\n\r\n /** Add an oriented box collider driven by a scene node transform. */\r\n addBoxCollider(\r\n halfExtents: Vector3,\r\n transform?: SceneNode,\r\n friction?: number,\r\n inversed?: boolean\r\n ): JointDynamicsColliderHandle {\r\n return this.addCollider(\r\n {\r\n boxHalfExtents: halfExtents.clone(),\r\n forceType: ColliderForce.Off,\r\n friction: friction ?? 0,\r\n height: 0,\r\n isInverseCollider: inversed ?? false,\r\n radius: halfExtents.magnitude,\r\n radiusTailScale: 1\r\n },\r\n transform\r\n );\r\n }\r\n\r\n /**\r\n * Enable or disable a collider by stable handle.\r\n *\r\n * Disabled colliders remain registered but are ignored by simulation until re-enabled.\r\n *\r\n * @param handle - Collider handle returned by addCollider, addSphereCollider, or addCapsuleCollider.\r\n * @param enabled - Whether the collider should participate in simulation.\r\n * @returns true if the handle is valid and the enabled state was updated.\r\n */\r\n setColliderEnabled(handle: JointDynamicsColliderHandle, enabled: boolean): boolean {\r\n return this._controller.setColliderEnabled(handle, enabled);\r\n }\r\n\r\n /**\r\n * Remove a collider by stable handle.\r\n *\r\n * @param handle - Collider handle returned by addCollider, addSphereCollider, or addCapsuleCollider.\r\n * @returns true if the collider existed and was removed.\r\n */\r\n removeCollider(handle: JointDynamicsColliderHandle): boolean {\r\n return this._controller.removeCollider(handle);\r\n }\r\n\r\n /**\r\n * Remove a collider by current array index.\r\n *\r\n * Prefer removeCollider(handle) for runtime-owned colliders.\r\n *\r\n * @param index - Current collider array index.\r\n * @returns true if the collider existed and was removed.\r\n */\r\n removeColliderAt(index: number): boolean {\r\n return this._controller.removeColliderAt(index);\r\n }\r\n\r\n /**\r\n * Add a flat plane collider at runtime.\r\n *\r\n * Flat planes are infinite world-space planes. The normal points toward the allowed side,\r\n * and dynamic points are pushed back when they move behind the plane.\r\n *\r\n * @param up - Plane normal in world space.\r\n * @param position - A point on the plane in world space.\r\n * @returns A stable handle that remains valid until this flat plane is removed.\r\n */\r\n addFlatPlane(up: Vector3, position: Vector3): JointDynamicsFlatPlaneHandle {\r\n return this._controller.addFlatPlane(up, position);\r\n }\r\n\r\n /**\r\n * Enable or disable a flat plane by stable handle.\r\n *\r\n * Disabled flat planes remain registered but are ignored by simulation until re-enabled.\r\n *\r\n * @param handle - Flat plane handle returned by addFlatPlane.\r\n * @param enabled - Whether the flat plane should participate in simulation.\r\n * @returns true if the handle is valid and the enabled state was updated.\r\n */\r\n setFlatPlaneEnabled(handle: JointDynamicsFlatPlaneHandle, enabled: boolean): boolean {\r\n return this._controller.setFlatPlaneEnabled(handle, enabled);\r\n }\r\n\r\n /**\r\n * Remove a flat plane by stable handle.\r\n *\r\n * @param handle - Flat plane handle returned by addFlatPlane.\r\n * @returns true if the flat plane existed and was removed.\r\n */\r\n removeFlatPlane(handle: JointDynamicsFlatPlaneHandle): boolean {\r\n return this._controller.removeFlatPlane(handle);\r\n }\r\n\r\n /**\r\n * Remove a flat plane by current array index.\r\n * Prefer removeFlatPlane(handle) for runtime-owned flat planes.\r\n *\r\n * @param index - Current flat plane array index.\r\n * @returns true if the flat plane existed and was removed.\r\n */\r\n removeFlatPlaneAt(index: number): boolean {\r\n return this._controller.removeFlatPlaneAt(index);\r\n }\r\n\r\n /**\r\n * Add a grabber at runtime.\r\n *\r\n * The grabber transform is read from the supplied scene node every simulation step.\r\n * If no transform is supplied, the grabber is created at the identity transform.\r\n *\r\n * @param r - Read-only grabber parameters.\r\n * @param transform - Optional scene node that drives the grabber transform.\r\n * @returns A stable handle that remains valid until this grabber is removed.\r\n */\r\n addGrabber(r: GrabberR, transform?: SceneNode): JointDynamicsGrabberHandle {\r\n return this._controller.addGrabber(r, transform ? createTransformAccess(transform) : _defaultTA, false);\r\n }\r\n\r\n /**\r\n * Enable or disable a grabber by stable handle.\r\n *\r\n * Disabling a grabber also releases any points currently held by it.\r\n *\r\n * @param handle - Grabber handle returned by addGrabber.\r\n * @param enabled - Whether the grabber should participate in simulation.\r\n * @returns true if the handle is valid and the enabled state was updated.\r\n */\r\n setGrabberEnabled(handle: JointDynamicsGrabberHandle, enabled: boolean): boolean {\r\n return this._controller.setGrabberEnabled(handle, enabled);\r\n }\r\n\r\n /**\r\n * Remove a grabber by stable handle.\r\n *\r\n * @param handle - Grabber handle returned by addGrabber.\r\n * @returns true if the grabber existed and was removed.\r\n */\r\n removeGrabber(handle: JointDynamicsGrabberHandle): boolean {\r\n return this._controller.removeGrabber(handle);\r\n }\r\n\r\n /**\r\n * Remove a grabber by current array index.\r\n *\r\n * Prefer removeGrabber(handle) for runtime-owned grabbers.\r\n *\r\n * @param index - Current grabber array index.\r\n * @returns true if the grabber existed and was removed.\r\n */\r\n removeGrabberAt(index: number): boolean {\r\n return this._controller.removeGrabberAt(index);\r\n }\r\n\r\n private collectChainNodes(start: SceneNode, end: SceneNode): SceneNode[] {\r\n if (!start.isParentOf(end)) {\r\n throw new Error('Invalid chain: end node must be a descendant of start node');\r\n }\r\n const nodes: SceneNode[] = [];\r\n let current: SceneNode = end;\r\n for (;;) {\r\n nodes.unshift(current);\r\n if (current === start) {\r\n break;\r\n }\r\n current = current.parent!;\r\n }\r\n return nodes;\r\n }\r\n /**\r\n * Advance the physics simulation and write the resulting transforms back to the chain nodes.\r\n *\r\n * @param deltaTime - Frame time step in seconds. Values larger than 0.033 are clamped for stability.\r\n */\r\n update(deltaTime: number): void {\r\n const dt = Math.min(deltaTime, 0.033); // Max 30 FPS\r\n this._controller.step(dt);\r\n }\r\n /** @internal */\r\n private getDefaultControllerConfig(): ControllerConfig {\r\n return {\r\n gravity: new Vector3(0, -9.8, 0),\r\n relaxation: 3,\r\n subSteps: 3,\r\n enableSurfaceCollision: false,\r\n windForce: Vector3.zero(),\r\n rootSlideLimit: -1,\r\n rootRotateLimit: -1,\r\n constraintShrinkLimit: 1,\r\n blendRatio: 0,\r\n stabilizationFrameRate: 60,\r\n isFakeWave: false,\r\n fakeWaveSpeed: 0,\r\n fakeWavePower: 0,\r\n angleLimitConfig: { angleLimit: -1, limitFromRoot: false },\r\n enableBroadPhase: false,\r\n preserveTwist: true,\r\n curves: {\r\n gravityScale: InterpolatorScalar.constant(1),\r\n windForceScale: InterpolatorScalar.constant(1),\r\n massScale: InterpolatorScalar.constant(1),\r\n resistance: InterpolatorScalar.constant(0.95),\r\n hardness: InterpolatorScalar.constant(0.001),\r\n friction: InterpolatorScalar.constant(0.5),\r\n pointRadius: InterpolatorScalar.constant(0.05),\r\n sliderJointLength: InterpolatorScalar.constant(0),\r\n allShrinkScale: InterpolatorScalar.constant(1),\r\n allStretchScale: InterpolatorScalar.constant(1),\r\n structuralShrinkVertical: InterpolatorScalar.constant(1),\r\n structuralStretchVertical: InterpolatorScalar.constant(1),\r\n structuralShrinkHorizontal: InterpolatorScalar.constant(0.5),\r\n structuralStretchHorizontal: InterpolatorScalar.constant(0.5),\r\n shearShrink: InterpolatorScalar.constant(0.5),\r\n shearStretch: InterpolatorScalar.constant(0.5),\r\n bendingShrinkVertical: InterpolatorScalar.constant(0.5),\r\n bendingStretchVertical: InterpolatorScalar.constant(0.5),\r\n bendingShrinkHorizontal: InterpolatorScalar.constant(0.5),\r\n bendingStretchHorizontal: InterpolatorScalar.constant(0.5),\r\n fakeWavePower: InterpolatorScalar.constant(0),\r\n fakeWaveFreq: InterpolatorScalar.constant(0)\r\n },\r\n constraintOptions: {\r\n structuralVertical: false,\r\n structuralHorizontal: false,\r\n shear: false,\r\n bendingVertical: false,\r\n bendingHorizontal: false,\r\n isLoop: false,\r\n collideStructuralVertical: false,\r\n collideStructuralHorizontal: false,\r\n collideShear: false,\r\n enableSurfaceCollision: false\r\n }\r\n };\r\n }\r\n}\r\n"],"names":["_quat","Quaternion","_defaultTA","createTransformAccess","SceneNode","obj","exposeNode","node","getWorldPosition","getWorldRotation","q","worldMatrix","decompose","getWorldScale","s","Vector3","getLocalPosition","position","clone","getLocalRotation","rotation","getLocalScale","scale","setWorldPosition","p","parent","invWorldMatrix","transformPointAffine","set","setWorldRotation","multiply","inverse","setLocalPosition","setLocalRotation","setLocalScale","createOffsetTransformAccess","localOffset","offset","JointDynamicsSystem","_controller","_chainConfig","_bindPose","config","colliders","grabbers","flatPlanes","systemRoot","chainConfig","chains","map","chain","start","end","startAnchor","endAnchor","startAnchorOffset","endAnchorOffset","WeakMap","rootPoints","boneNodes","boneToNode","Map","pointTransforms","pointSourceTransforms","nodeToBone","nodeToDepth","chainNodes","collectChainNodes","previous","i","length","isChainStart","isChainEnd","sourceNode","sourceOffset","boneNode","get","index","children","isFixed","depth","push","existingSource","Error","name","persistentId","includes","rootIndex","indexOf","splice","orderedBoneNodes","visitedBoneNodes","Set","orderBoneNode","has","add","child","root","pointInputTransforms","defaultConfig","getDefaultControllerConfig","controllerConfig","angleLimitConfig","curves","constraintOptions","JointDynamicsSystemController","initialize","controller","getColliderSnapshots","getFlatPlaneSnapshots","getGrabberSnapshots","resetChains","bindPose","addCollider","r","transform","addSphereCollider","radius","friction","inversed","forceType","ColliderForce","Off","height","isInverseCollider","radiusTailScale","addCapsuleCollider","addBoxCollider","halfExtents","boxHalfExtents","magnitude","setColliderEnabled","handle","enabled","removeCollider","removeColliderAt","addFlatPlane","up","setFlatPlaneEnabled","removeFlatPlane","removeFlatPlaneAt","addGrabber","setGrabberEnabled","removeGrabber","removeGrabberAt","isParentOf","nodes","current","unshift","update","deltaTime","dt","Math","min","step","gravity","relaxation","subSteps","enableSurfaceCollision","windForce","zero","rootSlideLimit","rootRotateLimit","constraintShrinkLimit","blendRatio","stabilizationFrameRate","isFakeWave","fakeWaveSpeed","fakeWavePower","angleLimit","limitFromRoot","enableBroadPhase","preserveTwist","gravityScale","InterpolatorScalar","constant","windForceScale","massScale","resistance","hardness","pointRadius","sliderJointLength","allShrinkScale","allStretchScale","structuralShrinkVertical","structuralStretchVertical","structuralShrinkHorizontal","structuralStretchHorizontal","shearShrink","shearStretch","bendingShrinkVertical","bendingStretchVertical","bendingShrinkHorizontal","bendingStretchHorizontal","fakeWaveFreq","structuralVertical","structuralHorizontal","shear","bendingVertical","bendingHorizontal","isLoop","collideStructuralVertical","collideStructuralHorizontal","collideShear"],"mappings":"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"}
@@ -1,6 +1,6 @@
1
1
  import { Vector3, Quaternion, degree2radian, clamp01, smoothStep, Matrix4x4, radian2degree } from '@zephyr3d/base';
2
2
  import { EPSILON, ConstraintType } from './types.js';
3
- import { pushoutFromSphere, pushoutFromCapsule, checkSurfaceCollision, pushInFromCapsule, pushInFromSphere, collisionDetection } from './collision.js';
3
+ import { pushoutFromCollider, checkSurfaceCollision, pushInFromCollider, collisionDetection } from './collision.js';
4
4
 
5
5
  // Core simulation ported from JobExecuteSimulation in SPCRJointDynamicsJob.cs.
6
6
  const AXIS_Y = new Vector3(0, 1, 0);
@@ -103,6 +103,20 @@ function colliderUpdate(collidersR, collidersRW, stepDelta) {
103
103
  colRW.height = colR.height * worldScaleUniform;
104
104
  Vector3.lerp(colRW.positionPreviousTransform, colRW.positionCurrentTransform, stepDelta, curPos);
105
105
  Quaternion.slerp(colRW.directionPreviousTransform, colRW.directionCurrentTransform, stepDelta, curDir);
106
+ if (colR.boxHalfExtents) {
107
+ colRW.positionCurrent.set(curPos);
108
+ colRW.directionCurrent.setXYZ(0, 0, 0);
109
+ colRW.boxHalfExtents.setXYZ(Math.abs(colR.boxHalfExtents.x * ws.x), Math.abs(colR.boxHalfExtents.y * ws.y), Math.abs(colR.boxHalfExtents.z * ws.z));
110
+ curDir.transform(Vector3.axisPX(), colRW.boxAxes[0]);
111
+ curDir.transform(Vector3.axisPY(), colRW.boxAxes[1]);
112
+ curDir.transform(Vector3.axisPZ(), colRW.boxAxes[2]);
113
+ colRW.boxAxes[0].inplaceNormalize();
114
+ colRW.boxAxes[1].inplaceNormalize();
115
+ colRW.boxAxes[2].inplaceNormalize();
116
+ colRW.boundsCenter.set(curPos);
117
+ colRW.boundsRadius = colRW.boxHalfExtents.magnitude;
118
+ continue;
119
+ }
106
120
  computeCapsule(curPos, curDir, colRW.height, colRW.positionCurrent, colRW.directionCurrent);
107
121
  if (colRW.height > EPSILON) {
108
122
  Vector3.scale(colRW.directionCurrent, 0.5, _computeCapsuleHalfDir);
@@ -213,7 +227,7 @@ function pointUpdatePass1(pointsR, pointsRW, stepDelta, stepTime_x2_half, rootSl
213
227
  if (colRWci.enabled === 0 || colRci.isInverseCollider) {
214
228
  continue;
215
229
  }
216
- const hRes = colRci.height <= EPSILON ? pushoutFromSphere(colRWci.positionCurrent, colRWci.radius, ptR.pointRadius, ptRW.positionCurrent) : pushoutFromCapsule(colRci, colRWci, ptRW.positionCurrent, ptR);
230
+ const hRes = pushoutFromCollider(colRci, colRWci, ptRW.positionCurrent, ptR);
217
231
  if (hRes.hit) {
218
232
  ptRW.positionCurrent.set(hRes.point);
219
233
  }
@@ -353,7 +367,7 @@ const _fixedPushResult = {
353
367
  if (colRW.enabled === 0 || colR.isInverseCollider) {
354
368
  continue;
355
369
  }
356
- const res = colR.height <= EPSILON ? pushoutFromSphere(colRW.positionCurrent, colRW.radius, ptR.pointRadius, ptRW.positionCurrent, _fixedPushResult) : pushoutFromCapsule(colR, colRW, ptRW.positionCurrent, ptR, _fixedPushResult);
370
+ const res = pushoutFromCollider(colR, colRW, ptRW.positionCurrent, ptR, _fixedPushResult);
357
371
  if (res.hit) {
358
372
  ptRW.positionCurrent.set(res.point);
359
373
  }
@@ -379,7 +393,31 @@ const _fixedPushResult = {
379
393
  continue;
380
394
  }
381
395
  let nx = 0, ny = 0, nz = 0;
382
- if (colR.height <= EPSILON) {
396
+ if (colR.boxHalfExtents) {
397
+ const delta = Vector3.sub(ptRW.positionCurrent, colRW.positionCurrent, new Vector3());
398
+ nx = Vector3.dot(delta, colRW.boxAxes[0]);
399
+ ny = Vector3.dot(delta, colRW.boxAxes[1]);
400
+ nz = Vector3.dot(delta, colRW.boxAxes[2]);
401
+ const ax = Math.abs(nx) / Math.max(EPSILON, colRW.boxHalfExtents.x);
402
+ const ay = Math.abs(ny) / Math.max(EPSILON, colRW.boxHalfExtents.y);
403
+ const az = Math.abs(nz) / Math.max(EPSILON, colRW.boxHalfExtents.z);
404
+ if (ay > ax && ay >= az) {
405
+ const sign = ny < 0 ? -1 : 1;
406
+ nx = colRW.boxAxes[1].x * sign;
407
+ ny = colRW.boxAxes[1].y * sign;
408
+ nz = colRW.boxAxes[1].z * sign;
409
+ } else if (az > ax && az > ay) {
410
+ const sign = nz < 0 ? -1 : 1;
411
+ nx = colRW.boxAxes[2].x * sign;
412
+ ny = colRW.boxAxes[2].y * sign;
413
+ nz = colRW.boxAxes[2].z * sign;
414
+ } else {
415
+ const sign = nx < 0 ? -1 : 1;
416
+ nx = colRW.boxAxes[0].x * sign;
417
+ ny = colRW.boxAxes[0].y * sign;
418
+ nz = colRW.boxAxes[0].z * sign;
419
+ }
420
+ } else if (colR.height <= EPSILON) {
383
421
  nx = ptRW.positionCurrent.x - colRW.positionCurrent.x;
384
422
  ny = ptRW.positionCurrent.y - colRW.positionCurrent.y;
385
423
  nz = ptRW.positionCurrent.z - colRW.positionCurrent.z;
@@ -519,14 +557,14 @@ function constraintUpdate(pointsR, pointsRW, constraints, collidersR, collidersR
519
557
  if (colR.height > EPSILON) {
520
558
  if (colR.isInverseCollider) {
521
559
  if (ptRA.applyInvertCollision === 1 && canPointA) {
522
- const res = pushInFromCapsule(colR, colRW, rwA.positionCurrent, pointResultA);
560
+ const res = pushInFromCollider(colR, colRW, rwA.positionCurrent, pointResultA);
523
561
  if (res.hit) {
524
562
  rwA.positionCurrent.set(res.point);
525
563
  friction = Math.max(friction, colR.friction * 0.25);
526
564
  }
527
565
  }
528
566
  if (ptRB.applyInvertCollision === 1 && canPointB) {
529
- const res = pushInFromCapsule(colR, colRW, rwB.positionCurrent, pointResultB);
567
+ const res = pushInFromCollider(colR, colRW, rwB.positionCurrent, pointResultB);
530
568
  if (res.hit) {
531
569
  rwB.positionCurrent.set(res.point);
532
570
  friction = Math.max(friction, colR.friction * 0.25);
@@ -534,14 +572,14 @@ function constraintUpdate(pointsR, pointsRW, constraints, collidersR, collidersR
534
572
  }
535
573
  } else {
536
574
  if (canPointA) {
537
- const res = pushoutFromCapsule(colR, colRW, rwA.positionCurrent, ptRA, pointResultA);
575
+ const res = pushoutFromCollider(colR, colRW, rwA.positionCurrent, ptRA, pointResultA);
538
576
  if (res.hit) {
539
577
  rwA.positionCurrent.set(res.point);
540
578
  friction = Math.max(friction, colR.friction * 0.25);
541
579
  }
542
580
  }
543
581
  if (canPointB) {
544
- const res = pushoutFromCapsule(colR, colRW, rwB.positionCurrent, ptRB, pointResultB);
582
+ const res = pushoutFromCollider(colR, colRW, rwB.positionCurrent, ptRB, pointResultB);
545
583
  if (res.hit) {
546
584
  rwB.positionCurrent.set(res.point);
547
585
  friction = Math.max(friction, colR.friction * 0.25);
@@ -551,14 +589,14 @@ function constraintUpdate(pointsR, pointsRW, constraints, collidersR, collidersR
551
589
  } else {
552
590
  if (colR.isInverseCollider) {
553
591
  if (ptRA.applyInvertCollision === 1 && canPointA) {
554
- const res = pushInFromSphere(colRW.positionCurrent, colRW.radius, rwA.positionCurrent, pointResultA);
592
+ const res = pushInFromCollider(colR, colRW, rwA.positionCurrent, pointResultA);
555
593
  if (res.hit) {
556
594
  rwA.positionCurrent.set(res.point);
557
595
  friction = Math.max(friction, colR.friction * 0.25);
558
596
  }
559
597
  }
560
598
  if (ptRB.applyInvertCollision === 1 && canPointB) {
561
- const res = pushInFromSphere(colRW.positionCurrent, colRW.radius, rwB.positionCurrent, pointResultB);
599
+ const res = pushInFromCollider(colR, colRW, rwB.positionCurrent, pointResultB);
562
600
  if (res.hit) {
563
601
  rwB.positionCurrent.set(res.point);
564
602
  friction = Math.max(friction, colR.friction * 0.25);
@@ -566,14 +604,14 @@ function constraintUpdate(pointsR, pointsRW, constraints, collidersR, collidersR
566
604
  }
567
605
  } else {
568
606
  if (canPointA) {
569
- const res = pushoutFromSphere(colRW.positionCurrent, colRW.radius, ptRA.pointRadius, rwA.positionCurrent, pointResultA);
607
+ const res = pushoutFromCollider(colR, colRW, rwA.positionCurrent, ptRA, pointResultA);
570
608
  if (res.hit) {
571
609
  rwA.positionCurrent.set(res.point);
572
610
  friction = Math.max(friction, colR.friction * 0.25);
573
611
  }
574
612
  }
575
613
  if (canPointB) {
576
- const res = pushoutFromSphere(colRW.positionCurrent, colRW.radius, ptRB.pointRadius, rwB.positionCurrent, pointResultB);
614
+ const res = pushoutFromCollider(colR, colRW, rwB.positionCurrent, ptRB, pointResultB);
577
615
  if (res.hit) {
578
616
  rwB.positionCurrent.set(res.point);
579
617
  friction = Math.max(friction, colR.friction * 0.25);