@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":"spring_system.js","sources":["../../../src/animation/spring/spring_system.ts"],"sourcesContent":["import { Vector3, Quaternion } from '@zephyr3d/base';\r\nimport type { SpringChain } from './spring_chain';\r\nimport { IKUtils } from '../ik/ik_utils';\r\nimport type { SpringCollider } from './spring_collider';\r\nimport {\r\n resolveSphereCollision,\r\n resolveCapsuleCollision,\r\n resolvePlaneCollision,\r\n type CapsuleCollider,\r\n type PlaneCollider,\r\n type SphereCollider,\r\n updateColliderFromNode\r\n} from './spring_collider';\r\nimport { SpringNodePoseTracker } from './spring_node_pose_tracker';\r\n\r\n/**\r\n * Options for creating a SpringSystem\r\n *\r\n * @public\r\n */\r\nexport interface SpringSystemOptions {\r\n /** Number of constraint solver iterations (default: 5) */\r\n iterations?: number;\r\n /** Gravity force vector (default: (0, -9.8, 0)) */\r\n gravity?: Vector3;\r\n /** Wind force vector (default: (0, 0, 0)) */\r\n wind?: Vector3;\r\n /** Enable inertial forces (centrifugal/Coriolis) when root rotates (default: true) */\r\n enableInertialForces?: boolean;\r\n /** Centrifugal force multiplier (default: 1.0) */\r\n centrifugalScale?: number;\r\n /** Coriolis force multiplier (default: 1.0) */\r\n coriolisScale?: number;\r\n /**\r\n * Constraint solver type (default: 'verlet').\r\n * - 'verlet': Classic Verlet integration with iterative position correction.\r\n * stiffness [0-1] controls correction strength per iteration.\r\n * - 'xpbd': Extended Position-Based Dynamics (Müller et al. 2020).\r\n * Uses compliance (inverse stiffness in m/N) for physically correct,\r\n * iteration-count-independent constraint solving.\r\n */\r\n solver?: 'verlet' | 'xpbd';\r\n /**\r\n * How strongly particles are pulled toward current animated pose [0-1].\r\n * This preserves the authored hair shape while still allowing secondary motion.\r\n * Higher values keep the original hairstyle better.\r\n */\r\n poseFollow?: number;\r\n /**\r\n * Optional root-follow override [0-1].\r\n * If provided, pose follow is interpolated from root to tip.\r\n */\r\n poseFollowRoot?: number;\r\n /**\r\n * Optional tip-follow override [0-1].\r\n * If provided, pose follow is interpolated from root to tip.\r\n */\r\n poseFollowTip?: number;\r\n /**\r\n * Exponent used when interpolating root-to-tip follow.\r\n * `1` is linear; values `\\> 1` keep the root stiffer and the tip looser.\r\n */\r\n poseFollowExponent?: number;\r\n /**\r\n * Optional per-step limit for deviation from animated pose.\r\n * 0 disables clamping. Useful to prevent extreme stretch under high acceleration.\r\n */\r\n maxPoseOffset?: number;\r\n /**\r\n * Optional root max-offset override.\r\n * If provided, max offset is interpolated from root to tip.\r\n */\r\n maxPoseOffsetRoot?: number;\r\n /**\r\n * Optional tip max-offset override.\r\n * If provided, max offset is interpolated from root to tip.\r\n */\r\n maxPoseOffsetTip?: number;\r\n}\r\n\r\nconst FIXED_SIMULATION_TIME_STEP = 1 / 60;\r\nconst MAX_ACCUMULATED_SIMULATION_TIME = 1 / 20;\r\nconst MAX_SIMULATION_STEPS_PER_UPDATE = Math.max(\r\n 1,\r\n Math.ceil(MAX_ACCUMULATED_SIMULATION_TIME / FIXED_SIMULATION_TIME_STEP)\r\n);\r\nconst DEFAULT_PARTICLE_TARGET_SMOOTHING_TIME = 1 / 30;\r\nconst DEFAULT_COLLIDER_SMOOTHING_TIME = 1 / 30;\r\n\r\n/**\r\n * Physics engine for spring-based particle simulation\r\n * Uses Verlet integration and iterative constraint solving\r\n *\r\n * @public\r\n */\r\nexport class SpringSystem {\r\n private _chain: SpringChain;\r\n private _iterations: number;\r\n private _gravity: Vector3;\r\n private _wind: Vector3;\r\n private _enableInertialForces: boolean;\r\n private _centrifugalScale: number;\r\n private _coriolisScale: number;\r\n private _colliders: SpringCollider[];\r\n private _solver: 'verlet' | 'xpbd';\r\n private _poseFollow: number;\r\n private _maxPoseOffset: number;\r\n private _poseFollowRoot: number;\r\n private _poseFollowTip: number;\r\n private _poseFollowExponent: number;\r\n private _maxPoseOffsetRoot: number;\r\n private _maxPoseOffsetTip: number;\r\n private _timeAccumulator: number;\r\n private _smoothedParticleTargets: WeakMap<object, Vector3>;\r\n private _smoothedSphereCenters: WeakMap<SphereCollider, Vector3>;\r\n private _smoothedCapsuleEndpoints: WeakMap<CapsuleCollider, { start: Vector3; end: Vector3 }>;\r\n private _smoothedPlaneData: WeakMap<PlaneCollider, { point: Vector3; normal: Vector3 }>;\r\n private _nodePoseTracker: SpringNodePoseTracker;\r\n\r\n constructor(chain: SpringChain, options?: SpringSystemOptions) {\r\n this._chain = chain;\r\n this._iterations = options?.iterations ?? 5;\r\n this._gravity = options?.gravity?.clone() ?? new Vector3(0, -9.8, 0);\r\n this._wind = options?.wind?.clone() ?? new Vector3(0, 0, 0);\r\n this._enableInertialForces = options?.enableInertialForces ?? true;\r\n this._centrifugalScale = options?.centrifugalScale ?? 1.0;\r\n this._coriolisScale = options?.coriolisScale ?? 1.0;\r\n this._colliders = [];\r\n this._solver = options?.solver ?? 'verlet';\r\n this._poseFollow = Math.max(0, Math.min(1, options?.poseFollow ?? 0.35));\r\n this._maxPoseOffset = Math.max(0, options?.maxPoseOffset ?? 0);\r\n this._poseFollowRoot = Math.max(0, Math.min(1, options?.poseFollowRoot ?? this._poseFollow));\r\n this._poseFollowTip = Math.max(0, Math.min(1, options?.poseFollowTip ?? this._poseFollow));\r\n this._poseFollowExponent = Math.max(0.1, options?.poseFollowExponent ?? 1.6);\r\n this._maxPoseOffsetRoot = Math.max(0, options?.maxPoseOffsetRoot ?? this._maxPoseOffset);\r\n this._maxPoseOffsetTip = Math.max(0, options?.maxPoseOffsetTip ?? this._maxPoseOffset);\r\n this._timeAccumulator = 0;\r\n this._smoothedParticleTargets = new WeakMap();\r\n this._smoothedSphereCenters = new WeakMap();\r\n this._smoothedCapsuleEndpoints = new WeakMap();\r\n this._smoothedPlaneData = new WeakMap();\r\n this._nodePoseTracker = new SpringNodePoseTracker();\r\n }\r\n\r\n /**\r\n * Updates the physics simulation\r\n * @param deltaTime - Time step in seconds\r\n */\r\n update(deltaTime: number): void {\r\n this._nodePoseTracker.restoreInputPose();\r\n const frameDt = Math.min(Math.max(Number(deltaTime) || 0, 0), MAX_ACCUMULATED_SIMULATION_TIME);\r\n if (frameDt <= 0) {\r\n return;\r\n }\r\n this._timeAccumulator = Math.min(this._timeAccumulator + frameDt, MAX_ACCUMULATED_SIMULATION_TIME);\r\n const stepCount = Math.min(\r\n MAX_SIMULATION_STEPS_PER_UPDATE,\r\n Math.floor((this._timeAccumulator + 1e-8) / FIXED_SIMULATION_TIME_STEP)\r\n );\r\n if (stepCount <= 0) {\r\n return;\r\n }\r\n this._timeAccumulator = Math.max(0, this._timeAccumulator - stepCount * FIXED_SIMULATION_TIME_STEP);\r\n for (let i = 0; i < stepCount; i++) {\r\n this.simulateStep(FIXED_SIMULATION_TIME_STEP, i === 0 ? frameDt : 0);\r\n }\r\n }\r\n\r\n private simulateStep(dt: number, inputDeltaTime: number): void {\r\n // Step 1: Save all particle positions before updating\r\n if (this._enableInertialForces) {\r\n for (const p of this._chain.particles) {\r\n p.lastFramePosition.set(p.position);\r\n }\r\n }\r\n\r\n // Step 2: Update fixed particles from their scene nodes\r\n this.updateFixedParticles(inputDeltaTime);\r\n\r\n // Step 3: Calculate global rotation parameters\r\n let rotationCenter: Vector3 | null = null;\r\n let angularVelocity: Vector3 | null = null;\r\n\r\n if (this._enableInertialForces && dt > 0.0001) {\r\n const result = this.calculateGlobalRotation(dt);\r\n rotationCenter = result.center;\r\n angularVelocity = result.omega;\r\n }\r\n\r\n // Step 4: Verlet integration with inertial forces\r\n for (let i = 0; i < this._chain.particles.length; i++) {\r\n const p = this._chain.particles[i];\r\n if (p.fixed) {\r\n continue;\r\n }\r\n\r\n // Calculate velocity (implicit in Verlet)\r\n const velocity = Vector3.sub(p.position, p.prevPosition, new Vector3());\r\n velocity.scaleBy(p.damping);\r\n\r\n // Apply external forces (gravity + wind)\r\n const acceleration = Vector3.add(this._gravity, this._wind, new Vector3());\r\n\r\n // Apply inertial forces from rotating reference frame\r\n if (this._enableInertialForces && rotationCenter && angularVelocity) {\r\n const inertialAccel = this.calculateInertialAcceleration(\r\n p,\r\n rotationCenter,\r\n angularVelocity,\r\n velocity,\r\n this._centrifugalScale,\r\n this._coriolisScale\r\n );\r\n Vector3.add(acceleration, inertialAccel, acceleration);\r\n }\r\n\r\n const positionDelta = Vector3.scale(acceleration, dt * dt, new Vector3());\r\n Vector3.add(velocity, positionDelta, velocity);\r\n\r\n // Update position\r\n p.prevPosition.set(p.position);\r\n Vector3.add(p.position, velocity, p.position);\r\n }\r\n\r\n // Step 5: Iteratively solve constraints\r\n if (this._solver === 'xpbd') {\r\n // Reset Lagrange multipliers at the start of each time step\r\n for (const constraint of this._chain.constraints) {\r\n constraint.lambda = 0;\r\n }\r\n }\r\n for (let iter = 0; iter < this._iterations; iter++) {\r\n for (const constraint of this._chain.constraints) {\r\n if (this._solver === 'xpbd') {\r\n this.solveConstraintXPBD(constraint, dt);\r\n } else {\r\n this.solveConstraint(constraint);\r\n }\r\n }\r\n\r\n // Pull particles back toward the animated pose to preserve hair silhouette.\r\n // Normalize follow strength across solver iterations so tuning stays intuitive.\r\n this.solvePosePreservation(this._iterations);\r\n\r\n // Apply collision constraints\r\n this.solveCollisions(inputDeltaTime);\r\n }\r\n }\r\n\r\n /**\r\n * Updates fixed particles to match their scene node positions\r\n */\r\n private updateFixedParticles(deltaTime: number): void {\r\n const blend = this.getTemporalBlendFactor(deltaTime, DEFAULT_PARTICLE_TARGET_SMOOTHING_TIME);\r\n for (const particle of this._chain.particles) {\r\n const sourceNode = particle.anchorNode ?? particle.node;\r\n if (!sourceNode) {\r\n continue;\r\n }\r\n const worldPos = particle.anchorOffset\r\n ? sourceNode.worldMatrix.transformPointAffine(particle.anchorOffset)\r\n : new Vector3(sourceNode.worldMatrix.m03, sourceNode.worldMatrix.m13, sourceNode.worldMatrix.m23);\r\n const smoothedTarget = this.getSmoothedParticleTarget(particle, worldPos, blend);\r\n particle.animPosition.set(smoothedTarget);\r\n if (particle.fixed) {\r\n particle.position.set(smoothedTarget);\r\n particle.prevPosition.set(smoothedTarget);\r\n\r\n // Maintain position history for rotation center estimation\r\n if (this._enableInertialForces) {\r\n if (!particle.positionHistory) {\r\n particle.positionHistory = [];\r\n }\r\n particle.positionHistory.push(smoothedTarget.clone());\r\n // Keep only last 5 frames\r\n if (particle.positionHistory.length > 5) {\r\n particle.positionHistory.shift();\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Solves pose preservation (long-range attachment to animated pose).\r\n * This keeps strands close to authored shape while preserving dynamic movement.\r\n */\r\n private solvePosePreservation(totalIterations: number): void {\r\n if (this._poseFollowRoot <= 0 && this._poseFollowTip <= 0) {\r\n return;\r\n }\r\n\r\n const lastIndex = Math.max(1, this._chain.particles.length - 1);\r\n for (let i = 0; i < this._chain.particles.length; i++) {\r\n const particle = this._chain.particles[i];\r\n if (particle.fixed) {\r\n continue;\r\n }\r\n\r\n const t = Math.pow(i / lastIndex, this._poseFollowExponent);\r\n const particlePoseFollow = this.lerp(this._poseFollowRoot, this._poseFollowTip, t);\r\n // Convert user-facing per-frame follow into per-iteration follow:\r\n // effective = 1 - (1 - follow)^iterations\r\n const iterationFollow =\r\n totalIterations > 1\r\n ? 1 - Math.pow(Math.max(0, 1 - particlePoseFollow), 1 / totalIterations)\r\n : particlePoseFollow;\r\n const toAnim = Vector3.sub(particle.animPosition, particle.position, new Vector3());\r\n const correction = Vector3.scale(toAnim, iterationFollow, new Vector3());\r\n Vector3.add(particle.position, correction, particle.position);\r\n\r\n const particleMaxPoseOffset = this.lerp(this._maxPoseOffsetRoot, this._maxPoseOffsetTip, t);\r\n if (particleMaxPoseOffset > 0) {\r\n const offset = Vector3.sub(particle.position, particle.animPosition, new Vector3());\r\n const offsetLen = offset.magnitude;\r\n if (offsetLen > particleMaxPoseOffset && offsetLen > 1e-6) {\r\n offset.scaleBy(particleMaxPoseOffset / offsetLen);\r\n Vector3.add(particle.animPosition, offset, particle.position);\r\n }\r\n }\r\n }\r\n }\r\n\r\n private lerp(a: number, b: number, t: number): number {\r\n return a + (b - a) * t;\r\n }\r\n\r\n /**\r\n * Calculates global rotation parameters from fixed particle movements\r\n * Uses position history to estimate rotation center\r\n */\r\n private calculateGlobalRotation(dt: number): { center: Vector3; omega: Vector3 } {\r\n // Collect fixed particles with movement\r\n const fixedParticles: any[] = [];\r\n const velocities: Vector3[] = [];\r\n\r\n for (const p of this._chain.particles) {\r\n if (!p.fixed) {\r\n continue;\r\n }\r\n\r\n const velocity = Vector3.sub(p.position, p.lastFramePosition, new Vector3());\r\n velocity.scaleBy(1.0 / dt);\r\n\r\n if (velocity.magnitudeSq > 0.001) {\r\n fixedParticles.push(p);\r\n velocities.push(velocity);\r\n }\r\n }\r\n\r\n if (fixedParticles.length === 0) {\r\n return { center: new Vector3(0, 0, 0), omega: new Vector3(0, 0, 0) };\r\n }\r\n\r\n // Estimate rotation center using position history\r\n let center: Vector3;\r\n\r\n if (fixedParticles.length === 1) {\r\n // Single fixed particle: use position history to estimate rotation center\r\n center = this.estimateRotationCenterFromHistory(fixedParticles[0], velocities[0]);\r\n } else {\r\n // Multiple fixed particles: use their average position\r\n center = new Vector3(0, 0, 0);\r\n for (const p of fixedParticles) {\r\n Vector3.add(center, p.position, center);\r\n }\r\n center.scaleBy(1.0 / fixedParticles.length);\r\n }\r\n\r\n // Estimate angular velocity\r\n let sumOmega = new Vector3(0, 0, 0);\r\n let count = 0;\r\n\r\n for (let i = 0; i < fixedParticles.length; i++) {\r\n const r = Vector3.sub(fixedParticles[i].position, center, new Vector3());\r\n const v = velocities[i];\r\n const rLengthSq = r.magnitudeSq;\r\n\r\n if (rLengthSq > 0.0001) {\r\n // ω = (r × v) / |r|²\r\n const omega = Vector3.cross(r, v, new Vector3());\r\n omega.scaleBy(1.0 / rLengthSq);\r\n Vector3.add(sumOmega, omega, sumOmega);\r\n count++;\r\n }\r\n }\r\n\r\n if (count > 0) {\r\n sumOmega.scaleBy(1.0 / count);\r\n }\r\n\r\n return { center, omega: sumOmega };\r\n }\r\n\r\n /**\r\n * Estimates rotation center from a single particle's position history\r\n * Uses circular motion fitting\r\n */\r\n private estimateRotationCenterFromHistory(particle: any, currentVelocity: Vector3): Vector3 {\r\n const history = particle.positionHistory;\r\n if (!history || history.length < 3) {\r\n // Not enough history: estimate using velocity perpendicular direction\r\n // Assume rotation center is perpendicular to velocity\r\n // Use a default radius based on velocity magnitude\r\n const speed = currentVelocity.magnitude;\r\n if (speed < 0.001) {\r\n return particle.position.clone();\r\n }\r\n\r\n // Estimate radius: for typical character rotation, assume ~0.5-1.0m radius\r\n const estimatedRadius = Math.max(0.5, speed * 0.5);\r\n\r\n // Direction perpendicular to velocity (in the plane of motion)\r\n // We need to guess which perpendicular direction - use cross product with up vector\r\n const up = new Vector3(0, 1, 0);\r\n const perpDir = Vector3.cross(currentVelocity, up, new Vector3());\r\n\r\n if (perpDir.magnitudeSq < 0.0001) {\r\n // Velocity is vertical, use another perpendicular\r\n perpDir.set(new Vector3(1, 0, 0));\r\n } else {\r\n perpDir.inplaceNormalize();\r\n }\r\n\r\n // Rotation center is perpendicular to velocity\r\n const center = Vector3.add(\r\n particle.position,\r\n Vector3.scale(perpDir, estimatedRadius, new Vector3()),\r\n new Vector3()\r\n );\r\n return center;\r\n }\r\n\r\n // Fit a circle through the last 3 positions\r\n // Use positions at indices: 0 (oldest), middle, last (newest)\r\n const p1 = history[0];\r\n const p2 = history[Math.floor(history.length / 2)];\r\n const p3 = history[history.length - 1];\r\n\r\n // Calculate circle center from 3 points\r\n const center = this.calculateCircleCenter(p1, p2, p3);\r\n return center;\r\n }\r\n\r\n /**\r\n * Calculates the center of a circle passing through 3 points\r\n * Uses perpendicular bisector method\r\n */\r\n private calculateCircleCenter(p1: Vector3, p2: Vector3, p3: Vector3): Vector3 {\r\n // Midpoints\r\n const mid12 = Vector3.scale(Vector3.add(p1, p2, new Vector3()), 0.5, new Vector3());\r\n const mid23 = Vector3.scale(Vector3.add(p2, p3, new Vector3()), 0.5, new Vector3());\r\n\r\n // Direction vectors\r\n const dir12 = Vector3.sub(p2, p1, new Vector3());\r\n const dir23 = Vector3.sub(p3, p2, new Vector3());\r\n\r\n // Normal vectors (perpendicular bisectors)\r\n // For 3D, we need to find perpendiculars in the plane of the three points\r\n const normal = Vector3.cross(dir12, dir23, new Vector3());\r\n\r\n if (normal.magnitudeSq < 0.0001) {\r\n // Points are collinear, return midpoint\r\n return Vector3.scale(\r\n Vector3.add(Vector3.add(p1, p2, new Vector3()), p3, new Vector3()),\r\n 1.0 / 3.0,\r\n new Vector3()\r\n );\r\n }\r\n\r\n normal.inplaceNormalize();\r\n\r\n // Perpendicular to dir12 in the plane\r\n const perp12 = Vector3.cross(dir12, normal, new Vector3()).inplaceNormalize();\r\n\r\n // Perpendicular to dir23 in the plane\r\n const perp23 = Vector3.cross(dir23, normal, new Vector3()).inplaceNormalize();\r\n\r\n // Find intersection of two lines:\r\n // Line 1: mid12 + t * perp12\r\n // Line 2: mid23 + s * perp23\r\n // Solve: mid12 + t * perp12 = mid23 + s * perp23\r\n\r\n const diff = Vector3.sub(mid23, mid12, new Vector3());\r\n\r\n // Use 2D projection for simplicity (project onto plane perpendicular to normal)\r\n // Solve in the plane: t * perp12 - s * perp23 = diff\r\n // Use least squares or pick the dominant components\r\n\r\n const det = perp12.x * perp23.y - perp12.y * perp23.x;\r\n\r\n if (Math.abs(det) > 0.0001) {\r\n const t = (diff.x * perp23.y - diff.y * perp23.x) / det;\r\n const center = Vector3.add(mid12, Vector3.scale(perp12, t, new Vector3()), new Vector3());\r\n return center;\r\n }\r\n\r\n // Fallback: use centroid\r\n return Vector3.scale(\r\n Vector3.add(Vector3.add(p1, p2, new Vector3()), p3, new Vector3()),\r\n 1.0 / 3.0,\r\n new Vector3()\r\n );\r\n }\r\n\r\n /**\r\n * Calculates inertial acceleration for a particle in a rotating reference frame\r\n */\r\n private calculateInertialAcceleration(\r\n particle: any,\r\n rotationCenter: Vector3,\r\n angularVelocity: Vector3,\r\n particleVelocity: Vector3,\r\n centrifugalScale: number,\r\n coriolisScale: number\r\n ): Vector3 {\r\n // Vector from rotation center to particle\r\n const r = Vector3.sub(particle.position, rotationCenter, new Vector3());\r\n\r\n // Centrifugal acceleration: a_centrifugal = ω × (ω × r)\r\n const omegaCrossR = Vector3.cross(angularVelocity, r, new Vector3());\r\n const centrifugalAccel = Vector3.cross(angularVelocity, omegaCrossR, new Vector3());\r\n centrifugalAccel.scaleBy(centrifugalScale);\r\n\r\n // Coriolis acceleration: a_coriolis = -2ω × v_relative\r\n // v_relative is the particle's velocity in the rotating frame\r\n // Use the velocity passed in (already calculated from prevPosition)\r\n const coriolisAccel = Vector3.cross(angularVelocity, particleVelocity, new Vector3());\r\n coriolisAccel.scaleBy(-2.0 * coriolisScale);\r\n\r\n // Total inertial acceleration\r\n const totalAccel = Vector3.add(centrifugalAccel, coriolisAccel, new Vector3());\r\n return totalAccel;\r\n }\r\n\r\n /**\r\n * Solves a single spring constraint using XPBD (Extended Position-Based Dynamics).\r\n *\r\n * Reference: Müller et al., \"Detailed Rigid Body Simulation with Extended Position Based Dynamics\", 2020.\r\n */\r\n private solveConstraintXPBD(constraint: any, dt: number): void {\r\n const pA = this._chain.particles[constraint.particleA];\r\n const pB = this._chain.particles[constraint.particleB];\r\n\r\n const wA = pA.fixed ? 0 : 1.0 / pA.mass;\r\n const wB = pB.fixed ? 0 : 1.0 / pB.mass;\r\n const wSum = wA + wB;\r\n if (wSum < 1e-10) {\r\n return;\r\n }\r\n\r\n const delta = Vector3.sub(pB.position, pA.position, new Vector3());\r\n const currentLength = delta.magnitude;\r\n if (currentLength < 0.0001) {\r\n return;\r\n }\r\n\r\n // Constraint value C = currentLength - restLength\r\n const C = currentLength - constraint.restLength;\r\n\r\n // Scaled compliance: alphaTilde = compliance / dt^2\r\n const alphaTilde = constraint.compliance / (dt * dt);\r\n\r\n // XPBD Lagrange multiplier update\r\n const deltaLambda = (-C - alphaTilde * constraint.lambda) / (wSum + alphaTilde);\r\n constraint.lambda += deltaLambda;\r\n\r\n // Correction direction (unit vector from A to B)\r\n const n = Vector3.scale(delta, 1.0 / currentLength, new Vector3());\r\n\r\n if (!pA.fixed) {\r\n // deltaX_a = -w_a * deltaLambda * n\r\n Vector3.add(pA.position, Vector3.scale(n, -wA * deltaLambda, new Vector3()), pA.position);\r\n }\r\n if (!pB.fixed) {\r\n // deltaX_b = +w_b * deltaLambda * n\r\n Vector3.add(pB.position, Vector3.scale(n, wB * deltaLambda, new Vector3()), pB.position);\r\n }\r\n }\r\n\r\n /**\r\n * Solves a single spring constraint (Verlet / PBD)\r\n */\r\n private solveConstraint(constraint: any): void {\r\n const pA = this._chain.particles[constraint.particleA];\r\n const pB = this._chain.particles[constraint.particleB];\r\n\r\n // Calculate current distance\r\n const delta = Vector3.sub(pB.position, pA.position, new Vector3());\r\n const currentLength = delta.magnitude;\r\n\r\n if (currentLength < 0.0001) {\r\n return;\r\n } // Avoid division by zero\r\n\r\n // Calculate correction\r\n const diff = (currentLength - constraint.restLength) / currentLength;\r\n const correction = Vector3.scale(delta, diff * constraint.stiffness * 0.5, new Vector3());\r\n\r\n // Apply correction (considering mass and fixed state)\r\n if (!pA.fixed) {\r\n Vector3.add(pA.position, correction, pA.position);\r\n }\r\n if (!pB.fixed) {\r\n Vector3.sub(pB.position, correction, pB.position);\r\n }\r\n }\r\n\r\n /**\r\n * Solves collisions for all particles\r\n */\r\n private solveCollisions(deltaTime: number): void {\r\n // Update dynamic colliders from their nodes\r\n const blend = this.getTemporalBlendFactor(deltaTime, DEFAULT_COLLIDER_SMOOTHING_TIME);\r\n const spheres: { particleCollider: SphereCollider; collider: SphereCollider }[] = [];\r\n const capsules: { particleCollider: CapsuleCollider; collider: CapsuleCollider }[] = [];\r\n const planes: { particleCollider: PlaneCollider; collider: PlaneCollider }[] = [];\r\n for (const collider of this._colliders) {\r\n if (collider.node) {\r\n updateColliderFromNode(collider);\r\n }\r\n if (!collider.enabled) {\r\n continue;\r\n }\r\n switch (collider.type) {\r\n case 'sphere': {\r\n const source = collider as SphereCollider;\r\n spheres.push({\r\n particleCollider: source,\r\n collider: {\r\n ...source,\r\n center: this.getSmoothedSphereCenter(source, blend)\r\n }\r\n });\r\n break;\r\n }\r\n case 'capsule': {\r\n const source = collider as CapsuleCollider;\r\n const endpoints = this.getSmoothedCapsuleEndpoints(source, blend);\r\n capsules.push({\r\n particleCollider: source,\r\n collider: {\r\n ...source,\r\n start: endpoints.start,\r\n end: endpoints.end\r\n }\r\n });\r\n break;\r\n }\r\n case 'plane': {\r\n const source = collider as PlaneCollider;\r\n const plane = this.getSmoothedPlaneData(source, blend);\r\n planes.push({\r\n particleCollider: source,\r\n collider: {\r\n ...source,\r\n point: plane.point,\r\n normal: plane.normal\r\n }\r\n });\r\n break;\r\n }\r\n }\r\n }\r\n\r\n // Check each particle against all colliders\r\n for (const particle of this._chain.particles) {\r\n if (particle.fixed) {\r\n continue; // Skip fixed particles\r\n }\r\n\r\n for (const collider of spheres) {\r\n resolveSphereCollision(particle.position, collider.collider);\r\n }\r\n for (const collider of capsules) {\r\n resolveCapsuleCollision(particle.position, collider.collider);\r\n }\r\n for (const collider of planes) {\r\n resolvePlaneCollision(particle.position, collider.collider);\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Applies simulation results to scene nodes\r\n * @param weight - Blend weight [0-1] (default: 1.0)\r\n */\r\n applyToNodes(weight: number = 1.0): void {\r\n for (let i = 0; i < this._chain.particles.length - 1; i++) {\r\n const particle = this._chain.particles[i];\r\n const nextParticle = this._chain.particles[i + 1];\r\n const node = particle.node;\r\n\r\n // Skip if no node\r\n if (!node) {\r\n continue;\r\n }\r\n\r\n // Get current bone direction from node's world matrix (before physics)\r\n // This reflects the current animation/skeleton state\r\n const currentBonePos = new Vector3(node.worldMatrix.m03, node.worldMatrix.m13, node.worldMatrix.m23);\r\n\r\n const nextNode = nextParticle.node;\r\n if (!nextNode) {\r\n continue;\r\n }\r\n\r\n const nextBonePos = new Vector3(\r\n nextNode.worldMatrix.m03,\r\n nextNode.worldMatrix.m13,\r\n nextNode.worldMatrix.m23\r\n );\r\n const originalDir = Vector3.sub(nextBonePos, currentBonePos, new Vector3());\r\n\r\n // Get current bone rotation from node's world matrix\r\n const currentBoneRotation = new Quaternion();\r\n node.worldMatrix.decompose(null, currentBoneRotation, null);\r\n\r\n // Calculate new direction from physics simulation\r\n const newDir = Vector3.sub(nextParticle.position, particle.position, new Vector3());\r\n\r\n // Calculate rotation needed to align original direction to new direction\r\n const deltaRotation = new Quaternion();\r\n IKUtils.fromToRotation(originalDir, newDir, deltaRotation);\r\n\r\n // Calculate new world rotation\r\n let worldRotation = Quaternion.multiply(deltaRotation, currentBoneRotation, new Quaternion());\r\n\r\n // Blend with current rotation based on weight\r\n if (weight < 1) {\r\n Quaternion.slerp(currentBoneRotation, worldRotation, weight, worldRotation);\r\n }\r\n\r\n // Convert world rotation to local rotation (relative to parent)\r\n const parent = node.parent;\r\n const inputRotation = node.rotation.clone();\r\n if (parent) {\r\n const parentWorldRotation = new Quaternion();\r\n parent.worldMatrix.decompose(null, parentWorldRotation, null);\r\n\r\n // localRotation = conjugate(parentWorldRotation) * worldRotation\r\n const parentInvRotation = Quaternion.conjugate(parentWorldRotation, new Quaternion());\r\n const localRotation = Quaternion.multiply(parentInvRotation, worldRotation, new Quaternion());\r\n\r\n node.rotation = localRotation;\r\n this._nodePoseTracker.recordAppliedRotation(node, inputRotation, localRotation);\r\n } else {\r\n // Root node has no parent, world rotation is local rotation\r\n node.rotation = worldRotation;\r\n this._nodePoseTracker.recordAppliedRotation(node, inputRotation, worldRotation);\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Resets the simulation to initial state\r\n */\r\n reset(): void {\r\n this._nodePoseTracker.clear(true);\r\n this._chain.reset();\r\n for (const particle of this._chain.particles) {\r\n particle.animPosition.set(particle.originalPosition);\r\n particle.lastFramePosition.set(particle.originalPosition);\r\n if (particle.positionHistory) {\r\n particle.positionHistory.length = 0;\r\n }\r\n }\r\n this._timeAccumulator = 0;\r\n this._smoothedParticleTargets = new WeakMap();\r\n this._smoothedSphereCenters = new WeakMap();\r\n this._smoothedCapsuleEndpoints = new WeakMap();\r\n this._smoothedPlaneData = new WeakMap();\r\n }\r\n\r\n /**\r\n * Gets the spring chain\r\n */\r\n get chain(): SpringChain {\r\n return this._chain;\r\n }\r\n\r\n /**\r\n * Gets the current gravity\r\n */\r\n get gravity(): Vector3 {\r\n return this._gravity;\r\n }\r\n\r\n set gravity(gravity: Vector3) {\r\n this._gravity.set(gravity);\r\n }\r\n\r\n /**\r\n * Gets the current wind\r\n */\r\n get wind(): Vector3 {\r\n return this._wind;\r\n }\r\n\r\n set wind(wind: Vector3) {\r\n this._wind.set(wind);\r\n }\r\n\r\n /**\r\n * Gets the number of iterations\r\n */\r\n get iterations(): number {\r\n return this._iterations;\r\n }\r\n\r\n set iterations(count: number) {\r\n this._iterations = Math.max(1, count);\r\n }\r\n\r\n /**\r\n * Gets whether inertial forces are enabled\r\n */\r\n get enableInertialForces(): boolean {\r\n return this._enableInertialForces;\r\n }\r\n\r\n set enableInertialForces(enabled: boolean) {\r\n this._enableInertialForces = enabled;\r\n }\r\n\r\n /**\r\n * Gets the centrifugal force scale\r\n */\r\n get centrifugalScale(): number {\r\n return this._centrifugalScale;\r\n }\r\n\r\n set centrifugalScale(scale: number) {\r\n this._centrifugalScale = Math.max(0, scale);\r\n }\r\n\r\n /**\r\n * Gets the Coriolis force scale\r\n */\r\n get coriolisScale(): number {\r\n return this._coriolisScale;\r\n }\r\n\r\n set coriolisScale(scale: number) {\r\n this._coriolisScale = Math.max(0, scale);\r\n }\r\n\r\n /**\r\n * Gets the constraint solver type\r\n */\r\n get solver(): 'verlet' | 'xpbd' {\r\n return this._solver;\r\n }\r\n\r\n set solver(type: 'verlet' | 'xpbd') {\r\n if (this._solver !== type) {\r\n this._solver = type;\r\n if (type === 'xpbd') {\r\n for (const c of this._chain.constraints) {\r\n c.lambda = 0;\r\n }\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Gets pose preservation strength [0-1]\r\n */\r\n get poseFollow(): number {\r\n return this._poseFollow;\r\n }\r\n\r\n set poseFollow(value: number) {\r\n const v = Math.max(0, Math.min(1, value));\r\n this._poseFollow = v;\r\n this._poseFollowRoot = v;\r\n this._poseFollowTip = v;\r\n }\r\n\r\n /**\r\n * Gets max allowed deviation from animated pose\r\n */\r\n get maxPoseOffset(): number {\r\n return this._maxPoseOffset;\r\n }\r\n\r\n set maxPoseOffset(value: number) {\r\n const v = Math.max(0, value);\r\n this._maxPoseOffset = v;\r\n this._maxPoseOffsetRoot = v;\r\n this._maxPoseOffsetTip = v;\r\n }\r\n\r\n /**\r\n * Gets root pose follow strength [0-1]\r\n */\r\n get poseFollowRoot(): number {\r\n return this._poseFollowRoot;\r\n }\r\n\r\n set poseFollowRoot(value: number) {\r\n this._poseFollowRoot = Math.max(0, Math.min(1, value));\r\n }\r\n\r\n /**\r\n * Gets tip pose follow strength [0-1]\r\n */\r\n get poseFollowTip(): number {\r\n return this._poseFollowTip;\r\n }\r\n\r\n set poseFollowTip(value: number) {\r\n this._poseFollowTip = Math.max(0, Math.min(1, value));\r\n }\r\n\r\n /**\r\n * Gets exponent for root-to-tip interpolation\r\n */\r\n get poseFollowExponent(): number {\r\n return this._poseFollowExponent;\r\n }\r\n\r\n set poseFollowExponent(value: number) {\r\n this._poseFollowExponent = Math.max(0.1, value);\r\n }\r\n\r\n /**\r\n * Gets root max allowed deviation from animated pose\r\n */\r\n get maxPoseOffsetRoot(): number {\r\n return this._maxPoseOffsetRoot;\r\n }\r\n\r\n set maxPoseOffsetRoot(value: number) {\r\n this._maxPoseOffsetRoot = Math.max(0, value);\r\n }\r\n\r\n /**\r\n * Gets tip max allowed deviation from animated pose\r\n */\r\n get maxPoseOffsetTip(): number {\r\n return this._maxPoseOffsetTip;\r\n }\r\n\r\n set maxPoseOffsetTip(value: number) {\r\n this._maxPoseOffsetTip = Math.max(0, value);\r\n }\r\n\r\n /**\r\n * Adds a collider to the system\r\n */\r\n addCollider(collider: SpringCollider): void {\r\n this._colliders.push(collider);\r\n this._smoothedSphereCenters = new WeakMap();\r\n this._smoothedCapsuleEndpoints = new WeakMap();\r\n this._smoothedPlaneData = new WeakMap();\r\n }\r\n\r\n /**\r\n * Removes a collider from the system\r\n */\r\n removeCollider(collider: SpringCollider): boolean {\r\n const index = this._colliders.indexOf(collider);\r\n if (index >= 0) {\r\n this._colliders.splice(index, 1);\r\n this._smoothedSphereCenters = new WeakMap();\r\n this._smoothedCapsuleEndpoints = new WeakMap();\r\n this._smoothedPlaneData = new WeakMap();\r\n return true;\r\n }\r\n return false;\r\n }\r\n\r\n /**\r\n * Clears all colliders\r\n */\r\n clearColliders(): void {\r\n this._colliders = [];\r\n this._smoothedSphereCenters = new WeakMap();\r\n this._smoothedCapsuleEndpoints = new WeakMap();\r\n this._smoothedPlaneData = new WeakMap();\r\n }\r\n\r\n /**\r\n * Gets all colliders\r\n */\r\n get colliders(): SpringCollider[] {\r\n return this._colliders;\r\n }\r\n\r\n private getTemporalBlendFactor(deltaTime: number, smoothingTime: number): number {\r\n const dt = Math.min(Math.max(Number(deltaTime) || 0, 0), MAX_ACCUMULATED_SIMULATION_TIME);\r\n if (smoothingTime <= 0) {\r\n return 1;\r\n }\r\n if (dt <= 0) {\r\n return 0;\r\n }\r\n return 1 - Math.exp(-dt / smoothingTime);\r\n }\r\n\r\n private getSmoothedParticleTarget(target: object, current: Vector3, blend: number): Vector3 {\r\n const cached = this._smoothedParticleTargets.get(target);\r\n if (!cached || blend >= 1) {\r\n const next = current.clone();\r\n this._smoothedParticleTargets.set(target, next);\r\n return next;\r\n }\r\n cached.setXYZ(\r\n cached.x + (current.x - cached.x) * blend,\r\n cached.y + (current.y - cached.y) * blend,\r\n cached.z + (current.z - cached.z) * blend\r\n );\r\n return cached;\r\n }\r\n\r\n private getSmoothedSphereCenter(collider: SphereCollider, blend: number): Vector3 {\r\n const current = collider.center?.clone() ?? new Vector3();\r\n const cached = this._smoothedSphereCenters.get(collider);\r\n if (!cached || blend >= 1) {\r\n this._smoothedSphereCenters.set(collider, current);\r\n return current;\r\n }\r\n cached.setXYZ(\r\n cached.x + (current.x - cached.x) * blend,\r\n cached.y + (current.y - cached.y) * blend,\r\n cached.z + (current.z - cached.z) * blend\r\n );\r\n return cached;\r\n }\r\n\r\n private getSmoothedCapsuleEndpoints(\r\n collider: CapsuleCollider,\r\n blend: number\r\n ): { start: Vector3; end: Vector3 } {\r\n const currentStart = collider.start?.clone() ?? new Vector3();\r\n const currentEnd = collider.end?.clone() ?? new Vector3();\r\n const cached = this._smoothedCapsuleEndpoints.get(collider);\r\n if (!cached || blend >= 1) {\r\n const next = {\r\n start: currentStart,\r\n end: currentEnd\r\n };\r\n this._smoothedCapsuleEndpoints.set(collider, next);\r\n return next;\r\n }\r\n cached.start.setXYZ(\r\n cached.start.x + (currentStart.x - cached.start.x) * blend,\r\n cached.start.y + (currentStart.y - cached.start.y) * blend,\r\n cached.start.z + (currentStart.z - cached.start.z) * blend\r\n );\r\n cached.end.setXYZ(\r\n cached.end.x + (currentEnd.x - cached.end.x) * blend,\r\n cached.end.y + (currentEnd.y - cached.end.y) * blend,\r\n cached.end.z + (currentEnd.z - cached.end.z) * blend\r\n );\r\n return cached;\r\n }\r\n\r\n private getSmoothedPlaneData(collider: PlaneCollider, blend: number): { point: Vector3; normal: Vector3 } {\r\n const currentPoint = collider.point?.clone() ?? new Vector3();\r\n const currentNormal = collider.normal?.clone() ?? Vector3.axisPY();\r\n if (currentNormal.magnitudeSq > 1e-8) {\r\n currentNormal.inplaceNormalize();\r\n } else {\r\n currentNormal.setXYZ(0, 1, 0);\r\n }\r\n const cached = this._smoothedPlaneData.get(collider);\r\n if (!cached || blend >= 1) {\r\n const next = {\r\n point: currentPoint,\r\n normal: currentNormal\r\n };\r\n this._smoothedPlaneData.set(collider, next);\r\n return next;\r\n }\r\n cached.point.setXYZ(\r\n cached.point.x + (currentPoint.x - cached.point.x) * blend,\r\n cached.point.y + (currentPoint.y - cached.point.y) * blend,\r\n cached.point.z + (currentPoint.z - cached.point.z) * blend\r\n );\r\n cached.normal.setXYZ(\r\n cached.normal.x + (currentNormal.x - cached.normal.x) * blend,\r\n cached.normal.y + (currentNormal.y - cached.normal.y) * blend,\r\n cached.normal.z + (currentNormal.z - cached.normal.z) * blend\r\n );\r\n if (cached.normal.magnitudeSq > 1e-8) {\r\n cached.normal.inplaceNormalize();\r\n } else {\r\n cached.normal.setXYZ(0, 1, 0);\r\n }\r\n return cached;\r\n }\r\n}\r\n"],"names":["FIXED_SIMULATION_TIME_STEP","MAX_ACCUMULATED_SIMULATION_TIME","MAX_SIMULATION_STEPS_PER_UPDATE","Math","max","ceil","DEFAULT_PARTICLE_TARGET_SMOOTHING_TIME","DEFAULT_COLLIDER_SMOOTHING_TIME","SpringSystem","_chain","_iterations","_gravity","_wind","_enableInertialForces","_centrifugalScale","_coriolisScale","_colliders","_solver","_poseFollow","_maxPoseOffset","_poseFollowRoot","_poseFollowTip","_poseFollowExponent","_maxPoseOffsetRoot","_maxPoseOffsetTip","_timeAccumulator","_smoothedParticleTargets","_smoothedSphereCenters","_smoothedCapsuleEndpoints","_smoothedPlaneData","_nodePoseTracker","chain","options","iterations","gravity","clone","Vector3","wind","enableInertialForces","centrifugalScale","coriolisScale","solver","min","poseFollow","maxPoseOffset","poseFollowRoot","poseFollowTip","poseFollowExponent","maxPoseOffsetRoot","maxPoseOffsetTip","WeakMap","SpringNodePoseTracker","update","deltaTime","restoreInputPose","frameDt","Number","stepCount","floor","i","simulateStep","dt","inputDeltaTime","p","particles","lastFramePosition","set","position","updateFixedParticles","rotationCenter","angularVelocity","result","calculateGlobalRotation","center","omega","length","fixed","velocity","sub","prevPosition","scaleBy","damping","acceleration","add","inertialAccel","calculateInertialAcceleration","positionDelta","scale","constraint","constraints","lambda","iter","solveConstraintXPBD","solveConstraint","solvePosePreservation","solveCollisions","blend","getTemporalBlendFactor","particle","sourceNode","anchorNode","node","worldPos","anchorOffset","worldMatrix","transformPointAffine","m03","m13","m23","smoothedTarget","getSmoothedParticleTarget","animPosition","positionHistory","push","shift","totalIterations","lastIndex","t","pow","particlePoseFollow","lerp","iterationFollow","toAnim","correction","particleMaxPoseOffset","offset","offsetLen","magnitude","a","b","fixedParticles","velocities","magnitudeSq","estimateRotationCenterFromHistory","sumOmega","count","r","v","rLengthSq","cross","currentVelocity","history","speed","estimatedRadius","up","perpDir","inplaceNormalize","p1","p2","p3","calculateCircleCenter","mid12","mid23","dir12","dir23","normal","perp12","perp23","diff","det","x","y","abs","particleVelocity","omegaCrossR","centrifugalAccel","coriolisAccel","totalAccel","pA","particleA","pB","particleB","wA","mass","wB","wSum","delta","currentLength","C","restLength","alphaTilde","compliance","deltaLambda","n","stiffness","spheres","capsules","planes","collider","updateColliderFromNode","enabled","type","source","particleCollider","getSmoothedSphereCenter","endpoints","getSmoothedCapsuleEndpoints","start","end","plane","getSmoothedPlaneData","point","resolveSphereCollision","resolveCapsuleCollision","resolvePlaneCollision","applyToNodes","weight","nextParticle","currentBonePos","nextNode","nextBonePos","originalDir","currentBoneRotation","Quaternion","decompose","newDir","deltaRotation","IKUtils","fromToRotation","worldRotation","multiply","slerp","parent","inputRotation","rotation","parentWorldRotation","parentInvRotation","conjugate","localRotation","recordAppliedRotation","reset","clear","originalPosition","c","value","addCollider","removeCollider","index","indexOf","splice","clearColliders","colliders","smoothingTime","exp","target","current","cached","get","next","setXYZ","z","currentStart","currentEnd","currentPoint","currentNormal","axisPY"],"mappings":"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"}
1
+ {"version":3,"file":"spring_system.js","sources":["../../../src/animation/spring/spring_system.ts"],"sourcesContent":["import { Vector3, Quaternion } from '@zephyr3d/base';\r\nimport type { SpringChain } from './spring_chain';\r\nimport type { SpringParticle } from './spring_particle';\r\nimport { IKUtils } from '../ik/ik_utils';\r\nimport type { SpringCollider } from './spring_collider';\r\nimport {\r\n resolveSphereCollision,\r\n resolveCapsuleCollision,\r\n resolvePlaneCollision,\r\n resolveBoxCollision,\r\n type CapsuleCollider,\r\n type BoxCollider,\r\n type PlaneCollider,\r\n type SphereCollider,\r\n updateColliderFromNode\r\n} from './spring_collider';\r\nimport { SpringNodePoseTracker } from './spring_node_pose_tracker';\r\nimport {\r\n DEFAULT_INITIAL_COLLISION_PENETRATION_RELEASE_TIME,\r\n getIterationStrength,\r\n getKawaiiPoseTarget,\r\n getReleasedCollisionPenetration,\r\n getSpringPoseTopology,\r\n INITIAL_COLLISION_PENETRATION_SLOP,\r\n interpolateSpringValue,\r\n measureCollisionPenetration,\r\n resolveInelasticCollision,\r\n solveAngleLimit,\r\n solveDistanceConstraint,\r\n type SpringMotionModel\r\n} from './spring_solver';\r\n\r\n/**\r\n * Options for creating a SpringSystem\r\n *\r\n * @public\r\n */\r\nexport interface SpringSystemOptions {\r\n /** Integration behavior. `kawaii` preserves animated local shape while simulating (default: `kawaii`). */\r\n motionModel?: SpringMotionModel;\r\n /** Number of constraint solver iterations (default: 5) */\r\n iterations?: number;\r\n /** Gravity force vector (default: (0, -9.8, 0)) */\r\n gravity?: Vector3;\r\n /** Wind force vector (default: (0, 0, 0)) */\r\n wind?: Vector3;\r\n /** Enable inertial forces (centrifugal/Coriolis) when root rotates (default: true) */\r\n enableInertialForces?: boolean;\r\n /** Centrifugal force multiplier (default: 1.0) */\r\n centrifugalScale?: number;\r\n /** Coriolis force multiplier (default: 1.0) */\r\n coriolisScale?: number;\r\n /**\r\n * Constraint solver type (default: 'verlet').\r\n * - 'verlet': Classic Verlet integration with iterative position correction.\r\n * stiffness [0-1] controls correction strength per iteration.\r\n * - 'xpbd': Extended Position-Based Dynamics (Müller et al. 2020).\r\n * Uses compliance (inverse stiffness in m/N) for physically correct,\r\n * iteration-count-independent constraint solving.\r\n */\r\n solver?: 'verlet' | 'xpbd';\r\n /**\r\n * How strongly particles are pulled toward current animated pose [0-1].\r\n * This preserves the authored hair shape while still allowing secondary motion.\r\n * Higher values keep the original hairstyle better.\r\n */\r\n poseFollow?: number;\r\n /**\r\n * Optional root-follow override [0-1].\r\n * If provided, pose follow is interpolated from root to tip.\r\n */\r\n poseFollowRoot?: number;\r\n /**\r\n * Optional tip-follow override [0-1].\r\n * If provided, pose follow is interpolated from root to tip.\r\n */\r\n poseFollowTip?: number;\r\n /**\r\n * Exponent used when interpolating root-to-tip follow.\r\n * `1` is linear; values `\\> 1` keep the root stiffer and the tip looser.\r\n */\r\n poseFollowExponent?: number;\r\n /**\r\n * Optional per-step limit for deviation from animated pose.\r\n * 0 disables clamping. Useful to prevent extreme stretch under high acceleration.\r\n */\r\n maxPoseOffset?: number;\r\n /**\r\n * Optional root max-offset override.\r\n * If provided, max offset is interpolated from root to tip.\r\n */\r\n maxPoseOffsetRoot?: number;\r\n /**\r\n * Optional tip max-offset override.\r\n * If provided, max offset is interpolated from root to tip.\r\n */\r\n maxPoseOffsetTip?: number;\r\n /** Root angle limit in degrees. 0 disables angle limiting. */\r\n angleLimitRoot?: number;\r\n /** Tip angle limit in degrees. 0 disables angle limiting. */\r\n angleLimitTip?: number;\r\n /** Fraction of XPBD positional correction retained in Verlet history (default: 0.35). */\r\n constraintVelocityHistoryRetention?: number;\r\n /** Temporarily preserve collider overlap present in the initialized pose while blocking deeper penetration. */\r\n preserveInitialCollisionPenetration?: boolean;\r\n /** Seconds used to smoothly release preserved startup overlap (default: 0.25). */\r\n initialCollisionPenetrationReleaseTime?: number;\r\n}\r\n\r\nconst FIXED_SIMULATION_TIME_STEP = 1 / 60;\r\nconst MAX_ACCUMULATED_SIMULATION_TIME = 1 / 20;\r\nconst MAX_SIMULATION_STEPS_PER_UPDATE = Math.max(\r\n 1,\r\n Math.ceil(MAX_ACCUMULATED_SIMULATION_TIME / FIXED_SIMULATION_TIME_STEP)\r\n);\r\nconst DEFAULT_PARTICLE_TARGET_SMOOTHING_TIME = 1 / 30;\r\nconst DEFAULT_COLLIDER_SMOOTHING_TIME = 1 / 30;\r\n\r\n/**\r\n * Physics engine for spring-based particle simulation\r\n * Uses Verlet integration and iterative constraint solving\r\n *\r\n * @public\r\n */\r\nexport class SpringSystem {\r\n private _chain: SpringChain;\r\n private _iterations: number;\r\n private _gravity: Vector3;\r\n private _wind: Vector3;\r\n private _enableInertialForces: boolean;\r\n private _centrifugalScale: number;\r\n private _coriolisScale: number;\r\n private _colliders: SpringCollider[];\r\n private _solver: 'verlet' | 'xpbd';\r\n private _poseFollow: number;\r\n private _maxPoseOffset: number;\r\n private _poseFollowRoot: number;\r\n private _poseFollowTip: number;\r\n private _poseFollowExponent: number;\r\n private _maxPoseOffsetRoot: number;\r\n private _maxPoseOffsetTip: number;\r\n private _timeAccumulator: number;\r\n private _smoothedParticleTargets: WeakMap<object, Vector3>;\r\n private _smoothedSphereCenters: WeakMap<SphereCollider, Vector3>;\r\n private _smoothedCapsuleEndpoints: WeakMap<CapsuleCollider, { start: Vector3; end: Vector3 }>;\r\n private _smoothedPlaneData: WeakMap<PlaneCollider, { point: Vector3; normal: Vector3 }>;\r\n private _smoothedBoxData: WeakMap<\r\n BoxCollider,\r\n { center: Vector3; halfExtents: Vector3; axes: [Vector3, Vector3, Vector3] }\r\n >;\r\n private _nodePoseTracker: SpringNodePoseTracker;\r\n private _motionModel: SpringMotionModel;\r\n private _angleLimitRoot: number;\r\n private _angleLimitTip: number;\r\n private _constraintVelocityHistoryRetention: number;\r\n private _preserveInitialCollisionPenetration: boolean;\r\n private _initialCollisionPenetrationReleaseTime: number;\r\n private _initialCollisionPenetrationElapsed: number;\r\n private _initialCollisionPenetration: WeakMap<SpringParticle, WeakMap<SpringCollider, number>>;\r\n\r\n constructor(chain: SpringChain, options?: SpringSystemOptions) {\r\n this._chain = chain;\r\n this._iterations = options?.iterations ?? 5;\r\n this._gravity = options?.gravity?.clone() ?? new Vector3(0, -9.8, 0);\r\n this._wind = options?.wind?.clone() ?? new Vector3(0, 0, 0);\r\n this._enableInertialForces = options?.enableInertialForces ?? true;\r\n this._centrifugalScale = options?.centrifugalScale ?? 1.0;\r\n this._coriolisScale = options?.coriolisScale ?? 1.0;\r\n this._colliders = [];\r\n this._solver = options?.solver ?? 'verlet';\r\n this._poseFollow = Math.max(0, Math.min(1, options?.poseFollow ?? 0.35));\r\n this._maxPoseOffset = Math.max(0, options?.maxPoseOffset ?? 0);\r\n this._poseFollowRoot = Math.max(0, Math.min(1, options?.poseFollowRoot ?? this._poseFollow));\r\n this._poseFollowTip = Math.max(0, Math.min(1, options?.poseFollowTip ?? this._poseFollow));\r\n this._poseFollowExponent = Math.max(0.1, options?.poseFollowExponent ?? 1.6);\r\n this._maxPoseOffsetRoot = Math.max(0, options?.maxPoseOffsetRoot ?? this._maxPoseOffset);\r\n this._maxPoseOffsetTip = Math.max(0, options?.maxPoseOffsetTip ?? this._maxPoseOffset);\r\n this._timeAccumulator = 0;\r\n this._smoothedParticleTargets = new WeakMap();\r\n this._smoothedSphereCenters = new WeakMap();\r\n this._smoothedCapsuleEndpoints = new WeakMap();\r\n this._smoothedPlaneData = new WeakMap();\r\n this._smoothedBoxData = new WeakMap();\r\n this._nodePoseTracker = new SpringNodePoseTracker();\r\n this._motionModel = options?.motionModel ?? 'kawaii';\r\n this._angleLimitRoot = Math.max(0, options?.angleLimitRoot ?? 0);\r\n this._angleLimitTip = Math.max(0, options?.angleLimitTip ?? this._angleLimitRoot);\r\n this._constraintVelocityHistoryRetention = Math.max(\r\n 0,\r\n Math.min(1, options?.constraintVelocityHistoryRetention ?? 0.35)\r\n );\r\n this._preserveInitialCollisionPenetration =\r\n options?.preserveInitialCollisionPenetration ?? this._motionModel === 'kawaii';\r\n this._initialCollisionPenetrationReleaseTime = Math.max(\r\n 0,\r\n options?.initialCollisionPenetrationReleaseTime ?? DEFAULT_INITIAL_COLLISION_PENETRATION_RELEASE_TIME\r\n );\r\n this._initialCollisionPenetrationElapsed = 0;\r\n this._initialCollisionPenetration = new WeakMap();\r\n }\r\n\r\n /**\r\n * Updates the physics simulation\r\n * @param deltaTime - Time step in seconds\r\n */\r\n update(deltaTime: number): void {\r\n this._nodePoseTracker.restoreInputPose();\r\n const frameDt = Math.min(Math.max(Number(deltaTime) || 0, 0), MAX_ACCUMULATED_SIMULATION_TIME);\r\n if (frameDt <= 0) {\r\n return;\r\n }\r\n this._timeAccumulator = Math.min(this._timeAccumulator + frameDt, MAX_ACCUMULATED_SIMULATION_TIME);\r\n const stepCount = Math.min(\r\n MAX_SIMULATION_STEPS_PER_UPDATE,\r\n Math.floor((this._timeAccumulator + 1e-8) / FIXED_SIMULATION_TIME_STEP)\r\n );\r\n if (stepCount <= 0) {\r\n return;\r\n }\r\n this._timeAccumulator = Math.max(0, this._timeAccumulator - stepCount * FIXED_SIMULATION_TIME_STEP);\r\n for (let i = 0; i < stepCount; i++) {\r\n this.simulateStep(FIXED_SIMULATION_TIME_STEP, i === 0 ? frameDt : 0, i, stepCount);\r\n }\r\n }\r\n\r\n private simulateStep(dt: number, inputDeltaTime: number, stepIndex: number, stepCount: number): void {\r\n // Step 1: Save all particle positions before updating\r\n if (this._enableInertialForces) {\r\n for (const p of this._chain.particles) {\r\n p.lastFramePosition.set(p.position);\r\n }\r\n }\r\n\r\n // Step 2: Update fixed particles from their scene nodes\r\n const substepBlend = 1 / Math.max(1, stepCount - stepIndex);\r\n this.updateFixedParticles(inputDeltaTime, substepBlend);\r\n\r\n // Step 3: Calculate global rotation parameters\r\n let rotationCenter: Vector3 | null = null;\r\n let angularVelocity: Vector3 | null = null;\r\n\r\n if (this._enableInertialForces && dt > 0.0001) {\r\n const result = this.calculateGlobalRotation(dt);\r\n rotationCenter = result.center;\r\n angularVelocity = result.omega;\r\n }\r\n\r\n // Step 4: Verlet integration with inertial forces\r\n for (let i = 0; i < this._chain.particles.length; i++) {\r\n const p = this._chain.particles[i];\r\n if (p.fixed) {\r\n continue;\r\n }\r\n\r\n // Calculate velocity (implicit in Verlet)\r\n const velocity = Vector3.sub(p.position, p.prevPosition, new Vector3());\r\n velocity.scaleBy(p.damping);\r\n\r\n // Apply external forces (gravity + wind)\r\n const acceleration = Vector3.add(this._gravity, this._wind, new Vector3());\r\n\r\n // Apply inertial forces from rotating reference frame\r\n if (this._enableInertialForces && rotationCenter && angularVelocity) {\r\n const inertialAccel = this.calculateInertialAcceleration(\r\n p,\r\n rotationCenter,\r\n angularVelocity,\r\n velocity,\r\n this._centrifugalScale,\r\n this._coriolisScale\r\n );\r\n Vector3.add(acceleration, inertialAccel, acceleration);\r\n }\r\n\r\n const positionDelta = Vector3.scale(acceleration, dt * dt, new Vector3());\r\n Vector3.add(velocity, positionDelta, velocity);\r\n\r\n // Update position\r\n p.prevPosition.set(p.position);\r\n Vector3.add(p.position, velocity, p.position);\r\n }\r\n\r\n // Step 5: Iteratively solve constraints\r\n if (this._solver === 'xpbd') {\r\n // Reset Lagrange multipliers at the start of each time step\r\n for (const constraint of this._chain.constraints) {\r\n constraint.lambda = 0;\r\n }\r\n }\r\n if (this._motionModel === 'kawaii') {\r\n this.solvePosePreservation(1, true);\r\n }\r\n for (let iter = 0; iter < this._iterations; iter++) {\r\n const reverse = this._motionModel === 'kawaii' && !!(iter & 1);\r\n for (let constraintIndex = 0; constraintIndex < this._chain.constraints.length; constraintIndex++) {\r\n const constraint =\r\n this._chain.constraints[\r\n reverse ? this._chain.constraints.length - 1 - constraintIndex : constraintIndex\r\n ];\r\n if (this._solver === 'xpbd') {\r\n this.solveConstraintXPBD(constraint, dt);\r\n } else {\r\n this.solveConstraint(constraint);\r\n }\r\n }\r\n\r\n // Pull particles back toward the animated pose to preserve hair silhouette.\r\n // Normalize follow strength across solver iterations so tuning stays intuitive.\r\n if (this._motionModel === 'legacy') {\r\n this.solvePosePreservation(this._iterations, false);\r\n }\r\n\r\n if (this._motionModel === 'legacy') {\r\n this.solveCollisions(inputDeltaTime);\r\n }\r\n }\r\n if (this._motionModel === 'kawaii') {\r\n this.solveCollisions(inputDeltaTime, substepBlend);\r\n this.solveAngleLimits();\r\n if (this._solver === 'xpbd') {\r\n this.solveCollisions(0, 0);\r\n for (const constraint of this._chain.constraints) {\r\n constraint.lambda = 0;\r\n }\r\n const closureIterations = Math.min(16, Math.max(4, this._iterations));\r\n for (let iteration = 0; iteration < closureIterations; iteration++) {\r\n const reverse = !!(iteration & 1);\r\n for (let constraintIndex = 0; constraintIndex < this._chain.constraints.length; constraintIndex++) {\r\n const constraint =\r\n this._chain.constraints[\r\n reverse ? this._chain.constraints.length - 1 - constraintIndex : constraintIndex\r\n ];\r\n this.solveConstraintXPBD(constraint, dt);\r\n }\r\n }\r\n if (this._colliders.some((collider) => collider.enabled)) {\r\n for (const constraint of this._chain.constraints) {\r\n constraint.lambda = 0;\r\n }\r\n const contactClosureIterations = Math.min(4, closureIterations);\r\n for (let iteration = 0; iteration < contactClosureIterations; iteration++) {\r\n const reverse = !!(iteration & 1);\r\n for (\r\n let constraintIndex = 0;\r\n constraintIndex < this._chain.constraints.length;\r\n constraintIndex++\r\n ) {\r\n const constraint =\r\n this._chain.constraints[\r\n reverse ? this._chain.constraints.length - 1 - constraintIndex : constraintIndex\r\n ];\r\n this.solveConstraintXPBD(constraint, dt);\r\n }\r\n this.solveCollisions(0, 0);\r\n }\r\n }\r\n } else {\r\n for (const constraint of this._chain.constraints) {\r\n this.solveConstraint(constraint);\r\n }\r\n this.solveCollisions(0, 0);\r\n }\r\n }\r\n this.advanceInitialCollisionPenetrationRelease(dt);\r\n }\r\n\r\n /**\r\n * Updates fixed particles to match their scene node positions\r\n */\r\n private updateFixedParticles(deltaTime: number, substepBlend: number): void {\r\n const blend =\r\n this._motionModel === 'kawaii'\r\n ? substepBlend\r\n : this.getTemporalBlendFactor(deltaTime, DEFAULT_PARTICLE_TARGET_SMOOTHING_TIME);\r\n for (const particle of this._chain.particles) {\r\n const sourceNode = particle.anchorNode ?? particle.node;\r\n if (!sourceNode) {\r\n continue;\r\n }\r\n const worldPos = particle.anchorOffset\r\n ? sourceNode.worldMatrix.transformPointAffine(particle.anchorOffset)\r\n : new Vector3(sourceNode.worldMatrix.m03, sourceNode.worldMatrix.m13, sourceNode.worldMatrix.m23);\r\n const smoothedTarget = this.getSmoothedParticleTarget(particle, worldPos, blend);\r\n particle.animPosition.set(smoothedTarget);\r\n if (particle.fixed) {\r\n particle.position.set(smoothedTarget);\r\n particle.prevPosition.set(smoothedTarget);\r\n\r\n // Maintain position history for rotation center estimation\r\n if (this._enableInertialForces) {\r\n if (!particle.positionHistory) {\r\n particle.positionHistory = [];\r\n }\r\n particle.positionHistory.push(smoothedTarget.clone());\r\n // Keep only last 5 frames\r\n if (particle.positionHistory.length > 5) {\r\n particle.positionHistory.shift();\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Solves pose preservation (long-range attachment to animated pose).\r\n * This keeps strands close to authored shape while preserving dynamic movement.\r\n */\r\n private solvePosePreservation(totalIterations: number, parentRelative: boolean): void {\r\n if (this._poseFollowRoot <= 0 && this._poseFollowTip <= 0) {\r\n return;\r\n }\r\n\r\n const topology = getSpringPoseTopology(this._chain.particles);\r\n for (let i = 0; i < this._chain.particles.length; i++) {\r\n const particle = this._chain.particles[i];\r\n if (particle.fixed) {\r\n continue;\r\n }\r\n\r\n const t = Math.pow(topology[i].normalizedDistance, this._poseFollowExponent);\r\n const particlePoseFollow = this.lerp(this._poseFollowRoot, this._poseFollowTip, t);\r\n // Convert user-facing per-frame follow into per-iteration follow:\r\n // effective = 1 - (1 - follow)^iterations\r\n const iterationFollow = getIterationStrength(particlePoseFollow, totalIterations);\r\n const poseTarget = parentRelative ? getKawaiiPoseTarget(particle, topology[i]) : particle.animPosition;\r\n const toAnim = Vector3.sub(poseTarget, particle.position, new Vector3());\r\n const correction = Vector3.scale(toAnim, iterationFollow, new Vector3());\r\n Vector3.add(particle.position, correction, particle.position);\r\n\r\n const particleMaxPoseOffset = this.lerp(this._maxPoseOffsetRoot, this._maxPoseOffsetTip, t);\r\n if (particleMaxPoseOffset > 0) {\r\n const offset = Vector3.sub(particle.position, poseTarget, new Vector3());\r\n const offsetLen = offset.magnitude;\r\n if (offsetLen > particleMaxPoseOffset && offsetLen > 1e-6) {\r\n offset.scaleBy(particleMaxPoseOffset / offsetLen);\r\n Vector3.add(poseTarget, offset, particle.position);\r\n }\r\n }\r\n }\r\n }\r\n\r\n private solveAngleLimits(): void {\r\n if (this._angleLimitRoot <= 0 && this._angleLimitTip <= 0) {\r\n return;\r\n }\r\n const particles = this._chain.particles;\r\n for (let i = 1; i < particles.length; i++) {\r\n const limit = interpolateSpringValue(\r\n this._angleLimitRoot,\r\n this._angleLimitTip,\r\n this._poseFollowExponent,\r\n i,\r\n particles.length\r\n );\r\n solveAngleLimit(particles[i - 1], particles[i], limit, this._solver === 'xpbd');\r\n }\r\n }\r\n\r\n private lerp(a: number, b: number, t: number): number {\r\n return a + (b - a) * t;\r\n }\r\n\r\n /**\r\n * Calculates global rotation parameters from fixed particle movements\r\n * Uses position history to estimate rotation center\r\n */\r\n private calculateGlobalRotation(dt: number): { center: Vector3; omega: Vector3 } {\r\n // Collect fixed particles with movement\r\n const fixedParticles: any[] = [];\r\n const velocities: Vector3[] = [];\r\n\r\n for (const p of this._chain.particles) {\r\n if (!p.fixed) {\r\n continue;\r\n }\r\n\r\n const velocity = Vector3.sub(p.position, p.lastFramePosition, new Vector3());\r\n velocity.scaleBy(1.0 / dt);\r\n\r\n if (velocity.magnitudeSq > 0.001) {\r\n fixedParticles.push(p);\r\n velocities.push(velocity);\r\n }\r\n }\r\n\r\n if (fixedParticles.length === 0) {\r\n return { center: new Vector3(0, 0, 0), omega: new Vector3(0, 0, 0) };\r\n }\r\n\r\n // Estimate rotation center using position history\r\n let center: Vector3;\r\n\r\n if (fixedParticles.length === 1) {\r\n // Single fixed particle: use position history to estimate rotation center\r\n center = this.estimateRotationCenterFromHistory(fixedParticles[0], velocities[0]);\r\n } else {\r\n // Multiple fixed particles: use their average position\r\n center = new Vector3(0, 0, 0);\r\n for (const p of fixedParticles) {\r\n Vector3.add(center, p.position, center);\r\n }\r\n center.scaleBy(1.0 / fixedParticles.length);\r\n }\r\n\r\n // Estimate angular velocity\r\n let sumOmega = new Vector3(0, 0, 0);\r\n let count = 0;\r\n\r\n for (let i = 0; i < fixedParticles.length; i++) {\r\n const r = Vector3.sub(fixedParticles[i].position, center, new Vector3());\r\n const v = velocities[i];\r\n const rLengthSq = r.magnitudeSq;\r\n\r\n if (rLengthSq > 0.0001) {\r\n // ω = (r × v) / |r|²\r\n const omega = Vector3.cross(r, v, new Vector3());\r\n omega.scaleBy(1.0 / rLengthSq);\r\n Vector3.add(sumOmega, omega, sumOmega);\r\n count++;\r\n }\r\n }\r\n\r\n if (count > 0) {\r\n sumOmega.scaleBy(1.0 / count);\r\n }\r\n\r\n return { center, omega: sumOmega };\r\n }\r\n\r\n /**\r\n * Estimates rotation center from a single particle's position history\r\n * Uses circular motion fitting\r\n */\r\n private estimateRotationCenterFromHistory(particle: any, currentVelocity: Vector3): Vector3 {\r\n const history = particle.positionHistory;\r\n if (!history || history.length < 3) {\r\n // Not enough history: estimate using velocity perpendicular direction\r\n // Assume rotation center is perpendicular to velocity\r\n // Use a default radius based on velocity magnitude\r\n const speed = currentVelocity.magnitude;\r\n if (speed < 0.001) {\r\n return particle.position.clone();\r\n }\r\n\r\n // Estimate radius: for typical character rotation, assume ~0.5-1.0m radius\r\n const estimatedRadius = Math.max(0.5, speed * 0.5);\r\n\r\n // Direction perpendicular to velocity (in the plane of motion)\r\n // We need to guess which perpendicular direction - use cross product with up vector\r\n const up = new Vector3(0, 1, 0);\r\n const perpDir = Vector3.cross(currentVelocity, up, new Vector3());\r\n\r\n if (perpDir.magnitudeSq < 0.0001) {\r\n // Velocity is vertical, use another perpendicular\r\n perpDir.set(new Vector3(1, 0, 0));\r\n } else {\r\n perpDir.inplaceNormalize();\r\n }\r\n\r\n // Rotation center is perpendicular to velocity\r\n const center = Vector3.add(\r\n particle.position,\r\n Vector3.scale(perpDir, estimatedRadius, new Vector3()),\r\n new Vector3()\r\n );\r\n return center;\r\n }\r\n\r\n // Fit a circle through the last 3 positions\r\n // Use positions at indices: 0 (oldest), middle, last (newest)\r\n const p1 = history[0];\r\n const p2 = history[Math.floor(history.length / 2)];\r\n const p3 = history[history.length - 1];\r\n\r\n // Calculate circle center from 3 points\r\n const center = this.calculateCircleCenter(p1, p2, p3);\r\n return center;\r\n }\r\n\r\n /**\r\n * Calculates the center of a circle passing through 3 points\r\n * Uses perpendicular bisector method\r\n */\r\n private calculateCircleCenter(p1: Vector3, p2: Vector3, p3: Vector3): Vector3 {\r\n // Midpoints\r\n const mid12 = Vector3.scale(Vector3.add(p1, p2, new Vector3()), 0.5, new Vector3());\r\n const mid23 = Vector3.scale(Vector3.add(p2, p3, new Vector3()), 0.5, new Vector3());\r\n\r\n // Direction vectors\r\n const dir12 = Vector3.sub(p2, p1, new Vector3());\r\n const dir23 = Vector3.sub(p3, p2, new Vector3());\r\n\r\n // Normal vectors (perpendicular bisectors)\r\n // For 3D, we need to find perpendiculars in the plane of the three points\r\n const normal = Vector3.cross(dir12, dir23, new Vector3());\r\n\r\n if (normal.magnitudeSq < 0.0001) {\r\n // Points are collinear, return midpoint\r\n return Vector3.scale(\r\n Vector3.add(Vector3.add(p1, p2, new Vector3()), p3, new Vector3()),\r\n 1.0 / 3.0,\r\n new Vector3()\r\n );\r\n }\r\n\r\n normal.inplaceNormalize();\r\n\r\n // Perpendicular to dir12 in the plane\r\n const perp12 = Vector3.cross(dir12, normal, new Vector3()).inplaceNormalize();\r\n\r\n // Perpendicular to dir23 in the plane\r\n const perp23 = Vector3.cross(dir23, normal, new Vector3()).inplaceNormalize();\r\n\r\n // Find intersection of two lines:\r\n // Line 1: mid12 + t * perp12\r\n // Line 2: mid23 + s * perp23\r\n // Solve: mid12 + t * perp12 = mid23 + s * perp23\r\n\r\n const diff = Vector3.sub(mid23, mid12, new Vector3());\r\n\r\n // Use 2D projection for simplicity (project onto plane perpendicular to normal)\r\n // Solve in the plane: t * perp12 - s * perp23 = diff\r\n // Use least squares or pick the dominant components\r\n\r\n const det = perp12.x * perp23.y - perp12.y * perp23.x;\r\n\r\n if (Math.abs(det) > 0.0001) {\r\n const t = (diff.x * perp23.y - diff.y * perp23.x) / det;\r\n const center = Vector3.add(mid12, Vector3.scale(perp12, t, new Vector3()), new Vector3());\r\n return center;\r\n }\r\n\r\n // Fallback: use centroid\r\n return Vector3.scale(\r\n Vector3.add(Vector3.add(p1, p2, new Vector3()), p3, new Vector3()),\r\n 1.0 / 3.0,\r\n new Vector3()\r\n );\r\n }\r\n\r\n /**\r\n * Calculates inertial acceleration for a particle in a rotating reference frame\r\n */\r\n private calculateInertialAcceleration(\r\n particle: any,\r\n rotationCenter: Vector3,\r\n angularVelocity: Vector3,\r\n particleVelocity: Vector3,\r\n centrifugalScale: number,\r\n coriolisScale: number\r\n ): Vector3 {\r\n // Vector from rotation center to particle\r\n const r = Vector3.sub(particle.position, rotationCenter, new Vector3());\r\n\r\n // Centrifugal acceleration: a_centrifugal = ω × (ω × r)\r\n const omegaCrossR = Vector3.cross(angularVelocity, r, new Vector3());\r\n const centrifugalAccel = Vector3.cross(angularVelocity, omegaCrossR, new Vector3());\r\n centrifugalAccel.scaleBy(centrifugalScale);\r\n\r\n // Coriolis acceleration: a_coriolis = -2ω × v_relative\r\n // v_relative is the particle's velocity in the rotating frame\r\n // Use the velocity passed in (already calculated from prevPosition)\r\n const coriolisAccel = Vector3.cross(angularVelocity, particleVelocity, new Vector3());\r\n coriolisAccel.scaleBy(-2.0 * coriolisScale);\r\n\r\n // Total inertial acceleration\r\n const totalAccel = Vector3.add(centrifugalAccel, coriolisAccel, new Vector3());\r\n return totalAccel;\r\n }\r\n\r\n /**\r\n * Solves a single spring constraint using XPBD (Extended Position-Based Dynamics).\r\n *\r\n * Reference: Müller et al., \"Detailed Rigid Body Simulation with Extended Position Based Dynamics\", 2020.\r\n */\r\n private solveConstraintXPBD(constraint: any, dt: number): void {\r\n const pA = this._chain.particles[constraint.particleA];\r\n const pB = this._chain.particles[constraint.particleB];\r\n\r\n const wA = pA.fixed ? 0 : 1.0 / pA.mass;\r\n const wB = pB.fixed ? 0 : 1.0 / pB.mass;\r\n const wSum = wA + wB;\r\n if (wSum < 1e-10) {\r\n return;\r\n }\r\n\r\n const delta = Vector3.sub(pB.position, pA.position, new Vector3());\r\n const currentLength = delta.magnitude;\r\n if (currentLength < 0.0001) {\r\n return;\r\n }\r\n\r\n // Constraint value C = currentLength - restLength\r\n const C = currentLength - constraint.restLength;\r\n\r\n // Scaled compliance: alphaTilde = compliance / dt^2\r\n const alphaTilde = constraint.compliance / (dt * dt);\r\n\r\n // XPBD Lagrange multiplier update\r\n const deltaLambda = (-C - alphaTilde * constraint.lambda) / (wSum + alphaTilde);\r\n constraint.lambda += deltaLambda;\r\n\r\n // Correction direction (unit vector from A to B)\r\n const n = Vector3.scale(delta, 1.0 / currentLength, new Vector3());\r\n\r\n if (!pA.fixed) {\r\n // deltaX_a = -w_a * deltaLambda * n\r\n const correction = Vector3.scale(n, -wA * deltaLambda, new Vector3());\r\n Vector3.add(pA.position, correction, pA.position);\r\n if (this._motionModel === 'kawaii') {\r\n Vector3.add(\r\n pA.prevPosition,\r\n Vector3.scale(correction, this._constraintVelocityHistoryRetention, new Vector3()),\r\n pA.prevPosition\r\n );\r\n }\r\n }\r\n if (!pB.fixed) {\r\n // deltaX_b = +w_b * deltaLambda * n\r\n const correction = Vector3.scale(n, wB * deltaLambda, new Vector3());\r\n Vector3.add(pB.position, correction, pB.position);\r\n if (this._motionModel === 'kawaii') {\r\n Vector3.add(\r\n pB.prevPosition,\r\n Vector3.scale(correction, this._constraintVelocityHistoryRetention, new Vector3()),\r\n pB.prevPosition\r\n );\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Solves a single spring constraint (Verlet / PBD)\r\n */\r\n private solveConstraint(constraint: any): void {\r\n const pA = this._chain.particles[constraint.particleA];\r\n const pB = this._chain.particles[constraint.particleB];\r\n\r\n if (this._motionModel === 'kawaii') {\r\n solveDistanceConstraint(pA, pB, constraint.restLength, constraint.stiffness);\r\n return;\r\n }\r\n\r\n // Calculate current distance\r\n const delta = Vector3.sub(pB.position, pA.position, new Vector3());\r\n const currentLength = delta.magnitude;\r\n\r\n if (currentLength < 0.0001) {\r\n return;\r\n } // Avoid division by zero\r\n\r\n // Calculate correction\r\n const diff = (currentLength - constraint.restLength) / currentLength;\r\n const correction = Vector3.scale(delta, diff * constraint.stiffness * 0.5, new Vector3());\r\n\r\n // Apply correction (considering mass and fixed state)\r\n if (!pA.fixed) {\r\n Vector3.add(pA.position, correction, pA.position);\r\n }\r\n if (!pB.fixed) {\r\n Vector3.sub(pB.position, correction, pB.position);\r\n }\r\n }\r\n\r\n /**\r\n * Solves collisions for all particles\r\n */\r\n private solveCollisions(deltaTime: number, blendOverride?: number): void {\r\n // Update dynamic colliders from their nodes\r\n const blend = blendOverride ?? this.getTemporalBlendFactor(deltaTime, DEFAULT_COLLIDER_SMOOTHING_TIME);\r\n const spheres: { particleCollider: SphereCollider; collider: SphereCollider }[] = [];\r\n const capsules: { particleCollider: CapsuleCollider; collider: CapsuleCollider }[] = [];\r\n const planes: { particleCollider: PlaneCollider; collider: PlaneCollider }[] = [];\r\n const boxes: { particleCollider: BoxCollider; collider: BoxCollider }[] = [];\r\n for (const collider of this._colliders) {\r\n if (collider.node) {\r\n updateColliderFromNode(collider);\r\n }\r\n if (!collider.enabled) {\r\n continue;\r\n }\r\n switch (collider.type) {\r\n case 'sphere': {\r\n const source = collider as SphereCollider;\r\n spheres.push({\r\n particleCollider: source,\r\n collider: {\r\n ...source,\r\n center: this.getSmoothedSphereCenter(source, blend)\r\n }\r\n });\r\n break;\r\n }\r\n case 'capsule': {\r\n const source = collider as CapsuleCollider;\r\n const endpoints = this.getSmoothedCapsuleEndpoints(source, blend);\r\n capsules.push({\r\n particleCollider: source,\r\n collider: {\r\n ...source,\r\n start: endpoints.start,\r\n end: endpoints.end\r\n }\r\n });\r\n break;\r\n }\r\n case 'plane': {\r\n const source = collider as PlaneCollider;\r\n const plane = this.getSmoothedPlaneData(source, blend);\r\n planes.push({\r\n particleCollider: source,\r\n collider: {\r\n ...source,\r\n point: plane.point,\r\n normal: plane.normal\r\n }\r\n });\r\n break;\r\n }\r\n case 'box': {\r\n const source = collider as BoxCollider;\r\n boxes.push({\r\n particleCollider: source,\r\n collider: { ...source, ...this.getSmoothedBoxData(source, blend) }\r\n });\r\n break;\r\n }\r\n }\r\n }\r\n\r\n // Check each particle against all colliders\r\n for (const particle of this._chain.particles) {\r\n if (particle.fixed) {\r\n continue; // Skip fixed particles\r\n }\r\n\r\n for (const collider of spheres) {\r\n if (this._motionModel === 'kawaii') {\r\n resolveInelasticCollision(\r\n particle,\r\n collider.collider,\r\n resolveSphereCollision,\r\n this.getInitialCollisionPenetration(\r\n particle,\r\n collider.particleCollider,\r\n collider.collider,\r\n resolveSphereCollision\r\n )\r\n );\r\n } else {\r\n resolveSphereCollision(particle.position, collider.collider, particle.collisionRadius);\r\n }\r\n }\r\n for (const collider of capsules) {\r\n if (this._motionModel === 'kawaii') {\r\n resolveInelasticCollision(\r\n particle,\r\n collider.collider,\r\n resolveCapsuleCollision,\r\n this.getInitialCollisionPenetration(\r\n particle,\r\n collider.particleCollider,\r\n collider.collider,\r\n resolveCapsuleCollision\r\n )\r\n );\r\n } else {\r\n resolveCapsuleCollision(particle.position, collider.collider, particle.collisionRadius);\r\n }\r\n }\r\n for (const collider of planes) {\r\n if (this._motionModel === 'kawaii') {\r\n resolveInelasticCollision(\r\n particle,\r\n collider.collider,\r\n resolvePlaneCollision,\r\n this.getInitialCollisionPenetration(\r\n particle,\r\n collider.particleCollider,\r\n collider.collider,\r\n resolvePlaneCollision\r\n )\r\n );\r\n } else {\r\n resolvePlaneCollision(particle.position, collider.collider, particle.collisionRadius);\r\n }\r\n }\r\n for (const collider of boxes) {\r\n if (this._motionModel === 'kawaii') {\r\n resolveInelasticCollision(\r\n particle,\r\n collider.collider,\r\n resolveBoxCollision,\r\n this.getInitialCollisionPenetration(\r\n particle,\r\n collider.particleCollider,\r\n collider.collider,\r\n resolveBoxCollision\r\n )\r\n );\r\n } else {\r\n resolveBoxCollision(particle.position, collider.collider, particle.collisionRadius);\r\n }\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Applies simulation results to scene nodes\r\n * @param weight - Blend weight [0-1] (default: 1.0)\r\n */\r\n applyToNodes(weight: number = 1.0): void {\r\n for (let i = 0; i < this._chain.particles.length - 1; i++) {\r\n const particle = this._chain.particles[i];\r\n const nextParticle = this._chain.particles[i + 1];\r\n const node = particle.node;\r\n\r\n // Skip if no node\r\n if (!node) {\r\n continue;\r\n }\r\n\r\n // Get current bone direction from node's world matrix (before physics)\r\n // This reflects the current animation/skeleton state\r\n const currentBonePos = new Vector3(node.worldMatrix.m03, node.worldMatrix.m13, node.worldMatrix.m23);\r\n\r\n const nextNode = nextParticle.node;\r\n if (!nextNode) {\r\n continue;\r\n }\r\n\r\n const nextBonePos = new Vector3(\r\n nextNode.worldMatrix.m03,\r\n nextNode.worldMatrix.m13,\r\n nextNode.worldMatrix.m23\r\n );\r\n const originalDir = Vector3.sub(nextBonePos, currentBonePos, new Vector3());\r\n\r\n // Get current bone rotation from node's world matrix\r\n const currentBoneRotation = new Quaternion();\r\n node.worldMatrix.decompose(null, currentBoneRotation, null);\r\n\r\n // Calculate new direction from physics simulation\r\n const newDir = Vector3.sub(nextParticle.position, particle.position, new Vector3());\r\n\r\n // Calculate rotation needed to align original direction to new direction\r\n const deltaRotation = new Quaternion();\r\n IKUtils.fromToRotation(originalDir, newDir, deltaRotation);\r\n\r\n // Calculate new world rotation\r\n let worldRotation = Quaternion.multiply(deltaRotation, currentBoneRotation, new Quaternion());\r\n\r\n // Blend with current rotation based on weight\r\n if (weight < 1) {\r\n Quaternion.slerp(currentBoneRotation, worldRotation, weight, worldRotation);\r\n }\r\n\r\n // Convert world rotation to local rotation (relative to parent)\r\n const parent = node.parent;\r\n const inputRotation = node.rotation.clone();\r\n if (parent) {\r\n const parentWorldRotation = new Quaternion();\r\n parent.worldMatrix.decompose(null, parentWorldRotation, null);\r\n\r\n // localRotation = conjugate(parentWorldRotation) * worldRotation\r\n const parentInvRotation = Quaternion.conjugate(parentWorldRotation, new Quaternion());\r\n const localRotation = Quaternion.multiply(parentInvRotation, worldRotation, new Quaternion());\r\n\r\n node.rotation = localRotation;\r\n this._nodePoseTracker.recordAppliedRotation(node, inputRotation, localRotation);\r\n } else {\r\n // Root node has no parent, world rotation is local rotation\r\n node.rotation = worldRotation;\r\n this._nodePoseTracker.recordAppliedRotation(node, inputRotation, worldRotation);\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Resets the simulation to initial state\r\n */\r\n reset(): void {\r\n this._nodePoseTracker.clear(true);\r\n this._chain.reset();\r\n for (const particle of this._chain.particles) {\r\n particle.animPosition.set(particle.originalPosition);\r\n particle.lastFramePosition.set(particle.originalPosition);\r\n if (particle.positionHistory) {\r\n particle.positionHistory.length = 0;\r\n }\r\n }\r\n this._timeAccumulator = 0;\r\n this._smoothedParticleTargets = new WeakMap();\r\n this._smoothedSphereCenters = new WeakMap();\r\n this._smoothedCapsuleEndpoints = new WeakMap();\r\n this._smoothedPlaneData = new WeakMap();\r\n this._smoothedBoxData = new WeakMap();\r\n this._initialCollisionPenetrationElapsed = 0;\r\n this._initialCollisionPenetration = new WeakMap();\r\n }\r\n\r\n /**\r\n * Gets the spring chain\r\n */\r\n get chain(): SpringChain {\r\n return this._chain;\r\n }\r\n\r\n /**\r\n * Gets the current gravity\r\n */\r\n get gravity(): Vector3 {\r\n return this._gravity;\r\n }\r\n\r\n set gravity(gravity: Vector3) {\r\n this._gravity.set(gravity);\r\n }\r\n\r\n /**\r\n * Gets the current wind\r\n */\r\n get wind(): Vector3 {\r\n return this._wind;\r\n }\r\n\r\n set wind(wind: Vector3) {\r\n this._wind.set(wind);\r\n }\r\n\r\n /**\r\n * Gets the number of iterations\r\n */\r\n get iterations(): number {\r\n return this._iterations;\r\n }\r\n\r\n set iterations(count: number) {\r\n this._iterations = Math.max(1, count);\r\n }\r\n\r\n /**\r\n * Gets whether inertial forces are enabled\r\n */\r\n get enableInertialForces(): boolean {\r\n return this._enableInertialForces;\r\n }\r\n\r\n set enableInertialForces(enabled: boolean) {\r\n this._enableInertialForces = enabled;\r\n }\r\n\r\n /**\r\n * Gets the centrifugal force scale\r\n */\r\n get centrifugalScale(): number {\r\n return this._centrifugalScale;\r\n }\r\n\r\n set centrifugalScale(scale: number) {\r\n this._centrifugalScale = Math.max(0, scale);\r\n }\r\n\r\n /**\r\n * Gets the Coriolis force scale\r\n */\r\n get coriolisScale(): number {\r\n return this._coriolisScale;\r\n }\r\n\r\n set coriolisScale(scale: number) {\r\n this._coriolisScale = Math.max(0, scale);\r\n }\r\n\r\n /**\r\n * Gets the constraint solver type\r\n */\r\n get solver(): 'verlet' | 'xpbd' {\r\n return this._solver;\r\n }\r\n\r\n set solver(type: 'verlet' | 'xpbd') {\r\n if (this._solver !== type) {\r\n this._solver = type;\r\n if (type === 'xpbd') {\r\n for (const c of this._chain.constraints) {\r\n c.lambda = 0;\r\n }\r\n }\r\n }\r\n }\r\n\r\n get motionModel(): SpringMotionModel {\r\n return this._motionModel;\r\n }\r\n\r\n set motionModel(value: SpringMotionModel) {\r\n if (value !== 'legacy' && value !== 'kawaii') {\r\n return;\r\n }\r\n if (this._motionModel !== value) {\r\n this._motionModel = value;\r\n this.reset();\r\n }\r\n }\r\n\r\n get angleLimitRoot(): number {\r\n return this._angleLimitRoot;\r\n }\r\n\r\n set angleLimitRoot(value: number) {\r\n this._angleLimitRoot = Math.max(0, Number(value) || 0);\r\n }\r\n\r\n get angleLimitTip(): number {\r\n return this._angleLimitTip;\r\n }\r\n\r\n set angleLimitTip(value: number) {\r\n this._angleLimitTip = Math.max(0, Number(value) || 0);\r\n }\r\n\r\n get constraintVelocityHistoryRetention(): number {\r\n return this._constraintVelocityHistoryRetention;\r\n }\r\n\r\n set constraintVelocityHistoryRetention(value: number) {\r\n this._constraintVelocityHistoryRetention = Math.max(0, Math.min(1, Number(value) || 0));\r\n }\r\n\r\n get preserveInitialCollisionPenetration(): boolean {\r\n return this._preserveInitialCollisionPenetration;\r\n }\r\n\r\n set preserveInitialCollisionPenetration(value: boolean) {\r\n if (this._preserveInitialCollisionPenetration !== value) {\r\n this._preserveInitialCollisionPenetration = value;\r\n this._initialCollisionPenetrationElapsed = 0;\r\n this._initialCollisionPenetration = new WeakMap();\r\n }\r\n }\r\n\r\n get initialCollisionPenetrationReleaseTime(): number {\r\n return this._initialCollisionPenetrationReleaseTime;\r\n }\r\n\r\n set initialCollisionPenetrationReleaseTime(value: number) {\r\n const duration = Math.max(0, Number(value) || 0);\r\n if (this._initialCollisionPenetrationReleaseTime !== duration) {\r\n this._initialCollisionPenetrationReleaseTime = duration;\r\n this._initialCollisionPenetrationElapsed = 0;\r\n this._initialCollisionPenetration = new WeakMap();\r\n }\r\n }\r\n\r\n /**\r\n * Gets pose preservation strength [0-1]\r\n */\r\n get poseFollow(): number {\r\n return this._poseFollow;\r\n }\r\n\r\n set poseFollow(value: number) {\r\n const v = Math.max(0, Math.min(1, value));\r\n this._poseFollow = v;\r\n this._poseFollowRoot = v;\r\n this._poseFollowTip = v;\r\n }\r\n\r\n /**\r\n * Gets max allowed deviation from animated pose\r\n */\r\n get maxPoseOffset(): number {\r\n return this._maxPoseOffset;\r\n }\r\n\r\n set maxPoseOffset(value: number) {\r\n const v = Math.max(0, value);\r\n this._maxPoseOffset = v;\r\n this._maxPoseOffsetRoot = v;\r\n this._maxPoseOffsetTip = v;\r\n }\r\n\r\n /**\r\n * Gets root pose follow strength [0-1]\r\n */\r\n get poseFollowRoot(): number {\r\n return this._poseFollowRoot;\r\n }\r\n\r\n set poseFollowRoot(value: number) {\r\n this._poseFollowRoot = Math.max(0, Math.min(1, value));\r\n }\r\n\r\n /**\r\n * Gets tip pose follow strength [0-1]\r\n */\r\n get poseFollowTip(): number {\r\n return this._poseFollowTip;\r\n }\r\n\r\n set poseFollowTip(value: number) {\r\n this._poseFollowTip = Math.max(0, Math.min(1, value));\r\n }\r\n\r\n /**\r\n * Gets exponent for root-to-tip interpolation\r\n */\r\n get poseFollowExponent(): number {\r\n return this._poseFollowExponent;\r\n }\r\n\r\n set poseFollowExponent(value: number) {\r\n this._poseFollowExponent = Math.max(0.1, value);\r\n }\r\n\r\n /**\r\n * Gets root max allowed deviation from animated pose\r\n */\r\n get maxPoseOffsetRoot(): number {\r\n return this._maxPoseOffsetRoot;\r\n }\r\n\r\n set maxPoseOffsetRoot(value: number) {\r\n this._maxPoseOffsetRoot = Math.max(0, value);\r\n }\r\n\r\n /**\r\n * Gets tip max allowed deviation from animated pose\r\n */\r\n get maxPoseOffsetTip(): number {\r\n return this._maxPoseOffsetTip;\r\n }\r\n\r\n set maxPoseOffsetTip(value: number) {\r\n this._maxPoseOffsetTip = Math.max(0, value);\r\n }\r\n\r\n /**\r\n * Adds a collider to the system\r\n */\r\n addCollider(collider: SpringCollider): void {\r\n this._colliders.push(collider);\r\n this._smoothedSphereCenters = new WeakMap();\r\n this._smoothedCapsuleEndpoints = new WeakMap();\r\n this._smoothedPlaneData = new WeakMap();\r\n this._smoothedBoxData = new WeakMap();\r\n this._initialCollisionPenetrationElapsed = 0;\r\n this._initialCollisionPenetration = new WeakMap();\r\n }\r\n\r\n /**\r\n * Removes a collider from the system\r\n */\r\n removeCollider(collider: SpringCollider): boolean {\r\n const index = this._colliders.indexOf(collider);\r\n if (index >= 0) {\r\n this._colliders.splice(index, 1);\r\n this._smoothedSphereCenters = new WeakMap();\r\n this._smoothedCapsuleEndpoints = new WeakMap();\r\n this._smoothedPlaneData = new WeakMap();\r\n this._smoothedBoxData = new WeakMap();\r\n this._initialCollisionPenetrationElapsed = 0;\r\n this._initialCollisionPenetration = new WeakMap();\r\n return true;\r\n }\r\n return false;\r\n }\r\n\r\n /**\r\n * Clears all colliders\r\n */\r\n clearColliders(): void {\r\n this._colliders = [];\r\n this._smoothedSphereCenters = new WeakMap();\r\n this._smoothedCapsuleEndpoints = new WeakMap();\r\n this._smoothedPlaneData = new WeakMap();\r\n this._smoothedBoxData = new WeakMap();\r\n this._initialCollisionPenetrationElapsed = 0;\r\n this._initialCollisionPenetration = new WeakMap();\r\n }\r\n\r\n /**\r\n * Gets all colliders\r\n */\r\n get colliders(): SpringCollider[] {\r\n return this._colliders;\r\n }\r\n\r\n private getInitialCollisionPenetration<TCollider extends SpringCollider>(\r\n particle: SpringParticle,\r\n sourceCollider: SpringCollider,\r\n collider: TCollider,\r\n resolveCollision: (position: Vector3, collider: TCollider) => boolean\r\n ): number {\r\n if (!this._preserveInitialCollisionPenetration) {\r\n return 0;\r\n }\r\n let particlePenetrations = this._initialCollisionPenetration.get(particle);\r\n if (!particlePenetrations) {\r\n particlePenetrations = new WeakMap();\r\n this._initialCollisionPenetration.set(particle, particlePenetrations);\r\n }\r\n let penetration = particlePenetrations.get(sourceCollider);\r\n if (penetration === undefined) {\r\n penetration =\r\n measureCollisionPenetration(\r\n particle.animPosition,\r\n collider,\r\n resolveCollision,\r\n particle.collisionRadius\r\n ) + INITIAL_COLLISION_PENETRATION_SLOP;\r\n particlePenetrations.set(sourceCollider, penetration);\r\n }\r\n return getReleasedCollisionPenetration(\r\n penetration,\r\n this._initialCollisionPenetrationElapsed,\r\n this._initialCollisionPenetrationReleaseTime\r\n );\r\n }\r\n\r\n private advanceInitialCollisionPenetrationRelease(deltaTime: number): void {\r\n if (!this._preserveInitialCollisionPenetration) {\r\n return;\r\n }\r\n this._initialCollisionPenetrationElapsed = Math.min(\r\n this._initialCollisionPenetrationReleaseTime,\r\n this._initialCollisionPenetrationElapsed + Math.max(0, deltaTime)\r\n );\r\n }\r\n\r\n private getTemporalBlendFactor(deltaTime: number, smoothingTime: number): number {\r\n const dt = Math.min(Math.max(Number(deltaTime) || 0, 0), MAX_ACCUMULATED_SIMULATION_TIME);\r\n if (smoothingTime <= 0) {\r\n return 1;\r\n }\r\n if (dt <= 0) {\r\n return 0;\r\n }\r\n return 1 - Math.exp(-dt / smoothingTime);\r\n }\r\n\r\n private getSmoothedParticleTarget(target: object, current: Vector3, blend: number): Vector3 {\r\n const cached = this._smoothedParticleTargets.get(target);\r\n if (!cached || blend >= 1) {\r\n const next = current.clone();\r\n this._smoothedParticleTargets.set(target, next);\r\n return next;\r\n }\r\n cached.setXYZ(\r\n cached.x + (current.x - cached.x) * blend,\r\n cached.y + (current.y - cached.y) * blend,\r\n cached.z + (current.z - cached.z) * blend\r\n );\r\n return cached;\r\n }\r\n\r\n private getSmoothedSphereCenter(collider: SphereCollider, blend: number): Vector3 {\r\n const current = collider.center?.clone() ?? new Vector3();\r\n const cached = this._smoothedSphereCenters.get(collider);\r\n if (!cached || blend >= 1) {\r\n this._smoothedSphereCenters.set(collider, current);\r\n return current;\r\n }\r\n cached.setXYZ(\r\n cached.x + (current.x - cached.x) * blend,\r\n cached.y + (current.y - cached.y) * blend,\r\n cached.z + (current.z - cached.z) * blend\r\n );\r\n return cached;\r\n }\r\n\r\n private getSmoothedCapsuleEndpoints(\r\n collider: CapsuleCollider,\r\n blend: number\r\n ): { start: Vector3; end: Vector3 } {\r\n const currentStart = collider.start?.clone() ?? new Vector3();\r\n const currentEnd = collider.end?.clone() ?? new Vector3();\r\n const cached = this._smoothedCapsuleEndpoints.get(collider);\r\n if (!cached || blend >= 1) {\r\n const next = {\r\n start: currentStart,\r\n end: currentEnd\r\n };\r\n this._smoothedCapsuleEndpoints.set(collider, next);\r\n return next;\r\n }\r\n cached.start.setXYZ(\r\n cached.start.x + (currentStart.x - cached.start.x) * blend,\r\n cached.start.y + (currentStart.y - cached.start.y) * blend,\r\n cached.start.z + (currentStart.z - cached.start.z) * blend\r\n );\r\n cached.end.setXYZ(\r\n cached.end.x + (currentEnd.x - cached.end.x) * blend,\r\n cached.end.y + (currentEnd.y - cached.end.y) * blend,\r\n cached.end.z + (currentEnd.z - cached.end.z) * blend\r\n );\r\n return cached;\r\n }\r\n\r\n private getSmoothedPlaneData(collider: PlaneCollider, blend: number): { point: Vector3; normal: Vector3 } {\r\n const currentPoint = collider.point?.clone() ?? new Vector3();\r\n const currentNormal = collider.normal?.clone() ?? Vector3.axisPY();\r\n if (currentNormal.magnitudeSq > 1e-8) {\r\n currentNormal.inplaceNormalize();\r\n } else {\r\n currentNormal.setXYZ(0, 1, 0);\r\n }\r\n const cached = this._smoothedPlaneData.get(collider);\r\n if (!cached || blend >= 1) {\r\n const next = {\r\n point: currentPoint,\r\n normal: currentNormal\r\n };\r\n this._smoothedPlaneData.set(collider, next);\r\n return next;\r\n }\r\n cached.point.setXYZ(\r\n cached.point.x + (currentPoint.x - cached.point.x) * blend,\r\n cached.point.y + (currentPoint.y - cached.point.y) * blend,\r\n cached.point.z + (currentPoint.z - cached.point.z) * blend\r\n );\r\n cached.normal.setXYZ(\r\n cached.normal.x + (currentNormal.x - cached.normal.x) * blend,\r\n cached.normal.y + (currentNormal.y - cached.normal.y) * blend,\r\n cached.normal.z + (currentNormal.z - cached.normal.z) * blend\r\n );\r\n if (cached.normal.magnitudeSq > 1e-8) {\r\n cached.normal.inplaceNormalize();\r\n } else {\r\n cached.normal.setXYZ(0, 1, 0);\r\n }\r\n return cached;\r\n }\r\n\r\n private getSmoothedBoxData(\r\n collider: BoxCollider,\r\n blend: number\r\n ): { center: Vector3; halfExtents: Vector3; axes: [Vector3, Vector3, Vector3] } {\r\n const current = {\r\n center: collider.center.clone(),\r\n halfExtents: collider.halfExtents.clone(),\r\n axes: collider.axes.map((axis) => axis.clone()) as [Vector3, Vector3, Vector3]\r\n };\r\n const cached = this._smoothedBoxData.get(collider);\r\n if (!cached || blend >= 1) {\r\n this._smoothedBoxData.set(collider, current);\r\n return current;\r\n }\r\n Vector3.lerp(cached.center, current.center, blend, cached.center);\r\n Vector3.lerp(cached.halfExtents, current.halfExtents, blend, cached.halfExtents);\r\n for (let i = 0; i < 3; i++) {\r\n Vector3.lerp(cached.axes[i], current.axes[i], blend, cached.axes[i]);\r\n cached.axes[i].inplaceNormalize();\r\n }\r\n return cached;\r\n }\r\n}\r\n"],"names":["FIXED_SIMULATION_TIME_STEP","MAX_ACCUMULATED_SIMULATION_TIME","MAX_SIMULATION_STEPS_PER_UPDATE","Math","max","ceil","DEFAULT_PARTICLE_TARGET_SMOOTHING_TIME","DEFAULT_COLLIDER_SMOOTHING_TIME","SpringSystem","_chain","_iterations","_gravity","_wind","_enableInertialForces","_centrifugalScale","_coriolisScale","_colliders","_solver","_poseFollow","_maxPoseOffset","_poseFollowRoot","_poseFollowTip","_poseFollowExponent","_maxPoseOffsetRoot","_maxPoseOffsetTip","_timeAccumulator","_smoothedParticleTargets","_smoothedSphereCenters","_smoothedCapsuleEndpoints","_smoothedPlaneData","_smoothedBoxData","_nodePoseTracker","_motionModel","_angleLimitRoot","_angleLimitTip","_constraintVelocityHistoryRetention","_preserveInitialCollisionPenetration","_initialCollisionPenetrationReleaseTime","_initialCollisionPenetrationElapsed","_initialCollisionPenetration","chain","options","iterations","gravity","clone","Vector3","wind","enableInertialForces","centrifugalScale","coriolisScale","solver","min","poseFollow","maxPoseOffset","poseFollowRoot","poseFollowTip","poseFollowExponent","maxPoseOffsetRoot","maxPoseOffsetTip","WeakMap","SpringNodePoseTracker","motionModel","angleLimitRoot","angleLimitTip","constraintVelocityHistoryRetention","preserveInitialCollisionPenetration","initialCollisionPenetrationReleaseTime","DEFAULT_INITIAL_COLLISION_PENETRATION_RELEASE_TIME","update","deltaTime","restoreInputPose","frameDt","Number","stepCount","floor","i","simulateStep","dt","inputDeltaTime","stepIndex","p","particles","lastFramePosition","set","position","substepBlend","updateFixedParticles","rotationCenter","angularVelocity","result","calculateGlobalRotation","center","omega","length","fixed","velocity","sub","prevPosition","scaleBy","damping","acceleration","add","inertialAccel","calculateInertialAcceleration","positionDelta","scale","constraint","constraints","lambda","solvePosePreservation","iter","reverse","constraintIndex","solveConstraintXPBD","solveConstraint","solveCollisions","solveAngleLimits","closureIterations","iteration","some","collider","enabled","contactClosureIterations","advanceInitialCollisionPenetrationRelease","blend","getTemporalBlendFactor","particle","sourceNode","anchorNode","node","worldPos","anchorOffset","worldMatrix","transformPointAffine","m03","m13","m23","smoothedTarget","getSmoothedParticleTarget","animPosition","positionHistory","push","shift","totalIterations","parentRelative","topology","getSpringPoseTopology","t","pow","normalizedDistance","particlePoseFollow","lerp","iterationFollow","getIterationStrength","poseTarget","getKawaiiPoseTarget","toAnim","correction","particleMaxPoseOffset","offset","offsetLen","magnitude","limit","interpolateSpringValue","solveAngleLimit","a","b","fixedParticles","velocities","magnitudeSq","estimateRotationCenterFromHistory","sumOmega","count","r","v","rLengthSq","cross","currentVelocity","history","speed","estimatedRadius","up","perpDir","inplaceNormalize","p1","p2","p3","calculateCircleCenter","mid12","mid23","dir12","dir23","normal","perp12","perp23","diff","det","x","y","abs","particleVelocity","omegaCrossR","centrifugalAccel","coriolisAccel","totalAccel","pA","particleA","pB","particleB","wA","mass","wB","wSum","delta","currentLength","C","restLength","alphaTilde","compliance","deltaLambda","n","solveDistanceConstraint","stiffness","blendOverride","spheres","capsules","planes","boxes","updateColliderFromNode","type","source","particleCollider","getSmoothedSphereCenter","endpoints","getSmoothedCapsuleEndpoints","start","end","plane","getSmoothedPlaneData","point","getSmoothedBoxData","resolveInelasticCollision","resolveSphereCollision","getInitialCollisionPenetration","collisionRadius","resolveCapsuleCollision","resolvePlaneCollision","resolveBoxCollision","applyToNodes","weight","nextParticle","currentBonePos","nextNode","nextBonePos","originalDir","currentBoneRotation","Quaternion","decompose","newDir","deltaRotation","IKUtils","fromToRotation","worldRotation","multiply","slerp","parent","inputRotation","rotation","parentWorldRotation","parentInvRotation","conjugate","localRotation","recordAppliedRotation","reset","clear","originalPosition","c","value","duration","addCollider","removeCollider","index","indexOf","splice","clearColliders","colliders","sourceCollider","resolveCollision","particlePenetrations","get","penetration","undefined","measureCollisionPenetration","INITIAL_COLLISION_PENETRATION_SLOP","getReleasedCollisionPenetration","smoothingTime","exp","target","current","cached","next","setXYZ","z","currentStart","currentEnd","currentPoint","currentNormal","axisPY","halfExtents","axes","map","axis"],"mappings":"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"}
@@ -13,16 +13,21 @@ import { SkeletonModifier } from './skeleton_modifier.js';
13
13
  _springSystem;
14
14
  _weight;
15
15
  _sourceId;
16
+ _startupDelay;
17
+ _startupDelayRemaining;
16
18
  /**
17
19
  * Create a spring post-processor.
18
20
  *
19
21
  * @param springSystem - The spring system to integrate
20
22
  * @param weight - Blend weight [0-1] (default: 1.0)
21
- */ constructor(springSystem, weight = 1.0){
23
+ * @param startupDelay - Seconds spent following the animated pose before simulation starts (default: 0.1)
24
+ */ constructor(springSystem, weight = 1.0, startupDelay = 0.1){
22
25
  super();
23
26
  this._weight = weight;
24
27
  this._springSystem = springSystem;
25
28
  this._sourceId = '';
29
+ this._startupDelay = Math.max(0, Number(startupDelay) || 0);
30
+ this._startupDelayRemaining = this._startupDelay;
26
31
  }
27
32
  /**
28
33
  * Get the spring system.
@@ -43,6 +48,10 @@ import { SkeletonModifier } from './skeleton_modifier.js';
43
48
  if (!this._enabled || this._weight <= 0) {
44
49
  return;
45
50
  }
51
+ if (this._startupDelayRemaining > 0 && this.reinitializeFromCurrentPose()) {
52
+ this._startupDelayRemaining = Math.max(0, this._startupDelayRemaining - Math.max(0, Number(deltaTime) || 0));
53
+ return;
54
+ }
46
55
  // Update spring physics simulation
47
56
  this._springSystem.update(deltaTime);
48
57
  // Apply results to scene nodes with blending
@@ -52,6 +61,16 @@ import { SkeletonModifier } from './skeleton_modifier.js';
52
61
  * Reset the spring system to initial state.
53
62
  */ reset() {
54
63
  this._springSystem.reset();
64
+ this._startupDelayRemaining = this._startupDelay;
65
+ }
66
+ /** Restarts the pose-following startup window after a runtime hierarchy or binding change. */ restartSimulation(startupDelay = this._startupDelay) {
67
+ this._startupDelayRemaining = Math.max(0, Number(startupDelay) || 0);
68
+ }
69
+ get startupDelay() {
70
+ return this._startupDelay;
71
+ }
72
+ set startupDelay(value) {
73
+ this._startupDelay = Math.max(0, Number(value) || 0);
55
74
  }
56
75
  /**
57
76
  * Get the blend weight for this processor.
@@ -65,6 +84,18 @@ import { SkeletonModifier } from './skeleton_modifier.js';
65
84
  */ _setWeight(value) {
66
85
  this._weight = Math.max(0, Math.min(1, value));
67
86
  }
87
+ reinitializeFromCurrentPose() {
88
+ const system = this._springSystem;
89
+ if (typeof system.reinitializeFromCurrentPose !== 'function') {
90
+ this._startupDelayRemaining = 0;
91
+ return false;
92
+ }
93
+ system.reinitializeFromCurrentPose({
94
+ recomputeAnchorOffsets: true,
95
+ recalculateRestLengths: true
96
+ });
97
+ return true;
98
+ }
68
99
  }
69
100
 
70
101
  export { SpringModifier };
@@ -1 +1 @@
1
- {"version":3,"file":"spring_modifier.js","sources":["../../src/animation/spring_modifier.ts"],"sourcesContent":["import { SkeletonModifier } from './skeleton_modifier';\r\nimport type { SkeletonRig } from './skeleton';\r\nimport type { SpringSystem } from './spring/spring_system';\r\n\r\n/**\r\n * Post-processor wrapper for spring physics systems.\r\n *\r\n * Integrates spring-based physics simulation into the skeleton post-processing pipeline.\r\n * The spring system is updated each frame and results are blended with the base animation.\r\n *\r\n * @deprecated Use the new {@link JointDynamicsModifier} class instead.\r\n *\r\n * @public\r\n */\r\nexport class SpringModifier extends SkeletonModifier {\r\n private _springSystem: SpringSystem;\r\n private _weight: number;\r\n private _sourceId: string;\r\n\r\n /**\r\n * Create a spring post-processor.\r\n *\r\n * @param springSystem - The spring system to integrate\r\n * @param weight - Blend weight [0-1] (default: 1.0)\r\n */\r\n constructor(springSystem: SpringSystem, weight: number = 1.0) {\r\n super();\r\n this._weight = weight;\r\n this._springSystem = springSystem;\r\n this._sourceId = '';\r\n }\r\n\r\n /**\r\n * Get the spring system.\r\n */\r\n get springSystem(): SpringSystem {\r\n return this._springSystem;\r\n }\r\n\r\n /**\r\n * Get the identifier of the configuration that created this modifier.\r\n */\r\n get sourceId(): string {\r\n return this._sourceId;\r\n }\r\n\r\n set sourceId(value: string) {\r\n this._sourceId = value;\r\n }\r\n\r\n /**\r\n * Apply spring physics to skeleton joints.\r\n */\r\n apply(_skeleton: SkeletonRig, deltaTime: number): void {\r\n if (!this._enabled || this._weight <= 0) {\r\n return;\r\n }\r\n\r\n // Update spring physics simulation\r\n this._springSystem.update(deltaTime);\r\n\r\n // Apply results to scene nodes with blending\r\n this._springSystem.applyToNodes(this._weight);\r\n }\r\n\r\n /**\r\n * Reset the spring system to initial state.\r\n */\r\n reset(): void {\r\n this._springSystem.reset();\r\n }\r\n\r\n /**\r\n * Get the blend weight for this processor.\r\n * @returns The current blend weight (0-1)\r\n */\r\n protected _getWeight(): number {\r\n return this._weight;\r\n }\r\n\r\n /**\r\n * Set the blend weight for this processor.\r\n * @param value - New blend weight (0-1)\r\n */\r\n protected _setWeight(value: number): void {\r\n this._weight = Math.max(0, Math.min(1, value));\r\n }\r\n}\r\n"],"names":["SpringModifier","SkeletonModifier","_springSystem","_weight","_sourceId","springSystem","weight","sourceId","value","apply","_skeleton","deltaTime","_enabled","update","applyToNodes","reset","_setWeight","Math","max","min"],"mappings":";;AAIA;;;;;;;;;IAUO,MAAMA,cAAuBC,SAAAA,gBAAAA,CAAAA;IAC1BC,aAA4B;IAC5BC,OAAgB;IAChBC,SAAkB;AAE1B;;;;;AAKC,MACD,WAAYC,CAAAA,YAA0B,EAAEC,MAAAA,GAAiB,GAAG,CAAE;QAC5D,KAAK,EAAA;QACL,IAAI,CAACH,OAAO,GAAGG,MAAAA;QACf,IAAI,CAACJ,aAAa,GAAGG,YAAAA;QACrB,IAAI,CAACD,SAAS,GAAG,EAAA;AACnB;AAEA;;AAEC,MACD,IAAIC,YAA6B,GAAA;QAC/B,OAAO,IAAI,CAACH,aAAa;AAC3B;AAEA;;AAEC,MACD,IAAIK,QAAmB,GAAA;QACrB,OAAO,IAAI,CAACH,SAAS;AACvB;IAEA,IAAIG,QAAAA,CAASC,KAAa,EAAE;QAC1B,IAAI,CAACJ,SAAS,GAAGI,KAAAA;AACnB;AAEA;;AAEC,MACDC,KAAMC,CAAAA,SAAsB,EAAEC,SAAiB,EAAQ;QACrD,IAAI,CAAC,IAAI,CAACC,QAAQ,IAAI,IAAI,CAACT,OAAO,IAAI,CAAG,EAAA;AACvC,YAAA;AACF;;AAGA,QAAA,IAAI,CAACD,aAAa,CAACW,MAAM,CAACF,SAAAA,CAAAA;;AAG1B,QAAA,IAAI,CAACT,aAAa,CAACY,YAAY,CAAC,IAAI,CAACX,OAAO,CAAA;AAC9C;AAEA;;AAEC,MACDY,KAAc,GAAA;QACZ,IAAI,CAACb,aAAa,CAACa,KAAK,EAAA;AAC1B;AAEA;;;AAGC,MACD,UAA+B,GAAA;QAC7B,OAAO,IAAI,CAACZ,OAAO;AACrB;AAEA;;;MAIUa,UAAWR,CAAAA,KAAa,EAAQ;QACxC,IAAI,CAACL,OAAO,GAAGc,IAAKC,CAAAA,GAAG,CAAC,CAAGD,EAAAA,IAAAA,CAAKE,GAAG,CAAC,CAAGX,EAAAA,KAAAA,CAAAA,CAAAA;AACzC;AACF;;;;"}
1
+ {"version":3,"file":"spring_modifier.js","sources":["../../src/animation/spring_modifier.ts"],"sourcesContent":["import { SkeletonModifier } from './skeleton_modifier';\r\nimport type { SkeletonRig } from './skeleton';\r\nimport type { SpringSystem } from './spring/spring_system';\r\n\r\n/**\r\n * Post-processor wrapper for spring physics systems.\r\n *\r\n * Integrates spring-based physics simulation into the skeleton post-processing pipeline.\r\n * The spring system is updated each frame and results are blended with the base animation.\r\n *\r\n * @deprecated Use the new {@link JointDynamicsModifier} class instead.\r\n *\r\n * @public\r\n */\r\nexport class SpringModifier extends SkeletonModifier {\r\n private _springSystem: SpringSystem;\r\n private _weight: number;\r\n private _sourceId: string;\r\n private _startupDelay: number;\r\n private _startupDelayRemaining: number;\r\n\r\n /**\r\n * Create a spring post-processor.\r\n *\r\n * @param springSystem - The spring system to integrate\r\n * @param weight - Blend weight [0-1] (default: 1.0)\r\n * @param startupDelay - Seconds spent following the animated pose before simulation starts (default: 0.1)\r\n */\r\n constructor(springSystem: SpringSystem, weight: number = 1.0, startupDelay: number = 0.1) {\r\n super();\r\n this._weight = weight;\r\n this._springSystem = springSystem;\r\n this._sourceId = '';\r\n this._startupDelay = Math.max(0, Number(startupDelay) || 0);\r\n this._startupDelayRemaining = this._startupDelay;\r\n }\r\n\r\n /**\r\n * Get the spring system.\r\n */\r\n get springSystem(): SpringSystem {\r\n return this._springSystem;\r\n }\r\n\r\n /**\r\n * Get the identifier of the configuration that created this modifier.\r\n */\r\n get sourceId(): string {\r\n return this._sourceId;\r\n }\r\n\r\n set sourceId(value: string) {\r\n this._sourceId = value;\r\n }\r\n\r\n /**\r\n * Apply spring physics to skeleton joints.\r\n */\r\n apply(_skeleton: SkeletonRig, deltaTime: number): void {\r\n if (!this._enabled || this._weight <= 0) {\r\n return;\r\n }\r\n\r\n if (this._startupDelayRemaining > 0 && this.reinitializeFromCurrentPose()) {\r\n this._startupDelayRemaining = Math.max(\r\n 0,\r\n this._startupDelayRemaining - Math.max(0, Number(deltaTime) || 0)\r\n );\r\n return;\r\n }\r\n\r\n // Update spring physics simulation\r\n this._springSystem.update(deltaTime);\r\n\r\n // Apply results to scene nodes with blending\r\n this._springSystem.applyToNodes(this._weight);\r\n }\r\n\r\n /**\r\n * Reset the spring system to initial state.\r\n */\r\n reset(): void {\r\n this._springSystem.reset();\r\n this._startupDelayRemaining = this._startupDelay;\r\n }\r\n\r\n /** Restarts the pose-following startup window after a runtime hierarchy or binding change. */\r\n restartSimulation(startupDelay: number = this._startupDelay): void {\r\n this._startupDelayRemaining = Math.max(0, Number(startupDelay) || 0);\r\n }\r\n\r\n get startupDelay(): number {\r\n return this._startupDelay;\r\n }\r\n\r\n set startupDelay(value: number) {\r\n this._startupDelay = Math.max(0, Number(value) || 0);\r\n }\r\n\r\n /**\r\n * Get the blend weight for this processor.\r\n * @returns The current blend weight (0-1)\r\n */\r\n protected _getWeight(): number {\r\n return this._weight;\r\n }\r\n\r\n /**\r\n * Set the blend weight for this processor.\r\n * @param value - New blend weight (0-1)\r\n */\r\n protected _setWeight(value: number): void {\r\n this._weight = Math.max(0, Math.min(1, value));\r\n }\r\n\r\n private reinitializeFromCurrentPose(): boolean {\r\n const system = this._springSystem as SpringSystem & {\r\n reinitializeFromCurrentPose?: (options?: {\r\n recomputeAnchorOffsets?: boolean;\r\n recalculateRestLengths?: boolean;\r\n }) => void;\r\n };\r\n if (typeof system.reinitializeFromCurrentPose !== 'function') {\r\n this._startupDelayRemaining = 0;\r\n return false;\r\n }\r\n system.reinitializeFromCurrentPose({\r\n recomputeAnchorOffsets: true,\r\n recalculateRestLengths: true\r\n });\r\n return true;\r\n }\r\n}\r\n"],"names":["SpringModifier","SkeletonModifier","_springSystem","_weight","_sourceId","_startupDelay","_startupDelayRemaining","springSystem","weight","startupDelay","Math","max","Number","sourceId","value","apply","_skeleton","deltaTime","_enabled","reinitializeFromCurrentPose","update","applyToNodes","reset","restartSimulation","_setWeight","min","system","recomputeAnchorOffsets","recalculateRestLengths"],"mappings":"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"}
package/dist/app/app.js CHANGED
@@ -29,6 +29,7 @@ import { getApp, setApp } from './api.js';
29
29
  _engine;
30
30
  _editorMode;
31
31
  _ready;
32
+ _frameWaiters;
32
33
  /**
33
34
  * Construct the Application singleton with the provided options.
34
35
  *
@@ -55,6 +56,7 @@ import { getApp, setApp } from './api.js';
55
56
  this._editorMode = opt.runtimeOptions?.editorMode ?? 'none';
56
57
  this._device = null;
57
58
  this._ready = false;
59
+ this._frameWaiters = [];
58
60
  }
59
61
  /**
60
62
  * Editor mode
@@ -125,6 +127,7 @@ import { getApp, setApp } from './api.js';
125
127
  * - Flushes pending disposals from the previous frame.
126
128
  * - Clears device state (framebuffer, viewport, scissor).
127
129
  * - Queries frame timing from the device (`elapsedFrame`, `elapsedOverall`).
130
+ * - Starts a new input frame: input state, gamepads and action maps.
128
131
  * - Updates the runtime manager (scripting/behaviors).
129
132
  * - Emits `tick` with delta/elapsed times.
130
133
  *
@@ -138,12 +141,35 @@ import { getApp, setApp } from './api.js';
138
141
  this.device.setScissor(null);
139
142
  const dt = this.device.frameInfo.elapsedFrame;
140
143
  const elapsed = this.device.frameInfo.elapsedOverall;
144
+ this._inputManager._beginFrame(dt * 0.001);
141
145
  this.dispatchEvent('tick', dt, elapsed);
142
146
  this._engine.update(dt * 0.001, elapsed * 0.001);
143
147
  this._engine.render();
148
+ if (this._frameWaiters.length > 0) {
149
+ // Resolution callbacks run as microtasks, after the caller's endFrame()
150
+ const waiters = this._frameWaiters;
151
+ this._frameWaiters = [];
152
+ waiters.forEach((resolve)=>resolve());
153
+ }
144
154
  }
145
155
  }
146
156
  /**
157
+ * Waits for the next frame to be rendered.
158
+ *
159
+ * @remarks
160
+ * Resolves once the next call to {@link Application.frame} has rendered every
161
+ * active layer and the frame has been ended, so what was set up before calling
162
+ * this is on screen when the promise settles. Use it to hide a loading overlay
163
+ * only after the first frame of a scene has been drawn.
164
+ *
165
+ * Never resolves while no frame is rendered (run loop not started, or the
166
+ * device skips frames because the rendering context is lost).
167
+ */ nextFrame() {
168
+ return new Promise((resolve)=>{
169
+ this._frameWaiters.push(resolve);
170
+ });
171
+ }
172
+ /**
147
173
  * Advances exactly one frame outside the run loop.
148
174
  *
149
175
  * @remarks