rig-parts 1.88.0 → 2.0.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/docs/AUTHORING.md +3 -3
- package/docs/STABILITY.md +18 -10
- package/package.json +2 -2
- package/src/apng.ts +2 -2
- package/src/check.ts +6 -6
- package/src/config.ts +2 -2
- package/src/coords.ts +3 -3
- package/src/instruments.ts +1 -1
- package/src/propose.ts +1 -1
- package/src/raster/png.ts +7 -7
- package/src/raster/types.ts +1 -1
- package/src/remesh.ts +2 -2
- package/src/requirements.ts +2 -2
- package/src/rig.ts +2 -2
- package/src/scene.ts +1 -1
- package/src/sheet.ts +1 -1
- package/src/structure.ts +2 -2
- package/src/turn.ts +1 -1
- package/src/turncoverage.ts +2 -2
- package/src/turnoverlap.ts +1 -1
package/docs/AUTHORING.md
CHANGED
|
@@ -173,7 +173,7 @@ read by no CPU stage).
|
|
|
173
173
|
| `motion.blink.still` | rig | **proposed** only for a lash `propose` notes (below), then checked: `{<part>: {row, bone}}` — the rows of that region part above `row` (rig px, y down) are drawn by a second slot `<part>_still` on `bone` and do not blink; rows from `row` down keep the part's slot and blink. The part must be a region on a bone `eyes` names, `bone` one it does not (`CONFIG_STILL_OFF_THE_BLINK`), and `row` a row of the part with no art across its whole width (`RIG_STILL_ROW_CLEAR`) |
|
|
174
174
|
| `motion.animations_from` | rig; check (named; read for folds) | optional, never proposed (issue #183): a path, relative to the config file's directory, to a file in rig-c's motion-spec shape, `{"spec": "rigc-motion/1", "animations": {"<name>": {"duration": …, "tracks": [...]}, …}}` — an expression, a gesture, anything beside the idle. On every `rig` and `build` each of its animations is written into `rig/motion.json` after `idle`, as read: nothing added, re-keyed or judged here (except `derive` keys on `turn`/`tilt`, issue #436, and `{"t": …, "set": "<name>" \| null}` keys on slot `"attachment"` tracks, issue #473, which expand to `"v": "<set>_<slot>"` or `"v": null` when the set hides the slot, or `"v": "<slot>"` for `null`, refused with `CONFIG_SET_COVERS_SLOT` when the set is undeclared or does not cover the track's slot), and each is rigc's to accept or refuse at the rig stage's gate, in rigc's words. It may name what `motion.json` already holds — the bones `bones` declares, the easings `shut` and `open`, the groups `eyes` and `brows` when the blink writes them — and nothing else from the file reaches it. The loader refuses, every problem at once: no such file or one that cannot be read (`CONFIG_FILE_PRESENT`), text that is not JSON (`CONFIG_IS_JSON`), a file that is not an object, a `spec` other than `"rigc-motion/1"`, an `animations` that is not a table of objects (`CONFIG_FIELD_TYPE`), any other key — rig-c's `easings`, `groups`, `setup`, `physics`, `mix`, `archetype` and `cut` included, which would be read and not written (`CONFIG_KEY_KNOWN`), an animation named `idle` (`CONFIG_ANIMATION_NAME_FREE`), and a key written twice in one object of the file, which JSON would fold into its last value without a word (`CONFIG_KEY_UNIQUE`). `check` names the others on one line (`beside the idle: …`) and reads each for folds, with the idle — `ANIMATIONS_DO_NOT_FOLD` (§7, issues #320, #333); every other bar reads the idle. Absent, `motion.json` holds the idle alone, byte for byte as before, and `check` reads that idle for folds |
|
|
175
175
|
| `constraints` | rig (handed to rig-c as `rig.json`'s `constraints`); `compare` and the coverage lines (roles) | **authored**, optional; `propose` writes none, but with `--cloth` (issue #364), where it writes the recipe's physics and swing transforms (*Recipe: cloth and hair that answer the world*, below). A list of constraints in **rig-c's own rig-spec shape** (`RigConstraint`: `ik`, `transform`, `path`, `physics`, `slider` — rig-c's `src/rig.ts` documents every field), in the order rigc applies them. The loader checks only what this package owns: each entry is an object with a `type` rigc names (`CONFIG_CONSTRAINT_TYPE_KNOWN`) and a non-empty `name`, unique within its kind as rigc finds constraints (`CONFIG_CONSTRAINT_NAME_UNIQUE`; an ik and a transform may share one); every bone it names — `bones`, an ik's `target`, a transform's `source`, a physics or slider constraint's `bone` — is a bone `bones` declares, a chain link as `<chain><i>` (`CONFIG_NAME_RESOLVES`); the bone a constraint follows does not sit under a bone it drives (`CONFIG_CONSTRAINT_TARGET_DETACHED`). Every other field (`mix`, `softness`, `properties`, a path's `slot`, a slider's `animation`) and every value is rigc's to accept or refuse at the rig stage's gate, in rigc's words (`RIG_RIGC_GREEN`) — an ik's `bones` as a shape too: from rig-c 2.15.0 rigc refuses an ik over more than two bones, or over a pair whose second bone is not the first's child (issue #103; this loader refused both itself until then). A note and an `x-` record may ride on an entry; the rig stage leaves them out of what it hands rigc. Under the default `--idle-keys ctl` a two-bone ik whose child link the idle keys is split by that link's control, and rigc refuses the pair: run `rig --idle-keys direct` or `build --idle-keys direct` (the rig stage adds that sentence, naming the flag on the command that ran, to rigc's line; `build` forwards it to its rig stage, issue #95). Each bone a constraint follows is declared to rigc as `invariants.detached` from every bone it drives, which rigc's gate rule `A25` checks |
|
|
176
|
-
| `stops` | rig (handed to rig-c as `rig.json`'s `stops`, and moves slots, mesh weights and child bones on stopped links onto `<link>_d`); `propose --from-config` (`LINT stop on <chain> …`) | **authored**, optional (issues #404, #447): `[{chain, links?, against, at, inward, outward, lower?: {inward, outward}}]` — rig-c's leg stops (`RigStop`, rig-c 2.56.0, `@rig-c/core/
|
|
176
|
+
| `stops` | rig (handed to rig-c as `rig.json`'s `stops`, and moves slots, mesh weights and child bones on stopped links onto `<link>_d`); `propose --from-config` (`LINT stop on <chain> …`) | **authored**, optional (issues #404, #447): `[{chain, links?, against, at, inward, outward, lower?: {inward, outward}}]` — rig-c's leg stops (`RigStop`, rig-c 2.56.0, `@rig-c/core/stop`). `chain` is a chain `bones` declares (`CONFIG_NAME_RESOLVES`, `RIG_NAME_RESOLVES`); `links`, optional, is a non-empty list of links of that chain (`CONFIG_NAME_RESOLVES`, `CONFIG_FIELD_TYPE`), or absent for every link of `chain` in chain order; `against` is a bone `bones` declares, a chain link as `<chain><i>` (`CONFIG_NAME_RESOLVES`, `RIG_NAME_RESOLVES`); `at` is `[x, y]` in `against`'s local space, as rig-c's stop takes it (`CONFIG_FIELD_TYPE`): since each chain link (`leg_r0`, `leg_r1`) is turned to point along its segment (`+x` from origin to next link or tip, `+y` 90° counter-clockwise in Spine world), `at: [d, n]` sits `d` px from `against`'s origin toward its end and `n` px perpendicular to it; `inward`, `outward` and `lower.inward`, `lower.outward` are finite numbers (`CONFIG_FIELD_TYPE`). Every other stop rule — non-negative bounds, each stopped link written by a constraint, `against` not under the stopped chain, the aim not degenerate, `\|rest\| + outward <= 180°` (`RIG_STOP_BOUNDS`) — is rigc's to accept or refuse at the rig stage's gate, in rigc's words (`RIG_RIGC_GREEN`). **Rising-limb / prone geometry (issue #447):** rig-c's `expandStops` aims `<chain>_rest` from `links[0]`'s setup origin at `<chain>_touch` (`at` in `against`'s local frame) and clamps `<link>_d` inside `[rest − inward, rest + outward]`; Spine wraps rotation at `±180°`, so `\|rest\| + outward <= 180°` is required (`RIG_STOP_BOUNDS`). Whenever `<chain>_touch` lies **above** `links[0]`'s root in rig pixels (`ty < y0`, i.e. higher Spine `y` — e.g. stopping a hanging cloth chain against a rising shin `leg_<s1>` in a prone or kneeling pose where the knee sits below `links[0]` and the ankle above it, so positive `at[0]` walks upward along the shin past `links[0]`'s root), `rest` lands in the upper half-plane (`\|rest\| > 90°`) and `\|rest\| + outward` exceeds `180°`. Stop against the descending thigh (`leg_<s0>`), set `links` to start at a link whose root sits above `<chain>_touch`, or omit the stop when the rising shin sits outside the hanging chain's sweep; `propose --from-config` prints `LINT stop on <chain> …` with the exact coordinates and angles when `<chain>_touch` lies above `links[0]`'s root or `\|rest\| + outward > 180°`. For every stopped link `<link>`, the rig stage moves any slot on `<link>`, any mesh weight on `<link>`, and any bone whose parent is `<link>` (a branched cloth tree's branches hanging from `<trunk_last>`, before `--idle-keys ctl` adds `<bone>_ctl` and before `turn` adds `turn_<part>_<bone>`) onto `<link>_d`, the drawn link bone rig-c's `expandStops` creates at `<link>`'s setup frame to carry the clamped rotation. Absent, `rig.json` carries no `stops` and no byte of any output moves |
|
|
177
177
|
| `turn` | rig (adds the turn control or 2.5D head-turn producer) | **proposed** only with `propose --full`/`--head` (issue #251), then corrected, or **authored** for 2.5D depth-sampled head turns (issue #763): `{pivot?, depths?, deform?, band?, radius?, surface?: {radius?}, head?: {pivot?, radius?}, roles?, counter?, grid?, unitDepths?, body?}`. When `roles` is declared (`{<part>: "surface" \| "unit" \| "rear"}`, issue #763; `CONFIG_TURN_ROLE_UNKNOWN`, `CONFIG_TURN_SURFACE_REQUIRED`, `RIG_TURN_SURFACE_MESH_BINDINGS`, `CONFIG_TURN_UNIT_MESH_BONES`), the rig stage runs the 2.5D depth-sampled head-turn producer: it edge-extends each turn-bound part's depth sheet across its transparent border and semi-transparent fringe from the nearest fully opaque (`alpha === 255`) texel before `PAD = 4` clamping (`padTurnDepthSheet`, `DEPTH_SILHOUETTE_SIZE_MISMATCH`), keeps authored `"surface"` meshes and their skinning (#795), sampling each vertex at its weighted setup position on its own extended sheet and emitting one inverse-setup-bone offset per influence (`D = -(pivot + z - zRef) * sin(angle)`, on x for yaw and y for pitch, with no narrowing or 2D spin); shared frames moved by another turn role are refused (`RIG_TURN_SURFACE_MESH_BINDINGS`), as are alternate drawings without their own depth sampling frame (`RIG_TURN_SURFACE_MESH_ATTACHMENT`). It promotes `"surface"` regions to `generator: {kind: "grid", cols, rows, depth}` (`grid`: `[cols, rows]` or `{<part>: [cols, rows]}`, default `[13, 16]`, bounded at `<= 2,400` triangles per slot and `<= 4,000` total, `RIG_TURN_GRID_BUDGET`, `RIG_TURN_SURFACE_DEPTH_REQUIRED`, `RIG_TURN_SHARED_DEPTH_SCALE`), emits `faceshift` and `rear_shift` under `head` (`CONFIG_TURN_HEAD_BONE`, `RIG_TURN_HEAD_BONE`), `<part>_surface` and `<part>_unit` under `faceshift`, and `yaw_dial` and `pitch_dial` under `root` (`CONFIG_TURN_BONE_FREE`, `RIG_TURN_NAME_FREE`), re-parents `"unit"` region bones and `"rear"` bones and mesh weights to `faceshift` and `rear_shift` (while `"unit"` mesh parts receive their own `<part>_unit` carrier under `faceshift`, rebind direct `"head"` weights to `<part>_unit`, reparent bound chain roots to `<part>_unit` while keeping chain skinning weights intact, and key `<part>_unit` in `turn_units`, #790), samples each `"unit"` bone's depth from the `"surface"` depth sheet at its rest position (or reads `unitDepths.<part>`, `RIG_TURN_UNIT_DEPTH_REQUIRED`), enforces ear occlusion (`ear_r`/`ear_l` drawn before the `face` surface in `assemble.plan`, `CONFIG_TURN_EAR_DRAW_ORDER`, and behind the cheek surface, `RIG_TURN_EAR_DEPTH_BEHIND_CHEEK`), and writes `turn` and `tilt` `derive` tracks (`pivot` default `55` rig px, `counter` default `0.1` in `[0, 1]`, `CONFIG_TURN_COUNTER_RANGE`). `depths` holds, per part, the See-through layer's `depth_median` the part came from (larger = further back), read from the run the part was assembled from; a `painting:` patch has none and is not carried. A rider (issue #271) — a part from an `eyewhite`, `irides`, `eyelash`, `eyebrow`, `nose` or `mouth` layer — is drafted at the `face` part's depth, 0.001 nearer when parts.json draws it after the face and 0.001 further when before: See-through makes no depth of its own for the eye group (it cuts them from one depth map of the combined eyes) and clamps nose and mouth to the face's median − 0.001, and the two runs' own medians for these layers disagreed by up to 0.47 and swapped their order against the face. Every other layer — ears, headwear and earwear included — keeps its own median, unless it rides another part's bone. With no `face` part, or more than one, the riders keep their own and a note says so. A rider by bone (issue #535) — a part every *ownable* bone of which (a chain link, or a bone no other bone hangs from; `head`, `chest` and any bone with a child are shared and never count on their own) is *hosted* by another carried part, the host of a bone being the carried part that binds it (its region's bone; a mesh's `segments`, `contour` and `auto` regions' bones) with the most `opaque_px`, the earlier in parts.json on a tie, and which hosts no bone itself — is drafted at its host's depth, 0.001 nearer when drawn after the host and 0.001 further when before, and a note names the host, the bones and its own median: a pin, clip or ornament on the back hair's links travels with the back hair, not with its own layer's depth. `propose` reads the proposal's own `bones`, `meshes` and `regions`; the face riders are read by their tag first and never by their bones. A part bound to two hosts' bones rides neither and a note says so. In the rig stage, an authored depth on a rider by bone whose fraction differs from its host's by more than 0.1 of the dial (`TURN_RIDER_APART`, a share of `pivot − nearest`) is refused (`CONFIG_TURN_RIDER_DEPTH`); the host is read off `parts.json`'s `opaque_px`, so the config loader cannot see it. One note lists each part's depth and where it came from; a carrier the other run places more than 10 % of `pivot − nearest` away gets a note naming both values and the run read — the two runs are not reconciled. `pivot` is the depth that stays put; `propose` drafts the mean of the parts' depths weighted by `opaque_px`, the one depth at which the painted pixels' centroid does not slide under the dial. The rig stage adds a bone `turn` under `root` at its origin that nothing keys — its local x is the dial, in rig px — and carries each part by `(pivot − depth) / (pivot − nearest depth)` of it: the nearest part all of it, a part behind the pivot the other way, a part at the pivot not at all. Each part rides leaf twins (`turn_<part>_<bone>`, an identity child of every bone its slot and weights bind) moved by one `transform` constraint (`turn_<part>`, after the config's own); the idle's keys, the `<bone>_ctl` controls and a physics constraint stay on the bones, and the dial moves none of them. Optional `deform` (`Partial<FaceDeformFractions>`, issue #436) overrides the Set B ×2.5 face surface deformation table (`FACE_DEFORM_FRACTIONS`, checked against `FACE_DEFORM_RANGES` by `CONFIG_TURN_DEFORM_RANGE`); when `applyFaceSurfaceDeform` runs on a rig whose `motion` carries `tilt` or `turn` slider `derive` keys, it requires `config.turn` (`CONFIG_TURN_REQUIRED`, issue #478; `propose --full`/`--head` drafts it), promotes `face` on `head` (or `turn_face_head` when `turn` is declared) to the uneven 5×5 grid mesh, keys `face`, `hair_front` and `hair_back` deform timelines and ear/topknot tracks from `evalPitchFaceSurface` and `evalYawFaceSurface`, and samples the same deform field across each `features` member's rest span (`featRx = (24 / 106) · W`, `featRy = (12 / 128) · H`) with its depth fraction `z / zRef` as the field's angle input and chord foreshortening (`scalex` narrowing on the leading side and widening on the trailing side, `scaley` on pitch) so every feature's bounding box stays inside the deformed face plate across the rated band (issue #468). On yaw (`issue #479`), `evalYawFaceSurface` evaluates a **cylinder projection** (`cylinderYawDx`: `Δx(x, θ, R) = R · (sin(clamp(arcsin(clamp(x / R, −1, 1)) − θ, −π/2, π/2)) − clamp(x / R, −1, 1))`) of radius `R` (`turnSurfaceRadius`: `turn.surface.radius ?? turn.radius ?? turn.head.radius`, positive rig px checked by `CONFIG_FIELD_TYPE`, defaulting to half the face plate's opaque width `W / 2`) tapered by a cubic Hermite outline weight (`wOutline = 1` for `\|ux\| <= 0.7`, reaching `0` at `\|ux\| = 1.0`) so features slide across a fixed outline (`iris` shift within `±2%` of `cylinderYawDx`), the trailing cheek strip widens (`>= 1.54×` at `±15°`), and the leading jaw edge holds fixed (`0 px` shift) unless explicit horizontal `turn.deform` overrides (`turn_mid_x`, `turn_lead_compress_x`, `turn_trail_shift_x`) request the flat yaw table. On yaw (`issue #478`), `applyFaceSurfaceDeform` also derives a **head-only pivot** (`headTurnPivot`: `turn.head.pivot` when authored, otherwise the `opaque_px`-weighted mean of `depths[part]` across the head parts `DEFAULT_HEAD_TURN_PARTS` — `face`, `hair_front`, `hair_back`, `ear_r`, `ear_l`, `hairpin` — from `parts.json`, falling back to `turn.pivot`) so a forward torso or arm in `turn.depths` does not pull the head's rotation axis in front of `face`: `hair_back` (`depth_median > headPivot`, negative `headTurnFraction`) and `hairpin` behind `headPivot` translate opposite to the face's turn (`dx = s · turn_face_center_x · W · (headPivot − depth) / (headPivot − nearestHeadDepth)`), emerging on the trailing side to compensate for the leading-cheek foreshortening and keeping the combined head silhouette width near-constant across `±15°` without any same-sign `turn_hair_back_cheek_x` term. Optional `band` (`number` or `{yaw?, pitch?}`, positive degrees, issue #472) declares the rig's rated face turn band (default `FACE_RATED_BAND`: `yaw <= 15°`, `pitch <= 12°`); declaring a `turn.band` or a `motion.animations_from` `turn`/`tilt` `derive.degrees` above `±15°` yaw or `±12°` pitch without an `assemble.alternates` entry that replaces `face` is refused (`CONFIG_FACE_BAND_EXCEEDED`), and on a single-plate rig `applyFaceSurfaceDeform` adds self-targeting transform constraints `yaw_clamp` (`[-15, 15]`) and `pitch_clamp` (`[-12, 12]`) ahead of the slider constraints so driving `yaw` or `pitch` beyond the rated band clamps at the boundary. At rest: with `turn` declared, no pixel differs by more than 1 level at dial 0 (not byte-identical; the cause is float noise in the identity child bones, and the constraints add nothing); without `turn`, byte-identical. Neither `pivot` nor `depths` has a default (`CONFIG_FIELD_PRESENT`); `pivot` and `head.pivot` must lie behind the nearest part (`CONFIG_TURN_PIVOT_BEHIND_NEAREST`). Absent, no control is added and no byte of any output moves |
|
|
178
178
|
| `scene` | assemble (the recomposite, its holes and the figure's mask); check, through `parts.json`'s `scene` block (`RECOMPOSITE_HOLES`, the seam) | **authored**, optional; `propose` writes none (issue #242). `{}` declares the painting a scene: the figure and its surroundings in one image, See-through's full run holding only the figure. With it, `assemble` reads the recomposite figures, the hole list and the `uncovered:` lines inside the figure — the rig pixels where any full-run layer's alpha is above 8 (`OPAQUE_ALPHA_ABOVE`, the cut every layer's painted pixels are read by) — each line starting `inside the figure (config.scene: …, <n> of <m> rig px)`; writes that figure as `figure_rig.png` (white on black) beside the recomposite, and a `scene` block in `parts.json`; flags error pixels on the error map inside it only (outside, the painting grey); and `check` leaves out of the seam every frame pixel whose composite sample reaches the painting's outermost row or column, saying how many (`seam_border` in `check.json`, and on the seam line). It takes no field: the figure and its threshold are derived. A key in it other than a record or an annotation is `CONFIG_KEY_KNOWN`. Absent, no byte of any output moves |
|
|
179
179
|
| `cloth` | `propose --cloth` only; no other stage reads it, so it moves no byte of any build | **authored**, optional (issue #364): one recipe per tag, `{"bottomwear": {…}, "back hair": {…}, "front hair": {…}}`, each `{chains, links, wind, gravity, split?, length_ratio?, strength?, damping?, alternate_damping?, translate?, swing?, part?, influence?}`. `influence` (issue #518) — `{across, max, shape, radius?}`: the parts this recipe meshes are drafted in the influence mode (`meshes.<part>.influence` above) at their lattice's cell, with `across`, `max` and `shape` as declared (each required — the reading behind the radius did not vary them) and `radius` as declared or, absent, drafted as the farthest vertex's distance plus 3 cells (the `influence.radius` row); without it the parts keep their lattice. `chains` — trees across the piece (for `back hair`, per side of the eye axis), a whole number, 1 or more; `links` — links from root to tip on every path, 1 or more; `split` — `{at, into}`: the first `at` links are the trunk, which forks into `into` (2 or more) branches; `at` below `links` (`CONFIG_CLOTH_SPLIT_BEFORE_TIP`); `length_ratio` — a path's last link over its first, above 0, default 0.5; `strength` — `{trunk, branch, edge}`, each above 0 and below the spring's stability bound (`CONFIG_CLOTH_SPRING_STABLE`), default 100 / 100 / 50; `damping` — in [0, 1], absent: rig-c's default; `alternate_damping` — the odd trees' damping, in [0, 1], beside `damping` and different from it (`CONFIG_CLOTH_ALTERNATE_DIFFERS`); `wind`, `gravity` — `[root, tip]`, each 0 or more, tip at or above root (`CONFIG_CLOTH_RESPONSE_GROWS_TO_TIP`); `translate` — the x and y mix of a dangling end's flutter, above 0 and at most 1; `swing` — `bottomwear` only, `{scales}`, one positive scale per tree (`CONFIG_CLOTH_SWING_SCALE_PER_TREE`); `part` — `bottomwear` only (`CONFIG_CLOTH_PART_ON_BOTTOMWEAR`), a non-empty part or cut-piece name: the `topwear` part that holds a skirt See-through returned inside it (a dress), or its skirt piece cut by `assemble.cuts`, which takes the skirt's trees (issue #402, *A skirt inside topwear* below; the part is checked by `propose`, `PROPOSE_CLOTH_PART`). The two defaults are the recipe's own, measured on its synthetic fixture (the recipe below). The recipe below says what each field drafts. The config written: `propose --cloth <config.json> --write-config <out.json>` (issue #537) writes this config's own text back with the sections the recipe drafts spliced in — `meshes.<part>` and `regions.<part>`, and `bones`, `constraints` and `motion.tracks` entry by entry by name (issue #552) — and every other byte as read; `--from <previous config>` (issue #571) takes an entry equal to the previous recipe's draft as the recipe's (*The config written*, under the recipe below) |
|
|
@@ -5085,7 +5085,7 @@ documents do not ship). Each is an input this package built; none is an author's
|
|
|
5085
5085
|
| <a id="REQUIREMENTS_MAY_FOLD"></a>`REQUIREMENTS_MAY_FOLD` | a `may_fold` entry names a slot with no mesh attachment — a region is one quad and cannot fold (issue #320). Refused before anything is built. Before issue #333 an entry naming the idle was refused here too; the bar reads the idle now, and `idle` is an animation name like any other | a mesh slot |
|
|
5086
5086
|
| <a id="REQUIREMENTS_NOT_PLANTED"></a>`REQUIREMENTS_NOT_PLANTED` | a `not_planted` name is a part `check` does not read as a planted foot — it does not come from a See-through `footwear` layer — or there is no `parts.json` to choose the feet by (issue #231). Refused before anything is built | a `footwear` part's name |
|
|
5087
5087
|
| <a id="REQUIREMENTS_TIP_EXCEPTION"></a>`REQUIREMENTS_TIP_EXCEPTION` | a `not_swinging`, `rises` or `rests` name is a part `TIP_OVER_ROOT` does not read — not from a See-through `handwear` or `bottomwear` layer — or there is no `parts.json` (refused before anything is built); or a `rises` part is not carried by a chain that rises: the chain's **last link**, at the setup pose, runs other than up — from its origin along its `length` (the extent the rig stage turns a link to), or, a last link with no length, from the link before's origin to its own — the detail giving the link read and the direction measured (refused after the idle is rendered, before `check.json` is written) (issues #231, #322; until #322 it read the chain's first link's origin to its last's, which refused a folded arm — a link that hangs, then a forearm raised) | a swinging part's name; for `rises`, a part whose chain does rise |
|
|
5088
|
-
| <a id="CHECK_ENVIRONMENT"></a>`CHECK_ENVIRONMENT` | `check --environment` (or `build --environment`, forwarded): the schedule is refused, the detail rigc's own sentence verbatim. Read once by rig-c's reader (`readEnvironmentSchedule`, `@rig-c/core/
|
|
5088
|
+
| <a id="CHECK_ENVIRONMENT"></a>`CHECK_ENVIRONMENT` | `check --environment` (or `build --environment`, forwarded): the schedule is refused, the detail rigc's own sentence verbatim. Read once by rig-c's reader (`readEnvironmentSchedule`, `@rig-c/core/environment`) before anything is built — nothing at the path, a file that is not JSON or not an object, a `spec` other than `rigc-environment/1`, a key besides `spec`, `steps` or a step's `t`, `wind`, `gravity`, no step, a `t` not finite, below 0 or not after the step before, a `wind` or `gravity` not a pair of finite numbers (JSON's `1e999` reads as `Infinity` and is refused), a step stating neither — and `--out` is not written (`build` refuses under `[assemble]`, before it assembles). After the build, what `rigc render --environment` refuses of a well-formed schedule on this rig, quoted from its `--environment <path>:` line: no physics constraint, a half no constraint answers, two steps on one frame at 12 fps, a step after the last frame of the animation rendered. Also refused before anything is built: a `motion.json` with no animation, where no render `check` makes could pose the schedule | the schedule — rigc's sentence names the entry, the field, the value found and the value required; for a rig with no physics constraint, drop the flag: no world moves it |
|
|
5089
5089
|
| <a id="CHECK_WIND_BAND"></a>`CHECK_WIND_BAND` | `check --wind-band` (or `build --wind-band`, forwarded, issue #590): the sweep file is refused before anything is built, or cannot be measured against the rig. Refused before the build (`build` refuses under `[assemble]` before it assembles, and `--out` is not written): nothing at the path, a file that is not a JSON object, an unknown key (besides `note`, `*_note` and `x-…`), a missing or malformed field (`spec` must be `"rig-parts-wind-band/1"`; `min`, `max`, `step` finite numbers with `min < max`, `step > 0`, and `(max - min) / step` within `1e-6` of an integer at most `64`; `fps` a positive integer; `max_gap` and `max_ghost` non-negative integers; `pairs` a non-empty array of unique `"<a>:<b>"` strings with `a !== b`). Refused against the rig before `rigc build`: a slot in `pairs` not in `rig.json`'s `slots`, `motion.json` with no animation, a rig with no physics constraint, or a rig where no physics constraint has a non-zero `wind`. Refused after the first sweep render (before `check.json` is written, with `--out` cleaned): a pair in `pairs` whose drawings share no overlap band at the setup pose (`status: "skip"` or `banded === 0` in `seam.json`) | the `--wind-band` file or the rig — every field in `"rig-parts-wind-band/1"` is required (nothing falls back to `SEAM_OVER_MOTION`), each `"<a>:<b>"` pair must name two distinct slots whose art overlaps at rest, and the rig must declare at least one physics constraint that answers `wind` |
|
|
5090
5090
|
| <a id="REQUIREMENTS_SEAM"></a>`REQUIREMENTS_SEAM` | a `seam` cannot be read against the rig: there is no `parts.json` (a merged rig, §7 *Measuring a rig rig-parts did not assemble*), or the two parts' art does not meet at the setup pose (no 4-adjacent pair). Refused before anything is built | two parts whose art touches, on a rig with its `parts.json` |
|
|
5091
5091
|
|
|
@@ -5158,7 +5158,7 @@ Absent declaration retains existing output bytes except optional new evidence on
|
|
|
5158
5158
|
|
|
5159
5159
|
**Body-root seam identity** (issue #686). A limb must have exactly one segment0 part. Its declared bone must have one named immediate parent; the root slot must bind that bone (or its declared turn child). Non-limb parts with `topwear` or `bottomwear` source provenance, a slot on that parent (directly or through its verified generated turn child) and a named default-skin drawing are candidates. The body-side child must match `applyTurn`'s exact generated name, unique identity bone and parent, control and per-part transform binding; a similarly named bone alone is not proof (issue #708). The original carrier and pair slot names do not change under turn; stock setup pose `render --seam` selects all matching drawings with `banded > 0` (its existing alpha-overlap band, without dilation), so one selects one pair and two select both pairs. When eligible candidates all return valid setup banded 0, that limb has no selected root pair: `unmeasuredRoots` retains its limb, bone, parent, segment0 part, candidates and named reason, reported as SKIP, not measured PASS. Part spelling, nearest geometry and shared mesh influences select nothing. On `wind` the pairs are `topwear|upperarm_r`, `topwear|upperarm_l`, `bottomwear|thigh_r` and `bottomwear|thigh_l`; “trunk” is not a part name. Existing pairs keep their order; a reversed explicit declaration deduplicates with the root pair and retains both declarations. An ambiguous/missing named binding, no eligible candidate, or unreadable/undrawn setup data is `CHECK_MOTION_SEAM_ROOT`, naming the part and candidates. Valid zero-band metadata is carried separately as optional `roots.unmeasured`, never as a fabricated measured pair. The all-zero root block remains present and its bar is skipped; measured FAIL takes precedence over SKIP, while measured PASS plus any unmeasured root stays SKIP. No body provenance leaves legacy pair selection unchanged and supplies no body-root coverage.
|
|
5160
5160
|
|
|
5161
|
-
Renderer metadata and exact raster reads use the promised `@rig-c/core/render-shared` entry (rig-c
|
|
5161
|
+
Renderer metadata and exact raster reads use the promised `@rig-c/core/render-shared` entry (from rig-c 2.69.0). It registers no Spine runtime; where that runtime resolves from rig-c's own package root, the existing `@rig-c/core/render` entry registers the official Spine side explicitly. An install without Spine keeps rig-c's own candidate chooser and gate; candidate or loader failures never select a guessed fallback.
|
|
5162
5162
|
|
|
5163
5163
|
The body-root bar counts stock partitions `gapOpen` plus `ghostA` or `ghostB` owned by the pair's UNDER-owned drawing in resolved draw order on each active frame, comparing their summed cells against the unchanged strict floor `px > round(max(box width, box height) / cell)` on the original raw kind boxes (their union when both kinds contribute), never the narrowed partition boxes; `gapCovered` and OVER-owned ghost cells do not count (issue #711). The metric mode is `gap-open+under-ghost`; rows retain the exact partition counts, UNDER owner and counted total in `cells`, including excluded and under-floor readings. Missing partitions, inconsistent sums or unavailable ownership are named `FRAMES_SIDECAR` refusals, never inferred zero. An active rendered environment fails `CHECK_SEAM_OVER_MOTION` above that floor, setting overall PASS false and exits 1. Existing internal-joint and explicit-only pairs remain warnings: their PASS, exit status and bar count are unchanged; reference worlds remain informational. The root bar is counted once, and absence is not a zero or a PASS. No whole-box alpha exemption or consumer compositor is used. This gate samples the supplied animations at 12 fps, not another motion or player scene.
|
|
5164
5164
|
|
package/docs/STABILITY.md
CHANGED
|
@@ -269,7 +269,7 @@ keeps complete canonical raw pair data (boxes/cut metadata included), omitting
|
|
|
269
269
|
`picture` unless its image exists. Semantic signatures preserve original source
|
|
270
270
|
attachment UVs/topology/weights, own image content and world vertices/colour,
|
|
271
271
|
not atlas pages/UVs or global piece ordinals. Unknown/no-art support stays conservative.
|
|
272
|
-
Renderer metadata and exact raster reads use the promised `@rig-c/core/render-shared` entry (rig-c
|
|
272
|
+
Renderer metadata and exact raster reads use the promised `@rig-c/core/render-shared` entry (from rig-c 2.69.0). It registers no Spine runtime; where that runtime resolves from rig-c's own package root, the existing `@rig-c/core/render` entry registers the official Spine side explicitly. An install without Spine keeps rig-c's own candidate chooser and gate; candidate or loader failures never select a guessed fallback.
|
|
273
273
|
|
|
274
274
|
An unavailable, nonfinite, unrepresentable or oversized union, or nonempty official pinned.outside, refuses `CHECK_SEAM_DOMAIN`. Geometry margins outside the authored canvas are included in U, not treated as opaque-clip evidence. State-by-state geometry reads retain bounds/identities rather than all decoded pages or poses. `--keep-stills` keeps
|
|
275
275
|
canonical frames in `setup_still/` and fitted diagnostics in `setup_still_auto/`.
|
|
@@ -328,20 +328,28 @@ in the package.
|
|
|
328
328
|
|
|
329
329
|
## rig-c
|
|
330
330
|
|
|
331
|
-
`dependencies` takes `@rig-c/core` `
|
|
331
|
+
`dependencies` takes `@rig-c/core` `3.0.0` exactly. Bun 1.4 or later
|
|
332
332
|
is the declared floor (`engines.bun` `>=1.4.0`; older 1.4 releases are not tested in
|
|
333
333
|
CI, which runs `latest`, and compatibility with an older 1.4 release is handled when
|
|
334
334
|
reported as an issue). What this package relies on in rig-c, every import
|
|
335
335
|
read off `src/` and `cli.ts`:
|
|
336
336
|
|
|
337
|
-
- the named entries `@rig-c/core
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
`@rig-c/core/
|
|
343
|
-
`
|
|
344
|
-
`@rig-c/core/
|
|
337
|
+
- the named entries its `exports` map carries (from `@rig-c/core` 3.0.0 `./*.ts` deep
|
|
338
|
+
file paths are gone, and `TY39` refuses any in the tree):
|
|
339
|
+
`@rig-c/core/mesh` (the outline functions, `measureAuthoredMeshFit`, `reduceMesh`,
|
|
340
|
+
`skinningEnvelopeBone`, `writeMeshQualityReport` and their types),
|
|
341
|
+
`@rig-c/core/meshcompare` (`compareMeshesInMotion`, `comparePreparedMotion`,
|
|
342
|
+
`prepareMotionReference`), `@rig-c/core/compile` (`f32`), `@rig-c/core/core`
|
|
343
|
+
(`RUNTIME_PI`), `@rig-c/core/deformgen` (`evaluateDeformTransform`),
|
|
344
|
+
`@rig-c/core/environment` (`ENVIRONMENT_SPEC`, `EnvironmentError`,
|
|
345
|
+
`environmentResponse`, `readEnvironmentSchedule`), `@rig-c/core/errors`
|
|
346
|
+
(`CompileError`), `@rig-c/core/font5x7` (`GLYPH_H`, `drawText`),
|
|
347
|
+
`@rig-c/core/passthrough` (`DRAWN_ALPHA`), `@rig-c/core/plate` (the PNG codec),
|
|
348
|
+
`@rig-c/core/png` (`assertPng`), `@rig-c/core/render` (`GeometryFile`,
|
|
349
|
+
`GeometryFrame`), `@rig-c/core/render-shared` (`Viewport`), `@rig-c/core/rig`
|
|
350
|
+
(`parseRigSpec`, `RIG_SPEC_VERSION`, the constraint keys and types),
|
|
351
|
+
`@rig-c/core/stop` (`expandStops`) and `@rig-c/core/transform` (the y flip and
|
|
352
|
+
frame transforms, through `src/coords.ts` only);
|
|
345
353
|
- the `rigc` command: `build` and `render`, and `--version`, whose `entry:` line
|
|
346
354
|
says which validator gated a build (`check.json`'s `rigc_entry`).
|
|
347
355
|
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "rig-parts",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "2.0.0",
|
|
4
4
|
"description": "AI-authored 2D character parts from one anime painting and its See-through layer decomposition: measured parts, weighted-mesh rig specs, verified through rig-c before anything is written. A CLI for agents that cannot see the image.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"bin": {
|
|
@@ -67,7 +67,7 @@
|
|
|
67
67
|
},
|
|
68
68
|
"dependencies": {
|
|
69
69
|
"ag-psd": "^31.0.2",
|
|
70
|
-
"@rig-c/core": "
|
|
70
|
+
"@rig-c/core": "3.0.0"
|
|
71
71
|
},
|
|
72
72
|
"devDependencies": {
|
|
73
73
|
"@esotericsoftware/spine-core": "4.3.13",
|
package/src/apng.ts
CHANGED
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
*
|
|
5
5
|
* Pure: bytes in, bytes out, no clock, no file system. The only thing it leans
|
|
6
6
|
* on is `node:zlib` for DEFLATE, which is also all rig-c's own PNG codec
|
|
7
|
-
* (
|
|
7
|
+
* (`@rig-c/core/plate`) leans on; the chunk framing and CRC are that
|
|
8
8
|
* codec's `pngChunk`, so there is one PNG chunk writer in the dependency tree,
|
|
9
9
|
* not two.
|
|
10
10
|
*
|
|
@@ -34,7 +34,7 @@
|
|
|
34
34
|
* bitstream encoder, and none ships here.
|
|
35
35
|
*/
|
|
36
36
|
import { deflateSync } from 'node:zlib';
|
|
37
|
-
import { PNG_SIGNATURE, pngChunk } from '@rig-c/core/
|
|
37
|
+
import { PNG_SIGNATURE, pngChunk } from '@rig-c/core/plate';
|
|
38
38
|
import { histogram, mapToPalette, medianCut, type PaletteError, paletteError, type Rgba } from './palette.ts';
|
|
39
39
|
import type { Raster } from './raster/types.ts';
|
|
40
40
|
|
package/src/check.ts
CHANGED
|
@@ -170,9 +170,9 @@ import {
|
|
|
170
170
|
type SeamPair,
|
|
171
171
|
stretchRequirementLine,
|
|
172
172
|
} from './requirements.ts';
|
|
173
|
-
import { RIG_BONE_INHERIT, type RigSpec as RigcRigSpec } from '@rig-c/core/
|
|
174
|
-
import { expandStops } from '@rig-c/core/
|
|
175
|
-
import { ENVIRONMENT_SPEC, EnvironmentError, environmentResponse, readEnvironmentSchedule } from '@rig-c/core/
|
|
173
|
+
import { RIG_BONE_INHERIT, type RigSpec as RigcRigSpec } from '@rig-c/core/rig';
|
|
174
|
+
import { expandStops } from '@rig-c/core/stop';
|
|
175
|
+
import { ENVIRONMENT_SPEC, EnvironmentError, environmentResponse, readEnvironmentSchedule } from '@rig-c/core/environment';
|
|
176
176
|
import { ART_ALPHA } from './mesh.ts';
|
|
177
177
|
import { connectedComponents } from './raster/components.ts';
|
|
178
178
|
import { alphaComposite } from './raster/composite.ts';
|
|
@@ -329,8 +329,8 @@ export const DEFAULT_PACK_MODE: PackMode = { pageEdges: DEFAULT_PAGE_EDGES, pack
|
|
|
329
329
|
/**
|
|
330
330
|
* The profile every rigc build this package runs is gated under. rig-c 2.50.0
|
|
331
331
|
* renamed `spine-html` to `rig-play` and runs the same rules under it; the old
|
|
332
|
-
* name
|
|
333
|
-
*
|
|
332
|
+
* name was removed in rig-c 3.0.0 (selftest `CK20` holds every stage's build to
|
|
333
|
+
* the new name and verifies the old one is refused).
|
|
334
334
|
*/
|
|
335
335
|
export const GATE_PROFILE = 'rig-play';
|
|
336
336
|
|
|
@@ -5309,7 +5309,7 @@ function environmentRefused(given: string, sentence: string): PartsError {
|
|
|
5309
5309
|
|
|
5310
5310
|
/**
|
|
5311
5311
|
* `--environment <file>` read once, before anything is built (issue #538): the file's bytes hashed and handed to
|
|
5312
|
-
* rig-c's own reader, `readEnvironmentSchedule` (
|
|
5312
|
+
* rig-c's own reader, `readEnvironmentSchedule` (`@rig-c/core/environment`), which refuses every malformed schedule
|
|
5313
5313
|
* — a `spec` other than {@link ENVIRONMENT_SPEC}, a key it does not read, no step, a `t` that is not finite, at or
|
|
5314
5314
|
* above 0 and after the step before, a `wind` or `gravity` that is not a pair of finite numbers, a step that changes
|
|
5315
5315
|
* nothing — by entry, field, the value found and the value required. Nothing here reads the schedule's meaning: its
|
package/src/config.ts
CHANGED
|
@@ -41,7 +41,7 @@ import type { DepthConfig } from './depthsheets.ts';
|
|
|
41
41
|
*
|
|
42
42
|
* Coordinates in `bones`, `meshes` and `motion` are RIG pixels, y down, origin
|
|
43
43
|
* top-left — the parts' own space. The y flip to Spine happens once, in
|
|
44
|
-
*
|
|
44
|
+
* `@rig-c/core/transform` (see `src/coords.ts`), when the rig is built.
|
|
45
45
|
*
|
|
46
46
|
* 🔗 **`constraints` is rig-c's, verbatim (issue #92).** An optional list
|
|
47
47
|
* of constraint objects in rig-c's own rig-spec shape (`RigConstraint`:
|
|
@@ -91,7 +91,7 @@ import type { DepthConfig } from './depthsheets.ts';
|
|
|
91
91
|
*/
|
|
92
92
|
import { existsSync, readFileSync, statSync } from 'node:fs';
|
|
93
93
|
import { dirname, resolve } from 'node:path';
|
|
94
|
-
import { RIG_BONE_INHERIT, RIG_SKIN_CONSTRAINT_KEYS, type RigBoneInherit, type RigConstraint, type RigSkinConstraintKey, type RigStop } from '@rig-c/core/
|
|
94
|
+
import { RIG_BONE_INHERIT, RIG_SKIN_CONSTRAINT_KEYS, type RigBoneInherit, type RigConstraint, type RigSkinConstraintKey, type RigStop } from '@rig-c/core/rig';
|
|
95
95
|
import { pyRound } from './round.ts';
|
|
96
96
|
import { motionSeamProblems, type MotionSeamDeclaration } from './motionseams.ts';
|
|
97
97
|
import { REQUIREMENTS_SPEC } from './requirements.ts';
|
package/src/coords.ts
CHANGED
|
@@ -22,7 +22,7 @@
|
|
|
22
22
|
* `flattenRig` goes back through `toWorld`. No rotation matrix is written out
|
|
23
23
|
* by hand in this package.
|
|
24
24
|
*/
|
|
25
|
-
import { cropToSpineY } from '@rig-c/core/
|
|
25
|
+
import { cropToSpineY } from '@rig-c/core/transform';
|
|
26
26
|
|
|
27
27
|
/** A painting point on the accepted integer rig canvas, in setup-world coordinates. */
|
|
28
28
|
export function paintingToSetupPoint(point: readonly number[], sourceSize: readonly number[], rigSize: readonly number[]): [number, number] {
|
|
@@ -34,5 +34,5 @@ export function setupToPaintingPoint(point: readonly number[], sourceSize: reado
|
|
|
34
34
|
return [(point[0] + rigSize[0] / 2) / (rigSize[0] / sourceSize[0]), cropToSpineY(point[1], rigSize[1]) / (rigSize[1] / sourceSize[1])];
|
|
35
35
|
}
|
|
36
36
|
|
|
37
|
-
export { computeExactFrameTransforms, computeWorldTransforms, cropToSpineY, normaliseDegrees, toBoneLocal, toBoneLocalVector, toWorld } from '@rig-c/core/
|
|
38
|
-
export type { BoneTransform } from '@rig-c/core/
|
|
37
|
+
export { computeExactFrameTransforms, computeWorldTransforms, cropToSpineY, normaliseDegrees, toBoneLocal, toBoneLocalVector, toWorld } from '@rig-c/core/transform';
|
|
38
|
+
export type { BoneTransform } from '@rig-c/core/transform';
|
package/src/instruments.ts
CHANGED
|
@@ -962,7 +962,7 @@ export function partWorldBox(p: PartRecord, rigH: number, stage: StageBox): Worl
|
|
|
962
962
|
/**
|
|
963
963
|
* How many floating-point roundings stand between the rig and one coordinate
|
|
964
964
|
* of a displacement {@link stillReading} returns, on its longest path. Every
|
|
965
|
-
* number on it is a double: rigc's core poser (
|
|
965
|
+
* number on it is a double: rigc's core poser (`@rig-c/core/core`,
|
|
966
966
|
* rig-c 2.15.0) reads a vertex's local coordinates and weights through
|
|
967
967
|
* `Math.fround` and does the arithmetic in doubles, and `geometry.json` carries
|
|
968
968
|
* those doubles. The float32 inputs are the same numbers in the rest vertex and
|
package/src/propose.ts
CHANGED
|
@@ -131,7 +131,7 @@ import { explicitWeightRows, regionBone, type RegionSpec } from './config.ts';
|
|
|
131
131
|
*/
|
|
132
132
|
import { existsSync } from 'node:fs';
|
|
133
133
|
import { join } from 'node:path';
|
|
134
|
-
import { drawText, GLYPH_H } from '@rig-c/core/
|
|
134
|
+
import { drawText, GLYPH_H } from '@rig-c/core/font5x7';
|
|
135
135
|
import { type BoneEntry, type CharacterConfig, type ConfigConstraint, type ConfigStop, contourRegionsOf, deriveBustRegions, type Limb, type MeshSpec, type PartBinding, parseConfig, type Point, type Segment, type SkeletonSections, turnRidersByBone } from './config.ts';
|
|
136
136
|
export { contourRegionsOf, deriveBustRegions };
|
|
137
137
|
import { computeExactFrameTransforms, cropToSpineY, normaliseDegrees, toWorld } from './coords.ts';
|
package/src/raster/png.ts
CHANGED
|
@@ -12,14 +12,14 @@
|
|
|
12
12
|
* refuses by name rather than misreading. So adding `pngjs` would have been a
|
|
13
13
|
* second codec for the same bytes, and two codecs are two answers.
|
|
14
14
|
*
|
|
15
|
-
* 🔌 **The
|
|
16
|
-
*
|
|
17
|
-
*
|
|
18
|
-
*
|
|
19
|
-
*
|
|
15
|
+
* 🔌 **The named entries are the interface.** `@rig-c/core/plate` and
|
|
16
|
+
* `@rig-c/core/png` are how a consumer reaches the codec and what the
|
|
17
|
+
* installed package resolves. If a rigc release moves or drops these entries,
|
|
18
|
+
* this import is what breaks, by name, and `bun run smoke` is where that is
|
|
19
|
+
* seen first.
|
|
20
20
|
*/
|
|
21
|
-
import { assertPng } from '@rig-c/core/
|
|
22
|
-
import { decodePng, encodePng } from '@rig-c/core/
|
|
21
|
+
import { assertPng } from '@rig-c/core/png';
|
|
22
|
+
import { decodePng, encodePng } from '@rig-c/core/plate';
|
|
23
23
|
import { readFileSync, writeFileSync } from 'node:fs';
|
|
24
24
|
import { type FloatImage, newFloatImage, newRaster, type Raster, RasterError } from './types.ts';
|
|
25
25
|
|
package/src/raster/types.ts
CHANGED
|
@@ -11,7 +11,7 @@
|
|
|
11
11
|
* feathered blend weight).
|
|
12
12
|
*
|
|
13
13
|
* Nothing here knows about Spine's y-up world. The only conversion between the
|
|
14
|
-
* two lives in
|
|
14
|
+
* two lives in `@rig-c/core/transform`, re-exported by `src/coords.ts`.
|
|
15
15
|
*/
|
|
16
16
|
export interface Raster {
|
|
17
17
|
readonly width: number;
|
package/src/remesh.ts
CHANGED
|
@@ -75,8 +75,8 @@ import { applyMeshEdit, type DeltaApplied, type DeltaPlant, deltaSourceProblems,
|
|
|
75
75
|
import { DEFAULT_IDLE_KEYS, type IdleKeys, type MeshAttachment, meshBoundBones, rigJsonText, type RigSpec } from './rig.ts';
|
|
76
76
|
import { readRequirements } from './requirements.ts';
|
|
77
77
|
import { pyRound } from './round.ts';
|
|
78
|
-
import { type RigSpec as RigcRigSpec } from '@rig-c/core/
|
|
79
|
-
import { expandStops } from '@rig-c/core/
|
|
78
|
+
import { type RigSpec as RigcRigSpec } from '@rig-c/core/rig';
|
|
79
|
+
import { expandStops } from '@rig-c/core/stop';
|
|
80
80
|
|
|
81
81
|
/** The provenance file's spec. */
|
|
82
82
|
export const REMESH_SPEC = 'rig-parts-remesh/1';
|
package/src/requirements.ts
CHANGED
|
@@ -50,8 +50,8 @@ import { fixedSkeletonProblems, type FixedSkeleton } from './artjoints.ts';
|
|
|
50
50
|
*/
|
|
51
51
|
import { existsSync, readFileSync, statSync } from 'node:fs';
|
|
52
52
|
import { resolve } from 'node:path';
|
|
53
|
-
import { CompileError } from '@rig-c/core/
|
|
54
|
-
import { splitRigSkin, type RigSkin } from '@rig-c/core/
|
|
53
|
+
import { CompileError } from '@rig-c/core/errors';
|
|
54
|
+
import { splitRigSkin, type RigSkin } from '@rig-c/core/rig';
|
|
55
55
|
import { cropToSpineY } from './coords.ts';
|
|
56
56
|
import type { Problem } from './errors.ts';
|
|
57
57
|
import { refuseIfAny } from './errors.ts';
|
package/src/rig.ts
CHANGED
|
@@ -138,12 +138,12 @@ import { explicitAttachment, type ExplicitMeshReport } from './explicitmesh.ts';
|
|
|
138
138
|
* order the objects are built in, and every number is rounded by `pyRound`).
|
|
139
139
|
*/
|
|
140
140
|
import { type AutoSpec, type BoneEntry, type InfluenceMeshSpec, type WeightRule, type CharacterConfig, type ConfigConstraint, type ConfigStop, CONSTRAINT_FOLLOWS, constraintForRig, contourRegionsOf, type ContourSpec, DEFAULT_BUST_BONE_L, DEFAULT_BUST_BONE_R, type Point, type RibsSpec, ROOT_BONE, stopForRig, turnRidersByBone, weightsABone } from './config.ts';
|
|
141
|
-
import { RUNTIME_PI } from '@rig-c/core/
|
|
141
|
+
import { RUNTIME_PI } from '@rig-c/core/core';
|
|
142
142
|
import { type BoneTransform, computeExactFrameTransforms, computeWorldTransforms, cropToSpineY, normaliseDegrees, paintingToSetupPoint, setupToPaintingPoint, toBoneLocal, toWorld } from './coords.ts';
|
|
143
143
|
import { type Problem, refuseIfAny, PartsError } from './errors.ts';
|
|
144
144
|
import { recordedFocusProblems } from './setfocus.ts';
|
|
145
145
|
import { eyeLineDegrees } from './headframe.ts';
|
|
146
|
-
import type { RigBoneInherit, RigStop } from '@rig-c/core/
|
|
146
|
+
import type { RigBoneInherit, RigStop } from '@rig-c/core/rig';
|
|
147
147
|
import { f32 } from '@rig-c/core/compile';
|
|
148
148
|
import type { MeshCounts, MeshQualityReport, MeshReductionInput, MotionAmplitude, ReducedMesh, Termination } from '@rig-c/core/mesh';
|
|
149
149
|
import { bindWeightedVertices, buildGridMesh, buildSegmentsLattice, type EntrySegment, influenceShares, segmentDistance as rigcSegmentDistance, type SegmentsLattice, type SegmentsLatticeReport } from '@rig-c/core/mesh';
|
package/src/scene.ts
CHANGED
|
@@ -93,7 +93,7 @@
|
|
|
93
93
|
*/
|
|
94
94
|
import { existsSync, mkdirSync, readFileSync, rmSync, statSync, writeFileSync } from 'node:fs';
|
|
95
95
|
import { dirname, join, resolve } from 'node:path';
|
|
96
|
-
import type { RigStop } from '@rig-c/core/
|
|
96
|
+
import type { RigStop } from '@rig-c/core/rig';
|
|
97
97
|
import { checkStage, gateThroughRigc, type Log } from './build.ts';
|
|
98
98
|
import { ACCEPTABLE_BARS, barsNotMet, type CheckReport, DEFAULT_PACK_SHAPE, DEFAULT_PAGE_EDGES, type PackMode, requirementsNotPass, type RigcRunner } from './check.ts';
|
|
99
99
|
import { CONSTRAINT_BONE_FIELDS, ROOT_BONE } from './config.ts';
|
package/src/sheet.ts
CHANGED
|
@@ -18,7 +18,7 @@
|
|
|
18
18
|
*/
|
|
19
19
|
import { existsSync } from 'node:fs';
|
|
20
20
|
import { basename, dirname, join } from 'node:path';
|
|
21
|
-
import { drawText, GLYPH_H } from '@rig-c/core/
|
|
21
|
+
import { drawText, GLYPH_H } from '@rig-c/core/font5x7';
|
|
22
22
|
import { type Problem, refuseIfAny } from './errors.ts';
|
|
23
23
|
import { type LayerSet, OPAQUE_ALPHA_ABOVE, readLayers } from './layers.ts';
|
|
24
24
|
import { readParts } from './parts.ts';
|
package/src/structure.ts
CHANGED
|
@@ -71,8 +71,8 @@ import { explicitWeightRows, regionBone } from './config.ts';
|
|
|
71
71
|
* Pure but for reading the three files it is handed.
|
|
72
72
|
*/
|
|
73
73
|
import { existsSync, readFileSync } from 'node:fs';
|
|
74
|
-
import { CompileError } from '@rig-c/core/
|
|
75
|
-
import { parseRigSpec, RIG_SPEC_VERSION, type RigBone as RigcBone, type RigSpec as RigcSpec, splitRigSkin } from '@rig-c/core/
|
|
74
|
+
import { CompileError } from '@rig-c/core/errors';
|
|
75
|
+
import { parseRigSpec, RIG_SPEC_VERSION, type RigBone as RigcBone, type RigSpec as RigcSpec, splitRigSkin } from '@rig-c/core/rig';
|
|
76
76
|
import { type ConfigConstraint, CONSTRAINT_FOLLOWS, contourRegionsOf, parseConfig, parseProposalSections, type Point, ROOT_BONE, type SkeletonSections, weightsABone } from './config.ts';
|
|
77
77
|
import { computeExactFrameTransforms, cropToSpineY, normaliseDegrees, toWorld } from './coords.ts';
|
|
78
78
|
import { PartsError, type Problem, refuseIfAny } from './errors.ts';
|
package/src/turn.ts
CHANGED
|
@@ -38,7 +38,7 @@ import { sampleTurnTriangleField, turnTriangleCoordinates } from './turnfield.ts
|
|
|
38
38
|
import { PartsError } from './errors.ts';
|
|
39
39
|
import { f32 } from '@rig-c/core/compile';
|
|
40
40
|
import { warnUncoveredBodyTurn } from './turncoverage.ts';
|
|
41
|
-
import { evaluateDeformTransform } from '@rig-c/core/
|
|
41
|
+
import { evaluateDeformTransform } from '@rig-c/core/deformgen';
|
|
42
42
|
|
|
43
43
|
/**
|
|
44
44
|
* The layers that ride on the face (issue #271): See-through makes no depth
|
package/src/turncoverage.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
/** Report missing body-turn declarations from shown setup alpha and emitted fields. */
|
|
2
2
|
import { f32 } from '@rig-c/core/compile';
|
|
3
|
-
import { DRAWN_ALPHA } from '@rig-c/core/
|
|
4
|
-
import { evaluateDeformTransform, type DeformTransform } from '@rig-c/core/
|
|
3
|
+
import { DRAWN_ALPHA } from '@rig-c/core/passthrough';
|
|
4
|
+
import { evaluateDeformTransform, type DeformTransform } from '@rig-c/core/deformgen';
|
|
5
5
|
import { computeWorldTransforms, paintingToSetupPoint, toWorld } from './coords.ts';
|
|
6
6
|
import { extendDepthSilhouette, sampleDepthFloat } from './depthsheets.ts';
|
|
7
7
|
import { edgeLength } from './length.ts';
|
package/src/turnoverlap.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/** Source-alpha overlap selects turn fields, never skin bindings. */
|
|
2
|
-
import { DRAWN_ALPHA } from '@rig-c/core/
|
|
2
|
+
import { DRAWN_ALPHA } from '@rig-c/core/passthrough';
|
|
3
3
|
import { computeWorldTransforms, setupToPaintingPoint, toWorld } from './coords.ts';
|
|
4
4
|
import type { Depth25DTurnOptions } from './turn.ts';
|
|
5
5
|
import type { Problem } from './errors.ts';
|