@flighthq/skeleton2d 0.3.0 → 0.3.1-next.1041.35b950c

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.
@@ -84,7 +84,7 @@ function solveSkeleton2DIkChain2(skeleton, parentIndex, childIndex, targetX, tar
84
84
  return;
85
85
  const dx = local.x - parent.x;
86
86
  const dy = local.y - parent.y;
87
- let reach = Math.hypot(dx, dy);
87
+ const reach = Math.hypot(dx, dy);
88
88
  if (reach <= 0)
89
89
  return;
90
90
  const span = parentLength + childLength;
@@ -101,13 +101,15 @@ function solveSkeleton2DIkChain2(skeleton, parentIndex, childIndex, targetX, tar
101
101
  parent.scaleY *= scale;
102
102
  }
103
103
  }
104
- else if (reach <= Math.abs(parentLength - childLength)) {
105
- // Inside the dead zone the chain folds as far as it can and the tip still cannot reach.
106
- bendAngle = Math.PI;
107
- reach = Math.abs(parentLength - childLength);
108
- }
109
104
  else {
110
105
  // Law of cosines on the joint angle, measured as the deviation from straight.
106
+ //
107
+ // The clamps are load-bearing, not defensive. Unequal bone lengths leave a DEAD ZONE around the
108
+ // parent's origin — a target nearer than |parentLength − childLength|, which the chain cannot reach
109
+ // however far it folds — and inside it both cosines leave [−1, 1] by exactly the amount that clamps
110
+ // to the fully folded pose: cosJoint ≥ 1 gives a bend of π, and cosParent saturates at +1 or −1 to
111
+ // give the parent offset the longer bone requires. So the dead zone needs no case of its own, and
112
+ // dropping a clamp does not merely admit a NaN, it loses that pose.
111
113
  const cosJoint = (parentLength * parentLength + childLength * childLength - reach * reach) / (2 * parentLength * childLength);
112
114
  bendAngle = Math.PI - Math.acos(Math.min(1, Math.max(-1, cosJoint)));
113
115
  }
@@ -1 +1 @@
1
- {"version":3,"file":"ikConstraint2D.js","sourceRoot":"","sources":["../src/ikConstraint2D.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ikConstraint2D.js","sourceRoot":"","sources":["../src/ikConstraint2D.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AAErD,OAAO,EAAE,wBAAwB,EAAE,MAAM,0BAA0B,CAAC;AAEpE,OAAO,EAAE,mCAAmC,EAAE,MAAM,cAAc,CAAC;AACnE,OAAO,EAAE,kCAAkC,EAAE,MAAM,wBAAwB,CAAC;AAE5E,6EAA6E;AAC7E,MAAM,aAAa,GAAG,CAAC,CAAC;AAExB,2GAA2G;AAC3G,uEAAuE;AACvE,MAAM,UAAU,oCAAoC;IAClD,kCAAkC,CAAC,wBAAwB,CAAC,EAAE,EAAE,2BAA2B,CAAC,CAAC;AAC/F,CAAC;AAED,2GAA2G;AAC3G,yGAAyG;AACzG,4GAA4G;AAC5G,EAAE;AACF,uGAAuG;AACvG,wDAAwD;AACxD,MAAM,UAAU,2BAA2B,CAAC,QAAoB,EAAE,UAA0C;IAC1G,MAAM,EAAE,GAAG,UAA8C,CAAC;IAC1D,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC;IAC7B,MAAM,KAAK,GAAG,QAAQ,CAAC,aAAa,CAAC;IACrC,MAAM,MAAM,GAAG,EAAE,CAAC,eAAe,CAAC;IAClC,IAAI,MAAM,GAAG,CAAC,IAAI,MAAM,IAAI,KAAK,CAAC,MAAM;QAAE,OAAO;IACjD,MAAM,OAAO,GAAG,KAAK,CAAC,MAAM,GAAG,aAAa,GAAG,CAAC,CAAC,CAAC;IAClD,MAAM,OAAO,GAAG,KAAK,CAAC,MAAM,GAAG,aAAa,GAAG,CAAC,CAAC,CAAC;IAElD,MAAM,KAAK,GAAG,EAAE,CAAC,WAAW,CAAC;IAC7B,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACvB,uBAAuB,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,EAAE,CAAC,CAAC;QAClE,OAAO;IACT,CAAC;IACD,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;QAAE,uBAAuB,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,EAAE,CAAC,CAAC;AACtG,CAAC;AAED,qGAAqG;AACrG,uGAAuG;AACvG,2GAA2G;AAC3G,SAAS,uBAAuB,CAC9B,QAAoB,EACpB,SAAiB,EACjB,OAAe,EACf,OAAe,EACf,EAAoC;IAEpC,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC;IAC7B,IAAI,SAAS,GAAG,CAAC,IAAI,SAAS,IAAI,KAAK,CAAC,MAAM;QAAE,OAAO;IACvD,MAAM,IAAI,GAAG,KAAK,CAAC,SAAS,CAAC,CAAC;IAC9B,MAAM,KAAK,GAAG,uBAAuB,CAAC,QAAQ,EAAE,SAAS,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;IAC7E,IAAI,KAAK,KAAK,IAAI;QAAE,OAAO;IAE3B,MAAM,EAAE,GAAG,KAAK,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC;IAC5B,MAAM,EAAE,GAAG,KAAK,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC;IAC5B,kGAAkG;IAClG,gGAAgG;IAChG,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,EAAE,EAAE,CAAC,GAAG,UAAU,GAAG,IAAI,CAAC,MAAM,CAAC;IAC/D,IAAI,CAAC,QAAQ,IAAI,mBAAmB,CAAC,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC;IAExE,IAAI,EAAE,CAAC,OAAO,IAAI,EAAE,CAAC,QAAQ,EAAE,CAAC;QAC9B,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;QACjC,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACnD,IAAI,MAAM,GAAG,CAAC,EAAE,CAAC;YACf,MAAM,MAAM,GAAG,KAAK,GAAG,MAAM,CAAC;YAC9B,qGAAqG;YACrG,mFAAmF;YACnF,IAAI,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC;gBAC9D,MAAM,KAAK,GAAG,CAAC,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC;gBACxC,IAAI,CAAC,MAAM,IAAI,KAAK,CAAC;gBACrB,IAAI,CAAC,MAAM,IAAI,KAAK,CAAC;YACvB,CAAC;QACH,CAAC;IACH,CAAC;IACD,mCAAmC,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC;AAC3D,CAAC;AAED,uGAAuG;AACvG,4GAA4G;AAC5G,mGAAmG;AACnG,+EAA+E;AAC/E,SAAS,uBAAuB,CAC9B,QAAoB,EACpB,WAAmB,EACnB,UAAkB,EAClB,OAAe,EACf,OAAe,EACf,EAAoC;IAEpC,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC;IAC7B,IAAI,WAAW,GAAG,CAAC,IAAI,WAAW,IAAI,KAAK,CAAC,MAAM,IAAI,UAAU,GAAG,CAAC,IAAI,UAAU,IAAI,KAAK,CAAC,MAAM;QAAE,OAAO;IAC3G,MAAM,MAAM,GAAG,KAAK,CAAC,WAAW,CAAC,CAAC;IAClC,MAAM,KAAK,GAAG,KAAK,CAAC,UAAU,CAAC,CAAC;IAChC,MAAM,YAAY,GAAG,MAAM,CAAC,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IAC7D,MAAM,WAAW,GAAG,KAAK,CAAC,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;IAC1D,IAAI,YAAY,IAAI,CAAC,IAAI,WAAW,IAAI,CAAC;QAAE,OAAO;IAElD,MAAM,KAAK,GAAG,uBAAuB,CAAC,QAAQ,EAAE,WAAW,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;IAC/E,IAAI,KAAK,KAAK,IAAI;QAAE,OAAO;IAC3B,MAAM,EAAE,GAAG,KAAK,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC;IAC9B,MAAM,EAAE,GAAG,KAAK,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC;IAC9B,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;IACjC,IAAI,KAAK,IAAI,CAAC;QAAE,OAAO;IAEvB,MAAM,IAAI,GAAG,YAAY,GAAG,WAAW,CAAC;IACxC,wGAAwG;IACxG,oGAAoG;IACpG,IAAI,SAAiB,CAAC;IACtB,IAAI,KAAK,IAAI,IAAI,EAAE,CAAC;QAClB,SAAS,GAAG,CAAC,CAAC;QACd,qGAAqG;QACrG,0FAA0F;QAC1F,IAAI,EAAE,CAAC,OAAO,EAAE,CAAC;YACf,MAAM,KAAK,GAAG,CAAC,GAAG,CAAC,KAAK,GAAG,IAAI,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC;YAC9C,MAAM,CAAC,MAAM,IAAI,KAAK,CAAC;YACvB,MAAM,CAAC,MAAM,IAAI,KAAK,CAAC;QACzB,CAAC;IACH,CAAC;SAAM,CAAC;QACN,8EAA8E;QAC9E,EAAE;QACF,gGAAgG;QAChG,oGAAoG;QACpG,oGAAoG;QACpG,mGAAmG;QACnG,kGAAkG;QAClG,oEAAoE;QACpE,MAAM,QAAQ,GACZ,CAAC,YAAY,GAAG,YAAY,GAAG,WAAW,GAAG,WAAW,GAAG,KAAK,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,YAAY,GAAG,WAAW,CAAC,CAAC;QAC/G,SAAS,GAAG,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC;IACvE,CAAC;IAED,gGAAgG;IAChG,MAAM,SAAS,GACb,CAAC,YAAY,GAAG,YAAY,GAAG,KAAK,GAAG,KAAK,GAAG,WAAW,GAAG,WAAW,CAAC,GAAG,CAAC,CAAC,GAAG,YAAY,GAAG,KAAK,CAAC,CAAC;IACzG,MAAM,YAAY,GAAG,KAAK,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC;IACzF,MAAM,SAAS,GAAG,EAAE,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAC3C,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;IAE/B,MAAM,cAAc,GAAG,CAAC,GAAG,GAAG,YAAY,GAAG,SAAS,CAAC,GAAG,UAAU,GAAG,MAAM,CAAC,MAAM,CAAC;IACrF,MAAM,CAAC,QAAQ,IAAI,mBAAmB,CAAC,cAAc,GAAG,MAAM,CAAC,QAAQ,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC;IAClF,mCAAmC,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAC;IAE3D,uGAAuG;IACvG,sGAAsG;IACtG,qGAAqG;IACrG,MAAM,aAAa,GAAG,CAAC,SAAS,GAAG,SAAS,GAAG,UAAU,GAAG,KAAK,CAAC,MAAM,CAAC;IACzE,KAAK,CAAC,QAAQ,IAAI,mBAAmB,CAAC,aAAa,GAAG,KAAK,CAAC,QAAQ,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC;IAC/E,mCAAmC,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC;AAC5D,CAAC;AAED,0GAA0G;AAC1G,2GAA2G;AAC3G,2GAA2G;AAC3G,cAAc;AACd,SAAS,uBAAuB,CAC9B,QAA8B,EAC9B,SAAiB,EACjB,CAAS,EACT,CAAS;IAET,MAAM,WAAW,GAAG,QAAQ,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,WAAW,CAAC;IAC1D,IAAI,WAAW,GAAG,CAAC;QAAE,OAAO,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;IACrC,MAAM,KAAK,GAAG,QAAQ,CAAC,aAAa,CAAC;IACrC,MAAM,CAAC,GAAG,WAAW,GAAG,aAAa,CAAC;IACtC,MAAM,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;IACnB,MAAM,CAAC,GAAG,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;IACvB,MAAM,CAAC,GAAG,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;IACvB,MAAM,CAAC,GAAG,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;IACvB,MAAM,WAAW,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IAClC,IAAI,IAAI,CAAC,GAAG,CAAC,WAAW,CAAC,GAAG,mBAAmB;QAAE,OAAO,IAAI,CAAC;IAC7D,MAAM,EAAE,GAAG,CAAC,GAAG,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;IAC5B,MAAM,EAAE,GAAG,CAAC,GAAG,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;IAC5B,OAAO,EAAE,CAAC,EAAE,CAAC,CAAC,GAAG,EAAE,GAAG,CAAC,GAAG,EAAE,CAAC,GAAG,WAAW,EAAE,CAAC,EAAE,CAAC,CAAC,GAAG,EAAE,GAAG,CAAC,GAAG,EAAE,CAAC,GAAG,WAAW,EAAE,CAAC;AACpF,CAAC;AAED,uGAAuG;AACvG,yGAAyG;AACzG,SAAS;AACT,SAAS,mBAAmB,CAAC,OAAe;IAC1C,IAAI,KAAK,GAAG,OAAO,GAAG,GAAG,CAAC;IAC1B,IAAI,KAAK,GAAG,GAAG;QAAE,KAAK,IAAI,GAAG,CAAC;SACzB,IAAI,KAAK,GAAG,CAAC,GAAG;QAAE,KAAK,IAAI,GAAG,CAAC;IACpC,OAAO,KAAK,CAAC;AACf,CAAC;AAED,MAAM,mBAAmB,GAAG,IAAI,CAAC"}
package/dist/index.d.ts CHANGED
@@ -1,2 +1,2 @@
1
- export { applyAnimationClipToSkeleton2D, cloneSkeleton2D, computeSkeleton2DBoneMatrices, computeSkeleton2DBoneWorldTransform, computeSkeleton2DBoundingBoxAttachmentVertices, computeSkeleton2DClippingAttachmentVertices, computeSkeleton2DPointAttachmentPosition, computeSkeleton2DPointAttachmentRotation, computeSkeleton2DRegionAttachmentVertices, computeSkeleton2DWorldTransforms, createSkeleton2D, createSkeleton2DBoneAnimationTarget, createSkeleton2DSlotAnimationTarget, deformSkeleton2DMeshAttachment, deformSkeleton2DPathAttachment, disposeSkeleton2D, explainSkeleton2DDeformLength, equalsSkeleton2D, getSkeleton2DBoneIndexByName, getSkeleton2DBoneWorldMatrix, getSkeleton2DClippingAttachmentSlotRange, getSkeleton2DSlotDeformOffsets, registerSkeleton2DAnimationTargetBinder, registerSkeleton2DConstraintSolver, registerSkeleton2DDeformAnimationTarget, registerSkeleton2DIkConstraintSolver, registerSkeleton2DPathConstraintSolver, registerSkeleton2DTransformConstraintSolver, setSkeleton2DBindPose, setSkeleton2DSlotDeform, solveSkeleton2DConstraints, validateSkeleton2D, } from './contract';
1
+ export { applyAnimationClipToSkeleton2D, cloneSkeleton2D, computeSkeleton2DBoneMatrices, computeSkeleton2DBoneWorldTransform, computeSkeleton2DBoundingBoxAttachmentVertices, computeSkeleton2DClippingAttachmentVertices, computeSkeleton2DPointAttachmentPosition, computeSkeleton2DPointAttachmentRotation, computeSkeleton2DRegionAttachmentVertices, computeSkeleton2DWorldTransforms, createSkeleton2D, createSkeleton2DBoneAnimationTarget, createSkeleton2DSlotAnimationTarget, deformSkeleton2DMeshAttachment, deformSkeleton2DPathAttachment, disposeSkeleton2D, explainSkeleton2DDeformLength, equalsSkeleton2D, getSkeleton2DAnimationTargetBinder, getSkeleton2DAnimationTargetBinderKinds, getSkeleton2DBoneIndexByName, getSkeleton2DBoneWorldMatrix, getSkeleton2DClippingAttachmentSlotRange, getSkeleton2DSlotDeformOffsets, registerSkeleton2DAnimationTargetBinder, registerSkeleton2DConstraintSolver, registerSkeleton2DDeformAnimationTarget, registerSkeleton2DIkConstraintSolver, registerSkeleton2DPathConstraintSolver, registerSkeleton2DTransformConstraintSolver, setSkeleton2DBindPose, setSkeleton2DSlotDeform, solveSkeleton2DConstraints, unregisterSkeleton2DAnimationTargetBinder, validateSkeleton2D, } from './contract';
2
2
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,8BAA8B,EAC9B,eAAe,EACf,6BAA6B,EAC7B,mCAAmC,EACnC,8CAA8C,EAC9C,2CAA2C,EAC3C,wCAAwC,EACxC,wCAAwC,EACxC,yCAAyC,EACzC,gCAAgC,EAChC,gBAAgB,EAChB,mCAAmC,EACnC,mCAAmC,EACnC,8BAA8B,EAC9B,8BAA8B,EAC9B,iBAAiB,EACjB,6BAA6B,EAC7B,gBAAgB,EAChB,4BAA4B,EAC5B,4BAA4B,EAC5B,wCAAwC,EACxC,8BAA8B,EAC9B,uCAAuC,EACvC,kCAAkC,EAClC,uCAAuC,EACvC,oCAAoC,EACpC,sCAAsC,EACtC,2CAA2C,EAC3C,qBAAqB,EACrB,uBAAuB,EACvB,0BAA0B,EAC1B,kBAAkB,GACnB,MAAM,YAAY,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,8BAA8B,EAC9B,eAAe,EACf,6BAA6B,EAC7B,mCAAmC,EACnC,8CAA8C,EAC9C,2CAA2C,EAC3C,wCAAwC,EACxC,wCAAwC,EACxC,yCAAyC,EACzC,gCAAgC,EAChC,gBAAgB,EAChB,mCAAmC,EACnC,mCAAmC,EACnC,8BAA8B,EAC9B,8BAA8B,EAC9B,iBAAiB,EACjB,6BAA6B,EAC7B,gBAAgB,EAChB,kCAAkC,EAClC,uCAAuC,EACvC,4BAA4B,EAC5B,4BAA4B,EAC5B,wCAAwC,EACxC,8BAA8B,EAC9B,uCAAuC,EACvC,kCAAkC,EAClC,uCAAuC,EACvC,oCAAoC,EACpC,sCAAsC,EACtC,2CAA2C,EAC3C,qBAAqB,EACrB,uBAAuB,EACvB,0BAA0B,EAC1B,yCAAyC,EACzC,kBAAkB,GACnB,MAAM,YAAY,CAAC"}
package/dist/index.js CHANGED
@@ -1,2 +1,2 @@
1
- export { applyAnimationClipToSkeleton2D, cloneSkeleton2D, computeSkeleton2DBoneMatrices, computeSkeleton2DBoneWorldTransform, computeSkeleton2DBoundingBoxAttachmentVertices, computeSkeleton2DClippingAttachmentVertices, computeSkeleton2DPointAttachmentPosition, computeSkeleton2DPointAttachmentRotation, computeSkeleton2DRegionAttachmentVertices, computeSkeleton2DWorldTransforms, createSkeleton2D, createSkeleton2DBoneAnimationTarget, createSkeleton2DSlotAnimationTarget, deformSkeleton2DMeshAttachment, deformSkeleton2DPathAttachment, disposeSkeleton2D, explainSkeleton2DDeformLength, equalsSkeleton2D, getSkeleton2DBoneIndexByName, getSkeleton2DBoneWorldMatrix, getSkeleton2DClippingAttachmentSlotRange, getSkeleton2DSlotDeformOffsets, registerSkeleton2DAnimationTargetBinder, registerSkeleton2DConstraintSolver, registerSkeleton2DDeformAnimationTarget, registerSkeleton2DIkConstraintSolver, registerSkeleton2DPathConstraintSolver, registerSkeleton2DTransformConstraintSolver, setSkeleton2DBindPose, setSkeleton2DSlotDeform, solveSkeleton2DConstraints, validateSkeleton2D, } from './contract';
1
+ export { applyAnimationClipToSkeleton2D, cloneSkeleton2D, computeSkeleton2DBoneMatrices, computeSkeleton2DBoneWorldTransform, computeSkeleton2DBoundingBoxAttachmentVertices, computeSkeleton2DClippingAttachmentVertices, computeSkeleton2DPointAttachmentPosition, computeSkeleton2DPointAttachmentRotation, computeSkeleton2DRegionAttachmentVertices, computeSkeleton2DWorldTransforms, createSkeleton2D, createSkeleton2DBoneAnimationTarget, createSkeleton2DSlotAnimationTarget, deformSkeleton2DMeshAttachment, deformSkeleton2DPathAttachment, disposeSkeleton2D, explainSkeleton2DDeformLength, equalsSkeleton2D, getSkeleton2DAnimationTargetBinder, getSkeleton2DAnimationTargetBinderKinds, getSkeleton2DBoneIndexByName, getSkeleton2DBoneWorldMatrix, getSkeleton2DClippingAttachmentSlotRange, getSkeleton2DSlotDeformOffsets, registerSkeleton2DAnimationTargetBinder, registerSkeleton2DConstraintSolver, registerSkeleton2DDeformAnimationTarget, registerSkeleton2DIkConstraintSolver, registerSkeleton2DPathConstraintSolver, registerSkeleton2DTransformConstraintSolver, setSkeleton2DBindPose, setSkeleton2DSlotDeform, solveSkeleton2DConstraints, unregisterSkeleton2DAnimationTargetBinder, validateSkeleton2D, } from './contract';
2
2
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,8BAA8B,EAC9B,eAAe,EACf,6BAA6B,EAC7B,mCAAmC,EACnC,8CAA8C,EAC9C,2CAA2C,EAC3C,wCAAwC,EACxC,wCAAwC,EACxC,yCAAyC,EACzC,gCAAgC,EAChC,gBAAgB,EAChB,mCAAmC,EACnC,mCAAmC,EACnC,8BAA8B,EAC9B,8BAA8B,EAC9B,iBAAiB,EACjB,6BAA6B,EAC7B,gBAAgB,EAChB,4BAA4B,EAC5B,4BAA4B,EAC5B,wCAAwC,EACxC,8BAA8B,EAC9B,uCAAuC,EACvC,kCAAkC,EAClC,uCAAuC,EACvC,oCAAoC,EACpC,sCAAsC,EACtC,2CAA2C,EAC3C,qBAAqB,EACrB,uBAAuB,EACvB,0BAA0B,EAC1B,kBAAkB,GACnB,MAAM,YAAY,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,8BAA8B,EAC9B,eAAe,EACf,6BAA6B,EAC7B,mCAAmC,EACnC,8CAA8C,EAC9C,2CAA2C,EAC3C,wCAAwC,EACxC,wCAAwC,EACxC,yCAAyC,EACzC,gCAAgC,EAChC,gBAAgB,EAChB,mCAAmC,EACnC,mCAAmC,EACnC,8BAA8B,EAC9B,8BAA8B,EAC9B,iBAAiB,EACjB,6BAA6B,EAC7B,gBAAgB,EAChB,kCAAkC,EAClC,uCAAuC,EACvC,4BAA4B,EAC5B,4BAA4B,EAC5B,wCAAwC,EACxC,8BAA8B,EAC9B,uCAAuC,EACvC,kCAAkC,EAClC,uCAAuC,EACvC,oCAAoC,EACpC,sCAAsC,EACtC,2CAA2C,EAC3C,qBAAqB,EACrB,uBAAuB,EACvB,0BAA0B,EAC1B,yCAAyC,EACzC,kBAAkB,GACnB,MAAM,YAAY,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"regionAttachment2D.d.ts","sourceRoot":"","sources":["../src/regionAttachment2D.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAc,kBAAkB,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAC;AAU3F,wBAAgB,yCAAyC,CACvD,GAAG,EAAE,YAAY,EACjB,UAAU,EAAE,QAAQ,CAAC,kBAAkB,CAAC,EACxC,QAAQ,EAAE,QAAQ,CAAC,UAAU,CAAC,EAC9B,SAAS,EAAE,MAAM,GAChB,IAAI,CAkCN"}
1
+ {"version":3,"file":"regionAttachment2D.d.ts","sourceRoot":"","sources":["../src/regionAttachment2D.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAc,kBAAkB,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAC;AAU3F,wBAAgB,yCAAyC,CACvD,GAAG,EAAE,YAAY,EACjB,UAAU,EAAE,QAAQ,CAAC,kBAAkB,CAAC,EACxC,QAAQ,EAAE,QAAQ,CAAC,UAAU,CAAC,EAC9B,SAAS,EAAE,MAAM,GAChB,IAAI,CAqCN"}
@@ -8,10 +8,14 @@ const MATRIX_STRIDE = 6;
8
8
  // local transform) is transformed by the slot bone (`boneIndex`) world matrix. Requires
9
9
  // `computeSkeleton2DWorldTransforms` to have run. Out-parameter, allocation-free (module scratch).
10
10
  export function computeSkeleton2DRegionAttachmentVertices(out, attachment, skeleton, boneIndex) {
11
+ const world = skeleton.worldMatrices;
12
+ // A slot bound to no bone takes the sentinel rather than writing NaN corners — see
13
+ // skinSkeleton2DAttachmentPoints, which carries the same guard for the attachments that skin.
14
+ if (boneIndex < 0 || boneIndex * MATRIX_STRIDE >= world.length)
15
+ return;
11
16
  // Region local matrix (offset + rotation° + scale; regions carry no shear).
12
17
  setTransformMatrix(_local, attachment.scaleX, attachment.scaleY, attachment.rotation * DEG_TO_RAD, attachment.x, attachment.y);
13
18
  const b = boneIndex * MATRIX_STRIDE;
14
- const world = skeleton.worldMatrices;
15
19
  _bone.a = world[b];
16
20
  _bone.b = world[b + 1];
17
21
  _bone.c = world[b + 2];
@@ -1 +1 @@
1
- {"version":3,"file":"regionAttachment2D.js","sourceRoot":"","sources":["../src/regionAttachment2D.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,sBAAsB,EAAE,cAAc,EAAE,kBAAkB,EAAE,MAAM,6BAA6B,CAAC;AACzG,OAAO,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AAGrD,6EAA6E;AAC7E,MAAM,aAAa,GAAG,CAAC,CAAC;AAExB,yGAAyG;AACzG,yGAAyG;AACzG,yGAAyG;AACzG,wFAAwF;AACxF,mGAAmG;AACnG,MAAM,UAAU,yCAAyC,CACvD,GAAiB,EACjB,UAAwC,EACxC,QAA8B,EAC9B,SAAiB;IAEjB,4EAA4E;IAC5E,kBAAkB,CAChB,MAAM,EACN,UAAU,CAAC,MAAM,EACjB,UAAU,CAAC,MAAM,EACjB,UAAU,CAAC,QAAQ,GAAG,UAAU,EAChC,UAAU,CAAC,CAAC,EACZ,UAAU,CAAC,CAAC,CACb,CAAC;IACF,MAAM,CAAC,GAAG,SAAS,GAAG,aAAa,CAAC;IACpC,MAAM,KAAK,GAAG,QAAQ,CAAC,aAAa,CAAC;IACrC,KAAK,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;IACnB,KAAK,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;IACvB,KAAK,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;IACvB,KAAK,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;IACvB,KAAK,CAAC,EAAE,GAAG,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;IACxB,KAAK,CAAC,EAAE,GAAG,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;IACxB,wFAAwF;IACxF,cAAc,CAAC,SAAS,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC;IACzC,MAAM,EAAE,GAAG,UAAU,CAAC,KAAK,GAAG,CAAC,CAAC;IAChC,MAAM,EAAE,GAAG,UAAU,CAAC,MAAM,GAAG,CAAC,CAAC;IACjC,sBAAsB,CAAC,OAAO,EAAE,SAAS,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC;IACrD,GAAG,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC;IACnB,GAAG,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC;IACnB,sBAAsB,CAAC,OAAO,EAAE,SAAS,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;IACpD,GAAG,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC;IACnB,GAAG,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC;IACnB,sBAAsB,CAAC,OAAO,EAAE,SAAS,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC;IACnD,GAAG,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC;IACnB,GAAG,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC;IACnB,sBAAsB,CAAC,OAAO,EAAE,SAAS,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC;IACpD,GAAG,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC;IACnB,GAAG,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC;AACrB,CAAC;AAED,MAAM,MAAM,GAAe,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC;AACpE,MAAM,KAAK,GAAe,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC;AACnE,MAAM,SAAS,GAAe,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC;AACvE,MAAM,OAAO,GAAG,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC"}
1
+ {"version":3,"file":"regionAttachment2D.js","sourceRoot":"","sources":["../src/regionAttachment2D.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,sBAAsB,EAAE,cAAc,EAAE,kBAAkB,EAAE,MAAM,6BAA6B,CAAC;AACzG,OAAO,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AAGrD,6EAA6E;AAC7E,MAAM,aAAa,GAAG,CAAC,CAAC;AAExB,yGAAyG;AACzG,yGAAyG;AACzG,yGAAyG;AACzG,wFAAwF;AACxF,mGAAmG;AACnG,MAAM,UAAU,yCAAyC,CACvD,GAAiB,EACjB,UAAwC,EACxC,QAA8B,EAC9B,SAAiB;IAEjB,MAAM,KAAK,GAAG,QAAQ,CAAC,aAAa,CAAC;IACrC,mFAAmF;IACnF,8FAA8F;IAC9F,IAAI,SAAS,GAAG,CAAC,IAAI,SAAS,GAAG,aAAa,IAAI,KAAK,CAAC,MAAM;QAAE,OAAO;IACvE,4EAA4E;IAC5E,kBAAkB,CAChB,MAAM,EACN,UAAU,CAAC,MAAM,EACjB,UAAU,CAAC,MAAM,EACjB,UAAU,CAAC,QAAQ,GAAG,UAAU,EAChC,UAAU,CAAC,CAAC,EACZ,UAAU,CAAC,CAAC,CACb,CAAC;IACF,MAAM,CAAC,GAAG,SAAS,GAAG,aAAa,CAAC;IACpC,KAAK,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;IACnB,KAAK,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;IACvB,KAAK,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;IACvB,KAAK,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;IACvB,KAAK,CAAC,EAAE,GAAG,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;IACxB,KAAK,CAAC,EAAE,GAAG,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;IACxB,wFAAwF;IACxF,cAAc,CAAC,SAAS,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC;IACzC,MAAM,EAAE,GAAG,UAAU,CAAC,KAAK,GAAG,CAAC,CAAC;IAChC,MAAM,EAAE,GAAG,UAAU,CAAC,MAAM,GAAG,CAAC,CAAC;IACjC,sBAAsB,CAAC,OAAO,EAAE,SAAS,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC;IACrD,GAAG,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC;IACnB,GAAG,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC;IACnB,sBAAsB,CAAC,OAAO,EAAE,SAAS,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;IACpD,GAAG,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC;IACnB,GAAG,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC;IACnB,sBAAsB,CAAC,OAAO,EAAE,SAAS,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC;IACnD,GAAG,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC;IACnB,GAAG,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC;IACnB,sBAAsB,CAAC,OAAO,EAAE,SAAS,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC;IACpD,GAAG,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC;IACnB,GAAG,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC;AACrB,CAAC;AAED,MAAM,MAAM,GAAe,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC;AACpE,MAAM,KAAK,GAAe,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC;AACnE,MAAM,SAAS,GAAe,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC;AACvE,MAAM,OAAO,GAAG,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"skeleton2d.d.ts","sourceRoot":"","sources":["../src/skeleton2d.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAC;AAQjG,wBAAgB,eAAe,CAAC,QAAQ,EAAE,QAAQ,CAAC,UAAU,CAAC,GAAG,UAAU,CAS1E;AAMD,wBAAgB,6BAA6B,CAAC,QAAQ,EAAE,QAAQ,CAAC,UAAU,CAAC,GAAG,IAAI,CAYlF;AAOD,wBAAgB,mCAAmC,CAAC,QAAQ,EAAE,QAAQ,CAAC,UAAU,CAAC,EAAE,SAAS,EAAE,MAAM,GAAG,IAAI,CAoF3G;AAOD,wBAAgB,gCAAgC,CAAC,QAAQ,EAAE,QAAQ,CAAC,UAAU,CAAC,GAAG,IAAI,CAGrF;AAOD,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,KAAK,GAAE,UAAU,CAAC,OAAO,CAAQ,GAAG,UAAU,CAS/F;AAID,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,UAAU,GAAG,IAAI,CAG5D;AAED,wBAAgB,gBAAgB,CAAC,CAAC,EAAE,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC,EAAE,QAAQ,CAAC,UAAU,CAAC,GAAG,OAAO,CAyB1F;AAGD,wBAAgB,4BAA4B,CAAC,QAAQ,EAAE,QAAQ,CAAC,UAAU,CAAC,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAMjG;AAID,wBAAgB,4BAA4B,CAC1C,GAAG,EAAE,UAAU,EACf,QAAQ,EAAE,QAAQ,CAAC,UAAU,CAAC,EAC9B,SAAS,EAAE,MAAM,GAChB,OAAO,CAIT;AAID,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,QAAQ,CAAC,UAAU,CAAC,EAAE,IAAI,EAAE,MAAM,GAAG,gBAAgB,GAAG,IAAI,CAOvG;AAGD,wBAAgB,qBAAqB,CAAC,QAAQ,EAAE,QAAQ,CAAC,UAAU,CAAC,GAAG,IAAI,CAU1E;AAeD,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,UAAU,EAAE,IAAI,EAAE,QAAQ,CAAC,gBAAgB,CAAC,GAAG,IAAI,CAM9F;AAID,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,QAAQ,CAAC,UAAU,CAAC,GAAG,MAAM,GAAG,IAAI,CAiBhF"}
1
+ {"version":3,"file":"skeleton2d.d.ts","sourceRoot":"","sources":["../src/skeleton2d.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAC;AAQjG,wBAAgB,eAAe,CAAC,QAAQ,EAAE,QAAQ,CAAC,UAAU,CAAC,GAAG,UAAU,CAS1E;AAMD,wBAAgB,6BAA6B,CAAC,QAAQ,EAAE,QAAQ,CAAC,UAAU,CAAC,GAAG,IAAI,CAYlF;AAOD,wBAAgB,mCAAmC,CAAC,QAAQ,EAAE,QAAQ,CAAC,UAAU,CAAC,EAAE,SAAS,EAAE,MAAM,GAAG,IAAI,CAoF3G;AAUD,wBAAgB,gCAAgC,CAAC,QAAQ,EAAE,QAAQ,CAAC,UAAU,CAAC,GAAG,IAAI,CAGrF;AAOD,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,KAAK,GAAE,UAAU,CAAC,OAAO,CAAQ,GAAG,UAAU,CAS/F;AAID,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,UAAU,GAAG,IAAI,CAG5D;AAED,wBAAgB,gBAAgB,CAAC,CAAC,EAAE,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC,EAAE,QAAQ,CAAC,UAAU,CAAC,GAAG,OAAO,CAyB1F;AAGD,wBAAgB,4BAA4B,CAAC,QAAQ,EAAE,QAAQ,CAAC,UAAU,CAAC,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAMjG;AAID,wBAAgB,4BAA4B,CAC1C,GAAG,EAAE,UAAU,EACf,QAAQ,EAAE,QAAQ,CAAC,UAAU,CAAC,EAC9B,SAAS,EAAE,MAAM,GAChB,OAAO,CAIT;AAID,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,QAAQ,CAAC,UAAU,CAAC,EAAE,IAAI,EAAE,MAAM,GAAG,gBAAgB,GAAG,IAAI,CAOvG;AAGD,wBAAgB,qBAAqB,CAAC,QAAQ,EAAE,QAAQ,CAAC,UAAU,CAAC,GAAG,IAAI,CAU1E;AAeD,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,UAAU,EAAE,IAAI,EAAE,QAAQ,CAAC,gBAAgB,CAAC,GAAG,IAAI,CAM9F;AAID,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,QAAQ,CAAC,UAAU,CAAC,GAAG,MAAM,GAAG,IAAI,CAiBhF"}
@@ -130,8 +130,11 @@ export function computeSkeleton2DBoneWorldTransform(skeleton, boneIndex) {
130
130
  // Propagates each bone's world transform from its local setup transform (x/y/rotation/scale/shear) and its
131
131
  // parent's world transform, honoring the bone's inherit mode. One linear pass over the parent-before-child
132
132
  // ordered array (`worldMatrices[i]` reads `worldMatrices[parentIndex]`, already written). Out-parameter,
133
- // allocation-free. Angles are converted degrees→radians at this seam. Position always inherits fully (the
134
- // local origin is placed by the parent); the inherit mode only changes the linear (rotation/scale) part.
133
+ // allocation-free. Angles are converted degrees→radians at this seam. All four inherit axes are honored
134
+ // here, translation included: a bone whose `transformMode.translation` is false takes its local (x, y) as
135
+ // its world position outright rather than being placed by its parent. Every `TransformMode2D` preset
136
+ // inherits translation, so reaching that branch means a hand-built `TransformInherit2D`, which `Bone2D`
137
+ // admits by design.
135
138
  export function computeSkeleton2DWorldTransforms(skeleton) {
136
139
  const count = skeleton.bones.length;
137
140
  for (let i = 0; i < count; i++)
@@ -1 +1 @@
1
- {"version":3,"file":"skeleton2d.js","sourceRoot":"","sources":["../src/skeleton2d.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"skeleton2d.js","sourceRoot":"","sources":["../src/skeleton2d.ts"],"names":[],"mappings":"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"}
@@ -10,6 +10,7 @@ export declare function createSkeleton2DSlotAnimationTarget(slotIndex: number, p
10
10
  */
11
11
  export declare function findSkeleton2DStepKeyframe(times: ArrayLike<number>, time: number): number;
12
12
  export declare function getSkeleton2DAnimationTargetBinder(kind: Skeleton2DAnimationTargetKind): Skeleton2DAnimationTargetBinder | null;
13
+ export declare function getSkeleton2DAnimationTargetBinderKinds(): readonly Skeleton2DAnimationTargetKind[];
13
14
  export declare function registerSkeleton2DAnimationTargetBinder(kind: Skeleton2DAnimationTargetKind, bind: Skeleton2DAnimationTargetBinder): void;
14
15
  export declare function unregisterSkeleton2DAnimationTargetBinder(kind: Skeleton2DAnimationTargetKind): void;
15
16
  //# sourceMappingURL=skeleton2dAnimationTarget.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"skeleton2dAnimationTarget.d.ts","sourceRoot":"","sources":["../src/skeleton2dAnimationTarget.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAEV,YAAY,EAEZ,uBAAuB,EACvB,yBAAyB,EACzB,+BAA+B,EAC/B,6BAA6B,EAC7B,2BAA2B,EAC3B,6BAA6B,EAE9B,MAAM,0BAA0B,CAAC;AAWlC,wBAAgB,mCAAmC,CACjD,SAAS,EAAE,MAAM,EACjB,IAAI,EAAE,uBAAuB,GAC5B,yBAAyB,CAE3B;AAID,wBAAgB,mCAAmC,CACjD,SAAS,EAAE,MAAM,EACjB,IAAI,EAAE,2BAA2B,EACjC,WAAW,GAAE,SAAS,CAAC,YAAY,GAAG,IAAI,CAAC,EAAE,GAAG,IAAW,GAC1D,6BAA6B,CAE/B;AAED;;;;;;GAMG;AACH,wBAAgB,0BAA0B,CAAC,KAAK,EAAE,SAAS,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAOzF;AAID,wBAAgB,kCAAkC,CAChD,IAAI,EAAE,6BAA6B,GAClC,+BAA+B,GAAG,IAAI,CAExC;AAMD,wBAAgB,uCAAuC,CACrD,IAAI,EAAE,6BAA6B,EACnC,IAAI,EAAE,+BAA+B,GACpC,IAAI,CAEN;AAED,wBAAgB,yCAAyC,CAAC,IAAI,EAAE,6BAA6B,GAAG,IAAI,CAEnG"}
1
+ {"version":3,"file":"skeleton2dAnimationTarget.d.ts","sourceRoot":"","sources":["../src/skeleton2dAnimationTarget.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAEV,YAAY,EAGZ,uBAAuB,EACvB,yBAAyB,EACzB,+BAA+B,EAC/B,6BAA6B,EAC7B,2BAA2B,EAC3B,6BAA6B,EAE9B,MAAM,0BAA0B,CAAC;AAWlC,wBAAgB,mCAAmC,CACjD,SAAS,EAAE,MAAM,EACjB,IAAI,EAAE,uBAAuB,GAC5B,yBAAyB,CAE3B;AAID,wBAAgB,mCAAmC,CACjD,SAAS,EAAE,MAAM,EACjB,IAAI,EAAE,2BAA2B,EACjC,WAAW,GAAE,SAAS,CAAC,YAAY,GAAG,IAAI,CAAC,EAAE,GAAG,IAAW,GAC1D,6BAA6B,CAE/B;AAED;;;;;;GAMG;AACH,wBAAgB,0BAA0B,CAAC,KAAK,EAAE,SAAS,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAOzF;AAID,wBAAgB,kCAAkC,CAChD,IAAI,EAAE,6BAA6B,GAClC,+BAA+B,GAAG,IAAI,CAExC;AAID,wBAAgB,uCAAuC,IAAI,SAAS,6BAA6B,EAAE,CAIlG;AAMD,wBAAgB,uCAAuC,CACrD,IAAI,EAAE,6BAA6B,EACnC,IAAI,EAAE,+BAA+B,GACpC,IAAI,CAEN;AAED,wBAAgB,yCAAyC,CAAC,IAAI,EAAE,6BAA6B,GAAG,IAAI,CAEnG"}
@@ -1,4 +1,5 @@
1
1
  import { sampleAnimationTrack } from '@flighthq/animation/contract';
2
+ import { createKeyedTable, getRegistryTableEntry, getRegistryTableKeys, withRegistryTableEntry, withoutRegistryTableEntry, } from '@flighthq/registry/contract';
2
3
  import { Skeleton2DAnimationPath as BonePath, Skeleton2DAnimationTargetKind as TargetKind, Skeleton2DSlotAnimationPath as SlotPath, } from '@flighthq/types/contract';
3
4
  import { reportSkeleton2DCoercedInterpolation } from './skeleton2dGuards';
4
5
  // The binding target for a bone transform channel. Prefer this over a literal: `kind` is what the binder
@@ -31,17 +32,24 @@ export function findSkeleton2DStepKeyframe(times, time) {
31
32
  // The binder registered for a target kind, or null when nothing claims it — the sentinel a channel with a
32
33
  // foreign or unregistered target is skipped on.
33
34
  export function getSkeleton2DAnimationTargetBinder(kind) {
34
- return _binders.get(kind) ?? null;
35
+ return getRegistryTableEntry(getSkeleton2DAnimationTargetBinderRegistry(), kind);
36
+ }
37
+ // A sorted snapshot of every target kind with a binder. The array is detached from process-wide registry
38
+ // state, so callers can inspect or mutate it without changing which channels the posing pass can bind.
39
+ export function getSkeleton2DAnimationTargetBinderKinds() {
40
+ const kinds = [];
41
+ getRegistryTableKeys(kinds, getSkeleton2DAnimationTargetBinderRegistry());
42
+ return kinds;
35
43
  }
36
44
  // Claims a target kind for a binder, so a family this package does not own — a constraint solver's
37
45
  // channels, a vendor's own rig feature — poses through the same single pass as bones and slots instead of
38
46
  // needing a second one. Last write wins, which is what lets a caller replace a built-in binding; collisions
39
47
  // between third parties are avoided by the vendor-prefix convention rather than by a guard.
40
48
  export function registerSkeleton2DAnimationTargetBinder(kind, bind) {
41
- _binders.set(kind, bind);
49
+ _binders = withRegistryTableEntry(getSkeleton2DAnimationTargetBinderRegistry(), kind, bind);
42
50
  }
43
51
  export function unregisterSkeleton2DAnimationTargetBinder(kind) {
44
- _binders.delete(kind);
52
+ _binders = withoutRegistryTableEntry(getSkeleton2DAnimationTargetBinderRegistry(), kind);
45
53
  }
46
54
  // Composes one bone channel's sampled delta onto the setup bone. Translate, rotate and shear ADD; scale
47
55
  // MULTIPLIES. Reading from `setup` rather than from `pose` is what keeps a clip blendable and what stops
@@ -160,13 +168,17 @@ function clampColorChannel(value) {
160
168
  // The bone and slot binders are entered here rather than through an `enable*` call the caller has to
161
169
  // remember, because posing a rig from a clip is what this package IS — a skeleton2d bundle that shed the
162
170
  // bone binder would leave `applyAnimationClipToSkeleton2D` a silent no-op. Every family beyond those two
163
- // registers explicitly and shakes out when unused, which is the part the registry buys. Filling a private
164
- // map with this module's own functions reaches nothing outside the module, so importing it still registers
165
- // nothing observable.
166
- const _binders = new Map([
167
- [TargetKind.Bone, bindSkeleton2DBoneChannel],
168
- [TargetKind.Slot, bindSkeleton2DSlotChannel],
169
- ]);
171
+ // registers explicitly and shakes out when unused, which is the part the registry buys. The table is
172
+ // created on first use, so importing the package performs no observable registration.
173
+ function getSkeleton2DAnimationTargetBinderRegistry() {
174
+ if (_binders !== null)
175
+ return _binders;
176
+ _binders = createKeyedTable('Skeleton2DAnimationTargetBinder', 'Unclaimed');
177
+ _binders = withRegistryTableEntry(_binders, TargetKind.Bone, bindSkeleton2DBoneChannel);
178
+ _binders = withRegistryTableEntry(_binders, TargetKind.Slot, bindSkeleton2DSlotChannel);
179
+ return _binders;
180
+ }
181
+ let _binders = null;
170
182
  const _scratch = [0, 0, 0, 0];
171
183
  // The walk every non-blendable channel is forced onto, named once so the guard and the walk agree.
172
184
  const STEP_INTERPOLATION = 'Step';
@@ -1 +1 @@
1
- {"version":3,"file":"skeleton2dAnimationTarget.js","sourceRoot":"","sources":["../src/skeleton2dAnimationTarget.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"skeleton2dAnimationTarget.js","sourceRoot":"","sources":["../src/skeleton2dAnimationTarget.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"skinAttachment2DPoints.d.ts","sourceRoot":"","sources":["../src/skinAttachment2DPoints.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,0BAA0B,CAAC;AAmCnE,wBAAgB,8BAA8B,CAC5C,GAAG,EAAE,YAAY,GAAG,MAAM,EAAE,EAC5B,IAAI,EAAE,QAAQ,CAAC,MAAM,CAAC,GAAG,IAAI,GAAG,SAAS,EACzC,QAAQ,EAAE,QAAQ,CAAC,YAAY,CAAC,GAAG,IAAI,GAAG,SAAS,EACnD,QAAQ,EAAE,QAAQ,CAAC,UAAU,CAAC,EAC9B,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,QAAQ,CAAC,YAAY,CAAC,GAAG,IAAI,EACrC,OAAO,EAAE,MAAM,GACd,IAAI,CAoDN"}
1
+ {"version":3,"file":"skinAttachment2DPoints.d.ts","sourceRoot":"","sources":["../src/skinAttachment2DPoints.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,0BAA0B,CAAC;AAmCnE,wBAAgB,8BAA8B,CAC5C,GAAG,EAAE,YAAY,GAAG,MAAM,EAAE,EAC5B,IAAI,EAAE,QAAQ,CAAC,MAAM,CAAC,GAAG,IAAI,GAAG,SAAS,EACzC,QAAQ,EAAE,QAAQ,CAAC,YAAY,CAAC,GAAG,IAAI,GAAG,SAAS,EACnD,QAAQ,EAAE,QAAQ,CAAC,UAAU,CAAC,EAC9B,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,QAAQ,CAAC,YAAY,CAAC,GAAG,IAAI,EACrC,OAAO,EAAE,MAAM,GACd,IAAI,CA2DN"}
@@ -64,6 +64,14 @@ export function skinSkeleton2DAttachmentPoints(out, skin, vertices, skeleton, bo
64
64
  }
65
65
  if (vertices === null || vertices === undefined)
66
66
  return;
67
+ // A slot bound to no bone is an ASSET fact, not a programmer error: an importer resolving a slot's bone
68
+ // name against the bone array emits -1 when the file names one that is not there, and a skeleton holding
69
+ // that slot is valid — validateSkeleton2D checks bone parentage and buffer lengths, never slot bones. So
70
+ // it takes the sentinel, leaving `out` as the caller last saw it. Reading on would index the world buffer
71
+ // at a negative offset, and every coordinate written from there is NaN: a mesh that draws nothing, and a
72
+ // bounding box no hit test can ever match, with no symptom pointing back at the rig.
73
+ if (boneIndex < 0 || boneIndex * MATRIX_STRIDE >= world.length)
74
+ return;
67
75
  const offsets = deform !== null && deform.length === vertices.length ? deform : null;
68
76
  if (deform !== null && offsets === null) {
69
77
  reportSkeleton2DDeformLengthMismatch(subject, deform.length, vertices.length);
@@ -1 +1 @@
1
- {"version":3,"file":"skinAttachment2DPoints.js","sourceRoot":"","sources":["../src/skinAttachment2DPoints.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"skinAttachment2DPoints.js","sourceRoot":"","sources":["../src/skinAttachment2DPoints.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"slotDeform2D.d.ts","sourceRoot":"","sources":["../src/slotDeform2D.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,EAAE,MAAM,0BAA0B,CAAC;AAe7E,wBAAgB,8BAA8B,CAAC,IAAI,EAAE,QAAQ,CAAC,MAAM,CAAC,GAAG,QAAQ,CAAC,YAAY,CAAC,GAAG,IAAI,CAIpG;AAKD,wBAAgB,uBAAuB,CACrC,IAAI,EAAE,MAAM,EACZ,UAAU,EAAE,oBAAoB,CAAC,YAAY,CAAC,EAC9C,OAAO,EAAE,QAAQ,CAAC,YAAY,CAAC,GAAG,IAAI,GACrC,oBAAoB,GAAG,IAAI,CAc7B"}
1
+ {"version":3,"file":"slotDeform2D.d.ts","sourceRoot":"","sources":["../src/slotDeform2D.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,EAAE,MAAM,0BAA0B,CAAC;AAiB7E,wBAAgB,8BAA8B,CAAC,IAAI,EAAE,QAAQ,CAAC,MAAM,CAAC,GAAG,QAAQ,CAAC,YAAY,CAAC,GAAG,IAAI,CAIpG;AAKD,wBAAgB,uBAAuB,CACrC,IAAI,EAAE,MAAM,EACZ,UAAU,EAAE,oBAAoB,CAAC,YAAY,CAAC,EAC9C,OAAO,EAAE,QAAQ,CAAC,YAAY,CAAC,GAAG,IAAI,GACrC,oBAAoB,GAAG,IAAI,CAc7B"}
@@ -4,10 +4,12 @@
4
4
  // This one comparison is the whole reason `Skeleton2DSlotDeform` pairs offsets with an attachment. A slot
5
5
  // that swaps attachments keeps whatever deform was last written to it — the attachment-swap binder writes
6
6
  // `slot.attachment` and nothing else, by design — so without this check the old art's offsets would deform
7
- // the new art. A length check cannot stand in for it: of the three ways a swap changes size, only swapping
8
- // to a LARGER attachment is detectable that way, while EQUAL and SMALLER both satisfy the deformers' `>=`
9
- // and pass silently. Equal is also the common case, because matching point counts are what make a swap
10
- // look continuous.
7
+ // the new art. A length check cannot stand in for it. The deformers match their stream length EXACTLY, so
8
+ // a swap to a differently sized attachment does also trip that check but a swap to an EQUALLY sized one
9
+ // satisfies it perfectly and applies the wrong art's offsets in silence, and equal is the COMMON case,
10
+ // because matching point counts are what make a swap look continuous in the first place. The other two
11
+ // sizes are no argument for a length check either: it rejects them while naming the wrong cause, reporting
12
+ // a malformed offset stream when what actually happened is that the slot is wearing something else.
11
13
  //
12
14
  // Identity comparison, not equality: the record names the attachment object it was authored against, and
13
15
  // re-reading it here is the invalidation doctrine's compare-identities rule at a pull seam.
@@ -1 +1 @@
1
- {"version":3,"file":"slotDeform2D.js","sourceRoot":"","sources":["../src/slotDeform2D.ts"],"names":[],"mappings":"AAEA,0GAA0G;AAC1G,qDAAqD;AACrD,EAAE;AACF,0GAA0G;AAC1G,0GAA0G;AAC1G,2GAA2G;AAC3G,2GAA2G;AAC3G,0GAA0G;AAC1G,uGAAuG;AACvG,mBAAmB;AACnB,EAAE;AACF,yGAAyG;AACzG,4FAA4F;AAC5F,MAAM,UAAU,8BAA8B,CAAC,IAAsB;IACnE,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;IAC3B,IAAI,MAAM,KAAK,SAAS,IAAI,MAAM,KAAK,IAAI;QAAE,OAAO,IAAI,CAAC;IACzD,OAAO,MAAM,CAAC,UAAU,KAAK,CAAC,IAAI,CAAC,UAAU,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC;AACjF,CAAC;AAED,wGAAwG;AACxG,sGAAsG;AACtG,uEAAuE;AACvE,MAAM,UAAU,uBAAuB,CACrC,IAAY,EACZ,UAA8C,EAC9C,OAAsC;IAEtC,IAAI,OAAO,KAAK,IAAI,EAAE,CAAC;QACrB,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC;QACnB,OAAO,IAAI,CAAC;IACd,CAAC;IACD,MAAM,QAAQ,GAAG,IAAI,CAAC,MAAM,CAAC;IAC7B,IAAI,QAAQ,KAAK,SAAS,IAAI,QAAQ,KAAK,IAAI,IAAI,QAAQ,CAAC,OAAO,CAAC,MAAM,KAAK,OAAO,CAAC,MAAM,EAAE,CAAC;QAC9F,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QAC9B,QAAQ,CAAC,UAAU,GAAG,UAAU,CAAC;QACjC,OAAO,QAAQ,CAAC;IAClB,CAAC;IACD,MAAM,MAAM,GAAyB,EAAE,UAAU,EAAE,OAAO,EAAE,YAAY,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;IACzF,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;IACrB,OAAO,MAAM,CAAC;AAChB,CAAC"}
1
+ {"version":3,"file":"slotDeform2D.js","sourceRoot":"","sources":["../src/slotDeform2D.ts"],"names":[],"mappings":"AAEA,0GAA0G;AAC1G,qDAAqD;AACrD,EAAE;AACF,0GAA0G;AAC1G,0GAA0G;AAC1G,2GAA2G;AAC3G,0GAA0G;AAC1G,0GAA0G;AAC1G,uGAAuG;AACvG,uGAAuG;AACvG,2GAA2G;AAC3G,oGAAoG;AACpG,EAAE;AACF,yGAAyG;AACzG,4FAA4F;AAC5F,MAAM,UAAU,8BAA8B,CAAC,IAAsB;IACnE,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;IAC3B,IAAI,MAAM,KAAK,SAAS,IAAI,MAAM,KAAK,IAAI;QAAE,OAAO,IAAI,CAAC;IACzD,OAAO,MAAM,CAAC,UAAU,KAAK,CAAC,IAAI,CAAC,UAAU,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC;AACjF,CAAC;AAED,wGAAwG;AACxG,sGAAsG;AACtG,uEAAuE;AACvE,MAAM,UAAU,uBAAuB,CACrC,IAAY,EACZ,UAA8C,EAC9C,OAAsC;IAEtC,IAAI,OAAO,KAAK,IAAI,EAAE,CAAC;QACrB,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC;QACnB,OAAO,IAAI,CAAC;IACd,CAAC;IACD,MAAM,QAAQ,GAAG,IAAI,CAAC,MAAM,CAAC;IAC7B,IAAI,QAAQ,KAAK,SAAS,IAAI,QAAQ,KAAK,IAAI,IAAI,QAAQ,CAAC,OAAO,CAAC,MAAM,KAAK,OAAO,CAAC,MAAM,EAAE,CAAC;QAC9F,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QAC9B,QAAQ,CAAC,UAAU,GAAG,UAAU,CAAC;QACjC,OAAO,QAAQ,CAAC;IAClB,CAAC;IACD,MAAM,MAAM,GAAyB,EAAE,UAAU,EAAE,OAAO,EAAE,YAAY,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;IACzF,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;IACrB,OAAO,MAAM,CAAC;AAChB,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@flighthq/skeleton2d",
3
- "version": "0.3.0",
3
+ "version": "0.3.1-next.1041.35b950c",
4
4
  "author": "Joshua Granick and other contributors",
5
5
  "license": "MIT",
6
6
  "repository": {
@@ -38,14 +38,15 @@
38
38
  "clean:dist": "tsx ../../scripts/clean-package-dist.ts"
39
39
  },
40
40
  "dependencies": {
41
- "@flighthq/animation": "0.3.0",
42
- "@flighthq/entity": "0.3.0",
43
- "@flighthq/geometry": "0.3.0",
44
- "@flighthq/log": "0.3.0",
45
- "@flighthq/node": "0.3.0",
46
- "@flighthq/math": "0.3.0",
47
- "@flighthq/path": "0.3.0",
48
- "@flighthq/types": "0.3.0"
41
+ "@flighthq/animation": "0.3.1-next.1041.35b950c",
42
+ "@flighthq/entity": "0.3.1-next.1041.35b950c",
43
+ "@flighthq/geometry": "0.3.1-next.1041.35b950c",
44
+ "@flighthq/log": "0.3.1-next.1041.35b950c",
45
+ "@flighthq/node": "0.3.1-next.1041.35b950c",
46
+ "@flighthq/math": "0.3.1-next.1041.35b950c",
47
+ "@flighthq/path": "0.3.1-next.1041.35b950c",
48
+ "@flighthq/registry": "0.3.1-next.1041.35b950c",
49
+ "@flighthq/types": "0.3.1-next.1041.35b950c"
49
50
  },
50
51
  "devDependencies": {
51
52
  "typescript": "^5.3.0"
@@ -74,6 +74,40 @@ describe('applyAnimationClipToSkeleton2D', () => {
74
74
  expect(pose.bones[0].shearY).toBeCloseTo(10, 5); // 4 + 6
75
75
  });
76
76
 
77
+ // The six per-axis paths are one-line siblings of each other, which is the shape where a copy-paste to
78
+ // the wrong field survives review — and four of the six were exercised somewhere while ScaleX and ShearY
79
+ // appeared in no test at all. Walking the whole family from one table is what makes that impossible to
80
+ // drift back into: every setup value below is distinct, so writing any other field is visible.
81
+ //
82
+ // The second assertion is the one the source comment earns: a per-axis channel reads a ONE-component
83
+ // track and touches a single field, leaving the other axis at whatever the clone of setup gave it. That
84
+ // is what lets two independently-timed axis channels share a bone instead of resetting each other, and a
85
+ // path that wrote both axes would still satisfy the first assertion alone.
86
+ it.each([
87
+ ['TranslationX', Skeleton2DAnimationPath.TranslationX, 10, 'x', 13, 'y', 5],
88
+ ['TranslationY', Skeleton2DAnimationPath.TranslationY, 10, 'y', 15, 'x', 3],
89
+ ['ScaleX', Skeleton2DAnimationPath.ScaleX, 3, 'scaleX', 6, 'scaleY', 4],
90
+ ['ScaleY', Skeleton2DAnimationPath.ScaleY, 3, 'scaleY', 12, 'scaleX', 2],
91
+ ['ShearX', Skeleton2DAnimationPath.ShearX, 10, 'shearX', 17, 'shearY', 9],
92
+ ['ShearY', Skeleton2DAnimationPath.ShearY, 10, 'shearY', 19, 'shearX', 7],
93
+ ] as const)(
94
+ 'poses %s from a one-component track, touching only its own axis',
95
+ (_name, path, sample, field, expected, sibling, siblingValue) => {
96
+ const setup = createSkeleton2D([makeBone({ scaleX: 2, scaleY: 4, shearX: 7, shearY: 9, x: 3, y: 5 })]);
97
+ const pose = cloneSkeleton2D(setup);
98
+ const clip = createAnimationClip([
99
+ createAnimationChannel(scalarTrack([0, 1], [sample, sample], 1), createSkeleton2DBoneAnimationTarget(0, path)),
100
+ ]);
101
+
102
+ applyAnimationClipToSkeleton2D(clip, setup, pose, 1);
103
+
104
+ // Scale composes multiplicatively where translation and shear compose additively — the table carries
105
+ // both rules rather than assuming one.
106
+ expect(pose.bones[0][field]).toBeCloseTo(expected, 5);
107
+ expect(pose.bones[0][sibling]).toBeCloseTo(siblingValue, 5);
108
+ },
109
+ );
110
+
77
111
  it('re-applies from setup each frame — no accumulation across repeated calls', () => {
78
112
  const setup = createSkeleton2D([makeBone({ rotation: 10 })]);
79
113
  const pose = cloneSkeleton2D(setup);
@@ -129,6 +129,67 @@ describe('solveSkeleton2DIkConstraint', () => {
129
129
  expect(skeleton.bones[1].rotation).toBeCloseTo(-90, 5);
130
130
  });
131
131
 
132
+ it('lengthens a single bone onto a target past its reach when stretch is on', () => {
133
+ const skeleton = createSkeleton2D([makeBone({ length: 10 }), makeBone({ x: 25, y: 0 })]);
134
+ computeSkeleton2DWorldTransforms(skeleton);
135
+
136
+ solveSkeleton2DIkConstraint(skeleton, ik({ stretch: true }));
137
+
138
+ expect(tipOf(skeleton, 0).x).toBeCloseTo(25, 4);
139
+ expect(skeleton.bones[0].scaleX).toBeCloseTo(2.5, 5);
140
+ // Uniform, not axial. Only scaleX changes how far the tip reaches, so scaling scaleY with it is a
141
+ // deliberate choice to keep the bone's proportions rather than draw it stretched thin — the same
142
+ // choice the two-bone path makes on its parent. Pinned because nothing else would notice it going.
143
+ expect(skeleton.bones[0].scaleY).toBeCloseTo(2.5, 5);
144
+ });
145
+
146
+ it('shortens a single bone onto a target inside its reach when compress is on', () => {
147
+ const skeleton = createSkeleton2D([makeBone({ length: 10 }), makeBone({ x: 4, y: 0 })]);
148
+ computeSkeleton2DWorldTransforms(skeleton);
149
+
150
+ solveSkeleton2DIkConstraint(skeleton, ik({ compress: true }));
151
+
152
+ expect(tipOf(skeleton, 0).x).toBeCloseTo(4, 4);
153
+ expect(skeleton.bones[0].scaleX).toBeCloseTo(0.4, 5);
154
+ });
155
+
156
+ // The two halves are separate permissions, not one "resize" switch, and nothing pinned that. Each case
157
+ // below is the OTHER flag's direction: a stretch-only bone asked to shorten, and a compress-only bone
158
+ // asked to lengthen. Both must sit at their authored length and overshoot or fall short, because a limb
159
+ // that may only extend has no business contracting.
160
+ it('leaves a stretch-only bone at its own length when the target is nearer than its tip', () => {
161
+ const skeleton = createSkeleton2D([makeBone({ length: 10 }), makeBone({ x: 4, y: 0 })]);
162
+ computeSkeleton2DWorldTransforms(skeleton);
163
+
164
+ solveSkeleton2DIkConstraint(skeleton, ik({ stretch: true }));
165
+
166
+ expect(skeleton.bones[0].scaleX).toBe(1);
167
+ expect(tipOf(skeleton, 0).x).toBeCloseTo(10, 4);
168
+ });
169
+
170
+ it('leaves a compress-only bone at its own length when the target is past its tip', () => {
171
+ const skeleton = createSkeleton2D([makeBone({ length: 10 }), makeBone({ x: 25, y: 0 })]);
172
+ computeSkeleton2DWorldTransforms(skeleton);
173
+
174
+ solveSkeleton2DIkConstraint(skeleton, ik({ compress: true }));
175
+
176
+ expect(skeleton.bones[0].scaleX).toBe(1);
177
+ expect(tipOf(skeleton, 0).x).toBeCloseTo(10, 4);
178
+ });
179
+
180
+ // Resizing blends by mix on its own terms rather than riding the rotation blend: the target is straight
181
+ // ahead, so there is no rotation to blend and the only thing mix can be scaling here is the stretch.
182
+ it('blends the stretch by mix, so a half-applied constraint reaches half the extra distance', () => {
183
+ const skeleton = createSkeleton2D([makeBone({ length: 10 }), makeBone({ x: 25, y: 0 })]);
184
+ computeSkeleton2DWorldTransforms(skeleton);
185
+
186
+ solveSkeleton2DIkConstraint(skeleton, ik({ mix: 0.5, stretch: true }));
187
+
188
+ // wanted = 2.5, so a half-applied scale is 1 + (2.5 - 1) * 0.5 = 1.75.
189
+ expect(skeleton.bones[0].scaleX).toBeCloseTo(1.75, 5);
190
+ expect(tipOf(skeleton, 0).x).toBeCloseTo(17.5, 4);
191
+ });
192
+
132
193
  it('lands a two-bone chain tip on a target inside its reach', () => {
133
194
  const skeleton = createSkeleton2D([
134
195
  makeBone({ length: 10 }),
@@ -166,6 +227,32 @@ describe('solveSkeleton2DIkConstraint', () => {
166
227
  expect(up.worldMatrices[1 * 6 + 5]).not.toBeCloseTo(down.worldMatrices[1 * 6 + 5], 2);
167
228
  });
168
229
 
230
+ // The other unreachable case, and the one with no test: a target too CLOSE rather than too far. Unequal
231
+ // bone lengths leave a dead zone around the parent's origin — a 10 and a 6 fold down to 4 and no further
232
+ // — so the tip overshoots a target inside it however hard the joint bends. Asserted as a position rather
233
+ // than as the joint angle, because the position is the thing a rig author sees go wrong.
234
+ //
235
+ // This pins the BEHAVIOR, not the branch that produces it: the solver's explicit dead-zone case and its
236
+ // general law-of-cosines case agree here, because the general case clamps its acos arguments into range
237
+ // and that clamping lands on the same fold. Deleting the dead-zone branch leaves this test green.
238
+ it('folds as far as it can and overshoots a target inside the dead zone', () => {
239
+ const skeleton = createSkeleton2D([
240
+ makeBone({ length: 10 }),
241
+ makeBone({ length: 6, parentIndex: 0, x: 10 }),
242
+ makeBone({ x: 2, y: 0 }),
243
+ ]);
244
+ computeSkeleton2DWorldTransforms(skeleton);
245
+
246
+ solveSkeleton2DIkConstraint(skeleton, ik({ boneIndices: [0, 1], targetBoneIndex: 2 }));
247
+ computeSkeleton2DWorldTransforms(skeleton);
248
+
249
+ // Folded flat: the joint sits at the parent's full 10, and the child doubles back its whole 6 to 4 —
250
+ // still 2 past the target at 2, which is the closest this chain can physically come.
251
+ expect(skeleton.worldMatrices[1 * 6 + 4]).toBeCloseTo(10, 4);
252
+ expect(tipOf(skeleton, 1).x).toBeCloseTo(4, 4);
253
+ expect(tipOf(skeleton, 1).y).toBeCloseTo(0, 4);
254
+ });
255
+
169
256
  it('straightens and falls short of an unreachable target when stretch is off', () => {
170
257
  const skeleton = createSkeleton2D([
171
258
  makeBone({ length: 10 }),
@@ -197,6 +284,64 @@ describe('solveSkeleton2DIkConstraint', () => {
197
284
  expect(skeleton.bones[0].scaleX).toBeCloseTo(2, 5);
198
285
  });
199
286
 
287
+ // ★ THE PARAMETER SPACE, AS A STANDING PROPERTY RATHER THAN A NUMBER IN A REPORT.
288
+ //
289
+ // When the dead-zone branch was removed as redundant, the evidence was a sweep of 1,536 parameter
290
+ // combinations showing byte-identical output with and without it. That sweep lived in a scratch probe
291
+ // and was deleted with it, which left the removal resting on a figure in a message — integration
292
+ // flagged that it was the ONLY evidence, since no committed test enumerated the space. This is that
293
+ // evidence, made durable and turned the right way round: it does not assert what the old branch did,
294
+ // it asserts what the SOLVER MUST DO, so it constrains every future edit rather than one past one.
295
+ //
296
+ // The property is the definition of a two-bone solve, and it has exactly three cases with no gaps
297
+ // between them. For a target at distance d from the parent's origin, with the chain fully mixed:
298
+ // d > pL + cL out of reach — the chain straightens, the tip sits at pL + cL along the aim
299
+ // d < |pL - cL| dead zone — the chain folds, the tip sits at |pL - cL| along the aim
300
+ // otherwise reachable — the tip lands ON the target
301
+ // Anything that breaks a clamp, an angle, or the branch structure lands outside one of the three.
302
+ it('places the tip correctly across the whole reachable/unreachable/dead-zone space', () => {
303
+ const lengths = [10, 6, 3, 12.5];
304
+ const targets = [-8, -2, -0.5, 0.5, 2, 5, 9, 30];
305
+ let checked = 0;
306
+
307
+ for (const parentLength of lengths) {
308
+ for (const childLength of lengths) {
309
+ for (const tx of targets) {
310
+ for (const ty of [0, -3, 4.5]) {
311
+ for (const bendPositive of [true, false]) {
312
+ const skeleton = createSkeleton2D([
313
+ makeBone({ length: parentLength }),
314
+ makeBone({ length: childLength, parentIndex: 0, x: parentLength }),
315
+ makeBone({ x: tx, y: ty }),
316
+ ]);
317
+ computeSkeleton2DWorldTransforms(skeleton);
318
+
319
+ solveSkeleton2DIkConstraint(skeleton, ik({ bendPositive, boneIndices: [0, 1], targetBoneIndex: 2 }));
320
+ computeSkeleton2DWorldTransforms(skeleton);
321
+
322
+ const reach = Math.hypot(tx, ty);
323
+ if (reach === 0) continue; // no aim direction exists; the solver documents this as skipped
324
+ const span = parentLength + childLength;
325
+ const fold = Math.abs(parentLength - childLength);
326
+ const wanted = reach > span ? span : reach < fold ? fold : reach;
327
+ // Whatever the case, the tip lies at `wanted` along the direction of the target. Compared as
328
+ // a POSITION rather than a length plus an angle: atan2 reports -pi and +pi for the same
329
+ // direction, so an angle comparison fails on a target along -x for a reason that is about
330
+ // the assertion rather than the solver.
331
+ const tip = tipOf(skeleton, 1);
332
+ const where = `p=${parentLength} c=${childLength} t=(${tx},${ty}) bend=${bendPositive}`;
333
+ expect(tip.x, `${where} tip.x`).toBeCloseTo((wanted * tx) / reach, 4);
334
+ expect(tip.y, `${where} tip.y`).toBeCloseTo((wanted * ty) / reach, 4);
335
+ checked++;
336
+ }
337
+ }
338
+ }
339
+ }
340
+ }
341
+ // A sweep that silently stopped enumerating would pass every assertion above.
342
+ expect(checked).toBeGreaterThan(700);
343
+ });
344
+
200
345
  it('skips a chain length it does not solve rather than posing something wrong', () => {
201
346
  const skeleton = createSkeleton2D([
202
347
  makeBone({ length: 10 }),
@@ -146,6 +146,42 @@ describe('solveSkeleton2DPathConstraint', () => {
146
146
  expect(skeleton.bones[2].x).toBeCloseTo(40, 4);
147
147
  });
148
148
 
149
+ // The third spacing mode, and the one with no test: Fixed and Length were both pinned, Percent was not.
150
+ // It is the mode that keeps a chain's proportions when the path is re-authored longer or shorter, which
151
+ // is exactly the case a hardcoded arc length gets wrong.
152
+ it('spaces a chain by a fraction of the whole path in Percent mode', () => {
153
+ const skeleton = rig(3);
154
+
155
+ solveSkeleton2DPathConstraint(
156
+ skeleton,
157
+ constraint({ boneIndices: [1, 2, 3], spacing: 0.2, spacingMode: Skeleton2DPathSpacingMode.Percent }),
158
+ );
159
+
160
+ // 0.2 of the path's 100 units is a 20-unit gap, independent of any bone's own length.
161
+ expect(skeleton.bones[1].x).toBeCloseTo(0, 4);
162
+ expect(skeleton.bones[2].x).toBeCloseTo(20, 4);
163
+ expect(skeleton.bones[3].x).toBeCloseTo(40, 4);
164
+ });
165
+
166
+ // The sibling of the run-off-the-end case, which was pinned while this one was not.
167
+ //
168
+ // This pins the CONSTRAINT'S contract, not the local clamp: @flighthq/path's sampler clamps a negative
169
+ // distance to the start of the first contour itself, so deleting `clampSkeleton2DPathDistance`'s negative
170
+ // arm leaves this green. The local clamp stays anyway — the sampler's clamping is an implementation
171
+ // choice inside another package rather than a documented promise, and a constraint that only works while
172
+ // that choice holds is coupled to something it cannot see. Which is also why this test is worth having:
173
+ // it fails if either layer ever starts extrapolating off the front.
174
+ it('clamps a negative position to the start rather than sampling off the front of the path', () => {
175
+ const skeleton = rig(2);
176
+
177
+ solveSkeleton2DPathConstraint(skeleton, constraint({ boneIndices: [1, 2], position: -30, spacing: 40 }));
178
+
179
+ expect(skeleton.bones[1].x).toBeCloseTo(0, 4);
180
+ // The second sample is −30 + 40 = 10, which is on the path and so is NOT clamped: this pins that the
181
+ // clamp is per sample rather than a shift of the whole chain onto the path.
182
+ expect(skeleton.bones[2].x).toBeCloseTo(10, 4);
183
+ });
184
+
149
185
  it('clamps a chain that runs off the end rather than wrapping it to the other end', () => {
150
186
  const skeleton = rig(2);
151
187
 
@@ -155,6 +191,34 @@ describe('solveSkeleton2DPathConstraint', () => {
155
191
  expect(skeleton.bones[2].x).toBeCloseTo(100, 4);
156
192
  });
157
193
 
194
+ // A rotate-only constraint is an ordinary rig setup — follow the path's heading, keep your own position.
195
+ // The bone is deliberately posed away from the path first, so leaving its position alone is something
196
+ // the assertion can actually see.
197
+ //
198
+ // The zero-mix guard this reaches is a PERFORMANCE skip, not a behavioural one, and the test says so
199
+ // rather than implying otherwise: running the translate block at mix 0 computes the bone's own current
200
+ // world position and writes it straight back, so forcing the branch on leaves this green. What it saves
201
+ // is an inverse-basis solve and a matrix rebuild per bone per frame for every rotate-only chain.
202
+ it('turns a bone to the path without moving it when both translate mixes are zero', () => {
203
+ const skeleton = rig(1, {
204
+ commands: [PathCommand.MOVE_TO, PathCommand.LINE_TO],
205
+ kind: PathAttachment2DKind,
206
+ pointCount: 2,
207
+ skin: null,
208
+ vertices: new Float32Array([0, 0, 0, 100]),
209
+ winding: 'nonZero',
210
+ });
211
+ skeleton.bones[1].x = 40;
212
+ skeleton.bones[1].y = -7;
213
+ computeSkeleton2DWorldTransforms(skeleton);
214
+
215
+ solveSkeleton2DPathConstraint(skeleton, constraint({ mixRotate: 1, mixX: 0, mixY: 0, position: 10 }));
216
+
217
+ expect(skeleton.bones[1].rotation).toBeCloseTo(90, 4);
218
+ expect(skeleton.bones[1].x).toBe(40);
219
+ expect(skeleton.bones[1].y).toBe(-7);
220
+ });
221
+
158
222
  it('aims a bone along the path tangent when rotateMode is Tangent', () => {
159
223
  const skeleton = rig(1, {
160
224
  commands: [PathCommand.MOVE_TO, PathCommand.LINE_TO],
@@ -37,6 +37,20 @@ function region(overrides: Partial<RegionAttachment2D> = {}): RegionAttachment2D
37
37
  }
38
38
 
39
39
  describe('computeSkeleton2DRegionAttachmentVertices', () => {
40
+ // The sibling of the guard in skinSkeleton2DAttachmentPoints, and the reason this one exists: a slot
41
+ // whose bone name did not resolve carries boneIndex -1, which spineParse emits by design, and this
42
+ // wrote eight NaN corners for it while the point attachment next door returned cleanly. `out` is
43
+ // pre-filled with a marker so "left alone" is distinguishable from "written with zeroes".
44
+ it.each([-1, 3, 99])('leaves out untouched for a slot bound to no bone (boneIndex %i)', (boneIndex) => {
45
+ const s = createSkeleton2D([makeBone({ x: 10, y: 5 })]);
46
+ computeSkeleton2DWorldTransforms(s);
47
+ const out = new Float32Array(8).fill(-7);
48
+
49
+ computeSkeleton2DRegionAttachmentVertices(out, region(), s, boneIndex);
50
+
51
+ expect(Array.from(out)).toEqual(new Array(8).fill(-7));
52
+ });
53
+
40
54
  it('offsets a 4×2 region rect by the bone translation (BL, TL, TR, BR order)', () => {
41
55
  const s = createSkeleton2D([makeBone({ x: 10, y: 5 })]);
42
56
  computeSkeleton2DWorldTransforms(s);
@@ -301,6 +301,41 @@ describe('computeSkeleton2DWorldTransforms', () => {
301
301
  expect(out.d).toBeCloseTo(2, 5); // reflection stripped: +2, not −2
302
302
  expect(out.a * out.d - out.c * out.b).toBeCloseTo(4, 5); // det positive (scale kept, reflection dropped)
303
303
  });
304
+
305
+ // The fourth axis, and the one no preset reaches: every TransformMode2D inherits translation, so a bone
306
+ // that strips it has to be hand-built — which Bone2D admits on purpose. Both halves are asserted from one
307
+ // rig, because the stripped position alone would be satisfied by a bone that had simply come loose from
308
+ // its parent: the basis must still carry the parent's 90° turn while the origin ignores it entirely.
309
+ it('FORMULA parity: stripping translation takes the local (x, y) as the world position, basis still inherited', () => {
310
+ const bones = (translation: boolean) => [
311
+ makeBone({ rotation: 90, x: 10, y: 20 }),
312
+ makeBone({
313
+ parentIndex: 0,
314
+ transformMode: { reflection: true, rotation: true, scale: true, translation },
315
+ x: 3,
316
+ y: 4,
317
+ }),
318
+ ];
319
+
320
+ const stripped = createSkeleton2D(bones(false));
321
+ computeSkeleton2DWorldTransforms(stripped);
322
+ const inherited = createSkeleton2D(bones(true));
323
+ computeSkeleton2DWorldTransforms(inherited);
324
+
325
+ // Stripped: the local (3, 4) IS the world origin, and the parent's translation (10, 20) never applies.
326
+ expect(stripped.worldMatrices[1 * 6 + 4]).toBeCloseTo(3, 5);
327
+ expect(stripped.worldMatrices[1 * 6 + 5]).toBeCloseTo(4, 5);
328
+ // Inherited: (3, 4) turned a quarter turn to (−4, 3), then placed at the parent's (10, 20).
329
+ expect(inherited.worldMatrices[1 * 6 + 4]).toBeCloseTo(6, 5);
330
+ expect(inherited.worldMatrices[1 * 6 + 5]).toBeCloseTo(23, 5);
331
+ // The linear part is untouched by the translation axis — both still carry the parent's 90° turn.
332
+ const out = createMatrix();
333
+ getSkeleton2DBoneWorldMatrix(out, stripped, 1);
334
+ expect(out.a).toBeCloseTo(0, 5);
335
+ expect(out.b).toBeCloseTo(1, 5);
336
+ expect(out.c).toBeCloseTo(-1, 5);
337
+ expect(out.d).toBeCloseTo(0, 5);
338
+ });
304
339
  });
305
340
 
306
341
  describe('createSkeleton2D', () => {
@@ -15,6 +15,7 @@ import {
15
15
  findSkeleton2DStepKeyframe,
16
16
  createSkeleton2DSlotAnimationTarget,
17
17
  getSkeleton2DAnimationTargetBinder,
18
+ getSkeleton2DAnimationTargetBinderKinds,
18
19
  registerSkeleton2DAnimationTargetBinder,
19
20
  unregisterSkeleton2DAnimationTargetBinder,
20
21
  } from './skeleton2dAnimationTarget';
@@ -75,6 +76,24 @@ describe('getSkeleton2DAnimationTargetBinder', () => {
75
76
  });
76
77
  });
77
78
 
79
+ describe('getSkeleton2DAnimationTargetBinderKinds', () => {
80
+ it('enumerates sorted bound kinds and stops naming one after it is unregistered', () => {
81
+ registerSkeleton2DAnimationTargetBinder('acme.RopeTarget', () => {});
82
+ expect(getSkeleton2DAnimationTargetBinderKinds()).toEqual([
83
+ Skeleton2DAnimationTargetKind.Bone,
84
+ Skeleton2DAnimationTargetKind.Slot,
85
+ 'acme.RopeTarget',
86
+ ]);
87
+
88
+ unregisterSkeleton2DAnimationTargetBinder('acme.RopeTarget');
89
+
90
+ expect(getSkeleton2DAnimationTargetBinderKinds()).toEqual([
91
+ Skeleton2DAnimationTargetKind.Bone,
92
+ Skeleton2DAnimationTargetKind.Slot,
93
+ ]);
94
+ });
95
+ });
96
+
78
97
  describe('registerSkeleton2DAnimationTargetBinder', () => {
79
98
  it('binds a family this package does not own from the same single pass as bones', () => {
80
99
  const seen: number[] = [];
@@ -142,6 +142,28 @@ describe('registerSkeleton2DDrawOrderAnimationBinder', () => {
142
142
  expect(seen).toEqual([]);
143
143
  });
144
144
 
145
+ // The count is min(components, nodes.length) and only the nodes-are-fewer side was reachable from the
146
+ // tests above. This is the other side: a clip authored against a rig with fewer slots than the one it is
147
+ // played on. The extra nodes get no entry at all, which is the right answer rather than an oversight —
148
+ // an ordering that never mentions a node has no opinion about where it goes, and `applyNodeOrderList`
149
+ // leaves anything absent from the list where it already was.
150
+ it('orders only the slots the track states, leaving later nodes out of the list entirely', () => {
151
+ const { list, nodes, parent } = rig(3);
152
+
153
+ bind(nodes, list, [0], [1, 0], 2, 'Step', 0);
154
+
155
+ expect(list.entryCount).toBe(2);
156
+ expect(list.nodes[0]).toBe(nodes[0]);
157
+ expect(list.nodes[1]).toBe(nodes[1]);
158
+
159
+ applyNodeOrderList(parent, list);
160
+
161
+ // The two stated slots swapped; the third node was never named and kept its place at the end.
162
+ expect(getNodeChildAt(parent, 0)).toBe(nodes[1]);
163
+ expect(getNodeChildAt(parent, 1)).toBe(nodes[0]);
164
+ expect(getNodeChildAt(parent, 2)).toBe(nodes[2]);
165
+ });
166
+
145
167
  it('skips a slot that draws nothing rather than entering a placeholder', () => {
146
168
  const list = createNodeOrderList();
147
169
  const parent = createNode(TEST_NODE_KIND);
@@ -29,6 +29,35 @@ const twoBoneSkin: Skin2D = {
29
29
  };
30
30
 
31
31
  describe('skinSkeleton2DAttachmentPoints', () => {
32
+ // A slot whose bone name did not resolve carries boneIndex -1 — the value spineParse emits by design for
33
+ // a file naming a bone that is not there, on a skeleton validateSkeleton2D calls valid. Before this was
34
+ // guarded the rigid path indexed the world buffer at -6, and every coordinate it wrote was NaN: a mesh
35
+ // that draws nothing and a bounding box no hit test can match, with nothing pointing back at the rig.
36
+ //
37
+ // `out` is pre-filled with a marker rather than zeroes so the assertion tells "left alone" apart from
38
+ // "written with zeroes", which are different outcomes and only one of them is the sentinel.
39
+ it.each([-1, 4, 99])('leaves out untouched for a slot bound to no bone (boneIndex %i)', (boneIndex) => {
40
+ const skeleton = createSkeleton2D([makeBone({ rotation: 30 })]);
41
+ computeSkeleton2DWorldTransforms(skeleton);
42
+ const out = new Float32Array([-7, -7, -7, -7]);
43
+
44
+ skinSkeleton2DAttachmentPoints(out, null, new Float32Array([1, 0, 0, 1]), skeleton, boneIndex, null, 'test');
45
+
46
+ expect(Array.from(out)).toEqual([-7, -7, -7, -7]);
47
+ });
48
+
49
+ // The weighted path reads its bone indices from the influence stream and ignores `boneIndex` entirely,
50
+ // so the guard must not turn a perfectly good weighted skin into a no-op on its way past.
51
+ it('still skins a weighted attachment when boneIndex is -1, which it does not use', () => {
52
+ const skeleton = createSkeleton2D([makeBone({ x: 0 }), makeBone({ x: 10 })]);
53
+ computeSkeleton2DWorldTransforms(skeleton);
54
+ const out = new Float32Array(2);
55
+
56
+ skinSkeleton2DAttachmentPoints(out, twoBoneSkin, null, skeleton, -1, null, 'test');
57
+
58
+ expect(out[0]).toBeCloseTo(5, 5);
59
+ });
60
+
32
61
  it('blends a weighted point by weight across its influences', () => {
33
62
  const skeleton = createSkeleton2D([makeBone({ x: 0 }), makeBone({ x: 10 })]);
34
63
  computeSkeleton2DWorldTransforms(skeleton);
@@ -116,6 +116,29 @@ describe('solveSkeleton2DTransformConstraint', () => {
116
116
  expect(skeleton.bones[0].rotation).toBeCloseTo(65, 5);
117
117
  });
118
118
 
119
+ // The constraint accepts SIX offsets and only offsetRotation above was pinned, which is the shape
120
+ // AGENTS.md calls out by name: a field a caller sets, that the solver could quietly stop honouring with
121
+ // nothing to notice. The rule is one rule — the constrained bone lands on the target's world value for
122
+ // that channel PLUS the offset — so it is asserted once per channel from the same posed target rather
123
+ // than as six unrelated numbers. The constrained bone is a root, so its local value is its world value
124
+ // and each expectation is readable straight off the target's setup.
125
+ it.each([
126
+ ['rotation', { mixRotate: 1, offsetRotation: 25 }, 'rotation', 65],
127
+ ['scaleX', { mixScaleX: 1, offsetScaleX: 0.5 }, 'scaleX', 2.5],
128
+ ['scaleY', { mixScaleY: 1, offsetScaleY: 0.5 }, 'scaleY', 2.5],
129
+ ['shearY', { mixShearY: 1, offsetShearY: 15 }, 'shearY', 25],
130
+ ['x', { mixX: 1, offsetX: 7 }, 'x', 37],
131
+ ['y', { mixY: 1, offsetY: 7 }, 'y', 19],
132
+ ] as const)('offsets the copied %s by its own offset field', (_channel, overrides, field, expected) => {
133
+ const target = makeBone({ rotation: 40, scaleX: 2, scaleY: 2, shearY: 10, x: 30, y: 12 });
134
+ const skeleton = createSkeleton2D([makeBone(), target]);
135
+ computeSkeleton2DWorldTransforms(skeleton);
136
+
137
+ solveSkeleton2DTransformConstraint(skeleton, transform(overrides));
138
+
139
+ expect(skeleton.bones[0][field]).toBeCloseTo(expected, 4);
140
+ });
141
+
119
142
  it('copies world position through the constrained bone PARENT basis, not field to field', () => {
120
143
  // The constrained bone hangs off a parent rotated 90°, so a world target of (0, 30) is local (30, 0)
121
144
  // to it. A field-to-field copy would have written (0, 30) and put the bone in the wrong place.