spine-rigc 2.56.0 → 2.58.0
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/README.md +3 -1
- package/docs/AUTHORING.md +709 -264
- package/package.json +1 -1
- package/skills/rigc/SKILL.md +7 -2
- package/skills/rigc-face/SKILL.md +3 -1
- package/skills/rigc-ingest/SKILL.md +3 -1
- package/skills/rigc-motion/SKILL.md +3 -1
- package/skills/rigc-rigging/SKILL.md +3 -1
- package/src/atlas.ts +10 -10
- package/src/cli/core_commands.ts +52 -0
- package/src/cli/shared.ts +119 -3
- package/src/compile.ts +356 -334
- package/src/deformgen.ts +28 -28
- package/src/emit_spine.ts +5 -5
- package/src/errors.ts +8 -0
- package/src/guide.ts +4 -9
- package/src/keys.ts +4 -4
- package/src/meshsplit.ts +683 -0
- package/src/model.ts +10 -10
- package/src/motion.ts +6 -6
- package/src/rig.ts +76 -76
- package/src/stop.ts +30 -30
- package/src/trackgen.ts +11 -11
package/docs/AUTHORING.md
CHANGED
|
@@ -5,6 +5,11 @@ seen this repository and cannot see what it is authoring. Together with the
|
|
|
5
5
|
validator's messages it *is* the interface: there is no editor viewport here, so
|
|
6
6
|
the only way to know a rig is right is to compile it and read what comes back.
|
|
7
7
|
|
|
8
|
+
A compile refusal now ends with ` (see rigc guide <CODE>)`: run that command
|
|
9
|
+
first for its one repair row. For surrounding context, `rigc guide §5.1.<k>`
|
|
10
|
+
prints one numbered compile-error group, capped at 30,000 UTF-8 bytes. An uncoded
|
|
11
|
+
library error retains the legacy `§5.1` pointer.
|
|
12
|
+
|
|
8
13
|
Two input files, one CLI loop, and a list of named failures. Everything below is
|
|
9
14
|
checked against the code that implements it.
|
|
10
15
|
|
|
@@ -156,6 +161,9 @@ name the commands that need the runtime (its `--help` lists the ones it runs).
|
|
|
156
161
|
gate before it wrote, and which rules that gate is on this entry, before the install
|
|
157
162
|
route; on a Spine export it says what it always said (`RC36`).
|
|
158
163
|
`rigc --version` names the entry that ran.
|
|
164
|
+
`rigc help <command>` prints what `rigc <command> --help` prints and exits the same
|
|
165
|
+
way, on either entry, and `rigc help` alone is `rigc --help`; a name that is no
|
|
166
|
+
command is refused naming the nearest one, exit 2, as an unknown command is.
|
|
159
167
|
|
|
160
168
|
That entry's `build` takes the same flags and writes the same files, byte for byte:
|
|
161
169
|
`skeleton.json`, `skeleton.atlas`, `skeleton.model.json`, and the pages `--pack` or
|
|
@@ -2304,7 +2312,7 @@ these messages prints the outline walk, because the walk is the fix:
|
|
|
2304
2312
|
| a stated `hull` that disagrees | `hull 25 disagrees with the triangles, whose outline has 16 vertices (0 → 1 → 2 → …). Delete "hull" and rigc derives it, or state 16` |
|
|
2305
2313
|
| outline vertices that are not the first `hull` of the list | `hull vertices must come first; vertex 19 is on the boundary and vertex 6 is not. The triangles' outline runs 0 → 1 → 2 → 3 → 4 → 9 → 14 → 19 → 24 → 23 → 22 → 21 → 20 → 15 → 10 → 5: list those 16 vertices first, in that order, then the 9 interior vertices` |
|
|
2306
2314
|
| outline vertices that are first but zigzag | `hull vertices must trace the outline in order; the triangles' outline runs 0 → 1 → 3 → 5 → … → 4 → 2, so vertex 3 has to follow vertex 1 in the list, and vertex 2 does. Renumber the vertices along that walk` |
|
|
2307
|
-
| triangles with no single outline | `the triangles do not tile the outline: 25 vertices with a 16-vertex outline tile as 32 triangles and there are 33` — an unused vertex or a doubled interior triangle; or `the triangles' outline is not one closed loop: vertex 4 has 4 boundary edges` — a pinch, a hole, or a doubled triangle on the perimeter |
|
|
2315
|
+
| triangles with no single outline | `the triangles do not tile the outline: 25 vertices with a 16-vertex outline tile as 32 triangles and there are 33` — an unused vertex or a doubled interior triangle; or `the triangles' outline is not one closed loop: vertex 4 has 4 boundary edges` — a pinch, a hole, or a doubled triangle on the perimeter. Triangles in pieces that share no vertex get the same sentence and then `— the triangles are 2 pieces that share no vertex …` naming `rigc split`, which writes one mesh per piece (§3.4.11) |
|
|
2308
2316
|
|
|
2309
2317
|
🚨 **A row-major grid is the case this catches**: a 5×5 grid's perimeter is 16 of
|
|
2310
2318
|
its 25 vertices, interleaved with the interior, so no `hull` can describe that
|
|
@@ -3552,6 +3560,104 @@ packed region is still refused.
|
|
|
3552
3560
|
`A46_SEQUENCE_ATTACHMENTS_SHOW_THE_FRAME_THE_FILE_STATES` (§5.2) holds the block and
|
|
3553
3561
|
every frame the timelines show against the file.
|
|
3554
3562
|
|
|
3563
|
+
#### 3.4.11 `split` — one mesh per piece, when the triangles are several
|
|
3564
|
+
|
|
3565
|
+
One mesh is one outline (the `hull` rule above), so a mesh whose triangles fall into
|
|
3566
|
+
pieces that share no vertex is refused at compile — typically after the transparent
|
|
3567
|
+
triangles that bridged two legs were deleted:
|
|
3568
|
+
|
|
3569
|
+
```
|
|
3570
|
+
rigc compile error: skin "default" slot "legs" attachment "legs": the triangles' outline is not one closed
|
|
3571
|
+
loop: the walk from vertex 0 closes after 8 of 16 boundary vertices — the triangles are 2 pieces that share no
|
|
3572
|
+
vertex, and one mesh is one outline: `rigc split --rig <rig> --motion <motion> --slot legs --attachment legs
|
|
3573
|
+
--out <dir>` writes one mesh per piece, its deform keys renumbered (AUTHORING §3.4.11) (see rigc guide §5.1)
|
|
3574
|
+
```
|
|
3575
|
+
|
|
3576
|
+
Each name in that command is one shell word: a slot, placeholder or skin whose name
|
|
3577
|
+
holds a space or a character a shell reads (`'`, `$`, `;`, …) is printed
|
|
3578
|
+
single-quoted, a `'` inside it as `'\''` — `--slot 'left legs'` — and a plain name
|
|
3579
|
+
is printed as it is. So the command copies into a shell as printed, with only
|
|
3580
|
+
`<rig>`, `<motion>` and `<dir>` to fill in.
|
|
3581
|
+
|
|
3582
|
+
The fix is one mesh per piece, and every number in it is a renumbering: each piece's
|
|
3583
|
+
`uvs`, its `weights` (or `vertices`), its `triangles`, and every `deform` key that
|
|
3584
|
+
moved it (§4.11). `rigc split` writes that proposal from the two spec files — not from
|
|
3585
|
+
a build, because a mesh of several pieces has none:
|
|
3586
|
+
|
|
3587
|
+
```bash
|
|
3588
|
+
rigc split --rig rig.json --motion motion.json --slot legs --out split/
|
|
3589
|
+
# rigc split /abs/rig.json
|
|
3590
|
+
# .. motion /abs/motion.json
|
|
3591
|
+
# .. mesh skin "default" slot "legs" attachment "legs": 18 vertices, 16 triangles, 2 pieces (triangles that share a vertex are one piece)
|
|
3592
|
+
# .. piece 1 slot "legs" (the original slot): 9 vertices, 8 triangles, hull 8 — original order kept: [3, 4, 5, 6, 7, 8, 9, 16, 17]
|
|
3593
|
+
# .. piece 2 slot "legs_2" (new, drawn after "legs"): 9 vertices, 8 triangles, hull 8 — renumbered outline first, as the hull rule needs: piece vertex 0.. is original 0 → 1 → 2 → 15 → 10 → 11 → 12 → 13, then the interior [14]
|
|
3594
|
+
# .. deform animation "walk": 5 key(s) re-sliced into 2 timelines — "legs" 3 with a run, "legs_2" 2 with a run
|
|
3595
|
+
# .. track animation "walk": slot "legs" "rgba" copied to "legs_2"
|
|
3596
|
+
# .. images ../ (the rig spec's own, restated from /abs/split — it resolves to /abs)
|
|
3597
|
+
# rigc: wrote /abs/split/rig.json
|
|
3598
|
+
# rigc: wrote /abs/split/motion.json
|
|
3599
|
+
# rigc: wrote /abs/split/split.json
|
|
3600
|
+
# rigc: build it with rigc build --rig /abs/split/rig.json --motion /abs/split/motion.json --out <dir>
|
|
3601
|
+
```
|
|
3602
|
+
|
|
3603
|
+
What it decides, and the one reason for each:
|
|
3604
|
+
|
|
3605
|
+
| | |
|
|
3606
|
+
| --- | --- |
|
|
3607
|
+
| a piece | triangles that share a vertex — nothing else: no distance, no art, no threshold. Two triangles touching at one vertex are one piece, and that piece is refused for its pinch as the compiler would refuse it |
|
|
3608
|
+
| which piece is 1 | the one whose first triangle is listed first. Spine draws a mesh's triangles in list order, so that is the piece the original drew first; when the pieces' triangles interleave in the list, an `order` line says the split draws each piece whole and where they overlap the stacking can differ |
|
|
3609
|
+
| where the pieces go | piece 1 stays in the slot under its placeholder, so everything naming the slot keeps its meaning; piece k gets a new slot **`<slot>_<k>`** on the same bone with the same colour, dark colour and blend, directly after the original in `slots` — the draw order — filled under the **same placeholder**, so `name`, `path` and `image` resolve as before. A derived name the rig already declares is refused by name |
|
|
3610
|
+
| a piece's vertex order | the original's relative order when it already lists the piece's outline first and in order; otherwise the outline walk, then the interior in original order — the order the `hull` refusals ask for, so the piece builds without a second edit |
|
|
3611
|
+
| `hull`, `edges` | `hull` is left out (rigc derives it); stated `edges` are split with their vertices, and an edge joining two pieces is refused — so is one from a piece to a vertex no triangle names, the refusal saying `(in no piece: no triangle names it)` for that end. An edge whose **two** vertices no triangle names has no piece to go in: it is dropped, and named on a `dropped` line — `dropped 1 stated edge(s) between vertices no triangle names, edge 2 (vertex 18 to vertex 19): …` — so the pieces' `edges` are the original's minus exactly the ones that line names |
|
|
3612
|
+
| a deform key | its run re-sliced: each number goes to its vertex's piece at the vertex's new index, written as `offset` + `vertices`, and an index inside a piece's new run that the original run did not cover is written **`0`** — what the parser held there, because a key is a sparse edit and both encodings are offsets from setup. A piece the run did not reach gets the key with no `vertices`, the setup pose, which is what the original did to it. Every piece keeps the key's time and curve |
|
|
3613
|
+
| colour and attachment tracks on the slot | copied to every new slot; an `attachment` key showing the split placeholder shows each piece, any other shows nothing in the new slots. `setup` (or the slot's `attachment`) the same way |
|
|
3614
|
+
| `invariants.deformMayFold` naming the slot | its entry copied to the new slots |
|
|
3615
|
+
| `invariants.meshSlots` | left as stated, and the line does the arithmetic: the mesh slots the split adds, the mesh attachments the proposal's skins then hold (every `type: "mesh"` without a `source`, as the compile counts them), and — when that is over the budget — the figure to raise it by: `invariant invariants.meshSlots states 1, and the split adds 1 mesh slot(s): the proposal's skins hold 2 mesh attachment(s), 1 over the budget, so its build is refused at compile ("2 mesh slot(s) emitted") unless the rig spec raises invariants.meshSlots by 1, to 2; …`. Within the budget it says so. The refusal it predicts is the compile's (§3.7), which stops before `A13_MESH_BUDGET` runs |
|
|
3616
|
+
| a vertex no triangle names | no piece can hold it and still build, and it draws nothing in either rig: dropped, and named on a `dropped` line and in `split.json` |
|
|
3617
|
+
| `images` | restated from `--out`, so every `image` resolves to the file it resolved to before |
|
|
3618
|
+
|
|
3619
|
+
It writes three files into an `--out` that is **absent or empty** — `rig.json` and
|
|
3620
|
+
`motion.json`, your two specs with the mesh split and nothing else changed but
|
|
3621
|
+
`images`, and `split.json` (`rigc-split/1`): for each piece its slot, placeholder,
|
|
3622
|
+
`vertices` (piece vertex `j` is original vertex `vertices[j]`), `triangles` (original
|
|
3623
|
+
triangle indices) and `hull`, and the `dropped` vertices. There is no in-place flag:
|
|
3624
|
+
your specs are the only statement of what the proposal must reproduce, so it is
|
|
3625
|
+
written beside them, never over them. Build it and look before adopting it.
|
|
3626
|
+
|
|
3627
|
+
A mesh of one piece is said so on one line — `rigc split: skin "default" slot "legs"
|
|
3628
|
+
attachment "legs" is one piece — …; nothing to split, and nothing written` — exit 0.
|
|
3629
|
+
A slot, attachment or skin the specs do not have is refused with the names they do,
|
|
3630
|
+
exit 2. What the split cannot carry is refused by name, exit 1, because each needs a
|
|
3631
|
+
decision the specs do not state:
|
|
3632
|
+
|
|
3633
|
+
| Refused | Why |
|
|
3634
|
+
| --- | --- |
|
|
3635
|
+
| a `generator` mesh | a generator builds one outline by construction; there are no authored triangles |
|
|
3636
|
+
| a `sequence` on the mesh, or a sequence timeline on it | which frames each piece shows is not stated |
|
|
3637
|
+
| `"boneIndexing": "raw"` | write the weights by name (`weights`) and split that |
|
|
3638
|
+
| a deform key stated as a `transform` (§4.11.1) | the model is evaluated over the whole attachment's geometry, and splitting changes the geometry it reads; state it as a `vertices` run |
|
|
3639
|
+
| a `fromVertex` key over a vertex with two or more bones, a run past the array | the compiler refuses the key; so does the split |
|
|
3640
|
+
| the slot filled in another skin | the new slots would show this skin's pieces under that skin too |
|
|
3641
|
+
| a linked mesh borrowing the mesh | its geometry would have to be one of the pieces |
|
|
3642
|
+
| a clip whose range ends at the slot | the new slots would fall outside it |
|
|
3643
|
+
| a draw-order key, or a slot-property track on a `group`, naming the slot | where the new slots go then is not stated |
|
|
3644
|
+
| a piece that is not one mesh either (a pinch, a hole) | splitting does not fix it; the message is the outline refusal for that piece |
|
|
3645
|
+
|
|
3646
|
+
⭐ **What makes the proposal exact rather than plausible**: a piece's vertices carry
|
|
3647
|
+
the original's entries unchanged, so posing the split rig puts every piece vertex where
|
|
3648
|
+
the original put its vertex. The selftest holds that at tolerance 0 — the setup pose and
|
|
3649
|
+
every frame of every animation, deform keys, colour and attachment keys included, on
|
|
3650
|
+
the core and on spine-core — on a public probe of two legs, against the same mesh with
|
|
3651
|
+
its bridge still in (deleting triangles moves no vertex, so that mesh is the original
|
|
3652
|
+
every frame is held to), and plants a renumbering off by one and a deform key left
|
|
3653
|
+
un-renumbered to see each go red (`SPL01`–`SPL11`). The three lines above are held
|
|
3654
|
+
the same way: the printed command on a slot, placeholder and skin named with spaces
|
|
3655
|
+
and shell characters runs in `/bin/sh` and splits that mesh, and printed bare it does
|
|
3656
|
+
not (`SPL12`); the proposal's edges map back to the original's minus the named one
|
|
3657
|
+
(`SPL13`); and at an exact `meshSlots` budget the raise the line states is the build
|
|
3658
|
+
refusal's own count minus its budget, raised by it the proposal builds green, and one
|
|
3659
|
+
more slot of budget prints no raise (`SPL14`).
|
|
3660
|
+
|
|
3555
3661
|
### 3.5 `constraints` — 4.3's single typed array
|
|
3556
3662
|
|
|
3557
3663
|
Spine 4.3 folds every constraint into one `constraints` array with a `type`
|
|
@@ -6717,77 +6823,25 @@ number, is under *nothing to draw* in §3.4.
|
|
|
6717
6823
|
### 5.1 Compile errors — before the gate
|
|
6718
6824
|
|
|
6719
6825
|
A `CompileError` names the object and the field, and nothing is written. Its line
|
|
6720
|
-
ends with ` (see rigc guide
|
|
6721
|
-
|
|
6722
|
-
|
|
6723
|
-
|
|
6724
|
-
|
|
6725
|
-
|
|
6726
|
-
|
|
6727
|
-
|
|
6728
|
-
|
|
6729
|
-
|
|
6730
|
-
|
|
6731
|
-
|
|
6732
|
-
|
|
6733
|
-
|
|
6734
|
-
the
|
|
6735
|
-
|
|
6736
|
-
|
|
6737
|
-
|
|
6738
|
-
|
|
6739
|
-
```
|
|
6740
|
-
rigc compile error: rig.json: constraint "ctl" (physics) has 4 keys this compiler
|
|
6741
|
-
does not read: "scaleYMode" (did you mean "scaleY", "scaleX"?), "scale" (did you
|
|
6742
|
-
mean "scaleX", "scaleY"?), "wobble", "ROTATE" (did you mean "rotate"?). Nothing
|
|
6743
|
-
reads such a key, so it would be dropped from the emitted skeleton in silence —
|
|
6744
|
-
fix the spelling or remove it. Known here: bone, damping, dampingGlobal, fps, …
|
|
6745
|
-
```
|
|
6746
|
-
|
|
6747
|
-
Read it as a **repair**, not a rule: every stray key on that object is named at
|
|
6748
|
-
once, the closest known spellings come with it (the search is case-insensitive, so
|
|
6749
|
-
a real key in the wrong case leads the list), and the shape's whole key set is
|
|
6750
|
-
printed after. What it will *not* do is guess — a key four edits from anything gets
|
|
6751
|
-
no suggestion, only the set.
|
|
6752
|
-
|
|
6753
|
-
⭐ **The scan runs before the required keys are asked for, in both files**, and
|
|
6754
|
-
that is what decides which message a *misspelled* required key gets. Misspelling
|
|
6755
|
-
one is the commonest way to lose it, so it is refused as the typo it is rather than
|
|
6756
|
-
as the thing it lost:
|
|
6757
|
-
|
|
6758
|
-
```
|
|
6759
|
-
rigc compile error: rig.json: this rig spec has a key this compiler does not read:
|
|
6760
|
-
"slot" (did you mean "slots"?). Nothing reads such a key, so it would be dropped
|
|
6761
|
-
from the emitted skeleton in silence — fix the spelling or remove it. Known here:
|
|
6762
|
-
bones, constraints, events, images, invariants, name, note, skeleton, skins, slots,
|
|
6763
|
-
spec.
|
|
6764
|
-
```
|
|
6765
|
-
|
|
6766
|
-
A key that is **genuinely** absent has no near miss to name, so the scan finds
|
|
6767
|
-
nothing and the required-key message below it is what arrives — `a rig spec needs a
|
|
6768
|
-
"slots" array (it may be empty; its ORDER is the draw order)` here, and
|
|
6769
|
-
`` `animations` is absent; … `` in a motion spec. Read the two apart by that:
|
|
6770
|
-
**"does not read"** means the key *is* in your file, spelt some other way, and
|
|
6771
|
-
**"needs a …"** / **"is absent"** means it is not in the file at all. Where both
|
|
6772
|
-
are true at once — a typo beside a key that really is missing — the typo is named
|
|
6773
|
-
first, because it is the one you can fix without re-reading the file.
|
|
6774
|
-
|
|
6775
|
-
⚠️ One check stays above the scan in both parsers: the `spec` version tag. The
|
|
6776
|
-
version is what decides *which* key set applies, so a file declaring a version this
|
|
6777
|
-
compiler does not know is refused as that — `unknown rig spec version "rigc-rig/2",
|
|
6778
|
-
expected "rigc-rig/1"` — rather than key by key against a set it never claimed. The
|
|
6779
|
-
price is paid by one spelling: a misspelt `spec` key itself reads as `unknown rig
|
|
6780
|
-
spec version undefined, expected "rigc-rig/1"`, which is true and one line short of
|
|
6781
|
-
naming the typo.
|
|
6782
|
-
|
|
6783
|
-
⚠️ There is **no forward-compatibility escape**, and no `note` field except where
|
|
6784
|
-
one is listed: a rig spec's root, a motion spec's root, an animation, and a
|
|
6785
|
-
`physics` tuning entry. Prose anywhere else has to go in a document, because a key
|
|
6786
|
-
the compiler tolerates is a key it cannot distinguish from one you meant it to
|
|
6787
|
-
read. (The **cut manifest** is deliberately outside this: it is the record of the
|
|
6788
|
-
pipeline that produced the art as much as an input, it carries fields the compiler
|
|
6789
|
-
states outright that it does not read — `roi` — and it may carry `note` and
|
|
6790
|
-
`archetype` as well. It has no shape parse at all.)
|
|
6826
|
+
ends with ` (see rigc guide <CODE>)`; run that exact command first. It prints one
|
|
6827
|
+
row below, naming the shipped file, positional section, line and heading. Each
|
|
6828
|
+
source refusal carries a stable `CE_` code separately from its original message.
|
|
6829
|
+
Library callers may still construct an uncoded `CompileError`; only that legacy
|
|
6830
|
+
case points at `§5.1`. `NotImplementedError` keeps its class and the same pointer.
|
|
6831
|
+
|
|
6832
|
+
Use `rigc guide §5.1.<k>` for a whole numbered `####` group; every group is at most
|
|
6833
|
+
30,000 UTF-8 bytes including the command's heading. The guide remains one ledger:
|
|
6834
|
+
the command reads these rows at call time, without a generated copy. Unknown
|
|
6835
|
+
codes are refused with the three nearest real names and exit 1. `<value>` and
|
|
6836
|
+
other angle-bracket placeholders below stand for values supplied by the input;
|
|
6837
|
+
the fixed message text and conditional/helper alternatives are quoted verbatim.
|
|
6838
|
+
|
|
6839
|
+
Shape refusals run when the rig or motion file is read; meaning refusals can need
|
|
6840
|
+
the other file, the declared names, a property's channels or a key's position.
|
|
6841
|
+
Repair the named input and rebuild. An `internal:` row names a compiler defect:
|
|
6842
|
+
retain the minimal inputs and report that code rather than inventing author data.
|
|
6843
|
+
|
|
6844
|
+
#### 5.1.1 Motion parser field reference
|
|
6791
6845
|
|
|
6792
6846
|
| Key | Refused when it is not | Why the shape matters |
|
|
6793
6847
|
| --- | --- | --- |
|
|
@@ -6830,199 +6884,590 @@ states outright that it does not read — `roi` — and it may carry `note` and
|
|
|
6830
6884
|
| `…sequence[i].keys[j].index` | a whole number ≥ 0 | stored as `index << 4`, which truncates a fraction (1.5 shows frame 1). Whether it is inside the series' `count` is the compile-time row below |
|
|
6831
6885
|
| `…sequence[i].keys[j].delay` | a finite number ≥ 0 — and **above 0 wherever the mode advances**, counting a delay carried from the key before | `(time - keyTime) / 0` is Infinity and `Infinity \| 0` is 0, so a `loop` at delay 0 shows its first frame throughout. The message reads `` `…keys[j]` plays "loop" at a delay of 0 … which is "hold" spelt as "loop" `` |
|
|
6832
6886
|
|
|
6833
|
-
|
|
6834
|
-
or the key's position in its own track. These are the frequent ones, verbatim:
|
|
6887
|
+
#### 5.1.2 Input files and editor ordering
|
|
6835
6888
|
|
|
6836
|
-
|
|
|
6837
|
-
| --- | --- |
|
|
6838
|
-
|
|
|
6839
|
-
|
|
|
6840
|
-
|
|
|
6841
|
-
|
|
|
6842
|
-
|
|
|
6843
|
-
|
|
|
6844
|
-
|
|
|
6845
|
-
| `
|
|
6846
|
-
| `
|
|
6847
|
-
|
|
|
6848
|
-
|
|
|
6849
|
-
|
|
|
6850
|
-
|
|
|
6851
|
-
| `
|
|
6852
|
-
|
|
|
6853
|
-
|
|
6854
|
-
|
|
6855
|
-
|
|
6856
|
-
|
|
6857
|
-
|
|
|
6858
|
-
|
|
|
6859
|
-
|
|
|
6860
|
-
|
|
|
6861
|
-
|
|
|
6862
|
-
|
|
|
6863
|
-
|
|
|
6864
|
-
|
|
|
6865
|
-
|
|
|
6866
|
-
|
|
|
6867
|
-
|
|
|
6868
|
-
|
|
|
6869
|
-
|
|
|
6870
|
-
|
|
|
6871
|
-
|
|
|
6872
|
-
|
|
|
6873
|
-
|
|
|
6874
|
-
|
|
|
6875
|
-
| `
|
|
6876
|
-
|
|
|
6877
|
-
|
|
|
6878
|
-
|
|
|
6879
|
-
|
|
|
6880
|
-
|
|
|
6881
|
-
|
|
|
6882
|
-
|
|
|
6883
|
-
|
|
|
6884
|
-
|
|
|
6885
|
-
|
|
|
6886
|
-
|
|
|
6887
|
-
|
|
|
6888
|
-
|
|
|
6889
|
-
|
|
|
6890
|
-
| `
|
|
6891
|
-
|
|
|
6892
|
-
| `
|
|
6893
|
-
| `
|
|
6894
|
-
| `
|
|
6895
|
-
| `
|
|
6896
|
-
|
|
|
6897
|
-
|
|
|
6898
|
-
|
|
|
6899
|
-
| `
|
|
6900
|
-
|
|
|
6901
|
-
|
|
|
6902
|
-
|
|
|
6903
|
-
|
|
|
6904
|
-
| `
|
|
6905
|
-
|
|
|
6906
|
-
|
|
|
6907
|
-
|
|
|
6908
|
-
|
|
|
6909
|
-
| `
|
|
6910
|
-
|
|
6911
|
-
|
|
6912
|
-
|
|
6913
|
-
|
|
6914
|
-
|
|
|
6915
|
-
|
|
|
6916
|
-
|
|
|
6917
|
-
|
|
|
6918
|
-
|
|
|
6919
|
-
|
|
|
6920
|
-
|
|
|
6921
|
-
| `
|
|
6922
|
-
| `
|
|
6923
|
-
| `
|
|
6924
|
-
|
|
6925
|
-
|
|
6926
|
-
|
|
6927
|
-
|
|
6928
|
-
|
|
|
6929
|
-
|
|
|
6930
|
-
|
|
|
6931
|
-
|
|
|
6932
|
-
|
|
|
6933
|
-
|
|
|
6934
|
-
|
|
|
6935
|
-
|
|
|
6936
|
-
| `
|
|
6937
|
-
|
|
|
6938
|
-
|
|
|
6939
|
-
| `
|
|
6940
|
-
|
|
|
6941
|
-
| `
|
|
6942
|
-
| `
|
|
6943
|
-
| `
|
|
6944
|
-
| `
|
|
6945
|
-
| `
|
|
6946
|
-
| `
|
|
6947
|
-
| `
|
|
6948
|
-
|
|
|
6949
|
-
| `
|
|
6950
|
-
| `
|
|
6951
|
-
|
|
|
6952
|
-
| `
|
|
6953
|
-
|
|
|
6954
|
-
| `
|
|
6955
|
-
| `
|
|
6956
|
-
| `
|
|
6957
|
-
| `
|
|
6958
|
-
| `
|
|
6959
|
-
| `
|
|
6960
|
-
|
|
|
6961
|
-
| `
|
|
6962
|
-
| `
|
|
6963
|
-
| `
|
|
6964
|
-
| `
|
|
6965
|
-
|
|
|
6966
|
-
|
|
|
6967
|
-
|
|
|
6968
|
-
|
|
|
6969
|
-
|
|
6970
|
-
|
|
6971
|
-
|
|
6972
|
-
|
|
6973
|
-
|
|
|
6974
|
-
|
|
|
6975
|
-
|
|
|
6976
|
-
|
|
|
6977
|
-
|
|
|
6978
|
-
|
|
|
6979
|
-
|
|
|
6980
|
-
| `
|
|
6981
|
-
|
|
|
6982
|
-
|
|
|
6983
|
-
| `
|
|
6984
|
-
|
|
|
6985
|
-
|
|
|
6986
|
-
|
|
|
6987
|
-
|
|
|
6988
|
-
|
|
|
6989
|
-
|
|
|
6990
|
-
|
|
|
6991
|
-
|
|
|
6992
|
-
|
|
|
6993
|
-
|
|
|
6994
|
-
|
|
|
6995
|
-
|
|
|
6996
|
-
| `
|
|
6997
|
-
| `
|
|
6998
|
-
|
|
|
6999
|
-
|
|
|
7000
|
-
|
|
7001
|
-
|
|
7002
|
-
`
|
|
7003
|
-
|
|
7004
|
-
|
|
7005
|
-
|
|
7006
|
-
is
|
|
7007
|
-
the
|
|
7008
|
-
|
|
7009
|
-
|
|
7010
|
-
|
|
7011
|
-
|
|
7012
|
-
|
|
7013
|
-
|
|
7014
|
-
|
|
7015
|
-
|
|
7016
|
-
|
|
7017
|
-
a
|
|
7018
|
-
|
|
7019
|
-
|
|
7020
|
-
|
|
7021
|
-
Both
|
|
7022
|
-
|
|
7023
|
-
|
|
7024
|
-
|
|
7025
|
-
|
|
6889
|
+
| Code | Fixed message text and alternatives | What to change |
|
|
6890
|
+
| --- | --- | --- |
|
|
6891
|
+
| <a id="CE_COMPILE_EDITOR_NAME_ORDER_AMBIGUOUS"></a>`CE_COMPILE_EDITOR_NAME_ORDER_AMBIGUOUS` | “"<value>" and "<value>" hold more than one digit run that is the same number written two ways, and those runs point opposite ways — the round trips measured the editor deferring one such run and never two”<br>“"<value>" and "<value>" sit in the sibling folders "<value>" and "<value>", which the comparator leaves in one place — and a tie is kept in file order, which orders two entries but does not say the editor keeps either folder's entries together”<br>“<value> pair(s) of <value> have no one order: <value><value>[. …and <value> more pair(s) / ]”<br>“animation names”<br>“rename one of the two folders so they differ by more than letter case, spacing or a leading zero”<br>“rename so the only whitespace in either name is a space”<br>“rigc keys the emitted "animations" object in the Spine editor's own comparator, read off five round trips through a licensed 4.3.26 editor (#728) — case folded upward, digit runs read as numbers, spaces skipped, leaves before folders at the root and folders before leaves inside one, and a remaining tie left in the order this spec declares. Each pair below is one those round trips leave open. A slider's animation is an ORDINAL in the format's binary half, and an editor that keys these differently repoints every slider whose animation moves index — silently, in a file that still parses (#535). ”<br>“rigc writes the emitted "skins" array with "default" first and the rest in the same comparator the "animations" object is keyed in — one comparator, measured on round trips that carried one name list as both collections (#728) — and each pair below is one those round trips leave open. A skin is an ORDINAL in the format's binary half — `skins[readInt()]` for an attachment timeline, `skins[skinIndex]` for a linked mesh — so an editor that writes them in another order repoints every such reference, silently, in a file that still parses. ”<br>“skin names”<br>“the order of "<value>" and "<value>" turns on a whitespace character that is not a space, and the round trips measured the editor skipping the space alone”<br>“write each number one way — rename so no digit run in either name has a second spelling”<br>Also: “"<value>" / "<value>" (<value>) — <value>; <value>” | Rename the conflicting animations or skins as the message directs so the file and editor have one order. |
|
|
6892
|
+
| <a id="CE_COMPILE_FLOAT32_DECIMAL_UNREPRESENTABLE"></a>`CE_COMPILE_FLOAT32_DECIMAL_UNREPRESENTABLE` | “no decimal of at most 9 significant digits names the float32 of <value>” | Report the input number and this compiler defect; float32 emission must find a decimal without changing the value. |
|
|
6893
|
+
| <a id="CE_COMPILE_KEY_AFTER_DURATION"></a>`CE_COMPILE_KEY_AFTER_DURATION` | “<value>: key at <value> is <value>s past the declared duration <value>s — nothing that plays this animation for the duration it declares ever reaches it. Move the key to <value>, or declare the duration you meant.”<br>Also: “{<value>s / t=<value>, <value>s after lag/stagger}” | Move the key within the declared duration, or state the duration the animation actually has. |
|
|
6894
|
+
| <a id="CE_COMPILE_RGBA_CHANNEL_COUNT"></a>`CE_COMPILE_RGBA_CHANNEL_COUNT` | “rgba value needs 4 channels, got <value>” | Supply four rgba channels. |
|
|
6895
|
+
| <a id="CE_COMPILE_RGBA2_CHANNEL_COUNT"></a>`CE_COMPILE_RGBA2_CHANNEL_COUNT` | “rgba2 value needs 7 channels, got <value>” | Supply seven rgba2 channels. |
|
|
6896
|
+
| <a id="CE_COMPILE_COLOUR_CHANNEL_COUNT"></a>`CE_COMPILE_COLOUR_CHANNEL_COUNT` | “<value> value needs <value> channel[ / s], got <value>” | Supply the channel count named for this colour shape. |
|
|
6897
|
+
| <a id="CE_COMPILE_JSON_READ_FAILED"></a>`CE_COMPILE_JSON_READ_FAILED` | “cannot read <value>: <value>”<br>Also: “<value> (line <value>, column <value>)” | Fix the named JSON file's path, permissions or JSON syntax. |
|
|
6898
|
+
| <a id="CE_COMPILE_IMAGE_MISSING"></a>`CE_COMPILE_IMAGE_MISSING` | “image "<value>" is not on disk at <value>”<br>Also: “<value>.png” | Supply the PNG at the named images path or correct the image name. |
|
|
6899
|
+
| <a id="CE_COMPILE_IMAGE_PNG_INVALID"></a>`CE_COMPILE_IMAGE_PNG_INVALID` | “<value> is <value>, not a PNG: its first <value> byte(s) are <value>, where a PNG's first 8 are <value><value>. rigc reads PNG and nothing else — its page-size and alpha readers, its renderer and its region lift all decode PNG, and it links no decoder for any other format — so nothing in this file was measured. Re-export it as PNG”<br>“<value> is a PNG whose IHDR chunk declares <value> byte(s) of data, where the format's is 13”<br>“<value> is a PNG whose IHDR chunk states its size as <value>x<value>: <value> 0, where the format requires each dimension to be at least 1, so the file describes no texel and nothing in it can be measured or drawn. Re-export it”<br>“<value> is a PNG whose first chunk is <value> rather than the IHDR the format requires first”<br>“<value> is a truncated PNG: it is <value> byte(s) long and <value>, so no reader can decode it. Re-export or re-copy the file whole”<br>“<value> is a truncated PNG: it is <value> byte(s) long and ends <value> byte(s) into the 8-byte PNG signature, so no reader can decode it. Re-export or re-copy the file whole”<br>“<value> is a truncated PNG: it is <value> byte(s) long and ends after the signature with no IEND chunk, so no reader can decode it. Re-export or re-copy the file whole”<br>“<value> is a truncated PNG: it is <value> byte(s) long and its <value> chunk at byte <value> declares <value> byte(s) of data, which with its CRC runs to byte <value>, so no reader can decode it. Re-export or re-copy the file whole”<br>“<value> is a truncated PNG: it is <value> byte(s) long and {ends after <value> with no IEND chunk / ends <value> byte(s) into the header of the chunk after <value>}, so no reader can decode it. Re-export or re-copy the file whole”<br>“<value> is empty (0 bytes), and a PNG's first 8 bytes are <value>”<br>“[; its name ends in .png, and it is the bytes that decide what a file is / ]”<br>“[its width and its height are / [its width is / its height is]]”<br>“a <value> image”<br>“a WebP image (a RIFF/WEBP container whose first chunk is <value>)”<br>“image "<value>": <value>”<br>“in no image format rigc recognises by its signature (it names <value> when it meets them)”<br>Here the values named in the message include: “KTX2”, “GIF”, “JPEG”. | Supply a readable PNG with the required header and dimensions at the named path. |
|
|
6900
|
+
| <a id="CE_COMPILE_ATLAS_INPUT_MISSING"></a>`CE_COMPILE_ATLAS_INPUT_MISSING` | “--atlas-in names <value>, which is not on disk” | Correct --atlas-in or supply the atlas file at that path. |
|
|
6901
|
+
| <a id="CE_COMPILE_ATLAS_INPUT_EMPTY"></a>`CE_COMPILE_ATLAS_INPUT_EMPTY` | “--atlas-in <value> declares no regions” | Use an atlas declaring the regions the rig needs. |
|
|
6902
|
+
| <a id="CE_COMPILE_ATLAS_PAGES_UNREADABLE"></a>`CE_COMPILE_ATLAS_PAGES_UNREADABLE` | “--atlas-in <value>: <value> of its <value> page(s) cannot be read as PNG, and nothing was compiled against the pack — <value>”<br>“<value> is <value>, not a PNG: its first <value> byte(s) are <value>, where a PNG's first 8 are <value><value>. rigc reads PNG and nothing else — its page-size and alpha readers, its renderer and its region lift all decode PNG, and it links no decoder for any other format — so nothing in this file was measured. Re-export it as PNG”<br>“<value> is a PNG whose IHDR chunk declares <value> byte(s) of data, where the format's is 13”<br>“<value> is a PNG whose IHDR chunk states its size as <value>x<value>: <value> 0, where the format requires each dimension to be at least 1, so the file describes no texel and nothing in it can be measured or drawn. Re-export it”<br>“<value> is a PNG whose first chunk is <value> rather than the IHDR the format requires first”<br>“<value> is a truncated PNG: it is <value> byte(s) long and <value>, so no reader can decode it. Re-export or re-copy the file whole”<br>“<value> is a truncated PNG: it is <value> byte(s) long and ends <value> byte(s) into the 8-byte PNG signature, so no reader can decode it. Re-export or re-copy the file whole”<br>“<value> is a truncated PNG: it is <value> byte(s) long and ends after the signature with no IEND chunk, so no reader can decode it. Re-export or re-copy the file whole”<br>“<value> is a truncated PNG: it is <value> byte(s) long and its <value> chunk at byte <value> declares <value> byte(s) of data, which with its CRC runs to byte <value>, so no reader can decode it. Re-export or re-copy the file whole”<br>“<value> is a truncated PNG: it is <value> byte(s) long and {ends after <value> with no IEND chunk / ends <value> byte(s) into the header of the chunk after <value>}, so no reader can decode it. Re-export or re-copy the file whole”<br>“<value> is empty (0 bytes), and a PNG's first 8 bytes are <value>”<br>“[; its name ends in .png, and it is the bytes that decide what a file is / ]”<br>“[its width and its height are / [its width is / its height is]]”<br>“a <value> image”<br>“a WebP image (a RIFF/WEBP container whose first chunk is <value>)”<br>“in no image format rigc recognises by its signature (it names <value> when it meets them)”<br>Also: “page "<value>": <value>”<br>Here the values named in the message include: “KTX2”, “GIF”, “JPEG”. | Supply readable PNG pages at the atlas page paths named in the message. |
|
|
6903
|
+
| <a id="CE_COMPILE_ATLAS_REGION_UNKNOWN"></a>`CE_COMPILE_ATLAS_REGION_UNKNOWN` | “image "<value>" resolves to region "<value>", which the atlas at <value> does not have. [Did you mean <value>? / ]The atlas declares <value> region(s): <value>”<br>Also: “<value>.png” | Correct the image's region name or add that region to the imported atlas. |
|
|
6904
|
+
| <a id="CE_COMPILE_ATLAS_REGION_PAGE_MISSING"></a>`CE_COMPILE_ATLAS_REGION_PAGE_MISSING` | “region "<value>" sits on page "<value>" of <value>, which is not on disk at <value>” | Supply the PNG page named by this region at the atlas-relative path. |
|
|
6905
|
+
| <a id="CE_COMPILE_ATLAS_REGION_OUTSIDE_PAGE"></a>`CE_COMPILE_ATLAS_REGION_OUTSIDE_PAGE` | “region "<value>" is at <value>,<value> sized <value>x<value> on a <value>x<value> page in <value>; the rectangle runs off the page, so its UVs would leave the texture” | Correct the atlas bounds so this region's rectangle stays on its page. |
|
|
6906
|
+
|
|
6907
|
+
|
|
6908
|
+
#### 5.1.3 Manifest, setup and animation targets
|
|
6909
|
+
|
|
6910
|
+
| Code | Fixed message text and alternatives | What to change |
|
|
6911
|
+
| --- | --- | --- |
|
|
6912
|
+
| <a id="CE_COMPILE_MOTION_ARCHETYPE_MISMATCH"></a>`CE_COMPILE_MOTION_ARCHETYPE_MISMATCH` | “motion spec names archetype "<value>" but the rig spec at <value> is called "<value>"” | Make the motion archetype name match the rig's name. |
|
|
6913
|
+
| <a id="CE_COMPILE_STAGE_SIZE_MISSING"></a>`CE_COMPILE_STAGE_SIZE_MISSING` | “no stage size: give the rig spec a `skeleton.width`/`skeleton.height`, or compile against a cut manifest whose `crop` states them, or state `"width": null, "height": null` for a skeleton that declares no stage” | State skeleton.width/height, supply a manifest crop, or declare both dimensions null. |
|
|
6914
|
+
| <a id="CE_COMPILE_REGION_NAME_DUPLICATE"></a>`CE_COMPILE_REGION_NAME_DUPLICATE` | “duplicate region name "<value>" (<value>)”<br>Also: “<value>.png” | Rename one of the PNG basenames so each atlas region has one name. |
|
|
6915
|
+
| <a id="CE_COMPILE_REGION_FILE_CONFLICT"></a>`CE_COMPILE_REGION_FILE_CONFLICT` | “<value>: "<value>" and the art already atlased as region "<value>" are two different files — <value> and <value>. An atlas region is named by its PNG's basename, so only one of the two can hold that name and this attachment would draw the other file's pixels. Rename one of the PNGs.”<br>Also: “skin "<value>" slot "<value>" attachment "<value>"” | Rename one PNG so each region basename denotes exactly one file. |
|
|
6916
|
+
| <a id="CE_COMPILE_SEQUENCE_FRAME_PNG_MISSING"></a>`CE_COMPILE_SEQUENCE_FRAME_PNG_MISSING` | “<value>: sequence <value> is the region "<value>", and there is no PNG for it at <value>. A sequence's frames are the regions "<stem><start + i>", zero-padded to "digits" — here stem <value>, start <value>, digits <value> — and the compiler draws no frame in place of another. Add the file, or state the "count" the series really has.”<br>Also: “skin "<value>" slot "<value>" attachment "<value>"”<br>“frame <value> of <value> (number <value>)” | Supply the series PNG or correct its stem/start/digits/count. |
|
|
6917
|
+
| <a id="CE_COMPILE_SEQUENCE_FRAME_REGION_MISSING"></a>`CE_COMPILE_SEQUENCE_FRAME_REGION_MISSING` | “<value>: sequence <value> is the region "<value>", which the atlas at <value> does not have. [Did you mean <value>? / ]A sequence's frames are the regions "<stem><start + i>", zero-padded to "digits" — here stem <value>, start <value>, digits <value> — and the compiler draws no frame in place of another.”<br>Also: “skin "<value>" slot "<value>" attachment "<value>"”<br>“frame <value> of <value> (number <value>)” | Add the series region to the pack or correct its stem/start/digits/count. |
|
|
6918
|
+
| <a id="CE_COMPILE_SEQUENCE_FRAME_FILE_CONFLICT"></a>`CE_COMPILE_SEQUENCE_FRAME_FILE_CONFLICT` | “<value>: sequence <value> is the region "<value>", and the art already atlased under that name is <value>, not <value>. One region name is one set of pixels, so this frame would draw the other file's. Rename one of them.”<br>Also: “skin "<value>" slot "<value>" attachment "<value>"”<br>“frame <value> of <value> (number <value>)” | Rename the conflicting file so one series region denotes one set of pixels. |
|
|
6919
|
+
| <a id="CE_COMPILE_MANIFEST_SLOT_UNKNOWN"></a>`CE_COMPILE_MANIFEST_SLOT_UNKNOWN` | “the manifest binds a part to slot "<value>" (via rig_slot), which the rig "<value>" does not declare — add the slot to the rig rather than inventing one here” | Declare the manifest's rig_slot in the rig's slots array. |
|
|
6920
|
+
| <a id="CE_COMPILE_MANIFEST_DRAW_ORDER_MISMATCH"></a>`CE_COMPILE_MANIFEST_DRAW_ORDER_MISMATCH` | “the manifest draws "<value>" (draw_order <value>) out of the rig's slot order; the rig's slots array IS the draw order” | Make manifest draw_order agree with the rig slots array's order. |
|
|
6921
|
+
| <a id="CE_COMPILE_MANIFEST_MESH_SLOT_BUDGET"></a>`CE_COMPILE_MANIFEST_MESH_SLOT_BUDGET` | “<value> mesh slot(s) declared but the rig "<value>" allows <value> — raise `invariants.meshSlots` in the rig spec if that budget is the thing being changed” | Reduce manifest mesh slots or raise invariants.meshSlots to the intended budget. |
|
|
6922
|
+
| <a id="CE_COMPILE_BASE_PLATE_MESH"></a>`CE_COMPILE_BASE_PLATE_MESH` | “slot "<value>" is the base plate; it must never be a mesh” | Keep the base plate a region attachment. |
|
|
6923
|
+
| <a id="CE_COMPILE_RING_POLYGON_MISSING"></a>`CE_COMPILE_RING_POLYGON_MISSING` | “slot "<value>" declares a ring mesh but has no polygon to use as its rim” | Supply the measured polygon used as the ring rim. |
|
|
6924
|
+
| <a id="CE_COMPILE_RING_HULL_INVALID"></a>`CE_COMPILE_RING_HULL_INVALID` | “slot "<value>": mesh.hull must be "polygon", got <value>” | Set mesh.hull to polygon. |
|
|
6925
|
+
| <a id="CE_COMPILE_RING_PARAMETERS_MISSING"></a>`CE_COMPILE_RING_PARAMETERS_MISSING` | “slot "<value>": a ring mesh needs mesh.center and mesh.inner” | State mesh.center and mesh.inner. |
|
|
6926
|
+
| <a id="CE_COMPILE_RIBBON_PARAMETERS_MISSING"></a>`CE_COMPILE_RIBBON_PARAMETERS_MISSING` | “slot "<value>": a ribbon mesh needs mesh.rows and a mesh.chain” | State mesh.rows and mesh.chain. |
|
|
6927
|
+
| <a id="CE_COMPILE_MESH_CONTROL_BONE_MISSING"></a>`CE_COMPILE_MESH_CONTROL_BONE_MISSING` | “slot "<value>": a mesh with no control bone deforms nothing” | Name at least one control bone for the generated mesh. |
|
|
6928
|
+
| <a id="CE_COMPILE_MANIFEST_WINDOW_SIZE_MISMATCH"></a>`CE_COMPILE_MANIFEST_WINDOW_SIZE_MISMATCH` | “<value> is <value>x<value> but the manifest window for "<value>" is <value>x<value>”<br>Also: “{<value> / region "<value>" of <value> (declared <value>x<value> by its offsets<value>)}”<br>“{ / , at scale: <value>}” | Make the manifest window dimensions agree with the measured image. |
|
|
6929
|
+
| <a id="CE_COMPILE_SLOT_IMAGE_SIZE_MISMATCH"></a>`CE_COMPILE_SLOT_IMAGE_SIZE_MISMATCH` | “<value> is <value>x<value> but slot "<value>" declares <value>x<value>”<br>Also: “{<value> / region "<value>" of <value> (declared <value>x<value> by its offsets<value>)}”<br>“{ / , at scale: <value>}” | Make the rig slot dimensions agree with the measured image. |
|
|
6930
|
+
| <a id="CE_COMPILE_SKIN_SLOT_UNKNOWN"></a>`CE_COMPILE_SKIN_SLOT_UNKNOWN` | “rig skin "<value>" gives attachments to slot "<value>", which the rig does not declare” | Declare the skin's slot in the rig slots array. |
|
|
6931
|
+
| <a id="CE_COMPILE_SLOT_ATTACHMENT_SOURCES_CONFLICT"></a>`CE_COMPILE_SLOT_ATTACHMENT_SOURCES_CONFLICT` | “slot "<value>" is filled by a manifest part AND by rig skin "<value>"; one slot, one source of attachments” | Give this slot attachments from either the manifest or the rig skin. |
|
|
6932
|
+
| <a id="CE_COMPILE_SETUP_TRANSFORM_INVALID"></a>`CE_COMPILE_SETUP_TRANSFORM_INVALID` | “bone "<value>" inherit is <value>, which the runtime resolves to no mode”<br>“bone "<value>" names parent "<value>", which is not declared before it”<br>Also: “bone "<value>": parent "<value>" is not posed before it”<br>“bone "<value>": inheritMode <value> is no mode (readModel refuses it first)” | Correct the bone hierarchy, inherit mode or singular setup transform as the full underlying message states. |
|
|
6933
|
+
| <a id="CE_COMPILE_CONTROL_BONE_UNKNOWN"></a>`CE_COMPILE_CONTROL_BONE_UNKNOWN` | “slot "<value>" drives control bone "<value>", which the rig "<value>" does not declare” | Declare the mesh control bone in the rig. |
|
|
6934
|
+
| <a id="CE_COMPILE_SETUP_ATTACHMENT_AUTHORS_CONFLICT"></a>`CE_COMPILE_SETUP_ATTACHMENT_AUTHORS_CONFLICT` | “slot "<value>" has a setup attachment in the rig spec AND in the motion spec; the setup pose has one author” | Choose the rig slot or motion setup table as this setup attachment's author. |
|
|
6935
|
+
| <a id="CE_COMPILE_SETUP_ATTACHMENT_MISSING"></a>`CE_COMPILE_SETUP_ATTACHMENT_MISSING` | “no setup pose for slot "<value>": give the motion spec a `setup` entry or the rig slot an `attachment` — the compiler will not guess one” | State the slot attachment in the rig or its setup entry in the motion spec. |
|
|
6936
|
+
| <a id="CE_COMPILE_SETUP_ATTACHMENT_UNAVAILABLE"></a>`CE_COMPILE_SETUP_ATTACHMENT_UNAVAILABLE` | “[[restore the files / restore the file] / [add the regions to the pack / add the region to the pack]]”<br>“no region "<value>" in <value>”<br>“setup attachment "<value>" for slot "<value>" is not one of [<value>]”<br>“the setup pose shows attachment "<value>" on slot "<value>", and the slot is emitted empty because [all <value> manifest states that fill it have / the one manifest state that fills it has] no art: <value> — <value>, [fix the paths / fix the path] in the manifest, or state the setup pose as null”<br>“the setup pose shows attachment "<value>" on slot "<value>", which no skin and no manifest part fills — the slot is emitted empty, so there is no such attachment to show. Give the slot an attachment, or state the setup pose as null”<br>Also: “"<value>" (<value>)”<br>“no PNG at <value>” | Select an available attachment, restore the missing manifest art or atlas regions as named, or state setup null. |
|
|
6937
|
+
| <a id="CE_COMPILE_SETUP_COLOUR_AUTHORS_CONFLICT"></a>`CE_COMPILE_SETUP_COLOUR_AUTHORS_CONFLICT` | “slot "<value>" has a setup colour in the rig spec AND in the motion spec” | State the setup colour in either the rig or motion spec. |
|
|
6938
|
+
| <a id="CE_COMPILE_INTERNAL_ATTACHMENT_IMAGE_MISSING"></a>`CE_COMPILE_INTERNAL_ATTACHMENT_IMAGE_MISSING` | “internal: no image for attachment <value>” | Report the attachment name and compiler defect: a resolved attachment lost its image. |
|
|
6939
|
+
| <a id="CE_COMPILE_GENERATED_MESH_SLOT_BUDGET"></a>`CE_COMPILE_GENERATED_MESH_SLOT_BUDGET` | “<value> mesh slot(s) emitted but the rig "<value>" allows <value>[ — a mesh rigc GENERATED counts against `invariants.meshSlots`, and this rig declares none, which is a budget of 0. Add `"invariants": { "meshSlots": <value>, "meshTriangles": <triangles one mesh may carry> }` to the rig spec: geometry rigc built is geometry it will not ship unmeasured, and `A13_MESH_BUDGET` has nothing to measure against until that budget is stated. (Authored geometry is exempt — rigc did not draw it.) / — raise `invariants.meshSlots` in the rig spec if that budget is the thing being changed]” | Declare or raise invariants.meshSlots and meshTriangles to measure generated geometry, or reduce generated meshes. |
|
|
6940
|
+
| <a id="CE_COMPILE_PHYSICS_NAME_RESERVED"></a>`CE_COMPILE_PHYSICS_NAME_RESERVED` | “physics constraint "<value>": the name is reserved — a motion spec's `"physics": "<value>"` is the timeline that names no constraint and drives every physics constraint declaring the keyed property global, so a constraint called that could not be keyed by name. Rename it”<br>Here the values named in the message include: “*”. | Rename the physics constraint; the reserved global target names no constraint. |
|
|
6941
|
+
| <a id="CE_COMPILE_PHYSICS_DECLARATION_DUPLICATE"></a>`CE_COMPILE_PHYSICS_DECLARATION_DUPLICATE` | “physics constraint "<value>" is declared in both the rig spec and the motion spec's physics table” | Declare this physics constraint in either the rig or motion physics table. |
|
|
6942
|
+
| <a id="CE_COMPILE_PHYSICS_BONE_UNKNOWN"></a>`CE_COMPILE_PHYSICS_BONE_UNKNOWN` | “physics constraint "<value>" targets unknown bone "<value>"” | Declare the physics target bone or correct its name. |
|
|
6943
|
+
| <a id="CE_COMPILE_PHYSICS_STOP_ORDER_INVALID"></a>`CE_COMPILE_PHYSICS_STOP_ORDER_INVALID` | “physics constraint "<value>" drives "<value>", a link stop "<value>" holds, from the physics table — the table is emitted after every rig constraint, past the stop's copy and clamp, which would read the link before this swings it; declare the constraint in the rig spec's "constraints"” | Declare the physics constraint in rig constraints so it runs before the stop's copy and clamp. |
|
|
6944
|
+
| <a id="CE_COMPILE_PHYSICS_COMPONENTS_EMPTY"></a>`CE_COMPILE_PHYSICS_COMPONENTS_EMPTY` | “physics constraint "<value>" drives no component — set at least one of <value>”<br>Here the values named in the message include: “/”, “x”, “scaleX”, “rotate”, “shearX”. | Enable at least one physics component named in the message. |
|
|
6945
|
+
| <a id="CE_COMPILE_PHYSICS_GLOBAL_GROUP_MEMBER"></a>`CE_COMPILE_PHYSICS_GLOBAL_GROUP_MEMBER` | “animation "<value>": group "<value>" lists "<value>", which is not a constraint but the target that names none — write it as the track's `"physics": "<value>"`”<br>Here the values named in the message include: “*”. | Write the reserved target directly as the track's physics field. |
|
|
6946
|
+
| <a id="CE_COMPILE_PHYSICS_GLOBAL_TRACK_INERT"></a>`CE_COMPILE_PHYSICS_GLOBAL_TRACK_INERT` | “animation "<value>" keys physics "<value>" <value>, the timeline that names no constraint and drives every physics constraint [the rig has / declaring "<value>": true], and [the rig declares no physics constraint / none of <value> does] — it would parse and move nothing. [Declare a physics constraint, or remove the track / Set "<value>": true on the constraints it is for, or key one by name]”<br>Also: “<value>Global”<br>Here the values named in the message include: “*”, “motion”. | Declare physics constraints and the named global flags, or target one constraint by name; remove an unused track. |
|
|
6947
|
+
| <a id="CE_COMPILE_CONSTRAINT_TRACK_TYPE_MISMATCH"></a>`CE_COMPILE_CONSTRAINT_TRACK_TYPE_MISMATCH` | “animation "<value>" keys "<value>" as a <value>, but the rig declares it as a "<value>" constraint — a timeline group resolves its target by name AND type, misses, and the loader throws”<br>Here the values named in the message include: “"/"”. | Use the timeline family matching the declared constraint type. |
|
|
6948
|
+
| <a id="CE_COMPILE_CONSTRAINT_TRACK_TARGET_UNKNOWN"></a>`CE_COMPILE_CONSTRAINT_TRACK_TARGET_UNKNOWN` | “animation "<value>" keys unknown <value> "<value>"[ (the rig declares: <value>) / , and the rig declares no <value> constraint at all]”<br>Here the values named in the message include: “physics”. | Use a declared constraint name of the required timeline family. |
|
|
6949
|
+
| <a id="CE_COMPILE_ANIMATION_BONE_UNKNOWN"></a>`CE_COMPILE_ANIMATION_BONE_UNKNOWN` | “animation "<value>" keys unknown bone "<value>"” | Declare or correct the keyed bone name. |
|
|
6950
|
+
| <a id="CE_COMPILE_ANIMATION_SLOT_UNKNOWN"></a>`CE_COMPILE_ANIMATION_SLOT_UNKNOWN` | “animation "<value>" targets unknown slot "<value>"” | Declare or correct the target slot name. |
|
|
6951
|
+
| <a id="CE_COMPILE_ANIMATION_TRACK_DUPLICATE"></a>`CE_COMPILE_ANIMATION_TRACK_DUPLICATE` | “animation "<value>" has two tracks on <value>.<value>; merge them into one track” | Merge the tracks on this target and property into one. |
|
|
6952
|
+
| <a id="CE_COMPILE_COLOUR_TRACK_CHANNEL_OVERLAP"></a>`CE_COMPILE_COLOUR_TRACK_CHANNEL_OVERLAP` | “alpha”<br>“animation "<value>" slot "<value>": tracks "<value>" and "<value>" both key the slot's <value> — a colour timeline poses its channels at every time, its setup value before its first key included, so the one the file states later overwrites the other everywhere and the first one's keys there are read by nothing. Key each channel once: "rgb" and "alpha" move the light colour's two halves on their own key times, "rgba" moves them together, and "rgb2" / "rgba2" add the dark colour”<br>“dark colour”<br>“light rgb” | Key each colour channel once using rgb/alpha, rgba or the dark colour forms as stated. |
|
|
6953
|
+
| <a id="CE_COMPILE_CONSTRAINT_TIMELINE_TYPE_MISMATCH"></a>`CE_COMPILE_CONSTRAINT_TIMELINE_TYPE_MISMATCH` | “animation "<value>" keys "<value>" as [an / a] <value> constraint, but the rig declares it as a "<value>" constraint — the parser looks a timeline's target up by name AND type, misses, and throws”<br>Here the values named in the message include: “"/"”. | Choose the timeline family matching this rig constraint's type. |
|
|
6954
|
+
| <a id="CE_COMPILE_CONSTRAINT_TIMELINE_TARGET_UNKNOWN"></a>`CE_COMPILE_CONSTRAINT_TIMELINE_TARGET_UNKNOWN` | “animation "<value>" keys unknown <value> constraint "<value>"; [the rig declares <value> constraint(s): <value> / the rig declares no <value> constraint at all]”<br>Also: “, ” | Use a declared constraint name of the required group. |
|
|
6955
|
+
| <a id="CE_COMPILE_CONSTRAINT_TIMELINE_DUPLICATE"></a>`CE_COMPILE_CONSTRAINT_TIMELINE_DUPLICATE` | “animation "<value>" has two <value> timelines on constraint "<value>"; the group holds one timeline per constraint, so merge them into one” | Merge the group's timelines on this constraint into one. |
|
|
6956
|
+
| <a id="CE_COMPILE_ATTACHMENT_TIMELINE_SKIN_UNKNOWN"></a>`CE_COMPILE_ATTACHMENT_TIMELINE_SKIN_UNKNOWN` | “<value>: this rig emits no skin called "<value>" (it emits: <value>)”<br>Also: “animation "<value>" deform <value>/<value>/<value>”<br>“, ”<br>“animation "<value>" sequence <value>/<value>/<value>”<br>Here the values named in the message include: “default”. | Target an emitted skin name. |
|
|
6957
|
+
| <a id="CE_COMPILE_ATTACHMENT_TIMELINE_SLOT_EMPTY"></a>`CE_COMPILE_ATTACHMENT_TIMELINE_SLOT_EMPTY` | “<value>: skin "<value>" gives slot "<value>" no attachments[ / , and this rig does not declare that slot at all]”<br>Also: “animation "<value>" deform <value>/<value>/<value>”<br>“animation "<value>" sequence <value>/<value>/<value>”<br>Here the values named in the message include: “default”. | Target a declared slot with attachments in the chosen skin. |
|
|
6958
|
+
| <a id="CE_COMPILE_ATTACHMENT_TIMELINE_ATTACHMENT_UNKNOWN"></a>`CE_COMPILE_ATTACHMENT_TIMELINE_ATTACHMENT_UNKNOWN` | “<value>: slot "<value>" in skin "<value>" has no attachment "<value>" (it has: <value>)”<br>Also: “animation "<value>" deform <value>/<value>/<value>”<br>“, ”<br>“animation "<value>" sequence <value>/<value>/<value>”<br>Here the values named in the message include: “default”. | Target an attachment placeholder present in the chosen skin and slot. |
|
|
6959
|
+
| <a id="CE_COMPILE_DEFORM_TIMELINE_DUPLICATE"></a>`CE_COMPILE_DEFORM_TIMELINE_DUPLICATE` | “<value>: two deform timelines on one attachment; merge them into one”<br>Also: “animation "<value>" deform <value>/<value>/<value>”<br>“animation "<value>" sequence <value>/<value>/<value>”<br>Here the values named in the message include: “default”. | Merge deform timelines on this attachment into one. |
|
|
6960
|
+
| <a id="CE_COMPILE_SEQUENCE_TIMELINE_DUPLICATE"></a>`CE_COMPILE_SEQUENCE_TIMELINE_DUPLICATE` | “<value>: two sequence timelines on one attachment; merge them into one”<br>Also: “animation "<value>" deform <value>/<value>/<value>”<br>“animation "<value>" sequence <value>/<value>/<value>”<br>Here the values named in the message include: “default”. | Merge sequence timelines on this attachment into one. |
|
|
6961
|
+
| <a id="CE_COMPILE_ANIMATION_DURATION_MISMATCH"></a>`CE_COMPILE_ANIMATION_DURATION_MISMATCH` | “animation "<value>" declares duration <value>s but its last key is at <value>s” | Make the declared duration match the last compiled key time. |
|
|
6962
|
+
| <a id="CE_COMPILE_SLOT_BONE_MISSING"></a>`CE_COMPILE_SLOT_BONE_MISSING` | “slot "<value>" has no bone” | Give the slot a declared bone. |
|
|
6963
|
+
|
|
6964
|
+
|
|
6965
|
+
#### 5.1.4 Bones and skin placeholders
|
|
6966
|
+
|
|
6967
|
+
| Code | Fixed message text and alternatives | What to change |
|
|
6968
|
+
| --- | --- | --- |
|
|
6969
|
+
| <a id="CE_COMPILE_BONE_PARENT_ORDER"></a>`CE_COMPILE_BONE_PARENT_ORDER` | “bone "<value>" names parent "<value>", which is declared after it” | Declare the parent before its child. |
|
|
6970
|
+
| <a id="CE_COMPILE_BONE_POSITION_MANIFEST_REQUIRED"></a>`CE_COMPILE_BONE_POSITION_MANIFEST_REQUIRED` | “bone "<value>" takes its position from <value>, which needs a cut manifest”<br>Also: “the window of slot "<value>"”<br>“the manifest anchor "<value>"”<br>“the mesh centre of slot "<value>"” | Supply the cut manifest needed by this measured bone position source. |
|
|
6971
|
+
| <a id="CE_COMPILE_BONE_ANCHOR_MISSING"></a>`CE_COMPILE_BONE_ANCHOR_MISSING` | “manifest anchors has no [x, y] for "<value>" (bone "<value>" of rig "<value>")” | Supply the named manifest anchor as an x/y pair. |
|
|
6972
|
+
| <a id="CE_COMPILE_BONE_SLOT_WINDOW_MISSING"></a>`CE_COMPILE_BONE_SLOT_WINDOW_MISSING` | “bone "<value>" sits at the centre of slot "<value>", which this cut's manifest carries no part for” | Supply the manifest part whose window positions this bone. |
|
|
6973
|
+
| <a id="CE_COMPILE_BONE_MESH_CENTER_MISSING"></a>`CE_COMPILE_BONE_MESH_CENTER_MISSING` | “bone "<value>" sits on the mesh centre of slot "<value>", which declares no mesh.center” | Declare mesh.center for the slot used to position this bone. |
|
|
6974
|
+
| <a id="CE_COMPILE_BONE_ROTATION_AXIS_MISSING"></a>`CE_COMPILE_BONE_ROTATION_AXIS_MISSING` | “bone "<value>" takes its rotation from the cut axis, which the manifest does not declare” | Declare the cut axis in the manifest. |
|
|
6975
|
+
| <a id="CE_COMPILE_BONE_ANCHOR_ROTATION_MISSING"></a>`CE_COMPILE_BONE_ANCHOR_ROTATION_MISSING` | “bone "<value>" takes its rotation from anchor "<value>", which has no third element (a screen-space facing angle)” | Supply the anchor's third element as a screen-space facing angle. |
|
|
6976
|
+
| <a id="CE_COMPILE_DEFAULT_SKIN_PLACEHOLDER_CONFLICT"></a>`CE_COMPILE_DEFAULT_SKIN_PLACEHOLDER_CONFLICT` | “slot "<value>": placeholder "<value>" is filled by the "<value>" skin AND by [skin / skins] <value>, and the Spine editor has no way to hold that. Measured on 4.3.26 in both spellings: give the default skin's attachment a name of its own and the editor re-keys it by that name on export, so the slot's setup attachment "<value>" resolves in no default-skin key and the default skin draws nothing; leave it as the placeholder and the import is refused outright with "Multiple attachments have the same name: <value> <value>", because a default-skin attachment hangs on the slot beside the named skins' placeholder of that name. Move the default skin's entry for this slot into a named skin — call it "base" — so every skin filling "<value>" is a named one. Two or more named skins sharing a placeholder is the shape the editor exports itself, and it needs no `name` (#796).” | Move this default-skin slot entry into a named skin so every skin filling the placeholder is named. |
|
|
6977
|
+
|
|
6978
|
+
|
|
6979
|
+
#### 5.1.5 Attachments, polygons and paths
|
|
6980
|
+
|
|
6981
|
+
| Code | Fixed message text and alternatives | What to change |
|
|
6982
|
+
| --- | --- | --- |
|
|
6983
|
+
| <a id="CE_COMPILE_ATTACHMENT_TYPE_NOT_NAME"></a>`CE_COMPILE_ATTACHMENT_TYPE_NOT_NAME` | “<value>: "type" is <value>, which is not a name. An attachment's type is one of <value>, or the key is absent and reads as "region". PRESENT-and-null is not absent: `getValue(map, "type", "region")` takes the default only when the key is missing (`SkeletonJson.ts:527`), so this map matches no case, `readAttachment` returns null (`:653`), and the attachment is dropped from the skeleton without a word. Remove the key, or name a type.”<br>Here the values named in the message include: “linkedmesh”, “path”, “point”, “clipping”, “boundingbox”. | Name an attachment type or omit the type key for region; present null is refused. |
|
|
6984
|
+
| <a id="CE_COMPILE_ATTACHMENT_NAME_NOT_STRING"></a>`CE_COMPILE_ATTACHMENT_NAME_NOT_STRING` | “<value>: "name" is <value>, which is not a string. An attachment's name is the runtime's `Attachment.name` — `getValue(map, "name", placeholder)`, `SkeletonJson.js:526` — and on a region, mesh or linked mesh it is also what `path` defaults to. Write it as a string, or leave the key out and the attachment is named by its placeholder.” | Use a string name or omit name to use the placeholder. |
|
|
6985
|
+
| <a id="CE_COMPILE_ATTACHMENT_TYPE_DEFERRED"></a>`CE_COMPILE_ATTACHMENT_TYPE_DEFERRED` | “<value>: this attachment is a "<value>"<value> — <value>. rigc does not emit it yet, deliberately: it emits <value>, and a point appears nowhere in the benchmark corpus, so it is not on the ladder's critical path. docs/SPEC_COVERAGE.md part 1-6 is the row this sentence reads from, and it is what an implementation would have to carry.”<br>“a position and an angle with no geometry at all — "x", "y", "rotation" and "color", posed by its bone and drawn by nothing; what reads it is game code asking where a muzzle or a hand is”<br>Here the values named in the message include: “linkedmesh”, “region”, “clipping”, “boundingbox”. | Use an emitted attachment type or implement the unsupported format type with its own measured gate. |
|
|
6986
|
+
| <a id="CE_COMPILE_ATTACHMENT_TYPE_UNKNOWN"></a>`CE_COMPILE_ATTACHMENT_TYPE_UNKNOWN` | “<value>: attachment type "<value>" is not one of the <value> the Spine 4.3 format defines (<value>). [Did you mean <value>? / ]The parser matches no case for it, `readAttachment` returns null (`SkeletonJson.ts:653`), and the attachment is dropped from the skeleton without a word.[ "sequence" is a KEY on a region or a mesh rather than a type of its own (docs/SPEC_COVERAGE.md part 1-6). / ]”<br>Here the values named in the message include: “path”, “point”, “clipping”, “linkedmesh”, “boundingbox”. | Use a Spine 4.3 attachment type; sequence is a key on region/mesh, rather than a type. |
|
|
6987
|
+
| <a id="CE_COMPILE_POLYGON_VERTEX_COUNT_INVALID"></a>`CE_COMPILE_POLYGON_VERTEX_COUNT_INVALID` | “<value>: vertexCount is <value>; a polygon needs at least 3 vertices, stated outright — the field has no parser default, and an absent one reads as 0 and takes the polygon with it” | State an integer vertexCount of at least three for the polygon. |
|
|
6988
|
+
| <a id="CE_COMPILE_VERTEX_GEOMETRY_SOURCES_CONFLICT"></a>`CE_COMPILE_VERTEX_GEOMETRY_SOURCES_CONFLICT` | “<value>: geometry comes as "vertices" or as "weights", never both — "weights" is the by-name form of the same data” | Supply vertices or by-name weights, rather than both. |
|
|
6989
|
+
| <a id="CE_COMPILE_NAMED_WEIGHTS_RAW_INDEXING"></a>`CE_COMPILE_NAMED_WEIGHTS_RAW_INDEXING` | “<value>: "boneIndexing": "raw" describes a "vertices" run; "weights" always binds by name” | Remove boneIndexing raw from by-name weights; raw describes a vertices run. |
|
|
6990
|
+
| <a id="CE_COMPILE_POLYGON_WEIGHT_VERTEX_COUNT"></a>`CE_COMPILE_POLYGON_WEIGHT_VERTEX_COUNT` | “<value>: weights cover <value> vertices but vertexCount is <value>” | Make the weights vertex count agree with vertexCount. |
|
|
6991
|
+
| <a id="CE_COMPILE_POLYGON_GEOMETRY_MISSING"></a>`CE_COMPILE_POLYGON_GEOMETRY_MISSING` | “<value>: needs geometry — "vertices" (x, y per vertex) or "weights" (bound by name)” | Supply vertices or by-name weights. |
|
|
6992
|
+
| <a id="CE_COMPILE_POLYGON_WEIGHTED_RUN_IMPLICIT"></a>`CE_COMPILE_POLYGON_WEIGHTED_RUN_IMPLICIT` | “<value>: vertexCount <value> wants <value> unweighted numbers and "vertices" holds <value>. The parser reads that as a WEIGHTED run, whose bone INDEXES point into the emitted bone array — a list the spec never writes, so inserting a bone rebinds every vertex in silence. Give the bindings by name as "weights": [[{ "bone": …, "x": …, "y": …, "weight": … }, …], …], fix vertexCount, or say "boneIndexing": "raw" on this attachment to keep the index form deliberately.” | Use by-name weights, correct vertexCount, or request raw bone indexing deliberately. |
|
|
6993
|
+
| <a id="CE_COMPILE_VERTEX_VALUE_NONFINITE"></a>`CE_COMPILE_VERTEX_VALUE_NONFINITE` | “<value>: the vertex array holds a non-finite value <value>” | Supply finite numbers in the vertices array. |
|
|
6994
|
+
| <a id="CE_COMPILE_RAW_WEIGHT_BONE_COUNT_INVALID"></a>`CE_COMPILE_RAW_WEIGHT_BONE_COUNT_INVALID` | “<value>: the raw weighted run has a bone count of <value> at index <value>” | Write a valid bone count for every raw weighted vertex. |
|
|
6995
|
+
| <a id="CE_COMPILE_RAW_WEIGHT_RUN_TRUNCATED"></a>`CE_COMPILE_RAW_WEIGHT_RUN_TRUNCATED` | “<value>: the raw weighted run is truncated — vertex <value> claims <value> bone(s) and the array ends first” | Supply every bone index/x/y/weight tuple claimed by the raw run. |
|
|
6996
|
+
| <a id="CE_COMPILE_RAW_WEIGHT_VERTEX_COUNT_MISMATCH"></a>`CE_COMPILE_RAW_WEIGHT_VERTEX_COUNT_MISMATCH` | “<value>: the raw weighted run decodes to <value> vertices but <value>”<br>“there are <value> uv pairs”<br>“vertexCount is <value>” | Make the decoded raw run vertex count match its declared geometry. |
|
|
6997
|
+
| <a id="CE_COMPILE_RAW_WEIGHT_BONE_INDEX_UNKNOWN"></a>`CE_COMPILE_RAW_WEIGHT_BONE_INDEX_UNKNOWN` | “<value>: vertex <value> binds bone index <value>, which is not in the bone list” | Use a bone index present in the emitted bone list, or author by-name weights. |
|
|
6998
|
+
| <a id="CE_COMPILE_STAGE_BOX_STAGE_MISSING"></a>`CE_COMPILE_STAGE_BOX_STAGE_MISSING` | “<value>: the rig declares no stage, so there is no box to write — state skeleton.width and skeleton.height”<br>Also: “skeleton.stageBox (slot "<value>", attachment "<value>")” | State skeleton.width and skeleton.height before requesting a stage box. |
|
|
6999
|
+
| <a id="CE_COMPILE_STAGE_BOX_SLOT_UNKNOWN"></a>`CE_COMPILE_STAGE_BOX_SLOT_UNKNOWN` | “<value>: slot "<value>" is not one the rig declares. Declare it in "slots" — where it stands in the array is its place in the draw order, and its "bone" is the box's bone — e.g. { "name": "<value>", "bone": "root", "attachment": "<value>" }”<br>Also: “skeleton.stageBox (slot "<value>", attachment "<value>")” | Declare a dedicated stage-box slot in the rig's slots array. |
|
|
7000
|
+
| <a id="CE_COMPILE_STAGE_BOX_SLOT_CONFLICT"></a>`CE_COMPILE_STAGE_BOX_SLOT_CONFLICT` | “<value>: slot "<value>" is also filled by <value>. The stage box is its slot's one attachment, so a reader of that slot finds the stage and nothing else: give the box a slot of its own”<br>Also: “skeleton.stageBox (slot "<value>", attachment "<value>")”<br>“the attachment(s) [<value>]”<br>“a cut manifest part” | Give the stage box a slot of its own. |
|
|
7001
|
+
| <a id="CE_COMPILE_STAGE_BOX_BONE_UNKNOWN"></a>`CE_COMPILE_STAGE_BOX_BONE_UNKNOWN` | “<value>: slot "<value>" names bone "<value>", which the rig does not declare”<br>Also: “skeleton.stageBox (slot "<value>", attachment "<value>")” | Declare the stage-box slot's bone. |
|
|
7002
|
+
| <a id="CE_COMPILE_STAGE_BOX_BONE_NOT_ROOT"></a>`CE_COMPILE_STAGE_BOX_BONE_NOT_ROOT` | “<value>: slot "<value>" hangs on bone "<value>", which is not the root. The box's vertices are the stage's corners in world space, written as they are, and the gate holds them on the header's grid through the runtime's own frame of an unrotated root; every bone below it adds that frame's residue once more (the runtime spells an unrotated b as cos 90° at its pi, -2.3e-8 per level). Put the slot on the root ("<value>")”<br>Also: “skeleton.stageBox (slot "<value>", attachment "<value>")” | Put the stage-box slot on the untransformed root bone. |
|
|
7003
|
+
| <a id="CE_COMPILE_STAGE_BOX_ROOT_TRANSFORMED"></a>`CE_COMPILE_STAGE_BOX_ROOT_TRANSFORMED` | “<value>: slot "<value>" hangs on the root "<value>", which states a setup transform (<value>). The box's vertices are the stage's corners in world space, written as they are, so the root must not move, turn, scale or shear at setup — move what the root carries onto a bone below it, or drop stageBox”<br>Also: “skeleton.stageBox (slot "<value>", attachment "<value>")”<br>Here the values named in the message include: “scaleY”, “shearY”, “scaleX”, “shearX”, “rotation”. | Move the root's setup transform to a child bone or drop stageBox. |
|
|
7004
|
+
| <a id="CE_COMPILE_CLIPPING_END_SLOT_UNKNOWN"></a>`CE_COMPILE_CLIPPING_END_SLOT_UNKNOWN` | “<value>: end names slot <value>, which this rig does not declare; a miss loads as null and the clip then runs to the bottom of the draw order” | Name a declared end slot or omit the clipping end deliberately. |
|
|
7005
|
+
| <a id="CE_COMPILE_VERTEX_BIND_TRANSFORM_MISSING"></a>`CE_COMPILE_VERTEX_BIND_TRANSFORM_MISSING` | “<value>: vertex <value> binds bone "<value>", which has no setup transform” | Correct the weighted bone name/setup hierarchy; report a missing compiled setup transform for a declared bone. |
|
|
7006
|
+
| <a id="CE_COMPILE_PATH_VERTEX_COUNT_MULTIPLE"></a>`CE_COMPILE_PATH_VERTEX_COUNT_MULTIPLE` | “<value>: vertexCount is <value>, which is not a multiple of 3. A path's vertices are knots AND their Bezier handles, read in groups of three; the parser sizes its lengths array with `vertexCount / 3` and accepts a fractional size without a word, so the curves would straddle the knots.” | State the path's knot/Bezier handle vertices in groups of three. |
|
|
7007
|
+
| <a id="CE_COMPILE_PATH_VERTEX_COUNT_MINIMUM"></a>`CE_COMPILE_PATH_VERTEX_COUNT_MINIMUM` | “<value>: vertexCount is <value> and [a closed / an open] path needs at least <value> — [a closed path of K curves carries 3K points / an open one carries 3(K + 1), the first and last being the end knots' outer handles]” | Supply enough vertices for the stated open or closed path. |
|
|
7008
|
+
| <a id="CE_COMPILE_SLOT_SETUP_TRANSFORM_MISSING"></a>`CE_COMPILE_SLOT_SETUP_TRANSFORM_MISSING` | “<value>: slot bone "<value>" has no setup transform” | Correct the slot bone/setup hierarchy; report a missing compiled transform for a declared bone. |
|
|
7009
|
+
| <a id="CE_COMPILE_PATH_GEOMETRY_LENGTH_INVALID"></a>`CE_COMPILE_PATH_GEOMETRY_LENGTH_INVALID` | “<value>: the geometry measures <value> entry(ies) where the parser sizes <value>, of total length <value>; a path of zero length divides by zero the first time a bone is placed on it” | Supply a nonzero-length path whose measured curve count matches its vertex count. |
|
|
7010
|
+
| <a id="CE_COMPILE_PATH_LENGTHS_NOT_ARRAY"></a>`CE_COMPILE_PATH_LENGTHS_NOT_ARRAY` | “<value>: "lengths" is <value>; it is an array of <value> number(s)” | Supply lengths as the finite cumulative-length array or omit it for measurement. |
|
|
7011
|
+
| <a id="CE_COMPILE_PATH_LENGTHS_COUNT"></a>`CE_COMPILE_PATH_LENGTHS_COUNT` | “<value>: "lengths" has N entry(ies) where the parser sizes M — vertexCount / 3 on [a closed / an open] path[ / , one more than its curves: the editor writes the wrap-around curve's cumulative last and nothing reads it]. Give the array the source states, or leave the field out and rigc measures it”<br>Read the count pair as `"lengths" has N entry(ies) where the parser sizes M — vertexCount / 3 on …`: N is the stated array's length; M is the count the parser allocates from vertexCount / 3. | Make lengths match the count the path vertexCount and closed state require, or omit lengths for measurement. |
|
|
7012
|
+
| <a id="CE_COMPILE_PATH_LENGTH_NONFINITE"></a>`CE_COMPILE_PATH_LENGTH_NONFINITE` | “<value>: "lengths"[<value>] is <value>; every entry is a finite cumulative length” | Supply finite cumulative path lengths. |
|
|
7013
|
+
| <a id="CE_COMPILE_PATH_LENGTHS_DESCENDING"></a>`CE_COMPILE_PATH_LENGTHS_DESCENDING` | “<value>: "lengths"[<value>] is <value>, below [0 / the <value> before it]. The array is CUMULATIVE — the length at the end of each curve — so no entry is below its predecessor” | Make every cumulative path length at least its predecessor and the first at least zero. |
|
|
7014
|
+
| <a id="CE_COMPILE_INTERNAL_IMAGE_NOT_ATLASED"></a>`CE_COMPILE_INTERNAL_IMAGE_NOT_ATLASED` | “<value>: the image "<value>" was never added to the atlas, so there is no region "<value>" for this attachment to draw and no measurement of it to take a size from. Every image an attachment names is measured and atlased — one per file, whichever skin names it (issue #555) — so reaching this means rigc skipped one, not that the spec left anything out. [The nearest region(s) built are <value>. / ]The atlas holds <value> region(s): <value>” | Report this compiler defect with the image and atlas region names; an attachment image was skipped during atlas collection. |
|
|
7015
|
+
| <a id="CE_COMPILE_SEQUENCE_FRAME_SIZE_AMBIGUOUS"></a>`CE_COMPILE_SEQUENCE_FRAME_SIZE_AMBIGUOUS` | “<value>: the <value> frames of this sequence measure <value> in <value> (<value>), and an attachment has one <value> every frame is drawn into. State "<value>" — the frames do not agree on one” | State the attachment dimension named in the message because its frames do not share one size. |
|
|
7016
|
+
| <a id="CE_COMPILE_INTERNAL_SEQUENCE_FRAME_NOT_ATLASED"></a>`CE_COMPILE_INTERNAL_SEQUENCE_FRAME_NOT_ATLASED` | “<value>: sequence frame <value> is the region "<value>", which was never added to the atlas — every frame of a sequence is atlased or refused by name before any attachment is built, so reaching this means rigc skipped one” | Report this compiler defect with the series region name; a series frame was skipped during atlas collection. |
|
|
7017
|
+
| <a id="CE_COMPILE_REGION_ATLAS_SIZE_MISMATCH"></a>`CE_COMPILE_REGION_ATLAS_SIZE_MISMATCH` | “<value>: the spec says <value> <value> and region "<value>" of the imported atlas is <value> (bounds <value>x<value>, offsets state a <value>x<value> drawing[ / in the page's texels, which its scale: <value> makes a <value>x<value> drawing (+/- <value>px, the pack's rounding)])”<br>Here the values named in the message include: “width”, “height”. | Make the stated attachment dimension agree with the imported atlas's measured drawing size and scale. |
|
|
7018
|
+
| <a id="CE_COMPILE_REGION_SIZE_MISSING"></a>`CE_COMPILE_REGION_SIZE_MISSING` | “<value>: a region needs width and height — give them, or give an "image" and rigc will measure the PNG” | State width/height or supply image for PNG measurement. |
|
|
7019
|
+
| <a id="CE_COMPILE_VERTEX_BINDINGS_EMPTY"></a>`CE_COMPILE_VERTEX_BINDINGS_EMPTY` | “<value>: vertex <value> has no bone bindings; a weighted vertex names at least one bone” | Name at least one bone binding on every weighted vertex. |
|
|
7020
|
+
| <a id="CE_COMPILE_VERTEX_BIND_BONE_UNKNOWN"></a>`CE_COMPILE_VERTEX_BIND_BONE_UNKNOWN` | “<value>: vertex <value> binds bone <value>, which the rig does not declare as a bone” | Use bone names declared by the rig in every vertex binding. |
|
|
7021
|
+
| <a id="CE_COMPILE_AUTHORED_MESH_OUTLINE_INVALID"></a>`CE_COMPILE_AUTHORED_MESH_OUTLINE_INVALID` | “ — the triangles are <value> pieces that share no vertex, and one mesh is one outline: `rigc split --rig <rig> --motion <motion> --slot <value> --attachment <value><value> --out <dir>` writes one mesh per piece, its deform keys renumbered (AUTHORING §3.4.11)”<br>“<value>: <value><value>”<br>“[ / --skin <value>]”<br>“hull <value> disagrees with the triangles, whose outline has <value> vertices (<value>). Delete "hull" and rigc derives it, or state <value>”<br>“hull vertices must come first; vertex <value> is on the boundary and vertex <value> is not. The triangles' outline runs <value>: list those <value> vertices first, in that order, then the <value> interior vertices”<br>“hull vertices must trace the outline in order; the triangles' outline runs <value>, so vertex <value> has to follow vertex <value> in the list, and vertex <value> does. Renumber the vertices along that walk”<br>“the triangles do not tile the outline: <value> vertices with a <value>-vertex outline tile as <value> triangles and there are <value> — Spine's binary reader derives the triangle count from exactly that, so a mesh that breaks it cannot be read back from a .skel”<br>“the triangles have no outline: every edge is shared by two triangles”<br>“the triangles' outline is not one closed loop: the walk from vertex <value> closes after <value> of <value> boundary vertices”<br>“the triangles' outline is not one closed loop: vertex <value> has <value> boundary edges”<br>“triangle <value> (<value>) repeats a vertex, so it has no area”<br>“triangle <value> names vertex <value>, and the mesh has vertices 0..<value>”<br>“triangle count <value> is not a multiple of 3”<br>Also: “ → ” | Repair the triangles/hull and vertex order as the full message directs; split disconnected pieces into separate meshes with rigc split. |
|
|
7022
|
+
|
|
7023
|
+
|
|
7024
|
+
#### 5.1.6 Mesh generators, depth and soft regions
|
|
7025
|
+
|
|
7026
|
+
| Code | Fixed message text and alternatives | What to change |
|
|
7027
|
+
| --- | --- | --- |
|
|
7028
|
+
| <a id="CE_COMPILE_INTERNAL_GENERATED_MESH_OUTLINE_INVALID"></a>`CE_COMPILE_INTERNAL_GENERATED_MESH_OUTLINE_INVALID` | “<value>: internal: the <value> generator built an inconsistent mesh — <value>”<br>“hull vertices must come first; vertex <value> is on the boundary and vertex <value> is not. The triangles' outline runs <value>: list those <value> vertices first, in that order, then the <value> interior vertices”<br>“hull vertices must trace the outline in order; the triangles' outline runs <value>, so vertex <value> has to follow vertex <value> in the list, and vertex <value> does. Renumber the vertices along that walk”<br>“it declares hull <value> and its triangles outline <value> vertices”<br>“the triangles do not tile the outline: <value> vertices with a <value>-vertex outline tile as <value> triangles and there are <value> — Spine's binary reader derives the triangle count from exactly that, so a mesh that breaks it cannot be read back from a .skel”<br>“the triangles have no outline: every edge is shared by two triangles”<br>“the triangles' outline is not one closed loop: the walk from vertex <value> closes after <value> of <value> boundary vertices”<br>“the triangles' outline is not one closed loop: vertex <value> has <value> boundary edges”<br>“triangle <value> (<value>) repeats a vertex, so it has no area”<br>“triangle <value> names vertex <value>, and the mesh has vertices 0..<value>”<br>“triangle count <value> is not a multiple of 3”<br>Also: “ → ” | Report this generator defect with its kind and underlying outline refusal; generated topology must already be consistent. |
|
|
7029
|
+
| <a id="CE_COMPILE_MESH_AUTHORED_AND_GENERATED"></a>`CE_COMPILE_MESH_AUTHORED_AND_GENERATED` | “<value>: a mesh is either authored geometry or a generator, never both” | Use authored mesh geometry or a generator, rather than both. |
|
|
7030
|
+
| <a id="CE_COMPILE_MESH_GEOMETRY_SOURCES_CONFLICT"></a>`CE_COMPILE_MESH_GEOMETRY_SOURCES_CONFLICT` | “<value>: a mesh gives geometry as "vertices" or as "weights", never both — "weights" is the by-name form of the same data” | Supply vertices or by-name weights, rather than both. |
|
|
7031
|
+
| <a id="CE_COMPILE_MESH_GEOMETRY_MISSING"></a>`CE_COMPILE_MESH_GEOMETRY_MISSING` | “<value>: an authored mesh needs uvs, triangles and vertices or weights (or a "generator")” | Supply uvs/triangles and vertices or weights, or a generator. |
|
|
7032
|
+
| <a id="CE_COMPILE_MESH_WEIGHT_UV_COUNT"></a>`CE_COMPILE_MESH_WEIGHT_UV_COUNT` | “<value>: weights cover <value> vertices but there are <value> uv pairs” | Supply one weights entry per UV pair. |
|
|
7033
|
+
| <a id="CE_COMPILE_MESH_WEIGHTED_RUN_IMPLICIT"></a>`CE_COMPILE_MESH_WEIGHTED_RUN_IMPLICIT` | “<value>: this mesh's "vertices" is a weighted run, whose bone INDEXES point into the emitted bone array — a list the spec never writes, so inserting a bone rebinds every vertex in silence. Give the bindings by name as "weights": [[{ "bone": …, "x": …, "y": …, "weight": … }, …], …], or say "boneIndexing": "raw" on this attachment to keep the index form deliberately.” | Use by-name weights or explicitly request raw bone indexing for the weighted vertices run. |
|
|
7034
|
+
| <a id="CE_COMPILE_MESH_SIZE_MISSING"></a>`CE_COMPILE_MESH_SIZE_MISSING` | “<value>: a mesh needs width and height — give them, or give an "image" and rigc will measure the PNG” | State width/height or supply image for PNG measurement. |
|
|
7035
|
+
| <a id="CE_COMPILE_LINKED_MESH_GEOMETRY_IGNORED"></a>`CE_COMPILE_LINKED_MESH_GEOMETRY_IGNORED` | “<value>: a linked mesh states <value>, and a linked mesh has no geometry of its own — it draws the geometry of the attachment "source" names. The parser returns from the `source` branch before `readVertices` (`SkeletonJson.ts:582-586`), so these keys are read by nothing at all: a link declaring 5 uvs beside a 4-vertex source loads the SOURCE's 4 vertices and says nothing. Remove [it / them], or remove "source" and author this as a mesh of its own.”<br>Here the values named in the message include: “hull”, “edges”, “weights”, “generator”, “triangles”, “boneIndexing”. | Remove geometry keys from the link or remove source and author an ordinary mesh. |
|
|
7036
|
+
| <a id="CE_COMPILE_LINKED_MESH_SOURCE_MISSING"></a>`CE_COMPILE_LINKED_MESH_SOURCE_MISSING` | “<value>: a linked mesh needs "source" — the PLACEHOLDER of the mesh whose geometry it draws (the key that attachment is filed under in its skin, not its "name"), and this one states <value>. "source" is what MAKES a mesh linked: `getValue(map, "source", null)` is falsy-tested (`SkeletonJson.ts:582`), so an absent or empty one is read as an ordinary mesh, whose `uvs` this attachment does not have — the parser dereferences `map.uvs.length` and throws.” | Name the source mesh's placeholder in source. |
|
|
7037
|
+
| <a id="CE_COMPILE_LINKED_MESH_SLOT_UNKNOWN"></a>`CE_COMPILE_LINKED_MESH_SLOT_UNKNOWN` | “<value>: "slot" is <value>, which the rig does not declare as a slot. It names where the source lives and is resolved through `skeletonData.findSlot` (`SkeletonJson.ts:575`), which throws `Source mesh slot not found` on a miss. The rig's slots are <value>. Leave it out and the source is looked for in this attachment's own slot, which is the parser's default.” | Name the source slot declared by the rig, or omit slot for the link's own slot. |
|
|
7038
|
+
| <a id="CE_COMPILE_LINKED_MESH_SIZE_MISSING"></a>`CE_COMPILE_LINKED_MESH_SIZE_MISSING` | “<value>: a linked mesh needs width and height — give them, or give an "image" and rigc will measure the PNG” | State width/height or supply image for PNG measurement. |
|
|
7039
|
+
| <a id="CE_COMPILE_LINKED_MESH_DEFAULT_SKIN_MISSING"></a>`CE_COMPILE_LINKED_MESH_DEFAULT_SKIN_MISSING` | “<value>: no "skin" is stated, so the parser looks for the source "<value>" in the default skin — and this rig declares no default skin. The rig's skins are <value>. State the skin the source is filed under. Left to the round trip this is a `TypeError` off the null `SkeletonData.defaultSkin`, which names neither this attachment nor where it was looking.” | State the skin holding the source because this rig has no default skin. |
|
|
7040
|
+
| <a id="CE_COMPILE_LINKED_MESH_SKIN_UNKNOWN"></a>`CE_COMPILE_LINKED_MESH_SKIN_UNKNOWN` | “<value>: "skin" is <value>, and the rig declares no such skin. The rig's skins are <value>. Left to the round trip this is the runtime's `Skin not found`, which names neither this attachment nor where it was looking.” | Name the skin holding the source mesh. |
|
|
7041
|
+
| <a id="CE_COMPILE_LINKED_MESH_SOURCE_UNKNOWN"></a>`CE_COMPILE_LINKED_MESH_SOURCE_UNKNOWN` | “<value>: "source" is <value>, and skin <value>[ / (the default skin, because no "skin" was stated — never the skin this attachment is written in)] slot <value>[ / (this attachment's own slot, because no "slot" was stated)] holds [no attachment at all / <value>: <value>]. "source" is the PLACEHOLDER the source is filed under — `skin.getAttachment(slotIndex, source)` (`SkeletonJson.ts:433`), whose table is keyed by the JSON key, not by the attachment's `name`. Left to the round trip this is the runtime's `Source mesh not found`.” | Name the source mesh's placeholder in the correct skin and slot. |
|
|
7042
|
+
| <a id="CE_COMPILE_LINKED_MESH_SOURCE_IS_LINK"></a>`CE_COMPILE_LINKED_MESH_SOURCE_IS_LINK` | “<value>: "source" is <value>, which is itself a linked mesh, and a chain of them is refused. Measured through spine-core: the runtime resolves links in the order they were read, so a link whose source is a link loads the source's geometry when the source comes first in the file and loads NOTHING — `worldVerticesLength` 0, 0 triangles, a 0x0 size — when the two are swapped, in silence either way. Point "source" at the mesh itself.” | Point source directly at the ordinary mesh rather than another linked mesh. |
|
|
7043
|
+
| <a id="CE_COMPILE_LINKED_MESH_SOURCE_NOT_MESH"></a>`CE_COMPILE_LINKED_MESH_SOURCE_NOT_MESH` | “<value>: "source" is <value>, which is a <value> attachment and not a mesh. A linked mesh takes another MESH's `uvs`, `triangles`, `vertices`, `hull` and `edges` (`MeshAttachment.setSourceMesh`); the runtime casts whatever it finds and reads those fields off it, which on any other type is `undefined` and no error.” | Point source at a mesh attachment. |
|
|
7044
|
+
| <a id="CE_COMPILE_MESH_BONE_UNKNOWN"></a>`CE_COMPILE_MESH_BONE_UNKNOWN` | “<value>: mesh bone "<value>" is not in the rig's bone list” | Use mesh bone names declared in the rig. |
|
|
7045
|
+
| <a id="CE_COMPILE_MESH_BONE_TRANSFORM_MISSING"></a>`CE_COMPILE_MESH_BONE_TRANSFORM_MISSING` | “<value>: no setup transform for mesh bone "<value>"” | Correct the mesh bone/setup hierarchy; report a missing compiled transform for a declared bone. |
|
|
7046
|
+
| <a id="CE_COMPILE_RING_RIBBON_GENERATOR_INVALID"></a>`CE_COMPILE_RING_RIBBON_GENERATOR_INVALID` | “<value>: <value>”<br>“a polygon vertex sits exactly on the aperture centre”<br>“a ring mesh needs at least one control bone”<br>“aperture centre (<value>,<value>) is outside the <value>x<value> part window”<br>“bad part size <value>x<value>”<br>“bias ramp must increase, got [<value>, <value>]”<br>“control bone "<value>" sits on the aperture centre, so it has no radial direction”<br>“hull is not star-shaped about the aperture centre; the inner ring would fold”<br>“hull needs at least 6 points, got <value>”<br>“hull point (<value>,<value>) is outside the <value>x<value> part window”<br>“inner must be in (0,1), got <value>”<br>“ray to the window edge did not converge”<br>“ribbon needs at least 3 rows, got <value>”<br>“ribbon needs at least one chain bone, got <value>”<br>“two control bones share the angle <value> degrees about the aperture centre”<br>Also: “<value>: mesh bone "<value>" is not in the rig's bone list”<br>“<value>: no setup transform for mesh bone "<value>"” | Correct the ring/ribbon dimensions, hull, centre, inner, bias or controls as the full generator message states. |
|
|
7047
|
+
| <a id="CE_COMPILE_DEPTH_IMAGE_MISSING"></a>`CE_COMPILE_DEPTH_IMAGE_MISSING` | “<value>: the depth block has no "image"; it is the sheet to sample, relative to the rig's images directory” | State the depth image relative to the rig images directory. |
|
|
7048
|
+
| <a id="CE_COMPILE_DEPTH_NEAR_INVALID"></a>`CE_COMPILE_DEPTH_NEAR_INVALID` | “<value>: the depth block says "near": <value>; it is "white" or "black". Both conventions are in use, and a sheet read with the wrong one turns the part inside out with every gate green.” | State near as white or black to declare the sheet convention. |
|
|
7049
|
+
| <a id="CE_COMPILE_DEPTH_TONE_SCALE_INVALID"></a>`CE_COMPILE_DEPTH_TONE_SCALE_INVALID` | “<value>: "zScale" is <value>; it is a finite number of world units”<br>“<value>: "zScale" is <value>; it is how many units the map's full range spans, so a positive number. To put the near end at the back, say "near": "black" — a negative scale states the same thing twice and the two can then disagree.”<br>“<value>: depth tone "<value>" is <value>; it is a finite number”<br>“<value>: depth tone "contrast" is <value>; a contrast at or below 0 collapses the range onto the midpoint (or turns it inside out), so the map would describe a flat part. It is a positive number, and 1 leaves the range alone.”<br>“<value>: depth tone "gamma" is <value>; a gamma at or below 0 maps every level to the same nearness, so the map would describe a flat part. It is a positive number, and 1 is the straight line.”<br>Here the values named in the message include: “bias”. | Use finite depth tone values, positive gamma/contrast and a positive finite zScale. |
|
|
7050
|
+
| <a id="CE_COMPILE_DEPTH_COVERAGE_INCOMPLETE"></a>`CE_COMPILE_DEPTH_COVERAGE_INCOMPLETE` | “<value>: the depth map "<value>" does not cover <value> of the mesh's <value> vertices — the first is vertex <value> at (<value>, <value>)[ / in the page's texels, pixel (<value>, <value>) of the drawing-sized sheet]. <value> Sampling anyway would give those vertices the sheet's background depth and fold them away from the turn.”<br>“[A contour mesh puts every vertex ON the silhouette and pushes it out by the margin, so a sheet cut to the art stops short of every one of them. Dilate the sheet past the mesh margin, or lower the margin. / A grid spans the whole part window, corners included, while a sheet is usually cut to the art — so the lattice reaches past it wherever the art does not fill the window. Dilate the sheet to the window, or state "us"/"vs" that keep the lattice inside the art.]” | Supply a depth sheet covering every mesh vertex in the part's drawing-sized pixel grid. |
|
|
7051
|
+
| <a id="CE_COMPILE_MESH_BONE_SETUP_TRANSFORM_MISSING"></a>`CE_COMPILE_MESH_BONE_SETUP_TRANSFORM_MISSING` | “<value>: bone "<value>" has no setup transform” | Correct the bone/setup hierarchy; report a missing compiled transform for a declared bone. |
|
|
7052
|
+
| <a id="CE_COMPILE_MESH_BONE_NOT_DECLARED"></a>`CE_COMPILE_MESH_BONE_NOT_DECLARED` | “<value>: bone "<value>" is not in the rig's bone list” | Use a bone name declared in the rig. |
|
|
7053
|
+
| <a id="CE_COMPILE_GREY_SHEET_IMAGE_MISSING"></a>`CE_COMPILE_GREY_SHEET_IMAGE_MISSING` | “<value>: the "<value>" block has no image to read” | State the image in the named depth/soft block. |
|
|
7054
|
+
| <a id="CE_COMPILE_GREY_SHEET_IMAGE_NOT_FOUND"></a>`CE_COMPILE_GREY_SHEET_IMAGE_NOT_FOUND` | “<value>: the <value> "<value>" is not at <value>”<br>Also: “{depth map / soft mask}” | Supply the named sheet at the images path or correct its image name. |
|
|
7055
|
+
| <a id="CE_COMPILE_GREY_SHEET_SIZE_MISMATCH"></a>`CE_COMPILE_GREY_SHEET_SIZE_MISMATCH` | “[<value>: the <value> "<value>" is <value>x<value> and the part is <value>x<value>. It is sampled in the part's own pixel grid, so the two are the same size — resample the sheet, or point at the one that was made for this part. / <value>: the <value> "<value>" is <value>x<value> and the part is a <value>x<value> drawing — <value>x<value> texels on a page that declares scale: <value>, which makes a texel <value>px of the drawing. It is sampled in the part's own pixel grid, which is the drawing's, at each vertex's texel position over that scale — so the sheet is <value>x<value>, the size of the loose art, whatever the page holds. Resample the sheet, or point at the one that was made for this part.]”<br>Also: “{depth map / soft mask}” | Resample the sheet to the part's drawing-sized grid, accounting for imported atlas scale. |
|
|
7056
|
+
| <a id="CE_COMPILE_GREY_SHEET_NOT_GREYSCALE"></a>`CE_COMPILE_GREY_SHEET_NOT_GREYSCALE` | “<value>: the <value> "<value>" is not greyscale — pixel (<value>, <value>) is rgb(<value>, <value>, <value>). It is one channel; reading red out of a colour file would use whatever that channel happened to hold.”<br>Also: “{depth map / soft mask}” | Supply a single-tone greyscale sheet with equal red/green/blue channels. |
|
|
7057
|
+
| <a id="CE_COMPILE_SOFT_BONE_MISSING"></a>`CE_COMPILE_SOFT_BONE_MISSING` | “<value>: the "soft" block has no "bone"; it is the bone the soft region is carried by” | Name the independent bone carrying the soft region. |
|
|
7058
|
+
| <a id="CE_COMPILE_SOFT_BONE_UNKNOWN"></a>`CE_COMPILE_SOFT_BONE_UNKNOWN` | “<value>: "soft" names bone "<value>", which this rig does not declare. rigc binds a region to a bone that already exists rather than creating one — a bone a physics constraint has to target is part of the skeleton, not a side effect of a mesh.” | Declare the soft region's bone in the rig. |
|
|
7059
|
+
| <a id="CE_COMPILE_SOFT_BONE_IS_ANCHOR"></a>`CE_COMPILE_SOFT_BONE_IS_ANCHOR` | “<value>: "soft" names "<value>", which is this slot's own bone. Carrying the region with the bone the rest of the mesh is already pinned to moves nothing — a soft region needs a bone that can move independently, which is what a physics constraint is put on.” | Use a bone that moves independently of the slot's anchor bone. |
|
|
7060
|
+
| <a id="CE_COMPILE_SOFT_MASK_INERT"></a>`CE_COMPILE_SOFT_MASK_INERT` | “<value>: the soft mask "<value>" carries no vertex of this mesh — every one of its <value> vertices samples black. A region that moves nothing is a physics constraint with nothing on the end of it; check that the mask is painted where the mesh actually is, and that it is white where the art is soft.” | Paint the soft mask white where the mesh has soft vertices. |
|
|
7061
|
+
| <a id="CE_COMPILE_GRID_IMAGE_MISSING"></a>`CE_COMPILE_GRID_IMAGE_MISSING` | “<value>: a "grid" generator lays its lattice over the part's own window, so the attachment needs an "image" — there is nothing else here that says how big that window is” | Supply image so the grid has a measured part window. |
|
|
7062
|
+
| <a id="CE_COMPILE_GRID_POSITIONS_AND_COUNT"></a>`CE_COMPILE_GRID_POSITIONS_AND_COUNT` | “<value>: the "grid" generator states both positions ("us"/"vs") and a count ("cols"/"rows"). They are two answers to where the columns go, and a spec carrying both leaves a reader unable to say which one built the mesh. Drop one — positions are the more precise of the two.” | Choose explicit us/vs positions or cols/rows counts. |
|
|
7063
|
+
| <a id="CE_COMPILE_GRID_POSITION_AND_COUNT_MISSING"></a>`CE_COMPILE_GRID_POSITION_AND_COUNT_MISSING` | “<value>: the "grid" generator says neither where its columns go ("us"/"vs", fractions of the window) nor how many there are ("cols"/"rows"). A lattice is not a default.” | State us/vs positions or cols/rows counts. |
|
|
7064
|
+
| <a id="CE_COMPILE_GRID_COUNT_INVALID"></a>`CE_COMPILE_GRID_COUNT_INVALID` | “<value>: "<value>" is <value>; it is a whole number of at least 2” | State cols/rows as whole numbers of at least two. |
|
|
7065
|
+
| <a id="CE_COMPILE_GRID_AXIS_MISSING"></a>`CE_COMPILE_GRID_AXIS_MISSING` | “<value>: the "grid" generator states ["vs" / "us"] and not ["us" / "vs"]; a lattice needs both axes” | State both us and vs axes. |
|
|
7066
|
+
| <a id="CE_COMPILE_GRID_GENERATOR_INVALID"></a>`CE_COMPILE_GRID_GENERATOR_INVALID` | “"<value>" has [<value> / <value>] positions; a grid needs at least 2 on each axis”<br>“"<value>" is not ascending: [<value>]=<value> and [<value>]=<value>”<br>“"<value>"[<value>] is <value>; positions are finite numbers”<br>“"<value>"[<value>] is <value>; positions are fractions of the part window, 0..1”<br>“<value>: <value>”<br>“the part window is <value>x<value>; a grid needs a positive size” | Correct the grid's finite ascending 0..1 axis positions and positive part size as the full message states. |
|
|
7067
|
+
| <a id="CE_COMPILE_GENERATED_IMAGE_WIDTH_MISMATCH"></a>`CE_COMPILE_GENERATED_IMAGE_WIDTH_MISMATCH` | “<value>: the spec says width <value> and "<value>" measures <value>” | Make attachment width agree with the measured image width. |
|
|
7068
|
+
| <a id="CE_COMPILE_GENERATED_IMAGE_HEIGHT_MISMATCH"></a>`CE_COMPILE_GENERATED_IMAGE_HEIGHT_MISMATCH` | “<value>: the spec says height <value> and "<value>" measures <value>” | Make attachment height agree with the measured image height. |
|
|
7069
|
+
| <a id="CE_COMPILE_SLOT_BONE_NOT_DECLARED"></a>`CE_COMPILE_SLOT_BONE_NOT_DECLARED` | “<value>: slot bone "<value>" is not in the rig's bone list” | Use a slot bone declared in the rig. |
|
|
7070
|
+
| <a id="CE_COMPILE_SEGMENTS_FALLOFF_RADIUS_INVALID"></a>`CE_COMPILE_SEGMENTS_FALLOFF_RADIUS_INVALID` | “<value>: "falloff.radius" is <value>; it is added to every distance before the power is taken, a positive number of the part's pixels — at 0 a vertex on a segment would carry an infinite pull” | State a positive finite falloff radius in part pixels. |
|
|
7071
|
+
| <a id="CE_COMPILE_SEGMENTS_FALLOFF_POWER_INVALID"></a>`CE_COMPILE_SEGMENTS_FALLOFF_POWER_INVALID` | “<value>: "falloff.power" is <value>; it is the exponent a pull falls off with distance by, a positive number — at 0 or below the far segment pulls as hard as the near one, or harder” | State a positive finite falloff power. |
|
|
7072
|
+
| <a id="CE_COMPILE_SEGMENTS_FALLOFF_MAX_BONES_INVALID"></a>`CE_COMPILE_SEGMENTS_FALLOFF_MAX_BONES_INVALID` | “<value>: "falloff.maxBones" is <value>; it is how many bones may pull one vertex, a whole number of at least 1” | State falloff.maxBones as a whole number of at least one. |
|
|
7073
|
+
| <a id="CE_COMPILE_SEGMENTS_FALLOFF_MIN_WEIGHT_INVALID"></a>`CE_COMPILE_SEGMENTS_FALLOFF_MIN_WEIGHT_INVALID` | “<value>: "falloff.minWeight" is <value>; it is the share under which a bone's pull is dropped, so it lies in <value>..1 with 1 excluded — at 1 or above every share is dropped, and under <value>, one step of the 6-decimal grid weights are written on, a kept binding could be written as 0” | State falloff.minWeight on or above the weight grid step and below one. |
|
|
7074
|
+
| <a id="CE_COMPILE_SEGMENTS_WEIGHT_MODE_CONFLICT"></a>`CE_COMPILE_SEGMENTS_WEIGHT_MODE_CONFLICT` | “<value>: the "segments" generator states both "falloff" and "influence". Both turn a distance into a share — "falloff" as 1 / (d + radius)^power over every segment, "influence" as a pull that reaches zero at its "radius" — and a mesh is weighted by one of them: remove the other” | Use falloff or influence, rather than both. |
|
|
7075
|
+
| <a id="CE_COMPILE_SEGMENTS_INFLUENCE_INVALID"></a>`CE_COMPILE_SEGMENTS_INFLUENCE_INVALID` | “<value>: "influence" is <value>; it is { "radius", "across", "max", "shape" }, every one required” | State influence with radius/across/max/shape, every field required. |
|
|
7076
|
+
| <a id="CE_COMPILE_SEGMENTS_INFLUENCE_RADIUS_INVALID"></a>`CE_COMPILE_SEGMENTS_INFLUENCE_RADIUS_INVALID` | “<value>: "influence.radius" is <value>; it is how far a link reaches, in the part's pixels, a positive number with no default — a length on this art: a link whose segment is that far from a vertex or farther never pulls it”<br>Here the values named in the message include: “absent”. | State positive finite influence.radius in part pixels. |
|
|
7077
|
+
|
|
7078
|
+
|
|
7079
|
+
#### 5.1.7 Mesh generators, depth and soft regions (2)
|
|
7080
|
+
|
|
7081
|
+
| Code | Fixed message text and alternatives | What to change |
|
|
7082
|
+
| --- | --- | --- |
|
|
7083
|
+
| <a id="CE_COMPILE_SEGMENTS_INFLUENCE_ACROSS_INVALID"></a>`CE_COMPILE_SEGMENTS_INFLUENCE_ACROSS_INVALID` | “<value>: "influence.across" is <value>; it is true (every link within "radius" pulls, across the entries of "bones") or false (only the links of the entry nearest the vertex), with no default — whether a chain may pull its neighbour's cloth is the decision this field is”<br>Here the values named in the message include: “absent”. | State influence.across as true or false. |
|
|
7084
|
+
| <a id="CE_COMPILE_SEGMENTS_INFLUENCE_MAX_INVALID"></a>`CE_COMPILE_SEGMENTS_INFLUENCE_MAX_INVALID` | “<value>: "influence.max" is <value>; it is how many links may pull one vertex, the strongest kept, a whole number of at least 1 with no default”<br>Here the values named in the message include: “absent”. | State influence.max as a whole number of at least one. |
|
|
7085
|
+
| <a id="CE_COMPILE_SEGMENTS_INFLUENCE_SHAPE_INVALID"></a>`CE_COMPILE_SEGMENTS_INFLUENCE_SHAPE_INVALID` | “<value>: "influence.shape" is <value>; one of <value> — how a pull falls from 1 on a link to 0 at "radius", with no default: "linear" is 1 - d/radius, "smooth" arrives at both ends with zero slope”<br>Here the values named in the message include: “absent”. | State influence.shape as linear or smooth. |
|
|
7086
|
+
| <a id="CE_COMPILE_SEGMENTS_IMAGE_MISSING"></a>`CE_COMPILE_SEGMENTS_IMAGE_MISSING` | “<value>: a "segments" generator lays its lattice over the part's own alpha, so the attachment needs an "image" — there is nothing else here that says which pixels are art” | Supply image so the lattice measures the part's alpha. |
|
|
7087
|
+
| <a id="CE_COMPILE_SEGMENTS_ATLAS_GRID_UNSUPPORTED"></a>`CE_COMPILE_SEGMENTS_ATLAS_GRID_UNSUPPORTED` | “<value>. <value>”<br>“<value>. <value> <value>”<br>“<value>: a "segments" generator lays its lattice over the part's own alpha, and "<value>" is lifted off a packed page at the coordinates the atlas states, which on this file are not where its texels are — so there is no art here to cover, only another part of the page. <value>”<br>“A runtime does not read the file's own size anywhere in the region mapping — `TextureAtlas` computes every region's UVs as a fraction of the DECLARED size (`region.u = region.x / page.width`, spine-core `dist/TextureAtlas.js:162-171`) — so a page whose PNG is the declared page RESCALED draws the same picture at the file's resolution, and one whose PNG is anything else draws whatever sits at those fractions. What a declared size that disagrees with the file breaks is every reader that addresses the page in TEXELS: this validator's own `A19` alpha scan, the region lift rigc's mesh generators trace, and a canvas renderer that cuts each part out of the page by source rectangle.”<br>“[<value> / <value> — <value> of the declared width and <value> of the declared height]”<br>“[The `scale:` header states one ratio for both axes, so a page whose axes differ cannot be declared honestly at all: re-export the page at <value>x<value>, or repack it. / [The format states coarser texels with the `scale:` header, but this page cannot be re-declared that way: <value>. Re-export the page at <value>x<value>, or repack it. / The format states coarser texels with the `scale:` header and rigc builds that: declare `size: <value>, <value>` with `scale: <value>` and multiply every `bounds`/`offsets` on this page by <value>, and every part keeps the size it has now.]]”<br>“page "<value>" declares <value>x<value> and its PNG is <value>x<value>”<br>“region <value>'s `<value>` of <value> becomes <value> on the file's own grid, which is not a whole texel” | Use correctly addressed atlas pixels or the loose part image for the alpha lattice. |
|
|
7088
|
+
| <a id="CE_COMPILE_SEGMENTS_ATLAS_SCALE_UNSUPPORTED"></a>`CE_COMPILE_SEGMENTS_ATLAS_SCALE_UNSUPPORTED` | “<value>: a "segments" generator measures its "cell" and its falloff "radius" in the part's pixels, and "<value>" sits on a page that declares scale: <value>, where a pixel of the drawing is not a texel of the page. This generator does not convert between the two; build it from the loose part, or from a pack at scale 1” | Build segments from the loose part or an atlas at scale one. |
|
|
7089
|
+
| <a id="CE_COMPILE_SEGMENTS_WEIGHT_MODE_MISSING"></a>`CE_COMPILE_SEGMENTS_WEIGHT_MODE_MISSING` | “<value>: the "segments" generator states no "falloff" block. Its "radius" — added to every distance, in the part's pixels — has no default, because it is a length on this art: "falloff": { "radius": <pixels> } is the least it takes (or an "influence" block, whose pull reaches zero at its own "radius")” | State falloff.radius or a complete influence block. |
|
|
7090
|
+
| <a id="CE_COMPILE_SEGMENTS_LATTICE_INVALID"></a>`CE_COMPILE_SEGMENTS_LATTICE_INVALID` | “"cell" is <value>; it is the lattice's square, a whole number of pixels of at least 1”<br>“<value>: <value>”<br>“no pixel of the <value>x<value> part reaches alpha <value>, so a lattice at cell <value> keeps no cell — there is no art to cover. Lower "alpha", or point at the image this mesh is meant to draw”<br>“the alpha threshold must be a whole number in 1..255, got <value>” | Use a whole positive cell size, a valid alpha threshold and art that keeps at least one lattice cell. |
|
|
7091
|
+
| <a id="CE_COMPILE_SEGMENTS_ANCHOR_INVALID"></a>`CE_COMPILE_SEGMENTS_ANCHOR_INVALID` | “<value>: "anchor" is <value>; it is where the slot bone sits in the part's pixels, y down, as [x, y] — two finite numbers” | State anchor as two finite part-pixel coordinates, y down. |
|
|
7092
|
+
| <a id="CE_COMPILE_SEGMENTS_BONES_EMPTY"></a>`CE_COMPILE_SEGMENTS_BONES_EMPTY` | “<value>: the "segments" generator names no bones. "bones" is the one decision this generator takes — which segments may pull the part — so it lists at least one: a bone name, a chain as a list of bone names, or { "bone", "from", "to" }” | Name at least one bone, chain or explicit bone segment. |
|
|
7093
|
+
| <a id="CE_COMPILE_SEGMENTS_BONE_UNKNOWN"></a>`CE_COMPILE_SEGMENTS_BONE_UNKNOWN` | “<value>: <value> names mesh bone <value>, which is not in the rig's bone list”<br>Also: “"bones"[<value>]”<br>“<value>.bone” | Name mesh bones declared by the rig. |
|
|
7094
|
+
| <a id="CE_COMPILE_SEGMENTS_BONE_LENGTH_MISSING"></a>`CE_COMPILE_SEGMENTS_BONE_LENGTH_MISSING` | “<value>: <value> names bone "<value>", which has no "length"[ and is the last link of its chain / ], so it has an origin and no segment. Give the bone a "length" (its segment runs from its origin to that tip, along its setup rotation), [end the chain on a bone that has one, / name it inside a chain whose next link says where it ends, ]or state the segment outright as { "bone", "from", "to" }”<br>Also: “"bones"[<value>]” | Give the bone a length, a following chain link, or explicit from/to endpoints. |
|
|
7095
|
+
| <a id="CE_COMPILE_SEGMENTS_CHAIN_EMPTY"></a>`CE_COMPILE_SEGMENTS_CHAIN_EMPTY` | “<value>: <value> is an empty chain; a chain lists its bones root first, at least one”<br>Also: “"bones"[<value>]” | List at least one chain bone root first. |
|
|
7096
|
+
| <a id="CE_COMPILE_SEGMENTS_CHAIN_ORDER_INVALID"></a>`CE_COMPILE_SEGMENTS_CHAIN_ORDER_INVALID` | “<value>: <value> chains "<value>" to "<value>", and "<value>" is not under "<value>" in the bone tree — a chain runs down the skeleton, each link a descendant of the one before it. List the chain root first, or name the two bones as separate entries”<br>Also: “"bones"[<value>]” | List chain bones root first with each next link a descendant, or use separate entries. |
|
|
7097
|
+
| <a id="CE_COMPILE_SEGMENTS_CHAIN_ZERO_LENGTH"></a>`CE_COMPILE_SEGMENTS_CHAIN_ZERO_LENGTH` | “<value>: <value> chains "<value>" to "<value>", and the two bones share their setup origin (<value>, <value>), so the link has no length and no direction to weight along. Give "<value>" its own position, or name "<value>" alone with a "length"”<br>Also: “"bones"[<value>]” | Give the next bone its own position or use a lone bone with length. |
|
|
7098
|
+
| <a id="CE_COMPILE_SEGMENTS_ENDPOINT_INVALID"></a>`CE_COMPILE_SEGMENTS_ENDPOINT_INVALID` | “<value>: <value> states a segment whose ["from" / "to"] is <value>; both ends are [x, y] in the part's pixels, y down”<br>Also: “"bones"[<value>]” | State both segment endpoints as finite x/y pairs in part pixels, y down. |
|
|
7099
|
+
| <a id="CE_COMPILE_SEGMENTS_ENTRY_INVALID"></a>`CE_COMPILE_SEGMENTS_ENTRY_INVALID` | “<value>: <value> is <value>; an entry is a bone name, a chain as a list of bone names, or { "bone", "from", "to" }”<br>Also: “"bones"[<value>]” | Use a bone name, a root-first bone chain or an explicit bone/from/to segment. |
|
|
7100
|
+
| <a id="CE_COMPILE_SEGMENTS_VERTEX_UNREACHED"></a>`CE_COMPILE_SEGMENTS_VERTEX_UNREACHED` | “<value>: vertex <value>, at (<value>, <value>) in the part's pixels, is reached by no link — the nearest is "<value>" at <value>, and "influence.radius" is <value>[ / (with "across": false, the nearest entry's links only)]. A vertex needs a link, and rigc will not hand it one the reach does not: raise "radius" over that distance, or name a segment nearer this part of the art” | Raise influence.radius beyond the nearest link distance or name a nearer segment. |
|
|
7101
|
+
| <a id="CE_COMPILE_SEGMENTS_VERTEX_WEIGHTS_DROPPED"></a>`CE_COMPILE_SEGMENTS_VERTEX_WEIGHTS_DROPPED` | “<value>: vertex <value>, at (<value>, <value>) in the part's pixels, keeps no bone — the <value> strongest pull(s) share it as <value>, and every one is under "minWeight" <value>. A vertex needs a bone, and rigc will not pick one the falloff dropped: lower "minWeight" to <value> or under (1 / "maxBones", which the strongest share can never fall below), or name a segment nearer this part of the art” | Lower minWeight to at most 1/maxBones or name a segment nearer the art. |
|
|
7102
|
+
| <a id="CE_COMPILE_CONTOUR_IMAGE_MISSING"></a>`CE_COMPILE_CONTOUR_IMAGE_MISSING` | “<value>: a "contour" generator traces the part's own alpha, so the attachment needs an "image" — there is nothing else here that says which pixels to measure” | Supply image so the contour measures the part's alpha. |
|
|
7103
|
+
| <a id="CE_COMPILE_CONTOUR_ATLAS_GRID_UNSUPPORTED"></a>`CE_COMPILE_CONTOUR_ATLAS_GRID_UNSUPPORTED` | “<value>. <value>”<br>“<value>. <value> <value>”<br>“<value>: a "contour" generator traces the part's own alpha, and "<value>" is lifted off a packed page at the coordinates the atlas states, which on this file are not where its texels are — so there is no silhouette here to trace, only another part of the page. <value>”<br>“A runtime does not read the file's own size anywhere in the region mapping — `TextureAtlas` computes every region's UVs as a fraction of the DECLARED size (`region.u = region.x / page.width`, spine-core `dist/TextureAtlas.js:162-171`) — so a page whose PNG is the declared page RESCALED draws the same picture at the file's resolution, and one whose PNG is anything else draws whatever sits at those fractions. What a declared size that disagrees with the file breaks is every reader that addresses the page in TEXELS: this validator's own `A19` alpha scan, the region lift rigc's mesh generators trace, and a canvas renderer that cuts each part out of the page by source rectangle.”<br>“[<value> / <value> — <value> of the declared width and <value> of the declared height]”<br>“[The `scale:` header states one ratio for both axes, so a page whose axes differ cannot be declared honestly at all: re-export the page at <value>x<value>, or repack it. / [The format states coarser texels with the `scale:` header, but this page cannot be re-declared that way: <value>. Re-export the page at <value>x<value>, or repack it. / The format states coarser texels with the `scale:` header and rigc builds that: declare `size: <value>, <value>` with `scale: <value>` and multiply every `bounds`/`offsets` on this page by <value>, and every part keeps the size it has now.]]”<br>“page "<value>" declares <value>x<value> and its PNG is <value>x<value>”<br>“region <value>'s `<value>` of <value> becomes <value> on the file's own grid, which is not a whole texel” | Use correctly addressed atlas pixels or the loose part image for the alpha contour. |
|
|
7104
|
+
| <a id="CE_COMPILE_CONTOUR_GENERATOR_INVALID"></a>`CE_COMPILE_CONTOUR_GENERATOR_INVALID` | “<value>: <value>”<br>“[ / (the drawing's pixels — applied as <value> texel(s) of this page, whose scale: <value> makes a texel <value>px of the drawing)]”<br>“[px / texels]”<br>“a polygon needs at least 3 vertices to triangulate, got <value>”<br>“bad part size <value>x<value>”<br>“ear clipping stalled with <value> of <value> vertices left: every remaining corner is reflex or covers another vertex, which a strictly simple polygon cannot be — the outline is degenerate”<br>“every pixel of the <value>x<value> part reaches alpha <value>, so its silhouette IS the part window and a contour mesh of it is a region attachment with extra vertices — give the art a transparent margin, raise the alpha threshold, or use a region”<br>“maxVertices must be a whole number of at least 3, got <value>”<br>“no pixel of the <value>x<value> part reaches alpha <value>; there is no silhouette to trace”<br>“the <value>x<value> silhouette simplified to <value> distinct vertices at tolerance <value><value>; lower the tolerance”<br>“the alpha mask holds <value> bytes for a <value>x<value> part”<br>“the alpha silhouette pinches to a single point at pixel corner (<value>,<value>), where two parts of the art meet diagonally — one outline cannot pass through one point twice. Move the alpha threshold so the pinch opens (raise it) or closes (lower it), or author the geometry as weights”<br>“the alpha threshold must be a whole number in 1..255, got <value>”<br>“the alpha trace did not close; the mask is not a closed region”<br>“the alpha trace reached a dead end at corner (<value>,<value>); the mask is not a closed region”<br>“the art is <value> separate islands and one outline can only enclose the largest (<value> of <value> px, <value>%) — raise the alpha threshold if the strays are feathering, or give each island its own slot”<br>“the margin must be 0 or more pixels, got <value>”<br>“the mesh covers <value>% of the art (<value> of <value> <value>), under the <value>% a contour mesh guarantees — raise the margin (now <value>px) above the tolerance (<value>px), which is how far simplification is allowed to cut inward, or lower the tolerance<value>”<br>“the mesh reaches <value>px past the silhouette, past the <value>px that a margin of <value> and a tolerance of <value><value> can produce — the outline is not the one this builder promises, which is a defect in the builder rather than in the art”<br>“the outline crosses itself: edge <value> meets edge <value> after a margin of <value>px<value> was pushed out of a silhouette narrower than that — lower the margin, or the art has a neck too thin to mesh”<br>“the polygon encloses no area, so it has no triangles”<br>“the silhouette simplified to <value> vertices at tolerance <value><value>, past the <value> this mesh allows — raise the tolerance to spend fewer vertices, or raise maxVertices if the shape needs them”<br>“the simplification tolerance must be a positive number of pixels, got <value>” | Follow the named alpha, tolerance, margin or topology repair. If the message says the builder overshot its declared margin, report the compiler defect with the measured overshoot and minimal inputs; preserve the art. |
|
|
7105
|
+
|
|
7106
|
+
|
|
7107
|
+
#### 5.1.8 Constraints and rig invariants
|
|
7108
|
+
|
|
7109
|
+
| Code | Fixed message text and alternatives | What to change |
|
|
7110
|
+
| --- | --- | --- |
|
|
7111
|
+
| <a id="CE_COMPILE_CONSTRAINT_BONE_UNKNOWN"></a>`CE_COMPILE_CONSTRAINT_BONE_UNKNOWN` | “<value>: <value> names <value>, which the rig does not declare as a bone”<br>Also: “rig constraint "<value>"” | Use a constraint bone declared in the rig. |
|
|
7112
|
+
| <a id="CE_COMPILE_CONSTRAINT_ENUM_UNKNOWN"></a>`CE_COMPILE_CONSTRAINT_ENUM_UNKNOWN` | “<value>: <value> is <value>; known: <value> (only the first letter's case is free — the parser's enumValue uppercases that one character and nothing else, and an unresolved name becomes undefined without an error)”<br>Also: “rig constraint "<value>"”<br>Here the values named in the message include: “ChainScale”, “None”, “Fixed”, “Volume”, “Length”, “Tangent”, “Uniform”, “Percent”, “Proportional”. | Use the named allowed enum spelling; only its first letter's case is free. |
|
|
7113
|
+
| <a id="CE_COMPILE_CONSTRAINT_NUMBER_NONFINITE"></a>`CE_COMPILE_CONSTRAINT_NUMBER_NONFINITE` | “<value>: <value> is <value>, which is not a finite number”<br>Also: “rig constraint "<value>"” | Supply finite constraint field numbers. |
|
|
7114
|
+
| <a id="CE_COMPILE_CONSTRAINT_BONES_EMPTY"></a>`CE_COMPILE_CONSTRAINT_BONES_EMPTY` | “<value>: a <value> constraint needs a non-empty "bones" array”<br>Also: “rig constraint "<value>"” | Name at least one bone in the constraint bones array. |
|
|
7115
|
+
| <a id="CE_COMPILE_TRANSFORM_PROPERTY_UNKNOWN"></a>`CE_COMPILE_TRANSFORM_PROPERTY_UNKNOWN` | “<value>: properties has "<value>"; known: <value>”<br>Also: “, ”<br>“rig constraint "<value>"”<br>Here the values named in the message include: “y”, “x”, “scaleY”, “shearY”, “scaleX”, “rotate”. | Use a transform property named in the allowed list. |
|
|
7116
|
+
| <a id="CE_COMPILE_TRANSFORM_TO_PROPERTY_UNKNOWN"></a>`CE_COMPILE_TRANSFORM_TO_PROPERTY_UNKNOWN` | “<value>: properties.<value>.to has "<value>"; known: <value>”<br>Also: “, ”<br>“rig constraint "<value>"”<br>Here the values named in the message include: “y”, “x”, “scaleY”, “shearY”, “scaleX”, “rotate”. | Use a to property named in the allowed transform-property list. |
|
|
7117
|
+
| <a id="CE_COMPILE_CONSTRAINT_SLOT_UNKNOWN"></a>`CE_COMPILE_CONSTRAINT_SLOT_UNKNOWN` | “<value>: slot names <value>, which the rig does not declare as a slot”<br>Also: “rig constraint "<value>"” | Use a slot declared by the rig. |
|
|
7118
|
+
| <a id="CE_COMPILE_PATH_CONSTRAINT_SLOT_NO_PATH"></a>`CE_COMPILE_PATH_CONSTRAINT_SLOT_NO_PATH` | “<value>: slot "<value>" has no path attachment in any skin, so the constraint has no curve to follow — PathConstraint.update returns immediately unless the slot's attachment is a path, which means this constraint would load, report every mix it was given, and move nothing. Give that slot an attachment with "type": "path".”<br>Also: “rig constraint "<value>"” | Give the target slot a path attachment in a skin. |
|
|
7119
|
+
| <a id="CE_COMPILE_SLIDER_ANIMATION_MISSING"></a>`CE_COMPILE_SLIDER_ANIMATION_MISSING` | “<value>: a slider needs an "animation" — the animation it applies. Without one the parser's second pass over the constraints array throws `Slider animation not found`.”<br>Also: “rig constraint "<value>"” | Name the animation the slider applies. |
|
|
7120
|
+
| <a id="CE_COMPILE_SLIDER_ANIMATION_UNKNOWN"></a>`CE_COMPILE_SLIDER_ANIMATION_UNKNOWN` | “<value>: applies animation "<value>", which the motion spec does not declare[ (it declares: <value>) / (it declares none at all)]”<br>Also: “rig constraint "<value>"” | Use an animation declared by the motion spec. |
|
|
7121
|
+
| <a id="CE_COMPILE_SLIDER_ANIMATION_EDITOR_ORDER"></a>`CE_COMPILE_SLIDER_ANIMATION_EDITOR_ORDER` | “<value>: applies animation "<value>", which the Spine file lists at index <value> of its animations and the Spine editor sorts to index <value> — so an editor import repoints this slider to "<value>", in a file that still parses and gates green. A JSON object lists every array-index key (<value> here) before the rest, the editor re-sorts the animations into its own order on import, and a slider holds its animation by index (measured on Spine 4.3.26; AUTHORING R10). Rename <value> so no animation name is a plain non-negative integer — a prefix or a leading zero ("a<value>", "0<value>") puts the file's order and the editor's in step.”<br>Also: “rig constraint "<value>"” | Rename integer animation keys with a prefix or leading zero so editor and file indices agree. |
|
|
7122
|
+
| <a id="CE_COMPILE_SLIDER_BONE_PROPERTY_UNKNOWN"></a>`CE_COMPILE_SLIDER_BONE_PROPERTY_UNKNOWN` | “<value>: drives off bone "<value>" but its property is <value>; known: <value> (the parser throws on anything else)”<br>Also: “, ”<br>“rig constraint "<value>"”<br>Here the values named in the message include: “x”, “scaleY”, “shearY”, “scaleX”, “rotate”. | Use a driving property named in the allowed list. |
|
|
7123
|
+
| <a id="CE_COMPILE_SLIDER_SCALE_ZERO"></a>`CE_COMPILE_SLIDER_SCALE_ZERO` | “<value>: scale is 0, so the bone's property cannot move the slider's time at all”<br>Also: “rig constraint "<value>"” | Use a nonzero slider mapping scale. |
|
|
7124
|
+
| <a id="CE_COMPILE_SLIDER_WORLD_ROTATION_DEAD_RANGE"></a>`CE_COMPILE_SLIDER_WORLD_ROTATION_DEAD_RANGE` | “<value>: drives off bone "<value>" rotate with "local": false, and the driving values that reach animation "<value>" (0s..<value>s) run from <value>° to <value>°. A world rotation is read through `FromRotate.value`, which ends `if (value < 0) value += 360`, so the bone at <value>° is read as <value>° and maps to time <value>s. <value> The whole part of the range <value> is dead and nothing at runtime reports it. Add `"local": true` to read the bone's own rotation signed and unwrapped — that is the form a face axis wants — or <value>.”<br>“<value>s..<value>s”<br>“[Nothing is held: "loop": true wraps the time as `duration + (time % duration)`, so the <value>° of the range <value> selects nothing a reading inside the circle does not already select. / [This dial reaches none of the animation's <value>s — the whole circle is held on the frame at <value>s. / [This dial reaches only <value> of the animation's <value>s, and no reading of the circle reaches the rest of it. / This dial reaches only <value> of the animation's <value>s, and <value>% of the circle — <value> — is held on the frame at <value>s.]]]”<br>“[every reading / [every reading below <value>° / every reading above <value>°]]”<br>“below 0°”<br>“move the range so it does not cross 0°”<br>“move the range so it does not run past 360°”<br>“past 360°”<br>Also: “{<value> of the range below 0 repeats 0.000..<value>, which is <value>s..<value>s of the animation, in reverse. / the whole <value> of this range is below 0, so it reaches none of the animation's <value>s — every value the reader can return maps past it and the pose holds the frame at <value>s.}”<br>“rig constraint "<value>"”<br>“rename so the only whitespace in either name is a space”<br>“write each number one way — rename so no digit run in either name has a second spelling”<br>“rename one of the two folders so they differ by more than letter case, spacing or a leading zero” | Set local true to read signed unwrapped rotation, or move the mapping outside the named dead range. |
|
|
7125
|
+
| <a id="CE_COMPILE_SLIDER_WORLD_SCALE_FOLDED"></a>`CE_COMPILE_SLIDER_WORLD_SCALE_FOLDED` | “<value>: drives off bone "<value>" <value> with "local": false, and the driving values that reach animation "<value>" (0s..<value>s) run from <value> to <value>. A world scale is read through `From[ScaleX / ScaleY].value` as `Math.sqrt([a² + c² / b² + d²])`, a magnitude, so the bone at <value> is read as <value> and maps to time <value>s — the time the bone at <value> maps to. Positions below 0 read as the mirror of positions above it: <value> Nothing at runtime reports it. Add `"local": true` to read the bone's own scale signed and unfolded — that is the form a squash axis wants — or move the range so it does not dip below 0.”<br>“[<value> of the range below 0 repeats 0.000..<value>, which is <value>s..<value>s of the animation, in reverse. / the whole <value> of this range is below 0, so it reaches none of the animation's <value>s — every value the reader can return maps past it and the pose holds the frame at <value>s.]”<br>Also: “{Nothing is held: "loop": true wraps the time as `duration + (time % duration)`, so the <value>° of the range <value> selects nothing a reading inside the circle does not already select. / {This dial reaches none of the animation's <value>s — the whole circle is held on the frame at <value>s. / {This dial reaches only <value> of the animation's <value>s, and no reading of the circle reaches the rest of it. / This dial reaches only <value> of the animation's <value>s, and <value>% of the circle — <value> — is held on the frame at <value>s.}}}”<br>“{every reading / {every reading below <value>° / every reading above <value>°}}”<br>“below 0°”<br>“past 360°”<br>“rig constraint "<value>"” | Set local true to read signed scale, or keep the mapped range at or above zero. |
|
|
7126
|
+
| <a id="CE_COMPILE_SLIDER_BONELESS_FIELD_WITH_BONE"></a>`CE_COMPILE_SLIDER_BONELESS_FIELD_WITH_BONE` | “<value>: declares both a "bone" and "<value>". A slider with a bone takes its time from that bone's property; "<value>" is read only by the bone-less form (`:361`), so it would be dropped in silence.”<br>Also: “rig constraint "<value>"” | Remove the bone-less-only field from the bone-driven slider. |
|
|
7127
|
+
| <a id="CE_COMPILE_SLIDER_BONE_FIELD_WITHOUT_BONE"></a>`CE_COMPILE_SLIDER_BONE_FIELD_WITHOUT_BONE` | “<value>: declares "<value>" but no "bone". Every one of <value> is read only inside the parser's `if (boneName)` branch (`:350-360`), so it would be dropped in silence. Name the driving bone, or key `slider.<name>.time` in the motion spec instead.”<br>Also: “rig constraint "<value>"”<br>Here the values named in the message include: “/”, “to”, “max”, “from”, “local”, “scale”, “property”. | Name the driving bone or remove bone-only fields and key slider time instead. |
|
|
7128
|
+
| <a id="CE_COMPILE_CONSTRAINT_TYPE_UNKNOWN"></a>`CE_COMPILE_CONSTRAINT_TYPE_UNKNOWN` | “<value>: constraint type <value> is not one Spine 4.3 knows. The five are: ik, transform, path, physics, slider. An unrecognised type matches no case in the parser and the constraint is dropped without a word.”<br>Also: “rig constraint "<value>"” | Use ik, transform, path, physics or slider as the constraint type. |
|
|
7129
|
+
| <a id="CE_COMPILE_AXIS_BONE_UNKNOWN"></a>`CE_COMPILE_AXIS_BONE_UNKNOWN` | “rig "<value>" names "<value>" as its axis bone, which it does not declare” | Declare the rig's axis bone or correct its name. |
|
|
7130
|
+
| <a id="CE_COMPILE_WINDING_EXEMPTION_NOT_MESH"></a>`CE_COMPILE_WINDING_EXEMPTION_NOT_MESH` | “rig "<value>" exempts slot "<value>" from A39_DEFORM_KEEPS_TRIANGLE_WINDING, but that slot carries no mesh — winding is a property of triangles, so there is nothing there to exempt” | Exempt only slots that carry meshes from triangle winding measurement. |
|
|
7131
|
+
| <a id="CE_COMPILE_CONTACT_DEPTH_INVALID"></a>`CE_COMPILE_CONTACT_DEPTH_INVALID` | “manifest stroke.contact_depth is <value>; it must be a positive number of axis pixels” | State positive manifest stroke.contact_depth in axis pixels. |
|
|
7132
|
+
| <a id="CE_COMPILE_CONTAINMENT_CEILING_INVALID"></a>`CE_COMPILE_CONTAINMENT_CEILING_INVALID` | “manifest stroke.cap_containment_ceiling is <value>; it must be a positive number of axis pixels (use null for "not measurable on this cut")” | State positive cap_containment_ceiling in axis pixels, or null when unmeasurable. |
|
|
7133
|
+
| <a id="CE_COMPILE_AXIS_UNIT_INVALID"></a>`CE_COMPILE_AXIS_UNIT_INVALID` | “manifest axis.unit must be [x, y], got <value>” | State axis.unit as an x/y pair. |
|
|
7134
|
+
| <a id="CE_COMPILE_AXIS_UNIT_DEG_MISMATCH"></a>`CE_COMPILE_AXIS_UNIT_DEG_MISMATCH` | “manifest axis.unit [<value>, <value>] does not match axis.deg <value> (expected [<value>, <value>])” | Make axis.unit agree with the unit vector derived from axis.deg. |
|
|
7135
|
+
| <a id="CE_COMPILE_INTERNAL_MESH_BONE_UNKNOWN"></a>`CE_COMPILE_INTERNAL_MESH_BONE_UNKNOWN` | “internal: mesh bone "<value>" is not in the bone list” | Report the mesh bone name and compiler defect: resolved geometry names a bone absent from the compiled bone list. |
|
|
7136
|
+
| <a id="CE_COMPILE_INTERNAL_MESH_BONE_TRANSFORM_MISSING"></a>`CE_COMPILE_INTERNAL_MESH_BONE_TRANSFORM_MISSING` | “internal: no setup transform for mesh bone "<value>"” | Report the mesh bone name and compiler defect: resolved geometry lost its setup transform. |
|
|
7137
|
+
| <a id="CE_COMPILE_INTERNAL_CONTROL_BONE_TRANSFORM_MISSING"></a>`CE_COMPILE_INTERNAL_CONTROL_BONE_TRANSFORM_MISSING` | “internal: no setup transform for control bone "<value>"” | Report the control bone name and compiler defect: the ring control lost its exact setup transform. |
|
|
7138
|
+
| <a id="CE_COMPILE_MANIFEST_RING_RIBBON_INVALID"></a>`CE_COMPILE_MANIFEST_RING_RIBBON_INVALID` | “a polygon vertex sits exactly on the aperture centre”<br>“a ring mesh needs at least one control bone”<br>“aperture centre (<value>,<value>) is outside the <value>x<value> part window”<br>“bad part size <value>x<value>”<br>“bias ramp must increase, got [<value>, <value>]”<br>“control bone "<value>" sits on the aperture centre, so it has no radial direction”<br>“hull is not star-shaped about the aperture centre; the inner ring would fold”<br>“hull needs at least 6 points, got <value>”<br>“hull point (<value>,<value>) is outside the <value>x<value> part window”<br>“inner must be in (0,1), got <value>”<br>“ray to the window edge did not converge”<br>“ribbon needs at least 3 rows, got <value>”<br>“ribbon needs at least one chain bone, got <value>”<br>“slot "<value>" mesh: <value>”<br>“two control bones share the angle <value> degrees about the aperture centre”<br>Also: “internal: no setup transform for control bone "<value>"” | Correct manifest ring/ribbon parameters and controls as the full generator message states. |
|
|
7139
|
+
|
|
7140
|
+
|
|
7141
|
+
#### 5.1.9 Motion keys, curves and target groups
|
|
7142
|
+
|
|
7143
|
+
| Code | Fixed message text and alternatives | What to change |
|
|
7144
|
+
| --- | --- | --- |
|
|
7145
|
+
| <a id="CE_COMPILE_CURVE_NOT_ARRAY"></a>`CE_COMPILE_CURVE_NOT_ARRAY` | “<value> (t=<value>): curve must be an array or "stepped"” | Use a numeric curve array or stepped. |
|
|
7146
|
+
| <a id="CE_COMPILE_CURVE_CHANNEL_COUNT"></a>`CE_COMPILE_CURVE_CHANNEL_COUNT` | “<value> (t=<value>): raw curve has <value> numbers, this timeline needs <value> channel(s) x 4 = <value>” | Supply four raw Bezier numbers per timeline channel. |
|
|
7147
|
+
| <a id="CE_COMPILE_CURVE_VALUE_NONFINITE"></a>`CE_COMPILE_CURVE_VALUE_NONFINITE` | “<value> (t=<value>): raw curve holds a non-finite value <value>” | Supply finite numbers in the raw curve array. |
|
|
7148
|
+
| <a id="CE_COMPILE_VALUE_TIMELINE_PROPERTY_UNKNOWN"></a>`CE_COMPILE_VALUE_TIMELINE_PROPERTY_UNKNOWN` | “animation "<value>": <value> "<value>" has no property "<value>"” | Use a property present on the named target's timeline family. |
|
|
7149
|
+
| <a id="CE_COMPILE_TIMELINE_KEYS_EMPTY"></a>`CE_COMPILE_TIMELINE_KEYS_EMPTY` | “<value>: no keys”<br>Also: “animation "<value>" deform <value>/<value>/<value>”<br>“animation "<value>" events”<br>“animation "<value>" drawOrder”<br>“animation "<value>" slot "<value>" <value>”<br>“animation "<value>" <value> constraint "<value>"”<br>Here the values named in the message include: “default”. | Supply at least one key in the timeline. |
|
|
7150
|
+
| <a id="CE_COMPILE_KEY_TIMES_NOT_INCREASING"></a>`CE_COMPILE_KEY_TIMES_NOT_INCREASING` | “<value>: key times must strictly increase (at t=<value>)”<br>Also: “animation "<value>" deform <value>/<value>/<value>”<br>“animation "<value>" drawOrder”<br>“animation "<value>" slot "<value>" <value>”<br>“animation "<value>" <value> constraint "<value>"”<br>Here the values named in the message include: “default”. | Order keys by strictly increasing time. |
|
|
7151
|
+
| <a id="CE_COMPILE_STEPPED_TIMELINE_EASING"></a>`CE_COMPILE_STEPPED_TIMELINE_EASING` | “<value> key at t=<value> carries [an easing ("<value>") / a curve], and this timeline is stepped by the format — its reader builds no curve, so the mode changes AT the key and holds until the next one. Remove it”<br>Also: “animation "<value>" <value> "<value>" <value>” | Remove easing/curve from the stepped mode timeline. |
|
|
7152
|
+
| <a id="CE_COMPILE_TIMELINE_MODE_UNKNOWN"></a>`CE_COMPILE_TIMELINE_MODE_UNKNOWN` | “<value> key at t=<value> names mode <value>; <value>”<br>“known: <value> — the runtime folds the case of the first letter and of nothing else”<br>Also: “animation "<value>" <value> "<value>" <value>”<br>“, ”<br>Here the values named in the message include: “noScaleOrReflection”, “normal”, “onlyTranslation”, “noRotationOrReflection”. | Use a mode named in the timeline's allowed mode list. |
|
|
7153
|
+
| <a id="CE_COMPILE_VALUELESS_TIMELINE_VALUE"></a>`CE_COMPILE_VALUELESS_TIMELINE_VALUE` | “<value>: this timeline takes no value; use null”<br>Also: “animation "<value>" <value> "<value>" <value>” | Use null for a timeline that takes no value. |
|
|
7154
|
+
| <a id="CE_COMPILE_EVENT_TIMELINE_EASING"></a>`CE_COMPILE_EVENT_TIMELINE_EASING` | “<value>: an event timeline cannot carry an easing”<br>Also: “animation "<value>" <value> "<value>" <value>” | Remove easing from the event timeline. |
|
|
7155
|
+
| <a id="CE_COMPILE_TIMELINE_VALUE_CHANNEL_COUNT"></a>`CE_COMPILE_TIMELINE_VALUE_CHANNEL_COUNT` | “<value>: key value must be an array of <value> number(s)”<br>Also: “animation "<value>" <value> "<value>" <value>” | Supply the named number of numeric channels in every key value array. |
|
|
7156
|
+
| <a id="CE_COMPILE_TIMELINE_VALUE_NONFINITE"></a>`CE_COMPILE_TIMELINE_VALUE_NONFINITE` | “<value>: non-finite value <value>”<br>Also: “animation "<value>" <value> "<value>" <value>” | Supply finite key value numbers. |
|
|
7157
|
+
| <a id="CE_COMPILE_PHYSICS_KEY_RANGE_INVALID"></a>`CE_COMPILE_PHYSICS_KEY_RANGE_INVALID` | “<value> <value> is <value>”<br>“<value>. 0 is a key the runtime has a branch for: `update` returns immediately (`PhysicsConstraint.js:109-111`), which mutes the constraint for the span”<br>“<value>. It is the restoring force, `velocity += (a - offset * strength) * m` (`PhysicsConstraint.js:150,156,212,220`), and a multiplicand everywhere it is read. 0 is a key the runtime plays: it releases the constraint for the span, damping and inertia still apply, and the next key pulls the offset back”<br>“<value>; <value>”<br>“<value><value>; must be <value> — <value>”<br>“> 0”<br>“>= 0”<br>“[ / (<value> <value>)]”<br>“[<value> (`<value>`) / the runtime runs this value finitely, so refusing it is rigc's call rather than the runtime's: <value>]”<br>“above 1 every velocity grows on every step and the offset diverges”<br>“at 0 `massInverse = 1 / mass` is Infinity and `m = t * massInverse` multiplies every velocity update, so the first step takes every velocity and offset to NaN”<br>“at 0 `update` returns before it does anything (`PhysicsConstraint.js:109-111`), so the constraint is muted”<br>“at 1 the per-step decay is 1 at every rate, so no velocity ever decays: the step's two eigenvalues lie ON the unit circle (modulus √1 = 1) rather than inside it, so nothing a push puts in (wind, gravity, a key, the bone moving) ever dies out, and two such constraints on one chain stepping alike resonate and grow without limit”<br>“at any fps where `60 / fps` is not whole it is a negative number raised to a fractional power, which is NaN”<br>“below 0 `massInverse` is a finite negative, which flips the sign of every force the velocity update applies, so the restoring force pushes the offset away and it grows with every step”<br>“below 0 the jiggle is applied inverted, on `x` and `y` exactly the offset a positive mix of the same size applies, mirrored (`PhysicsConstraint.js:172,174`), and `PhysicsConstraintPose` documents mix as "a percentage (0+)" where a transform constraint documents its own as "unbounded"”<br>“inside [0, 1)”<br>“the per-step decay is `damping ** (60 * step)`, with `step` = 1 / the constraint's `fps`, and every velocity is multiplied by it (`PhysicsConstraint.js:114,148,158,163,210,222,227`), so <value>, at every rate — finite on every step until the velocity overflows, so refusing it is rigc's call rather than the runtime's. Below 0 the result depends on `fps`: where `60 / fps` is a whole number a negative base stays finite — at 60 fps it is the velocity's sign flipped each step, which can look like a jiggle settling — and <value> (`(-0.5) ** (60 / 45)`), so a rig tried only at 60 fps never shows the failure. And <value> — finite on every step as well, so that refusal is rigc's call too. 0 is inside: at 0 every velocity is zeroed on every step, so the offset follows the bone with no overshoot”<br>Also: “{<value> at t=<value> / key at t=<value>}”<br>“below 0 the restoring term is ADDED to the offset instead of taken out of it, so the offset is pushed away and grows with every step”<br>“nothing pulls it back”<br>“animation "<value>" <value> "<value>" <value>”<br>“SkeletonJson.js:309, Animation.js:2140, PhysicsConstraint.js:149,156,211” | Use physics values within the full message's documented bounds; positive mass and global property rules are not defaults. |
|
|
7158
|
+
| <a id="CE_COMPILE_KEY_EASING_AND_CURVE"></a>`CE_COMPILE_KEY_EASING_AND_CURVE` | “<value>: a key carries both a named easing and a raw curve; pick one”<br>Also: “animation "<value>" slot "<value>" <value>”<br>“animation "<value>" <value> constraint "<value>"” | Choose a named easing or a raw curve on the key. |
|
|
7159
|
+
| <a id="CE_COMPILE_LAST_KEY_CURVE"></a>`CE_COMPILE_LAST_KEY_CURVE` | “<value>: last key carries a curve but has nothing to ease to”<br>Also: “animation "<value>" slot "<value>" <value>”<br>“animation "<value>" <value> constraint "<value>"” | Remove the last key's curve or supply a following key. |
|
|
7160
|
+
| <a id="CE_COMPILE_KEY_EASING_UNKNOWN"></a>`CE_COMPILE_KEY_EASING_UNKNOWN` | “<value>: unknown easing "<value>"”<br>Also: “animation "<value>" slot "<value>" <value>”<br>“animation "<value>" <value> constraint "<value>"” | Use a named easing supported by the motion format. |
|
|
7161
|
+
| <a id="CE_COMPILE_NEXT_KEY_VALUE_NOT_ARRAY"></a>`CE_COMPILE_NEXT_KEY_VALUE_NOT_ARRAY` | “<value>: next key value must be an array”<br>Also: “animation "<value>" <value> "<value>" <value>” | Supply the next key's value as a numeric array. |
|
|
7162
|
+
| <a id="CE_COMPILE_LAST_KEY_EASING"></a>`CE_COMPILE_LAST_KEY_EASING` | “<value>: last key carries an easing but has nothing to ease to”<br>Also: “animation "<value>" slot "<value>" <value>”<br>“animation "<value>" <value> constraint "<value>"” | Remove the last key's easing or supply a following key. |
|
|
7163
|
+
| <a id="CE_COMPILE_DRAW_ORDER_SLOT_UNKNOWN"></a>`CE_COMPILE_DRAW_ORDER_SLOT_UNKNOWN` | “<value> at t=<value>: slot "<value>" is not one this rig emits”<br>Also: “animation "<value>" drawOrder” | Name a slot this rig emits. |
|
|
7164
|
+
| <a id="CE_COMPILE_DRAW_ORDER_SLOT_DUPLICATE"></a>`CE_COMPILE_DRAW_ORDER_SLOT_DUPLICATE` | “<value> at t=<value>: slot "<value>" is offset twice in one key”<br>Also: “animation "<value>" drawOrder” | Offset each slot at most once per draw-order key. |
|
|
7165
|
+
| <a id="CE_COMPILE_DRAW_ORDER_OFFSET_NONINTEGER"></a>`CE_COMPILE_DRAW_ORDER_OFFSET_NONINTEGER` | “<value> at t=<value>: slot "<value>" offset <value> is not a whole number”<br>Also: “animation "<value>" drawOrder” | State each draw-order offset as a whole number. |
|
|
7166
|
+
| <a id="CE_COMPILE_DRAW_ORDER_OFFSET_OUTSIDE_SLOTS"></a>`CE_COMPILE_DRAW_ORDER_OFFSET_OUTSIDE_SLOTS` | “<value> at t=<value>: slot "<value>" is at index <value> and offset <value> puts it at <value>, outside the <value> emitted slots”<br>Also: “animation "<value>" drawOrder” | Keep the offset destination within the emitted slot array. |
|
|
7167
|
+
| <a id="CE_COMPILE_EVENT_KEY_NAME_MISSING"></a>`CE_COMPILE_EVENT_KEY_NAME_MISSING` | “<value>: key <value> has no "name"; an event key fires an event by name”<br>Also: “animation "<value>" events” | Name the event fired by this key. |
|
|
7168
|
+
| <a id="CE_COMPILE_EVENT_KEY_EVENT_UNKNOWN"></a>`CE_COMPILE_EVENT_KEY_EVENT_UNKNOWN` | “<value> at t=<value>: event "<value>" is not declared in the rig spec's "events" block; [declared: <value> / that block is empty or absent]”<br>Also: “animation "<value>" events”<br>“, ” | Declare the event in the rig events block or correct its name. |
|
|
7169
|
+
| <a id="CE_COMPILE_EVENT_KEY_TIMES_BACKWARDS"></a>`CE_COMPILE_EVENT_KEY_TIMES_BACKWARDS` | “<value>: key times must not go backwards (at t=<value>, after t=<value>) — the parser writes frames in array order and never sorts them”<br>Also: “animation "<value>" events” | Order event keys without moving backwards in time. |
|
|
7170
|
+
| <a id="CE_COMPILE_EVENT_KEY_INT_INVALID"></a>`CE_COMPILE_EVENT_KEY_INT_INVALID` | “<value> at t=<value>: int <value> is not an integer”<br>Also: “animation "<value>" events” | State event int overrides as integers. |
|
|
7171
|
+
| <a id="CE_COMPILE_EVENT_KEY_FLOAT_NONFINITE"></a>`CE_COMPILE_EVENT_KEY_FLOAT_NONFINITE` | “<value> at t=<value>: float <value> is not finite”<br>Also: “animation "<value>" events” | State event float overrides as finite numbers. |
|
|
7172
|
+
| <a id="CE_COMPILE_EVENT_KEY_STRING_INVALID"></a>`CE_COMPILE_EVENT_KEY_STRING_INVALID` | “<value> at t=<value>: string <value> is not a string”<br>Also: “animation "<value>" events” | State event string overrides as strings. |
|
|
7173
|
+
| <a id="CE_COMPILE_EVENT_AUDIO_OVERRIDE_NO_AUDIO"></a>`CE_COMPILE_EVENT_AUDIO_OVERRIDE_NO_AUDIO` | “<value> at t=<value>: <value> is set but event "<value>" declares no "audio"; the parser reads <value> only for an event with an audio path, so it would be dropped in silence”<br>Also: “animation "<value>" events” | Declare the event audio path or remove audio-only overrides. |
|
|
7174
|
+
| <a id="CE_COMPILE_EVENT_AUDIO_NUMBER_NONFINITE"></a>`CE_COMPILE_EVENT_AUDIO_NUMBER_NONFINITE` | “<value> at t=<value>: <value> <value> is not finite”<br>Also: “animation "<value>" events” | State finite event audio override numbers. |
|
|
7175
|
+
| <a id="CE_COMPILE_CONSTRAINT_KEY_FIELD_ADDED"></a>`CE_COMPILE_CONSTRAINT_KEY_FIELD_ADDED` | “<value>: key <value> (t=<value>) names "<value>" and key 0 does not. Every key of <value> <value> timeline is read with its own default, so a field stated on some keys and not others snaps to the default on the rest — state it on every key or on none.”<br>Also: “animation "<value>" <value> constraint "<value>"” | State this constraint field on every key or on none. |
|
|
7176
|
+
| <a id="CE_COMPILE_CONSTRAINT_KEY_FIELD_OMITTED"></a>`CE_COMPILE_CONSTRAINT_KEY_FIELD_OMITTED` | “<value>: key 0 names "<value>" and key <value> (t=<value>) does not. Every key of <value> <value> timeline is read with its own default, so "<value>" would snap to <value> at t=<value> — state it on every key or on none.”<br>Also: “animation "<value>" <value> constraint "<value>"” | State this constraint field on every key or on none. |
|
|
7177
|
+
| <a id="CE_COMPILE_CONSTRAINT_KEY_NUMBER_NONFINITE"></a>`CE_COMPILE_CONSTRAINT_KEY_NUMBER_NONFINITE` | “<value> (t=<value>): <value> is <value>, not a finite number”<br>Also: “animation "<value>" <value> constraint "<value>"” | Supply finite constraint channel values. |
|
|
7178
|
+
| <a id="CE_COMPILE_CONSTRAINT_KEY_RANGE_INVALID"></a>`CE_COMPILE_CONSTRAINT_KEY_RANGE_INVALID` | “<value> (t=<value>): <value> is <value>, outside <value>..[∞ / <value>] — the runtime documents it as [a percentage 0-1 / a distance]”<br>Also: “animation "<value>" <value> constraint "<value>"” | Keep constraint channels in their documented percentage/distance bounds. |
|
|
7179
|
+
| <a id="CE_COMPILE_CONSTRAINT_KEY_FLAG_NOT_BOOLEAN"></a>`CE_COMPILE_CONSTRAINT_KEY_FLAG_NOT_BOOLEAN` | “<value> (t=<value>): <value> is <value>, not true or false”<br>Also: “animation "<value>" <value> constraint "<value>"” | State constraint flags as true or false. |
|
|
7180
|
+
| <a id="CE_COMPILE_DEFORM_ATTACHMENT_TYPE_INVALID"></a>`CE_COMPILE_DEFORM_ATTACHMENT_TYPE_INVALID` | “<value>: a deform timeline keys the vertices of an attachment, and this one is a "<value>" — it has no vertex array to deform. Deformable types: mesh, boundingbox, clipping, path.” | Target a mesh, boundingbox, clipping or path attachment with vertices. |
|
|
7181
|
+
| <a id="CE_COMPILE_DEFORM_WEIGHT_BONE_COUNT_INVALID"></a>`CE_COMPILE_DEFORM_WEIGHT_BONE_COUNT_INVALID` | “<value>: the attachment's weighted vertex run has a bone count of <value> at index <value>” | Correct the attachment's raw weighted run bone counts. |
|
|
7182
|
+
| <a id="CE_COMPILE_SEQUENCE_ATTACHMENT_NO_SERIES"></a>`CE_COMPILE_SEQUENCE_ATTACHMENT_NO_SERIES` | “<value>: attachment "<value>" carries no "sequence" block, so there is no series to step. The parser gives every region and mesh a series of ONE region (`readSequence(null)` is `new Sequence(1, false)`), so this timeline would load and show that region under every mode at every time. Give the attachment a "sequence" in the rig spec, or remove the track.” | Give the attachment a sequence block or remove the sequence track. |
|
|
7183
|
+
| <a id="CE_COMPILE_SEQUENCE_LINK_TIMELINE_INERT"></a>`CE_COMPILE_SEQUENCE_LINK_TIMELINE_INERT` | “<value>: attachment "<value>" is a linked mesh that plays its source's timelines ("timelines" is not false), so its `timelineAttachment` is "<value>" (`SkeletonJson.js:437-448`) and `SequenceTimeline` applies only where the slot's attachment's `timelineAttachment` is the one it was built for — a key aimed at the link is applied to nothing. Key "<value>" instead (the link steps its own series by it), or set "timelines": false on the link.” | Key the linked mesh's source or set timelines false on the link. |
|
|
7184
|
+
| <a id="CE_COMPILE_SEQUENCE_KEY_INDEX_OUTSIDE_SERIES"></a>`CE_COMPILE_SEQUENCE_KEY_INDEX_OUTSIDE_SERIES` | “<value> (t=<value>): index <value> is past the end of a <value>-frame series (frames 0 to <value>). `Sequence.resolveIndex` clamps it to the last frame, so the key would start on a frame it does not name. `index` is 0-based.” | Use a zero-based index within the frame series. |
|
|
7185
|
+
| <a id="CE_COMPILE_DEFORM_TRANSFORM_AND_VERTICES"></a>`CE_COMPILE_DEFORM_TRANSFORM_AND_VERTICES` | “<value> (t=<value>): the key carries both a "transform" and a "vertices" run, and they are two answers to one question. Authored offsets and a stated model do not combine, for the same reason a mesh cannot carry both a "generator" and authored geometry — drop one.”<br>Also: “animation "<value>" deform <value>/<value>/<value>”<br>Here the values named in the message include: “default”. | Use a transform model or authored vertex offsets. |
|
|
7186
|
+
| <a id="CE_COMPILE_DEFORM_TRANSFORM_START_INDEX"></a>`CE_COMPILE_DEFORM_TRANSFORM_START_INDEX` | “<value> (t=<value>): the key states a "transform" and a start index. A transform is a model of the whole attachment and is evaluated over all <value> of its vertices, so it always starts at deform index 0. A model applied to part of a run leaves a step at the run's edge — write the partial run by hand if that is what you mean.”<br>Also: “animation "<value>" deform <value>/<value>/<value>”<br>Here the values named in the message include: “default”. | Apply a transform over the whole attachment without a start index, or author the partial run. |
|
|
7187
|
+
| <a id="CE_COMPILE_DEFORM_TRANSFORM_SETUP_UNRESOLVED"></a>`CE_COMPILE_DEFORM_TRANSFORM_SETUP_UNRESOLVED` | “<value> (t=<value>): a "transform" states where every vertex of this attachment goes, and this one has a vertex the arithmetic cannot place — <value>. Fix the weights, or write the bind-space pairs yourself and start the run with "offset".”<br>“vertex <value>'s <value> weights sum to <value> rather than 1. A stated model becomes a deform run by writing each vertex's world displacement D into every influence as Mᵢ⁻¹·D, which moves the vertex by D·Σwᵢ — so a sum that is not 1 has no displacement that lands it where the model says. A20_MESH_WEIGHTS_COHERENT is the assertion that requires that sum, at the same 1e-3”<br>Also: “animation "<value>" deform <value>/<value>/<value>”<br>Here the values named in the message include: “default”. | Fix weights so setup vertices can be positioned, or author bind-space pairs using offset. |
|
|
7188
|
+
| <a id="CE_COMPILE_DEFORM_TRANSFORM_OFFSET_COUNT"></a>`CE_COMPILE_DEFORM_TRANSFORM_OFFSET_COUNT` | “<value> (t=<value>): the transform produced <value> numbers for <value> vertices”<br>Also: “animation "<value>" deform <value>/<value>/<value>”<br>Here the values named in the message include: “default”. | Report the transform model and compiler defect: the produced offset count does not match the vertices. |
|
|
7189
|
+
| <a id="CE_COMPILE_DEFORM_TRANSFORM_RUN_LENGTH"></a>`CE_COMPILE_DEFORM_TRANSFORM_RUN_LENGTH` | “<value> (t=<value>): the transform expanded to <value> numbers and this attachment's deform array is <value> long”<br>Also: “animation "<value>" deform <value>/<value>/<value>”<br>Here the values named in the message include: “default”. | Report the transform model and compiler defect: the expanded offsets do not match the deform array. |
|
|
7190
|
+
| <a id="CE_COMPILE_DEFORM_START_SOURCES_CONFLICT"></a>`CE_COMPILE_DEFORM_START_SOURCES_CONFLICT` | “<value> (t=<value>): a key gives its start as "offset" (an index into the deform array) or as "fromVertex" (a vertex index rigc translates), never both”<br>Also: “animation "<value>" deform <value>/<value>/<value>”<br>Here the values named in the message include: “default”. | Use offset or fromVertex, rather than both. |
|
|
7191
|
+
| <a id="CE_COMPILE_DEFORM_SETUP_KEY_START_INDEX"></a>`CE_COMPILE_DEFORM_SETUP_KEY_START_INDEX` | “<value> (t=<value>): the key has no "vertices", which is the format's way of saying "back to the setup pose" — so there is nothing for a start index to point at. Drop the offset, or give it a run.”<br>Also: “animation "<value>" deform <value>/<value>/<value>”<br>Here the values named in the message include: “default”. | Drop the start index on a setup-pose key or supply a vertices run. |
|
|
7192
|
+
| <a id="CE_COMPILE_DEFORM_VERTICES_NOT_ARRAY"></a>`CE_COMPILE_DEFORM_VERTICES_NOT_ARRAY` | “<value> (t=<value>): "vertices" is <value>; give an array of x, y offsets, or omit it entirely for "back to the setup pose"”<br>Also: “animation "<value>" deform <value>/<value>/<value>”<br>Here the values named in the message include: “default”. | Supply x/y offset pairs or omit vertices to restore setup pose. |
|
|
7193
|
+
| <a id="CE_COMPILE_DEFORM_VERTEX_VALUE_NONFINITE"></a>`CE_COMPILE_DEFORM_VERTEX_VALUE_NONFINITE` | “<value> (t=<value>): "vertices" holds a non-finite value <value>”<br>Also: “animation "<value>" deform <value>/<value>/<value>”<br>Here the values named in the message include: “default”. | Supply finite numbers in the deform vertices array. |
|
|
7194
|
+
|
|
7195
|
+
|
|
7196
|
+
#### 5.1.10 Motion keys, curves and target groups (2)
|
|
7197
|
+
|
|
7198
|
+
| Code | Fixed message text and alternatives | What to change |
|
|
7199
|
+
| --- | --- | --- |
|
|
7200
|
+
| <a id="CE_COMPILE_DEFORM_RUN_OUTSIDE_ATTACHMENT"></a>`CE_COMPILE_DEFORM_RUN_OUTSIDE_ATTACHMENT` | “<value> (t=<value>): the run starts at deform index <value> and is <value> long, which ends at <value><value>; this attachment's deform array is <value> long ([<value> bone influences / <value> vertices]). The parser copies into a Float32Array, so everything past the end is dropped without a word.”<br>Also: “animation "<value>" deform <value>/<value>/<value>”<br>Here the values named in the message include: “default”. | Keep the start and run length inside the attachment's deform array. |
|
|
7201
|
+
| <a id="CE_COMPILE_DEFORM_OFFSET_INVALID"></a>`CE_COMPILE_DEFORM_OFFSET_INVALID` | “<value> (t=<value>): offset is <value>; it is an index into the deform array, so a whole number ≥ 0” | State offset as a whole deform-array index at least zero. |
|
|
7202
|
+
| <a id="CE_COMPILE_DEFORM_FROM_VERTEX_INVALID"></a>`CE_COMPILE_DEFORM_FROM_VERTEX_INVALID` | “<value> (t=<value>): fromVertex is <value>; it is a vertex index, so a whole number ≥ 0” | State fromVertex as a whole vertex index at least zero. |
|
|
7203
|
+
| <a id="CE_COMPILE_DEFORM_FROM_VERTEX_OUTSIDE_ATTACHMENT"></a>`CE_COMPILE_DEFORM_FROM_VERTEX_OUTSIDE_ATTACHMENT` | “<value> (t=<value>): fromVertex <value> plus <value> vertex offset(s) runs to vertex <value><value>, and the attachment has <value>” | Keep fromVertex plus the covered vertex count within the attachment. |
|
|
7204
|
+
| <a id="CE_COMPILE_DEFORM_WEIGHTED_FROM_VERTEX_AMBIGUOUS"></a>`CE_COMPILE_DEFORM_WEIGHTED_FROM_VERTEX_AMBIGUOUS` | “<value> (t=<value>): "fromVertex" counts VERTICES, and this attachment is weighted — its deform array holds one x, y pair per bone INFLUENCE, and vertex <value> has <value> of them. One offset per vertex is not a thing that array can hold: the world offset of a multi-bone vertex is the weighted sum of a per-bone offset in each bone's own bind space, so rigc will not guess one for you. Either key the control bone instead, or write the bind-space pairs yourself and start the run with "offset" (vertex <value> starts at deform index <value>).” | Key the control bone or author each bone influence's bind-space pair using offset. |
|
|
7205
|
+
| <a id="CE_COMPILE_TRACK_TARGETS_MULTIPLE"></a>`CE_COMPILE_TRACK_TARGETS_MULTIPLE` | “animation "<value>": a track names more than one target (<value>); the list is <value> and a track names exactly one”<br>Also: “, ”<br>Here the values named in the message include: “/”, “bone”, “slot”, “group”. | Name exactly one target field on a track. |
|
|
7206
|
+
| <a id="CE_COMPILE_CONSTRAINT_TRACK_PROPERTY_UNKNOWN"></a>`CE_COMPILE_CONSTRAINT_TRACK_PROPERTY_UNKNOWN` | “animation "<value>": <value> has no timeline "<value>" (it has: <value>)”<br>Also: “, ”<br>“path constraint”<br>“physics constraint”<br>“{group "<value>" / <value> "<value>"}”<br>Here the values named in the message include: “slider”. | Use a timeline property supported by this constraint family. |
|
|
7207
|
+
| <a id="CE_COMPILE_ANIMATION_GROUP_UNKNOWN"></a>`CE_COMPILE_ANIMATION_GROUP_UNKNOWN` | “animation "<value>": unknown group "<value>"” | Declare the motion group or correct its name. |
|
|
7208
|
+
| <a id="CE_COMPILE_CONSTRAINT_TRACK_TARGET_MISSING"></a>`CE_COMPILE_CONSTRAINT_TRACK_TARGET_MISSING` | “animation "<value>": "<value>" is a <value> timeline, and this track names no constraint — put the name in "<value>"”<br>Also: “ / ”<br>“" or "” | Name the constraint in the timeline's owning family field. |
|
|
7209
|
+
| <a id="CE_COMPILE_BONE_TRACK_TARGET_MISSING"></a>`CE_COMPILE_BONE_TRACK_TARGET_MISSING` | “animation "<value>": "<value>" is a bone track but no bone is named” | Name the track's bone target. |
|
|
7210
|
+
| <a id="CE_COMPILE_BONE_TRACK_PROPERTY_UNKNOWN"></a>`CE_COMPILE_BONE_TRACK_PROPERTY_UNKNOWN` | “animation "<value>" bone "<value>" has no timeline "<value>" (it has: <value>)[. "<value>" is a slot timeline — put the name in "slot" / ]”<br>Also: “, ” | Use a bone timeline property, or target a slot for slot properties. |
|
|
7211
|
+
| <a id="CE_COMPILE_GROUP_TRACK_PROPERTY_UNKNOWN"></a>`CE_COMPILE_GROUP_TRACK_PROPERTY_UNKNOWN` | “animation "<value>" group "<value>" has no timeline "<value>" (a bone group has: <value>; a slot group has: <value>; a <value> group has: <value>)”<br>Also: “, ” | Use a timeline property supported by this group's target family. |
|
|
7212
|
+
| <a id="CE_COMPILE_TRACK_TARGET_MISSING"></a>`CE_COMPILE_TRACK_TARGET_MISSING` | “animation "<value>": a track targets neither slot nor group” | Name a slot, bone, group or constraint target. |
|
|
7213
|
+
| <a id="CE_COMPILE_GROUP_MEMBERS_NOT_ARRAY"></a>`CE_COMPILE_GROUP_MEMBERS_NOT_ARRAY` | “group "<value>" is <value>; it is an array of member names” | State group members as an array of names. |
|
|
7214
|
+
| <a id="CE_COMPILE_GROUP_MEMBERS_EMPTY"></a>`CE_COMPILE_GROUP_MEMBERS_EMPTY` | “group "<value>" declares no members, so every track naming it would compile no timeline and gate green” | Name at least one member so the group emits timelines. |
|
|
7215
|
+
| <a id="CE_COMPILE_GROUP_MEMBER_NOT_NAME"></a>`CE_COMPILE_GROUP_MEMBER_NOT_NAME` | “group "<value>" member <value> is <value>; it is a bone or slot name” | State each group member as a bone or slot name. |
|
|
7216
|
+
| <a id="CE_COMPILE_GROUP_MEMBER_DUPLICATE"></a>`CE_COMPILE_GROUP_MEMBER_DUPLICATE` | “group "<value>" names member "<value>" twice (at index <value> and <value>). Member order is what `stagger` counts and what a per-member value map is read against, so a repeat is two different delays and two different values for one bone.” | List every group member once so stagger and value maps have one result per target. |
|
|
7217
|
+
| <a id="CE_COMPILE_MEMBER_VALUES_TARGET_UNNAMED"></a>`CE_COMPILE_MEMBER_VALUES_TARGET_UNNAMED` | “<value>: per-member values need a target whose members are named — put them on a track that names a "group", or a "bone" for the one-member case”<br>Also: “animation "<value>" <value> "<value>" <value>” | Use a named group target for per-member values, or a bone for a direct one-member value. |
|
|
7218
|
+
| <a id="CE_COMPILE_BONE_MEMBER_VALUE_MAP"></a>`CE_COMPILE_BONE_MEMBER_VALUE_MAP` | “<value>: a per-member "v" map names members, and a bone track has one target rather than members. Write the value directly, or move the track onto a group.”<br>Also: “animation "<value>" <value> "<value>" <value>” | Write the bone's value directly or move the member map to a group track. |
|
|
7219
|
+
| <a id="CE_COMPILE_MEMBER_DERIVE_AND_VALUE_MAP"></a>`CE_COMPILE_MEMBER_DERIVE_AND_VALUE_MAP` | “<value>: this key carries both a "derive" model and a per-member "v" map — two answers to one question. The model states the arithmetic and the depths that produced the numbers; the map states the numbers. Pick one.”<br>Also: “{bone / group}”<br>“<value> (t=<value>)”<br>“animation "<value>" <value> "<value>" <value>” | Choose derive arithmetic or a per-member v map. |
|
|
7220
|
+
| <a id="CE_COMPILE_MEMBER_VALUE_NAME_UNKNOWN"></a>`CE_COMPILE_MEMBER_VALUE_NAME_UNKNOWN` | “<value>: the value map names "<value>", which group "<value>" does not declare (its members are: <value>)”<br>Also: “{bone / group}”<br>“<value> (t=<value>)”<br>“animation "<value>" <value> "<value>" <value>” | Use only members declared by the target group in the value map. |
|
|
7221
|
+
| <a id="CE_COMPILE_MEMBER_VALUE_MISSING"></a>`CE_COMPILE_MEMBER_VALUE_MISSING` | “<value>: the value map states no value for member "<value>" (it states: <value>). A member is refused rather than defaulted: an absent value is exactly the thing a map of six is written to make visible, and defaulting it to the identity would key that one bone with a different motion in silence.”<br>Also: “{bone / group}”<br>“<value> (t=<value>)”<br>“animation "<value>" <value> "<value>" <value>”<br>Here the values named in the message include: “nothing”. | Supply a value for every target group member. |
|
|
7222
|
+
| <a id="CE_COMPILE_MEMBER_DERIVE_TARGET_NOT_BONE"></a>`CE_COMPILE_MEMBER_DERIVE_TARGET_NOT_BONE` | “<value>: derive reads member "<value>"'s setup position, and this rig declares no such bone. A model over a group of slots or constraints has no coordinate to be evaluated at — state the values as a "v" map.”<br>Also: “<value> (t=<value>)”<br>“animation "<value>" <value> "<value>" <value>” | Use a v map for slot/constraint groups because they have no bone setup coordinate. |
|
|
7223
|
+
| <a id="CE_COMPILE_MEMBER_DERIVE_PARENTS_DIFFER"></a>`CE_COMPILE_MEMBER_DERIVE_PARENTS_DIFFER` | “<value>: derive measures every member's "<value>" from its parent's origin and "about" says where the axis crosses it, so one space is what makes the members comparable. These members sit under <value> different parents (<value>), and their coordinates are therefore measured from different origins. Split the track by parent, or state the values as a "v" map.”<br>Also: “{bone / group}”<br>“<value> (t=<value>)”<br>“animation "<value>" <value> "<value>" <value>” | Split the derive track by bone parent or state values in a v map. |
|
|
7224
|
+
| <a id="CE_COMPILE_SLOT_TRACK_PROPERTY_UNKNOWN"></a>`CE_COMPILE_SLOT_TRACK_PROPERTY_UNKNOWN` | “animation "<value>" slot "<value>" has no timeline "<value>" (it has: <value>)”<br>Also: “, ” | Use a timeline property supported by slots. |
|
|
7225
|
+
| <a id="CE_COMPILE_DARK_TIMELINE_SETUP_DARK_MISSING"></a>`CE_COMPILE_DARK_TIMELINE_SETUP_DARK_MISSING` | “<value>: slot "<value>" declares no setup "dark", and an "<value>" timeline poses a slot's dark colour — the runtime allocates one only for a slot whose setup pose has it, so applying this animation throws instead of tinting. Give slot "<value>" a `dark` in the rig spec (the colour it holds at rest), or key "[rgba / rgb]" if only the light colour moves”<br>Also: “animation "<value>" slot "<value>" <value>” | State the slot's dark setup colour or use a light-colour timeline. |
|
|
7226
|
+
| <a id="CE_COMPILE_ATTACHMENT_KEY_VALUE_INVALID"></a>`CE_COMPILE_ATTACHMENT_KEY_VALUE_INVALID` | “<value>: attachment key value must be a string or null”<br>Also: “animation "<value>" slot "<value>" <value>” | Use an attachment placeholder string or null. |
|
|
7227
|
+
| <a id="CE_COMPILE_ATTACHMENT_KEY_UNKNOWN"></a>`CE_COMPILE_ATTACHMENT_KEY_UNKNOWN` | “<value>: attachment "<value>" is not in slot "<value>" under any skin (searched: <value>) — [the slot has no attachments at all / the slot has: <value>]”<br>Also: “animation "<value>" slot "<value>" <value>”<br>“, ” | Use an attachment present in the slot under at least one emitted skin. |
|
|
7228
|
+
| <a id="CE_COMPILE_ATTACHMENT_KEY_EASING"></a>`CE_COMPILE_ATTACHMENT_KEY_EASING` | “<value>: attachment keys cannot carry an easing”<br>Also: “animation "<value>" slot "<value>" <value>” | Remove easing from attachment keys. |
|
|
7229
|
+
| <a id="CE_COMPILE_SLOT_KEY_VALUE_SHAPE"></a>`CE_COMPILE_SLOT_KEY_VALUE_SHAPE` | “<value>: <value> key value must be <value>”<br>“[a]”<br>“[lr,lg,lb,dr,dg,db]”<br>“[lr,lg,lb,la,dr,dg,db]”<br>“[r,g,b,a]”<br>“[r,g,b]”<br>Also: “animation "<value>" slot "<value>" <value>” | Supply the colour key array with the shape and channels named in the message. |
|
|
7230
|
+
| <a id="CE_COMPILE_ALPHA_KEY_RANGE_INVALID"></a>`CE_COMPILE_ALPHA_KEY_RANGE_INVALID` | “<value>: key at t=<value> is <value>; an alpha is a number from 0 to 1 — the runtime clamps the posed alpha to that range after interpolating, so a value outside it is one no pose ever holds”<br>Also: “animation "<value>" slot "<value>" <value>” | Keep authored alpha within zero to one. |
|
|
7231
|
+
|
|
7232
|
+
|
|
7233
|
+
#### 5.1.11 Rig shape and setup
|
|
7234
|
+
|
|
7235
|
+
| Code | Fixed message text and alternatives | What to change |
|
|
7236
|
+
| --- | --- | --- |
|
|
7237
|
+
| <a id="CE_RIG_SKIN_OBJECT"></a>`CE_RIG_SKIN_OBJECT` | “<where>: a skin must be an object” | Write the skin as an object in the rig spec. |
|
|
7238
|
+
| <a id="CE_RIG_SKIN_ATTACHMENTS_SHAPE"></a>`CE_RIG_SKIN_ATTACHMENTS_SHAPE` | “<where>: "attachments" is `slotName -> placeholderName -> attachment`, not <JSON.stringify(entry.attachments)>” | Put attachments in a slotName -> placeholderName -> attachment object. |
|
|
7239
|
+
| <a id="CE_RIG_SKIN_LONG_FORM_STRAY_SLOT"></a>`CE_RIG_SKIN_LONG_FORM_STRAY_SLOT` | “<where>: uses the long form (it declares <keys.filter((k) => known.has(k)).map((k) => `"${k}"`).join(', ')>) and also has a key "<key>". In that form every key is one of <RIG_SKIN_KEYS.join(', ')> — so "<key>" reads as neither a member list nor a slot, and a slot left outside the block is an attachment that vanishes. Move it inside "attachments".”<br>Here the values named in the message include: “ik”, “path”, “bones”, “slider”, “physics”, “transform”. | Move the slot's attachment table inside the long form's attachments block. |
|
|
7240
|
+
| <a id="CE_RIG_SKIN_MEMBERS_ARRAY"></a>`CE_RIG_SKIN_MEMBERS_ARRAY` | “<where>: "<field>" must be an array of names, not <JSON.stringify(value)>”<br>Here the values named in the message include: “bones”. | Write the named bone or constraint list as an array of names. |
|
|
7241
|
+
| <a id="CE_RIG_SKIN_MEMBER_NAME"></a>`CE_RIG_SKIN_MEMBER_NAME` | “<where>: <field>[<i>] is <JSON.stringify(name)>; a skin lists bones and constraints BY NAME” | Replace the list element with a bone or constraint name string. |
|
|
7242
|
+
| <a id="CE_RIG_SEQUENCE_OBJECT"></a>`CE_RIG_SEQUENCE_OBJECT` | “<where>: <at> is <JSON.stringify(seq) ?? String(seq)>, and a sequence is an object: `{ "count": <frames>, "start"?: <first number>, "digits"?: <zero padding>, "setup"?: <setup frame> }`”<br>Also: “{bone "<value>" / bones[<value>]}”<br>“skin "<value>" slot "<value>" attachment "<value>"”<br>“{stop "<value>" / stops[<value>]}”<br>“<value> "sequence"” | Write sequence as an object stating count and any start, digits and setup values. |
|
|
7243
|
+
| <a id="CE_RIG_SEQUENCE_INTEGER_FIELD"></a>`CE_RIG_SEQUENCE_INTEGER_FIELD` | “<where>: <at>.<field> is <JSON.stringify(value) ?? String(value)>; it is a whole number{ of at least <min> / { of at least 0 / }} — `Sequence.getPath` writes `start + i` into the region name digit for digit, so a fraction names a region like `stem1.5` and a non-number names none”<br>Also: “{bone "<value>" / bones[<value>]}”<br>“skin "<value>" slot "<value>" attachment "<value>"”<br>“{stop "<value>" / stops[<value>]}”<br>“<value> "sequence"”<br>Here the values named in the message include: “setup”, “count”, “digits”. | State whole numbers for sequence fields and respect the printed minimum. |
|
|
7244
|
+
| <a id="CE_RIG_SEQUENCE_COUNT_REQUIRED"></a>`CE_RIG_SEQUENCE_COUNT_REQUIRED` | “<where>: <at> states no "count". The parser reads `getValue(map, "count", 0)` (`SkeletonJson.js:644`), so an omitted count is a series of NO frames: the attachment loads holding no region and draws nothing, without an error. State how many frames the series has.”<br>Also: “{bone "<value>" / bones[<value>]}”<br>“skin "<value>" slot "<value>" attachment "<value>"”<br>“{stop "<value>" / stops[<value>]}”<br>“<value> "sequence"” | State the positive number of frames in sequence.count. |
|
|
7245
|
+
| <a id="CE_RIG_SEQUENCE_SETUP_RANGE"></a>`CE_RIG_SEQUENCE_SETUP_RANGE` | “<where>: <at>.setup is <seq.setup>, and a <count>-frame series has frames 0 to <count - 1>. `Sequence.resolveIndex` clamps an index at or past the end to the LAST frame (measured: `setup: 7` on four frames showed frame 4), so this would show a frame the spec does not name. `setup` is 0-based.”<br>Also: “{bone "<value>" / bones[<value>]}”<br>“skin "<value>" slot "<value>" attachment "<value>"”<br>“{stop "<value>" / stops[<value>]}”<br>“<value> "sequence"” | Set the 0-based setup frame inside 0..count-1. |
|
|
7246
|
+
| <a id="CE_RIG_SEQUENCE_CONFLICTING_FIELD"></a>`CE_RIG_SEQUENCE_CONFLICTING_FIELD` | “<where>: <who> states "<field>" beside "sequence"; <why>. Remove "<field>".”<br>“a generator traces one plate, and which frame of the series it should trace is not something the spec says — author the geometry, which every frame shares”<br>“an image names ONE region and a sequence names `count` of them — the frames are the regions `<path><number>`, and on the loose route each is the PNG of that name in the images directory”<br>Also: “{bone "<value>" / bones[<value>]}”<br>“skin "<value>" slot "<value>" attachment "<value>"”<br>“{stop "<value>" / stops[<value>]}” | Remove the printed field beside sequence; sequence supplies that value. |
|
|
7247
|
+
| <a id="CE_RIG_SEQUENCE_ATTACHMENT_KIND"></a>`CE_RIG_SEQUENCE_ATTACHMENT_KIND` | “<where>: <who> is a <type> and states a "sequence". A sequence is a numbered series of atlas regions, and only the <SEQUENCE_ATTACHMENT_TYPES.length> kinds that draw a region carry one — <SEQUENCE_ATTACHMENT_TYPES.join(', ')> (`readAttachment` calls `readSequence` in exactly those branches, `SkeletonJson.js:530` and `:561`); on a <type> the parser never reads the key, so the series would be dropped in silence. Remove it, or put it on a region or a mesh.”<br>Also: “{bone "<value>" / bones[<value>]}”<br>“skin "<value>" slot "<value>" attachment "<value>"”<br>“{stop "<value>" / stops[<value>]}”<br>“{absent / <value>}”<br>Here the values named in the message include: “linkedmesh”. | Remove sequence or put it on a region, mesh or linkedmesh attachment. |
|
|
7248
|
+
| <a id="CE_RIG_GENERATOR_KIND"></a>`CE_RIG_GENERATOR_KIND` | “<where>: <who> generator.kind is <stated>; one of <RIG_GENERATOR_KINDS.map((k) => JSON.stringify(k)).join(', ')> — the kind names the builder, and each builder reads its own keys, so nothing about the mesh can be checked or built without one”<br>Also: “{bone "<value>" / bones[<value>]}”<br>“skin "<value>" slot "<value>" attachment "<value>"”<br>“{stop "<value>" / stops[<value>]}”<br>“{region / <value>}”<br>“{absent / <value>}”<br>Here the values named in the message include: “grid”, “ribbon”, “contour”, “segments”. | State a supported generator.kind and use that builder's fields. |
|
|
7249
|
+
| <a id="CE_RIG_SPEC_OBJECT"></a>`CE_RIG_SPEC_OBJECT` | “<where>: a rig spec must be a JSON object” | Write the rig spec root as a JSON object. |
|
|
7250
|
+
| <a id="CE_RIG_SPEC_VERSION"></a>`CE_RIG_SPEC_VERSION` | “<where>: unknown rig spec version <JSON.stringify(raw.spec)>, expected "<RIG_SPEC_VERSION>"”<br>Here the values named in the message include: “rigc-rig/1”. | Set spec to the version named in the error. |
|
|
7251
|
+
| <a id="CE_RIG_NAME_REQUIRED"></a>`CE_RIG_NAME_REQUIRED` | “<where>: a rig spec needs a "name" — a motion spec names it to pick this rig” | State the rig name used by the motion spec's archetype. |
|
|
7252
|
+
| <a id="CE_RIG_BONES_ARRAY_REQUIRED"></a>`CE_RIG_BONES_ARRAY_REQUIRED` | “<where>: a rig spec needs a non-empty "bones" array” | Declare a non-empty bones array in the rig spec. |
|
|
7253
|
+
| <a id="CE_RIG_SLOTS_ARRAY_REQUIRED"></a>`CE_RIG_SLOTS_ARRAY_REQUIRED` | “<where>: a rig spec needs a "slots" array (it may be empty; its ORDER is the draw order)” | Declare slots as an array; use [] for no slots and keep intended draw order. |
|
|
7254
|
+
| <a id="CE_RIG_SKELETON_AUDIO_TYPE"></a>`CE_RIG_SKELETON_AUDIO_TYPE` | “<where>: "skeleton" states audio <JSON.stringify(header.audio)>; it is a path from the skeleton file to its audio folder, or null for none — a string or null” | Set skeleton.audio to its relative audio folder path or null. |
|
|
7255
|
+
| <a id="CE_RIG_STAGE_EXTENTS_PAIR"></a>`CE_RIG_STAGE_EXTENTS_PAIR` | “<where>: "skeleton" states <absent>: null and a <stated> of <JSON.stringify(noWidth ? header.height : header.width)>. A stage has both extents or neither: write both as null for "this skeleton declares no stage", or give both a number” | Give both stage extents numbers or set both width and height to null. |
|
|
7256
|
+
| <a id="CE_RIG_ABSENT_STAGE_ORIGIN"></a>`CE_RIG_ABSENT_STAGE_ORIGIN` | “<where>: "skeleton" declares no stage (width: null, height: null) and still states <origin.join(' and ')>. <origin.length === 1 ? 'That is an origin' : 'Those are an origin'> for a box that is not there: drop them, or state a width and a height”<br>Also: “{y / <value>}” | Remove stage origins when no stage is declared, or state width and height. |
|
|
7257
|
+
| <a id="CE_RIG_STAGE_BOX_NAMES_REQUIRED"></a>`CE_RIG_STAGE_BOX_NAMES_REQUIRED` | “<where>: skeleton.stageBox states no <missing.map((key) => `"${key}"`).join(' and ')>. It names the slot the stage box goes in and the attachment name it carries — `{ "slot": "stage", "attachment": "stage" }` — and both are required: rigc writes the box's numbers from the stage and names nothing on its own”<br>Also: “<value> constraint "<value>"” | State both skeleton.stageBox.slot and skeleton.stageBox.attachment. |
|
|
7258
|
+
| <a id="CE_RIG_STAGE_BOX_WITHOUT_STAGE"></a>`CE_RIG_STAGE_BOX_WITHOUT_STAGE` | “<where>: skeleton.stageBox asks for the stage as a bounding box in slot "<box.slot>", and "skeleton" declares no stage (width: null, height: null) — a box around nothing. State a width and a height, or drop stageBox” | Declare stage width and height or remove stageBox. |
|
|
7259
|
+
| <a id="CE_RIG_BONE_NAME_REQUIRED"></a>`CE_RIG_BONE_NAME_REQUIRED` | “<where>: every bone needs a "name"” | Give every bone a non-empty name. |
|
|
7260
|
+
| <a id="CE_RIG_BONE_NAME_DUPLICATE"></a>`CE_RIG_BONE_NAME_DUPLICATE` | “<where>: two bones are called "<bone.name>"; bone names are the join key for slots, meshes and timelines” | Rename a duplicate bone and update references to that bone. |
|
|
7261
|
+
| <a id="CE_RIG_BONE_PARENT_ORDER"></a>`CE_RIG_BONE_PARENT_ORDER` | “<where>: bone "<bone.name>" names parent <JSON.stringify(bone.parent)>, which is not declared before it” | Declare the parent before its child and spell the parent name exactly. |
|
|
7262
|
+
| <a id="CE_RIG_BONE_INHERIT_MODE"></a>`CE_RIG_BONE_INHERIT_MODE` | “<where>: bone "<bone.name>" has inherit <JSON.stringify(bone.inherit)>; <BONE_INHERIT_KNOWN>”<br>“known: <RIG_BONE_INHERIT.join(', ')> — the runtime folds the case of the first letter and of nothing else”<br>Here the values named in the message include: “noScaleOrReflection”, “normal”, “onlyTranslation”, “noRotationOrReflection”. | Use a supported inherit mode with the printed case convention. |
|
|
7263
|
+
| <a id="CE_RIG_BONE_POSITION_SOURCES"></a>`CE_RIG_BONE_POSITION_SOURCES` | “<where>: bone "<bone.name>" takes its position from more than one source (<sources.join(', ')>); name exactly one”<br>Here the values named in the message include: “anchor”, “meshCenter”, “slotWindow”. | Choose exactly one of from.anchor, from.slotWindow or from.meshCenter. |
|
|
7264
|
+
| <a id="CE_RIG_BONE_POSITION_CONFLICT"></a>`CE_RIG_BONE_POSITION_CONFLICT` | “<where>: bone "<bone.name>" declares both a literal x/y and from.<sources[0]>; the two would disagree the first time the art moved”<br>Here the values named in the message include: “anchor”, “meshCenter”, “slotWindow”. | Choose the literal x/y or the manifest position source and remove the other. |
|
|
7265
|
+
| <a id="CE_RIG_BONE_ROTATION_CONFLICT"></a>`CE_RIG_BONE_ROTATION_CONFLICT` | “<where>: bone "<bone.name>" declares both a literal rotation and from.rotation” | Choose literal rotation or from.rotation and remove the other. |
|
|
7266
|
+
| <a id="CE_RIG_BONE_ROTATION_ANCHOR_REQUIRED"></a>`CE_RIG_BONE_ROTATION_ANCHOR_REQUIRED` | “<where>: bone "<bone.name>" wants its rotation from an anchor but names no from.anchor” | Name from.anchor when from.rotation takes its rotation from an anchor. |
|
|
7267
|
+
| <a id="CE_RIG_SLOT_NAME_REQUIRED"></a>`CE_RIG_SLOT_NAME_REQUIRED` | “<where>: every slot needs a "name"” | Give every slot a non-empty name. |
|
|
7268
|
+
| <a id="CE_RIG_SLOT_NAME_DUPLICATE"></a>`CE_RIG_SLOT_NAME_DUPLICATE` | “<where>: two slots are called "<slot.name>"” | Rename a duplicate slot and update references to that slot. |
|
|
7269
|
+
| <a id="CE_RIG_SLOT_BONE_UNKNOWN"></a>`CE_RIG_SLOT_BONE_UNKNOWN` | “<where>: slot "<slot.name>" names bone <JSON.stringify(slot.bone)>, which this rig does not declare” | Name a declared bone in slot.bone. |
|
|
7270
|
+
| <a id="CE_RIG_SLOT_BLEND_MODE"></a>`CE_RIG_SLOT_BLEND_MODE` | “<where>: slot "<slot.name>" has blend <JSON.stringify(slot.blend)>; known: <RIG_SLOT_BLEND.join(', ')> (only the first letter's case is free — the parser's enumValue uppercases that one character and nothing else, and an unresolved name becomes undefined without an error)”<br>Here the values named in the message include: “screen”, “normal”, “additive”, “multiply”. | Use a printed blend mode; only its first letter's case is free. |
|
|
7271
|
+
| <a id="CE_RIG_DEFORM_FOLD_EXEMPTIONS_SHAPE"></a>`CE_RIG_DEFORM_FOLD_EXEMPTIONS_SHAPE` | “<where>: invariants.deformMayFold is <JSON.stringify(mayFold)>, expected an array of { "slot": …, "why": … }” | Write invariants.deformMayFold as an array of {slot, why} entries. |
|
|
7272
|
+
| <a id="CE_RIG_DEFORM_FOLD_SLOT_REQUIRED"></a>`CE_RIG_DEFORM_FOLD_SLOT_REQUIRED` | “<where>: every invariants.deformMayFold entry needs a "slot"” | Name the exempted slot in each deformMayFold entry. |
|
|
7273
|
+
| <a id="CE_RIG_DEFORM_FOLD_SLOT_UNKNOWN"></a>`CE_RIG_DEFORM_FOLD_SLOT_UNKNOWN` | “<where>: invariants.deformMayFold exempts slot "<entry.slot>", which this rig does not declare — a name that resolves to nothing exempts nothing, and reads like the exemption worked” | Name an existing slot in deformMayFold or remove the exemption. |
|
|
7274
|
+
| <a id="CE_RIG_DEFORM_FOLD_SLOT_DUPLICATE"></a>`CE_RIG_DEFORM_FOLD_SLOT_DUPLICATE` | “<where>: invariants.deformMayFold names slot "<entry.slot>" twice” | Keep one deformMayFold entry for each slot. |
|
|
7275
|
+
| <a id="CE_RIG_DEFORM_FOLD_REASON_REQUIRED"></a>`CE_RIG_DEFORM_FOLD_REASON_REQUIRED` | “<where>: invariants.deformMayFold entry for slot "<entry.slot>" needs a "why" — this field switches A39_DEFORM_KEEPS_TRIANGLE_WINDING off for that slot, and an exemption nobody can date or justify is how a defect ships as a decision” | Record a non-blank why explaining the intentional fold exemption. |
|
|
7276
|
+
| <a id="CE_RIG_CONSTRAINT_NAME_REQUIRED"></a>`CE_RIG_CONSTRAINT_NAME_REQUIRED` | “<where>: every constraint needs a "name"” | Give every constraint a non-empty name. |
|
|
7277
|
+
|
|
7278
|
+
|
|
7279
|
+
#### 5.1.12 Rig constraints, invariants and skins
|
|
7280
|
+
|
|
7281
|
+
| Code | Fixed message text and alternatives | What to change |
|
|
7282
|
+
| --- | --- | --- |
|
|
7283
|
+
| <a id="CE_RIG_CONSTRAINT_NAME_DUPLICATE"></a>`CE_RIG_CONSTRAINT_NAME_DUPLICATE` | “<where>: two <declared.type> constraints are called "<declared.name>" — a constraint resolves by name AND type (`SkeletonData.findConstraint`), so names are unique PER KIND: an ik and a transform constraint may share one, two of a kind may not” | Use a unique name within each constraint kind and update references. |
|
|
7284
|
+
| <a id="CE_RIG_IK_BONES_SHAPE"></a>`CE_RIG_IK_BONES_SHAPE` | “<where>: <fault>”<br>“ik constraint "<name>" names <bones.length> bones (<quoted(bones)>); the solver applies one or two, so a constraint over <bones.length> moves nothing — name one bone, or two where the second is the first's child”<br>“ik constraint "<name>": "<second>" is not a child of "<first>" (<why>), so the two-bone solve is not of the chain drawn — name "<second>"'s own parent as the first bone, or make "<second>" a child of "<first>"”<br>“{<quoted(secondAncestors.slice(0, at))> <at === 1 ? 'stands' : 'stand'> between / {"<second>" has no parent / "<first>" is not above it; its parent is "<secondAncestors[0]>"}}”<br>Also: “<value>: skin "<value>"” | Use one bone, or two with the second bone parented directly to the first. |
|
|
7285
|
+
| <a id="CE_RIG_CONSUMER_MIX_EXEMPTIONS_SHAPE"></a>`CE_RIG_CONSUMER_MIX_EXEMPTIONS_SHAPE` | “<where>: invariants.consumerDrivenMix is <JSON.stringify(consumerDriven)>, expected <shape>”<br>“an array of { "constraint": …, "type": "ik" \| "transform", "why": … }”<br>Also: “{ "why": "<why this idle deforms meshes on purpose>" }”<br>“an array of { "name": …, "through": [<bone>, <bone>], "bones": [<bone>, …], "tolerance": <degrees> }” | Write consumerDrivenMix as the printed array of {constraint, type, why} entries. |
|
|
7286
|
+
| <a id="CE_RIG_CONSUMER_MIX_CONSTRAINT_REQUIRED"></a>`CE_RIG_CONSUMER_MIX_CONSTRAINT_REQUIRED` | “<where>: every invariants.consumerDrivenMix entry needs a "constraint" — <shape>”<br>“an array of { "constraint": …, "type": "ik" \| "transform", "why": … }”<br>Also: “{ "why": "<why this idle deforms meshes on purpose>" }”<br>“an array of { "name": …, "through": [<bone>, <bone>], "bones": [<bone>, …], "tolerance": <degrees> }” | State the constraint name in each consumerDrivenMix entry. |
|
|
7287
|
+
| <a id="CE_RIG_CONSUMER_MIX_KIND"></a>`CE_RIG_CONSUMER_MIX_KIND` | “<where>: invariants.consumerDrivenMix entry for "<entry.constraint>" has type <JSON.stringify(entry.type)>; only "ik" and "transform" read this declaration (A47_IK_CONSTRAINT_NOT_MUTED_THROUGHOUT, A48_TRANSFORM_CONSTRAINT_NOT_MUTED_THROUGHOUT). A path, physics or slider constraint resting muted is A36, A23 or A37, which read no declaration, so the entry would exempt nothing{ — the rig declares "<entry.constraint>" as <declaredAs.map((t) => `${t === 'ik' ? 'an' : 'a'} ${t}`).join(' and ')> constraint / }” | Use ik or transform for consumerDrivenMix; other kinds do not read this exemption. |
|
|
7288
|
+
| <a id="CE_RIG_CONSUMER_MIX_CONSTRAINT_UNKNOWN"></a>`CE_RIG_CONSUMER_MIX_CONSTRAINT_UNKNOWN` | “<where>: invariants.consumerDrivenMix names <key>, which this rig does not declare{ — "<entry.constraint>" is declared as <declaredAs.map((t) => `${t === 'ik' ? 'an' : 'a'} ${t}`).join(' and ')> constraint, and a constraint resolves by name AND type / }. A name that resolves to nothing exempts nothing, and reads like the exemption worked”<br>Also: “<value> constraint "<value>"” | Match both the declared constraint name and its kind, or remove the exemption. |
|
|
7289
|
+
| <a id="CE_RIG_CONSUMER_MIX_CONSTRAINT_DUPLICATE"></a>`CE_RIG_CONSUMER_MIX_CONSTRAINT_DUPLICATE` | “<where>: invariants.consumerDrivenMix names <key> twice”<br>Also: “<value> constraint "<value>"” | Keep one consumerDrivenMix entry per constraint name and kind. |
|
|
7290
|
+
| <a id="CE_RIG_CONSUMER_MIX_REASON_REQUIRED"></a>`CE_RIG_CONSUMER_MIX_REASON_REQUIRED` | “<where>: invariants.consumerDrivenMix entry for <key> needs a "why" — this field switches <entry.type === 'ik' ? 'A47_IK_CONSTRAINT_NOT_MUTED_THROUGHOUT' : 'A48_TRANSFORM_CONSTRAINT_NOT_MUTED_THROUGHOUT'> off for that constraint, and an exemption nobody can date or justify is how a defect ships as a decision”<br>Also: “<value> constraint "<value>"” | Record a non-blank why explaining the consumer-driven mix exemption. |
|
|
7291
|
+
| <a id="CE_RIG_IDLE_MESH_EXEMPTION_SHAPE"></a>`CE_RIG_IDLE_MESH_EXEMPTION_SHAPE` | “<where>: invariants.idleDrivesMeshes is <JSON.stringify(idleDrives)>, expected <shape>”<br>“{ "why": "<why this idle deforms meshes on purpose>" }”<br>Also: “an array of { "constraint": …, "type": "ik" \| "transform", "why": … }”<br>“an array of { "name": …, "through": [<bone>, <bone>], "bones": [<bone>, …], "tolerance": <degrees> }” | Write idleDrivesMeshes in the printed {why} object shape. |
|
|
7292
|
+
| <a id="CE_RIG_IDLE_MESH_REASON_REQUIRED"></a>`CE_RIG_IDLE_MESH_REASON_REQUIRED` | “<where>: invariants.idleDrivesMeshes needs a "why" (a non-blank string), got <idleDrives.why === undefined ? 'none' : JSON.stringify(idleDrives.why)> — expected <shape>. This field switches A15_IDLE_NO_MESH_BONE_KEYS off, and an exemption nobody can date or justify is how a defect ships as a decision”<br>“{ "why": "<why this idle deforms meshes on purpose>" }”<br>Also: “an array of { "constraint": …, "type": "ik" \| "transform", "why": … }”<br>“an array of { "name": …, "through": [<bone>, <bone>], "bones": [<bone>, …], "tolerance": <degrees> }” | Record a non-blank why explaining why idle intentionally drives mesh bones. |
|
|
7293
|
+
| <a id="CE_RIG_AXES_SHAPE"></a>`CE_RIG_AXES_SHAPE` | “<where>: invariants.axes is <JSON.stringify(axes)>, expected <shape>”<br>“an array of { "name": …, "through": [<bone>, <bone>], "bones": [<bone>, …], "tolerance": <degrees> }”<br>Also: “{ "why": "<why this idle deforms meshes on purpose>" }”<br>“an array of { "constraint": …, "type": "ik" \| "transform", "why": … }” | Write invariants.axes as the printed array of axis declarations. |
|
|
7294
|
+
| <a id="CE_RIG_AXIS_NAME_REQUIRED"></a>`CE_RIG_AXIS_NAME_REQUIRED` | “<where>: <field> needs a "name" — <shape>”<br>“an array of { "name": …, "through": [<bone>, <bone>], "bones": [<bone>, …], "tolerance": <degrees> }”<br>Also: “invariants.axes[<value>]”<br>“{ "why": "<why this idle deforms meshes on purpose>" }”<br>“an array of { "constraint": …, "type": "ik" \| "transform", "why": … }” | Give each invariant axis a non-empty name. |
|
|
7295
|
+
| <a id="CE_RIG_AXIS_NAME_DUPLICATE"></a>`CE_RIG_AXIS_NAME_DUPLICATE` | “<where>: <field>: invariants.axes names "<entry.name>" twice — a failure names its entry, and two entries of one name could not be told apart”<br>Also: “invariants.axes[<value>]” | Use a unique name for each invariant axis. |
|
|
7296
|
+
| <a id="CE_RIG_AXIS_THROUGH_PAIR"></a>`CE_RIG_AXIS_THROUGH_PAIR` | “<where>: <axis>: "through" is <JSON.stringify(through)>, expected two bone names — the line is drawn through their setup-pose world origins”<br>Also: “invariants.axes[<value>]” | State two bone names in the axis through array. |
|
|
7297
|
+
| <a id="CE_RIG_AXIS_THROUGH_BONE_UNKNOWN"></a>`CE_RIG_AXIS_THROUGH_BONE_UNKNOWN` | “<where>: <axis>: through[<k>] names bone "<bone>", which this rig does not declare — a line through nothing holds nothing”<br>Also: “invariants.axes[<value>]” | Name a declared bone in each through entry. |
|
|
7298
|
+
| <a id="CE_RIG_AXIS_THROUGH_BONE_DUPLICATE"></a>`CE_RIG_AXIS_THROUGH_BONE_DUPLICATE` | “<where>: <axis>: "through" names bone "<through[0]>" twice — one bone's origin is a point, and a point draws no line”<br>Also: “invariants.axes[<value>]” | Choose two different bones whose origins define the axis line. |
|
|
7299
|
+
| <a id="CE_RIG_AXIS_BONES_ARRAY"></a>`CE_RIG_AXIS_BONES_ARRAY` | “<where>: <axis>: "bones" is <JSON.stringify(bones)>, expected a non-empty array of bone names — the bones held to the line”<br>Also: “invariants.axes[<value>]” | State a non-empty array of bones held to the axis. |
|
|
7300
|
+
| <a id="CE_RIG_AXIS_HELD_BONE_UNKNOWN"></a>`CE_RIG_AXIS_HELD_BONE_UNKNOWN` | “<where>: <axis>: bones[<k>] names bone "<bone>", which this rig does not declare — a name that resolves to nothing is held to nothing, and reads like it was”<br>Also: “invariants.axes[<value>]” | Name a declared bone in the axis bones array. |
|
|
7301
|
+
| <a id="CE_RIG_AXIS_HELD_BONE_DUPLICATE"></a>`CE_RIG_AXIS_HELD_BONE_DUPLICATE` | “<where>: <axis>: "bones" names bone "<bone>" twice”<br>Also: “invariants.axes[<value>]” | List each bone only once in the axis bones array. |
|
|
7302
|
+
| <a id="CE_RIG_AXIS_TOLERANCE_RANGE"></a>`CE_RIG_AXIS_TOLERANCE_RANGE` | “<where>: <axis>: "tolerance" is <tolerance === undefined ? 'absent' : JSON.stringify(tolerance)>; it must be a number of degrees above 0 and below 90, and there is no default — two lines meet at 0° to 90°, so 90 or more admits every orientation and can never fail, and 0 refuses a bone rotated exactly onto the line whenever the posed arithmetic rounds”<br>Also: “invariants.axes[<value>]” | State tolerance in degrees strictly above 0 and below 90. |
|
|
7303
|
+
| <a id="CE_RIG_SKINS_TABLE"></a>`CE_RIG_SKINS_TABLE` | “<where>: "skins" is an object keyed by skin name” | Write skins as an object keyed by skin name. |
|
|
7304
|
+
| <a id="CE_RIG_SLOT_SKIN_KEY_COLLISION"></a>`CE_RIG_SLOT_SKIN_KEY_COLLISION` | “<where>: a slot is called "<collision>", which is one of the keys that tell a skin's long form (`{ "attachments": {…}, "bones": [...] }`) from its short one (`slotName -> placeholder -> attachment`): <RIG_SKIN_KEYS.join(', ')>. Rename the slot.”<br>Here the values named in the message include: “ik”, “path”, “slider”, “physics”, “transform”. | Rename the slot that collides with a reserved long-form skin key. |
|
|
7305
|
+
| <a id="CE_RIG_SKIN_BONE_UNKNOWN"></a>`CE_RIG_SKIN_BONE_UNKNOWN` | “<at> activates bone "<bone>", which this rig does not declare”<br>Also: “<value>: skin "<value>"” | Name an existing bone in the skin's bones list. |
|
|
7306
|
+
| <a id="CE_RIG_SKIN_BONE_NOT_REQUIRED"></a>`CE_RIG_SKIN_BONE_NOT_REQUIRED` | “<at> activates bone "<bone>", but that bone does not declare `"skin": true`. Skeleton.updateCache starts a bone active unless it is skinRequired, so this list changes nothing — the bone poses under every skin.”<br>Also: “<value>: skin "<value>"” | Declare skin:true on that bone if skin activation is intended, or remove the redundant list entry. |
|
|
7307
|
+
| <a id="CE_RIG_SKIN_CONSTRAINT_UNKNOWN"></a>`CE_RIG_SKIN_CONSTRAINT_UNKNOWN` | “<at> activates <type> constraint "<name>", which this rig does not declare”<br>Also: “<value>: skin "<value>"” | Name an existing constraint in the skin list for its kind. |
|
|
7308
|
+
| <a id="CE_RIG_SKIN_CONSTRAINT_KIND"></a>`CE_RIG_SKIN_CONSTRAINT_KIND` | “<at> lists "<name>" under "<type>", but the rig declares it as a "<kinds.join('", "')>" constraint — a skin looks its constraints up by name AND type, so this one is a miss and the loader throws”<br>Also: “<value>: skin "<value>"” | Move the constraint name to the skin list matching its declared kind. |
|
|
7309
|
+
| <a id="CE_RIG_SKIN_CONSTRAINT_NOT_REQUIRED"></a>`CE_RIG_SKIN_CONSTRAINT_NOT_REQUIRED` | “<at> activates <type> constraint "<name>", but that constraint does not declare `"skin": true`. A constraint is active unless it is skinRequired, so this list changes nothing.”<br>Also: “<value>: skin "<value>"” | Declare skin:true on that constraint if activation is intended, or remove the redundant list entry. |
|
|
7310
|
+
| <a id="CE_RIG_BONE_SKIN_NEVER_ACTIVE"></a>`CE_RIG_BONE_SKIN_NEVER_ACTIVE` | “<where>: bone "<bone.name>" declares `"skin": true` but no skin activates it, so it is never active — list it in the skin it belongs to, or drop the flag” | List the skin-required bone in a skin that activates it, or remove skin:true. |
|
|
7311
|
+
| <a id="CE_RIG_CONSTRAINT_SKIN_NEVER_ACTIVE"></a>`CE_RIG_CONSTRAINT_SKIN_NEVER_ACTIVE` | “<where>: <type> constraint "<name>" declares `"skin": true` but no skin activates it, so it never runs — list it in that skin's "<type>" array, or drop the flag” | List the skin-required constraint in that skin's matching kind array, or remove skin:true. |
|
|
7312
|
+
| <a id="CE_RIG_EVENTS_TABLE"></a>`CE_RIG_EVENTS_TABLE` | “<where>: "events" is an object keyed by event name (`{ "footstep": {} }`), not an array — the format's own shape” | Write events as an object keyed by event name, with {} for an event without defaults. |
|
|
7313
|
+
| <a id="CE_RIG_EVENT_NAME_EMPTY"></a>`CE_RIG_EVENT_NAME_EMPTY` | “<where>: an event has an empty name” | Give the event a non-empty name. |
|
|
7314
|
+
| <a id="CE_RIG_EVENT_DEFAULTS_OBJECT"></a>`CE_RIG_EVENT_DEFAULTS_OBJECT` | “<where>: event "<name>" must be an object of payload defaults (use {} for none)” | Write the event payload defaults as an object, using {} for none. |
|
|
7315
|
+
| <a id="CE_RIG_EVENT_NUMBER_FINITE"></a>`CE_RIG_EVENT_NUMBER_FINITE` | “<where>: event "<name>" has <field> <JSON.stringify(v)>, which is not a finite number”<br>Also: “invariants.axes[<value>]” | Use finite numeric event defaults for the printed field. |
|
|
7316
|
+
| <a id="CE_RIG_EVENT_INT_WHOLE"></a>`CE_RIG_EVENT_INT_WHOLE` | “<where>: event "<name>" has int <JSON.stringify(def.int)>; the payload is an integer” | Use a whole number for the event int payload default. |
|
|
7317
|
+
| <a id="CE_RIG_EVENT_STRING_TYPE"></a>`CE_RIG_EVENT_STRING_TYPE` | “<where>: event "<name>" has <field> <JSON.stringify(def[field])>, which is not a string”<br>Also: “invariants.axes[<value>]” | Use a string for the printed event payload field. |
|
|
7318
|
+
| <a id="CE_RIG_EVENT_AUDIO_REQUIRED"></a>`CE_RIG_EVENT_AUDIO_REQUIRED` | “<where>: event "<name>" declares <field> but no "audio"; the parser reads <field> only when an audio path is set, so it would be dropped in silence”<br>Also: “invariants.axes[<value>]” | State the event audio path before audio-only fields, or remove those fields. |
|
|
7319
|
+
|
|
7320
|
+
|
|
7321
|
+
#### 5.1.13 Stop declarations
|
|
7322
|
+
|
|
7323
|
+
| Code | Fixed message text and alternatives | What to change |
|
|
7324
|
+
| --- | --- | --- |
|
|
7325
|
+
| <a id="CE_STOP_DECLARATIONS_ARRAY"></a>`CE_STOP_DECLARATIONS_ARRAY` | “<where>: "stops" is <JSON.stringify(declared)>; it is an array of { "chain", "links", "against", "at", "inward", "outward", "lower"? }” | Write stops as an array of declarations with the fields printed in the error. |
|
|
7326
|
+
| <a id="CE_STOP_DECLARATION_OBJECT"></a>`CE_STOP_DECLARATION_OBJECT` | “<where>: stops[<i>] is <JSON.stringify(entry)>; a stop is an object” | Write each stop declaration as an object. |
|
|
7327
|
+
| <a id="CE_STOP_CHAIN_NAME_REQUIRED"></a>`CE_STOP_CHAIN_NAME_REQUIRED` | “<where>: stops[<i>] needs a "chain" — the name its point, frame and aim are called after ("<chain>_touch", "<chain>_stop", "<chain>_stop_aim")” | State the stop chain name used for its generated bones and constraints. |
|
|
7328
|
+
| <a id="CE_STOP_LINKS_ARRAY"></a>`CE_STOP_LINKS_ARRAY` | “<who> states "links" <JSON.stringify(links) ?? 'absent'>; it is the chain's swinging links, root first — a non-empty array of bone names”<br>Also: “<value>: stop "<value>"” | List swinging bone names root first in a non-empty links array. |
|
|
7329
|
+
| <a id="CE_STOP_LINK_UNKNOWN"></a>`CE_STOP_LINK_UNKNOWN` | “<who>: links[<k>] names bone "<link>", which this rig does not declare”<br>Also: “<value>: stop "<value>"” | Name an existing bone in links. |
|
|
7330
|
+
| <a id="CE_STOP_LINK_ALREADY_STOPPED"></a>`CE_STOP_LINK_ALREADY_STOPPED` | “<who>: links[<k>] "<link>" is already stopped by stop "<other>" — one drawn link "<link>_d" and one clamp "<link>_clamp" per link, so a link is stopped once”<br>Also: “<value>: stop "<value>"” | Assign each swinging link to only one stop. |
|
|
7331
|
+
| <a id="CE_STOP_LINK_MANIFEST_POSITION"></a>`CE_STOP_LINK_MANIFEST_POSITION` | “<who>: links[<k>] "<link>" takes its place from the manifest ("from"), and a stop copies the link's stated x, y and rotation onto its drawn link — state them”<br>Also: “<value>: stop "<value>"” | State the swinging link's x, y and rotation in the rig spec instead of from. |
|
|
7332
|
+
| <a id="CE_STOP_LINK_ROOT"></a>`CE_STOP_LINK_ROOT` | “<who>: links[<k>] "<link>" is the skeleton's root, and a stop hangs its frame and its drawn link where the link hangs — a link has a parent”<br>Also: “<value>: stop "<value>"” | Use a swinging link with a parent; the skeleton root cannot be stopped. |
|
|
7333
|
+
| <a id="CE_STOP_AGAINST_REQUIRED"></a>`CE_STOP_AGAINST_REQUIRED` | “<who> needs "against" — the bone the point rides on, the leg the chain is held off”<br>Also: “<value>: stop "<value>"” | State the against bone carrying the contact point. |
|
|
7334
|
+
| <a id="CE_STOP_AGAINST_UNKNOWN"></a>`CE_STOP_AGAINST_UNKNOWN` | “<who>: "against" names bone "<against>", which this rig does not declare”<br>Also: “<value>: stop "<value>"” | Name an existing against bone. |
|
|
7335
|
+
| <a id="CE_STOP_AT_REQUIRED"></a>`CE_STOP_AT_REQUIRED` | “<who> states no "at" — the point on "<against>" the frame aims at, [x, y] in "<against>"'s local space; the compiler places no point of its own”<br>Also: “<value>: stop "<value>"” | State at as the contact point [x, y] in the against bone's local space. |
|
|
7336
|
+
| <a id="CE_STOP_AT_PAIR"></a>`CE_STOP_AT_PAIR` | “<who> states "at" <JSON.stringify(at)>; it is [x, y], two numbers in "<against>"'s local space”<br>Also: “<value>: stop "<value>"” | Write at as two numbers in the against bone's local space. |
|
|
7337
|
+
| <a id="CE_STOP_RANGE_END_REQUIRED"></a>`CE_STOP_RANGE_END_REQUIRED` | “<who> states no "<field><end>" — degrees from the link's rest angle, counted positive away from "<against>"; the range is [inward, outward], and the compiler states neither end for you”<br>Also: “<value>: stop "<value>"” | State both inward and outward limits for the printed range. |
|
|
7338
|
+
| <a id="CE_STOP_RANGE_REVERSED"></a>`CE_STOP_RANGE_REVERSED` | “<who>: "<field>inward" <out.inward> is greater than "<field>outward" <out.outward> — the range is [inward, outward] in degrees counted positive away from "<against>", and this one holds no angle”<br>Also: “<value>: stop "<value>"” | Keep inward less than or equal to outward in the printed range. |
|
|
7339
|
+
| <a id="CE_STOP_LOWER_REQUIRED"></a>`CE_STOP_LOWER_REQUIRED` | “<who> states no "lower" — the range [inward, outward] each link below the first may turn through off its own rest bend; the chain has <links.length - 1> of them”<br>Also: “<value>: stop "<value>"” | State the lower inward/outward range for links below the first. |
|
|
7340
|
+
| <a id="CE_STOP_LOWER_WITH_ONE_LINK"></a>`CE_STOP_LOWER_WITH_ONE_LINK` | “<who> states "lower" and its chain has one link — there is no link below the first for it to hold”<br>Also: “<value>: stop "<value>"” | Remove lower when the chain contains one link. |
|
|
7341
|
+
| <a id="CE_STOP_GENERATED_BONE_DECLARED"></a>`CE_STOP_GENERATED_BONE_DECLARED` | “<stop.who> generates bone "<name>", which this rig already declares — rename the bone, or the stop's "chain"” | Rename the colliding declared bone or stop chain. |
|
|
7342
|
+
| <a id="CE_STOP_GENERATED_BONE_COLLISION"></a>`CE_STOP_GENERATED_BONE_COLLISION` | “<stop.who> generates bone "<name>", which stop "<by>" generates too — rename one "chain"” | Give the stops distinct chain names so generated bones differ. |
|
|
7343
|
+
| <a id="CE_STOP_GENERATED_CONSTRAINT_DECLARED"></a>`CE_STOP_GENERATED_CONSTRAINT_DECLARED` | “<stop.who> generates <type> constraint "<name>", which this rig already declares — rename the constraint, or the stop's "chain"”<br>Here the values named in the message include: “ik”, “transform”. | Rename the colliding declared constraint or stop chain. |
|
|
7344
|
+
| <a id="CE_STOP_GENERATED_CONSTRAINT_COLLISION"></a>`CE_STOP_GENERATED_CONSTRAINT_COLLISION` | “<stop.who> generates <type> constraint "<name>", which stop "<by>" generates too — rename one "chain"”<br>Here the values named in the message include: “ik”, “transform”. | Give the stops distinct chain names so generated constraints differ. |
|
|
7345
|
+
| <a id="CE_STOP_LINK_UNDRIVEN"></a>`CE_STOP_LINK_UNDRIVEN` | “<stop.who>: links[<k>] "<link>" is written by no constraint of this rig spec — a stop holds a link something swings (a physics, ik, transform or path constraint in "constraints"), and its copy and clamp run right after that. A physics constraint in the motion spec's table is emitted after every rig constraint, past the clamp; declare it here” | Declare the swinging physics, ik, transform or path constraint in the rig spec's constraints before its stop clamp. |
|
|
7346
|
+
| <a id="CE_STOP_LINK_PARENT_CHAIN"></a>`CE_STOP_LINK_PARENT_CHAIN` | “<stop.who>: links[<k>] "<links[k]>" does not hang below "<names.drawn[k - 1]>", the drawn link of links[<k - 1>] — a chain's next link hangs from the drawn link above it, so the clamp that holds that one carries this one; parent it there” | Parent each lower link under the preceding generated drawn link. |
|
|
7347
|
+
| <a id="CE_STOP_AGAINST_MOVES_WITH_STOP"></a>`CE_STOP_AGAINST_MOVES_WITH_STOP` | “<stop.who>: "against" "<stop.against>" hangs below "<under>", which the stop moves — the point would swing with the chain it holds off; name the leg” | Name an against bone outside the subtree moved by the stop. |
|
|
7348
|
+
| <a id="CE_STOP_LOCAL_BOUND_RANGE"></a>`CE_STOP_LOCAL_BOUND_RANGE` | “<stop.who>: "<field><end>" <range[end]> puts <what>'s bound at <value>°, past ±<BOUND>° — the clamp reads a local rotation in (-180, 180], so a bound past it is never reached and the range it states is not the one that holds”<br>Here the values named in the message include: “inward”, “outward”. | Adjust the printed limits so the local clamp bounds stay within its supported angular range. |
|
|
7349
|
+
| <a id="CE_STOP_DEPENDENCY_ORDER"></a>`CE_STOP_DEPENDENCY_ORDER` | “<who>: "<tip>" hangs below "<name>", which a later stop generates — declare that stop first, so its angles are known when this one is read”<br>Also: “<value>: stop "<value>"” | Declare the stop generating the parent before the stop depending on it. |
|
|
7350
|
+
| <a id="CE_STOP_ANCESTOR_MANIFEST_POSITION"></a>`CE_STOP_ANCESTOR_MANIFEST_POSITION` | “<who>: "<name>" takes its place from the manifest ("from"), and a stop's angles are read off the setup pose this rig spec states — state its x, y and rotation”<br>Also: “<value>: stop "<value>"” | State x, y and rotation for the named setup-pose ancestor instead of from. |
|
|
7351
|
+
| <a id="CE_STOP_FRAME_PARENT_TRANSFORM"></a>`CE_STOP_FRAME_PARENT_TRANSFORM` | “<who>: "<parent>", where the frame hangs, is scaled unevenly, sheared or reflected at the setup pose — the frame's angles add to its parent's only through a rotation and an even scale, and inward is a turn's sense”<br>Also: “<value>: stop "<value>"” | Use a frame parent with rotation and even positive scale, without shear or reflection. |
|
|
7352
|
+
| <a id="CE_STOP_LOWER_PARENT_TRANSFORM"></a>`CE_STOP_LOWER_PARENT_TRANSFORM` | “<who>: "<at>", between links[<k>] "<links[k]>" and the drawn link above it, is scaled unevenly, sheared, reflected or inherits other than normally — a lower clamp reads the link's turn in its parent, and inward is a turn's sense”<br>Also: “<value>: stop "<value>"” | Use normal inheritance and even positive scale without shear or reflection between stopped links. |
|
|
7353
|
+
| <a id="CE_STOP_POINT_AT_ROOT"></a>`CE_STOP_POINT_AT_ROOT` | “<who>: "at" [<stop.at.join(', ')>] on "<stop.against>" sits on the root of "<links[0]>" at the setup pose — the frame aims from the root at the point, and there is no direction to a point it stands on”<br>Also: “<value>: stop "<value>"” | Move at away from the first link's setup-pose root so an aim direction exists. |
|
|
7354
|
+
| <a id="CE_STOP_POINT_ON_LINK_LINE"></a>`CE_STOP_POINT_ON_LINK_LINE` | “<who>: "at" [<stop.at.join(', ')>] on "<stop.against>" lies on "<links[0]>"'s own line at the setup pose — inward is the turn from the link toward the point, and a point on the link's line has no side”<br>Also: “<value>: stop "<value>"” | Move at off the first link's setup-pose line so inward has a side. |
|
|
7355
|
+
|
|
7356
|
+
|
|
7357
|
+
#### 5.1.14 Deform generators
|
|
7358
|
+
|
|
7359
|
+
| Code | Fixed message text and alternatives | What to change |
|
|
7360
|
+
| --- | --- | --- |
|
|
7361
|
+
| <a id="CE_DEFORM_TRANSFORM_OBJECT"></a>`CE_DEFORM_TRANSFORM_OBJECT` | “<where>: "transform" is <JSON.stringify(transform)>; it is an object with a "kind"” | Write transform as an object with a kind. |
|
|
7362
|
+
| <a id="CE_DEFORM_TRANSFORM_KIND"></a>`CE_DEFORM_TRANSFORM_KIND` | “<where>: "transform" has kind <JSON.stringify(kind)>; this spec evaluates <DEFORM_TRANSFORM_KINDS.join(', ')>. A model that is none of those is still authorable as a "vertices" run.”<br>Here the values named in the message include: “yaw”, “bend”, “wave”, “pitch”, “affine”. | Choose a supported transform kind, or author the deformation as a vertices run. |
|
|
7363
|
+
| <a id="CE_DEFORM_DEPTH_RADIUS_CONFLICT"></a>`CE_DEFORM_DEPTH_RADIUS_CONFLICT` | “<where>: transform <kind> states both "depth": true and a radius <JSON.stringify(t.radius)>. They are two answers to how far forward each vertex sits — a cylinder derives it, a map states it — and a key carrying both leaves a reader unable to say which one the output came from. Drop one.” | Choose depth:true or a radius and remove the other. |
|
|
7364
|
+
| <a id="CE_DEFORM_DEPTH_MAP_REQUIRED"></a>`CE_DEFORM_DEPTH_MAP_REQUIRED` | “<where>: transform <kind> says "depth": true and this attachment has no depth map. The map is named on the attachment's generator, as `"depth": { "image": …, "near": …, "zScale": … }`, because it describes the art rather than this key. Name it there, or give this key a radius.” | Declare the attachment generator depth map or give this transform a radius. |
|
|
7365
|
+
| <a id="CE_DEFORM_DEPTH_SAMPLE_COUNT"></a>`CE_DEFORM_DEPTH_SAMPLE_COUNT` | “<where>: transform <kind> has <depth.length> sampled depths for <count> vertices” | Report this compiler defect with the inputs and printed sampled-depth and vertex counts; do not edit generated samples. |
|
|
7366
|
+
| <a id="CE_DEFORM_RADIUS_POSITIVE"></a>`CE_DEFORM_RADIUS_POSITIVE` | “<where>: transform <kind> has radius <radius>; it is the radius of the cylinder the part is painted on, so a positive number” | State a positive cylinder radius. |
|
|
7367
|
+
| <a id="CE_DEFORM_VERTEX_OUTSIDE_CYLINDER"></a>`CE_DEFORM_VERTEX_OUTSIDE_CYLINDER` | “<where>: transform <kind> has radius <radius>, and vertex <v> sits at <kind === 'yaw' ? 'x' : 'y'>=<setup[2 * v + along]>, which is <round(Math.abs(u) - radius)> past it (about=<about>). The cylinder has no surface there, so its depth would be 0 and the projection would be a different model at that vertex. Raise the radius to where the part actually sits, or move the vertex.” | Raise radius to include the measured vertex or move that vertex within the cylinder. |
|
|
7368
|
+
| <a id="CE_DEFORM_AFFINE_DETERMINANT"></a>`CE_DEFORM_AFFINE_DETERMINANT` | “<where>: transform affine has scale [<scale[0]>, <scale[1]>], whose determinant is <round(det)>. At or below zero the map mirrors or collapses the geometry and EVERY triangle reverses its winding, which is the fold A39_DEFORM_KEEPS_TRIANGLE_WINDING refuses. A positive determinant is what makes this kind incapable of folding a mesh.” | Use affine scale with a positive determinant so geometry neither mirrors nor collapses. |
|
|
7369
|
+
| <a id="CE_DEFORM_WAVELENGTH_ZERO"></a>`CE_DEFORM_WAVELENGTH_ZERO` | “<where>: transform wave has wavelength 0; one period cannot be zero long” | State a non-zero wavelength. |
|
|
7370
|
+
| <a id="CE_DEFORM_BEND_POWER_WHOLE"></a>`CE_DEFORM_BEND_POWER_WHOLE` | “<where>: transform bend has power <power>; it is a whole number ≥ 1 (1 is an affine shear, 2 a cantilever that is flat at "from"). A fractional power is not evaluated because it has no value on the side of "from" the part does not reach.” | Use a whole bend power of at least 1. |
|
|
7371
|
+
| <a id="CE_DEFORM_BEND_ENDS_EQUAL"></a>`CE_DEFORM_BEND_ENDS_EQUAL` | “<where>: transform bend has from <from> and to <to>; they are the two ends of the bend, so they differ” | Give bend from and to different values. |
|
|
7372
|
+
| <a id="CE_DEFORM_TRANSFORM_QUANTISED_IDENTITY"></a>`CE_DEFORM_TRANSFORM_QUANTISED_IDENTITY` | “<where>: transform <kind> states <stated>, and every one of this attachment's <count> vertices evaluates to an offset of 0 — the largest value the closed form reached at any of them is <band.toExponential(3)>, which quantises to 0 on the 1e-6 grid a model is evaluated on. So the key states a deformation and emits the identity, and nothing downstream can tell it apart from a key that meant the setup pose. <sampledTo>. A key that MEANS the identity states it in its own parameters (<identitySpelling>) or carries no run at all.”<br>“A scale about a fixed point moves nothing that SITS on it, so every vertex this attachment has lies at about=[<about[0]>, <about[1]>] on the axis the scale changes — the geometry has collapsed onto the point the key holds still”<br>“amount 0”<br>“amount=<amount> from=<from> to=<to> power=<power> along=<an> axis=<axis === 0 ? 'x' : 'y'>”<br>“amplitude 0”<br>“amplitude=<amplitude> wavelength=<wavelength> phase=<phase> along=<an> axis=<axis === 0 ? 'x' : 'y'>”<br>“degrees 0”<br>“scale [1, 1]”<br>“scale=[<scale[0]>, <scale[1]>]<a.about === undefined ? '' : ` about=[${about[0]}, ${about[1]}]`>”<br>“{Every vertex sits at <an>=<distinct[0]>, so one value of the sinusoid covers the whole attachment and this phase is where that one value crosses zero. A wave needs the coordinate it reads to VARY across the geometry; a part that displaces as a whole is a bone, not a deform / The closest two distinct <an> coordinates in this attachment are <round(gap)> apart, and a sinusoid has to be sampled to exist: a wavelength of at least 4x that (<round(4 * gap)>) to read as a wave at all and 8x (<round(8 * gap)>) to read as a curve, where this key states <round(wavelength / gap)>x. At 2x every sample lands on the same pair of phases, and at the zero crossings that pair is (0, 0). `gallery/nod`'s README carries that rule and the measured table behind it}”<br>“{Every vertex sits at <an>=<from>, which is "from" — the end the bend is anchored at, where the displacement is 0 by construction. The span the key names does not cross the part it is keyed on / The furthest any vertex reaches into the span is u=<round(reach)> of 1, and u^<power> of that is <(reach ** power).toExponential(3)> — so the part occupies only the flat end of the curve. Move "to" to where the geometry actually ends, or lower the power}”<br>“{The turn is <degrees>°, and a projection of it can only vanish where every vertex shares one <kind === 'yaw' ? 'x' : 'y'> AND one depth — check the depth map's sampled range in the mesh report, which is 0 wide when the sheet is flat where this part sits / The turn is <degrees>°, and a projection of it can only vanish where every vertex shares one <kind === 'yaw' ? 'x' : 'y'> — check that this attachment's setup geometry is the shape the radius says it is}”<br>“{depth=true degrees=<degrees><t.about === undefined ? '' : ` about=${about}`> / radius=<radius> degrees=<degrees><t.about === undefined ? '' : ` about=${about}`>}”<br>Also: “axis=[<value>, <value>] from=<value> to=<value> shape=<value>”<br>“mask=<value>”<br>“<value> envelope(<value>)”<br>Here the values named in the message include: “linear”, “smooth”. | Use parameters with a measured non-zero result, explicitly state identity parameters, or omit the run. |
|
|
7373
|
+
| <a id="CE_DEFORM_ENVELOPE_ZERO_WEIGHT"></a>`CE_DEFORM_ENVELOPE_ZERO_WEIGHT` | “<where>: transform <kind> states <stated> and moves <plain.filter((d, i) => i % 2 === 0 && (d !== 0 \|\| plain[i + 1] !== 0)).length> of <count> vertices, and envelope <weighed.stated> weighs every one of them 0 — so the key states a deformation and emits the identity. <weighed.reach>”<br>“The mask "<mask>" weighs <carried> of <count> vertices above 0.”<br>“axis=[<axis[0]>, <axis[1]>] from=<from> to=<to> shape=<shape>”<br>“mask=<mask>”<br>“{The attachment has no vertices. / Along [<axis[0]>, <axis[1]>] this attachment's vertices sit at <round(lo)> to <round(hi)>, and the ramp rises from <from> (weight 0) to <to> (weight 1) — move "from" and "to" onto the part.}”<br>Also: “amplitude=<value> wavelength=<value> phase=<value> along=<value> axis=<value>”<br>“{depth=true degrees=<value><value> / radius=<value> degrees=<value><value>}”<br>“{ / about=[<value>, <value>]}”<br>“amount=<value> from=<value> to=<value> power=<value> along=<value> axis=<value>”<br>“<value> envelope(<value>)”<br>“scale=[<value>, <value>]<value>”<br>Here the values named in the message include: “linear”, “smooth”. | Place the envelope ramp or mask where it weights moved vertices above 0, or remove the ineffective key. |
|
|
7374
|
+
| <a id="CE_DEFORM_ENVELOPE_NO_EFFECT"></a>`CE_DEFORM_ENVELOPE_NO_EFFECT` | “<where>: transform <kind> states envelope <weighed.stated>, and it changes no emitted number: every vertex the model moves takes weight 1 (<weighed.full> of <count> vertices at 1, <weighed.zero> at 0), so the run is the un-enveloped one and the envelope is a field a reader would credit for an output it did not shape. <weighed.reach>”<br>“The mask "<mask>" weighs <carried> of <count> vertices above 0.”<br>“axis=[<axis[0]>, <axis[1]>] from=<from> to=<to> shape=<shape>”<br>“mask=<mask>”<br>“{The attachment has no vertices. / Along [<axis[0]>, <axis[1]>] this attachment's vertices sit at <round(lo)> to <round(hi)>, and the ramp rises from <from> (weight 0) to <to> (weight 1) — move "from" and "to" onto the part.}”<br>Here the values named in the message include: “linear”, “smooth”. | Remove the ineffective envelope, or place its transition over vertices the model moves. |
|
|
7375
|
+
| <a id="CE_DEFORM_ENVELOPE_OBJECT"></a>`CE_DEFORM_ENVELOPE_OBJECT` | “<where>: transform field "envelope" is <JSON.stringify(envelope)>; it is an object — a ramp `{ "axis", "from", "to", "shape" }` or a mask `{ "mask" }`” | Write envelope as a ramp object or a mask object. |
|
|
7376
|
+
| <a id="CE_DEFORM_ENVELOPE_MASK_RAMP_CONFLICT"></a>`CE_DEFORM_ENVELOPE_MASK_RAMP_CONFLICT` | “<where>: transform field "envelope" states "mask" <JSON.stringify(e.mask)> beside the ramp's <rampStated.map((f) => `"${f}"`).join(', ')>. They are two answers to one question — what weight each vertex takes — and a key carrying both leaves a reader unable to say which one the output came from. Drop one.”<br>Here the values named in the message include: “axis”, “shape”. | Choose envelope.mask or the ramp fields and remove the other form. |
|
|
7377
|
+
| <a id="CE_DEFORM_ENVELOPE_WEIGHT_UNSTATED"></a>`CE_DEFORM_ENVELOPE_WEIGHT_UNSTATED` | “<where>: transform field "envelope" is <JSON.stringify(envelope)>, which states no weight at all. It is a ramp `{ "axis", "from", "to", "shape" }` or a mask `{ "mask" }`; a key that weighs every vertex 1 carries no envelope.” | State a ramp or mask, or omit envelope for uniform weight 1. |
|
|
7378
|
+
| <a id="CE_DEFORM_ENVELOPE_SOFT_REQUIRED"></a>`CE_DEFORM_ENVELOPE_SOFT_REQUIRED` | “<where>: transform field "envelope.mask" is <JSON.stringify(mask)>, and this attachment has no "soft" block, so the mask names nothing. An envelope's mask is the attachment's own soft mask (AUTHORING §3.4.6), the one its generator sampled at every vertex when the mesh was built; give the generator a "soft" block, or state a ramp instead.” | Give the attachment generator a soft block or use a ramp envelope. |
|
|
7379
|
+
| <a id="CE_DEFORM_ENVELOPE_MASK_MISMATCH"></a>`CE_DEFORM_ENVELOPE_MASK_MISMATCH` | “<where>: transform field "envelope.mask" is <JSON.stringify(mask)>, and this attachment's soft mask is <JSON.stringify(soft.mask)>, so the mask names nothing it was built with. An envelope reads the mask the generator sampled at every vertex, and only that one.” | Name the soft mask this attachment's generator sampled. |
|
|
7380
|
+
| <a id="CE_DEFORM_SOFT_SAMPLE_COUNT"></a>`CE_DEFORM_SOFT_SAMPLE_COUNT` | “<where>: the soft mask "<mask>" has <soft.levels.length> sampled levels for <count> vertices” | Report this compiler defect with the inputs and printed mask-level and vertex counts; do not edit generated samples. |
|
|
7381
|
+
| <a id="CE_DEFORM_ENVELOPE_SHAPE"></a>`CE_DEFORM_ENVELOPE_SHAPE` | “<where>: transform field "envelope.shape" is <JSON.stringify(e.shape)>; it is one of <DEFORM_ENVELOPE_SHAPES.map((name) => JSON.stringify(name)).join(', ')> — how the weight rises from 0 at "from" to 1 at "to": "linear" is u, "smooth" is u²(3 − 2u)” | Use linear or smooth for envelope.shape. |
|
|
7382
|
+
| <a id="CE_DEFORM_ENVELOPE_AXIS_UNIT"></a>`CE_DEFORM_ENVELOPE_AXIS_UNIT` | “<where>: transform field "envelope.axis" is [<axis[0]>, <axis[1]>], whose length is <round(length)>; it is a unit direction, length 1 on the model's 1e-6 grid. A longer or shorter one would scale every position the ramp compares with "from" and "to" — divide it by its length, and state "from" and "to" along the unit one.” | Divide envelope.axis by its length and state from/to along the resulting unit direction. |
|
|
7383
|
+
| <a id="CE_DEFORM_ENVELOPE_ENDS_EQUAL"></a>`CE_DEFORM_ENVELOPE_ENDS_EQUAL` | “<where>: transform fields "envelope.from" and "envelope.to" are both <from>; they are where the weight is 0 and where it is 1, so they differ — a ramp of no length is a step, and a step is the edge a model exists not to leave.” | Give envelope.from and envelope.to different values. |
|
|
7384
|
+
| <a id="CE_DEFORM_ENVELOPE_WEIGHT_RANGE"></a>`CE_DEFORM_ENVELOPE_WEIGHT_RANGE` | “<where>: transform field "<field>" weighs vertex <v> at <w>; an envelope's weight is in [0, 1] — 0 leaves the vertex where it is and 1 moves it the whole way the model says, and nothing past either end is a weight.”<br>Also: “{envelope.shape / envelope.mask}” | State envelope weights in [0, 1]. |
|
|
7385
|
+
| <a id="CE_DEFORM_FIELD_NUMBER_FINITE"></a>`CE_DEFORM_FIELD_NUMBER_FINITE` | “<where>: transform field "<field>" is <JSON.stringify(value)>; it is a finite number the spec has to state”<br>Also: “<value>[0]”<br>“<value>[1]”<br>Here the values named in the message include: “envelope.from”, “power”, “phase”, “about”, “scale”, “radius”, “amount”, “degrees”, “amplitude”, “wavelength”, “envelope.to”, “envelope.axis”. | State a finite number for the printed transform field. |
|
|
7386
|
+
| <a id="CE_DEFORM_FIELD_PAIR"></a>`CE_DEFORM_FIELD_PAIR` | “<where>: transform field "<field>" is <JSON.stringify(value)>; it is a pair, [x, y]”<br>Here the values named in the message include: “scale”, “about”, “envelope.axis”. | State [x, y] for the printed transform field. |
|
|
7387
|
+
| <a id="CE_DEFORM_COORDINATE_NAME"></a>`CE_DEFORM_COORDINATE_NAME` | “<where>: transform <kind> has <name>=<JSON.stringify(value)>; it is "x" or "y"”<br>Here the values named in the message include: “axis”, “along”. | Use x or y for the printed coordinate selector. |
|
|
7388
|
+
| <a id="CE_DEFORM_SAME_READ_DISPLACE_AXIS"></a>`CE_DEFORM_SAME_READ_DISPLACE_AXIS` | “<where>: transform <kind> reads <String(along)> and displaces <String(axis)> — the same coordinate, which is a stretch rather than a bend or a wave. An affine scale states that, and states the determinant that proves it keeps every triangle's winding.” | Use different read and displacement coordinates, or state the stretch as affine scale. |
|
|
7389
|
+
|
|
7390
|
+
|
|
7391
|
+
#### 5.1.15 Track generators
|
|
7392
|
+
|
|
7393
|
+
| Code | Fixed message text and alternatives | What to change |
|
|
7394
|
+
| --- | --- | --- |
|
|
7395
|
+
| <a id="CE_TRACK_DERIVE_OBJECT"></a>`CE_TRACK_DERIVE_OBJECT` | “<where>: "derive" is <JSON.stringify(derive)>; it is an object with a "kind"” | Write derive as an object with a kind. |
|
|
7396
|
+
| <a id="CE_TRACK_DERIVE_KIND"></a>`CE_TRACK_DERIVE_KIND` | “<where>: "derive" has kind <JSON.stringify(kind)>; this spec evaluates <TRACK_DERIVE_KINDS.join(', ')>. A model that is none of those is still authorable as a per-member "v" map, or as one track per member.”<br>Here the values named in the message include: “yaw”, “pitch”. | Use a supported derive kind, a per-member v map, or one authored track per member. |
|
|
7397
|
+
| <a id="CE_TRACK_CARRIED_PROJECTION"></a>`CE_TRACK_CARRIED_PROJECTION` | “<where>: derive <kind> states carried=<JSON.stringify(turn.carried)> on a "<property>" track, and the foreshortening reads no depth difference — it is cos(α − t)/cos α, where α is the member's own angle off the axis. "carried" belongs on the "<projections.shift>" track, whose shared shift is the thing it names.” | Put carried on the displacement projection rather than the foreshortening track. |
|
|
7398
|
+
| <a id="CE_TRACK_FORESHORTEN_DEPTH"></a>`CE_TRACK_FORESHORTEN_DEPTH` | “<where>: derive <kind> projects onto "<property>" and member "<member.name>" states depth <depth>. Foreshortening is cos(α − t)/cos α with α = atan2(coordinate, depth), which needs the part to be IN FRONT of the axis; at or behind it there is no front surface to narrow. A part behind the axis still takes the "<projections.shift>" projection, where a negative depth is exactly what swings it the other way.” | State positive depth for the foreshortening projection; negative depth belongs to displacement. |
|
|
7399
|
+
| <a id="CE_TRACK_FORESHORTEN_EDGE_ON"></a>`CE_TRACK_FORESHORTEN_EDGE_ON` | “<where>: derive <kind> turns member "<member.name>" (<projections.coordinate>=<u>, depth=<depth>) past its own edge: α = <round(alpha)> rad and the turn is <round(rad)> rad, so cos(α − t) is <round(Math.cos(alpha - rad))> and the scale would be <round(scale)>. A scale at or below 0 mirrors the drawing rather than narrowing it. The part has turned edge-on — the turn is past what this construction carries, and FACE §8 is the page that picks a construction from the angle.” | Keep the turn within this construction's positive scale range or choose the construction described in FACE §8. |
|
|
7400
|
+
| <a id="CE_TRACK_PROPERTY_PROJECTION"></a>`CE_TRACK_PROPERTY_PROJECTION` | “<where>: derive <kind> has no projection onto "<property>". It projects onto "<p.shift>" (the displacement, FACE §3) and "<p.foreshorten>" (the narrowing, FACE §5), and onto nothing else — a turn about one axis moves nothing along it, so a paired "translate"/"scale" would need a second channel this model does not state. State the axis, or write the values as a per-member "v" map.” | Use the derive kind's printed displacement or foreshortening property, or a per-member v map. |
|
|
7401
|
+
| <a id="CE_TRACK_GROUP_SHARED_DEPTH"></a>`CE_TRACK_GROUP_SHARED_DEPTH` | “<where>: derive <kind> states one depth <depth> for <members.length> members (<members.map((m) => m.name).join(', ')>). One number for every member is the shared value a plain "v" already keys — state a depth per member, as { "member": z, … }.” | State a depth per group member as a member-name map. |
|
|
7402
|
+
| <a id="CE_TRACK_DEPTH_SHAPE"></a>`CE_TRACK_DEPTH_SHAPE` | “<where>: derive <kind> has depth <JSON.stringify(depth)>; it is a number on a bone track and { "member": z, … } on a group track” | Use numeric depth on a bone track and a member-name depth map on a group track. |
|
|
7403
|
+
| <a id="CE_TRACK_DEPTH_MEMBER_UNKNOWN"></a>`CE_TRACK_DEPTH_MEMBER_UNKNOWN` | “<where>: derive <kind> states a depth for "<name>", which this track does not key (its members are: <members.map((m) => m.name).join(', ')>)” | Remove the depth entry for a member this track does not key. |
|
|
7404
|
+
| <a id="CE_TRACK_DEPTH_MEMBER_REQUIRED"></a>`CE_TRACK_DEPTH_MEMBER_REQUIRED` | “<where>: derive <kind> states no depth for member "<member>" (it states: <stated.length ? stated.join(', ') : 'nothing'>). A depth is refused rather than defaulted: a member silently at depth 0 would be keyed with a DIFFERENT model from the ones beside it, and that is exactly the error a table of six is written to make visible.” | State a finite depth for each member keyed by the track. |
|
|
7405
|
+
| <a id="CE_TRACK_FIELD_NUMBER_FINITE"></a>`CE_TRACK_FIELD_NUMBER_FINITE` | “<where>: derive field "<field>" is <JSON.stringify(value)>; it is a finite number the spec has to state”<br>Also: “depth.<value>”<br>Here the values named in the message include: “about”, “carried”, “degrees”. | State a finite number for the printed derive field. |
|
|
7406
|
+
|
|
7407
|
+
|
|
7408
|
+
#### 5.1.16 Atlas packing
|
|
7409
|
+
|
|
7410
|
+
| Code | Fixed message text and alternatives | What to change |
|
|
7411
|
+
| --- | --- | --- |
|
|
7412
|
+
| <a id="CE_ATLAS_INTERNAL_FOOTPRINT_OVERLAP"></a>`CE_ATLAS_INTERNAL_FOOTPRINT_OVERLAP` | “internal: the footprint pass placed a <shape.width>x<shape.height> cell at <put.x>,<put.y> over the footprint of the <other.shape.width>x<other.shape.height> cell at <other.x>,<other.y>” | Report this compiler bug with the inputs, packing options and printed overlapping cells. |
|
|
7413
|
+
| <a id="CE_ATLAS_PACKING_STALLED"></a>`CE_ATLAS_PACKING_STALLED` | “packing stalled with <remaining.length> region(s) left and an empty <maxEdge>x<maxEdge> page” | Report this packer defect with the inputs, page size and remaining-region count. |
|
|
7414
|
+
| <a id="CE_ATLAS_SPILL_UNPACKABLE"></a>`CE_ATLAS_SPILL_UNPACKABLE` | “page <pageIndex + 1> of the spill holds <onPage.length> region(s) that no page fits” | Report this packer defect with the inputs, packing options and printed spill page. |
|
|
7415
|
+
| <a id="CE_ATLAS_PAGE_EDGES_VALUE"></a>`CE_ATLAS_PAGE_EDGES_VALUE` | “--page-edges <JSON.stringify(String(opts.pageEdges))>; known values: <PAGE_EDGES.join(', ')>”<br>Here the values named in the message include: “pot”, “free”. | Choose a printed --page-edges value. |
|
|
7416
|
+
| <a id="CE_ATLAS_PACK_SHAPE_VALUE"></a>`CE_ATLAS_PACK_SHAPE_VALUE` | “--pack-shape <JSON.stringify(String(opts.shape))>; known values: <PACK_SHAPES.join(', ')>”<br>Here the values named in the message include: “rect”, “polygon”. | Choose a printed --pack-shape value. |
|
|
7417
|
+
| <a id="CE_ATLAS_PAGE_SIZE_POSITIVE_INTEGER"></a>`CE_ATLAS_PAGE_SIZE_POSITIVE_INTEGER` | “--page-size must be a positive integer, got <String(opts.pageSize)>” | Use a positive integer for --page-size. |
|
|
7418
|
+
| <a id="CE_ATLAS_PADDING_NONNEGATIVE_INTEGER"></a>`CE_ATLAS_PADDING_NONNEGATIVE_INTEGER` | “--padding must be a non-negative integer, got <String(opts.padding)>” | Use a non-negative integer for --padding. |
|
|
7419
|
+
| <a id="CE_ATLAS_IMAGES_REQUIRED"></a>`CE_ATLAS_IMAGES_REQUIRED` | “nothing to pack: this compile emitted no images” | Provide a build with emitted images before requesting atlas packing. |
|
|
7420
|
+
| <a id="CE_ATLAS_REGION_EXCEEDS_PAGE"></a>`CE_ATLAS_REGION_EXCEEDS_PAGE` | “"<sorted[i].region>" is <sorted[i].width>x<sorted[i].height> and with --padding <padding> needs a <cells[i].w>x<cells[i].h> cell, which does not fit a <maxEdge>x<maxEdge> page (<sorted[i].absPath>). Raise --page-size, lower --padding, or leave this build unpacked — a packer cannot split one drawing across two pages.” | Raise --page-size, lower --padding, or leave the build unpacked. |
|
|
7421
|
+
| <a id="CE_ATLAS_IMAGE_DIMENSIONS_CHANGED"></a>`CE_ATLAS_IMAGE_DIMENSIONS_CHANGED` | “"<place.region>" measured <input.width>x<input.height> from its PNG header and decodes to <source.width>x<source.height> (<input.absPath>)” | Use the same PNG throughout the build; if unchanged input reproduces the mismatch, report it with the named file. |
|
|
7422
|
+
|
|
7423
|
+
|
|
7424
|
+
#### 5.1.17 Model writer defects
|
|
7425
|
+
|
|
7426
|
+
| Code | Fixed message text and alternatives | What to change |
|
|
7427
|
+
| --- | --- | --- |
|
|
7428
|
+
| <a id="CE_MODEL_INTERNAL_FIELD_UNREPRESENTABLE"></a>`CE_MODEL_INTERNAL_FIELD_UNREPRESENTABLE` | “internal: the model document has no place for field "<key>" of <where>; it writes [<keys.join(', ')>]”<br>Here the values named in the message include: “xy”, “slots”, “bones”, “blend”, “lengths”, “weighted”, “editorColor”, “attachments”, “skinRequired”, “ik”, “box”, “uvs”, “hull”, “icon”, “dark”, “name”, “path”, “kind”, “width”, “edges”, “float”, “atlas”, “start”, “count”, “audio”, “color”, “setup”, “shearY”, “closed”, “parent”, “shearX”, “events”, “source”, “height”, “convex”, “slider”, “string”, “digits”, “scaleY”, “deform”, “scaleX”, “volume”, “balance”, “offsetX”, “inverse”, “physics”, “offsetY”, “sequence”, “duration”, “bindings”, “vertices”, “rotation”, “timelines”, “triangles”, “transform”, “drawOrder”, “vertexCount”, “inheritMode”, “constraints”, “constantSpeed”, “originalWidth”, “originalHeight”. | Report this compiler bug with the inputs and named model field; the model writer lacks its representation. |
|
|
7429
|
+
| <a id="CE_MODEL_INTERNAL_NONFINITE_NUMBER"></a>`CE_MODEL_INTERNAL_NONFINITE_NUMBER` | “internal: the model document cannot carry <value> at <where>; JSON writes it as null”<br>Also: “no region "<value>" in <value>”<br>“manifest declares `image: null` and no states”<br>Here the values named in the message include: “/”, “rig”, “motion”, “physics”. | Report this compiler bug with the inputs and named model path; non-finite data reached the writer. |
|
|
7430
|
+
| <a id="CE_MODEL_INTERNAL_NEGATIVE_ZERO"></a>`CE_MODEL_INTERNAL_NEGATIVE_ZERO` | “internal: the model document cannot carry -0 at <where>; JSON writes it as 0” | Report this compiler bug with the inputs and named model path; -0 reached the writer. |
|
|
7431
|
+
| <a id="CE_MODEL_INTERNAL_UNDEFINED_ELEMENT"></a>`CE_MODEL_INTERNAL_UNDEFINED_ELEMENT` | “internal: the model document cannot carry undefined at <where>[<i>]; JSON writes it as null” | Report this compiler bug with the inputs and named model array path; undefined reached the writer. |
|
|
7432
|
+
| <a id="CE_MODEL_INTERNAL_NONPLAIN_VALUE"></a>`CE_MODEL_INTERNAL_NONPLAIN_VALUE` | “internal: the model document cannot carry <Object.prototype.toString.call(value)> at <where>; it writes plain data only” | Report this compiler bug with the inputs and named model path; a non-plain value reached the writer. |
|
|
7433
|
+
| <a id="CE_MODEL_INTERNAL_ATTACHMENT_KIND"></a>`CE_MODEL_INTERNAL_ATTACHMENT_KIND` | “internal: the model document knows no attachment kind "<String(entry.kind)>" at <where>” | Report this compiler bug with the inputs and named attachment; the writer knows no representation for its kind. |
|
|
7434
|
+
| <a id="CE_MODEL_INTERNAL_REGION_SOURCE"></a>`CE_MODEL_INTERNAL_REGION_SOURCE` | “internal: the region at <where> carries <entry.atlas === undefined ? 'neither an atlas rectangle nor a sequence' : 'both an atlas rectangle and a sequence'>; a region states exactly one of the two, and a sequence holds a rectangle per frame (issue #935)” | Report this compiler bug with the inputs and named region; exactly one atlas rectangle or sequence must reach the writer. |
|
|
7435
|
+
| <a id="CE_MODEL_INTERNAL_ATLAS_FIELD_REQUIRED"></a>`CE_MODEL_INTERNAL_ATLAS_FIELD_REQUIRED` | “internal: the atlas rectangle at <where> has no <key>; it states all of [<ATLAS_RECT_FIELDS.join(', ')>]”<br>Here the values named in the message include: “width”, “height”, “offsetX”, “offsetY”, “originalWidth”, “originalHeight”. | Report this compiler bug with the inputs and named atlas rectangle field. |
|
|
7436
|
+
| <a id="CE_MODEL_INTERNAL_EDITOR_ORDER"></a>`CE_MODEL_INTERNAL_EDITOR_ORDER` | “internal: the model's editor order is not its own: <problems.join('; ')>”<br>Also: “editorOrder.skins[<value>] "<value>".slots”<br>“<value> lists [<value>], the model holds [<value>]”<br>Here the values named in the message include: “editorOrder.animations”. | Report this compiler bug with the inputs and printed editor-order faults. |
|
|
7437
|
+
| <a id="CE_MODEL_INTERNAL_DOCUMENT_FIELD"></a>`CE_MODEL_INTERNAL_DOCUMENT_FIELD` | “internal: the model document has no place for the model's field "<key>"; it writes [<MODEL_DOCUMENT_FIELDS.join(', ')>] and leaves out [<MODEL_DOCUMENT_LEFT_OUT.join(', ')>]”<br>Here the values named in the message include: “rig”, “skins”, “slots”, “stage”, “bones”, “events”, “images”, “meshes”, “physics”, “meshBones”, “pageGrids”, “setupWorld”, “animations”, “editorOrder”, “absentParts”, “constraints”, “droppedStates”, “referenceScale”, “deformTransforms”, “trackDerivations”. | Report this compiler bug with the inputs and named model-document field; the writer lacks its representation. |
|
|
7438
|
+
|
|
7439
|
+
|
|
7440
|
+
#### 5.1.18 Motion parser
|
|
7441
|
+
|
|
7442
|
+
| Code | Fixed message text and alternatives | What to change |
|
|
7443
|
+
| --- | --- | --- |
|
|
7444
|
+
| <a id="CE_MOTION_FIELD_SHAPE"></a>`CE_MOTION_FIELD_SHAPE` | “"lag" is seconds added to every key time of this track, so a finite number — a string is CONCATENATED onto each time and a boolean adds 1”<br>“"stagger" is the extra per-member delay inside a group, in seconds, so a finite number”<br>“4.3 writes this group as `<group>.<constraint>`, so the constraint name is the only target there is”<br>“<group === 'ik' ? 'an ik' : 'a transform'> timeline is an object of `{ constraint, keys }`”<br>“<typeof v === 'object' ? 'an' : 'a'> <typeof v>”<br>“<where>: `<key>` is <describe(is)>; <hint>”<br>“a <group> key is an object of `{ t, … }`”<br>“a deform key is an object of `{ t, vertices? \| transform? }`”<br>“a deform timeline is an object of `{ skin?, slot, attachment, keys }`”<br>“a deform timeline keys one attachment of one slot, named here”<br>“a draw-order key is an object of `{ t, offsets? }`”<br>“a duration is a length of time, so it is not negative”<br>“a key is an object of `{ t, v, … }`”<br>“a key states its time in seconds, as a finite number”<br>“a mix pair is `["<from animation>", "<to animation>", <seconds>]` — three entries, two names and a duration”<br>“a named easing is FOUR finite numbers — the graph-view handles [hx1, hy1, hx2, hy2]. Nothing downstream counts them, so a short or non-numeric array reaches the artifact as a curve with a `null` in it”<br>“a physics constraint drives one bone, named here”<br>“a physics constraint is an object naming the bone it drives and the components it drives it in”<br>“a sequence key is an object of `{ t, mode?, index?, delay? }`”<br>“a sequence mode is one of the <SEQUENCE_MODES.length> the format has — <SEQUENCE_MODES.join(', ')> (absent means "hold"). The parser reads `SequenceMode[mode]`, which is undefined for anything else, and stores mode bits 0: the key would load without a word and play as "hold"”<br>“a sequence timeline is an object of `{ skin?, slot, attachment, keys }`”<br>“a sequence timeline steps one attachment of one slot, named here”<br>“a setup colour is [r, g, b, a], four finite numbers in 0..1 — a channel that is not one is clamped to `NaN` and written into the slot as the text "NaN"”<br>“a setup entry is an object of `{ attachment?: string \| null, color?: [r, g, b, a] }` — to show nothing there write `"<slot>": { "attachment": null }`, and to show an attachment write `"<slot>": { "attachment": "<name>" }`”<br>“a track is an object naming one target, one property and its keys”<br>“a track states the property it keys — the table is AUTHORING §4.4”<br>“a track's "<field>" is the name of the <field === 'slot' \|\| field === 'bone' ? field : `${field} it targets`>”<br>“absent”<br>“an animation declares its duration in seconds, as a finite number — it is checked against the compiled last key (rule R7), and a comparison against a non-number is silently false”<br>“an animation is an object of `{ duration, tracks, … }`”<br>“an array of <v.length>”<br>“an event key is an object of `{ t, name, … }`”<br>“every tuning field of a physics constraint is a finite number — a non-number is rounded to `NaN` and emitted as `null`, which the runtime reads as zero”<br>“it is `{ "default": <seconds>, "pairs"?: [["<from>", "<to>", <seconds>], …] }`”<br>“it is a player hint, so true or false (absent means the player decides)”<br>“it is a table keyed by animation name, `{ "<name>": { "duration": …, "tracks": [...] } }` (write `{}` for a static rig)”<br>“it is a table keyed by constraint name, `{ "<name>": { "bone": … } }`”<br>“it is a table keyed by group name, `{ "<group>": ["<member>", …] }`”<br>“it is a table keyed by slot name, `{ "<slot>": { "attachment": … } }`”<br>“it is a table of named handles, `{ "<name>": [hx1, hy1, hx2, hy2] }` (write `{}` if this spec names none)”<br>“it is an array of `["<from>", "<to>", <seconds>]` triples”<br>“it is an array of `{ "constraint": "<name>", "keys": [...] }` entries — one per <group> constraint”<br>“it is an array of `{ <target>, property, keys }` tracks (write `[]` for an animation whose timelines are all in the families beside it)”<br>“it is an array of `{ slot, attachment, keys }` entries — one per skin/slot/attachment triple”<br>“it is an array of `{ slot, offset }` moves. Omit the field entirely to restore the setup draw order — a malformed one used to BE that restore key, silently”<br>“it is an array of `{ t, mode?, index?, delay? }` keys”<br>“it is an array of `{ t, name }` firings — one timeline per animation, naming no target”<br>“it is an array of `{ t, offsets? }` keys — one timeline per animation, naming no target”<br>“it is an array of `{ t, v }` keys”<br>“it is an array of keys, each a sparse edit of the setup geometry”<br>“it is an array of keys, each naming the same set of mix fields”<br>“it is an attachment name, or null for "show nothing"”<br>“it is how many places later the slot is drawn, so a number (negative moves it earlier)”<br>“it is prose for a reader”<br>“it is the 0-based frame this key starts on, so a whole number of at least 0 — the runtime stores it as `index << 4`, which truncates a fraction (1.5 showed frame 1) and puts a negative one before the series”<br>“it is the attachment's placeholder name inside that skin and slot”<br>“it is the seconds each frame shows for, so a finite number of at least 0”<br>“it names an entry of this spec's `easings` table, or is "stepped"”<br>“it names the cut these keys were authored for”<br>“it names the rig this spec was authored against, and must equal that rig spec's own `name`”<br>“it names the skin the attachment lives in; absent means "default"”<br>“it names the slot this key moves”<br>“null”<br>“one moved slot is `{ "slot": "<name>", "offset": <places later> }`”<br>“the default mix duration is a finite number of seconds”<br>“the empty name is how a skeleton file spells a physics timeline that names no constraint, and a motion spec spells that "<EVERY_GLOBAL_PHYSICS>" — it drives every physics constraint that declares the keyed property global (`"strengthGlobal": true` for `strength`). Name one constraint, or write "<EVERY_GLOBAL_PHYSICS>"”<br>“the string <JSON.stringify(v)>”<br>Here the values named in the message include: “loopReverse”, “onceReverse”, “pingpongReverse”, “*”. | Repair the named motion field using the exact shape, type, value range or spelling printed after the semicolon; the complete alternatives below cover every parser field. |
|
|
7445
|
+
| <a id="CE_MOTION_PHYSICS_NAME_RESERVED"></a>`CE_MOTION_PHYSICS_NAME_RESERVED` | “<where>: `<key>` names a physics constraint "<EVERY_GLOBAL_PHYSICS>", and that name is reserved: a track's `"physics": "<EVERY_GLOBAL_PHYSICS>"` is the timeline that names no constraint and drives every one declaring the keyed property global, so a constraint called "<EVERY_GLOBAL_PHYSICS>" could not be keyed by name. Give it another name”<br>Also: “physics."<value>"”<br>Here the values named in the message include: “*”. | Give the declared physics constraint a name other than *; * is the global-physics timeline target. |
|
|
7446
|
+
| <a id="CE_MOTION_SEQUENCE_ADVANCE_ZERO_DELAY"></a>`CE_MOTION_SEQUENCE_ADVANCE_ZERO_DELAY` | “<where>: `<kat>` plays "<mode>" at a delay of 0{ — it states none, and the parser carries the previous key's (<j === 0 ? 'there is none, so 0' : '0'>) / }. The runtime advances the frame by `(time - keyTime) / delay`, which is Infinity at 0, and `Infinity \| 0` is 0 — so the key shows its first frame for as long as it lasts, which is "hold" spelt as "<mode>". State the seconds per frame, or write "hold"”<br>Also: “<value>.keys[<value>]”<br>“animations."<value>"”<br>“<value>.sequence[<value>]” | State positive seconds per frame for advancing sequence modes, or use hold. |
|
|
7447
|
+
| <a id="CE_MOTION_SPEC_OBJECT"></a>`CE_MOTION_SPEC_OBJECT` | “<where>: a motion spec must be a JSON object, and this file holds <describe(raw)>”<br>Also: “the string <value>”<br>“an array of <value>”<br>Here the values named in the message include: “null”, “absent”. | Write the motion spec root as a JSON object. |
|
|
7448
|
+
| <a id="CE_MOTION_SPEC_VERSION"></a>`CE_MOTION_SPEC_VERSION` | “<where>: unknown motion spec version: <String(raw.spec)>, expected "<MOTION_SPEC_VERSION>"”<br>Here the values named in the message include: “rigc-motion/1”. | Set spec to the motion version named in the error. |
|
|
7449
|
+
| <a id="CE_MOTION_ANIMATION_NAME_EMPTY"></a>`CE_MOTION_ANIMATION_NAME_EMPTY` | “<where>: an animation has an empty name” | Give the animation a non-empty name. |
|
|
7450
|
+
|
|
7451
|
+
|
|
7452
|
+
#### 5.1.19 Spine emitter defects
|
|
7453
|
+
|
|
7454
|
+
| Code | Fixed message text and alternatives | What to change |
|
|
7455
|
+
| --- | --- | --- |
|
|
7456
|
+
| <a id="CE_EMIT_INTERNAL_WEIGHT_BONE_UNKNOWN"></a>`CE_EMIT_INTERNAL_WEIGHT_BONE_UNKNOWN` | “internal: a weighted vertex binds bone "<bone>", which is not in the model's bone list” | Report this compiler bug with the inputs and named bone; an unresolved weight reached the Spine emitter. |
|
|
7457
|
+
| <a id="CE_EMIT_INTERNAL_CONSTRAINT_FIELDS"></a>`CE_EMIT_INTERNAL_CONSTRAINT_FIELDS` | “internal: <model.kind> constraint "<model.name>" carries <stray.join(', ')>, which the emitter has no place for” | Report this compiler bug with the inputs and named constraint fields; the Spine emitter cannot represent them. |
|
|
7458
|
+
| <a id="CE_EMIT_INTERNAL_DRAW_ORDER_SHAPE"></a>`CE_EMIT_INTERNAL_DRAW_ORDER_SHAPE` | “internal: a draw-order key at t=<key.time> carries offsets that are not slot/offset moves” | Report this compiler bug with the inputs and named key time; malformed moves reached the Spine emitter. |
|
|
7459
|
+
| <a id="CE_EMIT_INTERNAL_DRAW_ORDER_SLOT_UNKNOWN"></a>`CE_EMIT_INTERNAL_DRAW_ORDER_SLOT_UNKNOWN` | “internal: a draw-order key at t=<key.time> moves slot "<slot>", which is not in the model's slot list” | Report this compiler bug with the inputs and named slot; an unresolved draw-order move reached the Spine emitter. |
|
|
7460
|
+
| <a id="CE_EMIT_INTERNAL_ANIMATION_UNKNOWN"></a>`CE_EMIT_INTERNAL_ANIMATION_UNKNOWN` | “internal: the animation order named "<name>", which is not in the model” | Report this compiler bug with the inputs and named animation; the emitter's animation order names no model animation. |
|
|
7461
|
+
|
|
7462
|
+
|
|
7463
|
+
#### 5.1.20 Shared spec field refusals
|
|
7464
|
+
|
|
7465
|
+
| Code | Fixed message text and alternatives | What to change |
|
|
7466
|
+
| --- | --- | --- |
|
|
7467
|
+
| <a id="CE_KEYS_UNKNOWN_FIELD"></a>`CE_KEYS_UNKNOWN_FIELD` | “<where>: <what> has <strays.length === 1 ? 'a key' : `${strays.length} keys`> this compiler does not read: <named.join(', ')>. Nothing reads such a key, so it would be dropped from the emitted skeleton in silence — fix the spelling or remove it. {This shape has no fields at all. / Known here: <[...known].sort().join(', ')>.}”<br>“{"<key>" / "<key>" (did you mean <near.map((n) => `"${n}"`).join(', ')>?)}”<br>Also: “skin "<value>" slot "<value>" attachment "<value>"”<br>“<value> generator.bones[<value>]”<br>“{constraint "<value>" / constraints[<value>]}”<br>“<value>.transform.envelope”<br>“<value> weights[<value>][<value>]”<br>“invariants.deformMayFold[<value>]”<br>“animations."<value>"”<br>“<value>.offsets[<value>]”<br>“{stop "<value>" / stops[<value>]}”<br>“<value> properties."<value>".to."<value>"”<br>“this rig spec”<br>“<value>.derive”<br>“setup."<value>"”<br>“physics."<value>"”<br>“<value>'s "lower"”<br>“<value> "sequence"”<br>“<value> generator.bias”<br>“<value> generator.depth”<br>“<value>.events[<value>]”<br>“<value>.tracks[<value>]”<br>“invariants.axes[<value>]”<br>“<value> generator.falloff”<br>“<value>.drawOrder[<value>]”<br>“<value> generator.influence”<br>“invariants.detached[<value>]”<br>“{slot "<value>" / slots[<value>]}”<br>“invariants.consumerDrivenMix[<value>]”<br>“event "<value>"”<br>“<value>'s "from"”<br>“this motion spec”<br>“{absent / <value>}”<br>“{region / <value>}”<br>“<value>.keys[<value>]”<br>“<value> generator.soft”<br>“{linkedmesh / <value>}”<br>“<value>.deform[<value>]”<br>“<value>.sequence[<value>]”<br>“<value> generator (<value>)”<br>“{bone "<value>" / bones[<value>]}”<br>Here the values named in the message include: “uvs”, “mixX”, “blend”, “scaleX”, “groups”, “radius”, “images”, “axisBone”, “maxBones”, “massBone”, “softness”, “timelines”, “archetype”, “rotateMode”, “windGlobal”, “localTarget”, “spacingMode”, “positionMode”, “inertiaGlobal”, “dampingGlobal”, “gravityGlobal”, “strengthGlobal”, “skeleton.stageBox”, “invariants.idleDrivesMeshes”, “ik”, “lag”, “why”, “cut”, “fps”, “icon”, “dark”, “cols”, “kind”, “hull”, “cell”, “path”, “loop”, “mask”, “ease”, “ramp”, “note”, “mode”, “size”, “rows”, “mixY”, “alpha”, “pairs”, “inner”, “curve”, “limit”, “edges”, “float”, “start”, “audio”, “along”, “clamp”, “width”, “skins”, “links”, “chain”, “phase”, “about”, “power”, “count”, “color”, “gamma”, “index”, “delay”, “shearY”, “source”, “convex”, “target”, “amount”, “volume”, “shearX”, “slider”, “string”, “center”, “parent”, “closed”, “zScale”, “inward”, “margin”, “across”, “height”, “digits”, “scaleY”, “anchor”, “degrees”, “inverse”, “stretch”, “easings”, “against”, “default”, “inherit”, “lengths”, “carried”, “balance”, “stagger”, “outward”, “through”, “vertices”, “axis_deg”, “contrast”, “compress”, “notUnder”, “property”, “duration”, “controls”, “additive”, “rotation”, “triangles”, “mixScaleY”, “mixScaleX”, “mixShearY”, “tolerance”, “mixRotate”, “meshSlots”, “minWeight”, “mixGlobal”, “amplitude”, “massGlobal”, “meshCenter”, “fromVertex”, “slotWindow”, “wavelength”, “"skeleton"”, “attachments”, “vertexCount”, “maxVertices”, “localSource”, “"invariants"”, “bendPositive”, “boneIndexing”, “constantSpeed”, “meshTriangles”, “referenceScale”. | Fix each printed stray key's spelling using the suggested or known names, or remove it. |
|
|
7468
|
+
| <a id="CE_KEYS_NUMBER_FLOAT32_FINITE"></a>`CE_KEYS_NUMBER_FLOAT32_FINITE` | “<where>: <place(path)> is <String(node)>; a number in this file is finite at float32 precision, at most ±<String(FLOAT32_MAX)>, because the skeleton is written as float32 — past that it would be emitted as Infinity, which JSON writes as null, a value the file never stated.<why>”<br>“{ / { This one is finite as a double and has no float32 but Infinity. / JSON has no spelling for Infinity: a literal past ±1.7976931348623157e308, such as 1e309, parses to it.}}” | State a finite number whose float32 rounding stays finite; inspect the printed path and magnitude. |
|
|
7469
|
+
| <a id="CE_KEYS_FIELD_VALUE_TYPE"></a>`CE_KEYS_FIELD_VALUE_TYPE` | “<where>: <visit.name([key, ...wrong.tail])> is <typeFound(wrong.value)>; <wrong.required> is required”<br>“a boolean (true or false)”<br>“a number”<br>“a number or null”<br>“a string”<br>“a string or null”<br>“an array of arrays of numbers”<br>“an array of numbers”<br>“an array of numbers, or null”<br>“an array of strings”<br>“an object whose every value is a string or null”<br>“an object whose every value is an array of numbers”<br>“an object whose every value is an array of strings” | Replace the named field or element with the required JSON type printed in the message. |
|
|
7470
|
+
| <a id="CE_KEYS_ENUM_VALUE"></a>`CE_KEYS_ENUM_VALUE` | “<where>: <visit.name([key])> is <JSON.stringify(value) ?? String(value)>; one of <rule.set.map((name) => JSON.stringify(name)).join(', ')> — <rule.readAs>”<br>“anything else was read as a ribbon by the mesh checks and as a ring by the control-bone reader and the geometry builder, so the refusal it got named a fault the part did not have”<br>“anything else was read as no rotation source, and the bone was emitted without the setup rotation it asked for”<br>“anything else was read as the default "name" in silence: a weighted "vertices" run was refused as unflagged, and every other attachment built byte for byte as if the key were absent” | Choose one of the printed names for the named field; the readAs explanation describes why another spelling changes its meaning. |
|
|
7026
7471
|
|
|
7027
7472
|
### 5.2 Assertions — the gate
|
|
7028
7473
|
|