@zephyr3d/scene 0.9.25 → 0.9.27

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 (299) hide show
  1. package/dist/animation/animationset.js +92 -30
  2. package/dist/animation/animationset.js.map +1 -1
  3. package/dist/animation/hair/gpu_hair_simulation.js +1090 -0
  4. package/dist/animation/hair/gpu_hair_simulation.js.map +1 -0
  5. package/dist/animation/joint_dynamics/controller.js +7 -5
  6. package/dist/animation/joint_dynamics/controller.js.map +1 -1
  7. package/dist/animation/joint_dynamics/convex_collider.js +320 -0
  8. package/dist/animation/joint_dynamics/convex_collider.js.map +1 -0
  9. package/dist/animation/joint_dynamics/joint_dynamics_system.js +81 -5
  10. package/dist/animation/joint_dynamics/joint_dynamics_system.js.map +1 -1
  11. package/dist/animation/morphtrack.js +3 -4
  12. package/dist/animation/morphtrack.js.map +1 -1
  13. package/dist/animation/skeleton.js +79 -25
  14. package/dist/animation/skeleton.js.map +1 -1
  15. package/dist/animation/spring/multi_chain_spring_system.js +577 -179
  16. package/dist/animation/spring/multi_chain_spring_system.js.map +1 -1
  17. package/dist/animation/spring/spring_collider.js +4 -3
  18. package/dist/animation/spring/spring_collider.js.map +1 -1
  19. package/dist/animation/spring/spring_node_pose_tracker.js +40 -0
  20. package/dist/animation/spring/spring_node_pose_tracker.js.map +1 -0
  21. package/dist/animation/spring/spring_particle.js +2 -0
  22. package/dist/animation/spring/spring_particle.js.map +1 -1
  23. package/dist/animation/spring/spring_system.js +11 -3
  24. package/dist/animation/spring/spring_system.js.map +1 -1
  25. package/dist/animation/spring_modifier.js +10 -0
  26. package/dist/animation/spring_modifier.js.map +1 -1
  27. package/dist/app/engine.js +53 -43
  28. package/dist/app/engine.js.map +1 -1
  29. package/dist/app/scriptingsystem.js +119 -6
  30. package/dist/app/scriptingsystem.js.map +1 -1
  31. package/dist/app/scriptregistry.js +3 -2
  32. package/dist/app/scriptregistry.js.map +1 -1
  33. package/dist/asset/assetmanager.js +284 -67
  34. package/dist/asset/assetmanager.js.map +1 -1
  35. package/dist/asset/loaders/zhair/zhair_format.js +288 -0
  36. package/dist/asset/loaders/zhair/zhair_format.js.map +1 -0
  37. package/dist/asset/loaders/zhair/zhair_loader.js +221 -0
  38. package/dist/asset/loaders/zhair/zhair_loader.js.map +1 -0
  39. package/dist/asset/model.js +184 -69
  40. package/dist/asset/model.js.map +1 -1
  41. package/dist/camera/camera.js +268 -44
  42. package/dist/camera/camera.js.map +1 -1
  43. package/dist/camera/perspectivecamera.js +3 -1
  44. package/dist/camera/perspectivecamera.js.map +1 -1
  45. package/dist/index.d.ts +9044 -5139
  46. package/dist/index.js +17 -6
  47. package/dist/index.js.map +1 -1
  48. package/dist/material/eye.js +932 -0
  49. package/dist/material/eye.js.map +1 -0
  50. package/dist/material/hair.js +917 -0
  51. package/dist/material/hair.js.map +1 -0
  52. package/dist/material/hairstrand.js +842 -0
  53. package/dist/material/hairstrand.js.map +1 -0
  54. package/dist/material/hairstrand_data.js +162 -0
  55. package/dist/material/hairstrand_data.js.map +1 -0
  56. package/dist/material/lambert.js +5 -2
  57. package/dist/material/lambert.js.map +1 -1
  58. package/dist/material/material.js +48 -10
  59. package/dist/material/material.js.map +1 -1
  60. package/dist/material/meshmaterial.js +120 -19
  61. package/dist/material/meshmaterial.js.map +1 -1
  62. package/dist/material/mixins/albedocolor.js +1 -1
  63. package/dist/material/mixins/albedocolor.js.map +1 -1
  64. package/dist/material/mixins/lightmodel/blinnphong.js +5 -3
  65. package/dist/material/mixins/lightmodel/blinnphong.js.map +1 -1
  66. package/dist/material/mixins/lightmodel/lambert.js +5 -4
  67. package/dist/material/mixins/lightmodel/lambert.js.map +1 -1
  68. package/dist/material/mixins/lightmodel/pbrblueprintmixin.js +3 -3
  69. package/dist/material/mixins/lightmodel/pbrblueprintmixin.js.map +1 -1
  70. package/dist/material/mixins/lightmodel/pbrmetallicroughness.js +5 -5
  71. package/dist/material/mixins/lightmodel/pbrmetallicroughness.js.map +1 -1
  72. package/dist/material/mixins/lightmodel/pbrspecularglossness.js +3 -3
  73. package/dist/material/mixins/lightmodel/pbrspecularglossness.js.map +1 -1
  74. package/dist/material/mixins/lit.js +106 -19
  75. package/dist/material/mixins/lit.js.map +1 -1
  76. package/dist/material/mixins/pbr/common.js +4 -4
  77. package/dist/material/mixins/pbr/common.js.map +1 -1
  78. package/dist/material/mixins/texture.js +48 -11
  79. package/dist/material/mixins/texture.js.map +1 -1
  80. package/dist/material/mtoon.js +6 -5
  81. package/dist/material/mtoon.js.map +1 -1
  82. package/dist/material/pbrblueprint.js +146 -28
  83. package/dist/material/pbrblueprint.js.map +1 -1
  84. package/dist/material/pbrblueprint_instance.js +501 -0
  85. package/dist/material/pbrblueprint_instance.js.map +1 -0
  86. package/dist/material/pbrmr.js +15 -16
  87. package/dist/material/pbrmr.js.map +1 -1
  88. package/dist/material/shader/helper.js +734 -23
  89. package/dist/material/shader/helper.js.map +1 -1
  90. package/dist/material/shader/terrain_blend.js +55 -0
  91. package/dist/material/shader/terrain_blend.js.map +1 -0
  92. package/dist/material/skin.js +192 -32
  93. package/dist/material/skin.js.map +1 -1
  94. package/dist/material/spriteblueprint.js +16 -1
  95. package/dist/material/spriteblueprint.js.map +1 -1
  96. package/dist/material/subsurfaceprofile.js +86 -23
  97. package/dist/material/subsurfaceprofile.js.map +1 -1
  98. package/dist/material/water.js +2059 -72
  99. package/dist/material/water.js.map +1 -1
  100. package/dist/posteffect/bloom.js +167 -7
  101. package/dist/posteffect/bloom.js.map +1 -1
  102. package/dist/posteffect/coloradjust.js +2 -1
  103. package/dist/posteffect/coloradjust.js.map +1 -1
  104. package/dist/posteffect/compositor.js.map +1 -1
  105. package/dist/posteffect/fxaa.js +2 -1
  106. package/dist/posteffect/fxaa.js.map +1 -1
  107. package/dist/posteffect/grayscale.js +3 -1
  108. package/dist/posteffect/grayscale.js.map +1 -1
  109. package/dist/posteffect/motionblur.js +664 -56
  110. package/dist/posteffect/motionblur.js.map +1 -1
  111. package/dist/posteffect/posteffect.js +12 -1
  112. package/dist/posteffect/posteffect.js.map +1 -1
  113. package/dist/posteffect/sao.js +46 -44
  114. package/dist/posteffect/sao.js.map +1 -1
  115. package/dist/posteffect/skinsss.js +368 -69
  116. package/dist/posteffect/skinsss.js.map +1 -1
  117. package/dist/posteffect/ssgi.js +16 -9
  118. package/dist/posteffect/ssgi.js.map +1 -1
  119. package/dist/posteffect/ssr.js +3 -0
  120. package/dist/posteffect/ssr.js.map +1 -1
  121. package/dist/posteffect/sss.js +121 -36
  122. package/dist/posteffect/sss.js.map +1 -1
  123. package/dist/posteffect/taa.js.map +1 -1
  124. package/dist/posteffect/tonemap.js +44 -1
  125. package/dist/posteffect/tonemap.js.map +1 -1
  126. package/dist/render/abuffer_oit.js +8 -2
  127. package/dist/render/abuffer_oit.js.map +1 -1
  128. package/dist/render/clipmap.js +156 -5
  129. package/dist/render/clipmap.js.map +1 -1
  130. package/dist/render/cull_visitor.js +20 -0
  131. package/dist/render/cull_visitor.js.map +1 -1
  132. package/dist/render/depthpass.js +36 -2
  133. package/dist/render/depthpass.js.map +1 -1
  134. package/dist/render/drawable_mixin.js +26 -1
  135. package/dist/render/drawable_mixin.js.map +1 -1
  136. package/dist/render/dualdepthpeeling_oit.js +3 -2
  137. package/dist/render/dualdepthpeeling_oit.js.map +1 -1
  138. package/dist/render/envlight.js +1 -1
  139. package/dist/render/envlight.js.map +1 -1
  140. package/dist/render/fbm_wavegenerator.js +6 -3
  141. package/dist/render/fbm_wavegenerator.js.map +1 -1
  142. package/dist/render/fft_wavegenerator.js +57 -15
  143. package/dist/render/fft_wavegenerator.js.map +1 -1
  144. package/dist/render/gerstner_wavegenerator.js +130 -20
  145. package/dist/render/gerstner_wavegenerator.js.map +1 -1
  146. package/dist/render/globalbindgroup_allocator.js +3 -0
  147. package/dist/render/globalbindgroup_allocator.js.map +1 -1
  148. package/dist/render/hzb.js +80 -22
  149. package/dist/render/hzb.js.map +1 -1
  150. package/dist/render/lightpass.js +6 -3
  151. package/dist/render/lightpass.js.map +1 -1
  152. package/dist/render/oit.js +29 -0
  153. package/dist/render/oit.js.map +1 -0
  154. package/dist/render/render_queue.js +39 -0
  155. package/dist/render/render_queue.js.map +1 -1
  156. package/dist/render/renderer.js +4 -0
  157. package/dist/render/renderer.js.map +1 -1
  158. package/dist/render/rendergraph/blackboard.js +1 -0
  159. package/dist/render/rendergraph/blackboard.js.map +1 -1
  160. package/dist/render/rendergraph/device_pool_allocator.js.map +1 -1
  161. package/dist/render/rendergraph/executor.js +2 -0
  162. package/dist/render/rendergraph/executor.js.map +1 -1
  163. package/dist/render/rendergraph/forward_plus_builder.js +379 -10
  164. package/dist/render/rendergraph/forward_plus_builder.js.map +1 -1
  165. package/dist/render/rendergraph/frame_resource_requirements.js +1 -0
  166. package/dist/render/rendergraph/frame_resource_requirements.js.map +1 -1
  167. package/dist/render/rendergraph/history_resources.js +8 -1
  168. package/dist/render/rendergraph/history_resources.js.map +1 -1
  169. package/dist/render/rendergraph/rendergraph.js.map +1 -1
  170. package/dist/render/rendergraph/texture_affinity_cache.js +1 -1
  171. package/dist/render/rendergraph/texture_affinity_cache.js.map +1 -1
  172. package/dist/render/rendergraph/types.js.map +1 -1
  173. package/dist/render/shadow_mask_pass.js +73 -8
  174. package/dist/render/shadow_mask_pass.js.map +1 -1
  175. package/dist/render/sky.js +166 -126
  176. package/dist/render/sky.js.map +1 -1
  177. package/dist/render/underwater.js +624 -0
  178. package/dist/render/underwater.js.map +1 -0
  179. package/dist/render/water_caustics.js +1380 -0
  180. package/dist/render/water_caustics.js.map +1 -0
  181. package/dist/render/weightedblended_oit.js +3 -2
  182. package/dist/render/weightedblended_oit.js.map +1 -1
  183. package/dist/scene/basesprite.js +8 -0
  184. package/dist/scene/basesprite.js.map +1 -1
  185. package/dist/scene/batchgroup.js +3 -0
  186. package/dist/scene/batchgroup.js.map +1 -1
  187. package/dist/scene/environment.js +4 -1
  188. package/dist/scene/environment.js.map +1 -1
  189. package/dist/scene/hair.js +963 -0
  190. package/dist/scene/hair.js.map +1 -0
  191. package/dist/scene/light.js +5 -1
  192. package/dist/scene/light.js.map +1 -1
  193. package/dist/scene/mesh.js +481 -47
  194. package/dist/scene/mesh.js.map +1 -1
  195. package/dist/scene/meshdrawable.js +6 -0
  196. package/dist/scene/meshdrawable.js.map +1 -1
  197. package/dist/scene/msdftext.js +3 -0
  198. package/dist/scene/msdftext.js.map +1 -1
  199. package/dist/scene/msdftextsprite.js +3 -0
  200. package/dist/scene/msdftextsprite.js.map +1 -1
  201. package/dist/scene/particlesys.js +6 -0
  202. package/dist/scene/particlesys.js.map +1 -1
  203. package/dist/scene/scene.js +3 -0
  204. package/dist/scene/scene.js.map +1 -1
  205. package/dist/scene/scene_node.js +6 -1
  206. package/dist/scene/scene_node.js.map +1 -1
  207. package/dist/scene/terrain-cm/grass.js +3 -0
  208. package/dist/scene/terrain-cm/grass.js.map +1 -1
  209. package/dist/scene/terrain-cm/grassmaterial.js +3 -0
  210. package/dist/scene/terrain-cm/grassmaterial.js.map +1 -1
  211. package/dist/scene/terrain-cm/terrain-cm.js +6 -0
  212. package/dist/scene/terrain-cm/terrain-cm.js.map +1 -1
  213. package/dist/scene/terrain-cm/texture_cache.js +309 -0
  214. package/dist/scene/terrain-cm/texture_cache.js.map +1 -0
  215. package/dist/scene/water.js +546 -4
  216. package/dist/scene/water.js.map +1 -1
  217. package/dist/shaders/atmosphere.js.map +1 -1
  218. package/dist/shaders/diffusion.js +54 -0
  219. package/dist/shaders/diffusion.js.map +1 -0
  220. package/dist/shaders/shadow.js +33 -21
  221. package/dist/shaders/shadow.js.map +1 -1
  222. package/dist/shaders/temporal.js +71 -33
  223. package/dist/shaders/temporal.js.map +1 -1
  224. package/dist/shaders/water.js +22 -19
  225. package/dist/shaders/water.js.map +1 -1
  226. package/dist/shaders/water_medium.js +56 -0
  227. package/dist/shaders/water_medium.js.map +1 -0
  228. package/dist/shadow/dom.js +546 -0
  229. package/dist/shadow/dom.js.map +1 -0
  230. package/dist/shadow/pcf_opt.js +3 -5
  231. package/dist/shadow/pcf_opt.js.map +1 -1
  232. package/dist/shadow/pcf_pd.js +1 -1
  233. package/dist/shadow/pcf_pd.js.map +1 -1
  234. package/dist/shadow/receiver_bias.js +41 -0
  235. package/dist/shadow/receiver_bias.js.map +1 -0
  236. package/dist/shadow/shader.js +20 -60
  237. package/dist/shadow/shader.js.map +1 -1
  238. package/dist/shadow/shadow_impl.js +89 -0
  239. package/dist/shadow/shadow_impl.js.map +1 -1
  240. package/dist/shadow/shadow_region.js +1 -1
  241. package/dist/shadow/shadow_region.js.map +1 -1
  242. package/dist/shadow/shadowmapper.js +150 -37
  243. package/dist/shadow/shadowmapper.js.map +1 -1
  244. package/dist/shapes/shape.js +11 -2
  245. package/dist/shapes/shape.js.map +1 -1
  246. package/dist/shapes/sphere.js +50 -9
  247. package/dist/shapes/sphere.js.map +1 -1
  248. package/dist/utility/blueprint/common/constants.js +112 -2
  249. package/dist/utility/blueprint/common/constants.js.map +1 -1
  250. package/dist/utility/blueprint/material/func.js +142 -49
  251. package/dist/utility/blueprint/material/func.js.map +1 -1
  252. package/dist/utility/blueprint/material/ir.js +490 -25
  253. package/dist/utility/blueprint/material/ir.js.map +1 -1
  254. package/dist/utility/blueprint/material/texture.js +898 -4
  255. package/dist/utility/blueprint/material/texture.js.map +1 -1
  256. package/dist/utility/serialization/manager.js +434 -101
  257. package/dist/utility/serialization/manager.js.map +1 -1
  258. package/dist/utility/serialization/scene/animation.js +401 -5
  259. package/dist/utility/serialization/scene/animation.js.map +1 -1
  260. package/dist/utility/serialization/scene/batch.js +4 -0
  261. package/dist/utility/serialization/scene/batch.js.map +1 -1
  262. package/dist/utility/serialization/scene/camera.js +186 -26
  263. package/dist/utility/serialization/scene/camera.js.map +1 -1
  264. package/dist/utility/serialization/scene/common.js +26 -5
  265. package/dist/utility/serialization/scene/common.js.map +1 -1
  266. package/dist/utility/serialization/scene/hair.js +1141 -0
  267. package/dist/utility/serialization/scene/hair.js.map +1 -0
  268. package/dist/utility/serialization/scene/light.js +84 -4
  269. package/dist/utility/serialization/scene/light.js.map +1 -1
  270. package/dist/utility/serialization/scene/material.js +1867 -166
  271. package/dist/utility/serialization/scene/material.js.map +1 -1
  272. package/dist/utility/serialization/scene/mesh.js +231 -14
  273. package/dist/utility/serialization/scene/mesh.js.map +1 -1
  274. package/dist/utility/serialization/scene/node.js +141 -7
  275. package/dist/utility/serialization/scene/node.js.map +1 -1
  276. package/dist/utility/serialization/scene/particle.js +4 -0
  277. package/dist/utility/serialization/scene/particle.js.map +1 -1
  278. package/dist/utility/serialization/scene/primitive.js +18 -0
  279. package/dist/utility/serialization/scene/primitive.js.map +1 -1
  280. package/dist/utility/serialization/scene/sprite.js +4 -0
  281. package/dist/utility/serialization/scene/sprite.js.map +1 -1
  282. package/dist/utility/serialization/scene/terrain.js +4 -0
  283. package/dist/utility/serialization/scene/terrain.js.map +1 -1
  284. package/dist/utility/serialization/scene/text.js +4 -0
  285. package/dist/utility/serialization/scene/text.js.map +1 -1
  286. package/dist/utility/serialization/scene/water.js +1105 -21
  287. package/dist/utility/serialization/scene/water.js.map +1 -1
  288. package/dist/utility/serialization/types.js.map +1 -1
  289. package/dist/utility/shprojector.js +9 -8
  290. package/dist/utility/shprojector.js.map +1 -1
  291. package/dist/values.js +49 -2
  292. package/dist/values.js.map +1 -1
  293. package/package.json +3 -3
  294. package/dist/render/rendergraph/frame_graph_context.js +0 -41
  295. package/dist/render/rendergraph/frame_graph_context.js.map +0 -1
  296. package/dist/shaders/ssgi.js +0 -63
  297. package/dist/shaders/ssgi.js.map +0 -1
  298. package/dist/shaders/ssgi_reprojection.js +0 -118
  299. package/dist/shaders/ssgi_reprojection.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"joint_dynamics_system.js","sources":["../../../src/animation/joint_dynamics/joint_dynamics_system.ts"],"sourcesContent":["import type { DeepPartial } from '@zephyr3d/base';\r\nimport { InterpolatorScalar, Vector3 } from '@zephyr3d/base';\r\nimport { Quaternion } from '@zephyr3d/base';\r\nimport { SceneNode } from '../../scene/scene_node';\r\nimport type {\r\n ControllerConfig,\r\n JointDynamicsColliderSnapshot,\r\n JointDynamicsColliderHandle,\r\n JointDynamicsFlatPlaneSnapshot,\r\n JointDynamicsFlatPlaneHandle,\r\n JointDynamicsGrabberSnapshot,\r\n JointDynamicsGrabberHandle\r\n} from './controller';\r\nimport { JointDynamicsSystemController } from './controller';\r\nimport { ColliderForce, type BoneNode, type ColliderR, type GrabberR, type TransformAccess } from './types';\r\nimport type { SkeletonBindPose } from '../skeleton';\r\n\r\nconst _quat = new Quaternion();\r\n\r\nconst _defaultTA = createTransformAccess(new SceneNode(null), false);\r\n\r\n/**\r\n * Create a transform adapter that lets the joint dynamics solver read from and write to a SceneNode.\r\n *\r\n * @param obj - Scene node to expose through the TransformAccess interface.\r\n * @returns A TransformAccess wrapper backed by the supplied scene node.\r\n *\r\n * @public\r\n */\r\nexport function createTransformAccess(obj: SceneNode, exposeNode = true): TransformAccess {\r\n return {\r\n ...(exposeNode ? { node: obj } : {}),\r\n getWorldPosition(): Vector3 {\r\n return obj.getWorldPosition();\r\n },\r\n getWorldRotation(): Quaternion {\r\n const q = new Quaternion();\r\n obj.worldMatrix.decompose(null, q, null);\r\n return q;\r\n },\r\n getWorldScale(): Vector3 {\r\n const s = new Vector3();\r\n obj.worldMatrix.decompose(s, null, null);\r\n return s;\r\n },\r\n getLocalPosition(): Vector3 {\r\n return obj.position.clone();\r\n },\r\n getLocalRotation(): Quaternion {\r\n return obj.rotation.clone();\r\n },\r\n getLocalScale(): Vector3 {\r\n return obj.scale.clone();\r\n },\r\n setWorldPosition(p: Vector3): void {\r\n if (obj.parent) {\r\n obj.position = obj.parent.invWorldMatrix.transformPointAffine(p);\r\n } else {\r\n obj.position.set(p);\r\n }\r\n },\r\n setWorldRotation(q: Quaternion): void {\r\n // Convert world rotation to local space.\r\n if (obj.parent) {\r\n obj.parent.worldMatrix.decompose(null, _quat, null);\r\n Quaternion.multiply(Quaternion.inverse(_quat), q, obj.rotation);\r\n } else {\r\n obj.rotation.set(q);\r\n }\r\n },\r\n setLocalPosition(p: Vector3): void {\r\n obj.position.set(p);\r\n },\r\n setLocalRotation(q: Quaternion): void {\r\n obj.rotation.set(q);\r\n },\r\n setLocalScale(s: Vector3): void {\r\n obj.scale.set(s);\r\n }\r\n };\r\n}\r\n\r\n/**\r\n * Describes the bone chains simulated by a JointDynamicsSystem.\r\n *\r\n * Each chain is defined by an inclusive start and end node. The end node must be\r\n * a descendant of the start node.\r\n *\r\n * @public\r\n */\r\nexport type JointChainConfig = {\r\n /** Root transform used for root motion compensation. */\r\n systemRoot: SceneNode;\r\n /** Bone chains to simulate. */\r\n chains: { start: SceneNode; end: SceneNode }[];\r\n};\r\n\r\n/**\r\n * Configuration used to construct a JointDynamicsSystem.\r\n *\r\n * @public\r\n */\r\nexport type JointDynamicSystemConfig = {\r\n /** Bone chain topology and root transform. */\r\n chainConfig: JointChainConfig;\r\n /** Optional controller configuration overrides. */\r\n controllerConfig?: DeepPartial<ControllerConfig, 2>;\r\n};\r\n\r\n/**\r\n * Physics system for spring-like joint dynamics on scene node bone chains.\r\n *\r\n * The system builds particles and constraints from one or more bone chains,\r\n * advances them with Verlet integration, solves constraints and collisions, and\r\n * writes the resulting positions and rotations back to the scene graph.\r\n *\r\n * @public\r\n */\r\nexport class JointDynamicsSystem {\r\n private _controller: JointDynamicsSystemController;\r\n private _chainConfig: JointChainConfig;\r\n private _bindPose: WeakMap<SceneNode, SkeletonBindPose>;\r\n /**\r\n * Create a joint dynamics system for one or more bone chains.\r\n *\r\n * @param config - Bone chain topology and controller configuration.\r\n * @param colliders - Optional colliders to register during initialization.\r\n * @param grabbers - Optional grabbers to register during initialization.\r\n * @param flatPlanes - Optional world-space planes that dynamic points cannot cross.\r\n */\r\n constructor(\r\n config: JointDynamicSystemConfig,\r\n colliders: { r: ColliderR; transform: TransformAccess }[] = [],\r\n grabbers: {\r\n r: GrabberR;\r\n transform: TransformAccess;\r\n enabled: boolean;\r\n }[] = [],\r\n flatPlanes: { up: Vector3; position: Vector3 }[] = []\r\n ) {\r\n this._chainConfig = {\r\n systemRoot: config.chainConfig.systemRoot,\r\n chains: config.chainConfig.chains.map((chain) => ({ start: chain.start, end: chain.end }))\r\n };\r\n this._bindPose = new WeakMap();\r\n const rootPoints: BoneNode[] = [];\r\n const boneNodes: BoneNode[] = [];\r\n const boneToNode = new Map<BoneNode, SceneNode>();\r\n const pointTransforms: TransformAccess[] = [];\r\n const nodeToBone = new Map<SceneNode, BoneNode>();\r\n const nodeToDepth = new Map<SceneNode, number>();\r\n for (const chain of config.chainConfig.chains) {\r\n const chainNodes = this.collectChainNodes(chain.start, chain.end);\r\n let previous: BoneNode | null = null;\r\n for (let i = 0; i < chainNodes.length; i++) {\r\n const node = chainNodes[i];\r\n let boneNode = nodeToBone.get(node);\r\n if (!boneNode) {\r\n this._bindPose.set(node, {\r\n position: node.position.clone(),\r\n rotation: node.rotation.clone(),\r\n scale: node.scale.clone()\r\n });\r\n boneNode = {\r\n index: boneNodes.length,\r\n position: node.getWorldPosition(),\r\n children: [],\r\n isFixed: i === 0,\r\n depth: i\r\n };\r\n nodeToBone.set(node, boneNode);\r\n nodeToDepth.set(node, i);\r\n boneNodes.push(boneNode);\r\n boneToNode.set(boneNode, node);\r\n } else {\r\n const depth = nodeToDepth.get(node) ?? boneNode.depth;\r\n if (i < depth) {\r\n boneNode.depth = i;\r\n nodeToDepth.set(node, i);\r\n }\r\n boneNode.isFixed = boneNode.isFixed || i === 0;\r\n }\r\n if (previous && !previous.children.includes(boneNode)) {\r\n previous.children.push(boneNode);\r\n const rootIndex = rootPoints.indexOf(boneNode);\r\n if (rootIndex !== -1) {\r\n rootPoints.splice(rootIndex, 1);\r\n }\r\n } else if (!previous && !rootPoints.includes(boneNode)) {\r\n rootPoints.push(boneNode);\r\n }\r\n previous = boneNode;\r\n }\r\n }\r\n const orderedBoneNodes: BoneNode[] = [];\r\n const visitedBoneNodes = new Set<BoneNode>();\r\n const orderBoneNode = (boneNode: BoneNode) => {\r\n if (visitedBoneNodes.has(boneNode)) {\r\n return;\r\n }\r\n visitedBoneNodes.add(boneNode);\r\n boneNode.index = orderedBoneNodes.length;\r\n orderedBoneNodes.push(boneNode);\r\n for (const child of boneNode.children) {\r\n orderBoneNode(child);\r\n }\r\n };\r\n for (const root of rootPoints) {\r\n orderBoneNode(root);\r\n }\r\n boneNodes.length = 0;\r\n boneNodes.push(...orderedBoneNodes);\r\n pointTransforms.push(...boneNodes.map((boneNode) => createTransformAccess(boneToNode.get(boneNode)!)));\r\n const systemRoot = createTransformAccess(config.chainConfig.systemRoot);\r\n const defaultConfig = this.getDefaultControllerConfig();\r\n const controllerConfig: ControllerConfig = {\r\n ...defaultConfig,\r\n ...config?.controllerConfig,\r\n angleLimitConfig: { ...defaultConfig.angleLimitConfig, ...config?.controllerConfig?.angleLimitConfig },\r\n curves: { ...defaultConfig.curves, ...config?.controllerConfig?.curves },\r\n constraintOptions: {\r\n ...defaultConfig.constraintOptions,\r\n ...config?.controllerConfig?.constraintOptions\r\n }\r\n };\r\n this._controller = new JointDynamicsSystemController(controllerConfig);\r\n this._controller.initialize(systemRoot, rootPoints, pointTransforms, colliders, grabbers, flatPlanes);\r\n }\r\n\r\n /**\r\n * Get the low-level controller that owns simulation state and advanced runtime controls.\r\n *\r\n * Most callers should prefer the convenience methods on JointDynamicsSystem.\r\n *\r\n * @returns The underlying joint dynamics controller.\r\n */\r\n get controller(): JointDynamicsSystemController {\r\n return this._controller;\r\n }\r\n\r\n /**\r\n * Get the node chain topology used to construct this system.\r\n */\r\n get chainConfig(): JointChainConfig {\r\n return {\r\n systemRoot: this._chainConfig.systemRoot,\r\n chains: this._chainConfig.chains.map((chain) => ({ start: chain.start, end: chain.end }))\r\n };\r\n }\r\n\r\n /**\r\n * Returns detached collider snapshots for serialization.\r\n */\r\n getColliderSnapshots(): JointDynamicsColliderSnapshot[] {\r\n return this._controller.getColliderSnapshots();\r\n }\r\n\r\n /**\r\n * Returns detached flat-plane snapshots for serialization.\r\n */\r\n getFlatPlaneSnapshots(): JointDynamicsFlatPlaneSnapshot[] {\r\n return this._controller.getFlatPlaneSnapshots();\r\n }\r\n\r\n /**\r\n * Returns detached grabber snapshots for serialization.\r\n */\r\n getGrabberSnapshots(): JointDynamicsGrabberSnapshot[] {\r\n return this._controller.getGrabberSnapshots();\r\n }\r\n\r\n /**\r\n * Reset chain nodes to bind pose\r\n */\r\n resetChains() {\r\n for (const chain of this._chainConfig.chains) {\r\n const chainNodes = this.collectChainNodes(chain.start, chain.end);\r\n for (const node of chainNodes) {\r\n const bindPose = this._bindPose.get(node);\r\n if (bindPose) {\r\n node.position = bindPose.position;\r\n node.rotation = bindPose.rotation;\r\n node.scale = bindPose.scale;\r\n }\r\n }\r\n }\r\n }\r\n /**\r\n * Add a fully configured collider at runtime.\r\n *\r\n * The collider transform is read from the supplied scene node every simula ; ion step.\r\n * If no transform is supplied, the collider is created at the identity transform.\r\n *\r\n * @param r - Read-only collider parameters.\r\n * @param transform - Optional scene node that drives the collider transform.\r\n * @returns A stable handle that remains valid until this collider is removed.\r\n */\r\n addCollider(r: ColliderR, transform?: SceneNode): JointDynamicsColliderHandle {\r\n return this._controller.addCollider(r, transform ? createTransformAccess(transform) : _defaultTA);\r\n }\r\n\r\n /**\r\n * Add a spherical collider at runtime.\r\n *\r\n * The collider transform is read from the supplied scene node every simulation step.\r\n * If no transform is supplied, the collider is created at the identity transform.\r\n *\r\n * @param radius - Sphere radius in world units before transform scaling.\r\n * @param transform - Optional scene node that drives the collider transform.\r\n * @param friction - Contact friction coefficient applied by this collider. Defaults to 0.\r\n * @param inversed - If true, points are constrained inside the sphere instead of pushed out.\r\n * @returns A stable handle that remains valid until this collider is removed.\r\n */\r\n addSphereCollider(\r\n radius: number,\r\n transform?: SceneNode,\r\n friction?: number,\r\n inversed?: boolean\r\n ): JointDynamicsColliderHandle {\r\n return this.addCollider(\r\n {\r\n forceType: ColliderForce.Off,\r\n friction: friction ?? 0,\r\n height: 0,\r\n isInverseCollider: inversed ?? false,\r\n radius,\r\n radiusTailScale: 1\r\n },\r\n transform\r\n );\r\n }\r\n\r\n /**\r\n * Add a capsule collider at runtime.\r\n *\r\n * The capsule is aligned to the collider transform's local Y axis. Its head radius is\r\n * `radius`, its tail radius is `radius * radiusTailScale`, and `height` defines the\r\n * distance between the capsule ends before transform scaling.\r\n *\r\n * @param radius - Capsule head radius in world units before transform scaling.\r\n * @param height - Capsule length in world units before transform scaling.\r\n * @param transform - Optional scene node that drives the collider transform.\r\n * @param radiusTailScale - Tail radius multiplier relative to the head radius. Defaults to 1.\r\n * @param friction - Contact friction coefficient applied by this collider. Defaults to 0.\r\n * @param inversed - If true, points are constrained inside the capsule instead of pushed out.\r\n * @returns A stable handle that remains valid until this collider is removed.\r\n */\r\n addCapsuleCollider(\r\n radius: number,\r\n height: number,\r\n transform?: SceneNode,\r\n radiusTailScale?: number,\r\n friction?: number,\r\n inversed?: boolean\r\n ): JointDynamicsColliderHandle {\r\n return this.addCollider(\r\n {\r\n forceType: ColliderForce.Off,\r\n friction: friction ?? 0,\r\n height,\r\n isInverseCollider: inversed ?? false,\r\n radius,\r\n radiusTailScale: radiusTailScale ?? 1\r\n },\r\n transform\r\n );\r\n }\r\n\r\n /**\r\n * Enable or disable a collider by stable handle.\r\n *\r\n * Disabled colliders remain registered but are ignored by simulation until re-enabled.\r\n *\r\n * @param handle - Collider handle returned by addCollider, addSphereCollider, or addCapsuleCollider.\r\n * @param enabled - Whether the collider should participate in simulation.\r\n * @returns true if the handle is valid and the enabled state was updated.\r\n */\r\n setColliderEnabled(handle: JointDynamicsColliderHandle, enabled: boolean): boolean {\r\n return this._controller.setColliderEnabled(handle, enabled);\r\n }\r\n\r\n /**\r\n * Remove a collider by stable handle.\r\n *\r\n * @param handle - Collider handle returned by addCollider, addSphereCollider, or addCapsuleCollider.\r\n * @returns true if the collider existed and was removed.\r\n */\r\n removeCollider(handle: JointDynamicsColliderHandle): boolean {\r\n return this._controller.removeCollider(handle);\r\n }\r\n\r\n /**\r\n * Remove a collider by current array index.\r\n *\r\n * Prefer removeCollider(handle) for runtime-owned colliders.\r\n *\r\n * @param index - Current collider array index.\r\n * @returns true if the collider existed and was removed.\r\n */\r\n removeColliderAt(index: number): boolean {\r\n return this._controller.removeColliderAt(index);\r\n }\r\n\r\n /**\r\n * Add a flat plane collider at runtime.\r\n *\r\n * Flat planes are infinite world-space planes. The normal points toward the allowed side,\r\n * and dynamic points are pushed back when they move behind the plane.\r\n *\r\n * @param up - Plane normal in world space.\r\n * @param position - A point on the plane in world space.\r\n * @returns A stable handle that remains valid until this flat plane is removed.\r\n */\r\n addFlatPlane(up: Vector3, position: Vector3): JointDynamicsFlatPlaneHandle {\r\n return this._controller.addFlatPlane(up, position);\r\n }\r\n\r\n /**\r\n * Enable or disable a flat plane by stable handle.\r\n *\r\n * Disabled flat planes remain registered but are ignored by simulation until re-enabled.\r\n *\r\n * @param handle - Flat plane handle returned by addFlatPlane.\r\n * @param enabled - Whether the flat plane should participate in simulation.\r\n * @returns true if the handle is valid and the enabled state was updated.\r\n */\r\n setFlatPlaneEnabled(handle: JointDynamicsFlatPlaneHandle, enabled: boolean): boolean {\r\n return this._controller.setFlatPlaneEnabled(handle, enabled);\r\n }\r\n\r\n /**\r\n * Remove a flat plane by stable handle.\r\n *\r\n * @param handle - Flat plane handle returned by addFlatPlane.\r\n * @returns true if the flat plane existed and was removed.\r\n */\r\n removeFlatPlane(handle: JointDynamicsFlatPlaneHandle): boolean {\r\n return this._controller.removeFlatPlane(handle);\r\n }\r\n\r\n /**\r\n * Remove a flat plane by current array index.\r\n * Prefer removeFlatPlane(handle) for runtime-owned flat planes.\r\n *\r\n * @param index - Current flat plane array index.\r\n * @returns true if the flat plane existed and was removed.\r\n */\r\n removeFlatPlaneAt(index: number): boolean {\r\n return this._controller.removeFlatPlaneAt(index);\r\n }\r\n\r\n /**\r\n * Add a grabber at runtime.\r\n *\r\n * The grabber transform is read from the supplied scene node every simulation step.\r\n * If no transform is supplied, the grabber is created at the identity transform.\r\n *\r\n * @param r - Read-only grabber parameters.\r\n * @param transform - Optional scene node that drives the grabber transform.\r\n * @returns A stable handle that remains valid until this grabber is removed.\r\n */\r\n addGrabber(r: GrabberR, transform?: SceneNode): JointDynamicsGrabberHandle {\r\n return this._controller.addGrabber(r, transform ? createTransformAccess(transform) : _defaultTA, false);\r\n }\r\n\r\n /**\r\n * Enable or disable a grabber by stable handle.\r\n *\r\n * Disabling a grabber also releases any points currently held by it.\r\n *\r\n * @param handle - Grabber handle returned by addGrabber.\r\n * @param enabled - Whether the grabber should participate in simulation.\r\n * @returns true if the handle is valid and the enabled state was updated.\r\n */\r\n setGrabberEnabled(handle: JointDynamicsGrabberHandle, enabled: boolean): boolean {\r\n return this._controller.setGrabberEnabled(handle, enabled);\r\n }\r\n\r\n /**\r\n * Remove a grabber by stable handle.\r\n *\r\n * @param handle - Grabber handle returned by addGrabber.\r\n * @returns true if the grabber existed and was removed.\r\n */\r\n removeGrabber(handle: JointDynamicsGrabberHandle): boolean {\r\n return this._controller.removeGrabber(handle);\r\n }\r\n\r\n /**\r\n * Remove a grabber by current array index.\r\n *\r\n * Prefer removeGrabber(handle) for runtime-owned grabbers.\r\n *\r\n * @param index - Current grabber array index.\r\n * @returns true if the grabber existed and was removed.\r\n */\r\n removeGrabberAt(index: number): boolean {\r\n return this._controller.removeGrabberAt(index);\r\n }\r\n\r\n private collectChainNodes(start: SceneNode, end: SceneNode): SceneNode[] {\r\n if (!start.isParentOf(end)) {\r\n throw new Error('Invalid chain: end node must be a descendant of start node');\r\n }\r\n const nodes: SceneNode[] = [];\r\n let current: SceneNode = end;\r\n for (;;) {\r\n nodes.unshift(current);\r\n if (current === start) {\r\n break;\r\n }\r\n current = current.parent!;\r\n }\r\n return nodes;\r\n }\r\n /**\r\n * Advance the physics simulation and write the resulting transforms back to the chain nodes.\r\n *\r\n * @param deltaTime - Frame time step in seconds. Values larger than 0.033 are clamped for stability.\r\n */\r\n update(deltaTime: number): void {\r\n const dt = Math.min(deltaTime, 0.033); // Max 30 FPS\r\n this._controller.step(dt);\r\n }\r\n /** @internal */\r\n private getDefaultControllerConfig(): ControllerConfig {\r\n return {\r\n gravity: new Vector3(0, -9.8, 0),\r\n relaxation: 3,\r\n subSteps: 3,\r\n enableSurfaceCollision: false,\r\n windForce: Vector3.zero(),\r\n rootSlideLimit: -1,\r\n rootRotateLimit: -1,\r\n constraintShrinkLimit: 1,\r\n blendRatio: 0,\r\n stabilizationFrameRate: 60,\r\n isFakeWave: false,\r\n fakeWaveSpeed: 0,\r\n fakeWavePower: 0,\r\n angleLimitConfig: { angleLimit: -1, limitFromRoot: false },\r\n enableBroadPhase: false,\r\n preserveTwist: true,\r\n curves: {\r\n gravityScale: InterpolatorScalar.constant(1),\r\n windForceScale: InterpolatorScalar.constant(1),\r\n massScale: InterpolatorScalar.constant(1),\r\n resistance: InterpolatorScalar.constant(0.95),\r\n hardness: InterpolatorScalar.constant(0.001),\r\n friction: InterpolatorScalar.constant(0.5),\r\n pointRadius: InterpolatorScalar.constant(0.05),\r\n sliderJointLength: InterpolatorScalar.constant(0),\r\n allShrinkScale: InterpolatorScalar.constant(1),\r\n allStretchScale: InterpolatorScalar.constant(1),\r\n structuralShrinkVertical: InterpolatorScalar.constant(1),\r\n structuralStretchVertical: InterpolatorScalar.constant(1),\r\n structuralShrinkHorizontal: InterpolatorScalar.constant(0.5),\r\n structuralStretchHorizontal: InterpolatorScalar.constant(0.5),\r\n shearShrink: InterpolatorScalar.constant(0.5),\r\n shearStretch: InterpolatorScalar.constant(0.5),\r\n bendingShrinkVertical: InterpolatorScalar.constant(0.5),\r\n bendingStretchVertical: InterpolatorScalar.constant(0.5),\r\n bendingShrinkHorizontal: InterpolatorScalar.constant(0.5),\r\n bendingStretchHorizontal: InterpolatorScalar.constant(0.5),\r\n fakeWavePower: InterpolatorScalar.constant(0),\r\n fakeWaveFreq: InterpolatorScalar.constant(0)\r\n },\r\n constraintOptions: {\r\n structuralVertical: false,\r\n structuralHorizontal: false,\r\n shear: false,\r\n bendingVertical: false,\r\n bendingHorizontal: false,\r\n isLoop: false,\r\n collideStructuralVertical: false,\r\n collideStructuralHorizontal: false,\r\n collideShear: false,\r\n enableSurfaceCollision: false\r\n }\r\n };\r\n }\r\n}\r\n"],"names":["_quat","Quaternion","_defaultTA","createTransformAccess","SceneNode","obj","exposeNode","node","getWorldPosition","getWorldRotation","q","worldMatrix","decompose","getWorldScale","s","Vector3","getLocalPosition","position","clone","getLocalRotation","rotation","getLocalScale","scale","setWorldPosition","p","parent","invWorldMatrix","transformPointAffine","set","setWorldRotation","multiply","inverse","setLocalPosition","setLocalRotation","setLocalScale","JointDynamicsSystem","_controller","_chainConfig","_bindPose","config","colliders","grabbers","flatPlanes","systemRoot","chainConfig","chains","map","chain","start","end","WeakMap","rootPoints","boneNodes","boneToNode","Map","pointTransforms","nodeToBone","nodeToDepth","chainNodes","collectChainNodes","previous","i","length","boneNode","get","index","children","isFixed","depth","push","includes","rootIndex","indexOf","splice","orderedBoneNodes","visitedBoneNodes","Set","orderBoneNode","has","add","child","root","defaultConfig","getDefaultControllerConfig","controllerConfig","angleLimitConfig","curves","constraintOptions","JointDynamicsSystemController","initialize","controller","getColliderSnapshots","getFlatPlaneSnapshots","getGrabberSnapshots","resetChains","bindPose","addCollider","r","transform","addSphereCollider","radius","friction","inversed","forceType","ColliderForce","Off","height","isInverseCollider","radiusTailScale","addCapsuleCollider","setColliderEnabled","handle","enabled","removeCollider","removeColliderAt","addFlatPlane","up","setFlatPlaneEnabled","removeFlatPlane","removeFlatPlaneAt","addGrabber","setGrabberEnabled","removeGrabber","removeGrabberAt","isParentOf","Error","nodes","current","unshift","update","deltaTime","dt","Math","min","step","gravity","relaxation","subSteps","enableSurfaceCollision","windForce","zero","rootSlideLimit","rootRotateLimit","constraintShrinkLimit","blendRatio","stabilizationFrameRate","isFakeWave","fakeWaveSpeed","fakeWavePower","angleLimit","limitFromRoot","enableBroadPhase","preserveTwist","gravityScale","InterpolatorScalar","constant","windForceScale","massScale","resistance","hardness","pointRadius","sliderJointLength","allShrinkScale","allStretchScale","structuralShrinkVertical","structuralStretchVertical","structuralShrinkHorizontal","structuralStretchHorizontal","shearShrink","shearStretch","bendingShrinkVertical","bendingStretchVertical","bendingShrinkHorizontal","bendingStretchHorizontal","fakeWaveFreq","structuralVertical","structuralHorizontal","shear","bendingVertical","bendingHorizontal","isLoop","collideStructuralVertical","collideStructuralHorizontal","collideShear"],"mappings":"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"}
1
+ {"version":3,"file":"joint_dynamics_system.js","sources":["../../../src/animation/joint_dynamics/joint_dynamics_system.ts"],"sourcesContent":["import type { DeepPartial } from '@zephyr3d/base';\r\nimport { InterpolatorScalar, Vector3 } from '@zephyr3d/base';\r\nimport { Quaternion } from '@zephyr3d/base';\r\nimport { SceneNode } from '../../scene/scene_node';\r\nimport type {\r\n ControllerConfig,\r\n JointDynamicsColliderSnapshot,\r\n JointDynamicsColliderHandle,\r\n JointDynamicsFlatPlaneSnapshot,\r\n JointDynamicsFlatPlaneHandle,\r\n JointDynamicsGrabberSnapshot,\r\n JointDynamicsGrabberHandle\r\n} from './controller';\r\nimport { JointDynamicsSystemController } from './controller';\r\nimport { ColliderForce, type BoneNode, type ColliderR, type GrabberR, type TransformAccess } from './types';\r\nimport type { SkeletonBindPose } from '../skeleton';\r\n\r\nconst _quat = new Quaternion();\r\n\r\nconst _defaultTA = createTransformAccess(new SceneNode(null), false);\r\n\r\n/**\r\n * Create a transform adapter that lets the joint dynamics solver read from and write to a SceneNode.\r\n *\r\n * @param obj - Scene node to expose through the TransformAccess interface.\r\n * @returns A TransformAccess wrapper backed by the supplied scene node.\r\n *\r\n * @public\r\n */\r\nexport function createTransformAccess(obj: SceneNode, exposeNode = true): TransformAccess {\r\n return {\r\n ...(exposeNode ? { node: obj } : {}),\r\n getWorldPosition(): Vector3 {\r\n return obj.getWorldPosition();\r\n },\r\n getWorldRotation(): Quaternion {\r\n const q = new Quaternion();\r\n obj.worldMatrix.decompose(null, q, null);\r\n return q;\r\n },\r\n getWorldScale(): Vector3 {\r\n const s = new Vector3();\r\n obj.worldMatrix.decompose(s, null, null);\r\n return s;\r\n },\r\n getLocalPosition(): Vector3 {\r\n return obj.position.clone();\r\n },\r\n getLocalRotation(): Quaternion {\r\n return obj.rotation.clone();\r\n },\r\n getLocalScale(): Vector3 {\r\n return obj.scale.clone();\r\n },\r\n setWorldPosition(p: Vector3): void {\r\n if (obj.parent) {\r\n obj.position = obj.parent.invWorldMatrix.transformPointAffine(p);\r\n } else {\r\n obj.position.set(p);\r\n }\r\n },\r\n setWorldRotation(q: Quaternion): void {\r\n // Convert world rotation to local space.\r\n if (obj.parent) {\r\n obj.parent.worldMatrix.decompose(null, _quat, null);\r\n Quaternion.multiply(Quaternion.inverse(_quat), q, obj.rotation);\r\n } else {\r\n obj.rotation.set(q);\r\n }\r\n },\r\n setLocalPosition(p: Vector3): void {\r\n obj.position.set(p);\r\n },\r\n setLocalRotation(q: Quaternion): void {\r\n obj.rotation.set(q);\r\n },\r\n setLocalScale(s: Vector3): void {\r\n obj.scale.set(s);\r\n }\r\n };\r\n}\r\n\r\nfunction createOffsetTransformAccess(\r\n obj: SceneNode,\r\n localOffset: Vector3,\r\n exposeNode = true\r\n): TransformAccess {\r\n const offset = localOffset.clone();\r\n return {\r\n ...(exposeNode ? { node: obj } : {}),\r\n getWorldPosition(): Vector3 {\r\n return obj.worldMatrix.transformPointAffine(offset);\r\n },\r\n getWorldRotation(): Quaternion {\r\n const q = new Quaternion();\r\n obj.worldMatrix.decompose(null, q, null);\r\n return q;\r\n },\r\n getWorldScale(): Vector3 {\r\n const s = new Vector3();\r\n obj.worldMatrix.decompose(s, null, null);\r\n return s;\r\n },\r\n getLocalPosition(): Vector3 {\r\n return obj.position.clone();\r\n },\r\n getLocalRotation(): Quaternion {\r\n return obj.rotation.clone();\r\n },\r\n getLocalScale(): Vector3 {\r\n return obj.scale.clone();\r\n },\r\n setWorldPosition(p: Vector3): void {\r\n if (obj.parent) {\r\n obj.position = obj.parent.invWorldMatrix.transformPointAffine(p);\r\n } else {\r\n obj.position.set(p);\r\n }\r\n },\r\n setWorldRotation(q: Quaternion): void {\r\n if (obj.parent) {\r\n obj.parent.worldMatrix.decompose(null, _quat, null);\r\n Quaternion.multiply(Quaternion.inverse(_quat), q, obj.rotation);\r\n } else {\r\n obj.rotation.set(q);\r\n }\r\n },\r\n setLocalPosition(p: Vector3): void {\r\n obj.position.set(p);\r\n },\r\n setLocalRotation(q: Quaternion): void {\r\n obj.rotation.set(q);\r\n },\r\n setLocalScale(s: Vector3): void {\r\n obj.scale.set(s);\r\n }\r\n };\r\n}\r\n\r\n/**\r\n * Describes the bone chains simulated by a JointDynamicsSystem.\r\n *\r\n * Each chain is defined by an inclusive start and end node. The end node must be\r\n * a descendant of the start node.\r\n *\r\n * @public\r\n */\r\nexport type JointChainConfig = {\r\n /** Root transform used for root motion compensation. */\r\n systemRoot: SceneNode;\r\n /** Bone chains to simulate. */\r\n chains: {\r\n start: SceneNode;\r\n end: SceneNode;\r\n startAnchor?: SceneNode;\r\n endAnchor?: SceneNode;\r\n startAnchorOffset?: Vector3;\r\n endAnchorOffset?: Vector3;\r\n }[];\r\n};\r\n\r\n/**\r\n * Configuration used to construct a JointDynamicsSystem.\r\n *\r\n * @public\r\n */\r\nexport type JointDynamicSystemConfig = {\r\n /** Bone chain topology and root transform. */\r\n chainConfig: JointChainConfig;\r\n /** Optional controller configuration overrides. */\r\n controllerConfig?: DeepPartial<ControllerConfig, 2>;\r\n};\r\n\r\n/**\r\n * Physics system for spring-like joint dynamics on scene node bone chains.\r\n *\r\n * The system builds particles and constraints from one or more bone chains,\r\n * advances them with Verlet integration, solves constraints and collisions, and\r\n * writes the resulting positions and rotations back to the scene graph.\r\n *\r\n * @public\r\n */\r\nexport class JointDynamicsSystem {\r\n private _controller: JointDynamicsSystemController;\r\n private _chainConfig: JointChainConfig;\r\n private _bindPose: WeakMap<SceneNode, SkeletonBindPose>;\r\n /**\r\n * Create a joint dynamics system for one or more bone chains.\r\n *\r\n * @param config - Bone chain topology and controller configuration.\r\n * @param colliders - Optional colliders to register during initialization.\r\n * @param grabbers - Optional grabbers to register during initialization.\r\n * @param flatPlanes - Optional world-space planes that dynamic points cannot cross.\r\n */\r\n constructor(\r\n config: JointDynamicSystemConfig,\r\n colliders: { r: ColliderR; transform: TransformAccess }[] = [],\r\n grabbers: {\r\n r: GrabberR;\r\n transform: TransformAccess;\r\n enabled: boolean;\r\n }[] = [],\r\n flatPlanes: { up: Vector3; position: Vector3 }[] = []\r\n ) {\r\n this._chainConfig = {\r\n systemRoot: config.chainConfig.systemRoot,\r\n chains: config.chainConfig.chains.map((chain) => ({\r\n start: chain.start,\r\n end: chain.end,\r\n startAnchor: chain.startAnchor,\r\n endAnchor: chain.endAnchor,\r\n startAnchorOffset: chain.startAnchorOffset?.clone(),\r\n endAnchorOffset: chain.endAnchorOffset?.clone()\r\n }))\r\n };\r\n this._bindPose = new WeakMap();\r\n const rootPoints: BoneNode[] = [];\r\n const boneNodes: BoneNode[] = [];\r\n const boneToNode = new Map<BoneNode, SceneNode>();\r\n const pointTransforms: TransformAccess[] = [];\r\n const pointSourceTransforms = new Map<BoneNode, TransformAccess>();\r\n const nodeToBone = new Map<SceneNode, BoneNode>();\r\n const nodeToDepth = new Map<SceneNode, number>();\r\n for (const chain of config.chainConfig.chains) {\r\n const chainNodes = this.collectChainNodes(chain.start, chain.end);\r\n let previous: BoneNode | null = null;\r\n for (let i = 0; i < chainNodes.length; i++) {\r\n const node = chainNodes[i];\r\n const isChainStart = i === 0;\r\n const isChainEnd = i === chainNodes.length - 1;\r\n const sourceNode =\r\n (isChainStart ? chain.startAnchor : null) ?? (isChainEnd ? chain.endAnchor : null) ?? node;\r\n const sourceOffset =\r\n (isChainStart ? chain.startAnchorOffset : null) ??\r\n (isChainEnd ? chain.endAnchorOffset : null) ??\r\n null;\r\n let boneNode = nodeToBone.get(node);\r\n if (!boneNode) {\r\n this._bindPose.set(node, {\r\n position: node.position.clone(),\r\n rotation: node.rotation.clone(),\r\n scale: node.scale.clone()\r\n });\r\n boneNode = {\r\n index: boneNodes.length,\r\n position: node.getWorldPosition(),\r\n children: [],\r\n isFixed: isChainStart || !!(isChainEnd && chain.endAnchor),\r\n depth: i\r\n };\r\n nodeToBone.set(node, boneNode);\r\n nodeToDepth.set(node, i);\r\n boneNodes.push(boneNode);\r\n boneToNode.set(boneNode, node);\r\n pointSourceTransforms.set(\r\n boneNode,\r\n sourceOffset\r\n ? createOffsetTransformAccess(sourceNode, sourceOffset)\r\n : createTransformAccess(sourceNode)\r\n );\r\n } else {\r\n const depth = nodeToDepth.get(node) ?? boneNode.depth;\r\n if (i < depth) {\r\n boneNode.depth = i;\r\n nodeToDepth.set(node, i);\r\n }\r\n boneNode.isFixed = boneNode.isFixed || isChainStart || !!(isChainEnd && chain.endAnchor);\r\n const existingSource =\r\n pointSourceTransforms.get(boneNode)?.node ?? boneToNode.get(boneNode) ?? null;\r\n if (existingSource && existingSource !== sourceNode) {\r\n throw new Error(\r\n `Conflicting anchor assignment for joint dynamics node '${node.name || node.persistentId}'.`\r\n );\r\n }\r\n if (!existingSource) {\r\n pointSourceTransforms.set(\r\n boneNode,\r\n sourceOffset\r\n ? createOffsetTransformAccess(sourceNode, sourceOffset)\r\n : createTransformAccess(sourceNode)\r\n );\r\n }\r\n }\r\n if (previous && !previous.children.includes(boneNode)) {\r\n previous.children.push(boneNode);\r\n const rootIndex = rootPoints.indexOf(boneNode);\r\n if (rootIndex !== -1) {\r\n rootPoints.splice(rootIndex, 1);\r\n }\r\n } else if (!previous && !rootPoints.includes(boneNode)) {\r\n rootPoints.push(boneNode);\r\n }\r\n previous = boneNode;\r\n }\r\n }\r\n const orderedBoneNodes: BoneNode[] = [];\r\n const visitedBoneNodes = new Set<BoneNode>();\r\n const orderBoneNode = (boneNode: BoneNode) => {\r\n if (visitedBoneNodes.has(boneNode)) {\r\n return;\r\n }\r\n visitedBoneNodes.add(boneNode);\r\n boneNode.index = orderedBoneNodes.length;\r\n orderedBoneNodes.push(boneNode);\r\n for (const child of boneNode.children) {\r\n orderBoneNode(child);\r\n }\r\n };\r\n for (const root of rootPoints) {\r\n orderBoneNode(root);\r\n }\r\n boneNodes.length = 0;\r\n boneNodes.push(...orderedBoneNodes);\r\n pointTransforms.push(...boneNodes.map((boneNode) => createTransformAccess(boneToNode.get(boneNode)!)));\r\n const pointInputTransforms = boneNodes.map(\r\n (boneNode) => pointSourceTransforms.get(boneNode) ?? createTransformAccess(boneToNode.get(boneNode)!)\r\n );\r\n const systemRoot = createTransformAccess(config.chainConfig.systemRoot);\r\n const defaultConfig = this.getDefaultControllerConfig();\r\n const controllerConfig: ControllerConfig = {\r\n ...defaultConfig,\r\n ...config?.controllerConfig,\r\n angleLimitConfig: { ...defaultConfig.angleLimitConfig, ...config?.controllerConfig?.angleLimitConfig },\r\n curves: { ...defaultConfig.curves, ...config?.controllerConfig?.curves },\r\n constraintOptions: {\r\n ...defaultConfig.constraintOptions,\r\n ...config?.controllerConfig?.constraintOptions\r\n }\r\n };\r\n this._controller = new JointDynamicsSystemController(controllerConfig);\r\n this._controller.initialize(\r\n systemRoot,\r\n rootPoints,\r\n pointTransforms,\r\n pointInputTransforms,\r\n colliders,\r\n grabbers,\r\n flatPlanes\r\n );\r\n }\r\n\r\n /**\r\n * Get the low-level controller that owns simulation state and advanced runtime controls.\r\n *\r\n * Most callers should prefer the convenience methods on JointDynamicsSystem.\r\n *\r\n * @returns The underlying joint dynamics controller.\r\n */\r\n get controller(): JointDynamicsSystemController {\r\n return this._controller;\r\n }\r\n\r\n /**\r\n * Get the node chain topology used to construct this system.\r\n */\r\n get chainConfig(): JointChainConfig {\r\n return {\r\n systemRoot: this._chainConfig.systemRoot,\r\n chains: this._chainConfig.chains.map((chain) => ({\r\n start: chain.start,\r\n end: chain.end,\r\n startAnchor: chain.startAnchor,\r\n endAnchor: chain.endAnchor,\r\n startAnchorOffset: chain.startAnchorOffset?.clone(),\r\n endAnchorOffset: chain.endAnchorOffset?.clone()\r\n }))\r\n };\r\n }\r\n\r\n /**\r\n * Returns detached collider snapshots for serialization.\r\n */\r\n getColliderSnapshots(): JointDynamicsColliderSnapshot[] {\r\n return this._controller.getColliderSnapshots();\r\n }\r\n\r\n /**\r\n * Returns detached flat-plane snapshots for serialization.\r\n */\r\n getFlatPlaneSnapshots(): JointDynamicsFlatPlaneSnapshot[] {\r\n return this._controller.getFlatPlaneSnapshots();\r\n }\r\n\r\n /**\r\n * Returns detached grabber snapshots for serialization.\r\n */\r\n getGrabberSnapshots(): JointDynamicsGrabberSnapshot[] {\r\n return this._controller.getGrabberSnapshots();\r\n }\r\n\r\n /**\r\n * Reset chain nodes to bind pose\r\n */\r\n resetChains() {\r\n for (const chain of this._chainConfig.chains) {\r\n const chainNodes = this.collectChainNodes(chain.start, chain.end);\r\n for (const node of chainNodes) {\r\n const bindPose = this._bindPose.get(node);\r\n if (bindPose) {\r\n node.position = bindPose.position;\r\n node.rotation = bindPose.rotation;\r\n node.scale = bindPose.scale;\r\n }\r\n }\r\n }\r\n }\r\n /**\r\n * Add a fully configured collider at runtime.\r\n *\r\n * The collider transform is read from the supplied scene node every simula ; ion step.\r\n * If no transform is supplied, the collider is created at the identity transform.\r\n *\r\n * @param r - Read-only collider parameters.\r\n * @param transform - Optional scene node that drives the collider transform.\r\n * @returns A stable handle that remains valid until this collider is removed.\r\n */\r\n addCollider(r: ColliderR, transform?: SceneNode): JointDynamicsColliderHandle {\r\n return this._controller.addCollider(r, transform ? createTransformAccess(transform) : _defaultTA);\r\n }\r\n\r\n /**\r\n * Add a spherical collider at runtime.\r\n *\r\n * The collider transform is read from the supplied scene node every simulation step.\r\n * If no transform is supplied, the collider is created at the identity transform.\r\n *\r\n * @param radius - Sphere radius in world units before transform scaling.\r\n * @param transform - Optional scene node that drives the collider transform.\r\n * @param friction - Contact friction coefficient applied by this collider. Defaults to 0.\r\n * @param inversed - If true, points are constrained inside the sphere instead of pushed out.\r\n * @returns A stable handle that remains valid until this collider is removed.\r\n */\r\n addSphereCollider(\r\n radius: number,\r\n transform?: SceneNode,\r\n friction?: number,\r\n inversed?: boolean\r\n ): JointDynamicsColliderHandle {\r\n return this.addCollider(\r\n {\r\n forceType: ColliderForce.Off,\r\n friction: friction ?? 0,\r\n height: 0,\r\n isInverseCollider: inversed ?? false,\r\n radius,\r\n radiusTailScale: 1\r\n },\r\n transform\r\n );\r\n }\r\n\r\n /**\r\n * Add a capsule collider at runtime.\r\n *\r\n * The capsule is aligned to the collider transform's local Y axis. Its head radius is\r\n * `radius`, its tail radius is `radius * radiusTailScale`, and `height` defines the\r\n * distance between the capsule ends before transform scaling.\r\n *\r\n * @param radius - Capsule head radius in world units before transform scaling.\r\n * @param height - Capsule length in world units before transform scaling.\r\n * @param transform - Optional scene node that drives the collider transform.\r\n * @param radiusTailScale - Tail radius multiplier relative to the head radius. Defaults to 1.\r\n * @param friction - Contact friction coefficient applied by this collider. Defaults to 0.\r\n * @param inversed - If true, points are constrained inside the capsule instead of pushed out.\r\n * @returns A stable handle that remains valid until this collider is removed.\r\n */\r\n addCapsuleCollider(\r\n radius: number,\r\n height: number,\r\n transform?: SceneNode,\r\n radiusTailScale?: number,\r\n friction?: number,\r\n inversed?: boolean\r\n ): JointDynamicsColliderHandle {\r\n return this.addCollider(\r\n {\r\n forceType: ColliderForce.Off,\r\n friction: friction ?? 0,\r\n height,\r\n isInverseCollider: inversed ?? false,\r\n radius,\r\n radiusTailScale: radiusTailScale ?? 1\r\n },\r\n transform\r\n );\r\n }\r\n\r\n /**\r\n * Enable or disable a collider by stable handle.\r\n *\r\n * Disabled colliders remain registered but are ignored by simulation until re-enabled.\r\n *\r\n * @param handle - Collider handle returned by addCollider, addSphereCollider, or addCapsuleCollider.\r\n * @param enabled - Whether the collider should participate in simulation.\r\n * @returns true if the handle is valid and the enabled state was updated.\r\n */\r\n setColliderEnabled(handle: JointDynamicsColliderHandle, enabled: boolean): boolean {\r\n return this._controller.setColliderEnabled(handle, enabled);\r\n }\r\n\r\n /**\r\n * Remove a collider by stable handle.\r\n *\r\n * @param handle - Collider handle returned by addCollider, addSphereCollider, or addCapsuleCollider.\r\n * @returns true if the collider existed and was removed.\r\n */\r\n removeCollider(handle: JointDynamicsColliderHandle): boolean {\r\n return this._controller.removeCollider(handle);\r\n }\r\n\r\n /**\r\n * Remove a collider by current array index.\r\n *\r\n * Prefer removeCollider(handle) for runtime-owned colliders.\r\n *\r\n * @param index - Current collider array index.\r\n * @returns true if the collider existed and was removed.\r\n */\r\n removeColliderAt(index: number): boolean {\r\n return this._controller.removeColliderAt(index);\r\n }\r\n\r\n /**\r\n * Add a flat plane collider at runtime.\r\n *\r\n * Flat planes are infinite world-space planes. The normal points toward the allowed side,\r\n * and dynamic points are pushed back when they move behind the plane.\r\n *\r\n * @param up - Plane normal in world space.\r\n * @param position - A point on the plane in world space.\r\n * @returns A stable handle that remains valid until this flat plane is removed.\r\n */\r\n addFlatPlane(up: Vector3, position: Vector3): JointDynamicsFlatPlaneHandle {\r\n return this._controller.addFlatPlane(up, position);\r\n }\r\n\r\n /**\r\n * Enable or disable a flat plane by stable handle.\r\n *\r\n * Disabled flat planes remain registered but are ignored by simulation until re-enabled.\r\n *\r\n * @param handle - Flat plane handle returned by addFlatPlane.\r\n * @param enabled - Whether the flat plane should participate in simulation.\r\n * @returns true if the handle is valid and the enabled state was updated.\r\n */\r\n setFlatPlaneEnabled(handle: JointDynamicsFlatPlaneHandle, enabled: boolean): boolean {\r\n return this._controller.setFlatPlaneEnabled(handle, enabled);\r\n }\r\n\r\n /**\r\n * Remove a flat plane by stable handle.\r\n *\r\n * @param handle - Flat plane handle returned by addFlatPlane.\r\n * @returns true if the flat plane existed and was removed.\r\n */\r\n removeFlatPlane(handle: JointDynamicsFlatPlaneHandle): boolean {\r\n return this._controller.removeFlatPlane(handle);\r\n }\r\n\r\n /**\r\n * Remove a flat plane by current array index.\r\n * Prefer removeFlatPlane(handle) for runtime-owned flat planes.\r\n *\r\n * @param index - Current flat plane array index.\r\n * @returns true if the flat plane existed and was removed.\r\n */\r\n removeFlatPlaneAt(index: number): boolean {\r\n return this._controller.removeFlatPlaneAt(index);\r\n }\r\n\r\n /**\r\n * Add a grabber at runtime.\r\n *\r\n * The grabber transform is read from the supplied scene node every simulation step.\r\n * If no transform is supplied, the grabber is created at the identity transform.\r\n *\r\n * @param r - Read-only grabber parameters.\r\n * @param transform - Optional scene node that drives the grabber transform.\r\n * @returns A stable handle that remains valid until this grabber is removed.\r\n */\r\n addGrabber(r: GrabberR, transform?: SceneNode): JointDynamicsGrabberHandle {\r\n return this._controller.addGrabber(r, transform ? createTransformAccess(transform) : _defaultTA, false);\r\n }\r\n\r\n /**\r\n * Enable or disable a grabber by stable handle.\r\n *\r\n * Disabling a grabber also releases any points currently held by it.\r\n *\r\n * @param handle - Grabber handle returned by addGrabber.\r\n * @param enabled - Whether the grabber should participate in simulation.\r\n * @returns true if the handle is valid and the enabled state was updated.\r\n */\r\n setGrabberEnabled(handle: JointDynamicsGrabberHandle, enabled: boolean): boolean {\r\n return this._controller.setGrabberEnabled(handle, enabled);\r\n }\r\n\r\n /**\r\n * Remove a grabber by stable handle.\r\n *\r\n * @param handle - Grabber handle returned by addGrabber.\r\n * @returns true if the grabber existed and was removed.\r\n */\r\n removeGrabber(handle: JointDynamicsGrabberHandle): boolean {\r\n return this._controller.removeGrabber(handle);\r\n }\r\n\r\n /**\r\n * Remove a grabber by current array index.\r\n *\r\n * Prefer removeGrabber(handle) for runtime-owned grabbers.\r\n *\r\n * @param index - Current grabber array index.\r\n * @returns true if the grabber existed and was removed.\r\n */\r\n removeGrabberAt(index: number): boolean {\r\n return this._controller.removeGrabberAt(index);\r\n }\r\n\r\n private collectChainNodes(start: SceneNode, end: SceneNode): SceneNode[] {\r\n if (!start.isParentOf(end)) {\r\n throw new Error('Invalid chain: end node must be a descendant of start node');\r\n }\r\n const nodes: SceneNode[] = [];\r\n let current: SceneNode = end;\r\n for (;;) {\r\n nodes.unshift(current);\r\n if (current === start) {\r\n break;\r\n }\r\n current = current.parent!;\r\n }\r\n return nodes;\r\n }\r\n /**\r\n * Advance the physics simulation and write the resulting transforms back to the chain nodes.\r\n *\r\n * @param deltaTime - Frame time step in seconds. Values larger than 0.033 are clamped for stability.\r\n */\r\n update(deltaTime: number): void {\r\n const dt = Math.min(deltaTime, 0.033); // Max 30 FPS\r\n this._controller.step(dt);\r\n }\r\n /** @internal */\r\n private getDefaultControllerConfig(): ControllerConfig {\r\n return {\r\n gravity: new Vector3(0, -9.8, 0),\r\n relaxation: 3,\r\n subSteps: 3,\r\n enableSurfaceCollision: false,\r\n windForce: Vector3.zero(),\r\n rootSlideLimit: -1,\r\n rootRotateLimit: -1,\r\n constraintShrinkLimit: 1,\r\n blendRatio: 0,\r\n stabilizationFrameRate: 60,\r\n isFakeWave: false,\r\n fakeWaveSpeed: 0,\r\n fakeWavePower: 0,\r\n angleLimitConfig: { angleLimit: -1, limitFromRoot: false },\r\n enableBroadPhase: false,\r\n preserveTwist: true,\r\n curves: {\r\n gravityScale: InterpolatorScalar.constant(1),\r\n windForceScale: InterpolatorScalar.constant(1),\r\n massScale: InterpolatorScalar.constant(1),\r\n resistance: InterpolatorScalar.constant(0.95),\r\n hardness: InterpolatorScalar.constant(0.001),\r\n friction: InterpolatorScalar.constant(0.5),\r\n pointRadius: InterpolatorScalar.constant(0.05),\r\n sliderJointLength: InterpolatorScalar.constant(0),\r\n allShrinkScale: InterpolatorScalar.constant(1),\r\n allStretchScale: InterpolatorScalar.constant(1),\r\n structuralShrinkVertical: InterpolatorScalar.constant(1),\r\n structuralStretchVertical: InterpolatorScalar.constant(1),\r\n structuralShrinkHorizontal: InterpolatorScalar.constant(0.5),\r\n structuralStretchHorizontal: InterpolatorScalar.constant(0.5),\r\n shearShrink: InterpolatorScalar.constant(0.5),\r\n shearStretch: InterpolatorScalar.constant(0.5),\r\n bendingShrinkVertical: InterpolatorScalar.constant(0.5),\r\n bendingStretchVertical: InterpolatorScalar.constant(0.5),\r\n bendingShrinkHorizontal: InterpolatorScalar.constant(0.5),\r\n bendingStretchHorizontal: InterpolatorScalar.constant(0.5),\r\n fakeWavePower: InterpolatorScalar.constant(0),\r\n fakeWaveFreq: InterpolatorScalar.constant(0)\r\n },\r\n constraintOptions: {\r\n structuralVertical: false,\r\n structuralHorizontal: false,\r\n shear: false,\r\n bendingVertical: false,\r\n bendingHorizontal: false,\r\n isLoop: false,\r\n collideStructuralVertical: false,\r\n collideStructuralHorizontal: false,\r\n collideShear: false,\r\n enableSurfaceCollision: false\r\n }\r\n };\r\n }\r\n}\r\n"],"names":["_quat","Quaternion","_defaultTA","createTransformAccess","SceneNode","obj","exposeNode","node","getWorldPosition","getWorldRotation","q","worldMatrix","decompose","getWorldScale","s","Vector3","getLocalPosition","position","clone","getLocalRotation","rotation","getLocalScale","scale","setWorldPosition","p","parent","invWorldMatrix","transformPointAffine","set","setWorldRotation","multiply","inverse","setLocalPosition","setLocalRotation","setLocalScale","createOffsetTransformAccess","localOffset","offset","JointDynamicsSystem","_controller","_chainConfig","_bindPose","config","colliders","grabbers","flatPlanes","systemRoot","chainConfig","chains","map","chain","start","end","startAnchor","endAnchor","startAnchorOffset","endAnchorOffset","WeakMap","rootPoints","boneNodes","boneToNode","Map","pointTransforms","pointSourceTransforms","nodeToBone","nodeToDepth","chainNodes","collectChainNodes","previous","i","length","isChainStart","isChainEnd","sourceNode","sourceOffset","boneNode","get","index","children","isFixed","depth","push","existingSource","Error","name","persistentId","includes","rootIndex","indexOf","splice","orderedBoneNodes","visitedBoneNodes","Set","orderBoneNode","has","add","child","root","pointInputTransforms","defaultConfig","getDefaultControllerConfig","controllerConfig","angleLimitConfig","curves","constraintOptions","JointDynamicsSystemController","initialize","controller","getColliderSnapshots","getFlatPlaneSnapshots","getGrabberSnapshots","resetChains","bindPose","addCollider","r","transform","addSphereCollider","radius","friction","inversed","forceType","ColliderForce","Off","height","isInverseCollider","radiusTailScale","addCapsuleCollider","setColliderEnabled","handle","enabled","removeCollider","removeColliderAt","addFlatPlane","up","setFlatPlaneEnabled","removeFlatPlane","removeFlatPlaneAt","addGrabber","setGrabberEnabled","removeGrabber","removeGrabberAt","isParentOf","nodes","current","unshift","update","deltaTime","dt","Math","min","step","gravity","relaxation","subSteps","enableSurfaceCollision","windForce","zero","rootSlideLimit","rootRotateLimit","constraintShrinkLimit","blendRatio","stabilizationFrameRate","isFakeWave","fakeWaveSpeed","fakeWavePower","angleLimit","limitFromRoot","enableBroadPhase","preserveTwist","gravityScale","InterpolatorScalar","constant","windForceScale","massScale","resistance","hardness","pointRadius","sliderJointLength","allShrinkScale","allStretchScale","structuralShrinkVertical","structuralStretchVertical","structuralShrinkHorizontal","structuralStretchHorizontal","shearShrink","shearStretch","bendingShrinkVertical","bendingStretchVertical","bendingShrinkHorizontal","bendingStretchHorizontal","fakeWaveFreq","structuralVertical","structuralHorizontal","shear","bendingVertical","bendingHorizontal","isLoop","collideStructuralVertical","collideStructuralHorizontal","collideShear"],"mappings":"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"}
@@ -1,6 +1,5 @@
1
1
  import { AnimationTrack } from './animationtrack.js';
2
2
  import { BoundingBox } from '../utility/bounding_volume.js';
3
- import { MAX_MORPH_TARGETS } from '../values.js';
4
3
  import { calculateMorphBoundingBox } from './morphtarget.js';
5
4
  import { Vector3 } from '@zephyr3d/base';
6
5
 
@@ -28,7 +27,7 @@ import { Vector3 } from '@zephyr3d/base';
28
27
  this._state = {
29
28
  numTargets: interpolator.stride,
30
29
  boundingBox: new BoundingBox(),
31
- weights: new Float32Array(MAX_MORPH_TARGETS)
30
+ weights: new Float32Array(interpolator.stride)
32
31
  };
33
32
  this._boundingBox = targetBox ?? null;
34
33
  this._originBox = originBox ?? null;
@@ -48,7 +47,7 @@ import { Vector3 } from '@zephyr3d/base';
48
47
  this._state = this._interpolator ? {
49
48
  numTargets: this._interpolator.stride,
50
49
  boundingBox: new BoundingBox(),
51
- weights: new Float32Array(MAX_MORPH_TARGETS)
50
+ weights: new Float32Array(this._interpolator.stride)
52
51
  } : null;
53
52
  }
54
53
  get boundingBox() {
@@ -75,7 +74,7 @@ import { Vector3 } from '@zephyr3d/base';
75
74
  return this._state;
76
75
  }
77
76
  /** {@inheritDoc AnimationTrack.applyState} */ applyState(node, state) {
78
- node.getMorphInfo().buffer.get().bufferSubData(4 * 4, state.weights);
77
+ node.updateMorphWeights(state.weights.subarray(0, state.numTargets));
79
78
  state.boundingBox.minPoint.addBy(this._originBox.minPoint);
80
79
  state.boundingBox.maxPoint.addBy(this._originBox.maxPoint);
81
80
  node.setAnimatedBoundingBox(state.boundingBox);
@@ -1 +1 @@
1
- {"version":3,"file":"morphtrack.js","sources":["../../src/animation/morphtrack.ts"],"sourcesContent":["import { AnimationTrack } from './animationtrack';\r\nimport type { Mesh, SceneNode } from '../scene';\r\nimport { BoundingBox } from '../utility/bounding_volume';\r\nimport { MAX_MORPH_TARGETS } from '../values';\r\nimport { calculateMorphBoundingBox } from './morphtarget';\r\nimport type { AABB, Interpolator, Nullable } from '@zephyr3d/base';\r\nimport { Vector3 } from '@zephyr3d/base';\r\n\r\n/**\r\n * Morph animation state\r\n *\r\n * @public\r\n **/\r\nexport type MorphState = {\r\n numTargets: number;\r\n weights: Float32Array<ArrayBuffer>;\r\n boundingBox: BoundingBox;\r\n};\r\n\r\n/**\r\n * Morph target track\r\n * @public\r\n */\r\nexport class MorphTargetTrack extends AnimationTrack<MorphState> {\r\n private _state: Nullable<MorphState>;\r\n private _originBox: Nullable<AABB>;\r\n private _boundingBox: Nullable<BoundingBox[]>;\r\n private _defaultWeights: Nullable<number[]>;\r\n private _interpolator: Nullable<Interpolator>;\r\n /**\r\n * Create an instance of MorphTargetTrack\r\n */\r\n constructor();\r\n /**\r\n * Create an instance of MorphTargetTrack from morph parameters\r\n */\r\n constructor(\r\n interpolator?: Interpolator,\r\n defaultMorphWeights?: number[],\r\n targetBox?: BoundingBox[],\r\n originBox?: AABB,\r\n embedded?: boolean\r\n );\r\n /**\r\n * Create an instance of MorphTargetTrack\r\n */\r\n constructor(\r\n interpolator?: Interpolator,\r\n defaultMorphWeights?: number[],\r\n targetBox?: BoundingBox[],\r\n originBox?: AABB,\r\n embedded?: boolean\r\n ) {\r\n super(embedded);\r\n if (interpolator === undefined) {\r\n this._interpolator = null;\r\n this._state = null;\r\n this._boundingBox = null;\r\n this._originBox = null;\r\n this._defaultWeights = null;\r\n } else {\r\n this._interpolator = interpolator;\r\n this._state = {\r\n numTargets: interpolator.stride,\r\n boundingBox: new BoundingBox(),\r\n weights: new Float32Array(MAX_MORPH_TARGETS)\r\n };\r\n this._boundingBox = targetBox ?? null;\r\n this._originBox = originBox ?? null;\r\n this._defaultWeights =\r\n defaultMorphWeights ?? Array.from({ length: this._state.numTargets }).map(() => 0);\r\n }\r\n }\r\n clone(): this {\r\n return new MorphTargetTrack(\r\n this._interpolator ?? undefined,\r\n this._defaultWeights?.slice(),\r\n this._boundingBox?.map((bbox) => bbox.clone()) ?? undefined,\r\n this._originBox?.clone() ?? undefined,\r\n false\r\n ) as this;\r\n }\r\n get interpolator() {\r\n return this._interpolator;\r\n }\r\n set interpolator(interp: Nullable<Interpolator>) {\r\n this._interpolator = interp ?? null;\r\n this._state = this._interpolator\r\n ? {\r\n numTargets: this._interpolator.stride,\r\n boundingBox: new BoundingBox(),\r\n weights: new Float32Array(MAX_MORPH_TARGETS)\r\n }\r\n : null;\r\n }\r\n get boundingBox() {\r\n return this._boundingBox;\r\n }\r\n set boundingBox(box: Nullable<BoundingBox[]>) {\r\n this._boundingBox = box;\r\n }\r\n get defaultWeights() {\r\n return this._defaultWeights;\r\n }\r\n set defaultWeights(value: Nullable<number[]>) {\r\n this._defaultWeights = value;\r\n }\r\n get originBoundingBox() {\r\n return this._originBox;\r\n }\r\n set originBoundingBox(box: Nullable<AABB>) {\r\n this._originBox = box;\r\n }\r\n /** {@inheritDoc AnimationTrack.calculateState} */\r\n\r\n calculateState(target: object, currentTime: number) {\r\n this._interpolator!.interpolate(currentTime, this._state!.weights);\r\n calculateMorphBoundingBox(\r\n this._state!.boundingBox,\r\n this._boundingBox!,\r\n this._state!.weights,\r\n this._state!.numTargets\r\n );\r\n return this._state!;\r\n }\r\n /** {@inheritDoc AnimationTrack.applyState} */\r\n applyState(node: SceneNode, state: MorphState) {\r\n (node as Mesh)\r\n .getMorphInfo()!\r\n .buffer!.get()!\r\n .bufferSubData(4 * 4, state.weights);\r\n state.boundingBox.minPoint.addBy(this._originBox!.minPoint);\r\n state.boundingBox.maxPoint.addBy(this._originBox!.maxPoint);\r\n (node as Mesh).setAnimatedBoundingBox(state.boundingBox);\r\n }\r\n /** {@inheritDoc AnimationTrack.mixState} */\r\n mixState(a: MorphState, b: MorphState, t: number) {\r\n const state: MorphState = {\r\n weights: new Float32Array(a.numTargets),\r\n boundingBox: new BoundingBox(),\r\n numTargets: a.numTargets\r\n };\r\n for (let i = 0; i < a.numTargets; i++) {\r\n state.weights[i] = a.weights[i] + (b.weights[i] - a.weights[i]) * t;\r\n state.boundingBox.minPoint = Vector3.min(a.boundingBox.minPoint, b.boundingBox.minPoint);\r\n state.boundingBox.maxPoint = Vector3.max(a.boundingBox.maxPoint, b.boundingBox.maxPoint);\r\n }\r\n return state;\r\n }\r\n /** {@inheritDoc AnimationTrack.getBlendId} */\r\n getBlendId() {\r\n return 'node-morph';\r\n }\r\n /** {@inheritDoc AnimationTrack.getDuration} */\r\n getDuration() {\r\n return this._interpolator?.maxTime ?? 0;\r\n }\r\n /** {@inheritDoc AnimationTrack.reset} */\r\n reset(node: SceneNode) {\r\n // apply default weights\r\n this._state!.weights.set(this._defaultWeights!);\r\n this.applyState(node, this._state!);\r\n }\r\n}\r\n"],"names":["MorphTargetTrack","AnimationTrack","_state","_originBox","_boundingBox","_defaultWeights","_interpolator","interpolator","defaultMorphWeights","targetBox","originBox","embedded","undefined","numTargets","stride","boundingBox","BoundingBox","weights","Float32Array","MAX_MORPH_TARGETS","Array","from","length","map","clone","slice","bbox","interp","box","defaultWeights","value","originBoundingBox","calculateState","target","currentTime","interpolate","calculateMorphBoundingBox","applyState","node","state","getMorphInfo","buffer","get","bufferSubData","minPoint","addBy","maxPoint","setAnimatedBoundingBox","mixState","a","b","t","i","Vector3","min","max","getBlendId","getDuration","maxTime","reset","set"],"mappings":"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"}
1
+ {"version":3,"file":"morphtrack.js","sources":["../../src/animation/morphtrack.ts"],"sourcesContent":["import { AnimationTrack } from './animationtrack';\r\nimport type { Mesh, SceneNode } from '../scene';\r\nimport { BoundingBox } from '../utility/bounding_volume';\r\nimport { calculateMorphBoundingBox } from './morphtarget';\r\nimport type { AABB, Interpolator, Nullable } from '@zephyr3d/base';\r\nimport { Vector3 } from '@zephyr3d/base';\r\n\r\n/**\r\n * Morph animation state\r\n *\r\n * @public\r\n **/\r\nexport type MorphState = {\r\n numTargets: number;\r\n weights: Float32Array<ArrayBuffer>;\r\n boundingBox: BoundingBox;\r\n};\r\n\r\n/**\r\n * Morph target track\r\n * @public\r\n */\r\nexport class MorphTargetTrack extends AnimationTrack<MorphState> {\r\n private _state: Nullable<MorphState>;\r\n private _originBox: Nullable<AABB>;\r\n private _boundingBox: Nullable<BoundingBox[]>;\r\n private _defaultWeights: Nullable<number[]>;\r\n private _interpolator: Nullable<Interpolator>;\r\n /**\r\n * Create an instance of MorphTargetTrack\r\n */\r\n constructor();\r\n /**\r\n * Create an instance of MorphTargetTrack from morph parameters\r\n */\r\n constructor(\r\n interpolator?: Interpolator,\r\n defaultMorphWeights?: number[],\r\n targetBox?: BoundingBox[],\r\n originBox?: AABB,\r\n embedded?: boolean\r\n );\r\n /**\r\n * Create an instance of MorphTargetTrack\r\n */\r\n constructor(\r\n interpolator?: Interpolator,\r\n defaultMorphWeights?: number[],\r\n targetBox?: BoundingBox[],\r\n originBox?: AABB,\r\n embedded?: boolean\r\n ) {\r\n super(embedded);\r\n if (interpolator === undefined) {\r\n this._interpolator = null;\r\n this._state = null;\r\n this._boundingBox = null;\r\n this._originBox = null;\r\n this._defaultWeights = null;\r\n } else {\r\n this._interpolator = interpolator;\r\n this._state = {\r\n numTargets: interpolator.stride,\r\n boundingBox: new BoundingBox(),\r\n weights: new Float32Array(interpolator.stride)\r\n };\r\n this._boundingBox = targetBox ?? null;\r\n this._originBox = originBox ?? null;\r\n this._defaultWeights =\r\n defaultMorphWeights ?? Array.from({ length: this._state.numTargets }).map(() => 0);\r\n }\r\n }\r\n clone(): this {\r\n return new MorphTargetTrack(\r\n this._interpolator ?? undefined,\r\n this._defaultWeights?.slice(),\r\n this._boundingBox?.map((bbox) => bbox.clone()) ?? undefined,\r\n this._originBox?.clone() ?? undefined,\r\n false\r\n ) as this;\r\n }\r\n get interpolator() {\r\n return this._interpolator;\r\n }\r\n set interpolator(interp: Nullable<Interpolator>) {\r\n this._interpolator = interp ?? null;\r\n this._state = this._interpolator\r\n ? {\r\n numTargets: this._interpolator.stride,\r\n boundingBox: new BoundingBox(),\r\n weights: new Float32Array(this._interpolator.stride)\r\n }\r\n : null;\r\n }\r\n get boundingBox() {\r\n return this._boundingBox;\r\n }\r\n set boundingBox(box: Nullable<BoundingBox[]>) {\r\n this._boundingBox = box;\r\n }\r\n get defaultWeights() {\r\n return this._defaultWeights;\r\n }\r\n set defaultWeights(value: Nullable<number[]>) {\r\n this._defaultWeights = value;\r\n }\r\n get originBoundingBox() {\r\n return this._originBox;\r\n }\r\n set originBoundingBox(box: Nullable<AABB>) {\r\n this._originBox = box;\r\n }\r\n /** {@inheritDoc AnimationTrack.calculateState} */\r\n\r\n calculateState(target: object, currentTime: number) {\r\n this._interpolator!.interpolate(currentTime, this._state!.weights);\r\n calculateMorphBoundingBox(\r\n this._state!.boundingBox,\r\n this._boundingBox!,\r\n this._state!.weights,\r\n this._state!.numTargets\r\n );\r\n return this._state!;\r\n }\r\n /** {@inheritDoc AnimationTrack.applyState} */\r\n applyState(node: SceneNode, state: MorphState) {\r\n (node as Mesh).updateMorphWeights(state.weights.subarray(0, state.numTargets));\r\n state.boundingBox.minPoint.addBy(this._originBox!.minPoint);\r\n state.boundingBox.maxPoint.addBy(this._originBox!.maxPoint);\r\n (node as Mesh).setAnimatedBoundingBox(state.boundingBox);\r\n }\r\n /** {@inheritDoc AnimationTrack.mixState} */\r\n mixState(a: MorphState, b: MorphState, t: number) {\r\n const state: MorphState = {\r\n weights: new Float32Array(a.numTargets),\r\n boundingBox: new BoundingBox(),\r\n numTargets: a.numTargets\r\n };\r\n for (let i = 0; i < a.numTargets; i++) {\r\n state.weights[i] = a.weights[i] + (b.weights[i] - a.weights[i]) * t;\r\n state.boundingBox.minPoint = Vector3.min(a.boundingBox.minPoint, b.boundingBox.minPoint);\r\n state.boundingBox.maxPoint = Vector3.max(a.boundingBox.maxPoint, b.boundingBox.maxPoint);\r\n }\r\n return state;\r\n }\r\n /** {@inheritDoc AnimationTrack.getBlendId} */\r\n getBlendId() {\r\n return 'node-morph';\r\n }\r\n /** {@inheritDoc AnimationTrack.getDuration} */\r\n getDuration() {\r\n return this._interpolator?.maxTime ?? 0;\r\n }\r\n /** {@inheritDoc AnimationTrack.reset} */\r\n reset(node: SceneNode) {\r\n // apply default weights\r\n this._state!.weights.set(this._defaultWeights!);\r\n this.applyState(node, this._state!);\r\n }\r\n}\r\n"],"names":["MorphTargetTrack","AnimationTrack","_state","_originBox","_boundingBox","_defaultWeights","_interpolator","interpolator","defaultMorphWeights","targetBox","originBox","embedded","undefined","numTargets","stride","boundingBox","BoundingBox","weights","Float32Array","Array","from","length","map","clone","slice","bbox","interp","box","defaultWeights","value","originBoundingBox","calculateState","target","currentTime","interpolate","calculateMorphBoundingBox","applyState","node","state","updateMorphWeights","subarray","minPoint","addBy","maxPoint","setAnimatedBoundingBox","mixState","a","b","t","i","Vector3","min","max","getBlendId","getDuration","maxTime","reset","set"],"mappings":"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"}
@@ -59,8 +59,11 @@ import { getDevice } from '../app/api.js';
59
59
  }({});
60
60
  const tmpV0 = new Vector3();
61
61
  const tmpV1 = new Vector3();
62
- const tmpV2 = new Vector3();
63
- const tmpV3 = new Vector3();
62
+ const humanoidHelperJointTokens = new Set([
63
+ 'end',
64
+ 'nub',
65
+ 'socket'
66
+ ]);
64
67
  /**
65
68
  * Shared joint rig for skeletal animation.
66
69
  *
@@ -75,6 +78,8 @@ const tmpV3 = new Vector3();
75
78
  _joints;
76
79
  _bindPoseByJoint;
77
80
  _bindPose;
81
+ _retargetPoseByJoint;
82
+ _retargetPose;
78
83
  _rootJoint;
79
84
  _rootBindPose;
80
85
  _playing;
@@ -90,6 +95,14 @@ const tmpV3 = new Vector3();
90
95
  for(let i = 0; i < joints.length; i++){
91
96
  this._bindPoseByJoint.set(joints[i], bindPose[i]);
92
97
  }
98
+ if (options?.retargetPose && options.retargetPose.length !== joints.length) {
99
+ throw new Error('SkeletonRig(): retarget pose must contain one transform per joint');
100
+ }
101
+ this._retargetPose = options?.retargetPose ?? null;
102
+ this._retargetPoseByJoint = this._retargetPose ? new Map(joints.map((joint, index)=>[
103
+ joint,
104
+ this._retargetPose[index]
105
+ ])) : null;
93
106
  const skeletonRoot = this.findRootJoint(this._joints);
94
107
  this._rootJoint = options?.rootJoint ?? skeletonRoot;
95
108
  this._rootBindPose = options?.rootBindPose ?? this.getNodeBindPose(this._rootJoint);
@@ -142,6 +155,12 @@ const tmpV3 = new Vector3();
142
155
  get bindPose() {
143
156
  return this._bindPose;
144
157
  }
158
+ /** Effective humanoid retarget reference pose. */ get retargetPose() {
159
+ return this._retargetPose ?? this._bindPose;
160
+ }
161
+ /** Whether this rig has a reference pose that is distinct from its bind pose. */ get hasRetargetPose() {
162
+ return !!this._retargetPose;
163
+ }
145
164
  get rootJoint() {
146
165
  return this._rootJoint;
147
166
  }
@@ -155,6 +174,9 @@ const tmpV3 = new Vector3();
155
174
  getBindPoseForJoint(joint) {
156
175
  return this._bindPoseByJoint.get(joint) ?? null;
157
176
  }
177
+ getRetargetPoseForJoint(joint) {
178
+ return this._retargetPoseByJoint?.get(joint) ?? this.getBindPoseForJoint(joint);
179
+ }
158
180
  get humanoidJointMapping() {
159
181
  return this._humanoidJointMapping;
160
182
  }
@@ -318,7 +340,8 @@ function sideJointPatterns(side, patterns) {
318
340
  this._rig = new SkeletonRig(rig.joints, bindPose, {
319
341
  rootJoint: rig.rootJoint,
320
342
  rootBindPose: rig.rootBindPose,
321
- humanoidJointMapping: rig.humanoidJointMapping
343
+ humanoidJointMapping: rig.humanoidJointMapping,
344
+ retargetPose: rig.hasRetargetPose ? rig.retargetPose : null
322
345
  });
323
346
  }
324
347
  this.updateJointMatrices();
@@ -486,12 +509,22 @@ function sideJointPatterns(side, patterns) {
486
509
  * @internal
487
510
  */ computeBoundingBox(info, invWorldMatrix) {
488
511
  info.boundingBox.beginExtend();
512
+ const influenceCount = Math.max(1, info.influenceCount ?? 4);
489
513
  for(let i = 0; i < info.boundingVertices.length; i++){
490
- this._jointMatrices[info.boundingVertexBlendIndices[i * 4 + 0] + this._jointOffsets[0] - 1].transformPointAffine(info.boundingVertices[i], tmpV0).scaleBy(info.boundingVertexJointWeights[i * 4 + 0]);
491
- this._jointMatrices[info.boundingVertexBlendIndices[i * 4 + 1] + this._jointOffsets[0] - 1].transformPointAffine(info.boundingVertices[i], tmpV1).scaleBy(info.boundingVertexJointWeights[i * 4 + 1]);
492
- this._jointMatrices[info.boundingVertexBlendIndices[i * 4 + 2] + this._jointOffsets[0] - 1].transformPointAffine(info.boundingVertices[i], tmpV2).scaleBy(info.boundingVertexJointWeights[i * 4 + 2]);
493
- this._jointMatrices[info.boundingVertexBlendIndices[i * 4 + 3] + this._jointOffsets[0] - 1].transformPointAffine(info.boundingVertices[i], tmpV3).scaleBy(info.boundingVertexJointWeights[i * 4 + 3]);
494
- tmpV0.addBy(tmpV1).addBy(tmpV2).addBy(tmpV3);
514
+ tmpV0.setXYZ(0, 0, 0);
515
+ const base = i * influenceCount;
516
+ for(let j = 0; j < influenceCount; j++){
517
+ const weight = Number(info.boundingVertexJointWeights[base + j]) || 0;
518
+ if (weight <= 0) {
519
+ continue;
520
+ }
521
+ const matrix = this._jointMatrices[(Number(info.boundingVertexBlendIndices[base + j]) || 0) + this._jointOffsets[0] - 1];
522
+ if (!matrix) {
523
+ continue;
524
+ }
525
+ matrix.transformPointAffine(info.boundingVertices[i], tmpV1).scaleBy(weight);
526
+ tmpV0.addBy(tmpV1);
527
+ }
495
528
  invWorldMatrix.transformPointAffine(tmpV0, tmpV0);
496
529
  info.boundingBox.extend(tmpV0);
497
530
  }
@@ -576,16 +609,24 @@ function sideJointPatterns(side, patterns) {
576
609
  const vert = new Vector3();
577
610
  const tmpV0 = new Vector3();
578
611
  const tmpV1 = new Vector3();
579
- const tmpV2 = new Vector3();
580
- const tmpV3 = new Vector3();
581
612
  const numVertices = Math.floor(v.length / 3);
613
+ const influenceCount = Math.max(1, data.influenceCount ?? 4);
582
614
  for(let i = 0; i < numVertices; i++){
583
615
  vert.setXYZ(v[i * 3], v[i * 3 + 1], v[i * 3 + 2]);
584
- this._jointMatrices[data.blendIndices[i * 4 + 0] + this._jointOffsets[0] - 1].transformPointAffine(vert, tmpV0).scaleBy(data.weights[i * 4 + 0]);
585
- this._jointMatrices[data.blendIndices[i * 4 + 1] + this._jointOffsets[0] - 1].transformPointAffine(vert, tmpV1).scaleBy(data.weights[i * 4 + 1]);
586
- this._jointMatrices[data.blendIndices[i * 4 + 2] + this._jointOffsets[0] - 1].transformPointAffine(vert, tmpV2).scaleBy(data.weights[i * 4 + 2]);
587
- this._jointMatrices[data.blendIndices[i * 4 + 3] + this._jointOffsets[0] - 1].transformPointAffine(vert, tmpV3).scaleBy(data.weights[i * 4 + 3]);
588
- tmpV0.addBy(tmpV1).addBy(tmpV2).addBy(tmpV3);
616
+ tmpV0.setXYZ(0, 0, 0);
617
+ const base = i * influenceCount;
618
+ for(let j = 0; j < influenceCount; j++){
619
+ const weight = Number(data.weights[base + j]) || 0;
620
+ if (weight <= 0) {
621
+ continue;
622
+ }
623
+ const matrix = this._jointMatrices[(Number(data.blendIndices[base + j]) || 0) + this._jointOffsets[0] - 1];
624
+ if (!matrix) {
625
+ continue;
626
+ }
627
+ matrix.transformPointAffine(vert, tmpV1).scaleBy(weight);
628
+ tmpV0.addBy(tmpV1);
629
+ }
589
630
  if (tmpV0.x < minx) {
590
631
  minx = tmpV0.x;
591
632
  indices[0] = i;
@@ -612,12 +653,13 @@ function sideJointPatterns(side, patterns) {
612
653
  }
613
654
  }
614
655
  const info = {
656
+ influenceCount,
615
657
  boundingVertexBlendIndices: new Float32Array(Array.from({
616
- length: 6 * 4
617
- }).map((val, index)=>data.blendIndices[indices[index >> 2] * 4 + index % 4])),
658
+ length: 6 * influenceCount
659
+ }).map((val, index)=>data.blendIndices[indices[Math.floor(index / influenceCount)] * influenceCount + index % influenceCount])),
618
660
  boundingVertexJointWeights: new Float32Array(Array.from({
619
- length: 6 * 4
620
- }).map((val, index)=>data.weights[indices[index >> 2] * 4 + index % 4])),
661
+ length: 6 * influenceCount
662
+ }).map((val, index)=>data.weights[indices[Math.floor(index / influenceCount)] * influenceCount + index % influenceCount])),
621
663
  boundingVertices: Array.from({
622
664
  length: 6
623
665
  }).map((val, index)=>new Vector3(data.positions[indices[index] * 3], data.positions[indices[index] * 3 + 1], data.positions[indices[index] * 3 + 2])),
@@ -638,9 +680,10 @@ function sideJointPatterns(side, patterns) {
638
680
  * @param out - Optional output array to reuse.
639
681
  * @returns The skinned mesh-local positions.
640
682
  * @internal
641
- */ skinPositionsToLocal(positions, blendIndices, weights, invWorldMatrix, out) {
683
+ */ skinPositionsToLocal(positions, blendIndices, weights, invWorldMatrix, out, influenceCount) {
642
684
  const result = out && out.length === positions.length ? out : new Float32Array(positions.length);
643
685
  const matrixOffset = this._jointOffsets[0] - 1;
686
+ const effectiveInfluenceCount = Math.max(1, influenceCount ?? Math.max(1, Math.floor(weights.length / Math.max(1, Math.floor(positions.length / 3)))));
644
687
  for(let i = 0; i + 2 < positions.length; i += 3){
645
688
  const vertexIndex = i / 3 >> 0;
646
689
  const x = positions[i];
@@ -650,12 +693,13 @@ function sideJointPatterns(side, patterns) {
650
693
  let skinnedY = 0;
651
694
  let skinnedZ = 0;
652
695
  let weightSum = 0;
653
- for(let j = 0; j < 4; j++){
654
- const weight = Number(weights[vertexIndex * 4 + j]) || 0;
696
+ const base = vertexIndex * effectiveInfluenceCount;
697
+ for(let j = 0; j < effectiveInfluenceCount; j++){
698
+ const weight = Number(weights[base + j]) || 0;
655
699
  if (weight <= 0) {
656
700
  continue;
657
701
  }
658
- const jointIndex = (Number(blendIndices[vertexIndex * 4 + j]) || 0) + matrixOffset;
702
+ const jointIndex = (Number(blendIndices[base + j]) || 0) + matrixOffset;
659
703
  const matrix = this._jointMatrices[jointIndex];
660
704
  if (!matrix) {
661
705
  continue;
@@ -677,7 +721,7 @@ function sideJointPatterns(side, patterns) {
677
721
  return result;
678
722
  }
679
723
  static normalizeHumanoidJointName(name) {
680
- return name.replace(/([A-Z]+)([A-Z][a-z])/g, '$1 $2').replace(/([a-z0-9])([A-Z])/g, '$1 $2').replace(/([a-zA-Z])(\d+)/g, '$1 $2').replace(/(\d+)([a-zA-Z])/g, '$1 $2').replace(/[_:\/\\.-]+/g, ' ').replace(/[^a-zA-Z0-9]+/g, ' ').toLowerCase().replace(/\bforearm\b/g, 'fore arm').replace(/\bupperarm\b/g, 'upper arm').replace(/\blowerarm\b/g, 'lower arm').replace(/\bupleg\b/g, 'up leg').replace(/\bupperleg\b/g, 'upper leg').replace(/\blowerleg\b/g, 'lower leg').replace(/\btoebase\b/g, 'toe base').replace(/\bupperchest\b/g, 'upper chest').replace(/\btoes\b/g, 'toe').replace(/\blittle\b/g, 'pinky').replace(/\bcollar\b/g, 'clavicle').replace(/\s+/g, ' ').trim();
724
+ return name.slice(name.lastIndexOf(':') + 1).replace(/([A-Z]+)([A-Z][a-z])/g, '$1 $2').replace(/([a-z0-9])([A-Z])/g, '$1 $2').replace(/([a-zA-Z])(\d+)/g, '$1 $2').replace(/(\d+)([a-zA-Z])/g, '$1 $2').replace(/[_:\/\\.-]+/g, ' ').replace(/[^a-zA-Z0-9]+/g, ' ').toLowerCase().replace(/\bforearm\b/g, 'fore arm').replace(/\bupperarm\b/g, 'upper arm').replace(/\blowerarm\b/g, 'lower arm').replace(/\bupleg\b/g, 'up leg').replace(/\bupperleg\b/g, 'upper leg').replace(/\blowerleg\b/g, 'lower leg').replace(/\btoebase\b/g, 'toe base').replace(/\bupperchest\b/g, 'upper chest').replace(/\btoes\b/g, 'toe').replace(/\blittle\b/g, 'pinky').replace(/\bcollar\b/g, 'clavicle').replace(/\s+/g, ' ').trim();
681
725
  }
682
726
  static getHumanoidJointNodeDepth(root, node) {
683
727
  let depth = 0;
@@ -696,7 +740,7 @@ function sideJointPatterns(side, patterns) {
696
740
  return false;
697
741
  }
698
742
  const tokens = normalizedName.split(' ').filter(Boolean);
699
- if (!tokens.length) {
743
+ if (!tokens.length || tokens.some((token)=>humanoidHelperJointTokens.has(token))) {
700
744
  return false;
701
745
  }
702
746
  nodes.push({
@@ -2267,6 +2311,11 @@ function sideJointPatterns(side, patterns) {
2267
2311
  none: [
2268
2312
  'end'
2269
2313
  ]
2314
+ },
2315
+ {
2316
+ all: [
2317
+ 'ball'
2318
+ ]
2270
2319
  }
2271
2320
  ]),
2272
2321
  ["RightUpperLeg"]: sideJointPatterns('right', [
@@ -2337,6 +2386,11 @@ function sideJointPatterns(side, patterns) {
2337
2386
  none: [
2338
2387
  'end'
2339
2388
  ]
2389
+ },
2390
+ {
2391
+ all: [
2392
+ 'ball'
2393
+ ]
2340
2394
  }
2341
2395
  ])
2342
2396
  };