@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.
- package/dist/ikConstraint2D.js +8 -6
- package/dist/ikConstraint2D.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/regionAttachment2D.d.ts.map +1 -1
- package/dist/regionAttachment2D.js +5 -1
- package/dist/regionAttachment2D.js.map +1 -1
- package/dist/skeleton2d.d.ts.map +1 -1
- package/dist/skeleton2d.js +5 -2
- package/dist/skeleton2d.js.map +1 -1
- package/dist/skeleton2dAnimationTarget.d.ts +1 -0
- package/dist/skeleton2dAnimationTarget.d.ts.map +1 -1
- package/dist/skeleton2dAnimationTarget.js +22 -10
- package/dist/skeleton2dAnimationTarget.js.map +1 -1
- package/dist/skinAttachment2DPoints.d.ts.map +1 -1
- package/dist/skinAttachment2DPoints.js +8 -0
- package/dist/skinAttachment2DPoints.js.map +1 -1
- package/dist/slotDeform2D.d.ts.map +1 -1
- package/dist/slotDeform2D.js +6 -4
- package/dist/slotDeform2D.js.map +1 -1
- package/package.json +10 -9
- package/src/applyAnimationClipToSkeleton2D.test.ts +34 -0
- package/src/ikConstraint2D.test.ts +145 -0
- package/src/pathConstraint2D.test.ts +64 -0
- package/src/regionAttachment2D.test.ts +14 -0
- package/src/skeleton2d.test.ts +35 -0
- package/src/skeleton2dAnimationTarget.test.ts +19 -0
- package/src/skeleton2dDrawOrderTarget.test.ts +22 -0
- package/src/skinAttachment2DPoints.test.ts +29 -0
- package/src/transformConstraint2D.test.ts +23 -0
package/dist/ikConstraint2D.js
CHANGED
|
@@ -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
|
-
|
|
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":"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"}
|
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
|
package/dist/index.d.ts.map
CHANGED
|
@@ -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,
|
|
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,
|
|
1
|
+
{"version":3,"file":"regionAttachment2D.js","sourceRoot":"","sources":["../src/regionAttachment2D.ts"],"names":[],"mappings":"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"}
|
package/dist/skeleton2d.d.ts.map
CHANGED
|
@@ -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;
|
|
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"}
|
package/dist/skeleton2d.js
CHANGED
|
@@ -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.
|
|
134
|
-
//
|
|
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++)
|
package/dist/skeleton2d.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"skeleton2d.js","sourceRoot":"","sources":["../src/skeleton2d.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AACzD,OAAO,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAC5E,OAAO,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AAGrD,0GAA0G;AAC1G,MAAM,aAAa,GAAG,CAAC,CAAC;AAExB,wGAAwG;AACxG,yGAAyG;AACzG,6DAA6D;AAC7D,MAAM,UAAU,eAAe,CAAC,QAA8B;IAC5D,OAAO,YAAY,CAAC;QAClB,YAAY,EAAE,QAAQ,CAAC,YAAY,CAAC,KAAK,EAAE;QAC3C,KAAK,EAAE,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,IAAI,EAAE,CAAC,CAAC;QAClD,mBAAmB,EAAE,QAAQ,CAAC,mBAAmB,CAAC,KAAK,EAAE;QACzD,KAAK,EACH,QAAQ,CAAC,KAAK,KAAK,IAAI,IAAI,QAAQ,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC;QAClH,aAAa,EAAE,QAAQ,CAAC,aAAa,CAAC,KAAK,EAAE;KAC9C,CAAC,CAAC;AACL,CAAC;AAED,yGAAyG;AACzG,6GAA6G;AAC7G,yGAAyG;AACzG,oCAAoC;AACpC,MAAM,UAAU,6BAA6B,CAAC,QAA8B;IAC1E,MAAM,KAAK,GAAG,QAAQ,CAAC,aAAa,CAAC;IACrC,MAAM,OAAO,GAAG,QAAQ,CAAC,mBAAmB,CAAC;IAC7C,MAAM,GAAG,GAAG,QAAQ,CAAC,YAAY,CAAC;IAClC,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC,MAAM,CAAC;IACpC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,EAAE,CAAC,EAAE,EAAE,CAAC;QAC/B,MAAM,CAAC,GAAG,CAAC,GAAG,aAAa,CAAC;QAC5B,UAAU,CAAC,SAAS,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC;QAChC,UAAU,CAAC,SAAS,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC;QAClC,cAAc,CAAC,SAAS,EAAE,SAAS,EAAE,SAAS,CAAC,CAAC;QAChD,WAAW,CAAC,GAAG,EAAE,CAAC,EAAE,SAAS,CAAC,CAAC;IACjC,CAAC;AACH,CAAC;AAED,qGAAqG;AACrG,2GAA2G;AAC3G,2GAA2G;AAC3G,yGAAyG;AACzG,uGAAuG;AACvG,MAAM,UAAU,mCAAmC,CAAC,QAA8B,EAAE,SAAiB;IACnG,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC;IAC7B,MAAM,KAAK,GAAG,QAAQ,CAAC,aAAa,CAAC;IACrC,IAAI,SAAS,GAAG,CAAC,IAAI,SAAS,IAAI,KAAK,CAAC,MAAM;QAAE,OAAO;IACvD,CAAC;QACC,MAAM,CAAC,GAAG,SAAS,CAAC;QACpB,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;QACtB,6FAA6F;QAC7F,qGAAqG;QACrG,MAAM,IAAI,GAAG,CAAC,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,UAAU,CAAC;QACxD,MAAM,IAAI,GAAG,CAAC,IAAI,CAAC,QAAQ,GAAG,EAAE,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,UAAU,CAAC;QAC7D,MAAM,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC;QACxC,MAAM,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC;QACxC,MAAM,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC;QACxC,MAAM,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC;QACxC,MAAM,CAAC,GAAG,CAAC,GAAG,aAAa,CAAC;QAC5B,IAAI,IAAI,CAAC,WAAW,GAAG,CAAC,EAAE,CAAC;YACzB,KAAK,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC;YACd,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC;YAClB,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC;YAClB,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC;YAClB,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC;YACtB,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC;YACtB,OAAO;QACT,CAAC;QACD,MAAM,CAAC,GAAG,IAAI,CAAC,WAAW,GAAG,aAAa,CAAC;QAC3C,MAAM,EAAE,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;QACpB,MAAM,EAAE,GAAG,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;QACxB,MAAM,EAAE,GAAG,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;QACxB,MAAM,EAAE,GAAG,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;QACxB,MAAM,OAAO,GAAG,IAAI,CAAC,aAAa,CAAC;QACnC,uGAAuG;QACvG,qEAAqE;QACrE,IAAI,OAAO,CAAC,WAAW,EAAE,CAAC;YACxB,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;YACxD,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;QAC1D,CAAC;aAAM,CAAC;YACN,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC;YACtB,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC;QACxB,CAAC;QACD,sGAAsG;QACtG,sGAAsG;QACtG,uGAAuG;QACvG,wGAAwG;QACxG,wGAAwG;QACxG,0FAA0F;QAC1F,IAAI,EAAU,CAAC;QACf,IAAI,EAAU,CAAC;QACf,IAAI,EAAU,CAAC;QACf,IAAI,EAAU,CAAC;QACf,IAAI,OAAO,CAAC,QAAQ,IAAI,OAAO,CAAC,KAAK,IAAI,OAAO,CAAC,UAAU,EAAE,CAAC;YAC5D,EAAE,GAAG,EAAE,CAAC;YACR,EAAE,GAAG,EAAE,CAAC;YACR,EAAE,GAAG,EAAE,CAAC;YACR,EAAE,GAAG,EAAE,CAAC;QACV,CAAC;aAAM,CAAC;YACN,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC;YACpC,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC;YACpC,MAAM,GAAG,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;YAC5C,MAAM,GAAG,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;YAC5C,IAAI,GAAW,CAAC;YAChB,IAAI,GAAW,CAAC;YAChB,IAAI,OAAO,CAAC,QAAQ,IAAI,OAAO,CAAC,UAAU,EAAE,CAAC;gBAC3C,GAAG,GAAG,EAAE,GAAG,GAAG,CAAC;gBACf,GAAG,GAAG,EAAE,GAAG,GAAG,CAAC;YACjB,CAAC;iBAAM,IAAI,OAAO,CAAC,QAAQ,EAAE,CAAC;gBAC5B,GAAG,GAAG,CAAC,GAAG,CAAC;gBACX,GAAG,GAAG,GAAG,CAAC;YACZ,CAAC;iBAAM,CAAC;gBACN,GAAG,GAAG,CAAC,CAAC;gBACR,GAAG,GAAG,OAAO,CAAC,UAAU,IAAI,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YAC7D,CAAC;YACD,MAAM,EAAE,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;YACnC,MAAM,EAAE,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;YACnC,EAAE,GAAG,GAAG,GAAG,EAAE,CAAC;YACd,EAAE,GAAG,GAAG,GAAG,EAAE,CAAC;YACd,EAAE,GAAG,GAAG,GAAG,EAAE,CAAC;YACd,EAAE,GAAG,GAAG,GAAG,EAAE,CAAC;QAChB,CAAC;QACD,KAAK,CAAC,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC;QAC7B,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC;QACjC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC;QACjC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC;IACnC,CAAC;AACH,CAAC;AAED,2GAA2G;AAC3G,2GAA2G;AAC3G,yGAAyG;AACzG,0GAA0G;AAC1G,yGAAyG;AACzG,MAAM,UAAU,gCAAgC,CAAC,QAA8B;IAC7E,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC,MAAM,CAAC;IACpC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,EAAE,CAAC,EAAE;QAAE,mCAAmC,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC;AACnF,CAAC;AAED,2GAA2G;AAC3G,+FAA+F;AAC/F,6GAA6G;AAC7G,uGAAuG;AACvG,iFAAiF;AACjF,MAAM,UAAU,gBAAgB,CAAC,KAAe,EAAE,QAA6B,IAAI;IACjF,MAAM,KAAK,GAAG,KAAK,CAAC,MAAM,CAAC;IAC3B,OAAO,YAAY,CAAC;QAClB,YAAY,EAAE,IAAI,YAAY,CAAC,KAAK,GAAG,aAAa,CAAC;QACrD,KAAK;QACL,mBAAmB,EAAE,IAAI,YAAY,CAAC,KAAK,GAAG,aAAa,CAAC;QAC5D,KAAK;QACL,aAAa,EAAE,IAAI,YAAY,CAAC,KAAK,GAAG,aAAa,CAAC;KACvD,CAAC,CAAC;AACL,CAAC;AAED,yGAAyG;AACzG,6FAA6F;AAC7F,MAAM,UAAU,iBAAiB,CAAC,QAAoB;IACpD,QAAQ,CAAC,KAAK,GAAG,EAAE,CAAC;IACpB,QAAQ,CAAC,KAAK,GAAG,IAAI,CAAC;AACxB,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,CAAuB,EAAE,CAAuB;IAC/E,IAAI,CAAC,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IACzB,IAAI,CAAC,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC,CAAC,KAAK,CAAC,MAAM;QAAE,OAAO,KAAK,CAAC;IACpD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACxC,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QACrB,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QACrB,IACE,CAAC,CAAC,WAAW,KAAK,CAAC,CAAC,WAAW;YAC/B,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC;YACX,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC;YACX,CAAC,CAAC,QAAQ,KAAK,CAAC,CAAC,QAAQ;YACzB,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC,MAAM;YACrB,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC,MAAM;YACrB,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC,MAAM;YACrB,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC,MAAM;YACrB,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC,MAAM;YACrB,CAAC,CAAC,aAAa,CAAC,QAAQ,KAAK,CAAC,CAAC,aAAa,CAAC,QAAQ;YACrD,CAAC,CAAC,aAAa,CAAC,KAAK,KAAK,CAAC,CAAC,aAAa,CAAC,KAAK;YAC/C,CAAC,CAAC,aAAa,CAAC,UAAU,KAAK,CAAC,CAAC,aAAa,CAAC,UAAU;YACzD,CAAC,CAAC,aAAa,CAAC,WAAW,KAAK,CAAC,CAAC,aAAa,CAAC,WAAW,EAC3D,CAAC;YACD,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,6FAA6F;AAC7F,MAAM,UAAU,4BAA4B,CAAC,QAA8B,EAAE,IAAY;IACvF,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC;IAC7B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACtC,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,KAAK,IAAI;YAAE,OAAO,CAAC,CAAC;IACvC,CAAC;IACD,OAAO,CAAC,CAAC,CAAC;AACZ,CAAC;AAED,4GAA4G;AAC5G,8GAA8G;AAC9G,MAAM,UAAU,4BAA4B,CAC1C,GAAe,EACf,QAA8B,EAC9B,SAAiB;IAEjB,IAAI,SAAS,GAAG,CAAC,IAAI,SAAS,IAAI,QAAQ,CAAC,KAAK,CAAC,MAAM;QAAE,OAAO,KAAK,CAAC;IACtE,UAAU,CAAC,GAAG,EAAE,QAAQ,CAAC,aAAa,EAAE,SAAS,GAAG,aAAa,CAAC,CAAC;IACnE,OAAO,IAAI,CAAC;AACd,CAAC;AAED,2GAA2G;AAC3G,gFAAgF;AAChF,MAAM,UAAU,iBAAiB,CAAC,QAA8B,EAAE,IAAY;IAC5E,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC;IAC7B,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,IAAI;QAAE,OAAO,IAAI,CAAC;IACvD,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,IAAI,IAAI,CAAC,IAAI,KAAK,IAAI;YAAE,OAAO,IAAI,CAAC;IACtC,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,uFAAuF;AACvF,MAAM,UAAU,qBAAqB,CAAC,QAA8B;IAClE,MAAM,KAAK,GAAG,QAAQ,CAAC,aAAa,CAAC;IACrC,MAAM,GAAG,GAAG,QAAQ,CAAC,mBAAmB,CAAC;IACzC,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC,MAAM,CAAC;IACpC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,EAAE,CAAC,EAAE,EAAE,CAAC;QAC/B,MAAM,CAAC,GAAG,CAAC,GAAG,aAAa,CAAC;QAC5B,UAAU,CAAC,SAAS,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC;QAChC,IAAI,CAAC,aAAa,CAAC,SAAS,EAAE,SAAS,CAAC;YAAE,sBAAsB,CAAC,SAAS,CAAC,CAAC;QAC5E,WAAW,CAAC,GAAG,EAAE,CAAC,EAAE,SAAS,CAAC,CAAC;IACjC,CAAC;AACH,CAAC;AAED,4FAA4F;AAC5F,+EAA+E;AAC/E,gGAAgG;AAChG,4GAA4G;AAC5G,4GAA4G;AAC5G,4GAA4G;AAC5G,0BAA0B;AAC1B,EAAE;AACF,2GAA2G;AAC3G,yGAAyG;AACzG,4GAA4G;AAC5G,uGAAuG;AACvG,2GAA2G;AAC3G,MAAM,UAAU,iBAAiB,CAAC,QAAoB,EAAE,IAAgC;IACtF,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC;IAC7B,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,IAAI;QAAE,OAAO;IAClD,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;QACrC,IAAI,KAAK,CAAC,SAAS,IAAI,CAAC,IAAI,KAAK,CAAC,SAAS,GAAG,KAAK,CAAC,MAAM;YAAE,KAAK,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,UAAU,GAAG,KAAK,CAAC,UAAU,CAAC;IACnH,CAAC;AACH,CAAC;AAED,2GAA2G;AAC3G,6GAA6G;AAC7G,MAAM,UAAU,kBAAkB,CAAC,QAA8B;IAC/D,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC,MAAM,CAAC;IACpC,MAAM,QAAQ,GAAG,KAAK,GAAG,aAAa,CAAC;IACvC,IAAI,QAAQ,CAAC,aAAa,CAAC,MAAM,KAAK,QAAQ;QAC5C,OAAO,wBAAwB,QAAQ,CAAC,aAAa,CAAC,MAAM,OAAO,QAAQ,EAAE,CAAC;IAChF,IAAI,QAAQ,CAAC,mBAAmB,CAAC,MAAM,KAAK,QAAQ,EAAE,CAAC;QACrD,OAAO,8BAA8B,QAAQ,CAAC,mBAAmB,CAAC,MAAM,OAAO,QAAQ,EAAE,CAAC;IAC5F,CAAC;IACD,IAAI,QAAQ,CAAC,YAAY,CAAC,MAAM,KAAK,QAAQ;QAC3C,OAAO,uBAAuB,QAAQ,CAAC,YAAY,CAAC,MAAM,OAAO,QAAQ,EAAE,CAAC;IAC9E,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,EAAE,CAAC,EAAE,EAAE,CAAC;QAC/B,MAAM,WAAW,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC;QAClD,IAAI,WAAW,IAAI,CAAC;YAClB,OAAO,QAAQ,CAAC,gBAAgB,WAAW,qEAAqE,CAAC;QACnH,IAAI,WAAW,GAAG,CAAC,CAAC;YAAE,OAAO,QAAQ,CAAC,gBAAgB,WAAW,OAAO,CAAC;IAC3E,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAS,UAAU,CAAC,GAAe,EAAE,MAA8B,EAAE,MAAc;IACjF,GAAG,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC;IACvB,GAAG,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IAC3B,GAAG,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IAC3B,GAAG,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IAC3B,GAAG,CAAC,EAAE,GAAG,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IAC5B,GAAG,CAAC,EAAE,GAAG,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;AAC9B,CAAC;AAED,SAAS,sBAAsB,CAAC,GAAe;IAC7C,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC;IACV,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC;IACV,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC;IACV,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC;IACV,GAAG,CAAC,EAAE,GAAG,CAAC,CAAC;IACX,GAAG,CAAC,EAAE,GAAG,CAAC,CAAC;AACb,CAAC;AAED,SAAS,WAAW,CAAC,MAAoB,EAAE,MAAc,EAAE,MAA4B;IACrF,MAAM,CAAC,MAAM,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC;IAC1B,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC;IAC9B,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC;IAC9B,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC;IAC9B,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,GAAG,MAAM,CAAC,EAAE,CAAC;IAC/B,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,GAAG,MAAM,CAAC,EAAE,CAAC;AACjC,CAAC;AAED,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,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,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"}
|
|
1
|
+
{"version":3,"file":"skeleton2d.js","sourceRoot":"","sources":["../src/skeleton2d.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AACzD,OAAO,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAC5E,OAAO,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AAGrD,0GAA0G;AAC1G,MAAM,aAAa,GAAG,CAAC,CAAC;AAExB,wGAAwG;AACxG,yGAAyG;AACzG,6DAA6D;AAC7D,MAAM,UAAU,eAAe,CAAC,QAA8B;IAC5D,OAAO,YAAY,CAAC;QAClB,YAAY,EAAE,QAAQ,CAAC,YAAY,CAAC,KAAK,EAAE;QAC3C,KAAK,EAAE,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,IAAI,EAAE,CAAC,CAAC;QAClD,mBAAmB,EAAE,QAAQ,CAAC,mBAAmB,CAAC,KAAK,EAAE;QACzD,KAAK,EACH,QAAQ,CAAC,KAAK,KAAK,IAAI,IAAI,QAAQ,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC;QAClH,aAAa,EAAE,QAAQ,CAAC,aAAa,CAAC,KAAK,EAAE;KAC9C,CAAC,CAAC;AACL,CAAC;AAED,yGAAyG;AACzG,6GAA6G;AAC7G,yGAAyG;AACzG,oCAAoC;AACpC,MAAM,UAAU,6BAA6B,CAAC,QAA8B;IAC1E,MAAM,KAAK,GAAG,QAAQ,CAAC,aAAa,CAAC;IACrC,MAAM,OAAO,GAAG,QAAQ,CAAC,mBAAmB,CAAC;IAC7C,MAAM,GAAG,GAAG,QAAQ,CAAC,YAAY,CAAC;IAClC,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC,MAAM,CAAC;IACpC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,EAAE,CAAC,EAAE,EAAE,CAAC;QAC/B,MAAM,CAAC,GAAG,CAAC,GAAG,aAAa,CAAC;QAC5B,UAAU,CAAC,SAAS,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC;QAChC,UAAU,CAAC,SAAS,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC;QAClC,cAAc,CAAC,SAAS,EAAE,SAAS,EAAE,SAAS,CAAC,CAAC;QAChD,WAAW,CAAC,GAAG,EAAE,CAAC,EAAE,SAAS,CAAC,CAAC;IACjC,CAAC;AACH,CAAC;AAED,qGAAqG;AACrG,2GAA2G;AAC3G,2GAA2G;AAC3G,yGAAyG;AACzG,uGAAuG;AACvG,MAAM,UAAU,mCAAmC,CAAC,QAA8B,EAAE,SAAiB;IACnG,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC;IAC7B,MAAM,KAAK,GAAG,QAAQ,CAAC,aAAa,CAAC;IACrC,IAAI,SAAS,GAAG,CAAC,IAAI,SAAS,IAAI,KAAK,CAAC,MAAM;QAAE,OAAO;IACvD,CAAC;QACC,MAAM,CAAC,GAAG,SAAS,CAAC;QACpB,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;QACtB,6FAA6F;QAC7F,qGAAqG;QACrG,MAAM,IAAI,GAAG,CAAC,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,UAAU,CAAC;QACxD,MAAM,IAAI,GAAG,CAAC,IAAI,CAAC,QAAQ,GAAG,EAAE,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,UAAU,CAAC;QAC7D,MAAM,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC;QACxC,MAAM,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC;QACxC,MAAM,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC;QACxC,MAAM,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC;QACxC,MAAM,CAAC,GAAG,CAAC,GAAG,aAAa,CAAC;QAC5B,IAAI,IAAI,CAAC,WAAW,GAAG,CAAC,EAAE,CAAC;YACzB,KAAK,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC;YACd,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC;YAClB,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC;YAClB,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC;YAClB,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC;YACtB,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC;YACtB,OAAO;QACT,CAAC;QACD,MAAM,CAAC,GAAG,IAAI,CAAC,WAAW,GAAG,aAAa,CAAC;QAC3C,MAAM,EAAE,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;QACpB,MAAM,EAAE,GAAG,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;QACxB,MAAM,EAAE,GAAG,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;QACxB,MAAM,EAAE,GAAG,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;QACxB,MAAM,OAAO,GAAG,IAAI,CAAC,aAAa,CAAC;QACnC,uGAAuG;QACvG,qEAAqE;QACrE,IAAI,OAAO,CAAC,WAAW,EAAE,CAAC;YACxB,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;YACxD,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;QAC1D,CAAC;aAAM,CAAC;YACN,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC;YACtB,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC;QACxB,CAAC;QACD,sGAAsG;QACtG,sGAAsG;QACtG,uGAAuG;QACvG,wGAAwG;QACxG,wGAAwG;QACxG,0FAA0F;QAC1F,IAAI,EAAU,CAAC;QACf,IAAI,EAAU,CAAC;QACf,IAAI,EAAU,CAAC;QACf,IAAI,EAAU,CAAC;QACf,IAAI,OAAO,CAAC,QAAQ,IAAI,OAAO,CAAC,KAAK,IAAI,OAAO,CAAC,UAAU,EAAE,CAAC;YAC5D,EAAE,GAAG,EAAE,CAAC;YACR,EAAE,GAAG,EAAE,CAAC;YACR,EAAE,GAAG,EAAE,CAAC;YACR,EAAE,GAAG,EAAE,CAAC;QACV,CAAC;aAAM,CAAC;YACN,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC;YACpC,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC;YACpC,MAAM,GAAG,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;YAC5C,MAAM,GAAG,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;YAC5C,IAAI,GAAW,CAAC;YAChB,IAAI,GAAW,CAAC;YAChB,IAAI,OAAO,CAAC,QAAQ,IAAI,OAAO,CAAC,UAAU,EAAE,CAAC;gBAC3C,GAAG,GAAG,EAAE,GAAG,GAAG,CAAC;gBACf,GAAG,GAAG,EAAE,GAAG,GAAG,CAAC;YACjB,CAAC;iBAAM,IAAI,OAAO,CAAC,QAAQ,EAAE,CAAC;gBAC5B,GAAG,GAAG,CAAC,GAAG,CAAC;gBACX,GAAG,GAAG,GAAG,CAAC;YACZ,CAAC;iBAAM,CAAC;gBACN,GAAG,GAAG,CAAC,CAAC;gBACR,GAAG,GAAG,OAAO,CAAC,UAAU,IAAI,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YAC7D,CAAC;YACD,MAAM,EAAE,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;YACnC,MAAM,EAAE,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;YACnC,EAAE,GAAG,GAAG,GAAG,EAAE,CAAC;YACd,EAAE,GAAG,GAAG,GAAG,EAAE,CAAC;YACd,EAAE,GAAG,GAAG,GAAG,EAAE,CAAC;YACd,EAAE,GAAG,GAAG,GAAG,EAAE,CAAC;QAChB,CAAC;QACD,KAAK,CAAC,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC;QAC7B,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC;QACjC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC;QACjC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC;IACnC,CAAC;AACH,CAAC;AAED,2GAA2G;AAC3G,2GAA2G;AAC3G,yGAAyG;AACzG,wGAAwG;AACxG,0GAA0G;AAC1G,qGAAqG;AACrG,wGAAwG;AACxG,oBAAoB;AACpB,MAAM,UAAU,gCAAgC,CAAC,QAA8B;IAC7E,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC,MAAM,CAAC;IACpC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,EAAE,CAAC,EAAE;QAAE,mCAAmC,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC;AACnF,CAAC;AAED,2GAA2G;AAC3G,+FAA+F;AAC/F,6GAA6G;AAC7G,uGAAuG;AACvG,iFAAiF;AACjF,MAAM,UAAU,gBAAgB,CAAC,KAAe,EAAE,QAA6B,IAAI;IACjF,MAAM,KAAK,GAAG,KAAK,CAAC,MAAM,CAAC;IAC3B,OAAO,YAAY,CAAC;QAClB,YAAY,EAAE,IAAI,YAAY,CAAC,KAAK,GAAG,aAAa,CAAC;QACrD,KAAK;QACL,mBAAmB,EAAE,IAAI,YAAY,CAAC,KAAK,GAAG,aAAa,CAAC;QAC5D,KAAK;QACL,aAAa,EAAE,IAAI,YAAY,CAAC,KAAK,GAAG,aAAa,CAAC;KACvD,CAAC,CAAC;AACL,CAAC;AAED,yGAAyG;AACzG,6FAA6F;AAC7F,MAAM,UAAU,iBAAiB,CAAC,QAAoB;IACpD,QAAQ,CAAC,KAAK,GAAG,EAAE,CAAC;IACpB,QAAQ,CAAC,KAAK,GAAG,IAAI,CAAC;AACxB,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,CAAuB,EAAE,CAAuB;IAC/E,IAAI,CAAC,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IACzB,IAAI,CAAC,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC,CAAC,KAAK,CAAC,MAAM;QAAE,OAAO,KAAK,CAAC;IACpD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACxC,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QACrB,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QACrB,IACE,CAAC,CAAC,WAAW,KAAK,CAAC,CAAC,WAAW;YAC/B,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC;YACX,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC;YACX,CAAC,CAAC,QAAQ,KAAK,CAAC,CAAC,QAAQ;YACzB,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC,MAAM;YACrB,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC,MAAM;YACrB,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC,MAAM;YACrB,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC,MAAM;YACrB,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC,MAAM;YACrB,CAAC,CAAC,aAAa,CAAC,QAAQ,KAAK,CAAC,CAAC,aAAa,CAAC,QAAQ;YACrD,CAAC,CAAC,aAAa,CAAC,KAAK,KAAK,CAAC,CAAC,aAAa,CAAC,KAAK;YAC/C,CAAC,CAAC,aAAa,CAAC,UAAU,KAAK,CAAC,CAAC,aAAa,CAAC,UAAU;YACzD,CAAC,CAAC,aAAa,CAAC,WAAW,KAAK,CAAC,CAAC,aAAa,CAAC,WAAW,EAC3D,CAAC;YACD,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,6FAA6F;AAC7F,MAAM,UAAU,4BAA4B,CAAC,QAA8B,EAAE,IAAY;IACvF,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC;IAC7B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACtC,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,KAAK,IAAI;YAAE,OAAO,CAAC,CAAC;IACvC,CAAC;IACD,OAAO,CAAC,CAAC,CAAC;AACZ,CAAC;AAED,4GAA4G;AAC5G,8GAA8G;AAC9G,MAAM,UAAU,4BAA4B,CAC1C,GAAe,EACf,QAA8B,EAC9B,SAAiB;IAEjB,IAAI,SAAS,GAAG,CAAC,IAAI,SAAS,IAAI,QAAQ,CAAC,KAAK,CAAC,MAAM;QAAE,OAAO,KAAK,CAAC;IACtE,UAAU,CAAC,GAAG,EAAE,QAAQ,CAAC,aAAa,EAAE,SAAS,GAAG,aAAa,CAAC,CAAC;IACnE,OAAO,IAAI,CAAC;AACd,CAAC;AAED,2GAA2G;AAC3G,gFAAgF;AAChF,MAAM,UAAU,iBAAiB,CAAC,QAA8B,EAAE,IAAY;IAC5E,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC;IAC7B,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,IAAI;QAAE,OAAO,IAAI,CAAC;IACvD,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,IAAI,IAAI,CAAC,IAAI,KAAK,IAAI;YAAE,OAAO,IAAI,CAAC;IACtC,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,uFAAuF;AACvF,MAAM,UAAU,qBAAqB,CAAC,QAA8B;IAClE,MAAM,KAAK,GAAG,QAAQ,CAAC,aAAa,CAAC;IACrC,MAAM,GAAG,GAAG,QAAQ,CAAC,mBAAmB,CAAC;IACzC,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC,MAAM,CAAC;IACpC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,EAAE,CAAC,EAAE,EAAE,CAAC;QAC/B,MAAM,CAAC,GAAG,CAAC,GAAG,aAAa,CAAC;QAC5B,UAAU,CAAC,SAAS,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC;QAChC,IAAI,CAAC,aAAa,CAAC,SAAS,EAAE,SAAS,CAAC;YAAE,sBAAsB,CAAC,SAAS,CAAC,CAAC;QAC5E,WAAW,CAAC,GAAG,EAAE,CAAC,EAAE,SAAS,CAAC,CAAC;IACjC,CAAC;AACH,CAAC;AAED,4FAA4F;AAC5F,+EAA+E;AAC/E,gGAAgG;AAChG,4GAA4G;AAC5G,4GAA4G;AAC5G,4GAA4G;AAC5G,0BAA0B;AAC1B,EAAE;AACF,2GAA2G;AAC3G,yGAAyG;AACzG,4GAA4G;AAC5G,uGAAuG;AACvG,2GAA2G;AAC3G,MAAM,UAAU,iBAAiB,CAAC,QAAoB,EAAE,IAAgC;IACtF,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC;IAC7B,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,IAAI;QAAE,OAAO;IAClD,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;QACrC,IAAI,KAAK,CAAC,SAAS,IAAI,CAAC,IAAI,KAAK,CAAC,SAAS,GAAG,KAAK,CAAC,MAAM;YAAE,KAAK,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,UAAU,GAAG,KAAK,CAAC,UAAU,CAAC;IACnH,CAAC;AACH,CAAC;AAED,2GAA2G;AAC3G,6GAA6G;AAC7G,MAAM,UAAU,kBAAkB,CAAC,QAA8B;IAC/D,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC,MAAM,CAAC;IACpC,MAAM,QAAQ,GAAG,KAAK,GAAG,aAAa,CAAC;IACvC,IAAI,QAAQ,CAAC,aAAa,CAAC,MAAM,KAAK,QAAQ;QAC5C,OAAO,wBAAwB,QAAQ,CAAC,aAAa,CAAC,MAAM,OAAO,QAAQ,EAAE,CAAC;IAChF,IAAI,QAAQ,CAAC,mBAAmB,CAAC,MAAM,KAAK,QAAQ,EAAE,CAAC;QACrD,OAAO,8BAA8B,QAAQ,CAAC,mBAAmB,CAAC,MAAM,OAAO,QAAQ,EAAE,CAAC;IAC5F,CAAC;IACD,IAAI,QAAQ,CAAC,YAAY,CAAC,MAAM,KAAK,QAAQ;QAC3C,OAAO,uBAAuB,QAAQ,CAAC,YAAY,CAAC,MAAM,OAAO,QAAQ,EAAE,CAAC;IAC9E,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,EAAE,CAAC,EAAE,EAAE,CAAC;QAC/B,MAAM,WAAW,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC;QAClD,IAAI,WAAW,IAAI,CAAC;YAClB,OAAO,QAAQ,CAAC,gBAAgB,WAAW,qEAAqE,CAAC;QACnH,IAAI,WAAW,GAAG,CAAC,CAAC;YAAE,OAAO,QAAQ,CAAC,gBAAgB,WAAW,OAAO,CAAC;IAC3E,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAS,UAAU,CAAC,GAAe,EAAE,MAA8B,EAAE,MAAc;IACjF,GAAG,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC;IACvB,GAAG,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IAC3B,GAAG,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IAC3B,GAAG,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IAC3B,GAAG,CAAC,EAAE,GAAG,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IAC5B,GAAG,CAAC,EAAE,GAAG,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;AAC9B,CAAC;AAED,SAAS,sBAAsB,CAAC,GAAe;IAC7C,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC;IACV,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC;IACV,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC;IACV,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC;IACV,GAAG,CAAC,EAAE,GAAG,CAAC,CAAC;IACX,GAAG,CAAC,EAAE,GAAG,CAAC,CAAC;AACb,CAAC;AAED,SAAS,WAAW,CAAC,MAAoB,EAAE,MAAc,EAAE,MAA4B;IACrF,MAAM,CAAC,MAAM,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC;IAC1B,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC;IAC9B,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC;IAC9B,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC;IAC9B,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,GAAG,MAAM,CAAC,EAAE,CAAC;IAC/B,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,GAAG,MAAM,CAAC,EAAE,CAAC;AACjC,CAAC;AAED,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,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,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"}
|
|
@@ -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":"
|
|
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
|
|
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
|
|
49
|
+
_binders = withRegistryTableEntry(getSkeleton2DAnimationTargetBinderRegistry(), kind, bind);
|
|
42
50
|
}
|
|
43
51
|
export function unregisterSkeleton2DAnimationTargetBinder(kind) {
|
|
44
|
-
_binders
|
|
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.
|
|
164
|
-
//
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
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":"AAAA,OAAO,EAAE,oBAAoB,EAAE,MAAM,8BAA8B,CAAC;
|
|
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,
|
|
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;
|
|
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"}
|
package/dist/slotDeform2D.js
CHANGED
|
@@ -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
|
|
8
|
-
// to a
|
|
9
|
-
//
|
|
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.
|
package/dist/slotDeform2D.js.map
CHANGED
|
@@ -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,
|
|
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.
|
|
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.
|
|
42
|
-
"@flighthq/entity": "0.3.
|
|
43
|
-
"@flighthq/geometry": "0.3.
|
|
44
|
-
"@flighthq/log": "0.3.
|
|
45
|
-
"@flighthq/node": "0.3.
|
|
46
|
-
"@flighthq/math": "0.3.
|
|
47
|
-
"@flighthq/path": "0.3.
|
|
48
|
-
"@flighthq/
|
|
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);
|
package/src/skeleton2d.test.ts
CHANGED
|
@@ -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.
|