rig-c 0.0.0-stage → 2.20.4
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 +1188 -0
- package/src/meshquality.ts +2042 -0
- package/src/meshrasters.ts +944 -0
- package/src/meshreduce.ts +1425 -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/tools/contact.ts
ADDED
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Contact depth — how far one plate may advance before its body pixels meet
|
|
3
|
+
* another plate's.
|
|
4
|
+
*
|
|
5
|
+
* The rule it makes mechanical is "the advance goes at most until the moving
|
|
6
|
+
* mass touches the part that occludes it", which turns the deepest inward
|
|
7
|
+
* amplitude from a number somebody picks into a fact about two plates.
|
|
8
|
+
*
|
|
9
|
+
* ⭐ Why it is DERIVED and not a constant: this is the same principle as the
|
|
10
|
+
* axis angle. One measured manifest fact, no per-cut code — a different cut with
|
|
11
|
+
* the masses placed differently gets a different, correct depth for free.
|
|
12
|
+
*
|
|
13
|
+
* The measurement is a 2-D one, not a projection of two edges, and it has to be:
|
|
14
|
+
* an occluder is often a horseshoe, so along the axis centreline there may be
|
|
15
|
+
* nothing to collide with at all. A mass wider than the corridor meets the
|
|
16
|
+
* corridor's flanks instead. Reducing this to "leading edge versus boundary" on
|
|
17
|
+
* the axis line would return infinity.
|
|
18
|
+
*
|
|
19
|
+
* ⚠️ Both plates are static in the rig — the mass rides a bone that does not
|
|
20
|
+
* stroke. That is exactly why the gap between them IS the room: advancing the
|
|
21
|
+
* inserting side by d moves the mass and the part together, so the largest d that
|
|
22
|
+
* keeps the two footprints disjoint is the deepest the part may be driven.
|
|
23
|
+
*/
|
|
24
|
+
import type { Plate } from './plate.ts';
|
|
25
|
+
|
|
26
|
+
/** Alpha at or above this reads as body. */
|
|
27
|
+
export const BODY_ALPHA = 128;
|
|
28
|
+
|
|
29
|
+
export interface PlateFootprint {
|
|
30
|
+
plate: Plate;
|
|
31
|
+
/** Window top-left in crop pixels. */
|
|
32
|
+
offset: [number, number];
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
export interface ContactResult {
|
|
36
|
+
/**
|
|
37
|
+
* Do the two footprints meet at all within the search range?
|
|
38
|
+
*
|
|
39
|
+
* ⚠️ Not a formality. Two cuts may share plates and differ only in axis, and
|
|
40
|
+
* along one of those axes the mass can miss the occluder entirely — it goes
|
|
41
|
+
* past it. `depth` is then the scan limit, which is a sentinel and not a
|
|
42
|
+
* measurement, and writing it into a manifest as a number would hand that cut a
|
|
43
|
+
* 4096px ceiling that reads as real. When this is false the correct manifest
|
|
44
|
+
* value is null: the rule imposes no ceiling because the bodies never meet.
|
|
45
|
+
*/
|
|
46
|
+
touches: boolean;
|
|
47
|
+
/** Largest inward advance, in axis pixels, that keeps the footprints disjoint. */
|
|
48
|
+
depth: number;
|
|
49
|
+
/** Overlapping body pixels at `depth` (must be 0) and at `depth + 1` (must be > 0). */
|
|
50
|
+
overlapAtDepth: number;
|
|
51
|
+
overlapPastDepth: number;
|
|
52
|
+
/** Where they first meet, in crop pixels — the mass pixel that lands on the other plate. */
|
|
53
|
+
contactPoint: [number, number] | null;
|
|
54
|
+
massPixels: number;
|
|
55
|
+
againstPixels: number;
|
|
56
|
+
alphaThreshold: number;
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
/** Points of a plate whose alpha reads as body, in crop pixels. */
|
|
60
|
+
function bodyPixels(f: PlateFootprint, threshold: number): Array<[number, number]> {
|
|
61
|
+
const out: Array<[number, number]> = [];
|
|
62
|
+
for (let y = 0; y < f.plate.height; y++) {
|
|
63
|
+
for (let x = 0; x < f.plate.width; x++) {
|
|
64
|
+
if (f.plate.data[(y * f.plate.width + x) * 4 + 3] >= threshold) out.push([f.offset[0] + x, f.offset[1] + y]);
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
return out;
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
/**
|
|
71
|
+
* Largest inward advance of `mass` that does not put any of its body pixels on a
|
|
72
|
+
* body pixel of `against`.
|
|
73
|
+
*
|
|
74
|
+
* Scans outward from 0 one pixel at a time rather than bisecting: the footprints
|
|
75
|
+
* are not convex (the horseshoe has a notch), so "disjoint at d" is not monotone
|
|
76
|
+
* in d and a bisection could sail straight past first contact.
|
|
77
|
+
*/
|
|
78
|
+
export function measureContactDepth(
|
|
79
|
+
mass: PlateFootprint,
|
|
80
|
+
against: PlateFootprint,
|
|
81
|
+
/** Inward unit vector in CROP space (y down). */
|
|
82
|
+
inward: [number, number],
|
|
83
|
+
limit = 4096,
|
|
84
|
+
threshold = BODY_ALPHA,
|
|
85
|
+
): ContactResult {
|
|
86
|
+
const massPoints = bodyPixels(mass, threshold);
|
|
87
|
+
const againstPoints = bodyPixels(against, threshold);
|
|
88
|
+
const occupied = new Set<number>();
|
|
89
|
+
for (const [x, y] of againstPoints) occupied.add(y * 8192 + x);
|
|
90
|
+
|
|
91
|
+
const overlapAt = (d: number): { count: number; first: [number, number] | null } => {
|
|
92
|
+
let count = 0;
|
|
93
|
+
let first: [number, number] | null = null;
|
|
94
|
+
for (const [x, y] of massPoints) {
|
|
95
|
+
const px = Math.round(x + inward[0] * d);
|
|
96
|
+
const py = Math.round(y + inward[1] * d);
|
|
97
|
+
if (!occupied.has(py * 8192 + px)) continue;
|
|
98
|
+
count++;
|
|
99
|
+
if (!first) first = [px, py];
|
|
100
|
+
}
|
|
101
|
+
return { count, first };
|
|
102
|
+
};
|
|
103
|
+
|
|
104
|
+
let depth = 0;
|
|
105
|
+
let contact: [number, number] | null = null;
|
|
106
|
+
let touches = false;
|
|
107
|
+
for (let d = 0; d <= limit; d++) {
|
|
108
|
+
const hit = overlapAt(d);
|
|
109
|
+
if (hit.count > 0) {
|
|
110
|
+
contact = hit.first;
|
|
111
|
+
touches = true;
|
|
112
|
+
break;
|
|
113
|
+
}
|
|
114
|
+
depth = d;
|
|
115
|
+
}
|
|
116
|
+
return {
|
|
117
|
+
touches,
|
|
118
|
+
depth,
|
|
119
|
+
overlapAtDepth: overlapAt(depth).count,
|
|
120
|
+
overlapPastDepth: overlapAt(depth + 1).count,
|
|
121
|
+
contactPoint: contact,
|
|
122
|
+
massPixels: massPoints.length,
|
|
123
|
+
againstPixels: againstPoints.length,
|
|
124
|
+
alphaThreshold: threshold,
|
|
125
|
+
};
|
|
126
|
+
}
|