rig-c 0.0.0-stage → 2.21.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/.claude-plugin/marketplace.json +19 -0
- package/.claude-plugin/plugin.json +13 -0
- package/LICENSE +30 -0
- package/NOTICE.md +145 -0
- package/README.md +817 -3
- package/bin/rigc.cjs +83 -0
- package/cli.ts +61 -0
- package/cli_core.ts +46 -0
- package/docs/AUTHORING.md +9923 -0
- package/docs/FACE.md +1948 -0
- package/docs/INGEST.md +1488 -0
- package/docs/MOTION.md +1241 -0
- package/docs/PROMPTING.md +109 -0
- package/docs/RIGGING.md +1441 -0
- package/docs/SPEC_COVERAGE.md +357 -0
- package/package.json +108 -4
- package/skills/rigc/SKILL.md +133 -0
- package/skills/rigc-face/SKILL.md +60 -0
- package/skills/rigc-ingest/SKILL.md +78 -0
- package/skills/rigc-motion/SKILL.md +51 -0
- package/skills/rigc-rigging/SKILL.md +49 -0
- package/src/areaband.ts +159 -0
- package/src/assertions/bodies/a01.ts +23 -0
- package/src/assertions/bodies/a02.ts +21 -0
- package/src/assertions/bodies/a03.ts +27 -0
- package/src/assertions/bodies/a04.ts +40 -0
- package/src/assertions/bodies/a05.ts +56 -0
- package/src/assertions/bodies/a06.ts +245 -0
- package/src/assertions/bodies/a07.ts +68 -0
- package/src/assertions/bodies/a08.ts +76 -0
- package/src/assertions/bodies/a09.ts +82 -0
- package/src/assertions/bodies/a10.ts +116 -0
- package/src/assertions/bodies/a11.ts +15 -0
- package/src/assertions/bodies/a12.ts +30 -0
- package/src/assertions/bodies/a13.ts +51 -0
- package/src/assertions/bodies/a14.ts +35 -0
- package/src/assertions/bodies/a15.ts +97 -0
- package/src/assertions/bodies/a16.ts +24 -0
- package/src/assertions/bodies/a17.ts +26 -0
- package/src/assertions/bodies/a18.ts +62 -0
- package/src/assertions/bodies/a19.ts +404 -0
- package/src/assertions/bodies/a20.ts +122 -0
- package/src/assertions/bodies/a21.ts +190 -0
- package/src/assertions/bodies/a22.ts +39 -0
- package/src/assertions/bodies/a23.ts +305 -0
- package/src/assertions/bodies/a24.ts +68 -0
- package/src/assertions/bodies/a25.ts +39 -0
- package/src/assertions/bodies/a26.ts +61 -0
- package/src/assertions/bodies/a27.ts +33 -0
- package/src/assertions/bodies/a28.ts +70 -0
- package/src/assertions/bodies/a29.ts +34 -0
- package/src/assertions/bodies/a30.ts +50 -0
- package/src/assertions/bodies/a31.ts +61 -0
- package/src/assertions/bodies/a32.ts +44 -0
- package/src/assertions/bodies/a33.ts +110 -0
- package/src/assertions/bodies/a34.ts +133 -0
- package/src/assertions/bodies/a35.ts +160 -0
- package/src/assertions/bodies/a36.ts +81 -0
- package/src/assertions/bodies/a37.ts +77 -0
- package/src/assertions/bodies/a38.ts +73 -0
- package/src/assertions/bodies/a39.ts +303 -0
- package/src/assertions/bodies/a40.ts +128 -0
- package/src/assertions/bodies/a42.ts +97 -0
- package/src/assertions/bodies/a43.ts +181 -0
- package/src/assertions/bodies/a44.ts +23 -0
- package/src/assertions/bodies/a45.ts +172 -0
- package/src/assertions/bodies/a46.ts +224 -0
- package/src/assertions/bodies/a47.ts +126 -0
- package/src/assertions/bodies/a48.ts +83 -0
- package/src/assertions/bodies/a49.ts +81 -0
- package/src/assertions/bodies/a50.ts +97 -0
- package/src/assertions/constraint_words.ts +169 -0
- package/src/assertions/emitted/index.ts +148 -0
- package/src/assertions/facts/animated_bones.ts +30 -0
- package/src/assertions/facts/animation_durations.ts +37 -0
- package/src/assertions/facts/atlas_pages.ts +19 -0
- package/src/assertions/facts/atlas_regions.ts +52 -0
- package/src/assertions/facts/bone_timelines.ts +37 -0
- package/src/assertions/facts/constraint_targets.ts +56 -0
- package/src/assertions/facts/constraints.ts +155 -0
- package/src/assertions/facts/deform_survey.ts +27 -0
- package/src/assertions/facts/event_keys.ts +55 -0
- package/src/assertions/facts/linked_meshes.ts +38 -0
- package/src/assertions/facts/mesh_attachments.ts +100 -0
- package/src/assertions/facts/region_joins.ts +34 -0
- package/src/assertions/facts/sequences.ts +85 -0
- package/src/assertions/facts/skeleton_roster.ts +45 -0
- package/src/assertions/facts/skin_entries.ts +37 -0
- package/src/assertions/facts/skin_members.ts +53 -0
- package/src/assertions/facts/slider_composition.ts +78 -0
- package/src/assertions/facts/slot_colour.ts +43 -0
- package/src/assertions/facts/stage.ts +27 -0
- package/src/assertions/facts/stage_box.ts +65 -0
- package/src/assertions/facts/stepped_poses.ts +74 -0
- package/src/assertions/facts/two_colour.ts +52 -0
- package/src/assertions/facts/vertex_polygons.ts +53 -0
- package/src/assertions/footprints.ts +367 -0
- package/src/assertions/harness.ts +109 -0
- package/src/assertions/inward_advance.ts +58 -0
- package/src/assertions/kinds.ts +105 -0
- package/src/assertions/mesh_kinds.ts +56 -0
- package/src/assertions/model/animated_bones.ts +38 -0
- package/src/assertions/model/animation_durations.ts +57 -0
- package/src/assertions/model/atlas_pages.ts +15 -0
- package/src/assertions/model/atlas_regions.ts +76 -0
- package/src/assertions/model/bone_timelines.ts +58 -0
- package/src/assertions/model/constraint_targets.ts +82 -0
- package/src/assertions/model/constraints.ts +233 -0
- package/src/assertions/model/declared.ts +125 -0
- package/src/assertions/model/deform_survey.ts +24 -0
- package/src/assertions/model/event_keys.ts +45 -0
- package/src/assertions/model/given.ts +45 -0
- package/src/assertions/model/index.ts +398 -0
- package/src/assertions/model/linked_meshes.ts +24 -0
- package/src/assertions/model/mesh_attachments.ts +119 -0
- package/src/assertions/model/parse.ts +146 -0
- package/src/assertions/model/region_joins.ts +67 -0
- package/src/assertions/model/runtime_timelines.ts +78 -0
- package/src/assertions/model/sequences.ts +157 -0
- package/src/assertions/model/skeleton_roster.ts +23 -0
- package/src/assertions/model/skin_entries.ts +69 -0
- package/src/assertions/model/skin_members.ts +64 -0
- package/src/assertions/model/slider_composition.ts +193 -0
- package/src/assertions/model/slot_colour.ts +81 -0
- package/src/assertions/model/stage.ts +28 -0
- package/src/assertions/model/stage_box.ts +51 -0
- package/src/assertions/model/stepped_poses.ts +105 -0
- package/src/assertions/model/two_colour.ts +61 -0
- package/src/assertions/model/vertex_polygons.ts +72 -0
- package/src/assertions/reasons.ts +129 -0
- package/src/assertions/region_lookups.ts +61 -0
- package/src/assertions/report.ts +189 -0
- package/src/assertions/values.ts +39 -0
- package/src/atlas.ts +2870 -0
- package/src/ballot.ts +866 -0
- package/src/bonedist.ts +643 -0
- package/src/chainfit.ts +2752 -0
- package/src/chains.ts +170 -0
- package/src/check.ts +4303 -0
- package/src/checkpics.ts +295 -0
- package/src/cli/core_commands.ts +1627 -0
- package/src/cli/repack.ts +414 -0
- package/src/cli/shared.ts +2776 -0
- package/src/cli/spine_commands.ts +820 -0
- package/src/compile.ts +9414 -0
- package/src/core/additive.ts +458 -0
- package/src/core/animation.ts +1050 -0
- package/src/core/clipping.ts +696 -0
- package/src/core/constraints.ts +1876 -0
- package/src/core/constraints_path.ts +964 -0
- package/src/core/constraints_physics.ts +881 -0
- package/src/core/constraints_slider.ts +635 -0
- package/src/core/deform.ts +613 -0
- package/src/core/draw_order.ts +125 -0
- package/src/core/events.ts +135 -0
- package/src/core/hooks.ts +249 -0
- package/src/core/index.ts +1400 -0
- package/src/core/raw.ts +739 -0
- package/src/core/skins.ts +129 -0
- package/src/core/uvs.ts +469 -0
- package/src/core/vertices.ts +490 -0
- package/src/core/walk.ts +197 -0
- package/src/core/world.ts +289 -0
- package/src/correspondence.ts +15 -0
- package/src/deformbuild.ts +60 -0
- package/src/deformgen.ts +630 -0
- package/src/deformmeasure.ts +732 -0
- package/src/deformreport.ts +373 -0
- package/src/deformstructure.ts +386 -0
- package/src/deformsurvey.ts +2162 -0
- package/src/depth.ts +784 -0
- package/src/diff.ts +2252 -0
- package/src/emit.ts +134 -0
- package/src/emit_spine.ts +854 -0
- package/src/errors.ts +53 -0
- package/src/framing.ts +819 -0
- package/src/generation.ts +139 -0
- package/src/ingest.ts +2293 -0
- package/src/json-position.ts +253 -0
- package/src/keyorder.ts +587 -0
- package/src/keys.ts +486 -0
- package/src/ladder.ts +121 -0
- package/src/mesh.ts +2382 -0
- package/src/meshcompare.ts +1191 -0
- package/src/meshquality.ts +2051 -0
- package/src/meshrasters.ts +944 -0
- package/src/meshreduce.ts +1444 -0
- package/src/model.ts +1245 -0
- package/src/motion.ts +809 -0
- package/src/nonfinite.ts +54 -0
- package/src/package_meta.ts +48 -0
- package/src/png.ts +297 -0
- package/src/pose.ts +2324 -0
- package/src/preview.ts +434 -0
- package/src/region_joins.ts +54 -0
- package/src/render.ts +1013 -0
- package/src/render_core.ts +871 -0
- package/src/render_shared.ts +2958 -0
- package/src/repack.ts +495 -0
- package/src/rig.ts +2941 -0
- package/src/slots.ts +892 -0
- package/src/spine_side.ts +138 -0
- package/src/timelines.ts +837 -0
- package/src/trackgen.ts +364 -0
- package/src/transform.ts +310 -0
- package/src/types.ts +1797 -0
- package/src/validate.ts +3875 -0
- package/tools/contact.ts +126 -0
- package/tools/editor_roundtrip.ts +1641 -0
- package/tools/font5x7.ts +101 -0
- package/tools/measure_contact_depth.ts +105 -0
- package/tools/plate.ts +508 -0
- package/tools/png_probe.mjs +72 -0
package/src/emit.ts
ADDED
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Writing the compiled atlas to disk with its pages copied alongside it — the
|
|
3
|
+
* step behind `build --copy-images` (issue #217).
|
|
4
|
+
*
|
|
5
|
+
* `compile()` never touches the filesystem for output; it only reads inputs and
|
|
6
|
+
* assembles text (see its own header). A page's name in that text is a path *as
|
|
7
|
+
* seen from the atlas file* — for the default emit `relative(outDir, absPath)`,
|
|
8
|
+
* for `--atlas-in` the imported pack's own page re-anchored the same way — so it
|
|
9
|
+
* points at wherever the source art already lives, which is very often outside
|
|
10
|
+
* `outDir` (`../parts/torso.png`). That is the right default for a build that
|
|
11
|
+
* sits beside the project that owns the art, and it is exactly what makes
|
|
12
|
+
* `--out` non-self-contained the moment the directory is zipped, committed or
|
|
13
|
+
* handed to someone who does not have that project.
|
|
14
|
+
*
|
|
15
|
+
* `copyAtlasPages` is the opt-in other half: copy every page the atlas names
|
|
16
|
+
* into the output directory and hand back the same atlas text with its page
|
|
17
|
+
* names rewritten to match. Nothing here runs unless `cli.ts` calls it, so the
|
|
18
|
+
* default emit (`buildAtlasText` in [`src/compile.ts`](compile.ts)) is untouched.
|
|
19
|
+
*
|
|
20
|
+
* ## 🚨 Why it reads the atlas rather than the image list (issue #693)
|
|
21
|
+
*
|
|
22
|
+
* It used to take `CompiledImage[]` and rebuild the text with
|
|
23
|
+
* `buildAtlasText` — one page per part, each region covering its page exactly.
|
|
24
|
+
* That is a true statement about the DEFAULT emit and about nothing else, and
|
|
25
|
+
* `--atlas-in` is the else: there the atlas is the imported pack, whose pages
|
|
26
|
+
* carry many regions at measured rectangles and whose page count has no relation
|
|
27
|
+
* to the number of parts. Rebuilding it from the image list wrote a file the
|
|
28
|
+
* pack never contained, in two shapes, both of them green at the gate because
|
|
29
|
+
* the gate had read the compile's text and the rebuild happened after it:
|
|
30
|
+
*
|
|
31
|
+
* * a rig that declares no `image` at all — which is what `ingest --art none`
|
|
32
|
+
* writes, and it is the documented route for rebuilding somebody's export —
|
|
33
|
+
* has an EMPTY image list, so the rebuilt atlas was `writeAtlasText([])`:
|
|
34
|
+
* **zero bytes**. `validate` on the directory then reported
|
|
35
|
+
* `A00_ROUNDTRIP_PARSE` and one `A08` per attachment, on all 10 corpus
|
|
36
|
+
* rebuilds;
|
|
37
|
+
* * a rig that does declare parts got one fabricated page per part, all of
|
|
38
|
+
* them named after the pack's single page and each claiming the drawing's
|
|
39
|
+
* own size: 24 pages called `skeleton.png` declaring 800x880, 440x448, …
|
|
40
|
+
* against one 1024x2048 PNG, and 24 `A06` failures on the written directory.
|
|
41
|
+
*
|
|
42
|
+
* The pages an atlas names are the pages an atlas has. Reading them out of the
|
|
43
|
+
* text is the one rule that is true of both emits — and on the default emit it
|
|
44
|
+
* reproduces the old text byte for byte, because there the page list and the
|
|
45
|
+
* image list are the same list (`PKR44`).
|
|
46
|
+
*/
|
|
47
|
+
import { copyFileSync, mkdirSync } from 'node:fs';
|
|
48
|
+
import { basename, extname, join, resolve } from 'node:path';
|
|
49
|
+
import { parseAtlasText, rewritePageNames } from './atlas.ts';
|
|
50
|
+
|
|
51
|
+
/** One page's source and where `--copy-images` put it. */
|
|
52
|
+
export interface CopiedPage {
|
|
53
|
+
/** The page name as the atlas spelled it: a path relative to the atlas file. */
|
|
54
|
+
from: string;
|
|
55
|
+
/** Filename inside the output directory — also the atlas's new page name. */
|
|
56
|
+
to: string;
|
|
57
|
+
/** How many regions ride on this page, so a shared page says so. */
|
|
58
|
+
regions: number;
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
export interface CopyImagesResult {
|
|
62
|
+
/** The atlas text, with every page name rewritten to its `to` filename. */
|
|
63
|
+
atlasText: string;
|
|
64
|
+
pages: CopiedPage[];
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
/**
|
|
68
|
+
* Copy every page `atlasText` names into `outDir` and return the same text with
|
|
69
|
+
* the page names rewritten to the copies.
|
|
70
|
+
*
|
|
71
|
+
* `atlasText` is the text that is about to be written INTO `outDir`, so its page
|
|
72
|
+
* names resolve against `outDir` — the same anchor `A06` and `A17` read them
|
|
73
|
+
* with, which is what makes "the pages this atlas names" one thing rather than
|
|
74
|
+
* two.
|
|
75
|
+
*
|
|
76
|
+
* ## Naming and collisions
|
|
77
|
+
*
|
|
78
|
+
* A page's filename in `outDir` is its source basename, unchanged. Two pages
|
|
79
|
+
* that live in different directories can still share one, and a case-insensitive
|
|
80
|
+
* filesystem (the macOS default) can collide two the atlas saw as distinct. On a
|
|
81
|
+
* genuine collision the second and later claimants get `-2`, `-3`, … inserted
|
|
82
|
+
* before the extension, assigned in the order the atlas lists its pages — which
|
|
83
|
+
* is also the order the rewritten text carries them in, so the mapping is
|
|
84
|
+
* identical on every run over the same text. The rewritten atlas is the record
|
|
85
|
+
* of it: reading a page name back out says exactly which file it is, with no
|
|
86
|
+
* side table to fall out of sync.
|
|
87
|
+
*
|
|
88
|
+
* ⚠️ A page that ALREADY sits in `outDir` under the name it would be copied to
|
|
89
|
+
* is left alone. There is nothing to move, and `copyFileSync` onto the path it
|
|
90
|
+
* is reading is not a defined way to say so.
|
|
91
|
+
*/
|
|
92
|
+
export function copyAtlasPages(atlasText: string, outDir: string): CopyImagesResult {
|
|
93
|
+
mkdirSync(outDir, { recursive: true });
|
|
94
|
+
const planned = plannedPageCopies(atlasText, outDir);
|
|
95
|
+
for (const page of planned.pages) {
|
|
96
|
+
const source = resolve(outDir, page.from);
|
|
97
|
+
const destination = join(outDir, page.to);
|
|
98
|
+
if (source !== resolve(destination)) copyFileSync(source, destination);
|
|
99
|
+
}
|
|
100
|
+
return planned;
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
/**
|
|
104
|
+
* What `copyAtlasPages` will do, without doing it: the rewritten atlas text
|
|
105
|
+
* and each page's source and copy name, from the text and `outDir` alone — no
|
|
106
|
+
* file is read or written (issue #1016). `build --copy-images` spells the
|
|
107
|
+
* model document from this text BEFORE the gate, because the document states
|
|
108
|
+
* where each region sits on its page (`pages`) and the copy renames every
|
|
109
|
+
* page; `copyAtlasPages` returns exactly this, after copying.
|
|
110
|
+
*/
|
|
111
|
+
export function plannedPageCopies(atlasText: string, outDir: string): CopyImagesResult {
|
|
112
|
+
const parsed = parseAtlasText(atlasText);
|
|
113
|
+
const claimedBy = new Map<string, string>(); // destination filename -> absolute source holding it
|
|
114
|
+
const pages: CopiedPage[] = [];
|
|
115
|
+
|
|
116
|
+
for (const page of parsed.pages) {
|
|
117
|
+
const source = resolve(outDir, page.name);
|
|
118
|
+
const original = basename(page.name);
|
|
119
|
+
let name = original;
|
|
120
|
+
if (claimedBy.has(name) && claimedBy.get(name) !== source) {
|
|
121
|
+
const ext = extname(original);
|
|
122
|
+
const stem = original.slice(0, original.length - ext.length);
|
|
123
|
+
let n = 2;
|
|
124
|
+
do {
|
|
125
|
+
name = `${stem}-${n}${ext}`;
|
|
126
|
+
n++;
|
|
127
|
+
} while (claimedBy.has(name) && claimedBy.get(name) !== source);
|
|
128
|
+
}
|
|
129
|
+
claimedBy.set(name, source);
|
|
130
|
+
pages.push({ from: page.name, to: name, regions: page.regions.length });
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
return { atlasText: rewritePageNames(parsed, (_name, index) => pages[index].to), pages };
|
|
134
|
+
}
|