@rig-c/core 2.64.1 → 2.64.3

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 CHANGED
@@ -299,7 +299,11 @@ and it never counts a slot whose bone the posed skin leaves unposed (a `"skin":
299
299
  bone the skin does not name, or any bone below one, §3.4.8), which draws no pixel;
300
300
  when every drawn slot is such a slot, the render is refused by name (§3.4). Three commands take `--out`: a directory for `render`
301
301
  (default `render/`), the `.html` file for `preview` (default `preview.html`) and
302
- for `vote` (default `ballot.html`).
302
+ for `vote` (default `ballot.html`). Under `render`'s `--out` each animation is a set
303
+ directory named by the rate (the `--fps` row): `<anim>/` at the default,
304
+ `<anim>@<fps>fps/` at any other — `--fps 24` writes `<anim>@24fps/`, and the default 12 writes `<anim>/`. The line `render` prints for
305
+ each set ends in the directory it wrote, and `frames.json` beside the sets names
306
+ each under `sets[].dir` — read the folder from there, not from the animation's name.
303
307
 
304
308
  `guide` reads this page rather than a rig: `rigc guide <RULE>` prints the row of §5
305
309
  (or of `docs/INGEST.md`'s finding-code table) for the rule a failure line names, and
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@rig-c/core",
3
- "version": "2.64.1",
3
+ "version": "2.64.3",
4
4
  "description": "AI-authored 2D rigging and animation, verified before it is written. rigc compiles a rig spec into skeleton data in the Spine 4.3 format, gates it with named assertions held to a spine-core round trip's verdicts, and emits nothing that fails. Ships as an agent skill.",
5
5
  "type": "module",
6
6
  "bin": {
package/src/cli/shared.ts CHANGED
@@ -55,6 +55,8 @@ import {
55
55
  GeometryError,
56
56
  POSER_NAMES,
57
57
  PoserChoiceError,
58
+ frameSetDir,
59
+ FRAMES_SIDECAR,
58
60
  type PoserName,
59
61
  PROTOCOL_FPS,
60
62
  UnframeablePoseError,
@@ -1753,7 +1755,14 @@ export const COMMANDS: CommandDoc[] = [
1753
1755
  ],
1754
1756
  flags: ['candidate', 'atlas', 'animation', 'skin', 'slot', 'hide', 'fps', 'max', 'viewport', 'viewport-from', 'geometry', 'folds', 'pass-through', 'seam', 'overlaps', 'angle-range', 'environment', 'poser', 'out'],
1755
1757
  overrides: {
1756
- out: { value: '<dir>', meaning: 'directory to write the frame series into (default `render/`)' },
1758
+ out: {
1759
+ value: '<dir>',
1760
+ meaning:
1761
+ 'directory to write the frame series into (default `render/`). Each animation is a set directory under it, named by the rate (see --fps): ' +
1762
+ `\`${frameSetDir('<anim>', PROTOCOL_FPS)}/\` at the default, \`${frameSetDir('<anim>', 24).split('24').join('<fps>')}/\` at any other — ` +
1763
+ `\`--fps 24\` writes \`${frameSetDir('<anim>', 24)}/\`, and the default ${PROTOCOL_FPS} writes \`${frameSetDir('<anim>', PROTOCOL_FPS)}/\`. ` +
1764
+ `The line printed for each set ends in the directory it wrote, and ${FRAMES_SIDECAR} beside the sets names each under \`sets[].dir\``,
1765
+ },
1757
1766
  fps: {
1758
1767
  meaning:
1759
1768
  `frames per second to sample the animation at (default ${PROTOCOL_FPS}). A set drawn at any rate but the default is written to ` +
@@ -889,6 +889,18 @@ export function stepPhysics(r: CorePhysicsRecord, w: CoreWorld, length: number,
889
889
  const k = 1 + (s.scaleOffset - s.scaleLag * z) * mix * r.scaleX;
890
890
  w.a *= k;
891
891
  w.c *= k;
892
+ // The transverse column follows the authored mode (issue #1453), after
893
+ // the X column: the native Volume branch bounds reciprocal compression
894
+ // below 0.7; it is not an area-preservation promise on that branch.
895
+ if (r.scaleYMode === 'Uniform') {
896
+ w.b *= k;
897
+ w.d *= k;
898
+ } else if (r.scaleYMode === 'Volume') {
899
+ const magnitude = Math.abs(k);
900
+ const transverse = magnitude >= 0.7 ? 1 / magnitude : 4 - 3.67347 * magnitude;
901
+ w.b *= transverse;
902
+ w.d *= transverse;
903
+ }
892
904
  }
893
905
  s.tx = l * w.a;
894
906
  s.ty = l * w.c;