@zephyr3d/scene 0.9.0 → 0.9.2
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.
- package/dist/animation/animationset.js +135 -133
- package/dist/animation/animationset.js.map +1 -1
- package/dist/animation/cloth/gpu_cloth_system.js +9 -1
- package/dist/animation/cloth/gpu_cloth_system.js.map +1 -1
- package/dist/animation/fixed_geometry_cache_track.js +5 -1
- package/dist/animation/fixed_geometry_cache_track.js.map +1 -1
- package/dist/animation/geometry_cache_utils.js +20 -4
- package/dist/animation/geometry_cache_utils.js.map +1 -1
- package/dist/animation/ik/ik_angle_constraint.js +2 -6
- package/dist/animation/ik/ik_angle_constraint.js.map +1 -1
- package/dist/animation/ik/two_bone_ik_solver.js +2 -6
- package/dist/animation/ik/two_bone_ik_solver.js.map +1 -1
- package/dist/animation/joint_dynamics/collision.js +60 -12
- package/dist/animation/joint_dynamics/collision.js.map +1 -1
- package/dist/animation/joint_dynamics/constraints.js +20 -4
- package/dist/animation/joint_dynamics/constraints.js.map +1 -1
- package/dist/animation/joint_dynamics/controller.js +151 -103
- package/dist/animation/joint_dynamics/controller.js.map +1 -1
- package/dist/animation/joint_dynamics/solver.js +21 -11
- package/dist/animation/joint_dynamics/solver.js.map +1 -1
- package/dist/animation/joint_dynamics/types.js +15 -3
- package/dist/animation/joint_dynamics/types.js.map +1 -1
- package/dist/animation/pca_geometry_cache_track.js +5 -1
- package/dist/animation/pca_geometry_cache_track.js.map +1 -1
- package/dist/animation/skeleton.js +2 -2
- package/dist/animation/skeleton.js.map +1 -1
- package/dist/animation/skeleton_modifier.js +2 -6
- package/dist/animation/skeleton_modifier.js.map +1 -1
- package/dist/animation/spring/spring_system.js +87 -114
- package/dist/animation/spring/spring_system.js.map +1 -1
- package/dist/app/app.js.map +1 -1
- package/dist/app/engine.js +1 -1
- package/dist/app/engine.js.map +1 -1
- package/dist/app/screen.js +4 -4
- package/dist/app/screen.js.map +1 -1
- package/dist/app/scriptingsystem.js +24 -1
- package/dist/app/scriptingsystem.js.map +1 -1
- package/dist/app/scriptregistry.js +165 -144
- package/dist/app/scriptregistry.js.map +1 -1
- package/dist/asset/assetmanager.js +2 -2
- package/dist/asset/assetmanager.js.map +1 -1
- package/dist/asset/model.js +3 -3
- package/dist/asset/model.js.map +1 -1
- package/dist/camera/camera.js +185 -185
- package/dist/camera/camera.js.map +1 -1
- package/dist/camera/orbit.js.map +1 -1
- package/dist/index.d.ts +794 -261
- package/dist/index.js +2 -1
- package/dist/index.js.map +1 -1
- package/dist/material/material.js +290 -288
- package/dist/material/material.js.map +1 -1
- package/dist/material/mixins/lightmodel/pbrmetallicroughness.js +13 -26
- package/dist/material/mixins/lightmodel/pbrmetallicroughness.js.map +1 -1
- package/dist/material/pbrmr.js +1 -11
- package/dist/material/pbrmr.js.map +1 -1
- package/dist/material/sprite.js +6 -6
- package/dist/material/sprite.js.map +1 -1
- package/dist/material/terrain-cm.js +2 -2
- package/dist/material/terrain-cm.js.map +1 -1
- package/dist/posteffect/taa.js +31 -39
- package/dist/posteffect/taa.js.map +1 -1
- package/dist/render/drawable.js +5 -1
- package/dist/render/drawable.js.map +1 -1
- package/dist/render/rendergraph/device_pool_allocator.js +29 -3
- package/dist/render/rendergraph/device_pool_allocator.js.map +1 -1
- package/dist/render/rendergraph/executor.js +283 -33
- package/dist/render/rendergraph/executor.js.map +1 -1
- package/dist/render/rendergraph/forward_plus_builder.js +338 -108
- package/dist/render/rendergraph/forward_plus_builder.js.map +1 -1
- package/dist/render/rendergraph/history_resource_manager.js +236 -156
- package/dist/render/rendergraph/history_resource_manager.js.map +1 -1
- package/dist/render/rendergraph/history_resources.js +10 -0
- package/dist/render/rendergraph/history_resources.js.map +1 -0
- package/dist/render/rendergraph/rendergraph.js +162 -35
- package/dist/render/rendergraph/rendergraph.js.map +1 -1
- package/dist/render/rendergraph/types.js +36 -16
- package/dist/render/rendergraph/types.js.map +1 -1
- package/dist/render/rendertarget.js +5 -1
- package/dist/render/rendertarget.js.map +1 -1
- package/dist/render/screenrendertarget.js +5 -1
- package/dist/render/screenrendertarget.js.map +1 -1
- package/dist/render/sky.js +4 -4
- package/dist/render/sky.js.map +1 -1
- package/dist/scene/basesprite.js +2 -2
- package/dist/scene/basesprite.js.map +1 -1
- package/dist/scene/graph_node.js +1 -1
- package/dist/scene/graph_node.js.map +1 -1
- package/dist/scene/mesh.js +4 -20
- package/dist/scene/mesh.js.map +1 -1
- package/dist/scene/particlesys.js +1 -1
- package/dist/scene/particlesys.js.map +1 -1
- package/dist/scene/scene_node.js +2 -2
- package/dist/scene/scene_node.js.map +1 -1
- package/dist/scene/script_attachment.js +15 -3
- package/dist/scene/script_attachment.js.map +1 -1
- package/dist/scene/terrain-cm/terrain-cm.js +3 -3
- package/dist/scene/terrain-cm/terrain-cm.js.map +1 -1
- package/dist/shadow/shadowmapper.js.map +1 -1
- package/dist/shapes/box.js +1 -1
- package/dist/shapes/box.js.map +1 -1
- package/dist/shapes/capsule.js +0 -3
- package/dist/shapes/capsule.js.map +1 -1
- package/dist/shapes/cylinder.js +0 -3
- package/dist/shapes/cylinder.js.map +1 -1
- package/dist/shapes/plane.js +0 -3
- package/dist/shapes/plane.js.map +1 -1
- package/dist/shapes/tetrahedron.js +3 -9
- package/dist/shapes/tetrahedron.js.map +1 -1
- package/dist/shapes/torus.js +4 -7
- package/dist/shapes/torus.js.map +1 -1
- package/dist/utility/blueprint/material/inputs.js +3 -3
- package/dist/utility/blueprint/material/inputs.js.map +1 -1
- package/dist/utility/blueprint/material/ir.js +493 -493
- package/dist/utility/blueprint/material/ir.js.map +1 -1
- package/dist/utility/serialization/manager.js +34 -3
- package/dist/utility/serialization/manager.js.map +1 -1
- package/dist/utility/serialization/scene/animation.js +45 -0
- package/dist/utility/serialization/scene/animation.js.map +1 -1
- package/dist/utility/serialization/scene/camera.js +53 -0
- package/dist/utility/serialization/scene/camera.js.map +1 -1
- package/dist/utility/serialization/scene/common.js +10 -0
- package/dist/utility/serialization/scene/common.js.map +1 -1
- package/dist/utility/serialization/scene/light.js +30 -0
- package/dist/utility/serialization/scene/light.js.map +1 -1
- package/dist/utility/serialization/scene/material.js +63 -0
- package/dist/utility/serialization/scene/material.js.map +1 -1
- package/dist/utility/serialization/scene/mesh.js +11 -0
- package/dist/utility/serialization/scene/mesh.js.map +1 -1
- package/dist/utility/serialization/scene/misc.js +2 -0
- package/dist/utility/serialization/scene/misc.js.map +1 -1
- package/dist/utility/serialization/scene/node.js +19 -0
- package/dist/utility/serialization/scene/node.js.map +1 -1
- package/dist/utility/serialization/scene/particle.js +22 -0
- package/dist/utility/serialization/scene/particle.js.map +1 -1
- package/dist/utility/serialization/scene/primitive.js +33 -0
- package/dist/utility/serialization/scene/primitive.js.map +1 -1
- package/dist/utility/serialization/scene/scene.js +39 -0
- package/dist/utility/serialization/scene/scene.js.map +1 -1
- package/dist/utility/serialization/scene/script.js +2 -0
- package/dist/utility/serialization/scene/script.js.map +1 -1
- package/dist/utility/serialization/scene/sprite.js +6 -0
- package/dist/utility/serialization/scene/sprite.js.map +1 -1
- package/dist/utility/serialization/scene/terrain.js +9 -0
- package/dist/utility/serialization/scene/terrain.js.map +1 -1
- package/dist/utility/serialization/scene/water.js +21 -0
- package/dist/utility/serialization/scene/water.js.map +1 -1
- package/dist/utility/serialization/types.js +5 -1
- package/dist/utility/serialization/types.js.map +1 -1
- package/package.json +2 -2
|
@@ -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/** Parameters for a single simulation step */\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) */\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\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\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, colR.height, colRW.positionCurrent, colRW.directionCurrent);\r\n if (colR.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 (colR.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// Pass 1: Verlet integration + forces\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// Surface collision (triangle-based cloth collision)\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\nexport interface ApplyResultOutput {\r\n position: Vector3;\r\n rotation: Quaternion;\r\n localRotation: Quaternion;\r\n}\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 閳?initialLocalRotation (blendRatio=0 閳?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\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 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\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, colR.height, colRW.positionCurrent, colRW.directionCurrent);\r\n if (colR.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 (colR.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,6 +1,14 @@
|
|
|
1
1
|
// Data structure definitions — direct port of C# structs from SPCRJointDynamicsJob.cs
|
|
2
|
-
|
|
3
|
-
|
|
2
|
+
/**
|
|
3
|
+
* Numerical tolerance used by the joint dynamics solver.
|
|
4
|
+
*
|
|
5
|
+
* @public
|
|
6
|
+
*/ const EPSILON = 0.001;
|
|
7
|
+
/** Constraint topology type */ /**
|
|
8
|
+
* Constraint topology type.
|
|
9
|
+
*
|
|
10
|
+
* @public
|
|
11
|
+
*/ var ConstraintType = /*#__PURE__*/ function(ConstraintType) {
|
|
4
12
|
/** Parent-child bone pairs along vertical chains */ ConstraintType[ConstraintType["Structural_Vertical"] = 0] = "Structural_Vertical";
|
|
5
13
|
/** Same-depth bones across adjacent chains */ ConstraintType[ConstraintType["Structural_Horizontal"] = 1] = "Structural_Horizontal";
|
|
6
14
|
/** Diagonal cross-bracing between adjacent chains */ ConstraintType[ConstraintType["Shear"] = 2] = "Shear";
|
|
@@ -8,7 +16,11 @@ const EPSILON = 0.001;
|
|
|
8
16
|
/** Skip-one horizontal across chains for bending resistance */ ConstraintType[ConstraintType["Bending_Horizontal"] = 4] = "Bending_Horizontal";
|
|
9
17
|
return ConstraintType;
|
|
10
18
|
}({});
|
|
11
|
-
/** Collider surface force direction (used for surface/triangle collision) */
|
|
19
|
+
/** Collider surface force direction (used for surface/triangle collision) */ /**
|
|
20
|
+
* Collider surface force direction used for surface and triangle collision.
|
|
21
|
+
*
|
|
22
|
+
* @public
|
|
23
|
+
*/ var ColliderForce = /*#__PURE__*/ function(ColliderForce) {
|
|
12
24
|
/** No surface force */ ColliderForce[ColliderForce["Off"] = 0] = "Off";
|
|
13
25
|
/** Push surface outward from collider */ ColliderForce[ColliderForce["Push"] = 1] = "Push";
|
|
14
26
|
/** Pull surface inward toward collider */ ColliderForce[ColliderForce["Pull"] = 2] = "Pull";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.js","sources":["../../../src/animation/joint_dynamics/types.ts"],"sourcesContent":["// Data structure definitions — direct port of C# structs from SPCRJointDynamicsJob.cs\r\n\r\nimport type { Matrix4x4, Quaternion, Vector3 } from '@zephyr3d/base';\r\n\r\nexport const EPSILON = 0.001;\r\n\r\n/** Constraint topology type */\r\nexport const enum ConstraintType {\r\n /** Parent-child bone pairs along vertical chains */\r\n Structural_Vertical = 0,\r\n /** Same-depth bones across adjacent chains */\r\n Structural_Horizontal = 1,\r\n /** Diagonal cross-bracing between adjacent chains */\r\n Shear = 2,\r\n /** Skip-one vertical (grandparent→grandchild) for bending resistance */\r\n Bending_Vertical = 3,\r\n /** Skip-one horizontal across chains for bending resistance */\r\n Bending_Horizontal = 4\r\n}\r\n\r\n/** Collider surface force direction (used for surface/triangle collision) */\r\nexport const enum ColliderForce {\r\n /** No surface force */\r\n Off = 0,\r\n /** Push surface outward from collider */\r\n Push = 1,\r\n /** Pull surface inward toward collider */\r\n Pull = 2\r\n}\r\n\r\n/**\r\n * Read-only per-point physics parameters.\r\n * Set once at initialization, immutable during simulation.\r\n * Constraint scale values are pre-multiplied by 0.5 (summed between two points in solver).\r\n */\r\nexport interface PointR {\r\n /** Index of parent point in the hierarchy (-1 = root, no parent) */\r\n parent: number;\r\n /** Index of first child point (-1 = leaf, no child) */\r\n child: number;\r\n /** Whether this point responds to inverse colliders (0 or 1) */\r\n applyInvertCollision: number;\r\n /** Index into movableLimitTargets array (-1 = no limit) */\r\n movableLimitIndex: number;\r\n /** Max distance from movable limit target (sphere constraint radius) */\r\n movableLimitRadius: number;\r\n /** 0 = fixed (follows animation), 1 = dynamic (simulated) */\r\n weight: number;\r\n /** Mass of the point, affects wind force scaling */\r\n mass: number;\r\n /** Velocity damping factor [0-1]. Higher = less damping, more movement */\r\n resistance: number;\r\n /** Restore-to-animation strength [0-1]. Higher = stiffer, pulls toward animated pose */\r\n hardness: number;\r\n /** Multiplier for accumulated friction from collisions */\r\n frictionScale: number;\r\n /** Extra slack length added to horizontal/shear constraint stretch limits */\r\n sliderJointLength: number;\r\n /** Distance to parent point (used for angle limiting) */\r\n parentLength: number;\r\n /** Structural vertical constraint shrink stiffness (×0.5, summed with other point) */\r\n structuralShrinkVertical: number;\r\n /** Structural vertical constraint stretch stiffness */\r\n structuralStretchVertical: number;\r\n /** Structural horizontal constraint shrink stiffness */\r\n structuralShrinkHorizontal: number;\r\n /** Structural horizontal constraint stretch stiffness */\r\n structuralStretchHorizontal: number;\r\n /** Shear constraint shrink stiffness */\r\n shearShrink: number;\r\n /** Shear constraint stretch stiffness */\r\n shearStretch: number;\r\n /** Bending vertical constraint shrink stiffness */\r\n bendingShrinkVertical: number;\r\n /** Bending vertical constraint stretch stiffness */\r\n bendingStretchVertical: number;\r\n /** Bending horizontal constraint shrink stiffness */\r\n bendingShrinkHorizontal: number;\r\n /** Bending horizontal constraint stretch stiffness */\r\n bendingStretchHorizontal: number;\r\n /** Wind force multiplier (scaled by depth rate) */\r\n windForceScale: number;\r\n /** Fake wave amplitude multiplier for leaf bones */\r\n fakeWavePower: number;\r\n /** Fake wave frequency offset for leaf bones */\r\n fakeWaveFreq: number;\r\n /** Blend ratio toward animation pose [0-1]. Used for fade in/out */\r\n forceFadeRatio: number;\r\n /** Collision radius of this point (used in sphere/capsule pushout) */\r\n pointRadius: number;\r\n /** Gravity vector applied to this point (scaled by depth curve) */\r\n gravity: Vector3;\r\n /** Local-space direction from this bone to its first child (for rotation calculation) */\r\n boneAxis: Vector3;\r\n /** Initial local scale captured at init (for transform reset) */\r\n initialLocalScale: Vector3;\r\n /** Initial local rotation captured at init (for rotation blending) */\r\n initialLocalRotation: Quaternion;\r\n /** Initial twist component of localRotation around boneAxis (for twist preservation) */\r\n initialLocalTwist: Quaternion;\r\n /** Initial local position captured at init (for transform reset) */\r\n initialLocalPosition: Vector3;\r\n}\r\n\r\n/**\r\n * Mutable per-point simulation state.\r\n * Updated every substep during simulation.\r\n */\r\nexport interface PointRW {\r\n /** Final output position to write back to the transform */\r\n positionToTransform: Vector3;\r\n /** Current frame's animated world position (read from transform) */\r\n positionCurrentTransform: Vector3;\r\n /** Previous frame's animated world position */\r\n positionPreviousTransform: Vector3;\r\n /** Current simulated world position (Verlet integration state) */\r\n positionCurrent: Vector3;\r\n /** Previous simulated world position (Verlet integration state) */\r\n positionPrevious: Vector3;\r\n /** Previous frame's bone direction (fallback when direction is zero-length) */\r\n directionPrevious: Vector3;\r\n /** Interpolated wind direction for fake wave effect */\r\n fakeWindDirection: Vector3;\r\n /** Index of the grabber currently holding this point (-1 = not grabbed) */\r\n grabberIndex: number;\r\n /** Distance maintained from grabber center when grabbed */\r\n grabberDistance: number;\r\n /** Accumulated friction from collisions this frame (reset each substep) */\r\n friction: number;\r\n}\r\n\r\n/** Distance constraint between two points */\r\nexport interface Constraint {\r\n /** Whether collision detection runs for this constraint's bone pair (0 or 1) */\r\n isCollision: number;\r\n /** Constraint topology type */\r\n type: ConstraintType;\r\n /** Index of first connected point */\r\n indexA: number;\r\n /** Index of second connected point */\r\n indexB: number;\r\n /** Rest length — the target distance between the two points */\r\n length: number;\r\n}\r\n\r\n/** Read-only collider shape parameters (set at init) */\r\nexport interface ColliderR {\r\n /** Base radius of the collider sphere (or capsule head) */\r\n radius: number;\r\n /** Scale factor for capsule tail radius relative to head (1.0 = uniform) */\r\n radiusTailScale: number;\r\n /** Capsule height. 0 = sphere collider, >0 = capsule collider */\r\n height: number;\r\n /** Friction coefficient applied on collision contact */\r\n friction: number;\r\n /** If true, keeps points INSIDE the collider (e.g. muscle volume) */\r\n isInverseCollider: boolean;\r\n /** Surface force direction for triangle/surface collision */\r\n forceType: ColliderForce;\r\n}\r\n\r\n/** Mutable collider runtime state (updated each frame) */\r\nexport interface ColliderRW {\r\n /** Current interpolated head position (for this substep) */\r\n positionCurrent: Vector3;\r\n /** Current interpolated capsule direction vector (head→tail) */\r\n directionCurrent: Vector3;\r\n /** World-space broad-phase center for current collider */\r\n boundsCenter: Vector3;\r\n /** World-space broad-phase radius for current collider */\r\n boundsRadius: number;\r\n /** This frame's world position (read from transform) */\r\n positionCurrentTransform: Vector3;\r\n /** Previous frame's world position */\r\n positionPreviousTransform: Vector3;\r\n /** This frame's world rotation (read from transform) */\r\n directionCurrentTransform: Quaternion;\r\n /** Previous frame's world rotation */\r\n directionPreviousTransform: Quaternion;\r\n /** World-to-local matrix for AABB bounds computation */\r\n worldToLocal: Matrix4x4;\r\n /** World-space scale of the collider node (product of all ancestor scales × own local scale) */\r\n worldScale: Vector3;\r\n /** Local-space AABB min corner */\r\n localBoundsMin: Vector3;\r\n /** Local-space AABB max corner */\r\n localBoundsMax: Vector3;\r\n /** Scaled radius for current frame (base radius × world scale) */\r\n radius: number;\r\n /** Whether this collider is active (0 = disabled, 1 = enabled) */\r\n enabled: number;\r\n}\r\n\r\n/** Read-only grabber parameters (set at init) */\r\nexport interface GrabberR {\r\n /** Grab activation radius — points within this distance can be grabbed */\r\n radius: number;\r\n /** Pull strength toward grabber [0-1]. 1 = snap to grabber, 0 = no pull */\r\n force: number;\r\n}\r\n\r\n/** Mutable grabber runtime state (updated each frame) */\r\nexport interface GrabberRW {\r\n /** Whether this grabber is active (0 = disabled, 1 = enabled) */\r\n enabled: number;\r\n /** Current world position of the grabber */\r\n position: Vector3;\r\n}\r\n\r\n/** Angle limiting configuration for post-simulation bone angle clamping */\r\nexport interface AngleLimitConfig {\r\n /** Max angle in degrees between parent and child bone. Negative = disabled */\r\n angleLimit: number;\r\n /** If true, measure angle from original transform orientation instead of simulated parent */\r\n limitFromRoot: boolean;\r\n}\r\n\r\n/** Flat plane limiter — infinite plane that points cannot pass through */\r\nexport interface FlatPlane {\r\n /** Plane normal (points toward the \"allowed\" side) */\r\n normal: Vector3;\r\n /** Signed distance from origin (plane equation: dot(normal, point) + distance = 0) */\r\n distance: number;\r\n}\r\n\r\n/**\r\n * Input point data for low-level initialization (mirrors C# Point struct).\r\n * Used when bypassing the Controller and calling the solver directly.\r\n */\r\nexport interface PointInit {\r\n /** Parent point index (-1 = no parent) */\r\n parent: number;\r\n /** Child point index (-1 = no child) */\r\n child: number;\r\n /** Index into movable limit targets array (-1 = none) */\r\n movableLimitIndex: number;\r\n /** Whether to respond to inverse colliders (0 or 1) */\r\n applyInvertCollision: number;\r\n /** Movable limit sphere radius */\r\n movableLimitRadius: number;\r\n /** 0 = fixed, 1 = dynamic */\r\n weight: number;\r\n /** Point mass */\r\n mass: number;\r\n /** Velocity damping [0-1] */\r\n resistance: number;\r\n /** Restore-to-animation stiffness [0-1] */\r\n hardness: number;\r\n /** Friction scale multiplier */\r\n frictionScale: number;\r\n /** Extra slack for horizontal/shear stretch */\r\n sliderJointLength: number;\r\n /** Fake wave amplitude */\r\n fakeWavePower: number;\r\n /** Fake wave frequency offset */\r\n fakeWaveFreq: number;\r\n /** Distance to parent point */\r\n parentLength: number;\r\n /** Structural vertical shrink stiffness */\r\n structuralShrinkVertical: number;\r\n /** Structural vertical stretch stiffness */\r\n structuralStretchVertical: number;\r\n /** Structural horizontal shrink stiffness */\r\n structuralShrinkHorizontal: number;\r\n /** Structural horizontal stretch stiffness */\r\n structuralStretchHorizontal: number;\r\n /** Shear shrink stiffness */\r\n shearShrink: number;\r\n /** Shear stretch stiffness */\r\n shearStretch: number;\r\n /** Bending vertical shrink stiffness */\r\n bendingShrinkVertical: number;\r\n /** Bending vertical stretch stiffness */\r\n bendingStretchVertical: number;\r\n /** Bending horizontal shrink stiffness */\r\n bendingShrinkHorizontal: number;\r\n /** Bending horizontal stretch stiffness */\r\n bendingStretchHorizontal: number;\r\n /** Wind force multiplier */\r\n windForceScale: number;\r\n /** Collision radius */\r\n pointRadius: number;\r\n /** Gravity vector */\r\n gravity: Vector3;\r\n /** Local-space bone axis direction */\r\n boneAxis: Vector3;\r\n /** Initial world position */\r\n position: Vector3;\r\n /** Initial direction */\r\n direction: Vector3;\r\n}\r\n\r\n/**\r\n * Engine-agnostic transform read/write interface.\r\n * Implement this to bridge the solver with any rendering engine (Three.js, Babylon, custom).\r\n */\r\nexport interface TransformAccess {\r\n /** Read world-space position */\r\n getWorldPosition(): Vector3;\r\n /** Read world-space rotation */\r\n getWorldRotation(): Quaternion;\r\n /** Read world-space scale (product of all ancestor scales and own local scale) */\r\n getWorldScale(): Vector3;\r\n /** Read local-space position (relative to parent) */\r\n getLocalPosition(): Vector3;\r\n /** Read local-space rotation (relative to parent) */\r\n getLocalRotation(): Quaternion;\r\n /** Read local scale */\r\n getLocalScale(): Vector3;\r\n /** Write world-space position (implementation must convert to local if parented) */\r\n setWorldPosition(p: Vector3): void;\r\n /** Write world-space rotation (implementation must convert to local if parented) */\r\n setWorldRotation(q: Quaternion): void;\r\n /** Write local-space position */\r\n setLocalPosition(p: Vector3): void;\r\n /** Write local-space rotation */\r\n setLocalRotation(q: Quaternion): void;\r\n /** Write local scale */\r\n setLocalScale(s: Vector3): void;\r\n}\r\n\r\n/**\r\n * Bone hierarchy node for constraint building.\r\n * Represents a single bone in the tree structure passed to buildConstraints().\r\n */\r\nexport interface BoneNode {\r\n /** Unique index of this bone (must match the position in the pointTransforms array) */\r\n index: number;\r\n /** World-space position at initialization time (used for rest-length calculation) */\r\n position: Vector3;\r\n /** Child nodes in the hierarchy */\r\n children: BoneNode[];\r\n /** If true, this point is fixed (weight=0, follows animation) — typically depth=0 roots */\r\n isFixed: boolean;\r\n /** Depth in the hierarchy (0 = root, increments per level) */\r\n depth: number;\r\n /** Whether to include in surface collision triangle generation (default: true) */\r\n useForSurfaceCollision?: boolean;\r\n /** Local-space direction to first child. Auto-computed from transforms if omitted */\r\n boneAxis?: Vector3;\r\n}\r\n"],"names":["EPSILON","ConstraintType","ColliderForce"],"mappings":"AAAA;AAIO,MAAMA,UAAU;AAEvB,gCACO,IAAWC,cAAAA,iBAAAA,SAAAA,cAAAA,EAAAA;yDACkC,cAAA,CAAA,cAAA,CAAA,qBAAA,CAAA,GAAA,CAAA,CAAA,GAAA,qBAAA;mDAEN,cAAA,CAAA,cAAA,CAAA,uBAAA,CAAA,GAAA,CAAA,CAAA,GAAA,uBAAA;0DAEO,cAAA,CAAA,cAAA,CAAA,OAAA,CAAA,GAAA,CAAA,CAAA,GAAA,OAAA;6EAEmB,cAAA,CAAA,cAAA,CAAA,kBAAA,CAAA,GAAA,CAAA,CAAA,GAAA,kBAAA;oEAET,cAAA,CAAA,cAAA,CAAA,oBAAA,CAAA,GAAA,CAAA,CAAA,GAAA,oBAAA;AAT7CA,IAAAA,OAAAA,cAAAA;AAWjB,CAAA,CAAA,EAAA;AAED,8EACO,IAAWC,aAAAA,iBAAAA,SAAAA,aAAAA,EAAAA;4BACK,aAAA,CAAA,aAAA,CAAA,KAAA,CAAA,GAAA,CAAA,CAAA,GAAA,KAAA;8CAEkB,aAAA,CAAA,aAAA,CAAA,MAAA,CAAA,GAAA,CAAA,CAAA,GAAA,MAAA;+CAEC,aAAA,CAAA,aAAA,CAAA,MAAA,CAAA,GAAA,CAAA,CAAA,GAAA,MAAA;AALxBA,IAAAA,OAAAA,aAAAA;AAOjB,CAAA,CAAA,EAAA;;;;"}
|
|
1
|
+
{"version":3,"file":"types.js","sources":["../../../src/animation/joint_dynamics/types.ts"],"sourcesContent":["// Data structure definitions — direct port of C# structs from SPCRJointDynamicsJob.cs\r\n\r\nimport type { Matrix4x4, Quaternion, Vector3 } from '@zephyr3d/base';\r\n\r\n/**\r\n * Numerical tolerance used by the joint dynamics solver.\r\n *\r\n * @public\r\n */\r\nexport const EPSILON = 0.001;\r\n\r\n/** Constraint topology type */\r\n/**\r\n * Constraint topology type.\r\n *\r\n * @public\r\n */\r\nexport const enum ConstraintType {\r\n /** Parent-child bone pairs along vertical chains */\r\n Structural_Vertical = 0,\r\n /** Same-depth bones across adjacent chains */\r\n Structural_Horizontal = 1,\r\n /** Diagonal cross-bracing between adjacent chains */\r\n Shear = 2,\r\n /** Skip-one vertical (grandparent→grandchild) for bending resistance */\r\n Bending_Vertical = 3,\r\n /** Skip-one horizontal across chains for bending resistance */\r\n Bending_Horizontal = 4\r\n}\r\n\r\n/** Collider surface force direction (used for surface/triangle collision) */\r\n/**\r\n * Collider surface force direction used for surface and triangle collision.\r\n *\r\n * @public\r\n */\r\nexport const enum ColliderForce {\r\n /** No surface force */\r\n Off = 0,\r\n /** Push surface outward from collider */\r\n Push = 1,\r\n /** Pull surface inward toward collider */\r\n Pull = 2\r\n}\r\n\r\n/**\r\n * Read-only per-point physics parameters.\r\n * Set once at initialization, immutable during simulation.\r\n * Constraint scale values are pre-multiplied by 0.5 (summed between two points in solver).\r\n */\r\n/**\r\n * Read-only per-point physics parameters.\r\n *\r\n * @public\r\n */\r\nexport interface PointR {\r\n /** Index of parent point in the hierarchy (-1 = root, no parent) */\r\n parent: number;\r\n /** Index of first child point (-1 = leaf, no child) */\r\n child: number;\r\n /** Whether this point responds to inverse colliders (0 or 1) */\r\n applyInvertCollision: number;\r\n /** Index into movableLimitTargets array (-1 = no limit) */\r\n movableLimitIndex: number;\r\n /** Max distance from movable limit target (sphere constraint radius) */\r\n movableLimitRadius: number;\r\n /** 0 = fixed (follows animation), 1 = dynamic (simulated) */\r\n weight: number;\r\n /** Mass of the point, affects wind force scaling */\r\n mass: number;\r\n /** Velocity damping factor [0-1]. Higher = less damping, more movement */\r\n resistance: number;\r\n /** Restore-to-animation strength [0-1]. Higher = stiffer, pulls toward animated pose */\r\n hardness: number;\r\n /** Multiplier for accumulated friction from collisions */\r\n frictionScale: number;\r\n /** Extra slack length added to horizontal/shear constraint stretch limits */\r\n sliderJointLength: number;\r\n /** Distance to parent point (used for angle limiting) */\r\n parentLength: number;\r\n /** Structural vertical constraint shrink stiffness (×0.5, summed with other point) */\r\n structuralShrinkVertical: number;\r\n /** Structural vertical constraint stretch stiffness */\r\n structuralStretchVertical: number;\r\n /** Structural horizontal constraint shrink stiffness */\r\n structuralShrinkHorizontal: number;\r\n /** Structural horizontal constraint stretch stiffness */\r\n structuralStretchHorizontal: number;\r\n /** Shear constraint shrink stiffness */\r\n shearShrink: number;\r\n /** Shear constraint stretch stiffness */\r\n shearStretch: number;\r\n /** Bending vertical constraint shrink stiffness */\r\n bendingShrinkVertical: number;\r\n /** Bending vertical constraint stretch stiffness */\r\n bendingStretchVertical: number;\r\n /** Bending horizontal constraint shrink stiffness */\r\n bendingShrinkHorizontal: number;\r\n /** Bending horizontal constraint stretch stiffness */\r\n bendingStretchHorizontal: number;\r\n /** Wind force multiplier (scaled by depth rate) */\r\n windForceScale: number;\r\n /** Fake wave amplitude multiplier for leaf bones */\r\n fakeWavePower: number;\r\n /** Fake wave frequency offset for leaf bones */\r\n fakeWaveFreq: number;\r\n /** Blend ratio toward animation pose [0-1]. Used for fade in/out */\r\n forceFadeRatio: number;\r\n /** Collision radius of this point (used in sphere/capsule pushout) */\r\n pointRadius: number;\r\n /** Gravity vector applied to this point (scaled by depth curve) */\r\n gravity: Vector3;\r\n /** Local-space direction from this bone to its first child (for rotation calculation) */\r\n boneAxis: Vector3;\r\n /** Initial local scale captured at init (for transform reset) */\r\n initialLocalScale: Vector3;\r\n /** Initial local rotation captured at init (for rotation blending) */\r\n initialLocalRotation: Quaternion;\r\n /** Initial twist component of localRotation around boneAxis (for twist preservation) */\r\n initialLocalTwist: Quaternion;\r\n /** Initial local position captured at init (for transform reset) */\r\n initialLocalPosition: Vector3;\r\n}\r\n\r\n/**\r\n * Mutable per-point simulation state.\r\n * Updated every substep during simulation.\r\n */\r\n/**\r\n * Mutable per-point simulation state.\r\n *\r\n * @public\r\n */\r\nexport interface PointRW {\r\n /** Final output position to write back to the transform */\r\n positionToTransform: Vector3;\r\n /** Current frame's animated world position (read from transform) */\r\n positionCurrentTransform: Vector3;\r\n /** Previous frame's animated world position */\r\n positionPreviousTransform: Vector3;\r\n /** Current simulated world position (Verlet integration state) */\r\n positionCurrent: Vector3;\r\n /** Previous simulated world position (Verlet integration state) */\r\n positionPrevious: Vector3;\r\n /** Previous frame's bone direction (fallback when direction is zero-length) */\r\n directionPrevious: Vector3;\r\n /** Interpolated wind direction for fake wave effect */\r\n fakeWindDirection: Vector3;\r\n /** Index of the grabber currently holding this point (-1 = not grabbed) */\r\n grabberIndex: number;\r\n /** Distance maintained from grabber center when grabbed */\r\n grabberDistance: number;\r\n /** Accumulated friction from collisions this frame (reset each substep) */\r\n friction: number;\r\n}\r\n\r\n/** Distance constraint between two points */\r\n/**\r\n * Distance constraint between two points.\r\n *\r\n * @public\r\n */\r\nexport interface Constraint {\r\n /** Whether collision detection runs for this constraint's bone pair (0 or 1) */\r\n isCollision: number;\r\n /** Constraint topology type */\r\n type: ConstraintType;\r\n /** Index of first connected point */\r\n indexA: number;\r\n /** Index of second connected point */\r\n indexB: number;\r\n /** Rest length — the target distance between the two points */\r\n length: number;\r\n}\r\n\r\n/** Read-only collider shape parameters (set at init) */\r\n/**\r\n * Read-only collider shape parameters.\r\n *\r\n * @public\r\n */\r\nexport interface ColliderR {\r\n /** Base radius of the collider sphere (or capsule head) */\r\n radius: number;\r\n /** Scale factor for capsule tail radius relative to head (1.0 = uniform) */\r\n radiusTailScale: number;\r\n /** Capsule height. `0` means a sphere collider; `\\> 0` means a capsule collider. */\r\n height: number;\r\n /** Friction coefficient applied on collision contact */\r\n friction: number;\r\n /** If true, keeps points INSIDE the collider (e.g. muscle volume) */\r\n isInverseCollider: boolean;\r\n /** Surface force direction for triangle/surface collision */\r\n forceType: ColliderForce;\r\n}\r\n\r\n/** Mutable collider runtime state (updated each frame) */\r\n/**\r\n * Mutable collider runtime state.\r\n *\r\n * @public\r\n */\r\nexport interface ColliderRW {\r\n /** Current interpolated head position (for this substep) */\r\n positionCurrent: Vector3;\r\n /** Current interpolated capsule direction vector (head→tail) */\r\n directionCurrent: Vector3;\r\n /** World-space broad-phase center for current collider */\r\n boundsCenter: Vector3;\r\n /** World-space broad-phase radius for current collider */\r\n boundsRadius: number;\r\n /** This frame's world position (read from transform) */\r\n positionCurrentTransform: Vector3;\r\n /** Previous frame's world position */\r\n positionPreviousTransform: Vector3;\r\n /** This frame's world rotation (read from transform) */\r\n directionCurrentTransform: Quaternion;\r\n /** Previous frame's world rotation */\r\n directionPreviousTransform: Quaternion;\r\n /** World-to-local matrix for AABB bounds computation */\r\n worldToLocal: Matrix4x4;\r\n /** World-space scale of the collider node (product of all ancestor scales × own local scale) */\r\n worldScale: Vector3;\r\n /** Local-space AABB min corner */\r\n localBoundsMin: Vector3;\r\n /** Local-space AABB max corner */\r\n localBoundsMax: Vector3;\r\n /** Scaled radius for current frame (base radius × world scale) */\r\n radius: number;\r\n /** Whether this collider is active (0 = disabled, 1 = enabled) */\r\n enabled: number;\r\n}\r\n\r\n/** Read-only grabber parameters (set at init) */\r\n/**\r\n * Read-only grabber parameters.\r\n *\r\n * @public\r\n */\r\nexport interface GrabberR {\r\n /** Grab activation radius — points within this distance can be grabbed */\r\n radius: number;\r\n /** Pull strength toward grabber [0-1]. 1 = snap to grabber, 0 = no pull */\r\n force: number;\r\n}\r\n\r\n/** Mutable grabber runtime state (updated each frame) */\r\n/**\r\n * Mutable grabber runtime state.\r\n *\r\n * @public\r\n */\r\nexport interface GrabberRW {\r\n /** Whether this grabber is active (0 = disabled, 1 = enabled) */\r\n enabled: number;\r\n /** Current world position of the grabber */\r\n position: Vector3;\r\n}\r\n\r\n/** Angle limiting configuration for post-simulation bone angle clamping */\r\n/**\r\n * Angle limiting configuration for post-simulation bone angle clamping.\r\n *\r\n * @public\r\n */\r\nexport interface AngleLimitConfig {\r\n /** Max angle in degrees between parent and child bone. Negative = disabled */\r\n angleLimit: number;\r\n /** If true, measure angle from original transform orientation instead of simulated parent */\r\n limitFromRoot: boolean;\r\n}\r\n\r\n/** Flat plane limiter — infinite plane that points cannot pass through */\r\n/**\r\n * Infinite plane limiter that points cannot pass through.\r\n *\r\n * @public\r\n */\r\nexport interface FlatPlane {\r\n /** Plane normal (points toward the \"allowed\" side) */\r\n normal: Vector3;\r\n /** Signed distance from origin (plane equation: dot(normal, point) + distance = 0) */\r\n distance: number;\r\n}\r\n\r\n/**\r\n * Input point data for low-level initialization (mirrors C# Point struct).\r\n * Used when bypassing the Controller and calling the solver directly.\r\n */\r\n/**\r\n * Input point data for low-level initialization.\r\n *\r\n * @public\r\n */\r\nexport interface PointInit {\r\n /** Parent point index (-1 = no parent) */\r\n parent: number;\r\n /** Child point index (-1 = no child) */\r\n child: number;\r\n /** Index into movable limit targets array (-1 = none) */\r\n movableLimitIndex: number;\r\n /** Whether to respond to inverse colliders (0 or 1) */\r\n applyInvertCollision: number;\r\n /** Movable limit sphere radius */\r\n movableLimitRadius: number;\r\n /** 0 = fixed, 1 = dynamic */\r\n weight: number;\r\n /** Point mass */\r\n mass: number;\r\n /** Velocity damping [0-1] */\r\n resistance: number;\r\n /** Restore-to-animation stiffness [0-1] */\r\n hardness: number;\r\n /** Friction scale multiplier */\r\n frictionScale: number;\r\n /** Extra slack for horizontal/shear stretch */\r\n sliderJointLength: number;\r\n /** Fake wave amplitude */\r\n fakeWavePower: number;\r\n /** Fake wave frequency offset */\r\n fakeWaveFreq: number;\r\n /** Distance to parent point */\r\n parentLength: number;\r\n /** Structural vertical shrink stiffness */\r\n structuralShrinkVertical: number;\r\n /** Structural vertical stretch stiffness */\r\n structuralStretchVertical: number;\r\n /** Structural horizontal shrink stiffness */\r\n structuralShrinkHorizontal: number;\r\n /** Structural horizontal stretch stiffness */\r\n structuralStretchHorizontal: number;\r\n /** Shear shrink stiffness */\r\n shearShrink: number;\r\n /** Shear stretch stiffness */\r\n shearStretch: number;\r\n /** Bending vertical shrink stiffness */\r\n bendingShrinkVertical: number;\r\n /** Bending vertical stretch stiffness */\r\n bendingStretchVertical: number;\r\n /** Bending horizontal shrink stiffness */\r\n bendingShrinkHorizontal: number;\r\n /** Bending horizontal stretch stiffness */\r\n bendingStretchHorizontal: number;\r\n /** Wind force multiplier */\r\n windForceScale: number;\r\n /** Collision radius */\r\n pointRadius: number;\r\n /** Gravity vector */\r\n gravity: Vector3;\r\n /** Local-space bone axis direction */\r\n boneAxis: Vector3;\r\n /** Initial world position */\r\n position: Vector3;\r\n /** Initial direction */\r\n direction: Vector3;\r\n}\r\n\r\n/**\r\n * Engine-agnostic transform read/write interface.\r\n * Implement this to bridge the solver with any rendering engine (Three.js, Babylon, custom).\r\n */\r\n/**\r\n * Transform adapter used by the solver to read and write bone state.\r\n *\r\n * @public\r\n */\r\nexport interface TransformAccess {\r\n /** Read world-space position */\r\n getWorldPosition(): Vector3;\r\n /** Read world-space rotation */\r\n getWorldRotation(): Quaternion;\r\n /** Read world-space scale (product of all ancestor scales and own local scale) */\r\n getWorldScale(): Vector3;\r\n /** Read local-space position (relative to parent) */\r\n getLocalPosition(): Vector3;\r\n /** Read local-space rotation (relative to parent) */\r\n getLocalRotation(): Quaternion;\r\n /** Read local scale */\r\n getLocalScale(): Vector3;\r\n /** Write world-space position (implementation must convert to local if parented) */\r\n setWorldPosition(p: Vector3): void;\r\n /** Write world-space rotation (implementation must convert to local if parented) */\r\n setWorldRotation(q: Quaternion): void;\r\n /** Write local-space position */\r\n setLocalPosition(p: Vector3): void;\r\n /** Write local-space rotation */\r\n setLocalRotation(q: Quaternion): void;\r\n /** Write local scale */\r\n setLocalScale(s: Vector3): void;\r\n}\r\n\r\n/**\r\n * Bone hierarchy node for constraint building.\r\n * Represents a single bone in the tree structure passed to buildConstraints().\r\n */\r\n/**\r\n * Bone hierarchy node used to build constraints and simulation points.\r\n *\r\n * @public\r\n */\r\nexport interface BoneNode {\r\n /** Unique index of this bone (must match the position in the pointTransforms array) */\r\n index: number;\r\n /** World-space position at initialization time (used for rest-length calculation) */\r\n position: Vector3;\r\n /** Child nodes in the hierarchy */\r\n children: BoneNode[];\r\n /** If true, this point is fixed (weight=0, follows animation) — typically depth=0 roots */\r\n isFixed: boolean;\r\n /** Depth in the hierarchy (0 = root, increments per level) */\r\n depth: number;\r\n /** Whether to include in surface collision triangle generation (default: true) */\r\n useForSurfaceCollision?: boolean;\r\n /** Local-space direction to first child. Auto-computed from transforms if omitted */\r\n boneAxis?: Vector3;\r\n}\r\n"],"names":["EPSILON","ConstraintType","ColliderForce"],"mappings":"AAAA;AAIA;;;;IAKaA,MAAAA,OAAAA,GAAU;AAEvB;;;;IAMO,IAAWC,cAAAA,iBAAAA,SAAAA,cAAAA,EAAAA;yDACkC,cAAA,CAAA,cAAA,CAAA,qBAAA,CAAA,GAAA,CAAA,CAAA,GAAA,qBAAA;mDAEN,cAAA,CAAA,cAAA,CAAA,uBAAA,CAAA,GAAA,CAAA,CAAA,GAAA,uBAAA;0DAEO,cAAA,CAAA,cAAA,CAAA,OAAA,CAAA,GAAA,CAAA,CAAA,GAAA,OAAA;6EAEmB,cAAA,CAAA,cAAA,CAAA,kBAAA,CAAA,GAAA,CAAA,CAAA,GAAA,kBAAA;oEAET,cAAA,CAAA,cAAA,CAAA,oBAAA,CAAA,GAAA,CAAA,CAAA,GAAA,oBAAA;AAT7CA,IAAAA,OAAAA,cAAAA;AAWjB,CAAA,CAAA,EAAA;AAED;;;;IAMO,IAAWC,aAAAA,iBAAAA,SAAAA,aAAAA,EAAAA;4BACK,aAAA,CAAA,aAAA,CAAA,KAAA,CAAA,GAAA,CAAA,CAAA,GAAA,KAAA;8CAEkB,aAAA,CAAA,aAAA,CAAA,MAAA,CAAA,GAAA,CAAA,CAAA,GAAA,MAAA;+CAEC,aAAA,CAAA,aAAA,CAAA,MAAA,CAAA,GAAA,CAAA,CAAA,GAAA,MAAA;AALxBA,IAAAA,OAAAA,aAAAA;AAOjB,CAAA,CAAA,EAAA;;;;"}
|
|
@@ -3,7 +3,11 @@ import { BoundingBox } from '../utility/bounding_volume.js';
|
|
|
3
3
|
import { Vector3 } from '@zephyr3d/base';
|
|
4
4
|
import { createGeometryCacheState, ensureGeometryCacheMeshBinding, mixGeometryCacheBoundingBox } from './geometry_cache_utils.js';
|
|
5
5
|
|
|
6
|
-
|
|
6
|
+
/**
|
|
7
|
+
* Geometry cache track reconstructed from PCA bases and coefficients.
|
|
8
|
+
*
|
|
9
|
+
* @public
|
|
10
|
+
*/ class PCAGeometryCacheTrack extends AnimationTrack {
|
|
7
11
|
_times;
|
|
8
12
|
_bounds;
|
|
9
13
|
_positionReference;
|