@flighthq/skeleton2d-formats 0.3.0-next.1021.f5f1ee0
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/contract.d.ts +4 -0
- package/dist/contract.d.ts.map +1 -0
- package/dist/contract.js +4 -0
- package/dist/contract.js.map +1 -0
- package/dist/dragonBonesParse.d.ts +3 -0
- package/dist/dragonBonesParse.d.ts.map +1 -0
- package/dist/dragonBonesParse.js +480 -0
- package/dist/dragonBonesParse.js.map +1 -0
- package/dist/index.d.ts +4 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +4 -0
- package/dist/index.js.map +1 -0
- package/dist/skeletonDetect.d.ts +4 -0
- package/dist/skeletonDetect.d.ts.map +1 -0
- package/dist/skeletonDetect.js +45 -0
- package/dist/skeletonDetect.js.map +1 -0
- package/dist/spineParse.d.ts +3 -0
- package/dist/spineParse.d.ts.map +1 -0
- package/dist/spineParse.js +377 -0
- package/dist/spineParse.js.map +1 -0
- package/package.json +49 -0
- package/src/dragonBonesParse.test.ts +313 -0
- package/src/skeletonDetect.test.ts +50 -0
- package/src/spineParse.test.ts +292 -0
|
@@ -0,0 +1,377 @@
|
|
|
1
|
+
import { createAnimationChannel, createAnimationClip, createAnimationTrack } from '@flighthq/animation/contract';
|
|
2
|
+
import { reportImportDiagnostic } from '@flighthq/importdiagnostics/contract';
|
|
3
|
+
import { createSkeleton2D } from '@flighthq/skeleton2d/contract';
|
|
4
|
+
import { AnimationInterpolationLinear, AnimationInterpolationStep, ImportDiagnosticSeverity, MeshAttachment2DKind, RegionAttachment2DKind, Skeleton2DAnimationPath, TransformMode2D, } from '@flighthq/types/contract';
|
|
5
|
+
// Parses a Spine skeleton `.json` document (text) into a Skeleton2DImport — the setup-pose Skeleton2D
|
|
6
|
+
// plus its named animations. Tolerant and best-effort: a malformed / non-Spine document returns the
|
|
7
|
+
// sentinel `null` (the expected "unrecognized format" failure); a recognized document with missing or
|
|
8
|
+
// unmodeled pieces yields best-effort data and reports `ImportDiagnostic`s through the optional
|
|
9
|
+
// `diagnostics` sink. Names mirror Spine's vocabulary (bone/slot/skin/attachment/timeline).
|
|
10
|
+
//
|
|
11
|
+
// This first landing parses the bone hierarchy; slots, attachments, skins, and animation timelines are
|
|
12
|
+
// layered on in the same tolerant shape, and Spine features Flight does not model (IK/transform/path
|
|
13
|
+
// constraints, clipping/path/point attachments, events) emit `ImportDiagnosticSeverity.Skip` crumbs.
|
|
14
|
+
export function parseSpineSkeleton(json, diagnostics) {
|
|
15
|
+
let doc;
|
|
16
|
+
try {
|
|
17
|
+
doc = JSON.parse(json);
|
|
18
|
+
}
|
|
19
|
+
catch {
|
|
20
|
+
return null;
|
|
21
|
+
}
|
|
22
|
+
if (doc === null || typeof doc !== 'object')
|
|
23
|
+
return null;
|
|
24
|
+
const record = doc;
|
|
25
|
+
const bones = parseSpineBones(record.bones, diagnostics);
|
|
26
|
+
const defaultSkin = parseSpineDefaultSkin(record.skins, diagnostics);
|
|
27
|
+
const slots = parseSpineSlots(record.slots, bones, defaultSkin);
|
|
28
|
+
const animations = parseSpineAnimations(record.animations, bones, diagnostics);
|
|
29
|
+
return { animations, skeleton: createSkeleton2D(bones, slots) };
|
|
30
|
+
}
|
|
31
|
+
function numberOr(value, fallback) {
|
|
32
|
+
return typeof value === 'number' ? value : fallback;
|
|
33
|
+
}
|
|
34
|
+
// Spine bones are authored parent-before-child, and reference their parent by name — so a parent's index
|
|
35
|
+
// is resolvable from the bones already accumulated. Returns -1 (a root) when there is no parent or it is
|
|
36
|
+
// not yet known (a forward reference, which a well-formed Spine file never produces).
|
|
37
|
+
//
|
|
38
|
+
// The bone array is POSITIONALLY REFERENCED — a weighted mesh's vertex influences carry file-order bone
|
|
39
|
+
// indices into it (see parseSpineWeightedVertices). So a malformed entry must NOT be dropped: dropping it
|
|
40
|
+
// would shift every later bone down one slot and silently re-point every weighted-mesh influence at the
|
|
41
|
+
// wrong bone. Instead an inert placeholder bone holds the slot, keeping all indices aligned, and the
|
|
42
|
+
// recovery is recorded.
|
|
43
|
+
function parseSpineBones(raw, diagnostics) {
|
|
44
|
+
const bones = [];
|
|
45
|
+
if (!Array.isArray(raw))
|
|
46
|
+
return bones;
|
|
47
|
+
for (const entry of raw) {
|
|
48
|
+
if (entry === null || typeof entry !== 'object') {
|
|
49
|
+
reportImportDiagnostic(diagnostics, ImportDiagnosticSeverity.Recover, 'spine.malformed-bone-recovered', 'parseSpineSkeleton', { bones: 1 });
|
|
50
|
+
bones.push(createPlaceholderBone2D());
|
|
51
|
+
continue;
|
|
52
|
+
}
|
|
53
|
+
const bone = entry;
|
|
54
|
+
const name = typeof bone.name === 'string' ? bone.name : null;
|
|
55
|
+
let parentIndex = -1;
|
|
56
|
+
if (typeof bone.parent === 'string') {
|
|
57
|
+
for (let i = bones.length - 1; i >= 0; i--) {
|
|
58
|
+
if (bones[i].name === bone.parent) {
|
|
59
|
+
parentIndex = i;
|
|
60
|
+
break;
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
bones.push({
|
|
65
|
+
length: numberOr(bone.length, 0),
|
|
66
|
+
name,
|
|
67
|
+
parentIndex,
|
|
68
|
+
rotation: numberOr(bone.rotation, 0),
|
|
69
|
+
scaleX: numberOr(bone.scaleX, 1),
|
|
70
|
+
scaleY: numberOr(bone.scaleY, 1),
|
|
71
|
+
shearX: numberOr(bone.shearX, 0),
|
|
72
|
+
shearY: numberOr(bone.shearY, 0),
|
|
73
|
+
transformMode: spineTransformMode(bone.transform),
|
|
74
|
+
x: numberOr(bone.x, 0),
|
|
75
|
+
y: numberOr(bone.y, 0),
|
|
76
|
+
});
|
|
77
|
+
}
|
|
78
|
+
return bones;
|
|
79
|
+
}
|
|
80
|
+
// An inert root bone that holds a slot in the bone array when an entry is malformed, so file-order bone
|
|
81
|
+
// indices (weighted-mesh influences) stay aligned. Identity transform, no parent, no name.
|
|
82
|
+
function createPlaceholderBone2D() {
|
|
83
|
+
return {
|
|
84
|
+
length: 0,
|
|
85
|
+
name: null,
|
|
86
|
+
parentIndex: -1,
|
|
87
|
+
rotation: 0,
|
|
88
|
+
scaleX: 1,
|
|
89
|
+
scaleY: 1,
|
|
90
|
+
shearX: 0,
|
|
91
|
+
shearY: 0,
|
|
92
|
+
transformMode: TransformMode2D.Normal,
|
|
93
|
+
x: 0,
|
|
94
|
+
y: 0,
|
|
95
|
+
};
|
|
96
|
+
}
|
|
97
|
+
// Parses one Spine attachment (identified by its `name` in the skin) into an Attachment2D, or returns
|
|
98
|
+
// null for a recognized-but-unmodeled type (bounding box / path / clipping / point / linked mesh) after
|
|
99
|
+
// emitting a Skip crumb. Spine omits `type` for a region attachment (the default).
|
|
100
|
+
function parseSpineAttachment(name, raw, diagnostics) {
|
|
101
|
+
const type = typeof raw.type === 'string' ? raw.type : 'region';
|
|
102
|
+
if (type === 'region')
|
|
103
|
+
return parseSpineRegionAttachment(name, raw);
|
|
104
|
+
if (type === 'mesh')
|
|
105
|
+
return parseSpineMeshAttachment(name, raw, diagnostics);
|
|
106
|
+
reportImportDiagnostic(diagnostics, ImportDiagnosticSeverity.Skip, `spine.${type}-attachment-unsupported`, 'parseSpineSkeleton', { name: 1 });
|
|
107
|
+
return null;
|
|
108
|
+
}
|
|
109
|
+
// The "default" skin's attachment table: slotName → attachmentName → Attachment2D, the setup-pose
|
|
110
|
+
// attachments a slot can show. Alternate (named) skins are the P3 skin-set feature and are Skip-crumbed.
|
|
111
|
+
// Supports the Spine 4.x array-of-skins form and the older object form.
|
|
112
|
+
function parseSpineDefaultSkin(raw, diagnostics) {
|
|
113
|
+
const table = new Map();
|
|
114
|
+
let defaultAttachments;
|
|
115
|
+
let alternateSkinCount = 0;
|
|
116
|
+
if (Array.isArray(raw)) {
|
|
117
|
+
for (const skin of raw) {
|
|
118
|
+
if (skin === null || typeof skin !== 'object')
|
|
119
|
+
continue;
|
|
120
|
+
const s = skin;
|
|
121
|
+
if (s.name === 'default')
|
|
122
|
+
defaultAttachments = s.attachments;
|
|
123
|
+
else
|
|
124
|
+
alternateSkinCount++;
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
else if (raw !== null && typeof raw === 'object') {
|
|
128
|
+
const obj = raw;
|
|
129
|
+
defaultAttachments = obj.default;
|
|
130
|
+
alternateSkinCount = Object.keys(obj).filter((k) => k !== 'default').length;
|
|
131
|
+
}
|
|
132
|
+
if (alternateSkinCount > 0) {
|
|
133
|
+
reportImportDiagnostic(diagnostics, ImportDiagnosticSeverity.Skip, 'spine.alternate-skin-unsupported', 'parseSpineSkeleton', { skins: alternateSkinCount });
|
|
134
|
+
}
|
|
135
|
+
if (defaultAttachments === null || typeof defaultAttachments !== 'object')
|
|
136
|
+
return table;
|
|
137
|
+
for (const [slotName, slotAttachments] of Object.entries(defaultAttachments)) {
|
|
138
|
+
if (slotAttachments === null || typeof slotAttachments !== 'object')
|
|
139
|
+
continue;
|
|
140
|
+
const perSlot = new Map();
|
|
141
|
+
for (const [attachmentName, rawAttachment] of Object.entries(slotAttachments)) {
|
|
142
|
+
if (rawAttachment === null || typeof rawAttachment !== 'object')
|
|
143
|
+
continue;
|
|
144
|
+
const attachment = parseSpineAttachment(attachmentName, rawAttachment, diagnostics);
|
|
145
|
+
if (attachment !== null)
|
|
146
|
+
perSlot.set(attachmentName, attachment);
|
|
147
|
+
}
|
|
148
|
+
table.set(slotName, perSlot);
|
|
149
|
+
}
|
|
150
|
+
return table;
|
|
151
|
+
}
|
|
152
|
+
// A Spine mesh attachment. Unweighted when the `vertices` stream is exactly 2 per vertex (positions local
|
|
153
|
+
// to the slot's bone); weighted (Spine format `[boneCount, (boneIndex, x, y, weight)×boneCount]` per
|
|
154
|
+
// vertex) otherwise, producing a Skin2D whose bone indices are global skeleton bone indices.
|
|
155
|
+
function parseSpineMeshAttachment(name, raw, diagnostics) {
|
|
156
|
+
const uvs = toFloat32Array(raw.uvs);
|
|
157
|
+
const triangles = toUint16Array(raw.triangles);
|
|
158
|
+
const rawVerts = Array.isArray(raw.vertices) ? raw.vertices : [];
|
|
159
|
+
const vertexCount = uvs.length >> 1;
|
|
160
|
+
if (rawVerts.length === vertexCount * 2) {
|
|
161
|
+
return {
|
|
162
|
+
kind: MeshAttachment2DKind,
|
|
163
|
+
name,
|
|
164
|
+
skin: null,
|
|
165
|
+
triangles,
|
|
166
|
+
uvs,
|
|
167
|
+
vertexCount,
|
|
168
|
+
vertices: Float32Array.from(rawVerts),
|
|
169
|
+
};
|
|
170
|
+
}
|
|
171
|
+
return {
|
|
172
|
+
kind: MeshAttachment2DKind,
|
|
173
|
+
name,
|
|
174
|
+
skin: parseSpineWeightedVertices(rawVerts, vertexCount, diagnostics),
|
|
175
|
+
triangles,
|
|
176
|
+
uvs,
|
|
177
|
+
vertexCount,
|
|
178
|
+
vertices: null,
|
|
179
|
+
};
|
|
180
|
+
}
|
|
181
|
+
function parseSpineRegionAttachment(name, raw) {
|
|
182
|
+
return {
|
|
183
|
+
height: numberOr(raw.height, 0),
|
|
184
|
+
kind: RegionAttachment2DKind,
|
|
185
|
+
name,
|
|
186
|
+
rotation: numberOr(raw.rotation, 0),
|
|
187
|
+
scaleX: numberOr(raw.scaleX, 1),
|
|
188
|
+
scaleY: numberOr(raw.scaleY, 1),
|
|
189
|
+
width: numberOr(raw.width, 0),
|
|
190
|
+
x: numberOr(raw.x, 0),
|
|
191
|
+
y: numberOr(raw.y, 0),
|
|
192
|
+
};
|
|
193
|
+
}
|
|
194
|
+
// Slots bind a bone to its currently-shown attachment; their array order is the draw order. `boneIndex`
|
|
195
|
+
// resolves the slot's bone name; the shown attachment is the slot's `attachment` name looked up in the
|
|
196
|
+
// default skin. `color` is the Spine "rrggbbaa" tint (default opaque white).
|
|
197
|
+
function parseSpineSlots(raw, bones, skin) {
|
|
198
|
+
const slots = [];
|
|
199
|
+
if (!Array.isArray(raw))
|
|
200
|
+
return slots;
|
|
201
|
+
for (const entry of raw) {
|
|
202
|
+
if (entry === null || typeof entry !== 'object')
|
|
203
|
+
continue;
|
|
204
|
+
const slot = entry;
|
|
205
|
+
const name = typeof slot.name === 'string' ? slot.name : null;
|
|
206
|
+
let boneIndex = -1;
|
|
207
|
+
if (typeof slot.bone === 'string') {
|
|
208
|
+
for (let i = 0; i < bones.length; i++) {
|
|
209
|
+
if (bones[i].name === slot.bone) {
|
|
210
|
+
boneIndex = i;
|
|
211
|
+
break;
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
let attachment = null;
|
|
216
|
+
if (typeof slot.attachment === 'string' && name !== null) {
|
|
217
|
+
attachment = skin.get(name)?.get(slot.attachment) ?? null;
|
|
218
|
+
}
|
|
219
|
+
slots.push({ attachment, boneIndex, color: parseSpineColor(slot.color), name });
|
|
220
|
+
}
|
|
221
|
+
return slots;
|
|
222
|
+
}
|
|
223
|
+
// A Spine "rrggbbaa" hex color to a packed RGBA integer; opaque white (0xffffffff) when absent/invalid.
|
|
224
|
+
function parseSpineColor(value) {
|
|
225
|
+
if (typeof value !== 'string' || value.length !== 8)
|
|
226
|
+
return 0xffffffff;
|
|
227
|
+
const parsed = Number.parseInt(value, 16);
|
|
228
|
+
return Number.isNaN(parsed) ? 0xffffffff : parsed >>> 0;
|
|
229
|
+
}
|
|
230
|
+
// Decodes Spine's variable-influence weighted-vertex stream: per vertex a `boneCount` followed by that many
|
|
231
|
+
// `(boneIndex, x, y, weight)` quads. Both the vertex count (from `uvs`) and each `boneCount` are declared IN
|
|
232
|
+
// the file, independent of the stream's actual length — so every read is bounded against `rawVerts.length`
|
|
233
|
+
// (the independent address anchor): a `boneCount` that would run past the end is clamped to what remains,
|
|
234
|
+
// and the recovery is recorded. Without this a corrupt count reads `undefined` (→ NaN) or, with a huge
|
|
235
|
+
// value, spins a near-unbounded push loop. `boneIndex` values are file-order indices into the bone array;
|
|
236
|
+
// parseSpineBones keeps that array aligned (it never drops a slot) so they stay valid.
|
|
237
|
+
function parseSpineWeightedVertices(rawVerts, vertexCount, diagnostics) {
|
|
238
|
+
const influenceCounts = new Uint16Array(vertexCount);
|
|
239
|
+
const influences = [];
|
|
240
|
+
let truncated = false;
|
|
241
|
+
let r = 0;
|
|
242
|
+
for (let v = 0; v < vertexCount; v++) {
|
|
243
|
+
if (r >= rawVerts.length) {
|
|
244
|
+
truncated = true;
|
|
245
|
+
break;
|
|
246
|
+
}
|
|
247
|
+
const declared = rawVerts[r++] | 0;
|
|
248
|
+
const available = Math.max(0, (rawVerts.length - r) >> 2);
|
|
249
|
+
const boneCount = Math.min(Math.max(declared, 0), available);
|
|
250
|
+
if (boneCount !== declared)
|
|
251
|
+
truncated = true;
|
|
252
|
+
influenceCounts[v] = boneCount;
|
|
253
|
+
for (let k = 0; k < boneCount; k++) {
|
|
254
|
+
influences.push(rawVerts[r], rawVerts[r + 1], rawVerts[r + 2], rawVerts[r + 3]);
|
|
255
|
+
r += 4;
|
|
256
|
+
}
|
|
257
|
+
}
|
|
258
|
+
if (truncated) {
|
|
259
|
+
reportImportDiagnostic(diagnostics, ImportDiagnosticSeverity.Recover, 'spine.weighted-vertices-truncated', 'parseSpineSkeleton', { vertices: 1 });
|
|
260
|
+
}
|
|
261
|
+
return { influenceCounts, influences: Float32Array.from(influences) };
|
|
262
|
+
}
|
|
263
|
+
function toFloat32Array(value) {
|
|
264
|
+
return Array.isArray(value) ? Float32Array.from(value) : new Float32Array();
|
|
265
|
+
}
|
|
266
|
+
function toUint16Array(value) {
|
|
267
|
+
return Array.isArray(value) ? Uint16Array.from(value) : new Uint16Array();
|
|
268
|
+
}
|
|
269
|
+
// Adds one bone-timeline channel to `channels`: builds an AnimationTrack from the Spine keyframes (times
|
|
270
|
+
// + `extract`ed component values, with the setup pose already baked into `extract`) targeting the bone's
|
|
271
|
+
// `path`. A timeline whose every keyframe is `curve: 'stepped'` is a Step track; otherwise Linear.
|
|
272
|
+
function addSpineBoneChannel(channels, rawKeys, boneIndex, path, components, extract) {
|
|
273
|
+
if (!Array.isArray(rawKeys) || rawKeys.length === 0)
|
|
274
|
+
return;
|
|
275
|
+
const times = [];
|
|
276
|
+
const values = [];
|
|
277
|
+
let allStepped = true;
|
|
278
|
+
for (const key of rawKeys) {
|
|
279
|
+
if (key === null || typeof key !== 'object')
|
|
280
|
+
continue;
|
|
281
|
+
const k = key;
|
|
282
|
+
times.push(numberOr(k.time, 0));
|
|
283
|
+
for (const component of extract(k))
|
|
284
|
+
values.push(component);
|
|
285
|
+
if (k.curve !== 'stepped')
|
|
286
|
+
allStepped = false;
|
|
287
|
+
}
|
|
288
|
+
const interpolation = allStepped ? AnimationInterpolationStep : AnimationInterpolationLinear;
|
|
289
|
+
const track = createAnimationTrack({ components, interpolation, times, values });
|
|
290
|
+
channels.push(createAnimationChannel(track, { boneIndex, path }));
|
|
291
|
+
}
|
|
292
|
+
function indexOfBone(bones, name) {
|
|
293
|
+
for (let i = 0; i < bones.length; i++) {
|
|
294
|
+
if (bones[i].name === name)
|
|
295
|
+
return i;
|
|
296
|
+
}
|
|
297
|
+
return -1;
|
|
298
|
+
}
|
|
299
|
+
// Builds one AnimationClip per Spine animation from its bone rotate/translate/scale/shear timelines.
|
|
300
|
+
// Spine bone timelines are RELATIVE to the setup pose (rotate/translate/shear are offsets, scale is a
|
|
301
|
+
// multiplier), and clips are emitted as those RAW relative deltas — `applyAnimationClipToSkeleton2D`
|
|
302
|
+
// composes them onto the setup pose per frame (add / multiply, keyed by `path`). Keeping deltas relative
|
|
303
|
+
// (rather than baking setup into keys) is what lets a mixer blend clips as `setup + Σ wᵢ·deltaᵢ`.
|
|
304
|
+
// Constraint (ik/transform/path), event, deform, draw-order, and slot timelines are recognized-but-
|
|
305
|
+
// unmodeled and Skip-crumbed. (Spine per-keyframe bezier curves approximate to Linear — a P1 fidelity
|
|
306
|
+
// limit noted in the package status.)
|
|
307
|
+
function parseSpineAnimations(raw, bones, diagnostics) {
|
|
308
|
+
const animations = [];
|
|
309
|
+
if (raw === null || typeof raw !== 'object')
|
|
310
|
+
return animations;
|
|
311
|
+
for (const [name, animEntry] of Object.entries(raw)) {
|
|
312
|
+
if (animEntry === null || typeof animEntry !== 'object')
|
|
313
|
+
continue;
|
|
314
|
+
const anim = animEntry;
|
|
315
|
+
const channels = [];
|
|
316
|
+
if (anim.bones !== null && typeof anim.bones === 'object') {
|
|
317
|
+
for (const [boneName, timelinesEntry] of Object.entries(anim.bones)) {
|
|
318
|
+
const boneIndex = indexOfBone(bones, boneName);
|
|
319
|
+
if (boneIndex < 0 || timelinesEntry === null || typeof timelinesEntry !== 'object')
|
|
320
|
+
continue;
|
|
321
|
+
const timelines = timelinesEntry;
|
|
322
|
+
addSpineBoneChannel(channels, timelines.rotate, boneIndex, Skeleton2DAnimationPath.Rotation, 1, (k) => [
|
|
323
|
+
numberOr(k.value, 0),
|
|
324
|
+
]);
|
|
325
|
+
addSpineBoneChannel(channels, timelines.translate, boneIndex, Skeleton2DAnimationPath.Translation, 2, (k) => [
|
|
326
|
+
numberOr(k.x, 0),
|
|
327
|
+
numberOr(k.y, 0),
|
|
328
|
+
]);
|
|
329
|
+
addSpineBoneChannel(channels, timelines.scale, boneIndex, Skeleton2DAnimationPath.Scale, 2, (k) => [
|
|
330
|
+
numberOr(k.x, 1),
|
|
331
|
+
numberOr(k.y, 1),
|
|
332
|
+
]);
|
|
333
|
+
addSpineBoneChannel(channels, timelines.shear, boneIndex, Skeleton2DAnimationPath.Shear, 2, (k) => [
|
|
334
|
+
numberOr(k.x, 0),
|
|
335
|
+
numberOr(k.y, 0),
|
|
336
|
+
]);
|
|
337
|
+
}
|
|
338
|
+
}
|
|
339
|
+
skipCrumbSpineTimelineGroup(diagnostics, anim.slots, 'spine.slot-timeline-unsupported');
|
|
340
|
+
skipCrumbSpineTimelineGroup(diagnostics, anim.ik, 'spine.ik-timeline-unsupported');
|
|
341
|
+
skipCrumbSpineTimelineGroup(diagnostics, anim.transform, 'spine.transform-timeline-unsupported');
|
|
342
|
+
skipCrumbSpineTimelineGroup(diagnostics, anim.path, 'spine.path-timeline-unsupported');
|
|
343
|
+
skipCrumbSpineTimelineGroup(diagnostics, anim.deform, 'spine.deform-timeline-unsupported');
|
|
344
|
+
skipCrumbSpineTimelineGroup(diagnostics, anim.events, 'spine.event-timeline-unsupported');
|
|
345
|
+
skipCrumbSpineTimelineGroup(diagnostics, anim.drawOrder ?? anim.draworder, 'spine.draworder-timeline-unsupported');
|
|
346
|
+
animations.push({ clip: createAnimationClip(channels), name });
|
|
347
|
+
}
|
|
348
|
+
return animations;
|
|
349
|
+
}
|
|
350
|
+
// Reports one aggregated Skip crumb for an unmodeled animation timeline group, with the group's element
|
|
351
|
+
// count. An absent or empty group is silent.
|
|
352
|
+
function skipCrumbSpineTimelineGroup(diagnostics, raw, kind) {
|
|
353
|
+
let count = 0;
|
|
354
|
+
if (Array.isArray(raw))
|
|
355
|
+
count = raw.length;
|
|
356
|
+
else if (raw !== null && typeof raw === 'object')
|
|
357
|
+
count = Object.keys(raw).length;
|
|
358
|
+
if (count > 0)
|
|
359
|
+
reportImportDiagnostic(diagnostics, ImportDiagnosticSeverity.Skip, kind, 'parseSpineSkeleton', { count });
|
|
360
|
+
}
|
|
361
|
+
// Maps a Spine bone `transform` string to a TransformMode2D. Spine omits the field for the default,
|
|
362
|
+
// so an absent/unknown value is `Normal`.
|
|
363
|
+
function spineTransformMode(value) {
|
|
364
|
+
switch (value) {
|
|
365
|
+
case 'onlyTranslation':
|
|
366
|
+
return TransformMode2D.OnlyTranslation;
|
|
367
|
+
case 'noRotationOrReflection':
|
|
368
|
+
return TransformMode2D.NoRotationOrReflection;
|
|
369
|
+
case 'noScale':
|
|
370
|
+
return TransformMode2D.NoScale;
|
|
371
|
+
case 'noScaleOrReflection':
|
|
372
|
+
return TransformMode2D.NoScaleOrReflection;
|
|
373
|
+
default:
|
|
374
|
+
return TransformMode2D.Normal;
|
|
375
|
+
}
|
|
376
|
+
}
|
|
377
|
+
//# sourceMappingURL=spineParse.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"spineParse.js","sourceRoot":"","sources":["../src/spineParse.ts"],"names":[],"mappings":"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"}
|
package/package.json
ADDED
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@flighthq/skeleton2d-formats",
|
|
3
|
+
"version": "0.3.0-next.1021.f5f1ee0",
|
|
4
|
+
"repository": {
|
|
5
|
+
"type": "git",
|
|
6
|
+
"url": "https://github.com/flighthq/flight.git",
|
|
7
|
+
"directory": "packages/skeleton2d-formats"
|
|
8
|
+
},
|
|
9
|
+
"type": "module",
|
|
10
|
+
"main": "dist/index.js",
|
|
11
|
+
"types": "dist/index.d.ts",
|
|
12
|
+
"exports": {
|
|
13
|
+
".": {
|
|
14
|
+
"types": "./dist/index.d.ts",
|
|
15
|
+
"default": "./dist/index.js"
|
|
16
|
+
},
|
|
17
|
+
"./contract": {
|
|
18
|
+
"types": "./dist/contract.d.ts",
|
|
19
|
+
"default": "./dist/contract.js"
|
|
20
|
+
}
|
|
21
|
+
},
|
|
22
|
+
"files": [
|
|
23
|
+
"dist",
|
|
24
|
+
"src/**/*.test.ts",
|
|
25
|
+
"!dist/**/*.test.js",
|
|
26
|
+
"!dist/**/*.test.d.ts",
|
|
27
|
+
"!dist/**/*.test.js.map",
|
|
28
|
+
"!dist/**/*.test.d.ts.map"
|
|
29
|
+
],
|
|
30
|
+
"scripts": {
|
|
31
|
+
"build": "tsc -b",
|
|
32
|
+
"clean": "tsc -b --clean",
|
|
33
|
+
"test": "vitest run --config vitest.config.ts",
|
|
34
|
+
"test:watch": "vitest --watch --config vitest.config.ts",
|
|
35
|
+
"prepack": "npm run clean && npm run clean:dist && npm run build",
|
|
36
|
+
"clean:dist": "tsx ../../scripts/clean-package-dist.ts"
|
|
37
|
+
},
|
|
38
|
+
"dependencies": {
|
|
39
|
+
"@flighthq/animation": "0.3.0-next.1021.f5f1ee0",
|
|
40
|
+
"@flighthq/importdiagnostics": "0.3.0-next.1021.f5f1ee0",
|
|
41
|
+
"@flighthq/skeleton2d": "0.3.0-next.1021.f5f1ee0",
|
|
42
|
+
"@flighthq/types": "0.3.0-next.1021.f5f1ee0"
|
|
43
|
+
},
|
|
44
|
+
"devDependencies": {
|
|
45
|
+
"typescript": "^5.3.0"
|
|
46
|
+
},
|
|
47
|
+
"description": "Import 2D skeletal rigs from industry formats (Spine .json/.skel, DragonBones) into skeleton2d + animation clips",
|
|
48
|
+
"sideEffects": false
|
|
49
|
+
}
|