@zephyr3d/scene 0.9.6 → 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 (203) 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 +1349 -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/mtoon.js +574 -0
  57. package/dist/material/mtoon.js.map +1 -0
  58. package/dist/material/pbrblueprint.js +499 -336
  59. package/dist/material/pbrblueprint.js.map +1 -1
  60. package/dist/material/pbrmr.js +118 -100
  61. package/dist/material/pbrmr.js.map +1 -1
  62. package/dist/material/pbrsg.js +1 -1
  63. package/dist/material/pbrsg.js.map +1 -1
  64. package/dist/material/shader/helper.js +324 -294
  65. package/dist/material/shader/helper.js.map +1 -1
  66. package/dist/material/subsurfaceprofile.js +812 -0
  67. package/dist/material/subsurfaceprofile.js.map +1 -0
  68. package/dist/material/unlit.js +1 -1
  69. package/dist/material/unlit.js.map +1 -1
  70. package/dist/posteffect/compositor.js +46 -11
  71. package/dist/posteffect/compositor.js.map +1 -1
  72. package/dist/posteffect/ssr.js +422 -96
  73. package/dist/posteffect/ssr.js.map +1 -1
  74. package/dist/posteffect/sss.js +1053 -0
  75. package/dist/posteffect/sss.js.map +1 -0
  76. package/dist/posteffect/taa.js +61 -60
  77. package/dist/posteffect/taa.js.map +1 -1
  78. package/dist/render/abuffer_oit.js +63 -12
  79. package/dist/render/abuffer_oit.js.map +1 -1
  80. package/dist/render/cluster_light.js +6 -5
  81. package/dist/render/cluster_light.js.map +1 -1
  82. package/dist/render/drawable.js +1 -5
  83. package/dist/render/drawable.js.map +1 -1
  84. package/dist/render/drawable_mixin.js +2 -1
  85. package/dist/render/drawable_mixin.js.map +1 -1
  86. package/dist/render/fbm_wavegenerator.js +2 -1
  87. package/dist/render/fbm_wavegenerator.js.map +1 -1
  88. package/dist/render/gerstner_wavegenerator.js +2 -1
  89. package/dist/render/gerstner_wavegenerator.js.map +1 -1
  90. package/dist/render/globalbindgroup_allocator.js +2 -1
  91. package/dist/render/globalbindgroup_allocator.js.map +1 -1
  92. package/dist/render/lightpass.js +110 -23
  93. package/dist/render/lightpass.js.map +1 -1
  94. package/dist/render/render_queue.js +51 -8
  95. package/dist/render/render_queue.js.map +1 -1
  96. package/dist/render/renderer.js +80 -66
  97. package/dist/render/renderer.js.map +1 -1
  98. package/dist/render/rendergraph/device_pool_allocator.js +8 -0
  99. package/dist/render/rendergraph/device_pool_allocator.js.map +1 -1
  100. package/dist/render/rendergraph/forward_plus_builder.js +481 -95
  101. package/dist/render/rendergraph/forward_plus_builder.js.map +1 -1
  102. package/dist/render/rendergraph/history_resource_manager.js +55 -0
  103. package/dist/render/rendergraph/history_resource_manager.js.map +1 -1
  104. package/dist/render/rendergraph/history_resources.js +3 -1
  105. package/dist/render/rendergraph/history_resources.js.map +1 -1
  106. package/dist/render/rendergraph/types.js.map +1 -1
  107. package/dist/render/renderpass.js +10 -4
  108. package/dist/render/renderpass.js.map +1 -1
  109. package/dist/render/sky.js +31 -1
  110. package/dist/render/sky.js.map +1 -1
  111. package/dist/render/weightedblended_oit.js +23 -5
  112. package/dist/render/weightedblended_oit.js.map +1 -1
  113. package/dist/scene/basesprite.js +4 -2
  114. package/dist/scene/basesprite.js.map +1 -1
  115. package/dist/scene/batchgroup.js +3 -1
  116. package/dist/scene/batchgroup.js.map +1 -1
  117. package/dist/scene/environment.js +11 -1
  118. package/dist/scene/environment.js.map +1 -1
  119. package/dist/scene/light.js +21 -3
  120. package/dist/scene/light.js.map +1 -1
  121. package/dist/scene/mesh.js +29 -14
  122. package/dist/scene/mesh.js.map +1 -1
  123. package/dist/scene/meshdrawable.js +6 -0
  124. package/dist/scene/meshdrawable.js.map +1 -1
  125. package/dist/scene/msdftext.js +5 -2
  126. package/dist/scene/msdftext.js.map +1 -1
  127. package/dist/scene/msdftextsprite.js +5 -3
  128. package/dist/scene/msdftextsprite.js.map +1 -1
  129. package/dist/scene/particlesys.js +3 -1
  130. package/dist/scene/particlesys.js.map +1 -1
  131. package/dist/scene/scene.js +6 -5
  132. package/dist/scene/scene.js.map +1 -1
  133. package/dist/scene/terrain-cm/grass.js +4 -2
  134. package/dist/scene/terrain-cm/grass.js.map +1 -1
  135. package/dist/scene/terrain-cm/grassmaterial.js +2 -1
  136. package/dist/scene/terrain-cm/grassmaterial.js.map +1 -1
  137. package/dist/scene/terrain-cm/terrain-cm.js +4 -2
  138. package/dist/scene/terrain-cm/terrain-cm.js.map +1 -1
  139. package/dist/scene/water.js +4 -2
  140. package/dist/scene/water.js.map +1 -1
  141. package/dist/shaders/shadow.js +26 -393
  142. package/dist/shaders/shadow.js.map +1 -1
  143. package/dist/shadow/esm.js +112 -12
  144. package/dist/shadow/esm.js.map +1 -1
  145. package/dist/shadow/pcf_opt.js +2 -2
  146. package/dist/shadow/pcf_opt.js.map +1 -1
  147. package/dist/shadow/pcf_pd.js +19 -10
  148. package/dist/shadow/pcf_pd.js.map +1 -1
  149. package/dist/shadow/shader.js +58 -7
  150. package/dist/shadow/shader.js.map +1 -1
  151. package/dist/shadow/shadow_impl.js +6 -0
  152. package/dist/shadow/shadow_impl.js.map +1 -1
  153. package/dist/shadow/shadow_region.js +229 -0
  154. package/dist/shadow/shadow_region.js.map +1 -0
  155. package/dist/shadow/shadowmapper.js +67 -59
  156. package/dist/shadow/shadowmapper.js.map +1 -1
  157. package/dist/shadow/vsm.js +45 -19
  158. package/dist/shadow/vsm.js.map +1 -1
  159. package/dist/utility/blueprint/common/constants.js +8 -8
  160. package/dist/utility/blueprint/common/constants.js.map +1 -1
  161. package/dist/utility/blueprint/material/pbr.js +31 -4
  162. package/dist/utility/blueprint/material/pbr.js.map +1 -1
  163. package/dist/utility/blueprint/material/texture.js +1 -17
  164. package/dist/utility/blueprint/material/texture.js.map +1 -1
  165. package/dist/utility/serialization/manager.js +327 -359
  166. package/dist/utility/serialization/manager.js.map +1 -1
  167. package/dist/utility/serialization/scene/animation.js +5 -2
  168. package/dist/utility/serialization/scene/animation.js.map +1 -1
  169. package/dist/utility/serialization/scene/batch.js +4 -1
  170. package/dist/utility/serialization/scene/batch.js.map +1 -1
  171. package/dist/utility/serialization/scene/camera.js +249 -54
  172. package/dist/utility/serialization/scene/camera.js.map +1 -1
  173. package/dist/utility/serialization/scene/common.js +37 -1
  174. package/dist/utility/serialization/scene/common.js.map +1 -1
  175. package/dist/utility/serialization/scene/light.js +42 -3
  176. package/dist/utility/serialization/scene/light.js.map +1 -1
  177. package/dist/utility/serialization/scene/material.js +1112 -646
  178. package/dist/utility/serialization/scene/material.js.map +1 -1
  179. package/dist/utility/serialization/scene/mesh.js +7 -4
  180. package/dist/utility/serialization/scene/mesh.js.map +1 -1
  181. package/dist/utility/serialization/scene/node.js +31 -12
  182. package/dist/utility/serialization/scene/node.js.map +1 -1
  183. package/dist/utility/serialization/scene/particle.js +4 -1
  184. package/dist/utility/serialization/scene/particle.js.map +1 -1
  185. package/dist/utility/serialization/scene/primitive.js +3 -1
  186. package/dist/utility/serialization/scene/primitive.js.map +1 -1
  187. package/dist/utility/serialization/scene/scene.js +18 -0
  188. package/dist/utility/serialization/scene/scene.js.map +1 -1
  189. package/dist/utility/serialization/scene/sprite.js +6 -3
  190. package/dist/utility/serialization/scene/sprite.js.map +1 -1
  191. package/dist/utility/serialization/scene/terrain.js +5 -2
  192. package/dist/utility/serialization/scene/terrain.js.map +1 -1
  193. package/dist/utility/serialization/scene/text.js +3 -1
  194. package/dist/utility/serialization/scene/text.js.map +1 -1
  195. package/dist/utility/serialization/scene/water.js +4 -1
  196. package/dist/utility/serialization/scene/water.js.map +1 -1
  197. package/dist/utility/textures/ltcdata.js +6 -0
  198. package/dist/utility/textures/ltcdata.js.map +1 -0
  199. package/dist/utility/textures/ltclut.js +61 -0
  200. package/dist/utility/textures/ltclut.js.map +1 -0
  201. package/dist/values.js +9 -1
  202. package/dist/values.js.map +1 -1
  203. package/package.json +3 -3
@@ -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();