@zephyr3d/scene 0.9.5 → 0.9.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (621) hide show
  1. package/dist/animation/joint_dynamics/controller.js +92 -32
  2. package/dist/animation/joint_dynamics/controller.js.map +1 -1
  3. package/dist/animation/joint_dynamics/convex_collider.js +320 -0
  4. package/dist/animation/joint_dynamics/convex_collider.js.map +1 -0
  5. package/dist/animation/joint_dynamics/joint_dynamics_system.js +57 -19
  6. package/dist/animation/joint_dynamics/joint_dynamics_system.js.map +1 -1
  7. package/dist/animation/joint_dynamics/solver.js +71 -27
  8. package/dist/animation/joint_dynamics/solver.js.map +1 -1
  9. package/dist/animation/joint_dynamics_modifier.js +21 -20
  10. package/dist/animation/joint_dynamics_modifier.js.map +1 -1
  11. package/dist/animation/skeleton.js +7 -10
  12. package/dist/animation/skeleton.js.map +1 -1
  13. package/dist/app/engine.js +134 -140
  14. package/dist/app/engine.js.map +1 -1
  15. package/dist/app/scriptregistry.js +47 -16
  16. package/dist/app/scriptregistry.js.map +1 -1
  17. package/dist/asset/assetmanager.js +3 -1
  18. package/dist/asset/assetmanager.js.map +1 -1
  19. package/dist/asset/model.js +346 -7
  20. package/dist/asset/model.js.map +1 -1
  21. package/dist/avatar/wardrobe.js +20 -16
  22. package/dist/avatar/wardrobe.js.map +1 -1
  23. package/dist/camera/camera.js +416 -210
  24. package/dist/camera/camera.js.map +1 -1
  25. package/dist/index.d.ts +1350 -621
  26. package/dist/index.js +6 -11
  27. package/dist/index.js.map +1 -1
  28. package/dist/material/blinn.js +1 -1
  29. package/dist/material/blinn.js.map +1 -1
  30. package/dist/material/lambert.js +1 -1
  31. package/dist/material/lambert.js.map +1 -1
  32. package/dist/material/material.js +23 -1
  33. package/dist/material/material.js.map +1 -1
  34. package/dist/material/meshmaterial.js +178 -23
  35. package/dist/material/meshmaterial.js.map +1 -1
  36. package/dist/material/mixins/albedocolor.js +4 -4
  37. package/dist/material/mixins/albedocolor.js.map +1 -1
  38. package/dist/material/mixins/lightmodel/blinnphong.js +2 -1
  39. package/dist/material/mixins/lightmodel/blinnphong.js.map +1 -1
  40. package/dist/material/mixins/lightmodel/lambert.js +2 -1
  41. package/dist/material/mixins/lightmodel/lambert.js.map +1 -1
  42. package/dist/material/mixins/lightmodel/pbrblueprintmixin.js +63 -16
  43. package/dist/material/mixins/lightmodel/pbrblueprintmixin.js.map +1 -1
  44. package/dist/material/mixins/lightmodel/pbrmetallicroughness.js +105 -32
  45. package/dist/material/mixins/lightmodel/pbrmetallicroughness.js.map +1 -1
  46. package/dist/material/mixins/lightmodel/pbrspecularglossness.js +16 -6
  47. package/dist/material/mixins/lightmodel/pbrspecularglossness.js.map +1 -1
  48. package/dist/material/mixins/lit.js +1 -1
  49. package/dist/material/mixins/lit.js.map +1 -1
  50. package/dist/material/mixins/pbr/common.js +276 -65
  51. package/dist/material/mixins/pbr/common.js.map +1 -1
  52. package/dist/material/mixins/texture.js +3 -3
  53. package/dist/material/mixins/texture.js.map +1 -1
  54. package/dist/material/mixins/vertexcolor.js +2 -2
  55. package/dist/material/mixins/vertexcolor.js.map +1 -1
  56. package/dist/material/msdf_text.js +3 -3
  57. package/dist/material/msdf_text.js.map +1 -1
  58. package/dist/material/mtoon.js +574 -0
  59. package/dist/material/mtoon.js.map +1 -0
  60. package/dist/material/pbrblueprint.js +499 -336
  61. package/dist/material/pbrblueprint.js.map +1 -1
  62. package/dist/material/pbrmr.js +118 -100
  63. package/dist/material/pbrmr.js.map +1 -1
  64. package/dist/material/pbrsg.js +1 -1
  65. package/dist/material/pbrsg.js.map +1 -1
  66. package/dist/material/shader/helper.js +324 -294
  67. package/dist/material/shader/helper.js.map +1 -1
  68. package/dist/material/subsurfaceprofile.js +812 -0
  69. package/dist/material/subsurfaceprofile.js.map +1 -0
  70. package/dist/material/unlit.js +1 -1
  71. package/dist/material/unlit.js.map +1 -1
  72. package/dist/posteffect/compositor.js +46 -11
  73. package/dist/posteffect/compositor.js.map +1 -1
  74. package/dist/posteffect/ssr.js +422 -96
  75. package/dist/posteffect/ssr.js.map +1 -1
  76. package/dist/posteffect/sss.js +1053 -0
  77. package/dist/posteffect/sss.js.map +1 -0
  78. package/dist/posteffect/taa.js +61 -60
  79. package/dist/posteffect/taa.js.map +1 -1
  80. package/dist/render/abuffer_oit.js +63 -12
  81. package/dist/render/abuffer_oit.js.map +1 -1
  82. package/dist/render/cluster_light.js +6 -5
  83. package/dist/render/cluster_light.js.map +1 -1
  84. package/dist/render/drawable.js +1 -5
  85. package/dist/render/drawable.js.map +1 -1
  86. package/dist/render/drawable_mixin.js +2 -1
  87. package/dist/render/drawable_mixin.js.map +1 -1
  88. package/dist/render/fbm_wavegenerator.js +2 -1
  89. package/dist/render/fbm_wavegenerator.js.map +1 -1
  90. package/dist/render/gerstner_wavegenerator.js +2 -1
  91. package/dist/render/gerstner_wavegenerator.js.map +1 -1
  92. package/dist/render/globalbindgroup_allocator.js +2 -1
  93. package/dist/render/globalbindgroup_allocator.js.map +1 -1
  94. package/dist/render/lightpass.js +110 -23
  95. package/dist/render/lightpass.js.map +1 -1
  96. package/dist/render/render_queue.js +51 -8
  97. package/dist/render/render_queue.js.map +1 -1
  98. package/dist/render/renderer.js +80 -66
  99. package/dist/render/renderer.js.map +1 -1
  100. package/dist/render/rendergraph/device_pool_allocator.js +8 -0
  101. package/dist/render/rendergraph/device_pool_allocator.js.map +1 -1
  102. package/dist/render/rendergraph/forward_plus_builder.js +481 -95
  103. package/dist/render/rendergraph/forward_plus_builder.js.map +1 -1
  104. package/dist/render/rendergraph/history_resource_manager.js +55 -0
  105. package/dist/render/rendergraph/history_resource_manager.js.map +1 -1
  106. package/dist/render/rendergraph/history_resources.js +3 -1
  107. package/dist/render/rendergraph/history_resources.js.map +1 -1
  108. package/dist/render/rendergraph/types.js.map +1 -1
  109. package/dist/render/renderpass.js +10 -4
  110. package/dist/render/renderpass.js.map +1 -1
  111. package/dist/render/sky.js +31 -1
  112. package/dist/render/sky.js.map +1 -1
  113. package/dist/render/weightedblended_oit.js +23 -5
  114. package/dist/render/weightedblended_oit.js.map +1 -1
  115. package/dist/scene/basesprite.js +4 -2
  116. package/dist/scene/basesprite.js.map +1 -1
  117. package/dist/scene/batchgroup.js +3 -1
  118. package/dist/scene/batchgroup.js.map +1 -1
  119. package/dist/scene/environment.js +11 -1
  120. package/dist/scene/environment.js.map +1 -1
  121. package/dist/scene/light.js +21 -3
  122. package/dist/scene/light.js.map +1 -1
  123. package/dist/scene/mesh.js +29 -14
  124. package/dist/scene/mesh.js.map +1 -1
  125. package/dist/scene/meshdrawable.js +6 -0
  126. package/dist/scene/meshdrawable.js.map +1 -1
  127. package/dist/scene/msdftext.js +5 -2
  128. package/dist/scene/msdftext.js.map +1 -1
  129. package/dist/scene/msdftextsprite.js +5 -3
  130. package/dist/scene/msdftextsprite.js.map +1 -1
  131. package/dist/scene/particlesys.js +3 -1
  132. package/dist/scene/particlesys.js.map +1 -1
  133. package/dist/scene/scene.js +6 -5
  134. package/dist/scene/scene.js.map +1 -1
  135. package/dist/scene/terrain-cm/grass.js +4 -2
  136. package/dist/scene/terrain-cm/grass.js.map +1 -1
  137. package/dist/scene/terrain-cm/grassmaterial.js +2 -1
  138. package/dist/scene/terrain-cm/grassmaterial.js.map +1 -1
  139. package/dist/scene/terrain-cm/terrain-cm.js +4 -2
  140. package/dist/scene/terrain-cm/terrain-cm.js.map +1 -1
  141. package/dist/scene/water.js +4 -2
  142. package/dist/scene/water.js.map +1 -1
  143. package/dist/shaders/shadow.js +26 -393
  144. package/dist/shaders/shadow.js.map +1 -1
  145. package/dist/shadow/esm.js +112 -12
  146. package/dist/shadow/esm.js.map +1 -1
  147. package/dist/shadow/pcf_opt.js +2 -2
  148. package/dist/shadow/pcf_opt.js.map +1 -1
  149. package/dist/shadow/pcf_pd.js +19 -10
  150. package/dist/shadow/pcf_pd.js.map +1 -1
  151. package/dist/shadow/shader.js +58 -7
  152. package/dist/shadow/shader.js.map +1 -1
  153. package/dist/shadow/shadow_impl.js +6 -0
  154. package/dist/shadow/shadow_impl.js.map +1 -1
  155. package/dist/shadow/shadow_region.js +229 -0
  156. package/dist/shadow/shadow_region.js.map +1 -0
  157. package/dist/shadow/shadowmapper.js +67 -59
  158. package/dist/shadow/shadowmapper.js.map +1 -1
  159. package/dist/shadow/vsm.js +45 -19
  160. package/dist/shadow/vsm.js.map +1 -1
  161. package/dist/text/font/cff_font.js +890 -0
  162. package/dist/text/font/cff_font.js.map +1 -0
  163. package/dist/text/font/font_asset.js +17 -3
  164. package/dist/text/font/font_asset.js.map +1 -1
  165. package/dist/utility/blueprint/common/constants.js +8 -8
  166. package/dist/utility/blueprint/common/constants.js.map +1 -1
  167. package/dist/utility/blueprint/material/pbr.js +31 -4
  168. package/dist/utility/blueprint/material/pbr.js.map +1 -1
  169. package/dist/utility/blueprint/material/texture.js +1 -17
  170. package/dist/utility/blueprint/material/texture.js.map +1 -1
  171. package/dist/utility/serialization/manager.js +327 -359
  172. package/dist/utility/serialization/manager.js.map +1 -1
  173. package/dist/utility/serialization/scene/animation.js +5 -2
  174. package/dist/utility/serialization/scene/animation.js.map +1 -1
  175. package/dist/utility/serialization/scene/batch.js +4 -1
  176. package/dist/utility/serialization/scene/batch.js.map +1 -1
  177. package/dist/utility/serialization/scene/camera.js +249 -54
  178. package/dist/utility/serialization/scene/camera.js.map +1 -1
  179. package/dist/utility/serialization/scene/common.js +37 -1
  180. package/dist/utility/serialization/scene/common.js.map +1 -1
  181. package/dist/utility/serialization/scene/light.js +42 -3
  182. package/dist/utility/serialization/scene/light.js.map +1 -1
  183. package/dist/utility/serialization/scene/material.js +1112 -646
  184. package/dist/utility/serialization/scene/material.js.map +1 -1
  185. package/dist/utility/serialization/scene/mesh.js +7 -4
  186. package/dist/utility/serialization/scene/mesh.js.map +1 -1
  187. package/dist/utility/serialization/scene/node.js +31 -12
  188. package/dist/utility/serialization/scene/node.js.map +1 -1
  189. package/dist/utility/serialization/scene/particle.js +4 -1
  190. package/dist/utility/serialization/scene/particle.js.map +1 -1
  191. package/dist/utility/serialization/scene/primitive.js +3 -1
  192. package/dist/utility/serialization/scene/primitive.js.map +1 -1
  193. package/dist/utility/serialization/scene/scene.js +18 -0
  194. package/dist/utility/serialization/scene/scene.js.map +1 -1
  195. package/dist/utility/serialization/scene/sprite.js +6 -3
  196. package/dist/utility/serialization/scene/sprite.js.map +1 -1
  197. package/dist/utility/serialization/scene/terrain.js +5 -2
  198. package/dist/utility/serialization/scene/terrain.js.map +1 -1
  199. package/dist/utility/serialization/scene/text.js +3 -1
  200. package/dist/utility/serialization/scene/text.js.map +1 -1
  201. package/dist/utility/serialization/scene/water.js +4 -1
  202. package/dist/utility/serialization/scene/water.js.map +1 -1
  203. package/dist/utility/textures/ltcdata.js +6 -0
  204. package/dist/utility/textures/ltcdata.js.map +1 -0
  205. package/dist/utility/textures/ltclut.js +61 -0
  206. package/dist/utility/textures/ltclut.js.map +1 -0
  207. package/dist/values.js +9 -1
  208. package/dist/values.js.map +1 -1
  209. package/package.json +3 -3
  210. package/dist/animation/ik/ik_chain_builder.js +0 -68
  211. package/dist/animation/ik/ik_chain_builder.js.map +0 -1
  212. package/dist/animation/ik/ik_pole_constraint.js +0 -123
  213. package/dist/animation/ik/ik_pole_constraint.js.map +0 -1
  214. package/dist/animation/ik/ik_track.js +0 -96
  215. package/dist/animation/ik/ik_track.js.map +0 -1
  216. package/dist/animation/ik_postprocessor.js +0 -71
  217. package/dist/animation/ik_postprocessor.js.map +0 -1
  218. package/dist/animation/joint_dynamics/math.js +0 -16
  219. package/dist/animation/joint_dynamics/math.js.map +0 -1
  220. package/dist/animation/manual_transform_processor.js +0 -156
  221. package/dist/animation/manual_transform_processor.js.map +0 -1
  222. package/dist/animation/skeleton_postprocessor.js +0 -50
  223. package/dist/animation/skeleton_postprocessor.js.map +0 -1
  224. package/dist/animation/spring2/collision.js +0 -469
  225. package/dist/animation/spring2/collision.js.map +0 -1
  226. package/dist/animation/spring2/constraints.js +0 -329
  227. package/dist/animation/spring2/constraints.js.map +0 -1
  228. package/dist/animation/spring2/controller.js +0 -434
  229. package/dist/animation/spring2/controller.js.map +0 -1
  230. package/dist/animation/spring2/math.js +0 -16
  231. package/dist/animation/spring2/math.js.map +0 -1
  232. package/dist/animation/spring2/solver.js +0 -624
  233. package/dist/animation/spring2/solver.js.map +0 -1
  234. package/dist/animation/spring2/spring_system.js +0 -118
  235. package/dist/animation/spring2/spring_system.js.map +0 -1
  236. package/dist/animation/spring2/types.js +0 -19
  237. package/dist/animation/spring2/types.js.map +0 -1
  238. package/dist/animation/spring_postprocessor.js +0 -54
  239. package/dist/animation/spring_postprocessor.js.map +0 -1
  240. package/dist/asset/loaders/gltf/gltf_loader.js +0 -1276
  241. package/dist/asset/loaders/gltf/gltf_loader.js.map +0 -1
  242. package/dist/asset/loaders/gltf/helpers.js +0 -331
  243. package/dist/asset/loaders/gltf/helpers.js.map +0 -1
  244. package/dist/material/sprite3d.js +0 -301
  245. package/dist/material/sprite3d.js.map +0 -1
  246. package/dist/material/sprite3d_std.js +0 -116
  247. package/dist/material/sprite3d_std.js.map +0 -1
  248. package/dist/material/sprite3dblueprint.js +0 -235
  249. package/dist/material/sprite3dblueprint.js.map +0 -1
  250. package/dist/material/sprite_sdf.js +0 -106
  251. package/dist/material/sprite_sdf.js.map +0 -1
  252. package/dist/material/terrainmaterial.js +0 -368
  253. package/dist/material/terrainmaterial.js.map +0 -1
  254. package/dist/node_modules/@zephyr3d/runtime/dist/runtime/runtimemgr.js +0 -38
  255. package/dist/node_modules/@zephyr3d/runtime/dist/runtime/runtimemgr.js.map +0 -1
  256. package/dist/node_modules/@zephyr3d/runtime/dist/runtime/runtimescript.js +0 -10
  257. package/dist/node_modules/@zephyr3d/runtime/dist/runtime/runtimescript.js.map +0 -1
  258. package/dist/node_modules/@zephyr3d/runtime/dist/runtime/scriptingsystem.js +0 -127
  259. package/dist/node_modules/@zephyr3d/runtime/dist/runtime/scriptingsystem.js.map +0 -1
  260. package/dist/node_modules/@zephyr3d/runtime/dist/runtime/scriptregistry.js +0 -263
  261. package/dist/node_modules/@zephyr3d/runtime/dist/runtime/scriptregistry.js.map +0 -1
  262. package/dist/render/deferredlightpass.js +0 -510
  263. package/dist/render/deferredlightpass.js.map +0 -1
  264. package/dist/render/deferredshadowlightpass.js +0 -428
  265. package/dist/render/deferredshadowlightpass.js.map +0 -1
  266. package/dist/render/gbufferpass.js +0 -50
  267. package/dist/render/gbufferpass.js.map +0 -1
  268. package/dist/scene/sdftextsprite.js +0 -322
  269. package/dist/scene/sdftextsprite.js.map +0 -1
  270. package/dist/scene/sprite3d.js +0 -18
  271. package/dist/scene/sprite3d.js.map +0 -1
  272. package/dist/scene/terrain/grass.js +0 -280
  273. package/dist/scene/terrain/grass.js.map +0 -1
  274. package/dist/scene/terrain/heightfield.js +0 -475
  275. package/dist/scene/terrain/heightfield.js.map +0 -1
  276. package/dist/scene/terrain/patch.js +0 -532
  277. package/dist/scene/terrain/patch.js.map +0 -1
  278. package/dist/scene/terrain/quadtree.js +0 -461
  279. package/dist/scene/terrain/quadtree.js.map +0 -1
  280. package/dist/scene/terrain/terrain.js +0 -231
  281. package/dist/scene/terrain/terrain.js.map +0 -1
  282. package/dist/src/animation/animation.js +0 -127
  283. package/dist/src/animation/animation.js.map +0 -1
  284. package/dist/src/animation/animationset.js +0 -255
  285. package/dist/src/animation/animationset.js.map +0 -1
  286. package/dist/src/animation/animationtrack.js +0 -34
  287. package/dist/src/animation/animationtrack.js.map +0 -1
  288. package/dist/src/animation/eulerrotationtrack.js +0 -52
  289. package/dist/src/animation/eulerrotationtrack.js.map +0 -1
  290. package/dist/src/animation/morphtarget.js +0 -93
  291. package/dist/src/animation/morphtarget.js.map +0 -1
  292. package/dist/src/animation/morphtrack.js +0 -70
  293. package/dist/src/animation/morphtrack.js.map +0 -1
  294. package/dist/src/animation/proptrack.js +0 -161
  295. package/dist/src/animation/proptrack.js.map +0 -1
  296. package/dist/src/animation/rotationtrack.js +0 -51
  297. package/dist/src/animation/rotationtrack.js.map +0 -1
  298. package/dist/src/animation/scaletrack.js +0 -50
  299. package/dist/src/animation/scaletrack.js.map +0 -1
  300. package/dist/src/animation/skeleton.js +0 -204
  301. package/dist/src/animation/skeleton.js.map +0 -1
  302. package/dist/src/animation/translationtrack.js +0 -50
  303. package/dist/src/animation/translationtrack.js.map +0 -1
  304. package/dist/src/app/app.js +0 -129
  305. package/dist/src/app/app.js.map +0 -1
  306. package/dist/src/app/inputmgr.js +0 -267
  307. package/dist/src/app/inputmgr.js.map +0 -1
  308. package/dist/src/asset/assetmanager.js +0 -404
  309. package/dist/src/asset/assetmanager.js.map +0 -1
  310. package/dist/src/asset/builtin.js +0 -337
  311. package/dist/src/asset/builtin.js.map +0 -1
  312. package/dist/src/asset/loaders/dds/dds.js +0 -470
  313. package/dist/src/asset/loaders/dds/dds.js.map +0 -1
  314. package/dist/src/asset/loaders/dds/dds_loader.js +0 -28
  315. package/dist/src/asset/loaders/dds/dds_loader.js.map +0 -1
  316. package/dist/src/asset/loaders/gltf/gltf_loader.js +0 -1265
  317. package/dist/src/asset/loaders/gltf/gltf_loader.js.map +0 -1
  318. package/dist/src/asset/loaders/gltf/helpers.js +0 -327
  319. package/dist/src/asset/loaders/gltf/helpers.js.map +0 -1
  320. package/dist/src/asset/loaders/hdr/hdr.js +0 -180
  321. package/dist/src/asset/loaders/hdr/hdr.js.map +0 -1
  322. package/dist/src/asset/loaders/image/tga_Loader.js +0 -116
  323. package/dist/src/asset/loaders/image/tga_Loader.js.map +0 -1
  324. package/dist/src/asset/loaders/image/webimage_loader.js +0 -63
  325. package/dist/src/asset/loaders/image/webimage_loader.js.map +0 -1
  326. package/dist/src/asset/loaders/loader.js +0 -45
  327. package/dist/src/asset/loaders/loader.js.map +0 -1
  328. package/dist/src/asset/model.js +0 -414
  329. package/dist/src/asset/model.js.map +0 -1
  330. package/dist/src/blitter/bilateralblur.js +0 -221
  331. package/dist/src/blitter/bilateralblur.js.map +0 -1
  332. package/dist/src/blitter/blitter.js +0 -390
  333. package/dist/src/blitter/blitter.js.map +0 -1
  334. package/dist/src/blitter/box.js +0 -118
  335. package/dist/src/blitter/box.js.map +0 -1
  336. package/dist/src/blitter/copy.js +0 -22
  337. package/dist/src/blitter/copy.js.map +0 -1
  338. package/dist/src/blitter/gaussianblur.js +0 -228
  339. package/dist/src/blitter/gaussianblur.js.map +0 -1
  340. package/dist/src/camera/base.js +0 -92
  341. package/dist/src/camera/base.js.map +0 -1
  342. package/dist/src/camera/camera.js +0 -1005
  343. package/dist/src/camera/camera.js.map +0 -1
  344. package/dist/src/camera/fps.js +0 -238
  345. package/dist/src/camera/fps.js.map +0 -1
  346. package/dist/src/camera/orbit.js +0 -245
  347. package/dist/src/camera/orbit.js.map +0 -1
  348. package/dist/src/camera/orthocamera.js +0 -167
  349. package/dist/src/camera/orthocamera.js.map +0 -1
  350. package/dist/src/camera/perspectivecamera.js +0 -141
  351. package/dist/src/camera/perspectivecamera.js.map +0 -1
  352. package/dist/src/index.js +0 -120
  353. package/dist/src/index.js.map +0 -1
  354. package/dist/src/material/blinn.js +0 -81
  355. package/dist/src/material/blinn.js.map +0 -1
  356. package/dist/src/material/grassmaterial.js +0 -113
  357. package/dist/src/material/grassmaterial.js.map +0 -1
  358. package/dist/src/material/lambert.js +0 -92
  359. package/dist/src/material/lambert.js.map +0 -1
  360. package/dist/src/material/material.js +0 -301
  361. package/dist/src/material/material.js.map +0 -1
  362. package/dist/src/material/meshmaterial.js +0 -704
  363. package/dist/src/material/meshmaterial.js.map +0 -1
  364. package/dist/src/material/mixins/albedocolor.js +0 -76
  365. package/dist/src/material/mixins/albedocolor.js.map +0 -1
  366. package/dist/src/material/mixins/foliage.js +0 -47
  367. package/dist/src/material/mixins/foliage.js.map +0 -1
  368. package/dist/src/material/mixins/lightmodel/blinnphong.js +0 -112
  369. package/dist/src/material/mixins/lightmodel/blinnphong.js.map +0 -1
  370. package/dist/src/material/mixins/lightmodel/lambert.js +0 -58
  371. package/dist/src/material/mixins/lightmodel/lambert.js.map +0 -1
  372. package/dist/src/material/mixins/lightmodel/pbrmetallicroughness.js +0 -178
  373. package/dist/src/material/mixins/lightmodel/pbrmetallicroughness.js.map +0 -1
  374. package/dist/src/material/mixins/lightmodel/pbrspecularglossness.js +0 -139
  375. package/dist/src/material/mixins/lightmodel/pbrspecularglossness.js.map +0 -1
  376. package/dist/src/material/mixins/lit.js +0 -476
  377. package/dist/src/material/mixins/lit.js.map +0 -1
  378. package/dist/src/material/mixins/pbr/common.js +0 -918
  379. package/dist/src/material/mixins/pbr/common.js.map +0 -1
  380. package/dist/src/material/mixins/texture.js +0 -172
  381. package/dist/src/material/mixins/texture.js.map +0 -1
  382. package/dist/src/material/mixins/vertexcolor.js +0 -56
  383. package/dist/src/material/mixins/vertexcolor.js.map +0 -1
  384. package/dist/src/material/particle.js +0 -178
  385. package/dist/src/material/particle.js.map +0 -1
  386. package/dist/src/material/pbrmr.js +0 -97
  387. package/dist/src/material/pbrmr.js.map +0 -1
  388. package/dist/src/material/pbrsg.js +0 -97
  389. package/dist/src/material/pbrsg.js.map +0 -1
  390. package/dist/src/material/shader/helper.js +0 -1209
  391. package/dist/src/material/shader/helper.js.map +0 -1
  392. package/dist/src/material/terrain-cm.js +0 -606
  393. package/dist/src/material/terrain-cm.js.map +0 -1
  394. package/dist/src/material/terrainmaterial.js +0 -375
  395. package/dist/src/material/terrainmaterial.js.map +0 -1
  396. package/dist/src/material/unlit.js +0 -41
  397. package/dist/src/material/unlit.js.map +0 -1
  398. package/dist/src/material/water.js +0 -417
  399. package/dist/src/material/water.js.map +0 -1
  400. package/dist/src/posteffect/bloom.js +0 -361
  401. package/dist/src/posteffect/bloom.js.map +0 -1
  402. package/dist/src/posteffect/compositor.js +0 -226
  403. package/dist/src/posteffect/compositor.js.map +0 -1
  404. package/dist/src/posteffect/fxaa.js +0 -273
  405. package/dist/src/posteffect/fxaa.js.map +0 -1
  406. package/dist/src/posteffect/grayscale.js +0 -69
  407. package/dist/src/posteffect/grayscale.js.map +0 -1
  408. package/dist/src/posteffect/motionblur.js +0 -96
  409. package/dist/src/posteffect/motionblur.js.map +0 -1
  410. package/dist/src/posteffect/posteffect.js +0 -126
  411. package/dist/src/posteffect/posteffect.js.map +0 -1
  412. package/dist/src/posteffect/sao.js +0 -324
  413. package/dist/src/posteffect/sao.js.map +0 -1
  414. package/dist/src/posteffect/ssr.js +0 -489
  415. package/dist/src/posteffect/ssr.js.map +0 -1
  416. package/dist/src/posteffect/taa.js +0 -172
  417. package/dist/src/posteffect/taa.js.map +0 -1
  418. package/dist/src/posteffect/tonemap.js +0 -94
  419. package/dist/src/posteffect/tonemap.js.map +0 -1
  420. package/dist/src/render/abuffer_oit.js +0 -361
  421. package/dist/src/render/abuffer_oit.js.map +0 -1
  422. package/dist/src/render/clipmap.js +0 -851
  423. package/dist/src/render/clipmap.js.map +0 -1
  424. package/dist/src/render/cluster_light.js +0 -333
  425. package/dist/src/render/cluster_light.js.map +0 -1
  426. package/dist/src/render/cull_visitor.js +0 -187
  427. package/dist/src/render/cull_visitor.js.map +0 -1
  428. package/dist/src/render/depthpass.js +0 -68
  429. package/dist/src/render/depthpass.js.map +0 -1
  430. package/dist/src/render/drawable_mixin.js +0 -227
  431. package/dist/src/render/drawable_mixin.js.map +0 -1
  432. package/dist/src/render/envlight.js +0 -463
  433. package/dist/src/render/envlight.js.map +0 -1
  434. package/dist/src/render/fbm_wavegenerator.js +0 -251
  435. package/dist/src/render/fbm_wavegenerator.js.map +0 -1
  436. package/dist/src/render/fft_wavegenerator.js +0 -1006
  437. package/dist/src/render/fft_wavegenerator.js.map +0 -1
  438. package/dist/src/render/fullscreenquad.js +0 -38
  439. package/dist/src/render/fullscreenquad.js.map +0 -1
  440. package/dist/src/render/gerstner_wavegenerator.js +0 -314
  441. package/dist/src/render/gerstner_wavegenerator.js.map +0 -1
  442. package/dist/src/render/globalbindgroup_allocator.js +0 -60
  443. package/dist/src/render/globalbindgroup_allocator.js.map +0 -1
  444. package/dist/src/render/hzb.js +0 -273
  445. package/dist/src/render/hzb.js.map +0 -1
  446. package/dist/src/render/lightpass.js +0 -172
  447. package/dist/src/render/lightpass.js.map +0 -1
  448. package/dist/src/render/objectcolorpass.js +0 -51
  449. package/dist/src/render/objectcolorpass.js.map +0 -1
  450. package/dist/src/render/primitive.js +0 -364
  451. package/dist/src/render/primitive.js.map +0 -1
  452. package/dist/src/render/render_queue.js +0 -467
  453. package/dist/src/render/render_queue.js.map +0 -1
  454. package/dist/src/render/renderbundle_wrapper.js +0 -152
  455. package/dist/src/render/renderbundle_wrapper.js.map +0 -1
  456. package/dist/src/render/renderer.js +0 -455
  457. package/dist/src/render/renderer.js.map +0 -1
  458. package/dist/src/render/renderpass.js +0 -200
  459. package/dist/src/render/renderpass.js.map +0 -1
  460. package/dist/src/render/shadowmap_pass.js +0 -56
  461. package/dist/src/render/shadowmap_pass.js.map +0 -1
  462. package/dist/src/render/sky.js +0 -1103
  463. package/dist/src/render/sky.js.map +0 -1
  464. package/dist/src/render/weightedblended_oit.js +0 -168
  465. package/dist/src/render/weightedblended_oit.js.map +0 -1
  466. package/dist/src/scene/batchgroup.js +0 -162
  467. package/dist/src/scene/batchgroup.js.map +0 -1
  468. package/dist/src/scene/environment.js +0 -209
  469. package/dist/src/scene/environment.js.map +0 -1
  470. package/dist/src/scene/graph_node.js +0 -72
  471. package/dist/src/scene/graph_node.js.map +0 -1
  472. package/dist/src/scene/light.js +0 -416
  473. package/dist/src/scene/light.js.map +0 -1
  474. package/dist/src/scene/mesh.js +0 -341
  475. package/dist/src/scene/mesh.js.map +0 -1
  476. package/dist/src/scene/octree.js +0 -649
  477. package/dist/src/scene/octree.js.map +0 -1
  478. package/dist/src/scene/particlesys.js +0 -738
  479. package/dist/src/scene/particlesys.js.map +0 -1
  480. package/dist/src/scene/raycast_visitor.js +0 -103
  481. package/dist/src/scene/raycast_visitor.js.map +0 -1
  482. package/dist/src/scene/scene.js +0 -284
  483. package/dist/src/scene/scene.js.map +0 -1
  484. package/dist/src/scene/scene_node.js +0 -732
  485. package/dist/src/scene/scene_node.js.map +0 -1
  486. package/dist/src/scene/terrain/grass.js +0 -278
  487. package/dist/src/scene/terrain/grass.js.map +0 -1
  488. package/dist/src/scene/terrain/heightfield.js +0 -475
  489. package/dist/src/scene/terrain/heightfield.js.map +0 -1
  490. package/dist/src/scene/terrain/patch.js +0 -530
  491. package/dist/src/scene/terrain/patch.js.map +0 -1
  492. package/dist/src/scene/terrain/quadtree.js +0 -461
  493. package/dist/src/scene/terrain/quadtree.js.map +0 -1
  494. package/dist/src/scene/terrain/terrain.js +0 -246
  495. package/dist/src/scene/terrain/terrain.js.map +0 -1
  496. package/dist/src/scene/terrain-cm/grass.js +0 -594
  497. package/dist/src/scene/terrain-cm/grass.js.map +0 -1
  498. package/dist/src/scene/terrain-cm/grassmaterial.js +0 -159
  499. package/dist/src/scene/terrain-cm/grassmaterial.js.map +0 -1
  500. package/dist/src/scene/terrain-cm/terrain-cm.js +0 -538
  501. package/dist/src/scene/terrain-cm/terrain-cm.js.map +0 -1
  502. package/dist/src/scene/water.js +0 -374
  503. package/dist/src/scene/water.js.map +0 -1
  504. package/dist/src/shaders/atmosphere.js +0 -957
  505. package/dist/src/shaders/atmosphere.js.map +0 -1
  506. package/dist/src/shaders/fog.js +0 -112
  507. package/dist/src/shaders/fog.js.map +0 -1
  508. package/dist/src/shaders/misc.js +0 -266
  509. package/dist/src/shaders/misc.js.map +0 -1
  510. package/dist/src/shaders/noise.js +0 -222
  511. package/dist/src/shaders/noise.js.map +0 -1
  512. package/dist/src/shaders/pbr.js +0 -51
  513. package/dist/src/shaders/pbr.js.map +0 -1
  514. package/dist/src/shaders/shadow.js +0 -636
  515. package/dist/src/shaders/shadow.js.map +0 -1
  516. package/dist/src/shaders/ssr.js +0 -490
  517. package/dist/src/shaders/ssr.js.map +0 -1
  518. package/dist/src/shaders/temporal.js +0 -215
  519. package/dist/src/shaders/temporal.js.map +0 -1
  520. package/dist/src/shaders/water.js +0 -756
  521. package/dist/src/shaders/water.js.map +0 -1
  522. package/dist/src/shadow/esm.js +0 -237
  523. package/dist/src/shadow/esm.js.map +0 -1
  524. package/dist/src/shadow/pcf_opt.js +0 -181
  525. package/dist/src/shadow/pcf_opt.js.map +0 -1
  526. package/dist/src/shadow/pcf_pd.js +0 -189
  527. package/dist/src/shadow/pcf_pd.js.map +0 -1
  528. package/dist/src/shadow/shader.js +0 -37
  529. package/dist/src/shadow/shader.js.map +0 -1
  530. package/dist/src/shadow/shadow_impl.js +0 -15
  531. package/dist/src/shadow/shadow_impl.js.map +0 -1
  532. package/dist/src/shadow/shadowmapper.js +0 -790
  533. package/dist/src/shadow/shadowmapper.js.map +0 -1
  534. package/dist/src/shadow/ssm.js +0 -159
  535. package/dist/src/shadow/ssm.js.map +0 -1
  536. package/dist/src/shadow/vsm.js +0 -297
  537. package/dist/src/shadow/vsm.js.map +0 -1
  538. package/dist/src/shapes/box.js +0 -386
  539. package/dist/src/shapes/box.js.map +0 -1
  540. package/dist/src/shapes/cylinder.js +0 -125
  541. package/dist/src/shapes/cylinder.js.map +0 -1
  542. package/dist/src/shapes/plane.js +0 -88
  543. package/dist/src/shapes/plane.js.map +0 -1
  544. package/dist/src/shapes/shape.js +0 -87
  545. package/dist/src/shapes/shape.js.map +0 -1
  546. package/dist/src/shapes/sphere.js +0 -114
  547. package/dist/src/shapes/sphere.js.map +0 -1
  548. package/dist/src/shapes/tetrahedron.js +0 -188
  549. package/dist/src/shapes/tetrahedron.js.map +0 -1
  550. package/dist/src/shapes/torus.js +0 -111
  551. package/dist/src/shapes/torus.js.map +0 -1
  552. package/dist/src/utility/aabbtree.js +0 -400
  553. package/dist/src/utility/aabbtree.js.map +0 -1
  554. package/dist/src/utility/bounding_volume.js +0 -29
  555. package/dist/src/utility/bounding_volume.js.map +0 -1
  556. package/dist/src/utility/debug.js +0 -28
  557. package/dist/src/utility/debug.js.map +0 -1
  558. package/dist/src/utility/draco/decoder.js +0 -116
  559. package/dist/src/utility/draco/decoder.js.map +0 -1
  560. package/dist/src/utility/misc.js +0 -105
  561. package/dist/src/utility/misc.js.map +0 -1
  562. package/dist/src/utility/panorama.js +0 -163
  563. package/dist/src/utility/panorama.js.map +0 -1
  564. package/dist/src/utility/pmrem.js +0 -354
  565. package/dist/src/utility/pmrem.js.map +0 -1
  566. package/dist/src/utility/rendermipmap.js +0 -115
  567. package/dist/src/utility/rendermipmap.js.map +0 -1
  568. package/dist/src/utility/serialization/json.js +0 -402
  569. package/dist/src/utility/serialization/json.js.map +0 -1
  570. package/dist/src/utility/serialization/manager.js +0 -623
  571. package/dist/src/utility/serialization/manager.js.map +0 -1
  572. package/dist/src/utility/serialization/scene/animation.js +0 -248
  573. package/dist/src/utility/serialization/scene/animation.js.map +0 -1
  574. package/dist/src/utility/serialization/scene/batch.js +0 -59
  575. package/dist/src/utility/serialization/scene/batch.js.map +0 -1
  576. package/dist/src/utility/serialization/scene/camera.js +0 -790
  577. package/dist/src/utility/serialization/scene/camera.js.map +0 -1
  578. package/dist/src/utility/serialization/scene/common.js +0 -222
  579. package/dist/src/utility/serialization/scene/common.js.map +0 -1
  580. package/dist/src/utility/serialization/scene/light.js +0 -575
  581. package/dist/src/utility/serialization/scene/light.js.map +0 -1
  582. package/dist/src/utility/serialization/scene/material.js +0 -1111
  583. package/dist/src/utility/serialization/scene/material.js.map +0 -1
  584. package/dist/src/utility/serialization/scene/mesh.js +0 -148
  585. package/dist/src/utility/serialization/scene/mesh.js.map +0 -1
  586. package/dist/src/utility/serialization/scene/misc.js +0 -39
  587. package/dist/src/utility/serialization/scene/misc.js.map +0 -1
  588. package/dist/src/utility/serialization/scene/node.js +0 -451
  589. package/dist/src/utility/serialization/scene/node.js.map +0 -1
  590. package/dist/src/utility/serialization/scene/particle.js +0 -425
  591. package/dist/src/utility/serialization/scene/particle.js.map +0 -1
  592. package/dist/src/utility/serialization/scene/primitive.js +0 -692
  593. package/dist/src/utility/serialization/scene/primitive.js.map +0 -1
  594. package/dist/src/utility/serialization/scene/scene.js +0 -704
  595. package/dist/src/utility/serialization/scene/scene.js.map +0 -1
  596. package/dist/src/utility/serialization/scene/terrain.js +0 -488
  597. package/dist/src/utility/serialization/scene/terrain.js.map +0 -1
  598. package/dist/src/utility/serialization/scene/water.js +0 -465
  599. package/dist/src/utility/serialization/scene/water.js.map +0 -1
  600. package/dist/src/utility/shprojector.js +0 -297
  601. package/dist/src/utility/shprojector.js.map +0 -1
  602. package/dist/src/utility/textures/ggxlut.js +0 -213
  603. package/dist/src/utility/textures/ggxlut.js.map +0 -1
  604. package/dist/src/utility/textures/gradientnoise.js +0 -62
  605. package/dist/src/utility/textures/gradientnoise.js.map +0 -1
  606. package/dist/src/utility/textures/randomnoise.js +0 -41
  607. package/dist/src/utility/textures/randomnoise.js.map +0 -1
  608. package/dist/src/values.js +0 -162
  609. package/dist/src/values.js.map +0 -1
  610. package/dist/utility/blueprint/material/common.js +0 -7
  611. package/dist/utility/blueprint/material/common.js.map +0 -1
  612. package/dist/utility/serialization/blueprint/constants.js +0 -255
  613. package/dist/utility/serialization/blueprint/constants.js.map +0 -1
  614. package/dist/utility/serialization/blueprint/material/constants.js +0 -203
  615. package/dist/utility/serialization/blueprint/material/constants.js.map +0 -1
  616. package/dist/utility/serialization/blueprint/material/texture.js +0 -165
  617. package/dist/utility/serialization/blueprint/material/texture.js.map +0 -1
  618. package/dist/utility/serialization/scene/cloth_script.js +0 -834
  619. package/dist/utility/serialization/scene/cloth_script.js.map +0 -1
  620. package/dist/utility/serialization/scene/spring_script.js +0 -596
  621. package/dist/utility/serialization/scene/spring_script.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"solver.js","sources":["../../../src/animation/joint_dynamics/solver.ts"],"sourcesContent":["// Core physics simulation - direct port of JobExecuteSimulation from SPCRJointDynamicsJob.cs\r\n\r\nimport {\r\n Quaternion,\r\n Vector3,\r\n Matrix4x4,\r\n degree2radian,\r\n radian2degree,\r\n clamp01,\r\n smoothStep\r\n} from '@zephyr3d/base';\r\nimport {\r\n EPSILON,\r\n ConstraintType,\r\n type PointR,\r\n type PointRW,\r\n type Constraint,\r\n type ColliderR,\r\n type ColliderRW,\r\n type GrabberR,\r\n type GrabberRW,\r\n type AngleLimitConfig,\r\n type FlatPlane\r\n} from './types';\r\nimport {\r\n pushoutFromSphere,\r\n pushoutFromCapsule,\r\n pushInFromSphere,\r\n pushInFromCapsule,\r\n collisionDetection,\r\n checkSurfaceCollision,\r\n type CollisionResult,\r\n type SurfaceCheckResult\r\n} from './collision';\r\n\r\nconst AXIS_Y = new Vector3(0, 1, 0);\r\nconst VEC3_ONE = new Vector3(1, 1, 1);\r\nconst _computeCapsuleAxis = new Vector3();\r\nconst _computeCapsuleHalfDir = new Vector3();\r\nconst _applySystemTransformOffset = new Vector3();\r\nconst _applySystemTransformRotated = new Vector3();\r\nconst _broadPhaseSegmentDir = new Vector3();\r\nconst _broadPhaseToCenter = new Vector3();\r\nconst _broadPhaseClosestPoint = new Vector3();\r\nconst _broadPhaseDelta = new Vector3();\r\n\r\n/**\r\n * Parameters for a single simulation step.\r\n *\r\n * @public\r\n */\r\nexport interface SimulationParams {\r\n /** If true, skip force integration (only apply root motion and output positions) */\r\n isPaused: boolean;\r\n /** Frame delta time in seconds (will be subdivided by subSteps) */\r\n stepTime: number;\r\n /** Number of substeps per frame. Higher = more stable simulation */\r\n subSteps: number;\r\n /** Current root bone world position */\r\n rootPosition: Vector3;\r\n /** Previous frame's root bone world position (for root motion limiting) */\r\n previousRootPosition: Vector3;\r\n /** Max root slide distance per substep. -1 = no limit */\r\n rootSlideLimit: number;\r\n /** Current root bone world rotation */\r\n rootRotation: Quaternion;\r\n /** Previous frame's root bone world rotation */\r\n previousRootRotation: Quaternion;\r\n /** Max root rotation angle (degrees) per substep. -1 = no limit */\r\n rootRotateLimit: number;\r\n /** Global wind force vector */\r\n windForce: Vector3;\r\n /** Enable triangle-based surface collision */\r\n enableSurfaceCollision: boolean;\r\n /** Triangle indices for surface collision (6 per quad: 2 triangles, 3 indices each) */\r\n surfaceConstraints: number[];\r\n /** Number of constraint relaxation iterations per substep */\r\n relaxation: number;\r\n /** Upper limit for horizontal/shear shrink power */\r\n constraintShrinkLimit: number;\r\n /** Blend ratio between physics and animation [0-1]. 0 = full physics */\r\n blendRatio: number;\r\n /** Enable sinusoidal fake wave on leaf bones */\r\n isFakeWave: boolean;\r\n /** Fake wave speed (frequency accumulation rate) */\r\n fakeWaveSpeed: number;\r\n /** Fake wave global amplitude */\r\n fakeWavePower: number;\r\n /** Current fake wave phase counter (accumulated across frames) */\r\n fakeWaveCounter: number;\r\n /** Global scale multiplier for all collider radii */\r\n collisionScale: number;\r\n /** Enable broad-phase pruning before precise collision checks */\r\n enableBroadPhase: boolean;\r\n}\r\n\r\n/**\r\n * Run the full simulation step. Mutates `pointsRW` and `collidersRW` in place.\r\n * Returns `{ positionsToTransform, fakeWaveCounter }`.\r\n *\r\n * @public\r\n */\r\nexport function simulate(\r\n params: SimulationParams,\r\n pointsR: readonly PointR[],\r\n pointsRW: PointRW[],\r\n constraints: readonly Constraint[],\r\n collidersR: readonly ColliderR[],\r\n collidersRW: ColliderRW[],\r\n grabbersR: readonly GrabberR[],\r\n grabbersRW: readonly GrabberRW[],\r\n movableLimitTargets: readonly Vector3[],\r\n flatPlanes: readonly FlatPlane[]\r\n): { positionsToTransform: Vector3[]; fakeWaveCounter: number } {\r\n const pointCount = pointsR.length;\r\n const positionsToTransform: Vector3[] = new Array(pointCount);\r\n\r\n let subSteps = params.subSteps;\r\n if (params.isPaused) {\r\n subSteps = 1;\r\n }\r\n\r\n let fakeWaveFreq = params.fakeWaveCounter;\r\n\r\n // Root slide offset\r\n let rootSlideOffset = Vector3.zero();\r\n const rootDeltaSlide = Vector3.sub(params.rootPosition, params.previousRootPosition);\r\n const rootDeltaSlideLen = rootDeltaSlide.magnitude;\r\n if (params.rootSlideLimit >= 0 && rootDeltaSlideLen > params.rootSlideLimit) {\r\n rootSlideOffset = Vector3.scale(\r\n rootDeltaSlide,\r\n (1.0 - params.rootSlideLimit / rootDeltaSlideLen) / subSteps\r\n );\r\n }\r\n\r\n // Root rotation offset\r\n let rootRotationOffset = Quaternion.identity();\r\n const rootDeltaRot = Quaternion.multiply(\r\n params.rootRotation,\r\n Quaternion.inverse(params.previousRootRotation)\r\n );\r\n let rotateAngle = Math.acos(Math.max(-1, Math.min(1, rootDeltaRot.w))) * 2.0 * (180 / Math.PI);\r\n if (rotateAngle > 180) {\r\n rotateAngle -= 360;\r\n }\r\n\r\n if (params.rootRotateLimit >= 0 && Math.abs(rotateAngle) > params.rootRotateLimit) {\r\n // Extract the rotation axis from the delta quaternion\r\n const sinHalf = Math.sqrt(Math.max(0, 1 - rootDeltaRot.w * rootDeltaRot.w));\r\n let rotateAxis: Vector3;\r\n if (sinHalf > 0.0001) {\r\n rotateAxis = new Vector3(rootDeltaRot.x / sinHalf, rootDeltaRot.y / sinHalf, rootDeltaRot.z / sinHalf);\r\n } else {\r\n rotateAxis = Vector3.axisPY();\r\n }\r\n let angle = rotateAngle > 0 ? rotateAngle - params.rootRotateLimit : rotateAngle + params.rootRotateLimit;\r\n angle /= subSteps;\r\n rootRotationOffset = Quaternion.fromAxisAngle(rotateAxis, degree2radian(angle));\r\n }\r\n\r\n if (params.isPaused) {\r\n rootSlideOffset = rootDeltaSlide;\r\n rootRotationOffset = rootDeltaRot;\r\n }\r\n\r\n const stepTime = params.stepTime / subSteps;\r\n\r\n for (let iSubStep = 1; iSubStep <= subSteps; iSubStep++) {\r\n const stepDelta = iSubStep / subSteps;\r\n const stepTime_x2_half = stepTime * stepTime * 0.5;\r\n\r\n colliderUpdate(collidersR, collidersRW, stepDelta);\r\n pointUpdatePass1(\r\n pointsR,\r\n pointsRW,\r\n stepDelta,\r\n stepTime_x2_half,\r\n rootSlideOffset,\r\n rootRotationOffset,\r\n params.rootPosition,\r\n params.windForce,\r\n params.isPaused,\r\n grabbersR,\r\n grabbersRW,\r\n movableLimitTargets,\r\n flatPlanes,\r\n collidersR,\r\n collidersRW\r\n );\r\n\r\n if (!params.isPaused) {\r\n fakeWaveFreq += params.fakeWaveSpeed * stepTime;\r\n\r\n if (params.enableSurfaceCollision) {\r\n surfaceCollision(pointsRW, collidersR, collidersRW, params.surfaceConstraints);\r\n }\r\n\r\n // Push fixed points out of colliders before constraint solving.\r\n // Fixed points follow animation and cannot be moved by the solver, but if\r\n // their animated position is inside a collider, the distance constraint will\r\n // pull free children inward through the surface �?causing the characteristic\r\n // \"hair flipping outward\" artifact at the back of the head.\r\n // By temporarily clamping fixed-point positionCurrent to the collider surface\r\n // before each substep's constraint pass, we ensure constraints operate from\r\n // a geometrically valid anchor. The original animated position is restored\r\n // at the start of the next substep via positionCurrentTransform.\r\n fixedPointColliderPushout(pointsR, pointsRW, collidersR, collidersRW);\r\n\r\n for (let iRelax = params.relaxation - 1; iRelax >= 0; --iRelax) {\r\n constraintUpdate(\r\n pointsR,\r\n pointsRW,\r\n constraints,\r\n collidersR,\r\n collidersRW,\r\n params.constraintShrinkLimit,\r\n params.enableBroadPhase\r\n );\r\n }\r\n\r\n // After all constraint/collision iterations are done, cancel any residual\r\n // normal velocity that would push points back into colliders next frame.\r\n // We compare the final positionCurrent (guaranteed outside all colliders)\r\n // against positionPrevious (the Verlet integration start point) and zero\r\n // out the component pointing into each collider.\r\n postCollisionVelocityFix(pointsR, pointsRW, collidersR, collidersRW);\r\n }\r\n\r\n pointUpdatePass2(\r\n pointsR,\r\n pointsRW,\r\n positionsToTransform,\r\n stepDelta,\r\n fakeWaveFreq,\r\n params.blendRatio,\r\n params.isFakeWave,\r\n params.fakeWavePower\r\n );\r\n }\r\n\r\n return { positionsToTransform, fakeWaveCounter: fakeWaveFreq };\r\n}\r\n\r\nfunction computeCapsule(\r\n pos: Vector3,\r\n rot: Quaternion,\r\n height: number,\r\n head: Vector3,\r\n direction: Vector3\r\n): void {\r\n rot.transform(Vector3.scale(AXIS_Y, height, _computeCapsuleAxis), direction);\r\n Vector3.scale(direction, 0.5, _computeCapsuleHalfDir);\r\n Vector3.sub(pos, _computeCapsuleHalfDir, head);\r\n}\r\n\r\nfunction colliderUpdate(collidersR: readonly ColliderR[], collidersRW: ColliderRW[], stepDelta: number) {\r\n const curPos = new Vector3();\r\n const curDir = new Quaternion();\r\n const corner = new Vector3();\r\n const center = new Vector3();\r\n const tailCorner = new Vector3();\r\n const tailCenter = new Vector3();\r\n for (let i = 0; i < collidersR.length; i++) {\r\n const colR = collidersR[i];\r\n const colRW = collidersRW[i];\r\n // Scale radius by the uniform world scale of the collider node.\r\n // Use the average of x/y/z components to handle non-uniform scale gracefully.\r\n const ws = colRW.worldScale;\r\n const worldScaleUniform = (ws.x + ws.y + ws.z) / 3;\r\n colRW.radius = colR.radius * worldScaleUniform;\r\n colRW.height = colR.height * worldScaleUniform;\r\n\r\n Vector3.lerp(colRW.positionPreviousTransform, colRW.positionCurrentTransform, stepDelta, curPos);\r\n Quaternion.slerp(colRW.directionPreviousTransform, colRW.directionCurrentTransform, stepDelta, curDir);\r\n\r\n computeCapsule(curPos, curDir, colRW.height, colRW.positionCurrent, colRW.directionCurrent);\r\n if (colRW.height > EPSILON) {\r\n Vector3.scale(colRW.directionCurrent, 0.5, _computeCapsuleHalfDir);\r\n Vector3.add(colRW.positionCurrent, _computeCapsuleHalfDir, colRW.boundsCenter);\r\n colRW.boundsRadius =\r\n Math.sqrt(colRW.directionCurrent.magnitudeSq) * 0.5 +\r\n Math.max(colRW.radius, colRW.radius * colR.radiusTailScale);\r\n } else {\r\n colRW.boundsCenter.set(colRW.positionCurrent);\r\n colRW.boundsRadius = colRW.radius;\r\n }\r\n\r\n // Update local bounds\r\n Vector3.scale(VEC3_ONE, colR.radius, corner);\r\n colRW.worldToLocal.transformPointAffine(colRW.positionCurrent, center);\r\n Vector3.sub(center, corner, colRW.localBoundsMin);\r\n Vector3.add(center, corner, colRW.localBoundsMax);\r\n\r\n if (colRW.height > EPSILON) {\r\n Vector3.scale(VEC3_ONE, colR.radius * colR.radiusTailScale, tailCorner);\r\n Vector3.add(colRW.positionCurrent, colRW.directionCurrent, tailCenter);\r\n colRW.worldToLocal.transformPointAffine(tailCenter, tailCenter);\r\n colRW.localBoundsMin.setXYZ(\r\n Math.min(colRW.localBoundsMin.x, tailCenter.x - tailCorner.x),\r\n Math.min(colRW.localBoundsMin.y, tailCenter.y - tailCorner.y),\r\n Math.min(colRW.localBoundsMin.z, tailCenter.z - tailCorner.z)\r\n );\r\n colRW.localBoundsMax.setXYZ(\r\n Math.max(colRW.localBoundsMax.x, tailCenter.x + tailCorner.x),\r\n Math.max(colRW.localBoundsMax.y, tailCenter.y + tailCorner.y),\r\n Math.max(colRW.localBoundsMax.z, tailCenter.z + tailCorner.z)\r\n );\r\n }\r\n }\r\n}\r\n\r\nfunction applySystemTransform(\r\n point: Vector3,\r\n pivot: Vector3,\r\n slideOffset: Vector3,\r\n rotOffset: Quaternion,\r\n result?: Vector3\r\n): Vector3 {\r\n const rotated = rotOffset.transform(\r\n Vector3.sub(point, pivot, _applySystemTransformOffset),\r\n result || _applySystemTransformRotated\r\n );\r\n Vector3.add(rotated, pivot, rotated);\r\n return Vector3.add(rotated, slideOffset, rotated);\r\n}\r\n\r\nfunction pointMayCollideBroadPhase(point: Vector3, colRW: ColliderRW, padding = 0): boolean {\r\n const radius = colRW.boundsRadius + padding;\r\n const delta = Vector3.sub(point, colRW.boundsCenter, _broadPhaseDelta);\r\n return delta.magnitudeSq <= radius * radius;\r\n}\r\n\r\nfunction segmentMayCollideBroadPhase(point1: Vector3, point2: Vector3, colRW: ColliderRW): boolean {\r\n const segmentDir = Vector3.sub(point2, point1, _broadPhaseSegmentDir);\r\n const lenSq = segmentDir.magnitudeSq;\r\n if (lenSq <= EPSILON) {\r\n return pointMayCollideBroadPhase(point1, colRW);\r\n }\r\n const toCenter = Vector3.sub(colRW.boundsCenter, point1, _broadPhaseToCenter);\r\n const t = clamp01(Vector3.dot(toCenter, segmentDir) / lenSq);\r\n const closestPoint = Vector3.scale(segmentDir, t, _broadPhaseClosestPoint);\r\n Vector3.add(point1, closestPoint, closestPoint);\r\n const delta = Vector3.sub(colRW.boundsCenter, closestPoint, _broadPhaseDelta);\r\n return delta.magnitudeSq <= colRW.boundsRadius * colRW.boundsRadius;\r\n}\r\n\r\n// Core physics simulation - direct port of JobExecuteSimulation from SPCRJointDynamicsJob.cs\r\n\r\nfunction pointUpdatePass1(\r\n pointsR: readonly PointR[],\r\n pointsRW: PointRW[],\r\n stepDelta: number,\r\n stepTime_x2_half: number,\r\n rootSlideOffset: Vector3,\r\n rootRotationOffset: Quaternion,\r\n rootPosition: Vector3,\r\n windForce: Vector3,\r\n isPaused: boolean,\r\n grabbersR: readonly GrabberR[],\r\n grabbersRW: readonly GrabberRW[],\r\n movableLimitTargets: readonly Vector3[],\r\n flatPlanes: readonly FlatPlane[],\r\n collidersR: readonly ColliderR[],\r\n collidersRW: readonly ColliderRW[]\r\n) {\r\n const currentTransformPos = new Vector3();\r\n const moveDir = new Vector3();\r\n const extForce = new Vector3();\r\n const displacement = new Vector3();\r\n const restore = new Vector3();\r\n const tempVec0 = new Vector3();\r\n const tempVec1 = new Vector3();\r\n const planeOffset = new Vector3();\r\n for (let index = 0; index < pointsR.length; index++) {\r\n const ptR = pointsR[index];\r\n const ptRW = pointsRW[index];\r\n\r\n Vector3.lerp(\r\n ptRW.positionPreviousTransform,\r\n ptRW.positionCurrentTransform,\r\n stepDelta,\r\n currentTransformPos\r\n );\r\n\r\n if (ptR.weight <= EPSILON) {\r\n ptRW.positionPrevious.set(ptRW.positionCurrent);\r\n ptRW.positionCurrent.set(currentTransformPos);\r\n } else {\r\n applySystemTransform(\r\n ptRW.positionPrevious,\r\n rootPosition,\r\n rootSlideOffset,\r\n rootRotationOffset,\r\n ptRW.positionPrevious\r\n );\r\n applySystemTransform(\r\n ptRW.positionCurrent,\r\n rootPosition,\r\n rootSlideOffset,\r\n rootRotationOffset,\r\n ptRW.positionCurrent\r\n );\r\n\r\n displacement.setXYZ(0, 0, 0);\r\n if (!isPaused) {\r\n Vector3.sub(ptRW.positionCurrent, ptRW.positionPrevious, moveDir);\r\n Vector3.scale(windForce, ptR.windForceScale / ptR.mass, extForce);\r\n Vector3.add(ptR.gravity, extForce, extForce);\r\n Vector3.scale(extForce, stepTime_x2_half, extForce);\r\n\r\n // Clamp the per-step force displacement to half the bone's rest length.\r\n // Without this, large gravity values (e.g. -50 in world space) produce a\r\n // per-step displacement comparable to the bone spacing, which exceeds what\r\n // the constraint relaxation can correct in one pass and causes surface jitter.\r\n if (ptR.parentLength > EPSILON) {\r\n const maxForceDisp = ptR.parentLength * 0.5;\r\n const forceDispSq = extForce.magnitudeSq;\r\n if (forceDispSq > maxForceDisp * maxForceDisp) {\r\n Vector3.scale(extForce, maxForceDisp / Math.sqrt(forceDispSq), extForce);\r\n }\r\n }\r\n\r\n // Apply resistance (damping) only to the velocity term, not to external forces.\r\n // Applying resistance to gravity would incorrectly attenuate acceleration each frame,\r\n // causing energy errors and instability under high gravity.\r\n Vector3.scale(moveDir, ptR.resistance, moveDir);\r\n Vector3.scale(moveDir, 1.0 - clamp01(ptRW.friction * ptR.frictionScale), moveDir);\r\n\r\n // Clamp per-step velocity to a multiple of bone rest length.\r\n // During fast root rotations the Verlet velocity can become very large,\r\n // overwhelming the constraint solver and causing the hair to lose shape.\r\n // Limiting velocity keeps the simulation stable regardless of how fast\r\n // the root moves, while still allowing natural large-amplitude swings.\r\n if (ptR.parentLength > EPSILON) {\r\n const maxVelDisp = ptR.parentLength * 2.0;\r\n const velDispSq = moveDir.magnitudeSq;\r\n if (velDispSq > maxVelDisp * maxVelDisp) {\r\n Vector3.scale(moveDir, maxVelDisp / Math.sqrt(velDispSq), moveDir);\r\n }\r\n }\r\n\r\n Vector3.add(moveDir, extForce, displacement);\r\n }\r\n\r\n ptRW.positionPrevious.set(ptRW.positionCurrent);\r\n Vector3.add(ptRW.positionCurrent, displacement, ptRW.positionCurrent);\r\n ptRW.friction = 0;\r\n\r\n if (!isPaused) {\r\n // Hardness restore\r\n if (ptR.hardness > 0) {\r\n Vector3.sub(currentTransformPos, ptRW.positionCurrent, restore);\r\n Vector3.scale(restore, ptR.hardness, restore);\r\n Vector3.add(ptRW.positionCurrent, restore, ptRW.positionCurrent);\r\n }\r\n // Force fade ratio\r\n if (ptR.forceFadeRatio > 0) {\r\n Vector3.lerp(ptRW.positionCurrent, currentTransformPos, ptR.forceFadeRatio, ptRW.positionCurrent);\r\n }\r\n // Push out of colliders immediately after hardness/fade pulls the point\r\n // toward the animated position (which may be inside a collider).\r\n // This prevents the hardness↔collision tug-of-war that causes jitter.\r\n for (let ci = 0; ci < collidersR.length; ci++) {\r\n const colRci = collidersR[ci];\r\n const colRWci = collidersRW[ci];\r\n if (colRWci.enabled === 0 || colRci.isInverseCollider) {\r\n continue;\r\n }\r\n const hRes =\r\n colRci.height <= EPSILON\r\n ? pushoutFromSphere(\r\n colRWci.positionCurrent,\r\n colRWci.radius,\r\n ptR.pointRadius,\r\n ptRW.positionCurrent\r\n )\r\n : pushoutFromCapsule(colRci, colRWci, ptRW.positionCurrent, ptR);\r\n if (hRes.hit) {\r\n ptRW.positionCurrent.set(hRes.point);\r\n }\r\n }\r\n // Grabber\r\n if (ptRW.grabberIndex !== -1) {\r\n const grR = grabbersR[ptRW.grabberIndex];\r\n const grRW = grabbersRW[ptRW.grabberIndex];\r\n if (grRW.enabled === 0) {\r\n ptRW.grabberIndex = -1;\r\n } else {\r\n Vector3.sub(ptRW.positionCurrent, grRW.position, tempVec0);\r\n Vector3.normalize(tempVec0, tempVec0);\r\n Vector3.scale(tempVec0, ptRW.grabberDistance, tempVec1);\r\n Vector3.add(grRW.position, tempVec1, tempVec1);\r\n Vector3.sub(tempVec1, ptRW.positionCurrent, tempVec0);\r\n Vector3.scale(tempVec0, grR.force, tempVec0);\r\n Vector3.add(ptRW.positionCurrent, tempVec0, ptRW.positionCurrent);\r\n }\r\n } else {\r\n let nearIndex = -1;\r\n let sqrNearRange = 1000 * 1000;\r\n for (let ig = 0; ig < grabbersR.length; ig++) {\r\n const grRW = grabbersRW[ig];\r\n if (grRW.enabled !== 0) {\r\n const sqrLen = Vector3.sub(grRW.position, ptRW.positionCurrent, tempVec0).magnitudeSq;\r\n if (sqrLen < grabbersR[ig].radius * grabbersR[ig].radius && sqrLen < sqrNearRange) {\r\n sqrNearRange = sqrLen;\r\n nearIndex = ig;\r\n }\r\n }\r\n }\r\n if (nearIndex !== -1) {\r\n ptRW.grabberIndex = nearIndex;\r\n ptRW.grabberDistance = Math.sqrt(sqrNearRange) / 2.0;\r\n }\r\n }\r\n // Movable limit\r\n if (ptR.movableLimitIndex !== -1) {\r\n const target = movableLimitTargets[ptR.movableLimitIndex];\r\n const move = Vector3.sub(ptRW.positionCurrent, target, tempVec0);\r\n const moveLen = move.magnitude;\r\n if (moveLen > ptR.movableLimitRadius) {\r\n Vector3.scale(move, ptR.movableLimitRadius / moveLen, move);\r\n Vector3.add(target, move, ptRW.positionCurrent);\r\n }\r\n }\r\n }\r\n\r\n // Flat plane collision\r\n for (let i = 0; i < flatPlanes.length; i++) {\r\n const fp = flatPlanes[i];\r\n const dist = Vector3.dot(fp.normal, ptRW.positionCurrent) + fp.distance;\r\n if (dist < 0) {\r\n Vector3.scale(fp.normal, dist, planeOffset);\r\n Vector3.sub(ptRW.positionCurrent, planeOffset, ptRW.positionCurrent);\r\n ptRW.friction = 0.3;\r\n }\r\n }\r\n }\r\n }\r\n}\r\n\r\n// Core physics simulation - direct port of JobExecuteSimulation from SPCRJointDynamicsJob.cs\r\n\r\nfunction surfaceCollision(\r\n pointsRW: PointRW[],\r\n collidersR: readonly ColliderR[],\r\n collidersRW: ColliderRW[],\r\n surfaceConstraints: readonly number[]\r\n) {\r\n const surfaceResult: SurfaceCheckResult = {\r\n hit: false,\r\n intersectionPoint: new Vector3(),\r\n pushOut: new Vector3(),\r\n pointOnCollider: new Vector3(),\r\n radius: 0\r\n };\r\n const triCenter = new Vector3();\r\n const pushDir = new Vector3();\r\n const centerToPt = new Vector3();\r\n const intersectToPt = new Vector3();\r\n const pushVec = new Vector3();\r\n for (let index = 0; index < surfaceConstraints.length; index += 6) {\r\n for (let i = 0; i < collidersR.length; i++) {\r\n const colR = collidersR[i];\r\n const colRW = collidersRW[i];\r\n if (colRW.enabled === 0) {\r\n continue;\r\n }\r\n\r\n const colliderPos = colRW.positionCurrent;\r\n\r\n for (let j = 0; j < 6; j += 3) {\r\n const idxA = surfaceConstraints[index + j + 0];\r\n const idxB = surfaceConstraints[index + j + 1];\r\n const idxC = surfaceConstraints[index + j + 2];\r\n\r\n const rwA = pointsRW[idxA];\r\n const rwB = pointsRW[idxB];\r\n const rwC = pointsRW[idxC];\r\n\r\n const result = checkSurfaceCollision(\r\n rwA.positionCurrent,\r\n rwB.positionCurrent,\r\n rwC.positionCurrent,\r\n colliderPos,\r\n colR,\r\n colRW,\r\n surfaceResult\r\n );\r\n\r\n if (result.hit) {\r\n triCenter.setXYZ(\r\n (rwA.positionCurrent.x + rwB.positionCurrent.x + rwC.positionCurrent.x) / 3,\r\n (rwA.positionCurrent.y + rwB.positionCurrent.y + rwC.positionCurrent.y) / 3,\r\n (rwA.positionCurrent.z + rwB.positionCurrent.z + rwC.positionCurrent.z) / 3\r\n );\r\n const pushMag = result.pushOut.magnitude;\r\n if (pushMag < EPSILON) {\r\n continue;\r\n }\r\n Vector3.scale(result.pushOut, 1 / pushMag, pushDir);\r\n\r\n for (let k = 0; k < 3; k++) {\r\n const idxR = surfaceConstraints[index + j + k];\r\n const rwPt = pointsRW[idxR];\r\n Vector3.sub(rwPt.positionCurrent, triCenter, centerToPt);\r\n Vector3.sub(rwPt.positionCurrent, result.intersectionPoint, intersectToPt);\r\n const intersectLen = intersectToPt.magnitude;\r\n let rate = intersectLen > EPSILON ? centerToPt.magnitude / intersectLen : 0;\r\n rate = clamp01(Math.abs(rate));\r\n Vector3.scale(pushDir, (result.radius - pushMag) * rate, pushVec);\r\n Vector3.add(rwPt.positionCurrent, pushVec, rwPt.positionCurrent);\r\n }\r\n }\r\n }\r\n }\r\n }\r\n}\r\n\r\nconst _postFixNormal = new Vector3();\r\nconst _fixedPushResult: CollisionResult = { hit: false, point: new Vector3() };\r\n\r\n/**\r\n * Before constraint solving each substep, push fixed points (weight=0) out of\r\n * any colliders they animate into. Fixed points normally follow animation\r\n * exactly, but when their animated position lies inside a collider the distance\r\n * constraint pulls free children inward through the surface, producing the\r\n * classic \"hair flipping outward\" artifact.\r\n *\r\n * We clamp positionCurrent to the collider surface so that constraints operate\r\n * from a geometrically valid anchor. The temporary change is overwritten at the\r\n * start of the next substep when positionCurrent is refreshed from the animation\r\n * transform, so the skeleton itself is never permanently altered.\r\n */\r\nfunction fixedPointColliderPushout(\r\n pointsR: readonly PointR[],\r\n pointsRW: PointRW[],\r\n collidersR: readonly ColliderR[],\r\n collidersRW: readonly ColliderRW[]\r\n): void {\r\n for (let pi = 0; pi < pointsR.length; pi++) {\r\n if (pointsR[pi].weight > EPSILON) {\r\n continue;\r\n }\r\n const ptRW = pointsRW[pi];\r\n const ptR = pointsR[pi];\r\n for (let ci = 0; ci < collidersR.length; ci++) {\r\n const colR = collidersR[ci];\r\n const colRW = collidersRW[ci];\r\n if (colRW.enabled === 0 || colR.isInverseCollider) {\r\n continue;\r\n }\r\n const res =\r\n colR.height <= EPSILON\r\n ? pushoutFromSphere(\r\n colRW.positionCurrent,\r\n colRW.radius,\r\n ptR.pointRadius,\r\n ptRW.positionCurrent,\r\n _fixedPushResult\r\n )\r\n : pushoutFromCapsule(colR, colRW, ptRW.positionCurrent, ptR, _fixedPushResult);\r\n if (res.hit) {\r\n ptRW.positionCurrent.set(res.point);\r\n }\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * Called once per substep after ALL constraint + collision relaxation iterations finish.\r\n * For each dynamic point that is actually touching a collider surface (within radius),\r\n * cancel the normal-direction component of the Verlet velocity from positionPrevious.\r\n * Points far from all colliders are untouched, preserving wind-driven velocity.\r\n */\r\nfunction postCollisionVelocityFix(\r\n pointsR: readonly PointR[],\r\n pointsRW: PointRW[],\r\n collidersR: readonly ColliderR[],\r\n collidersRW: readonly ColliderRW[]\r\n): void {\r\n for (let pi = 0; pi < pointsR.length; pi++) {\r\n const ptR = pointsR[pi];\r\n if (ptR.weight <= EPSILON) {\r\n continue;\r\n }\r\n const ptRW = pointsRW[pi];\r\n\r\n for (let ci = 0; ci < collidersR.length; ci++) {\r\n const colR = collidersR[ci];\r\n const colRW = collidersRW[ci];\r\n if (colRW.enabled === 0 || colR.isInverseCollider) {\r\n continue;\r\n }\r\n\r\n let nx = 0,\r\n ny = 0,\r\n nz = 0;\r\n if (colR.height <= EPSILON) {\r\n nx = ptRW.positionCurrent.x - colRW.positionCurrent.x;\r\n ny = ptRW.positionCurrent.y - colRW.positionCurrent.y;\r\n nz = ptRW.positionCurrent.z - colRW.positionCurrent.z;\r\n } else {\r\n const capsuleVec = colRW.directionCurrent;\r\n const capsuleVecLenSq = capsuleVec.magnitudeSq;\r\n if (capsuleVecLenSq > EPSILON) {\r\n const tx = ptRW.positionCurrent.x - colRW.positionCurrent.x;\r\n const ty = ptRW.positionCurrent.y - colRW.positionCurrent.y;\r\n const tz = ptRW.positionCurrent.z - colRW.positionCurrent.z;\r\n const t = Math.max(\r\n 0,\r\n Math.min(1, (tx * capsuleVec.x + ty * capsuleVec.y + tz * capsuleVec.z) / capsuleVecLenSq)\r\n );\r\n nx = ptRW.positionCurrent.x - (colRW.positionCurrent.x + capsuleVec.x * t);\r\n ny = ptRW.positionCurrent.y - (colRW.positionCurrent.y + capsuleVec.y * t);\r\n nz = ptRW.positionCurrent.z - (colRW.positionCurrent.z + capsuleVec.z * t);\r\n } else {\r\n nx = ptRW.positionCurrent.x - colRW.positionCurrent.x;\r\n ny = ptRW.positionCurrent.y - colRW.positionCurrent.y;\r\n nz = ptRW.positionCurrent.z - colRW.positionCurrent.z;\r\n }\r\n }\r\n\r\n const nLen = Math.sqrt(nx * nx + ny * ny + nz * nz);\r\n if (nLen < EPSILON) {\r\n continue;\r\n }\r\n\r\n const surfaceDist = nLen - colRW.radius - ptR.pointRadius;\r\n if (surfaceDist > colRW.radius * 0.05) {\r\n continue;\r\n }\r\n\r\n _postFixNormal.setXYZ(nx / nLen, ny / nLen, nz / nLen);\r\n const vx = ptRW.positionCurrent.x - ptRW.positionPrevious.x;\r\n const vy = ptRW.positionCurrent.y - ptRW.positionPrevious.y;\r\n const vz = ptRW.positionCurrent.z - ptRW.positionPrevious.z;\r\n const vDotN = vx * _postFixNormal.x + vy * _postFixNormal.y + vz * _postFixNormal.z;\r\n if (vDotN < 0) {\r\n ptRW.positionPrevious.x += _postFixNormal.x * vDotN;\r\n ptRW.positionPrevious.y += _postFixNormal.y * vDotN;\r\n ptRW.positionPrevious.z += _postFixNormal.z * vDotN;\r\n }\r\n }\r\n }\r\n}\r\n\r\nfunction constraintUpdate(\r\n pointsR: readonly PointR[],\r\n pointsRW: PointRW[],\r\n constraints: readonly Constraint[],\r\n collidersR: readonly ColliderR[],\r\n collidersRW: ColliderRW[],\r\n constraintShrinkLimit: number,\r\n enableBroadPhase: boolean\r\n) {\r\n const direction = new Vector3();\r\n const dirN = new Vector3();\r\n const disp = new Vector3();\r\n const scaledDisp = new Vector3();\r\n const pointResultA: CollisionResult = { hit: false, point: new Vector3() };\r\n const pointResultB: CollisionResult = { hit: false, point: new Vector3() };\r\n const lineResult = {\r\n hit: false,\r\n pointOnLine: new Vector3(),\r\n pointOnCollider: new Vector3(),\r\n radius: 0\r\n };\r\n const pushout = new Vector3();\r\n const segment = new Vector3();\r\n const pointToA = new Vector3();\r\n const pointToB = new Vector3();\r\n const pushN = new Vector3();\r\n const pushVec = new Vector3();\r\n for (let index = 0; index < constraints.length; index++) {\r\n const c = constraints[index];\r\n const ptRA = pointsR[c.indexA];\r\n const ptRB = pointsR[c.indexB];\r\n const weightA = ptRA.weight;\r\n const weightB = ptRB.weight;\r\n if (weightA <= EPSILON && weightB <= EPSILON) {\r\n continue;\r\n }\r\n\r\n const rwA = pointsRW[c.indexA];\r\n const rwB = pointsRW[c.indexB];\r\n\r\n Vector3.sub(rwB.positionCurrent, rwA.positionCurrent, direction);\r\n const distance = direction.magnitude;\r\n\r\n let shrinkLen = c.length;\r\n let stretchLen = shrinkLen;\r\n if (\r\n c.type === ConstraintType.Structural_Horizontal ||\r\n c.type === ConstraintType.Bending_Horizontal ||\r\n c.type === ConstraintType.Shear\r\n ) {\r\n stretchLen += ptRA.sliderJointLength + ptRB.sliderJointLength;\r\n }\r\n\r\n let force = 0;\r\n if (distance <= shrinkLen) {\r\n force = distance - shrinkLen;\r\n } else if (distance >= stretchLen) {\r\n force = distance - stretchLen;\r\n }\r\n\r\n const isShrink = force >= 0;\r\n let power = 0;\r\n switch (c.type) {\r\n case ConstraintType.Structural_Vertical:\r\n power = isShrink\r\n ? ptRA.structuralShrinkVertical + ptRB.structuralShrinkVertical\r\n : ptRA.structuralStretchVertical + ptRB.structuralStretchVertical;\r\n break;\r\n case ConstraintType.Structural_Horizontal:\r\n power = isShrink\r\n ? Math.min(constraintShrinkLimit, ptRA.structuralShrinkHorizontal + ptRB.structuralShrinkHorizontal)\r\n : ptRA.structuralStretchHorizontal + ptRB.structuralStretchHorizontal;\r\n break;\r\n case ConstraintType.Shear:\r\n power = isShrink\r\n ? Math.min(constraintShrinkLimit, ptRA.shearShrink + ptRB.shearShrink)\r\n : ptRA.shearStretch + ptRB.shearStretch;\r\n break;\r\n case ConstraintType.Bending_Vertical:\r\n power = isShrink\r\n ? ptRA.bendingShrinkVertical + ptRB.bendingShrinkVertical\r\n : ptRA.bendingStretchVertical + ptRB.bendingStretchVertical;\r\n break;\r\n case ConstraintType.Bending_Horizontal:\r\n power = isShrink\r\n ? Math.min(constraintShrinkLimit, ptRA.bendingShrinkHorizontal + ptRB.bendingShrinkHorizontal)\r\n : ptRA.bendingStretchHorizontal + ptRB.bendingStretchHorizontal;\r\n break;\r\n }\r\n\r\n if (power > 0) {\r\n if (distance > EPSILON) {\r\n Vector3.scale(direction, 1 / distance, dirN);\r\n } else {\r\n dirN.setXYZ(0, 0, 0);\r\n }\r\n Vector3.scale(dirN, force * power, disp);\r\n const wAB = weightA + weightB;\r\n Vector3.scale(disp, weightA / wAB, scaledDisp);\r\n Vector3.add(rwA.positionCurrent, scaledDisp, rwA.positionCurrent);\r\n Vector3.scale(disp, weightB / wAB, scaledDisp);\r\n Vector3.sub(rwB.positionCurrent, scaledDisp, rwB.positionCurrent);\r\n }\r\n\r\n // Per-constraint collision\r\n if (c.isCollision !== 0) {\r\n let friction = 0;\r\n for (let i = 0; i < collidersR.length; i++) {\r\n const colRW = collidersRW[i];\r\n if (colRW.enabled === 0) {\r\n continue;\r\n }\r\n const colR = collidersR[i];\r\n const canPointA =\r\n !enableBroadPhase ||\r\n colR.isInverseCollider ||\r\n pointMayCollideBroadPhase(rwA.positionCurrent, colRW, ptRA.pointRadius);\r\n const canPointB =\r\n !enableBroadPhase ||\r\n colR.isInverseCollider ||\r\n pointMayCollideBroadPhase(rwB.positionCurrent, colRW, ptRB.pointRadius);\r\n const canLine =\r\n !colR.isInverseCollider &&\r\n (!enableBroadPhase || segmentMayCollideBroadPhase(rwA.positionCurrent, rwB.positionCurrent, colRW));\r\n\r\n if (!canPointA && !canPointB && !canLine) {\r\n continue;\r\n }\r\n\r\n if (colR.height > EPSILON) {\r\n if (colR.isInverseCollider) {\r\n if (ptRA.applyInvertCollision === 1 && canPointA) {\r\n const res = pushInFromCapsule(colR, colRW, rwA.positionCurrent, pointResultA);\r\n if (res.hit) {\r\n rwA.positionCurrent.set(res.point);\r\n friction = Math.max(friction, colR.friction * 0.25);\r\n }\r\n }\r\n if (ptRB.applyInvertCollision === 1 && canPointB) {\r\n const res = pushInFromCapsule(colR, colRW, rwB.positionCurrent, pointResultB);\r\n if (res.hit) {\r\n rwB.positionCurrent.set(res.point);\r\n friction = Math.max(friction, colR.friction * 0.25);\r\n }\r\n }\r\n } else {\r\n if (canPointA) {\r\n const res = pushoutFromCapsule(colR, colRW, rwA.positionCurrent, ptRA, pointResultA);\r\n if (res.hit) {\r\n rwA.positionCurrent.set(res.point);\r\n friction = Math.max(friction, colR.friction * 0.25);\r\n }\r\n }\r\n if (canPointB) {\r\n const res = pushoutFromCapsule(colR, colRW, rwB.positionCurrent, ptRB, pointResultB);\r\n if (res.hit) {\r\n rwB.positionCurrent.set(res.point);\r\n friction = Math.max(friction, colR.friction * 0.25);\r\n }\r\n }\r\n }\r\n } else {\r\n if (colR.isInverseCollider) {\r\n if (ptRA.applyInvertCollision === 1 && canPointA) {\r\n const res = pushInFromSphere(\r\n colRW.positionCurrent,\r\n colRW.radius,\r\n rwA.positionCurrent,\r\n pointResultA\r\n );\r\n if (res.hit) {\r\n rwA.positionCurrent.set(res.point);\r\n friction = Math.max(friction, colR.friction * 0.25);\r\n }\r\n }\r\n if (ptRB.applyInvertCollision === 1 && canPointB) {\r\n const res = pushInFromSphere(\r\n colRW.positionCurrent,\r\n colRW.radius,\r\n rwB.positionCurrent,\r\n pointResultB\r\n );\r\n if (res.hit) {\r\n rwB.positionCurrent.set(res.point);\r\n friction = Math.max(friction, colR.friction * 0.25);\r\n }\r\n }\r\n } else {\r\n if (canPointA) {\r\n const res = pushoutFromSphere(\r\n colRW.positionCurrent,\r\n colRW.radius,\r\n ptRA.pointRadius,\r\n rwA.positionCurrent,\r\n pointResultA\r\n );\r\n if (res.hit) {\r\n rwA.positionCurrent.set(res.point);\r\n friction = Math.max(friction, colR.friction * 0.25);\r\n }\r\n }\r\n if (canPointB) {\r\n const res = pushoutFromSphere(\r\n colRW.positionCurrent,\r\n colRW.radius,\r\n ptRB.pointRadius,\r\n rwB.positionCurrent,\r\n pointResultB\r\n );\r\n if (res.hit) {\r\n rwB.positionCurrent.set(res.point);\r\n friction = Math.max(friction, colR.friction * 0.25);\r\n }\r\n }\r\n }\r\n }\r\n\r\n // Line segment collision\r\n if (!colR.isInverseCollider && canLine) {\r\n const lineRes = collisionDetection(\r\n colR,\r\n colRW,\r\n rwA.positionCurrent,\r\n rwB.positionCurrent,\r\n lineResult\r\n );\r\n if (lineRes.hit) {\r\n Vector3.sub(lineRes.pointOnLine, lineRes.pointOnCollider, pushout);\r\n const pushDist = pushout.magnitude;\r\n if (pushDist > EPSILON) {\r\n const ptDist = Vector3.sub(rwB.positionCurrent, rwA.positionCurrent, segment).magnitude * 0.5;\r\n const rateP1 =\r\n ptDist > EPSILON\r\n ? clamp01(\r\n Vector3.sub(lineRes.pointOnLine, rwA.positionCurrent, pointToA).magnitude / ptDist\r\n )\r\n : 0;\r\n const rateP2 =\r\n ptDist > EPSILON\r\n ? clamp01(\r\n Vector3.sub(lineRes.pointOnLine, rwB.positionCurrent, pointToB).magnitude / ptDist\r\n )\r\n : 0;\r\n Vector3.scale(pushout, 1 / pushDist, pushN);\r\n Vector3.scale(pushN, Math.max(lineRes.radius - pushDist, 0), pushVec);\r\n if (weightA > EPSILON) {\r\n Vector3.scale(pushVec, rateP2, scaledDisp);\r\n Vector3.add(rwA.positionCurrent, scaledDisp, rwA.positionCurrent);\r\n }\r\n if (weightB > EPSILON) {\r\n Vector3.scale(pushVec, rateP1, scaledDisp);\r\n Vector3.add(rwB.positionCurrent, scaledDisp, rwB.positionCurrent);\r\n }\r\n\r\n const dotUp = Vector3.dot(AXIS_Y, Vector3.normalize(pushout, pushN));\r\n friction = Math.max(friction, colR.friction * clamp01(dotUp));\r\n }\r\n }\r\n }\r\n }\r\n rwA.friction = Math.max(friction, rwA.friction);\r\n rwB.friction = Math.max(friction, rwB.friction);\r\n }\r\n }\r\n}\r\n\r\nfunction pointUpdatePass2(\r\n pointsR: readonly PointR[],\r\n pointsRW: PointRW[],\r\n positionsToTransform: Vector3[],\r\n stepDelta: number,\r\n fakeWaveFreq: number,\r\n blendRatio: number,\r\n isFakeWave: boolean,\r\n fakeWavePower: number\r\n) {\r\n let freq = fakeWaveFreq;\r\n const curTransformPos = new Vector3();\r\n const fakeWindOffset = new Vector3();\r\n for (let index = 0; index < pointsR.length; index++) {\r\n const ptR = pointsR[index];\r\n const ptRW = pointsRW[index];\r\n\r\n Vector3.lerp(ptRW.positionPreviousTransform, ptRW.positionCurrentTransform, stepDelta, curTransformPos);\r\n const blend = smoothStep(0, 1, Math.max(ptR.forceFadeRatio, blendRatio));\r\n Vector3.lerp(ptRW.positionCurrent, curTransformPos, blend, ptRW.positionToTransform);\r\n\r\n if (isFakeWave && ptR.child === -1 && ptR.parent !== -1) {\r\n const A = pointsRW[ptR.parent].positionToTransform;\r\n const B = ptRW.positionToTransform;\r\n const mAxis = Matrix4x4.lookAt(A, B, AXIS_Y);\r\n // Column 1 = up axis of the look-at matrix\r\n const col1 = mAxis.getCol(1).xyz();\r\n Vector3.lerp(ptRW.fakeWindDirection, col1, 0.5, ptRW.fakeWindDirection);\r\n\r\n freq += ptR.fakeWaveFreq;\r\n const power = Math.sin(freq) * fakeWavePower * ptR.fakeWavePower;\r\n Vector3.scale(ptRW.fakeWindDirection, power, fakeWindOffset);\r\n Vector3.add(ptRW.positionToTransform, fakeWindOffset, ptRW.positionToTransform);\r\n }\r\n\r\n positionsToTransform[index] = ptRW.positionToTransform.clone();\r\n }\r\n}\r\n\r\n/**\r\n * Output of applying the simulated result back to transforms.\r\n *\r\n * @public\r\n */\r\nexport interface ApplyResultOutput {\r\n position: Vector3;\r\n rotation: Quaternion;\r\n localRotation: Quaternion;\r\n}\r\n\r\n/**\r\n * Computes transform outputs from the simulated point positions.\r\n *\r\n * @public\r\n */\r\nexport function applyResult(\r\n pointsR: readonly PointR[],\r\n pointsRW: PointRW[],\r\n positionsToTransform: readonly Vector3[],\r\n blendRatio: number,\r\n // Current transform rotations (world and local) read from engine\r\n transformRotations: readonly Quaternion[],\r\n transformLocalRotations: readonly Quaternion[],\r\n preserveTwist: boolean\r\n): ApplyResultOutput[] {\r\n const results: ApplyResultOutput[] = new Array(pointsR.length);\r\n\r\n for (let index = 0; index < pointsR.length; index++) {\r\n const ptR = pointsR[index];\r\n const ptRW = pointsRW[index];\r\n let worldRot = transformRotations[index];\r\n let localRot = transformLocalRotations[index];\r\n\r\n if (ptR.weight >= EPSILON) {\r\n // Dynamic point\r\n if (ptR.parent !== -1) {\r\n const direction = Vector3.sub(ptRW.positionToTransform, positionsToTransform[ptR.parent]);\r\n const realLen = direction.magnitude;\r\n if (realLen > EPSILON) {\r\n ptRW.directionPrevious = direction;\r\n } else {\r\n ptRW.positionToTransform = Vector3.add(positionsToTransform[ptR.parent], ptRW.directionPrevious);\r\n }\r\n }\r\n const pos = ptRW.positionToTransform;\r\n // SetRotation with blendRatio=0 for dynamic points\r\n // Step 1: Reset localRotation to initialLocalRotation (blendRatio = 0 means fully initial)\r\n localRot = ptR.initialLocalRotation.clone();\r\n\r\n // Step 2: Recompute worldRot from the new localRot\r\n // In C#, setting localRotation immediately updates the world rotation.\r\n // worldRot = parentWorldRot * localRot\r\n // We approximate: the parent's current world rotation is in transformRotations[ptR.parent]\r\n if (ptR.parent !== -1) {\r\n // Use the parent's OUTPUT rotation (already computed if parent index < current index)\r\n const parentRot = results[ptR.parent] ? results[ptR.parent].rotation : transformRotations[ptR.parent];\r\n worldRot = Quaternion.multiply(parentRot, localRot);\r\n } else {\r\n worldRot = localRot.clone();\r\n }\r\n\r\n // Step 3: Aim toward child (simple shortest-arc, no twist correction here)\r\n if (ptR.child !== -1) {\r\n const childDir = Vector3.sub(positionsToTransform[ptR.child], ptRW.positionToTransform);\r\n if (childDir.magnitudeSq > EPSILON) {\r\n const aimVec = worldRot.transform(ptR.boneAxis);\r\n const aimRot = Quaternion.unitVectorToUnitVector(aimVec, childDir);\r\n Quaternion.multiply(aimRot, worldRot, worldRot);\r\n }\r\n }\r\n results[index] = {\r\n position: pos,\r\n rotation: worldRot,\r\n localRotation: localRot\r\n };\r\n } else {\r\n const childBlend =\r\n ptR.child !== -1 ? Math.max(pointsR[ptR.child].forceFadeRatio, blendRatio) : blendRatio;\r\n\r\n // Fixed joints are fully driven by the scene graph (animation + parent transforms).\r\n // Use the engine's current world rotation directly as the baseline �?do NOT\r\n // reconstruct it from localRot, because localRot was read from the transform that\r\n // was written back last frame (after aim correction), so it carries stale physics\r\n // noise that would accumulate each frame and cause periodic spin artifacts.\r\n // transformRotations[index] is read before applyResult runs, so it still holds\r\n // the correct animated world rotation for this frame.\r\n worldRot = transformRotations[index];\r\n\r\n // Aim toward simulated child position, blended back toward the animated direction.\r\n if (ptR.child !== -1) {\r\n const childDir = Vector3.sub(positionsToTransform[ptR.child], ptRW.positionToTransform);\r\n if (childDir.magnitudeSq > EPSILON) {\r\n const aimVec = worldRot.transform(ptR.boneAxis);\r\n const aimRot = Quaternion.unitVectorToUnitVector(aimVec, childDir);\r\n worldRot = Quaternion.slerp(Quaternion.multiply(aimRot, worldRot), worldRot, childBlend);\r\n }\r\n }\r\n results[index] = {\r\n position: ptRW.positionCurrentTransform,\r\n rotation: worldRot,\r\n localRotation: localRot\r\n };\r\n }\r\n }\r\n\r\n // Post-process: twist correction pass (parent �?child order).\r\n if (preserveTwist) {\r\n for (let index = 0; index < pointsR.length; index++) {\r\n const ptR = pointsR[index];\r\n if (ptR.weight < EPSILON || ptR.child === -1) {\r\n continue;\r\n }\r\n const result = results[index];\r\n const parentWorldRot = ptR.parent !== -1 ? results[ptR.parent].rotation : Quaternion.identity();\r\n const effectiveLocal = Quaternion.multiply(Quaternion.inverse(parentWorldRot), result.rotation);\r\n const curTwist = new Quaternion();\r\n effectiveLocal.decomposeSwingTwist(ptR.boneAxis, undefined, curTwist);\r\n const swingTF = Quaternion.multiply(effectiveLocal, Quaternion.inverse(curTwist));\r\n const correctedLocal = Quaternion.multiply(swingTF, ptR.initialLocalTwist);\r\n Quaternion.multiply(parentWorldRot, correctedLocal, result.rotation);\r\n }\r\n }\r\n\r\n return results;\r\n}\r\n\r\n/**\r\n * Applies post-simulation angle limits to the point state.\r\n *\r\n * @public\r\n */\r\nexport function applyAngleLimits(\r\n pointsR: readonly PointR[],\r\n pointsRW: PointRW[],\r\n config: AngleLimitConfig\r\n): void {\r\n if (config.angleLimit < 0) {\r\n return;\r\n }\r\n\r\n for (let index = 0; index < pointsR.length; index++) {\r\n const ptR = pointsR[index];\r\n if (ptR.parent === -1) {\r\n continue;\r\n }\r\n const ptRW = pointsRW[index];\r\n\r\n const ptRp = pointsR[ptR.parent];\r\n const ptRWp = pointsRW[ptR.parent];\r\n\r\n const superParentPos = ptRp.parent !== -1 ? pointsRW[ptRp.parent].positionCurrent : ptRWp.positionCurrent;\r\n\r\n const boneDir = Vector3.sub(ptRW.positionCurrent, ptRWp.positionCurrent);\r\n let parentBoneDir = Vector3.sub(ptRWp.positionCurrent, superParentPos);\r\n\r\n if (parentBoneDir.magnitude === 0 || config.limitFromRoot) {\r\n parentBoneDir = Vector3.sub(ptRW.positionCurrentTransform, ptRWp.positionCurrentTransform);\r\n }\r\n\r\n const angle = Vector3.angleBetween(parentBoneDir, boneDir);\r\n const remaining = radian2degree(angle) - config.angleLimit;\r\n\r\n if (remaining > 0) {\r\n const axis = Vector3.cross(parentBoneDir, boneDir);\r\n const rotated = Quaternion.fromAxisAngle(axis, degree2radian(-remaining)).transform(boneDir);\r\n ptRW.positionCurrent = Vector3.add(ptRWp.positionCurrent, rotated);\r\n }\r\n }\r\n}\r\n"],"names":["AXIS_Y","Vector3","VEC3_ONE","_computeCapsuleAxis","_computeCapsuleHalfDir","_applySystemTransformOffset","_applySystemTransformRotated","_broadPhaseSegmentDir","_broadPhaseToCenter","_broadPhaseClosestPoint","_broadPhaseDelta","simulate","params","pointsR","pointsRW","constraints","collidersR","collidersRW","grabbersR","grabbersRW","movableLimitTargets","flatPlanes","pointCount","length","positionsToTransform","Array","subSteps","isPaused","fakeWaveFreq","fakeWaveCounter","rootSlideOffset","zero","rootDeltaSlide","sub","rootPosition","previousRootPosition","rootDeltaSlideLen","magnitude","rootSlideLimit","scale","rootRotationOffset","Quaternion","identity","rootDeltaRot","multiply","rootRotation","inverse","previousRootRotation","rotateAngle","Math","acos","max","min","w","PI","rootRotateLimit","abs","sinHalf","sqrt","rotateAxis","x","y","z","axisPY","angle","fromAxisAngle","degree2radian","stepTime","iSubStep","stepDelta","stepTime_x2_half","colliderUpdate","pointUpdatePass1","windForce","fakeWaveSpeed","enableSurfaceCollision","surfaceCollision","surfaceConstraints","fixedPointColliderPushout","iRelax","relaxation","constraintUpdate","constraintShrinkLimit","enableBroadPhase","postCollisionVelocityFix","pointUpdatePass2","blendRatio","isFakeWave","fakeWavePower","computeCapsule","pos","rot","height","head","direction","transform","curPos","curDir","corner","center","tailCorner","tailCenter","i","colR","colRW","ws","worldScale","worldScaleUniform","radius","lerp","positionPreviousTransform","positionCurrentTransform","slerp","directionPreviousTransform","directionCurrentTransform","positionCurrent","directionCurrent","EPSILON","add","boundsCenter","boundsRadius","magnitudeSq","radiusTailScale","set","worldToLocal","transformPointAffine","localBoundsMin","localBoundsMax","setXYZ","applySystemTransform","point","pivot","slideOffset","rotOffset","result","rotated","pointMayCollideBroadPhase","padding","delta","segmentMayCollideBroadPhase","point1","point2","segmentDir","lenSq","toCenter","t","clamp01","dot","closestPoint","currentTransformPos","moveDir","extForce","displacement","restore","tempVec0","tempVec1","planeOffset","index","ptR","ptRW","weight","positionPrevious","windForceScale","mass","gravity","parentLength","maxForceDisp","forceDispSq","resistance","friction","frictionScale","maxVelDisp","velDispSq","hardness","forceFadeRatio","ci","colRci","colRWci","enabled","isInverseCollider","hRes","pushoutFromSphere","pointRadius","pushoutFromCapsule","hit","grabberIndex","grR","grRW","position","normalize","grabberDistance","force","nearIndex","sqrNearRange","ig","sqrLen","movableLimitIndex","target","move","moveLen","movableLimitRadius","fp","dist","normal","distance","surfaceResult","intersectionPoint","pushOut","pointOnCollider","triCenter","pushDir","centerToPt","intersectToPt","pushVec","colliderPos","j","idxA","idxB","idxC","rwA","rwB","rwC","checkSurfaceCollision","pushMag","k","idxR","rwPt","intersectLen","rate","_postFixNormal","_fixedPushResult","pi","res","nx","ny","nz","capsuleVec","capsuleVecLenSq","tx","ty","tz","nLen","surfaceDist","vx","vy","vz","vDotN","dirN","disp","scaledDisp","pointResultA","pointResultB","lineResult","pointOnLine","pushout","segment","pointToA","pointToB","pushN","c","ptRA","indexA","ptRB","indexB","weightA","weightB","shrinkLen","stretchLen","type","ConstraintType","Structural_Horizontal","Bending_Horizontal","Shear","sliderJointLength","isShrink","power","Structural_Vertical","structuralShrinkVertical","structuralStretchVertical","structuralShrinkHorizontal","structuralStretchHorizontal","shearShrink","shearStretch","Bending_Vertical","bendingShrinkVertical","bendingStretchVertical","bendingShrinkHorizontal","bendingStretchHorizontal","wAB","isCollision","canPointA","canPointB","canLine","applyInvertCollision","pushInFromCapsule","pushInFromSphere","lineRes","collisionDetection","pushDist","ptDist","rateP1","rateP2","dotUp","freq","curTransformPos","fakeWindOffset","blend","smoothStep","positionToTransform","child","parent","A","B","mAxis","Matrix4x4","lookAt","col1","getCol","xyz","fakeWindDirection","sin","clone","applyResult","transformRotations","transformLocalRotations","preserveTwist","results","worldRot","localRot","realLen","directionPrevious","initialLocalRotation","parentRot","rotation","childDir","aimVec","boneAxis","aimRot","unitVectorToUnitVector","localRotation","childBlend","parentWorldRot","effectiveLocal","curTwist","decomposeSwingTwist","undefined","swingTF","correctedLocal","initialLocalTwist","applyAngleLimits","config","angleLimit","ptRp","ptRWp","superParentPos","boneDir","parentBoneDir","limitFromRoot","angleBetween","remaining","radian2degree","axis","cross"],"mappings":"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"}
1
+ {"version":3,"file":"solver.js","sources":["../../../src/animation/joint_dynamics/solver.ts"],"sourcesContent":["// Core physics simulation - direct port of JobExecuteSimulation from SPCRJointDynamicsJob.cs\r\n\r\nimport {\r\n Quaternion,\r\n Vector3,\r\n Matrix4x4,\r\n degree2radian,\r\n radian2degree,\r\n clamp01,\r\n smoothStep\r\n} from '@zephyr3d/base';\r\nimport {\r\n EPSILON,\r\n ConstraintType,\r\n type PointR,\r\n type PointRW,\r\n type Constraint,\r\n type ColliderR,\r\n type ColliderRW,\r\n type GrabberR,\r\n type GrabberRW,\r\n type AngleLimitConfig,\r\n type FlatPlane\r\n} from './types';\r\nimport {\r\n pushoutFromSphere,\r\n pushoutFromCapsule,\r\n pushInFromSphere,\r\n pushInFromCapsule,\r\n collisionDetection,\r\n checkSurfaceCollision,\r\n type CollisionResult,\r\n type SurfaceCheckResult\r\n} from './collision';\r\n\r\nconst AXIS_Y = new Vector3(0, 1, 0);\r\nconst VEC3_ONE = new Vector3(1, 1, 1);\r\nconst _computeCapsuleAxis = new Vector3();\r\nconst _computeCapsuleHalfDir = new Vector3();\r\nconst _applySystemTransformOffset = new Vector3();\r\nconst _applySystemTransformRotated = new Vector3();\r\nconst _broadPhaseSegmentDir = new Vector3();\r\nconst _broadPhaseToCenter = new Vector3();\r\nconst _broadPhaseClosestPoint = new Vector3();\r\nconst _broadPhaseDelta = new Vector3();\r\n\r\n/**\r\n * Parameters for a single simulation step.\r\n *\r\n * @public\r\n */\r\nexport interface SimulationParams {\r\n /** If true, skip force integration (only apply root motion and output positions) */\r\n isPaused: boolean;\r\n /** Frame delta time in seconds (will be subdivided by subSteps) */\r\n stepTime: number;\r\n /** Number of substeps per frame. Higher = more stable simulation */\r\n subSteps: number;\r\n /** Current root bone world position */\r\n rootPosition: Vector3;\r\n /** Previous frame's root bone world position (for root motion limiting) */\r\n previousRootPosition: Vector3;\r\n /** Max world-space root slide distance retained after root motion. -1 = no limit */\r\n rootSlideLimit: number;\r\n /** Current root bone world rotation */\r\n rootRotation: Quaternion;\r\n /** Previous frame's root bone world rotation */\r\n previousRootRotation: Quaternion;\r\n /** Max root rotation angle (degrees) per substep. -1 = no limit */\r\n rootRotateLimit: number;\r\n /** Global wind force vector */\r\n windForce: Vector3;\r\n /** Enable triangle-based surface collision */\r\n enableSurfaceCollision: boolean;\r\n /** Triangle indices for surface collision (6 per quad: 2 triangles, 3 indices each) */\r\n surfaceConstraints: number[];\r\n /** Number of constraint relaxation iterations per substep */\r\n relaxation: number;\r\n /** Upper limit for horizontal/shear shrink power */\r\n constraintShrinkLimit: number;\r\n /** Blend ratio between physics and animation [0-1]. 0 = full physics */\r\n blendRatio: number;\r\n /** Enable sinusoidal fake wave on leaf bones */\r\n isFakeWave: boolean;\r\n /** Fake wave speed (frequency accumulation rate) */\r\n fakeWaveSpeed: number;\r\n /** Fake wave global amplitude */\r\n fakeWavePower: number;\r\n /** Current fake wave phase counter (accumulated across frames) */\r\n fakeWaveCounter: number;\r\n /** Global scale multiplier for all collider radii */\r\n collisionScale: number;\r\n /** Enable broad-phase pruning before precise collision checks */\r\n enableBroadPhase: boolean;\r\n}\r\n\r\n/**\r\n * Run the full simulation step. Mutates `pointsRW` and `collidersRW` in place.\r\n * Returns `{ positionsToTransform, fakeWaveCounter }`.\r\n *\r\n * @public\r\n */\r\nexport function simulate(\r\n params: SimulationParams,\r\n pointsR: readonly PointR[],\r\n pointsRW: PointRW[],\r\n constraints: readonly Constraint[],\r\n collidersR: readonly ColliderR[],\r\n collidersRW: ColliderRW[],\r\n grabbersR: readonly GrabberR[],\r\n grabbersRW: readonly GrabberRW[],\r\n movableLimitTargets: readonly Vector3[],\r\n flatPlanes: readonly FlatPlane[]\r\n): { positionsToTransform: Vector3[]; fakeWaveCounter: number } {\r\n const pointCount = pointsR.length;\r\n const positionsToTransform: Vector3[] = new Array(pointCount);\r\n\r\n let subSteps = params.subSteps;\r\n if (params.isPaused) {\r\n subSteps = 1;\r\n }\r\n\r\n let fakeWaveFreq = params.fakeWaveCounter;\r\n\r\n // Root slide offset\r\n let rootSlideOffset = Vector3.zero();\r\n const rootDeltaSlide = Vector3.sub(params.rootPosition, params.previousRootPosition);\r\n const rootDeltaSlideLen = rootDeltaSlide.magnitude;\r\n if (params.rootSlideLimit >= 0 && rootDeltaSlideLen > params.rootSlideLimit) {\r\n rootSlideOffset = Vector3.scale(\r\n rootDeltaSlide,\r\n (1.0 - params.rootSlideLimit / rootDeltaSlideLen) / subSteps\r\n );\r\n }\r\n\r\n // Root rotation offset\r\n let rootRotationOffset = Quaternion.identity();\r\n const rootDeltaRot = Quaternion.multiply(\r\n params.rootRotation,\r\n Quaternion.inverse(params.previousRootRotation)\r\n );\r\n let rotateAngle = Math.acos(Math.max(-1, Math.min(1, rootDeltaRot.w))) * 2.0 * (180 / Math.PI);\r\n if (rotateAngle > 180) {\r\n rotateAngle -= 360;\r\n }\r\n\r\n if (params.rootRotateLimit >= 0 && Math.abs(rotateAngle) > params.rootRotateLimit) {\r\n // Extract the rotation axis from the delta quaternion\r\n const sinHalf = Math.sqrt(Math.max(0, 1 - rootDeltaRot.w * rootDeltaRot.w));\r\n let rotateAxis: Vector3;\r\n if (sinHalf > 0.0001) {\r\n rotateAxis = new Vector3(rootDeltaRot.x / sinHalf, rootDeltaRot.y / sinHalf, rootDeltaRot.z / sinHalf);\r\n } else {\r\n rotateAxis = Vector3.axisPY();\r\n }\r\n let angle = rotateAngle > 0 ? rotateAngle - params.rootRotateLimit : rotateAngle + params.rootRotateLimit;\r\n angle /= subSteps;\r\n rootRotationOffset = Quaternion.fromAxisAngle(rotateAxis, degree2radian(angle));\r\n }\r\n\r\n if (params.isPaused) {\r\n rootSlideOffset = rootDeltaSlide;\r\n rootRotationOffset = rootDeltaRot;\r\n }\r\n\r\n const stepTime = params.stepTime / subSteps;\r\n\r\n for (let iSubStep = 1; iSubStep <= subSteps; iSubStep++) {\r\n const stepDelta = iSubStep / subSteps;\r\n const stepTime_x2_half = stepTime * stepTime * 0.5;\r\n\r\n colliderUpdate(collidersR, collidersRW, stepDelta);\r\n pointUpdatePass1(\r\n pointsR,\r\n pointsRW,\r\n stepDelta,\r\n stepTime_x2_half,\r\n rootSlideOffset,\r\n rootRotationOffset,\r\n params.rootPosition,\r\n params.windForce,\r\n params.isPaused,\r\n grabbersR,\r\n grabbersRW,\r\n movableLimitTargets,\r\n flatPlanes,\r\n collidersR,\r\n collidersRW\r\n );\r\n\r\n if (!params.isPaused) {\r\n fakeWaveFreq += params.fakeWaveSpeed * stepTime;\r\n\r\n if (params.enableSurfaceCollision) {\r\n surfaceCollision(pointsRW, collidersR, collidersRW, params.surfaceConstraints);\r\n }\r\n\r\n // Push fixed points out of colliders before constraint solving.\r\n // Fixed points follow animation and cannot be moved by the solver, but if\r\n // their animated position is inside a collider, the distance constraint will\r\n // pull free children inward through the surface �?causing the characteristic\r\n // \"hair flipping outward\" artifact at the back of the head.\r\n // By temporarily clamping fixed-point positionCurrent to the collider surface\r\n // before each substep's constraint pass, we ensure constraints operate from\r\n // a geometrically valid anchor. The original animated position is restored\r\n // at the start of the next substep via positionCurrentTransform.\r\n fixedPointColliderPushout(pointsR, pointsRW, collidersR, collidersRW);\r\n\r\n for (let iRelax = params.relaxation - 1; iRelax >= 0; --iRelax) {\r\n constraintUpdate(\r\n pointsR,\r\n pointsRW,\r\n constraints,\r\n collidersR,\r\n collidersRW,\r\n params.constraintShrinkLimit,\r\n params.enableBroadPhase\r\n );\r\n }\r\n\r\n // After all constraint/collision iterations are done, cancel any residual\r\n // normal velocity that would push points back into colliders next frame.\r\n // We compare the final positionCurrent (guaranteed outside all colliders)\r\n // against positionPrevious (the Verlet integration start point) and zero\r\n // out the component pointing into each collider.\r\n postCollisionVelocityFix(pointsR, pointsRW, collidersR, collidersRW);\r\n }\r\n\r\n pointUpdatePass2(\r\n pointsR,\r\n pointsRW,\r\n positionsToTransform,\r\n stepDelta,\r\n fakeWaveFreq,\r\n params.blendRatio,\r\n params.isFakeWave,\r\n params.fakeWavePower\r\n );\r\n }\r\n\r\n return { positionsToTransform, fakeWaveCounter: fakeWaveFreq };\r\n}\r\n\r\nfunction computeCapsule(\r\n pos: Vector3,\r\n rot: Quaternion,\r\n height: number,\r\n head: Vector3,\r\n direction: Vector3\r\n): void {\r\n rot.transform(Vector3.scale(AXIS_Y, height, _computeCapsuleAxis), direction);\r\n Vector3.scale(direction, 0.5, _computeCapsuleHalfDir);\r\n Vector3.sub(pos, _computeCapsuleHalfDir, head);\r\n}\r\n\r\nfunction colliderUpdate(collidersR: readonly ColliderR[], collidersRW: ColliderRW[], stepDelta: number) {\r\n const curPos = new Vector3();\r\n const curDir = new Quaternion();\r\n const corner = new Vector3();\r\n const center = new Vector3();\r\n const tailCorner = new Vector3();\r\n const tailCenter = new Vector3();\r\n for (let i = 0; i < collidersR.length; i++) {\r\n const colR = collidersR[i];\r\n const colRW = collidersRW[i];\r\n // Scale radius by the uniform world scale of the collider node.\r\n // Use the average of x/y/z components to handle non-uniform scale gracefully.\r\n const ws = colRW.worldScale;\r\n const worldScaleUniform = (ws.x + ws.y + ws.z) / 3;\r\n colRW.radius = colR.radius * worldScaleUniform;\r\n colRW.height = colR.height * worldScaleUniform;\r\n\r\n Vector3.lerp(colRW.positionPreviousTransform, colRW.positionCurrentTransform, stepDelta, curPos);\r\n Quaternion.slerp(colRW.directionPreviousTransform, colRW.directionCurrentTransform, stepDelta, curDir);\r\n\r\n computeCapsule(curPos, curDir, colRW.height, colRW.positionCurrent, colRW.directionCurrent);\r\n if (colRW.height > EPSILON) {\r\n Vector3.scale(colRW.directionCurrent, 0.5, _computeCapsuleHalfDir);\r\n Vector3.add(colRW.positionCurrent, _computeCapsuleHalfDir, colRW.boundsCenter);\r\n colRW.boundsRadius =\r\n Math.sqrt(colRW.directionCurrent.magnitudeSq) * 0.5 +\r\n Math.max(colRW.radius, colRW.radius * colR.radiusTailScale);\r\n } else {\r\n colRW.boundsCenter.set(colRW.positionCurrent);\r\n colRW.boundsRadius = colRW.radius;\r\n }\r\n\r\n // Update local bounds\r\n Vector3.scale(VEC3_ONE, colR.radius, corner);\r\n colRW.worldToLocal.transformPointAffine(colRW.positionCurrent, center);\r\n Vector3.sub(center, corner, colRW.localBoundsMin);\r\n Vector3.add(center, corner, colRW.localBoundsMax);\r\n\r\n if (colRW.height > EPSILON) {\r\n Vector3.scale(VEC3_ONE, colR.radius * colR.radiusTailScale, tailCorner);\r\n Vector3.add(colRW.positionCurrent, colRW.directionCurrent, tailCenter);\r\n colRW.worldToLocal.transformPointAffine(tailCenter, tailCenter);\r\n colRW.localBoundsMin.setXYZ(\r\n Math.min(colRW.localBoundsMin.x, tailCenter.x - tailCorner.x),\r\n Math.min(colRW.localBoundsMin.y, tailCenter.y - tailCorner.y),\r\n Math.min(colRW.localBoundsMin.z, tailCenter.z - tailCorner.z)\r\n );\r\n colRW.localBoundsMax.setXYZ(\r\n Math.max(colRW.localBoundsMax.x, tailCenter.x + tailCorner.x),\r\n Math.max(colRW.localBoundsMax.y, tailCenter.y + tailCorner.y),\r\n Math.max(colRW.localBoundsMax.z, tailCenter.z + tailCorner.z)\r\n );\r\n }\r\n }\r\n}\r\n\r\nfunction applySystemTransform(\r\n point: Vector3,\r\n pivot: Vector3,\r\n slideOffset: Vector3,\r\n rotOffset: Quaternion,\r\n result?: Vector3\r\n): Vector3 {\r\n const rotated = rotOffset.transform(\r\n Vector3.sub(point, pivot, _applySystemTransformOffset),\r\n result || _applySystemTransformRotated\r\n );\r\n Vector3.add(rotated, pivot, rotated);\r\n return Vector3.add(rotated, slideOffset, rotated);\r\n}\r\n\r\nfunction pointMayCollideBroadPhase(point: Vector3, colRW: ColliderRW, padding = 0): boolean {\r\n const radius = colRW.boundsRadius + padding;\r\n const delta = Vector3.sub(point, colRW.boundsCenter, _broadPhaseDelta);\r\n return delta.magnitudeSq <= radius * radius;\r\n}\r\n\r\nfunction segmentMayCollideBroadPhase(point1: Vector3, point2: Vector3, colRW: ColliderRW): boolean {\r\n const segmentDir = Vector3.sub(point2, point1, _broadPhaseSegmentDir);\r\n const lenSq = segmentDir.magnitudeSq;\r\n if (lenSq <= EPSILON) {\r\n return pointMayCollideBroadPhase(point1, colRW);\r\n }\r\n const toCenter = Vector3.sub(colRW.boundsCenter, point1, _broadPhaseToCenter);\r\n const t = clamp01(Vector3.dot(toCenter, segmentDir) / lenSq);\r\n const closestPoint = Vector3.scale(segmentDir, t, _broadPhaseClosestPoint);\r\n Vector3.add(point1, closestPoint, closestPoint);\r\n const delta = Vector3.sub(colRW.boundsCenter, closestPoint, _broadPhaseDelta);\r\n return delta.magnitudeSq <= colRW.boundsRadius * colRW.boundsRadius;\r\n}\r\n\r\n// Core physics simulation - direct port of JobExecuteSimulation from SPCRJointDynamicsJob.cs\r\n\r\nfunction pointUpdatePass1(\r\n pointsR: readonly PointR[],\r\n pointsRW: PointRW[],\r\n stepDelta: number,\r\n stepTime_x2_half: number,\r\n rootSlideOffset: Vector3,\r\n rootRotationOffset: Quaternion,\r\n rootPosition: Vector3,\r\n windForce: Vector3,\r\n isPaused: boolean,\r\n grabbersR: readonly GrabberR[],\r\n grabbersRW: readonly GrabberRW[],\r\n movableLimitTargets: readonly Vector3[],\r\n flatPlanes: readonly FlatPlane[],\r\n collidersR: readonly ColliderR[],\r\n collidersRW: readonly ColliderRW[]\r\n) {\r\n const currentTransformPos = new Vector3();\r\n const moveDir = new Vector3();\r\n const extForce = new Vector3();\r\n const displacement = new Vector3();\r\n const restore = new Vector3();\r\n const tempVec0 = new Vector3();\r\n const tempVec1 = new Vector3();\r\n const planeOffset = new Vector3();\r\n for (let index = 0; index < pointsR.length; index++) {\r\n const ptR = pointsR[index];\r\n const ptRW = pointsRW[index];\r\n\r\n Vector3.lerp(\r\n ptRW.positionPreviousTransform,\r\n ptRW.positionCurrentTransform,\r\n stepDelta,\r\n currentTransformPos\r\n );\r\n\r\n if (ptR.weight <= EPSILON) {\r\n ptRW.positionPrevious.set(ptRW.positionCurrent);\r\n ptRW.positionCurrent.set(currentTransformPos);\r\n } else {\r\n applySystemTransform(\r\n ptRW.positionPrevious,\r\n rootPosition,\r\n rootSlideOffset,\r\n rootRotationOffset,\r\n ptRW.positionPrevious\r\n );\r\n applySystemTransform(\r\n ptRW.positionCurrent,\r\n rootPosition,\r\n rootSlideOffset,\r\n rootRotationOffset,\r\n ptRW.positionCurrent\r\n );\r\n\r\n displacement.setXYZ(0, 0, 0);\r\n if (!isPaused) {\r\n Vector3.sub(ptRW.positionCurrent, ptRW.positionPrevious, moveDir);\r\n Vector3.scale(windForce, ptR.windForceScale / ptR.mass, extForce);\r\n Vector3.add(ptR.gravity, extForce, extForce);\r\n Vector3.scale(extForce, stepTime_x2_half, extForce);\r\n\r\n // Clamp the per-step force displacement to half the bone's rest length.\r\n // Without this, large gravity values (e.g. -50 in world space) produce a\r\n // per-step displacement comparable to the bone spacing, which exceeds what\r\n // the constraint relaxation can correct in one pass and causes surface jitter.\r\n if (ptR.parentLength > EPSILON) {\r\n const maxForceDisp = ptR.parentLength * 0.5;\r\n const forceDispSq = extForce.magnitudeSq;\r\n if (forceDispSq > maxForceDisp * maxForceDisp) {\r\n Vector3.scale(extForce, maxForceDisp / Math.sqrt(forceDispSq), extForce);\r\n }\r\n }\r\n\r\n // Apply resistance (damping) only to the velocity term, not to external forces.\r\n // Applying resistance to gravity would incorrectly attenuate acceleration each frame,\r\n // causing energy errors and instability under high gravity.\r\n Vector3.scale(moveDir, ptR.resistance, moveDir);\r\n Vector3.scale(moveDir, 1.0 - clamp01(ptRW.friction * ptR.frictionScale), moveDir);\r\n\r\n // Clamp per-step velocity to a multiple of bone rest length.\r\n // During fast root rotations the Verlet velocity can become very large,\r\n // overwhelming the constraint solver and causing the hair to lose shape.\r\n // Limiting velocity keeps the simulation stable regardless of how fast\r\n // the root moves, while still allowing natural large-amplitude swings.\r\n if (ptR.parentLength > EPSILON) {\r\n const maxVelDisp = ptR.parentLength * 2.0;\r\n const velDispSq = moveDir.magnitudeSq;\r\n if (velDispSq > maxVelDisp * maxVelDisp) {\r\n Vector3.scale(moveDir, maxVelDisp / Math.sqrt(velDispSq), moveDir);\r\n }\r\n }\r\n\r\n Vector3.add(moveDir, extForce, displacement);\r\n }\r\n\r\n ptRW.positionPrevious.set(ptRW.positionCurrent);\r\n Vector3.add(ptRW.positionCurrent, displacement, ptRW.positionCurrent);\r\n ptRW.friction = 0;\r\n\r\n if (!isPaused) {\r\n // Hardness restore\r\n if (ptR.hardness > 0) {\r\n Vector3.sub(currentTransformPos, ptRW.positionCurrent, restore);\r\n Vector3.scale(restore, ptR.hardness, restore);\r\n Vector3.add(ptRW.positionCurrent, restore, ptRW.positionCurrent);\r\n }\r\n // Force fade ratio\r\n if (ptR.forceFadeRatio > 0) {\r\n Vector3.lerp(ptRW.positionCurrent, currentTransformPos, ptR.forceFadeRatio, ptRW.positionCurrent);\r\n }\r\n // Push out of colliders immediately after hardness/fade pulls the point\r\n // toward the animated position (which may be inside a collider).\r\n // This prevents the hardness↔collision tug-of-war that causes jitter.\r\n for (let ci = 0; ci < collidersR.length; ci++) {\r\n const colRci = collidersR[ci];\r\n const colRWci = collidersRW[ci];\r\n if (colRWci.enabled === 0 || colRci.isInverseCollider) {\r\n continue;\r\n }\r\n const hRes =\r\n colRci.height <= EPSILON\r\n ? pushoutFromSphere(\r\n colRWci.positionCurrent,\r\n colRWci.radius,\r\n ptR.pointRadius,\r\n ptRW.positionCurrent\r\n )\r\n : pushoutFromCapsule(colRci, colRWci, ptRW.positionCurrent, ptR);\r\n if (hRes.hit) {\r\n ptRW.positionCurrent.set(hRes.point);\r\n }\r\n }\r\n // Grabber\r\n if (ptRW.grabberIndex !== -1) {\r\n const grR = grabbersR[ptRW.grabberIndex];\r\n const grRW = grabbersRW[ptRW.grabberIndex];\r\n if (grRW.enabled === 0) {\r\n ptRW.grabberIndex = -1;\r\n } else {\r\n Vector3.sub(ptRW.positionCurrent, grRW.position, tempVec0);\r\n Vector3.normalize(tempVec0, tempVec0);\r\n Vector3.scale(tempVec0, ptRW.grabberDistance, tempVec1);\r\n Vector3.add(grRW.position, tempVec1, tempVec1);\r\n Vector3.sub(tempVec1, ptRW.positionCurrent, tempVec0);\r\n Vector3.scale(tempVec0, grR.force, tempVec0);\r\n Vector3.add(ptRW.positionCurrent, tempVec0, ptRW.positionCurrent);\r\n }\r\n } else {\r\n let nearIndex = -1;\r\n let sqrNearRange = 1000 * 1000;\r\n for (let ig = 0; ig < grabbersR.length; ig++) {\r\n const grRW = grabbersRW[ig];\r\n if (grRW.enabled !== 0) {\r\n const sqrLen = Vector3.sub(grRW.position, ptRW.positionCurrent, tempVec0).magnitudeSq;\r\n if (sqrLen < grabbersR[ig].radius * grabbersR[ig].radius && sqrLen < sqrNearRange) {\r\n sqrNearRange = sqrLen;\r\n nearIndex = ig;\r\n }\r\n }\r\n }\r\n if (nearIndex !== -1) {\r\n ptRW.grabberIndex = nearIndex;\r\n ptRW.grabberDistance = Math.sqrt(sqrNearRange) / 2.0;\r\n }\r\n }\r\n // Movable limit\r\n if (ptR.movableLimitIndex !== -1) {\r\n const target = movableLimitTargets[ptR.movableLimitIndex];\r\n const move = Vector3.sub(ptRW.positionCurrent, target, tempVec0);\r\n const moveLen = move.magnitude;\r\n if (moveLen > ptR.movableLimitRadius) {\r\n Vector3.scale(move, ptR.movableLimitRadius / moveLen, move);\r\n Vector3.add(target, move, ptRW.positionCurrent);\r\n }\r\n }\r\n }\r\n\r\n // Flat plane collision\r\n for (let i = 0; i < flatPlanes.length; i++) {\r\n const fp = flatPlanes[i];\r\n const dist = Vector3.dot(fp.normal, ptRW.positionCurrent) + fp.distance;\r\n if (dist < 0) {\r\n Vector3.scale(fp.normal, dist, planeOffset);\r\n Vector3.sub(ptRW.positionCurrent, planeOffset, ptRW.positionCurrent);\r\n ptRW.friction = 0.3;\r\n }\r\n }\r\n }\r\n }\r\n}\r\n\r\n// Core physics simulation - direct port of JobExecuteSimulation from SPCRJointDynamicsJob.cs\r\n\r\nfunction surfaceCollision(\r\n pointsRW: PointRW[],\r\n collidersR: readonly ColliderR[],\r\n collidersRW: ColliderRW[],\r\n surfaceConstraints: readonly number[]\r\n) {\r\n const surfaceResult: SurfaceCheckResult = {\r\n hit: false,\r\n intersectionPoint: new Vector3(),\r\n pushOut: new Vector3(),\r\n pointOnCollider: new Vector3(),\r\n radius: 0\r\n };\r\n const triCenter = new Vector3();\r\n const pushDir = new Vector3();\r\n const centerToPt = new Vector3();\r\n const intersectToPt = new Vector3();\r\n const pushVec = new Vector3();\r\n for (let index = 0; index < surfaceConstraints.length; index += 6) {\r\n for (let i = 0; i < collidersR.length; i++) {\r\n const colR = collidersR[i];\r\n const colRW = collidersRW[i];\r\n if (colRW.enabled === 0) {\r\n continue;\r\n }\r\n\r\n const colliderPos = colRW.positionCurrent;\r\n\r\n for (let j = 0; j < 6; j += 3) {\r\n const idxA = surfaceConstraints[index + j + 0];\r\n const idxB = surfaceConstraints[index + j + 1];\r\n const idxC = surfaceConstraints[index + j + 2];\r\n\r\n const rwA = pointsRW[idxA];\r\n const rwB = pointsRW[idxB];\r\n const rwC = pointsRW[idxC];\r\n\r\n const result = checkSurfaceCollision(\r\n rwA.positionCurrent,\r\n rwB.positionCurrent,\r\n rwC.positionCurrent,\r\n colliderPos,\r\n colR,\r\n colRW,\r\n surfaceResult\r\n );\r\n\r\n if (result.hit) {\r\n triCenter.setXYZ(\r\n (rwA.positionCurrent.x + rwB.positionCurrent.x + rwC.positionCurrent.x) / 3,\r\n (rwA.positionCurrent.y + rwB.positionCurrent.y + rwC.positionCurrent.y) / 3,\r\n (rwA.positionCurrent.z + rwB.positionCurrent.z + rwC.positionCurrent.z) / 3\r\n );\r\n const pushMag = result.pushOut.magnitude;\r\n if (pushMag < EPSILON) {\r\n continue;\r\n }\r\n Vector3.scale(result.pushOut, 1 / pushMag, pushDir);\r\n\r\n for (let k = 0; k < 3; k++) {\r\n const idxR = surfaceConstraints[index + j + k];\r\n const rwPt = pointsRW[idxR];\r\n Vector3.sub(rwPt.positionCurrent, triCenter, centerToPt);\r\n Vector3.sub(rwPt.positionCurrent, result.intersectionPoint, intersectToPt);\r\n const intersectLen = intersectToPt.magnitude;\r\n let rate = intersectLen > EPSILON ? centerToPt.magnitude / intersectLen : 0;\r\n rate = clamp01(Math.abs(rate));\r\n Vector3.scale(pushDir, (result.radius - pushMag) * rate, pushVec);\r\n Vector3.add(rwPt.positionCurrent, pushVec, rwPt.positionCurrent);\r\n }\r\n }\r\n }\r\n }\r\n }\r\n}\r\n\r\nconst _postFixNormal = new Vector3();\r\nconst _fixedPushResult: CollisionResult = { hit: false, point: new Vector3() };\r\n\r\n/**\r\n * Before constraint solving each substep, push fixed points (weight=0) out of\r\n * any colliders they animate into. Fixed points normally follow animation\r\n * exactly, but when their animated position lies inside a collider the distance\r\n * constraint pulls free children inward through the surface, producing the\r\n * classic \"hair flipping outward\" artifact.\r\n *\r\n * We clamp positionCurrent to the collider surface so that constraints operate\r\n * from a geometrically valid anchor. The temporary change is overwritten at the\r\n * start of the next substep when positionCurrent is refreshed from the animation\r\n * transform, so the skeleton itself is never permanently altered.\r\n */\r\nfunction fixedPointColliderPushout(\r\n pointsR: readonly PointR[],\r\n pointsRW: PointRW[],\r\n collidersR: readonly ColliderR[],\r\n collidersRW: readonly ColliderRW[]\r\n): void {\r\n for (let pi = 0; pi < pointsR.length; pi++) {\r\n if (pointsR[pi].weight > EPSILON) {\r\n continue;\r\n }\r\n const ptRW = pointsRW[pi];\r\n const ptR = pointsR[pi];\r\n for (let ci = 0; ci < collidersR.length; ci++) {\r\n const colR = collidersR[ci];\r\n const colRW = collidersRW[ci];\r\n if (colRW.enabled === 0 || colR.isInverseCollider) {\r\n continue;\r\n }\r\n const res =\r\n colR.height <= EPSILON\r\n ? pushoutFromSphere(\r\n colRW.positionCurrent,\r\n colRW.radius,\r\n ptR.pointRadius,\r\n ptRW.positionCurrent,\r\n _fixedPushResult\r\n )\r\n : pushoutFromCapsule(colR, colRW, ptRW.positionCurrent, ptR, _fixedPushResult);\r\n if (res.hit) {\r\n ptRW.positionCurrent.set(res.point);\r\n }\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * Called once per substep after ALL constraint + collision relaxation iterations finish.\r\n * For each dynamic point that is actually touching a collider surface (within radius),\r\n * cancel the normal-direction component of the Verlet velocity from positionPrevious.\r\n * Points far from all colliders are untouched, preserving wind-driven velocity.\r\n */\r\nfunction postCollisionVelocityFix(\r\n pointsR: readonly PointR[],\r\n pointsRW: PointRW[],\r\n collidersR: readonly ColliderR[],\r\n collidersRW: readonly ColliderRW[]\r\n): void {\r\n for (let pi = 0; pi < pointsR.length; pi++) {\r\n const ptR = pointsR[pi];\r\n if (ptR.weight <= EPSILON) {\r\n continue;\r\n }\r\n const ptRW = pointsRW[pi];\r\n\r\n for (let ci = 0; ci < collidersR.length; ci++) {\r\n const colR = collidersR[ci];\r\n const colRW = collidersRW[ci];\r\n if (colRW.enabled === 0 || colR.isInverseCollider) {\r\n continue;\r\n }\r\n\r\n let nx = 0,\r\n ny = 0,\r\n nz = 0;\r\n if (colR.height <= EPSILON) {\r\n nx = ptRW.positionCurrent.x - colRW.positionCurrent.x;\r\n ny = ptRW.positionCurrent.y - colRW.positionCurrent.y;\r\n nz = ptRW.positionCurrent.z - colRW.positionCurrent.z;\r\n } else {\r\n const capsuleVec = colRW.directionCurrent;\r\n const capsuleVecLenSq = capsuleVec.magnitudeSq;\r\n if (capsuleVecLenSq > EPSILON) {\r\n const tx = ptRW.positionCurrent.x - colRW.positionCurrent.x;\r\n const ty = ptRW.positionCurrent.y - colRW.positionCurrent.y;\r\n const tz = ptRW.positionCurrent.z - colRW.positionCurrent.z;\r\n const t = Math.max(\r\n 0,\r\n Math.min(1, (tx * capsuleVec.x + ty * capsuleVec.y + tz * capsuleVec.z) / capsuleVecLenSq)\r\n );\r\n nx = ptRW.positionCurrent.x - (colRW.positionCurrent.x + capsuleVec.x * t);\r\n ny = ptRW.positionCurrent.y - (colRW.positionCurrent.y + capsuleVec.y * t);\r\n nz = ptRW.positionCurrent.z - (colRW.positionCurrent.z + capsuleVec.z * t);\r\n } else {\r\n nx = ptRW.positionCurrent.x - colRW.positionCurrent.x;\r\n ny = ptRW.positionCurrent.y - colRW.positionCurrent.y;\r\n nz = ptRW.positionCurrent.z - colRW.positionCurrent.z;\r\n }\r\n }\r\n\r\n const nLen = Math.sqrt(nx * nx + ny * ny + nz * nz);\r\n if (nLen < EPSILON) {\r\n continue;\r\n }\r\n\r\n const surfaceDist = nLen - colRW.radius - ptR.pointRadius;\r\n if (surfaceDist > colRW.radius * 0.05) {\r\n continue;\r\n }\r\n\r\n _postFixNormal.setXYZ(nx / nLen, ny / nLen, nz / nLen);\r\n const vx = ptRW.positionCurrent.x - ptRW.positionPrevious.x;\r\n const vy = ptRW.positionCurrent.y - ptRW.positionPrevious.y;\r\n const vz = ptRW.positionCurrent.z - ptRW.positionPrevious.z;\r\n const vDotN = vx * _postFixNormal.x + vy * _postFixNormal.y + vz * _postFixNormal.z;\r\n if (vDotN < 0) {\r\n ptRW.positionPrevious.x += _postFixNormal.x * vDotN;\r\n ptRW.positionPrevious.y += _postFixNormal.y * vDotN;\r\n ptRW.positionPrevious.z += _postFixNormal.z * vDotN;\r\n }\r\n }\r\n }\r\n}\r\n\r\nfunction constraintUpdate(\r\n pointsR: readonly PointR[],\r\n pointsRW: PointRW[],\r\n constraints: readonly Constraint[],\r\n collidersR: readonly ColliderR[],\r\n collidersRW: ColliderRW[],\r\n constraintShrinkLimit: number,\r\n enableBroadPhase: boolean\r\n) {\r\n const direction = new Vector3();\r\n const dirN = new Vector3();\r\n const disp = new Vector3();\r\n const scaledDisp = new Vector3();\r\n const pointResultA: CollisionResult = { hit: false, point: new Vector3() };\r\n const pointResultB: CollisionResult = { hit: false, point: new Vector3() };\r\n const lineResult = {\r\n hit: false,\r\n pointOnLine: new Vector3(),\r\n pointOnCollider: new Vector3(),\r\n radius: 0\r\n };\r\n const pushout = new Vector3();\r\n const segment = new Vector3();\r\n const pointToA = new Vector3();\r\n const pointToB = new Vector3();\r\n const pushN = new Vector3();\r\n const pushVec = new Vector3();\r\n for (let index = 0; index < constraints.length; index++) {\r\n const c = constraints[index];\r\n const ptRA = pointsR[c.indexA];\r\n const ptRB = pointsR[c.indexB];\r\n const weightA = ptRA.weight;\r\n const weightB = ptRB.weight;\r\n if (weightA <= EPSILON && weightB <= EPSILON) {\r\n continue;\r\n }\r\n\r\n const rwA = pointsRW[c.indexA];\r\n const rwB = pointsRW[c.indexB];\r\n\r\n Vector3.sub(rwB.positionCurrent, rwA.positionCurrent, direction);\r\n const distance = direction.magnitude;\r\n\r\n let shrinkLen = c.length;\r\n let stretchLen = shrinkLen;\r\n if (\r\n c.type === ConstraintType.Structural_Horizontal ||\r\n c.type === ConstraintType.Bending_Horizontal ||\r\n c.type === ConstraintType.Shear\r\n ) {\r\n stretchLen += ptRA.sliderJointLength + ptRB.sliderJointLength;\r\n }\r\n\r\n let force = 0;\r\n if (distance <= shrinkLen) {\r\n force = distance - shrinkLen;\r\n } else if (distance >= stretchLen) {\r\n force = distance - stretchLen;\r\n }\r\n\r\n const isShrink = force >= 0;\r\n let power = 0;\r\n switch (c.type) {\r\n case ConstraintType.Structural_Vertical:\r\n power = isShrink\r\n ? ptRA.structuralShrinkVertical + ptRB.structuralShrinkVertical\r\n : ptRA.structuralStretchVertical + ptRB.structuralStretchVertical;\r\n break;\r\n case ConstraintType.Structural_Horizontal:\r\n power = isShrink\r\n ? Math.min(constraintShrinkLimit, ptRA.structuralShrinkHorizontal + ptRB.structuralShrinkHorizontal)\r\n : ptRA.structuralStretchHorizontal + ptRB.structuralStretchHorizontal;\r\n break;\r\n case ConstraintType.Shear:\r\n power = isShrink\r\n ? Math.min(constraintShrinkLimit, ptRA.shearShrink + ptRB.shearShrink)\r\n : ptRA.shearStretch + ptRB.shearStretch;\r\n break;\r\n case ConstraintType.Bending_Vertical:\r\n power = isShrink\r\n ? ptRA.bendingShrinkVertical + ptRB.bendingShrinkVertical\r\n : ptRA.bendingStretchVertical + ptRB.bendingStretchVertical;\r\n break;\r\n case ConstraintType.Bending_Horizontal:\r\n power = isShrink\r\n ? Math.min(constraintShrinkLimit, ptRA.bendingShrinkHorizontal + ptRB.bendingShrinkHorizontal)\r\n : ptRA.bendingStretchHorizontal + ptRB.bendingStretchHorizontal;\r\n break;\r\n }\r\n\r\n if (power > 0) {\r\n if (distance > EPSILON) {\r\n Vector3.scale(direction, 1 / distance, dirN);\r\n } else {\r\n dirN.setXYZ(0, 0, 0);\r\n }\r\n Vector3.scale(dirN, force * power, disp);\r\n const wAB = weightA + weightB;\r\n Vector3.scale(disp, weightA / wAB, scaledDisp);\r\n Vector3.add(rwA.positionCurrent, scaledDisp, rwA.positionCurrent);\r\n Vector3.scale(disp, weightB / wAB, scaledDisp);\r\n Vector3.sub(rwB.positionCurrent, scaledDisp, rwB.positionCurrent);\r\n }\r\n\r\n // Per-constraint collision\r\n if (c.isCollision !== 0) {\r\n let friction = 0;\r\n for (let i = 0; i < collidersR.length; i++) {\r\n const colRW = collidersRW[i];\r\n if (colRW.enabled === 0) {\r\n continue;\r\n }\r\n const colR = collidersR[i];\r\n const canPointA =\r\n !enableBroadPhase ||\r\n colR.isInverseCollider ||\r\n pointMayCollideBroadPhase(rwA.positionCurrent, colRW, ptRA.pointRadius);\r\n const canPointB =\r\n !enableBroadPhase ||\r\n colR.isInverseCollider ||\r\n pointMayCollideBroadPhase(rwB.positionCurrent, colRW, ptRB.pointRadius);\r\n const canLine =\r\n !colR.isInverseCollider &&\r\n (!enableBroadPhase || segmentMayCollideBroadPhase(rwA.positionCurrent, rwB.positionCurrent, colRW));\r\n\r\n if (!canPointA && !canPointB && !canLine) {\r\n continue;\r\n }\r\n\r\n if (colR.height > EPSILON) {\r\n if (colR.isInverseCollider) {\r\n if (ptRA.applyInvertCollision === 1 && canPointA) {\r\n const res = pushInFromCapsule(colR, colRW, rwA.positionCurrent, pointResultA);\r\n if (res.hit) {\r\n rwA.positionCurrent.set(res.point);\r\n friction = Math.max(friction, colR.friction * 0.25);\r\n }\r\n }\r\n if (ptRB.applyInvertCollision === 1 && canPointB) {\r\n const res = pushInFromCapsule(colR, colRW, rwB.positionCurrent, pointResultB);\r\n if (res.hit) {\r\n rwB.positionCurrent.set(res.point);\r\n friction = Math.max(friction, colR.friction * 0.25);\r\n }\r\n }\r\n } else {\r\n if (canPointA) {\r\n const res = pushoutFromCapsule(colR, colRW, rwA.positionCurrent, ptRA, pointResultA);\r\n if (res.hit) {\r\n rwA.positionCurrent.set(res.point);\r\n friction = Math.max(friction, colR.friction * 0.25);\r\n }\r\n }\r\n if (canPointB) {\r\n const res = pushoutFromCapsule(colR, colRW, rwB.positionCurrent, ptRB, pointResultB);\r\n if (res.hit) {\r\n rwB.positionCurrent.set(res.point);\r\n friction = Math.max(friction, colR.friction * 0.25);\r\n }\r\n }\r\n }\r\n } else {\r\n if (colR.isInverseCollider) {\r\n if (ptRA.applyInvertCollision === 1 && canPointA) {\r\n const res = pushInFromSphere(\r\n colRW.positionCurrent,\r\n colRW.radius,\r\n rwA.positionCurrent,\r\n pointResultA\r\n );\r\n if (res.hit) {\r\n rwA.positionCurrent.set(res.point);\r\n friction = Math.max(friction, colR.friction * 0.25);\r\n }\r\n }\r\n if (ptRB.applyInvertCollision === 1 && canPointB) {\r\n const res = pushInFromSphere(\r\n colRW.positionCurrent,\r\n colRW.radius,\r\n rwB.positionCurrent,\r\n pointResultB\r\n );\r\n if (res.hit) {\r\n rwB.positionCurrent.set(res.point);\r\n friction = Math.max(friction, colR.friction * 0.25);\r\n }\r\n }\r\n } else {\r\n if (canPointA) {\r\n const res = pushoutFromSphere(\r\n colRW.positionCurrent,\r\n colRW.radius,\r\n ptRA.pointRadius,\r\n rwA.positionCurrent,\r\n pointResultA\r\n );\r\n if (res.hit) {\r\n rwA.positionCurrent.set(res.point);\r\n friction = Math.max(friction, colR.friction * 0.25);\r\n }\r\n }\r\n if (canPointB) {\r\n const res = pushoutFromSphere(\r\n colRW.positionCurrent,\r\n colRW.radius,\r\n ptRB.pointRadius,\r\n rwB.positionCurrent,\r\n pointResultB\r\n );\r\n if (res.hit) {\r\n rwB.positionCurrent.set(res.point);\r\n friction = Math.max(friction, colR.friction * 0.25);\r\n }\r\n }\r\n }\r\n }\r\n\r\n // Line segment collision\r\n if (!colR.isInverseCollider && canLine) {\r\n const lineRes = collisionDetection(\r\n colR,\r\n colRW,\r\n rwA.positionCurrent,\r\n rwB.positionCurrent,\r\n lineResult\r\n );\r\n if (lineRes.hit) {\r\n Vector3.sub(lineRes.pointOnLine, lineRes.pointOnCollider, pushout);\r\n const pushDist = pushout.magnitude;\r\n if (pushDist > EPSILON) {\r\n const ptDist = Vector3.sub(rwB.positionCurrent, rwA.positionCurrent, segment).magnitude * 0.5;\r\n const rateP1 =\r\n ptDist > EPSILON\r\n ? clamp01(\r\n Vector3.sub(lineRes.pointOnLine, rwA.positionCurrent, pointToA).magnitude / ptDist\r\n )\r\n : 0;\r\n const rateP2 =\r\n ptDist > EPSILON\r\n ? clamp01(\r\n Vector3.sub(lineRes.pointOnLine, rwB.positionCurrent, pointToB).magnitude / ptDist\r\n )\r\n : 0;\r\n Vector3.scale(pushout, 1 / pushDist, pushN);\r\n Vector3.scale(pushN, Math.max(lineRes.radius - pushDist, 0), pushVec);\r\n if (weightA > EPSILON) {\r\n Vector3.scale(pushVec, rateP2, scaledDisp);\r\n Vector3.add(rwA.positionCurrent, scaledDisp, rwA.positionCurrent);\r\n }\r\n if (weightB > EPSILON) {\r\n Vector3.scale(pushVec, rateP1, scaledDisp);\r\n Vector3.add(rwB.positionCurrent, scaledDisp, rwB.positionCurrent);\r\n }\r\n\r\n const dotUp = Vector3.dot(AXIS_Y, Vector3.normalize(pushout, pushN));\r\n friction = Math.max(friction, colR.friction * clamp01(dotUp));\r\n }\r\n }\r\n }\r\n }\r\n rwA.friction = Math.max(friction, rwA.friction);\r\n rwB.friction = Math.max(friction, rwB.friction);\r\n }\r\n }\r\n}\r\n\r\nfunction pointUpdatePass2(\r\n pointsR: readonly PointR[],\r\n pointsRW: PointRW[],\r\n positionsToTransform: Vector3[],\r\n stepDelta: number,\r\n fakeWaveFreq: number,\r\n blendRatio: number,\r\n isFakeWave: boolean,\r\n fakeWavePower: number\r\n) {\r\n let freq = fakeWaveFreq;\r\n const curTransformPos = new Vector3();\r\n const fakeWindOffset = new Vector3();\r\n for (let index = 0; index < pointsR.length; index++) {\r\n const ptR = pointsR[index];\r\n const ptRW = pointsRW[index];\r\n\r\n Vector3.lerp(ptRW.positionPreviousTransform, ptRW.positionCurrentTransform, stepDelta, curTransformPos);\r\n const blend = smoothStep(0, 1, Math.max(ptR.forceFadeRatio, blendRatio));\r\n Vector3.lerp(ptRW.positionCurrent, curTransformPos, blend, ptRW.positionToTransform);\r\n\r\n if (isFakeWave && ptR.child === -1 && ptR.parent !== -1) {\r\n const A = pointsRW[ptR.parent].positionToTransform;\r\n const B = ptRW.positionToTransform;\r\n const mAxis = Matrix4x4.lookAt(A, B, AXIS_Y);\r\n // Column 1 = up axis of the look-at matrix\r\n const col1 = mAxis.getCol(1).xyz();\r\n Vector3.lerp(ptRW.fakeWindDirection, col1, 0.5, ptRW.fakeWindDirection);\r\n\r\n freq += ptR.fakeWaveFreq;\r\n const power = Math.sin(freq) * fakeWavePower * ptR.fakeWavePower;\r\n Vector3.scale(ptRW.fakeWindDirection, power, fakeWindOffset);\r\n Vector3.add(ptRW.positionToTransform, fakeWindOffset, ptRW.positionToTransform);\r\n }\r\n\r\n positionsToTransform[index] = ptRW.positionToTransform.clone();\r\n }\r\n}\r\n\r\n/**\r\n * Output of applying the simulated result back to transforms.\r\n *\r\n * @public\r\n */\r\nexport interface ApplyResultOutput {\r\n position: Vector3;\r\n rotation: Quaternion;\r\n localRotation: Quaternion;\r\n}\r\n\r\n/**\r\n * Extracts the right-side local twist from a rotation around the supplied local axis.\r\n *\r\n * The result is the T in Q = S * T, where S aims the local axis and T only rolls\r\n * around that same local axis. Replacing this twist preserves the aimed bone\r\n * direction because right-side twist does not move the local axis before S.\r\n *\r\n * @internal\r\n */\r\nexport function extractLocalTwist(rotation: Quaternion, axis: Vector3, result?: Quaternion): Quaternion {\r\n result = result ?? new Quaternion();\r\n if (axis.magnitudeSq <= EPSILON * EPSILON) {\r\n return result.identity();\r\n }\r\n const twistAxis = Vector3.normalize(axis);\r\n const aimedAxis = rotation.transform(twistAxis);\r\n if (aimedAxis.magnitudeSq <= EPSILON * EPSILON) {\r\n return result.identity();\r\n }\r\n const swing = Quaternion.unitVectorToUnitVector(twistAxis, Vector3.normalize(aimedAxis));\r\n const twist = Quaternion.multiply(Quaternion.inverse(swing), rotation, result);\r\n twist.decomposeSwingTwist(twistAxis, undefined, result);\r\n return result;\r\n}\r\n\r\nfunction replaceLocalTwistFromReference(\r\n rotation: Quaternion,\r\n ptR: PointR,\r\n targetAxis: Vector3,\r\n result?: Quaternion\r\n): Quaternion {\r\n result = result ?? new Quaternion();\r\n if (ptR.boneAxis.magnitudeSq <= EPSILON * EPSILON || targetAxis.magnitudeSq <= EPSILON * EPSILON) {\r\n result.set(rotation);\r\n return result;\r\n }\r\n const twistAxis = Vector3.normalize(ptR.boneAxis);\r\n const targetDir = Vector3.normalize(targetAxis);\r\n const initialNoTwist = Quaternion.multiply(\r\n ptR.initialLocalRotation,\r\n Quaternion.inverse(ptR.initialLocalTwist)\r\n );\r\n const initialAxis = initialNoTwist.transform(twistAxis);\r\n if (initialAxis.magnitudeSq <= EPSILON * EPSILON) {\r\n result.set(rotation);\r\n return result;\r\n }\r\n const swingDelta = Quaternion.unitVectorToUnitVector(Vector3.normalize(initialAxis), targetDir);\r\n const noTwist = Quaternion.multiply(swingDelta, initialNoTwist);\r\n return Quaternion.multiply(noTwist, ptR.initialLocalTwist, result);\r\n}\r\n\r\nfunction getSceneParentWorldRotation(\r\n index: number,\r\n transformRotations: readonly Quaternion[],\r\n transformLocalRotations: readonly Quaternion[],\r\n sceneParentRotations?: readonly (Quaternion | undefined)[]\r\n): Quaternion {\r\n if (sceneParentRotations?.[index]) {\r\n return sceneParentRotations[index];\r\n }\r\n return Quaternion.multiply(transformRotations[index], Quaternion.inverse(transformLocalRotations[index]));\r\n}\r\n\r\nfunction getPointParentWorldRotation(\r\n index: number,\r\n ptR: PointR,\r\n results: readonly ApplyResultOutput[],\r\n transformRotations: readonly Quaternion[],\r\n transformLocalRotations: readonly Quaternion[],\r\n sceneParentRotations?: readonly (Quaternion | undefined)[]\r\n): Quaternion {\r\n return ptR.parent !== -1\r\n ? (results[ptR.parent]?.rotation ?? transformRotations[ptR.parent])\r\n : getSceneParentWorldRotation(index, transformRotations, transformLocalRotations, sceneParentRotations);\r\n}\r\n\r\n/**\r\n * Computes transform outputs from the simulated point positions.\r\n *\r\n * @public\r\n */\r\nexport function applyResult(\r\n pointsR: readonly PointR[],\r\n pointsRW: PointRW[],\r\n positionsToTransform: readonly Vector3[],\r\n blendRatio: number,\r\n // Current transform rotations (world and local) read from engine\r\n transformRotations: readonly Quaternion[],\r\n transformLocalRotations: readonly Quaternion[],\r\n preserveTwist: boolean,\r\n sceneParentRotations?: readonly (Quaternion | undefined)[]\r\n): ApplyResultOutput[] {\r\n const results: ApplyResultOutput[] = new Array(pointsR.length);\r\n\r\n for (let index = 0; index < pointsR.length; index++) {\r\n const ptR = pointsR[index];\r\n const ptRW = pointsRW[index];\r\n let worldRot = transformRotations[index];\r\n let localRot = transformLocalRotations[index];\r\n\r\n if (ptR.weight >= EPSILON) {\r\n // Dynamic point\r\n if (ptR.parent !== -1) {\r\n const direction = Vector3.sub(ptRW.positionToTransform, positionsToTransform[ptR.parent]);\r\n const realLen = direction.magnitude;\r\n if (realLen > EPSILON) {\r\n ptRW.directionPrevious = direction;\r\n } else {\r\n ptRW.positionToTransform = Vector3.add(positionsToTransform[ptR.parent], ptRW.directionPrevious);\r\n }\r\n }\r\n const pos = ptRW.positionToTransform;\r\n // SetRotation with blendRatio=0 for dynamic points\r\n // Step 1: Reset localRotation to initialLocalRotation (blendRatio = 0 means fully initial)\r\n localRot = ptR.initialLocalRotation.clone();\r\n\r\n // Step 2: Recompute worldRot from the new localRot\r\n // In C#, setting localRotation immediately updates the world rotation.\r\n // worldRot = parentWorldRot * localRot\r\n // We approximate: the parent's current world rotation is in transformRotations[ptR.parent]\r\n const parentRot = getPointParentWorldRotation(\r\n index,\r\n ptR,\r\n results,\r\n transformRotations,\r\n transformLocalRotations,\r\n sceneParentRotations\r\n );\r\n worldRot = Quaternion.multiply(parentRot, localRot);\r\n\r\n // Step 3: Aim toward child (simple shortest-arc, no twist correction here)\r\n if (ptR.child !== -1) {\r\n const childDir = Vector3.sub(positionsToTransform[ptR.child], ptRW.positionToTransform);\r\n if (childDir.magnitudeSq > EPSILON) {\r\n const aimVec = Vector3.normalize(worldRot.transform(ptR.boneAxis));\r\n const targetDir = Vector3.normalize(childDir);\r\n const aimRot = Quaternion.unitVectorToUnitVector(aimVec, targetDir);\r\n Quaternion.multiply(aimRot, worldRot, worldRot);\r\n }\r\n }\r\n results[index] = {\r\n position: pos,\r\n rotation: worldRot,\r\n localRotation: localRot\r\n };\r\n } else {\r\n const childBlend =\r\n ptR.child !== -1 ? Math.max(pointsR[ptR.child].forceFadeRatio, blendRatio) : blendRatio;\r\n\r\n // Use the caller-provided local rotation as the fixed-joint baseline.\r\n // The controller sanitizes this value when the transform still contains\r\n // the previous physics output instead of a fresh animation pose.\r\n const parentRot = getPointParentWorldRotation(\r\n index,\r\n ptR,\r\n results,\r\n transformRotations,\r\n transformLocalRotations,\r\n sceneParentRotations\r\n );\r\n localRot = transformLocalRotations[index].clone();\r\n worldRot = Quaternion.multiply(parentRot, localRot);\r\n\r\n // Aim toward simulated child position, blended back toward the animated direction.\r\n if (ptR.child !== -1) {\r\n const childDir = Vector3.sub(positionsToTransform[ptR.child], ptRW.positionToTransform);\r\n if (childDir.magnitudeSq > EPSILON) {\r\n const aimVec = Vector3.normalize(worldRot.transform(ptR.boneAxis));\r\n const targetDir = Vector3.normalize(childDir);\r\n const aimRot = Quaternion.unitVectorToUnitVector(aimVec, targetDir);\r\n worldRot = Quaternion.slerp(Quaternion.multiply(aimRot, worldRot), worldRot, childBlend);\r\n }\r\n }\r\n results[index] = {\r\n position: ptRW.positionCurrentTransform,\r\n rotation: worldRot,\r\n localRotation: localRot\r\n };\r\n }\r\n }\r\n\r\n // Post-process: twist correction pass (parent �?child order).\r\n if (preserveTwist) {\r\n for (let index = 0; index < pointsR.length; index++) {\r\n const ptR = pointsR[index];\r\n if (ptR.child === -1) {\r\n continue;\r\n }\r\n const result = results[index];\r\n const parentWorldRot = getPointParentWorldRotation(\r\n index,\r\n ptR,\r\n results,\r\n transformRotations,\r\n transformLocalRotations,\r\n sceneParentRotations\r\n );\r\n const effectiveLocal = Quaternion.multiply(Quaternion.inverse(parentWorldRot), result.rotation);\r\n const targetLocalAxis = effectiveLocal.transform(ptR.boneAxis);\r\n const correctedLocal = replaceLocalTwistFromReference(effectiveLocal, ptR, targetLocalAxis);\r\n result.localRotation = correctedLocal;\r\n Quaternion.multiply(parentWorldRot, correctedLocal, result.rotation);\r\n }\r\n }\r\n\r\n return results;\r\n}\r\n\r\n/**\r\n * Applies post-simulation angle limits to the point state.\r\n *\r\n * @public\r\n */\r\nexport function applyAngleLimits(\r\n pointsR: readonly PointR[],\r\n pointsRW: PointRW[],\r\n config: AngleLimitConfig\r\n): void {\r\n if (config.angleLimit < 0) {\r\n return;\r\n }\r\n\r\n for (let index = 0; index < pointsR.length; index++) {\r\n const ptR = pointsR[index];\r\n if (ptR.parent === -1) {\r\n continue;\r\n }\r\n const ptRW = pointsRW[index];\r\n\r\n const ptRp = pointsR[ptR.parent];\r\n const ptRWp = pointsRW[ptR.parent];\r\n\r\n const superParentPos = ptRp.parent !== -1 ? pointsRW[ptRp.parent].positionCurrent : ptRWp.positionCurrent;\r\n\r\n const boneDir = Vector3.sub(ptRW.positionCurrent, ptRWp.positionCurrent);\r\n let parentBoneDir = Vector3.sub(ptRWp.positionCurrent, superParentPos);\r\n\r\n if (parentBoneDir.magnitude === 0 || config.limitFromRoot) {\r\n parentBoneDir = Vector3.sub(ptRW.positionCurrentTransform, ptRWp.positionCurrentTransform);\r\n }\r\n\r\n const angle = Vector3.angleBetween(parentBoneDir, boneDir);\r\n const remaining = radian2degree(angle) - config.angleLimit;\r\n\r\n if (remaining > 0) {\r\n const axis = Vector3.cross(parentBoneDir, boneDir);\r\n const rotated = Quaternion.fromAxisAngle(axis, degree2radian(-remaining)).transform(boneDir);\r\n ptRW.positionCurrent = Vector3.add(ptRWp.positionCurrent, rotated);\r\n }\r\n }\r\n}\r\n"],"names":["AXIS_Y","Vector3","VEC3_ONE","_computeCapsuleAxis","_computeCapsuleHalfDir","_applySystemTransformOffset","_applySystemTransformRotated","_broadPhaseSegmentDir","_broadPhaseToCenter","_broadPhaseClosestPoint","_broadPhaseDelta","simulate","params","pointsR","pointsRW","constraints","collidersR","collidersRW","grabbersR","grabbersRW","movableLimitTargets","flatPlanes","pointCount","length","positionsToTransform","Array","subSteps","isPaused","fakeWaveFreq","fakeWaveCounter","rootSlideOffset","zero","rootDeltaSlide","sub","rootPosition","previousRootPosition","rootDeltaSlideLen","magnitude","rootSlideLimit","scale","rootRotationOffset","Quaternion","identity","rootDeltaRot","multiply","rootRotation","inverse","previousRootRotation","rotateAngle","Math","acos","max","min","w","PI","rootRotateLimit","abs","sinHalf","sqrt","rotateAxis","x","y","z","axisPY","angle","fromAxisAngle","degree2radian","stepTime","iSubStep","stepDelta","stepTime_x2_half","colliderUpdate","pointUpdatePass1","windForce","fakeWaveSpeed","enableSurfaceCollision","surfaceCollision","surfaceConstraints","fixedPointColliderPushout","iRelax","relaxation","constraintUpdate","constraintShrinkLimit","enableBroadPhase","postCollisionVelocityFix","pointUpdatePass2","blendRatio","isFakeWave","fakeWavePower","computeCapsule","pos","rot","height","head","direction","transform","curPos","curDir","corner","center","tailCorner","tailCenter","i","colR","colRW","ws","worldScale","worldScaleUniform","radius","lerp","positionPreviousTransform","positionCurrentTransform","slerp","directionPreviousTransform","directionCurrentTransform","positionCurrent","directionCurrent","EPSILON","add","boundsCenter","boundsRadius","magnitudeSq","radiusTailScale","set","worldToLocal","transformPointAffine","localBoundsMin","localBoundsMax","setXYZ","applySystemTransform","point","pivot","slideOffset","rotOffset","result","rotated","pointMayCollideBroadPhase","padding","delta","segmentMayCollideBroadPhase","point1","point2","segmentDir","lenSq","toCenter","t","clamp01","dot","closestPoint","currentTransformPos","moveDir","extForce","displacement","restore","tempVec0","tempVec1","planeOffset","index","ptR","ptRW","weight","positionPrevious","windForceScale","mass","gravity","parentLength","maxForceDisp","forceDispSq","resistance","friction","frictionScale","maxVelDisp","velDispSq","hardness","forceFadeRatio","ci","colRci","colRWci","enabled","isInverseCollider","hRes","pushoutFromSphere","pointRadius","pushoutFromCapsule","hit","grabberIndex","grR","grRW","position","normalize","grabberDistance","force","nearIndex","sqrNearRange","ig","sqrLen","movableLimitIndex","target","move","moveLen","movableLimitRadius","fp","dist","normal","distance","surfaceResult","intersectionPoint","pushOut","pointOnCollider","triCenter","pushDir","centerToPt","intersectToPt","pushVec","colliderPos","j","idxA","idxB","idxC","rwA","rwB","rwC","checkSurfaceCollision","pushMag","k","idxR","rwPt","intersectLen","rate","_postFixNormal","_fixedPushResult","pi","res","nx","ny","nz","capsuleVec","capsuleVecLenSq","tx","ty","tz","nLen","surfaceDist","vx","vy","vz","vDotN","dirN","disp","scaledDisp","pointResultA","pointResultB","lineResult","pointOnLine","pushout","segment","pointToA","pointToB","pushN","c","ptRA","indexA","ptRB","indexB","weightA","weightB","shrinkLen","stretchLen","type","ConstraintType","Structural_Horizontal","Bending_Horizontal","Shear","sliderJointLength","isShrink","power","Structural_Vertical","structuralShrinkVertical","structuralStretchVertical","structuralShrinkHorizontal","structuralStretchHorizontal","shearShrink","shearStretch","Bending_Vertical","bendingShrinkVertical","bendingStretchVertical","bendingShrinkHorizontal","bendingStretchHorizontal","wAB","isCollision","canPointA","canPointB","canLine","applyInvertCollision","pushInFromCapsule","pushInFromSphere","lineRes","collisionDetection","pushDist","ptDist","rateP1","rateP2","dotUp","freq","curTransformPos","fakeWindOffset","blend","smoothStep","positionToTransform","child","parent","A","B","mAxis","Matrix4x4","lookAt","col1","getCol","xyz","fakeWindDirection","sin","clone","extractLocalTwist","rotation","axis","twistAxis","aimedAxis","swing","unitVectorToUnitVector","twist","decomposeSwingTwist","undefined","replaceLocalTwistFromReference","targetAxis","boneAxis","targetDir","initialNoTwist","initialLocalRotation","initialLocalTwist","initialAxis","swingDelta","noTwist","getSceneParentWorldRotation","transformRotations","transformLocalRotations","sceneParentRotations","getPointParentWorldRotation","results","applyResult","preserveTwist","worldRot","localRot","realLen","directionPrevious","parentRot","childDir","aimVec","aimRot","localRotation","childBlend","parentWorldRot","effectiveLocal","targetLocalAxis","correctedLocal","applyAngleLimits","config","angleLimit","ptRp","ptRWp","superParentPos","boneDir","parentBoneDir","limitFromRoot","angleBetween","remaining","radian2degree","cross"],"mappings":"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"}
@@ -1,29 +1,29 @@
1
1
  import { SkeletonModifier } from './skeleton_modifier.js';
2
2
 
3
- /**
4
- * Post-processor wrapper for joint dynamics systems.
5
- *
6
- * Integrates joint-based physics simulation into the skeleton post-processing pipeline.
7
- * The joint dynamics system is updated each frame and results are blended with the base animation.
8
- *
9
- * @public
3
+ /**
4
+ * Post-processor wrapper for joint dynamics systems.
5
+ *
6
+ * Integrates joint-based physics simulation into the skeleton post-processing pipeline.
7
+ * The joint dynamics system is updated each frame and results are blended with the base animation.
8
+ *
9
+ * @public
10
10
  */ class JointDynamicsModifier extends SkeletonModifier {
11
11
  _jointDynamicsSystem;
12
- /**
13
- * Create a joint dynamics post-processor.
14
- *
15
- * @param jointDynamicsSystem - The joint dynamics system to integrate
12
+ /**
13
+ * Create a joint dynamics post-processor.
14
+ *
15
+ * @param jointDynamicsSystem - The joint dynamics system to integrate
16
16
  */ constructor(jointDynamicsSystem){
17
17
  super();
18
18
  this._jointDynamicsSystem = jointDynamicsSystem;
19
19
  }
20
- /**
21
- * Get the joint dynamics system.
20
+ /**
21
+ * Get the joint dynamics system.
22
22
  */ get jointDynamicsSystem() {
23
23
  return this._jointDynamicsSystem;
24
24
  }
25
- /**
26
- * Apply spring physics to skeleton joints.
25
+ /**
26
+ * Apply spring physics to skeleton joints.
27
27
  */ apply(_skeleton, deltaTime) {
28
28
  if (!this._enabled || this.weight <= 0) {
29
29
  return;
@@ -31,15 +31,16 @@ import { SkeletonModifier } from './skeleton_modifier.js';
31
31
  // Update spring physics simulation
32
32
  this._jointDynamicsSystem.update(deltaTime);
33
33
  }
34
- /**
35
- * Reset the spring system to initial state.
34
+ /**
35
+ * Reset the spring system to initial state.
36
36
  */ reset() {
37
37
  this._jointDynamicsSystem.resetChains();
38
38
  this._jointDynamicsSystem.controller.reset();
39
- this._jointDynamicsSystem.controller.warp();
40
39
  }
41
- warp() {
42
- this._jointDynamicsSystem.controller.warp();
40
+ /**
41
+ * @deprecated Use {@link JointDynamicsModifier.reset}. Kept as a compatibility alias for teleport handling.
42
+ */ warp() {
43
+ this._jointDynamicsSystem.controller.reset();
43
44
  }
44
45
  _getWeight() {
45
46
  return 1 - this._jointDynamicsSystem.controller.blendRatio;
@@ -1 +1 @@
1
- {"version":3,"file":"joint_dynamics_modifier.js","sources":["../../src/animation/joint_dynamics_modifier.ts"],"sourcesContent":["import { SkeletonModifier } from './skeleton_modifier';\r\nimport type { SkeletonRig } from './skeleton';\r\nimport type { JointDynamicsSystem } from './joint_dynamics/joint_dynamics_system';\r\n\r\n/**\r\n * Post-processor wrapper for joint dynamics systems.\r\n *\r\n * Integrates joint-based physics simulation into the skeleton post-processing pipeline.\r\n * The joint dynamics system is updated each frame and results are blended with the base animation.\r\n *\r\n * @public\r\n */\r\nexport class JointDynamicsModifier extends SkeletonModifier {\r\n private _jointDynamicsSystem: JointDynamicsSystem;\r\n\r\n /**\r\n * Create a joint dynamics post-processor.\r\n *\r\n * @param jointDynamicsSystem - The joint dynamics system to integrate\r\n */\r\n constructor(jointDynamicsSystem: JointDynamicsSystem) {\r\n super();\r\n this._jointDynamicsSystem = jointDynamicsSystem;\r\n }\r\n\r\n /**\r\n * Get the joint dynamics system.\r\n */\r\n get jointDynamicsSystem(): JointDynamicsSystem {\r\n return this._jointDynamicsSystem;\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._jointDynamicsSystem.update(deltaTime);\r\n }\r\n\r\n /**\r\n * Reset the spring system to initial state.\r\n */\r\n reset(): void {\r\n this._jointDynamicsSystem.resetChains();\r\n this._jointDynamicsSystem.controller.reset();\r\n this._jointDynamicsSystem.controller.warp();\r\n }\r\n\r\n warp(): void {\r\n this._jointDynamicsSystem.controller.warp();\r\n }\r\n\r\n protected _getWeight(): number {\r\n return 1 - this._jointDynamicsSystem.controller.blendRatio;\r\n }\r\n\r\n protected _setWeight(value: number): void {\r\n this._jointDynamicsSystem.controller.blendRatio = 1 - Math.max(0, Math.min(1, value));\r\n }\r\n}\r\n"],"names":["JointDynamicsModifier","SkeletonModifier","_jointDynamicsSystem","jointDynamicsSystem","apply","_skeleton","deltaTime","_enabled","weight","update","reset","resetChains","controller","warp","_getWeight","blendRatio","_setWeight","value","Math","max","min"],"mappings":";;AAIA;;;;;;;IAQO,MAAMA,qBAA8BC,SAAAA,gBAAAA,CAAAA;IACjCC,oBAA0C;AAElD;;;;MAKA,WAAA,CAAYC,mBAAwC,CAAE;QACpD,KAAK,EAAA;QACL,IAAI,CAACD,oBAAoB,GAAGC,mBAAAA;AAC9B;AAEA;;AAEC,MACD,IAAIA,mBAA2C,GAAA;QAC7C,OAAO,IAAI,CAACD,oBAAoB;AAClC;AAEA;;AAEC,MACDE,KAAMC,CAAAA,SAAsB,EAAEC,SAAiB,EAAQ;QACrD,IAAI,CAAC,IAAI,CAACC,QAAQ,IAAI,IAAI,CAACC,MAAM,IAAI,CAAG,EAAA;AACtC,YAAA;AACF;;AAGA,QAAA,IAAI,CAACN,oBAAoB,CAACO,MAAM,CAACH,SAAAA,CAAAA;AACnC;AAEA;;AAEC,MACDI,KAAc,GAAA;QACZ,IAAI,CAACR,oBAAoB,CAACS,WAAW,EAAA;AACrC,QAAA,IAAI,CAACT,oBAAoB,CAACU,UAAU,CAACF,KAAK,EAAA;AAC1C,QAAA,IAAI,CAACR,oBAAoB,CAACU,UAAU,CAACC,IAAI,EAAA;AAC3C;IAEAA,IAAa,GAAA;AACX,QAAA,IAAI,CAACX,oBAAoB,CAACU,UAAU,CAACC,IAAI,EAAA;AAC3C;IAEUC,UAAqB,GAAA;AAC7B,QAAA,OAAO,IAAI,IAAI,CAACZ,oBAAoB,CAACU,UAAU,CAACG,UAAU;AAC5D;AAEUC,IAAAA,UAAAA,CAAWC,KAAa,EAAQ;AACxC,QAAA,IAAI,CAACf,oBAAoB,CAACU,UAAU,CAACG,UAAU,GAAG,CAAIG,GAAAA,IAAAA,CAAKC,GAAG,CAAC,CAAA,EAAGD,IAAKE,CAAAA,GAAG,CAAC,CAAGH,EAAAA,KAAAA,CAAAA,CAAAA;AAChF;AACF;;;;"}
1
+ {"version":3,"file":"joint_dynamics_modifier.js","sources":["../../src/animation/joint_dynamics_modifier.ts"],"sourcesContent":["import { SkeletonModifier } from './skeleton_modifier';\nimport type { SkeletonRig } from './skeleton';\nimport type { JointDynamicsSystem } from './joint_dynamics/joint_dynamics_system';\n\n/**\n * Post-processor wrapper for joint dynamics systems.\n *\n * Integrates joint-based physics simulation into the skeleton post-processing pipeline.\n * The joint dynamics system is updated each frame and results are blended with the base animation.\n *\n * @public\n */\nexport class JointDynamicsModifier extends SkeletonModifier {\n private _jointDynamicsSystem: JointDynamicsSystem;\n\n /**\n * Create a joint dynamics post-processor.\n *\n * @param jointDynamicsSystem - The joint dynamics system to integrate\n */\n constructor(jointDynamicsSystem: JointDynamicsSystem) {\n super();\n this._jointDynamicsSystem = jointDynamicsSystem;\n }\n\n /**\n * Get the joint dynamics system.\n */\n get jointDynamicsSystem(): JointDynamicsSystem {\n return this._jointDynamicsSystem;\n }\n\n /**\n * Apply spring physics to skeleton joints.\n */\n apply(_skeleton: SkeletonRig, deltaTime: number): void {\n if (!this._enabled || this.weight <= 0) {\n return;\n }\n\n // Update spring physics simulation\n this._jointDynamicsSystem.update(deltaTime);\n }\n\n /**\n * Reset the spring system to initial state.\n */\n reset(): void {\n this._jointDynamicsSystem.resetChains();\n this._jointDynamicsSystem.controller.reset();\n }\n\n /**\n * @deprecated Use {@link JointDynamicsModifier.reset}. Kept as a compatibility alias for teleport handling.\n */\n warp(): void {\n this._jointDynamicsSystem.controller.reset();\n }\n\n protected _getWeight(): number {\n return 1 - this._jointDynamicsSystem.controller.blendRatio;\n }\n\n protected _setWeight(value: number): void {\n this._jointDynamicsSystem.controller.blendRatio = 1 - Math.max(0, Math.min(1, value));\n }\n}\n"],"names":["JointDynamicsModifier","SkeletonModifier","_jointDynamicsSystem","jointDynamicsSystem","apply","_skeleton","deltaTime","_enabled","weight","update","reset","resetChains","controller","warp","_getWeight","blendRatio","_setWeight","value","Math","max","min"],"mappings":";;AAIA;;;;;;;IAQO,MAAMA,qBAA8BC,SAAAA,gBAAAA,CAAAA;IACjCC,oBAA0C;AAElD;;;;MAKA,WAAA,CAAYC,mBAAwC,CAAE;QACpD,KAAK,EAAA;QACL,IAAI,CAACD,oBAAoB,GAAGC,mBAAAA;AAC9B;AAEA;;AAEC,MACD,IAAIA,mBAA2C,GAAA;QAC7C,OAAO,IAAI,CAACD,oBAAoB;AAClC;AAEA;;AAEC,MACDE,KAAMC,CAAAA,SAAsB,EAAEC,SAAiB,EAAQ;QACrD,IAAI,CAAC,IAAI,CAACC,QAAQ,IAAI,IAAI,CAACC,MAAM,IAAI,CAAG,EAAA;AACtC,YAAA;AACF;;AAGA,QAAA,IAAI,CAACN,oBAAoB,CAACO,MAAM,CAACH,SAAAA,CAAAA;AACnC;AAEA;;AAEC,MACDI,KAAc,GAAA;QACZ,IAAI,CAACR,oBAAoB,CAACS,WAAW,EAAA;AACrC,QAAA,IAAI,CAACT,oBAAoB,CAACU,UAAU,CAACF,KAAK,EAAA;AAC5C;AAEA;;AAEC,MACDG,IAAa,GAAA;AACX,QAAA,IAAI,CAACX,oBAAoB,CAACU,UAAU,CAACF,KAAK,EAAA;AAC5C;IAEUI,UAAqB,GAAA;AAC7B,QAAA,OAAO,IAAI,IAAI,CAACZ,oBAAoB,CAACU,UAAU,CAACG,UAAU;AAC5D;AAEUC,IAAAA,UAAAA,CAAWC,KAAa,EAAQ;AACxC,QAAA,IAAI,CAACf,oBAAoB,CAACU,UAAU,CAACG,UAAU,GAAG,CAAIG,GAAAA,IAAAA,CAAKC,GAAG,CAAC,CAAA,EAAGD,IAAKE,CAAAA,GAAG,CAAC,CAAGH,EAAAA,KAAAA,CAAAA,CAAAA;AAChF;AACF;;;;"}
@@ -96,15 +96,11 @@ const tmpV3 = new Vector3();
96
96
  this._playing = false;
97
97
  this._modifiers = [];
98
98
  this.computeBindPose();
99
- if (skeletonRoot) {
100
- this._humanoidJointMapping = Skeleton.tryExtractHumanoidJoints(skeletonRoot);
101
- this._humanoidRootRotation = Quaternion.identity();
102
- } else {
103
- this._humanoidJointMapping = null;
104
- this._humanoidRootRotation = Quaternion.identity();
105
- }
106
- if (this._humanoidJointMapping) {
107
- let p = this._humanoidJointMapping.body["Hips"];
99
+ this._humanoidJointMapping = options?.humanoidJointMapping !== undefined ? options.humanoidJointMapping : skeletonRoot ? Skeleton.tryExtractHumanoidJoints(skeletonRoot) : null;
100
+ this._humanoidRootRotation = Quaternion.identity();
101
+ const hips = this._humanoidJointMapping?.body["Hips"];
102
+ if (hips) {
103
+ let p = hips;
108
104
  while(this._joints.includes(p.parent)){
109
105
  Quaternion.multiply(p.parent.rotation, this._humanoidRootRotation, this._humanoidRootRotation);
110
106
  p = p.parent;
@@ -321,7 +317,8 @@ function sideJointPatterns(side, patterns) {
321
317
  // pose visible by replacing the rig pose only when explicitly supplied.
322
318
  this._rig = new SkeletonRig(rig.joints, bindPose, {
323
319
  rootJoint: rig.rootJoint,
324
- rootBindPose: rig.rootBindPose
320
+ rootBindPose: rig.rootBindPose,
321
+ humanoidJointMapping: rig.humanoidJointMapping
325
322
  });
326
323
  }
327
324
  this.updateJointMatrices();