@energy8platform/golem 0.2.0 → 0.3.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 +11 -2
- package/dist/editor.js +502 -87
- package/dist/lib/cli.js +1309 -359
- package/dist/lib/cli.js.map +4 -4
- package/dist/lib/editor/stage.d.ts +7 -0
- package/dist/lib/editor/store.d.ts +72 -32
- package/dist/lib/editor-entry.js +1309 -359
- package/dist/lib/editor-entry.js.map +4 -4
- package/dist/lib/harness.js +162 -27
- package/dist/lib/preview/export-video.d.ts +12 -0
- package/dist/lib/preview/harness.d.ts +2 -0
- package/dist/lib/preview/render-preview.d.ts +6 -0
- package/dist/lib/rig-anim.d.ts +1 -1
- package/dist/lib/rig-check.d.ts +2 -1
- package/dist/lib/rig-constraints.d.ts +63 -0
- package/dist/lib/rig-format.d.ts +551 -325
- package/dist/lib/rig-gates.d.ts +209 -0
- package/dist/lib/rig-mesh.d.ts +1 -0
- package/dist/lib/rig-motion.d.ts +22 -0
- package/dist/lib/rig-qa.d.ts +35 -0
- package/dist/lib/rig-quality.d.ts +12 -0
- package/dist/lib/rig-runtime.d.ts +10 -1
- package/dist/lib/rig-state.d.ts +3 -0
- package/dist/lib/rig-tools.d.ts +5 -1
- package/dist/lib/runtime.js +146 -25
- package/dist/lib/runtime.js.map +3 -3
- package/dist/lib/tools.js +1291 -341
- package/dist/lib/tools.js.map +4 -4
- package/package.json +2 -2
package/dist/lib/runtime.js.map
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/rig-runtime.ts", "../../src/rig-format.ts", "../../src/rig-deform.ts", "../../src/rig-anim.ts", "../../src/rig-state.ts", "../../src/rig-symbol.ts"],
|
|
4
|
-
"sourcesContent": ["/**\n * rig-runtime v2 \u2014 PixiJS (v8) binding for `energy8.rig` documents.\n *\n * - Pose math lives in rig-anim.ts / rig-deform.ts (pure); this file only owns display objects.\n * - One display object per attachment: region \u2192 Sprite (or a 9\u00D79 MeshPlane when a lattice deform animates it),\n * mesh \u2192 Mesh with its own geometry, vertices skinned on the CPU every pose (positions in document space).\n * - All display objects live in ONE flat container sorted by draw order (slot z, or the drawOrder track).\n * - play/tick/stop are a thin wrapper over an AnimationState (see rig-state.ts) kept for simple consumers\n * (harness, viewer). Games should drive `state` directly for queues, priorities and overlays.\n */\nimport { Container, Sprite, Mesh, MeshGeometry, MeshPlane, Texture, Matrix, Rectangle } from \"pixi.js\";\nimport { parse, type RigDocument, type Slot, type Attachment, type Asset } from \"./rig-format\";\nimport { evaluate, regionMatrix, regionSize, attachmentWorldVertices, colorToArray, pk, deformParams, type Pose, type Affine, type Skeleton } from \"./rig-anim\";\nimport { controlOffsets, gridPositions } from \"./rig-deform\";\nimport { AnimationState, type PlayResult } from \"./rig-state\";\n\nconst DEG = Math.PI / 180;\n/** vertices per axis of a lattice-deformed region's render mesh (8 segments) */\nexport const MESH_GRID = 9;\n\nexport interface PlayOptions {\n loop?: boolean;\n /** crossfade seconds from current pose */\n mix?: number;\n onComplete?: () => void;\n onEvent?: (name: string, payload?: Record<string, unknown>) => void;\n}\n\ninterface Item {\n att: Attachment;\n slot: Slot;\n node: Sprite | MeshPlane | Mesh;\n /** lattice-deformed region */\n lattice?: { plane: MeshPlane; offsets: Float64Array; applied: Float64Array };\n /** skinned mesh */\n skinned?: { mesh: Mesh; positions: Float32Array };\n}\n\n/** Build the asset-id \u2192 Texture map, loading each `src` once and cutting atlas frames (with rotation and trim). */\nexport async function createTextures(doc: RigDocument, loadSource: (src: string) => Promise<Texture>): Promise<Map<string, Texture>> {\n const bySrc = new Map<string, Texture>(), out = new Map<string, Texture>();\n for (const a of doc.assets) {\n let base = bySrc.get(a.src);\n if (!base) bySrc.set(a.src, (base = await loadSource(a.src)));\n if (!a.frame) { out.set(a.id, base); continue; }\n const [fx, fy, w, h] = a.frame; // unrotated trimmed size\n const trimmed = !!a.trim || w !== a.width || h !== a.height;\n const [ox, oy] = a.trim ?? [0, 0];\n out.set(a.id, new Texture({\n source: base.source,\n frame: new Rectangle(fx, fy, a.rotate ? h : w, a.rotate ? w : h),\n orig: new Rectangle(0, 0, a.width, a.height),\n // packer offsets: x from the left, y from the BOTTOM: top-left of the trimmed image in the original\n trim: trimmed ? new Rectangle(ox, a.height - oy - h, w, h) : undefined,\n rotate: a.rotate ? 2 : 0,\n }));\n }\n return out;\n}\n\n/**\n * Atlas-space uv (0..1 over the source image) for a point given in original-image fractions,\n * honouring frame, trim and 90\u00B0 packing rotation.\n */\nexport function atlasUV(asset: Asset, u: number, v: number, sourceW: number, sourceH: number): [number, number] {\n if (!asset.frame) return [u, v];\n // frame = [x, y, w, h]: packed position with w/h of the UNROTATED trimmed image; trim = packer offsets\n // (offsetY measured from the bottom, as in the Spine atlas format); width/height = original image size\n const [fx, fy, w, h] = asset.frame, [ox, oy] = asset.trim ?? [0, 0], W = asset.width, H = asset.height;\n let ax: number, ay: number;\n if (asset.rotate) { ax = fx - (H - oy - h) + v * H; ay = fy - (W - ox - w) + (1 - u) * W; }\n else { ax = fx - ox + u * W; ay = fy - (H - oy - h) + v * H; }\n return [ax / sourceW, ay / sourceH];\n}\n\nconst rgbOf = (c: number[]) => ((Math.round(c[0] * 255) << 16) | (Math.round(c[1] * 255) << 8) | Math.round(c[2] * 255));\n\n/** element-wise equality \u2014 used by updateDoc to tell mesh geometry (uvs/triangles) changes from vertex/weight ones */\nconst sameNumbers = (a: readonly number[], b: readonly number[]) => a === b || (a.length === b.length && a.every((v, i) => v === b[i]));\n\nexport class RigPlayer {\n readonly view = new Container();\n readonly state: AnimationState;\n private items: Item[] = [];\n private skel!: Skeleton;\n private textures: Map<string, Texture>;\n private pages = new Map<unknown, Texture>();\n /** slots the editor hides; honoured by setPose */\n private hidden = new Set<string>();\n\n /** `mix`: default crossfade seconds for state transitions (setBase, completion \u2192 base); play() passes its own */\n constructor(public doc: RigDocument, textures: Map<string, Texture>, opts: { mix?: number } = {}) {\n // Reject invalid hierarchies before any traversal can stall.\n parse(doc);\n this.textures = textures;\n this.view.sortableChildren = true;\n const latticed = new Set<string>();\n for (const a of doc.animations) for (const t of a.tracks) if (t.target === \"deform\" && t.prop !== \"vertices\") latticed.add(t.id);\n const slots = new Map(doc.slots.map(s => [s.id, s]));\n for (const att of doc.attachments) {\n const slot = slots.get(att.slot);\n if (!slot || att.type === \"path\") continue;\n let item: Item;\n if (att.type === \"mesh\") {\n const asset = doc.assets.find(a => a.id === att.asset)!;\n const tex = this.textures.get(att.asset) ?? Texture.EMPTY;\n const page = this.pageTexture(tex);\n const n = att.uvs.length / 2, uvs = new Float32Array(n * 2), positions = new Float32Array(n * 2);\n for (let i = 0; i < n; i++) {\n const [u, v] = atlasUV(asset, att.uvs[i * 2], att.uvs[i * 2 + 1], page.width, page.height);\n uvs[i * 2] = u; uvs[i * 2 + 1] = v;\n }\n const geometry = new MeshGeometry({ positions, uvs, indices: new Uint32Array(att.triangles) });\n const mesh = new Mesh({ geometry, texture: page });\n item = { att, slot, node: mesh, skinned: { mesh, positions } };\n } else if (latticed.has(att.id)) {\n const plane = new MeshPlane({ texture: this.textures.get(att.asset) ?? Texture.EMPTY, verticesX: MESH_GRID, verticesY: MESH_GRID });\n plane.autoResize = false;\n item = { att, slot, node: plane, lattice: { plane, offsets: new Float64Array(18), applied: new Float64Array(18).fill(NaN) } };\n } else {\n const sp = new Sprite(this.textures.get(att.asset) ?? Texture.EMPTY);\n sp.anchor.set(0.5, 0.5);\n item = { att, slot, node: sp };\n }\n item.node.blendMode = slot.blend;\n this.items.push(item);\n this.view.addChild(item.node);\n }\n this.state = new AnimationState(this, { mix: opts.mix ?? 0 });\n this.setPose(new Map());\n }\n\n /** whole atlas page as a plain texture (identity uv mapping) for skinned meshes */\n private pageTexture(tex: Texture): Texture {\n let page = this.pages.get(tex.source);\n if (!page) this.pages.set(tex.source, (page = tex.frame.x === 0 && tex.frame.y === 0 && tex.frame.width === tex.source.width && tex.frame.height === tex.source.height && !tex.rotate ? tex : new Texture({ source: tex.source })));\n return page;\n }\n\n /** Replace whatever is playing (no queueing). Resolves when the animation completes or is replaced. */\n play(animId: string, opts: PlayOptions = {}): Promise<PlayResult> {\n this.state.onEvent = opts.onEvent;\n return this.state.play(animId, {\n loop: opts.loop, mix: opts.mix ?? 0, ifBusy: \"interrupt\",\n onComplete: r => { if (r === \"completed\") opts.onComplete?.(); },\n });\n }\n\n /**\n * Swap the document for pose evaluation without rebuilding display objects \u2014 valid only when slots/attachments\n * keep their ids and types (the editor uses it during drags). Throws otherwise: rebuild the player.\n */\n updateDoc(doc: RigDocument) {\n const atts = new Map(doc.attachments.map(a => [a.id, a])), slots = new Map(doc.slots.map(s => [s.id, s]));\n for (const it of this.items) {\n const a = atts.get(it.att.id), s = slots.get(it.slot.id);\n if (!a || !s || a.type !== it.att.type) throw new Error(\"updateDoc: structure changed \u2014 rebuild the player\");\n // mesh geometry (uvs/indices, including vertex count via uvs.length) is baked into the MeshGeometry in\n // the constructor \u2014 a changed uv/triangle set needs a rebuild; vertex/weight VALUES are fine (skinning\n // happens per-pose in setPose, not here).\n if (a.type === \"mesh\" && it.att.type === \"mesh\" && (!sameNumbers(a.uvs, it.att.uvs) || !sameNumbers(a.triangles, it.att.triangles)))\n throw new Error(\"updateDoc: structure changed \u2014 rebuild the player\");\n it.att = a; it.slot = s; it.node.blendMode = s.blend;\n }\n this.doc = doc;\n }\n\n /** Editor-only: hide a slot's display object regardless of the pose (restored by passing `true`). */\n setSlotVisible(slotId: string, visible: boolean) {\n if (visible) this.hidden.delete(slotId); else this.hidden.add(slotId);\n }\n\n /** Stop playback and immediately restore the complete setup pose. */\n stop() { this.state.stop(); }\n\n /** dt in seconds */\n tick(dt: number) { this.state.update(dt); }\n\n /** Apply a pose (rest where silent) to the display objects. */\n setPose(pose: Pose) {\n const skel = (this.skel = evaluate(this.doc, pose));\n const m = new Matrix();\n // draw order: the drawOrder track lists slots back-to-front, else slot z\n const orderV = pose.get(pk(\"drawOrder\", \"order\", \"order\"));\n const order = new Map<string, number>();\n if (Array.isArray(orderV)) (orderV as string[]).forEach((id, i) => order.set(id, i));\n for (const it of this.items) {\n const s = it.slot, shown = skel.attachment.get(s.id);\n if (shown !== it.att || this.hidden.has(s.id)) { it.node.visible = false; continue; }\n it.node.visible = true;\n const colorV = pose.get(pk(\"slot\", s.id, \"color\"));\n const color = Array.isArray(colorV) && typeof colorV[0] === \"number\" ? (colorV as number[]) : colorToArray(s.color);\n it.node.alpha = numOf(pose, pk(\"slot\", s.id, \"alpha\"), s.alpha) * color[3];\n it.node.tint = rgbOf(color);\n it.node.zIndex = order.size ? (order.get(s.id) ?? 0) : numOf(pose, pk(\"slot\", s.id, \"z\"), s.z);\n if (it.skinned) {\n const v = attachmentWorldVertices(skel, s.id, it.att as Extract<Attachment, { type: \"mesh\" }>);\n const buf = it.skinned.mesh.geometry.getBuffer(\"aPosition\");\n (buf.data as Float32Array).set(v);\n buf.update();\n continue; // positions are in document space; the node stays at identity\n }\n const att = it.att as Extract<Attachment, { type: \"region\" }>;\n const [w, h] = regionSize(this.doc, att);\n if (it.lattice) {\n const off = controlOffsets(deformParams(pose, att.id) ?? {}, w, h, { x: 0.5, y: 0.5 }, it.lattice.offsets);\n if (!same(off, it.lattice.applied)) {\n const buf = it.lattice.plane.geometry.getBuffer(\"aPosition\");\n gridPositions(off, w, h, { x: 0.5, y: 0.5 }, MESH_GRID, buf.data as Float32Array);\n buf.update();\n it.lattice.applied.set(off);\n }\n } else {\n const sp = it.node as Sprite, tex = this.textures.get(att.asset);\n if (tex && sp.texture !== tex) sp.texture = tex;\n // drawn size may differ from the asset size\n if (tex && (att.width || att.height)) { sp.width = w; sp.height = h; }\n }\n const a = regionMatrix(skel, s.id, att);\n m.set(a.a, a.b, a.c, a.d, a.tx, a.ty);\n it.node.setFromMatrix(m);\n if (!it.lattice && (att.width || att.height)) { it.node.scale.x *= w / (this.textures.get(att.asset)?.width ?? w); it.node.scale.y *= h / (this.textures.get(att.asset)?.height ?? h); }\n }\n }\n\n /** World-space bone positions \u2014 used by editor gizmos and renderPreview overlays */\n bonePositions(): Record<string, { x: number; y: number; rotation: number }> {\n const out: Record<string, { x: number; y: number; rotation: number }> = {};\n for (const [id, st] of this.skel.bones) out[id] = { x: st.world.tx, y: st.world.ty, rotation: Math.atan2(st.world.b, st.world.a) / DEG };\n return out;\n }\n\n /** current world transforms (for tests and tools) */\n get world(): Map<string, Affine> { return new Map([...this.skel.bones].map(([id, s]) => [id, s.world])); }\n}\n\nconst numOf = (pose: Pose, key: string, rest: number) => { const v = pose.get(key); return typeof v === \"number\" ? v : rest; };\nconst same = (a: Float64Array, b: Float64Array) => { for (let i = 0; i < a.length; i++) if (a[i] !== b[i]) return false; return true; };\n", "/**\n * rig-format v2 \u2014 declarative rig document for slot animation.\n * Source of truth for both AI agents and the editor.\n *\n * Conventions (agents rely on these, keep them stable):\n * - Units: pixels in document space, origin top-left, Y down (PixiJS).\n * - Rotation: degrees, clockwise positive. Shear: degrees added to the x axis (shearX) / y axis (shearY).\n * - Bone transforms are LOCAL (relative to parent, subject to `inherit`). Root bones \u2014 relative to document.\n * - Time: seconds. Animation duration is explicit, keys may end earlier.\n * - Ids: snake_case, unique within their collection.\n *\n * v2 (Spine-class): attachments are first-class (region / mesh with weights / path), bones have shear and\n * inherit modes, slots have a colour, constraints (ik / transform / path) with their own tracks, deform tracks\n * carry vertex offsets, drawOrder tracks. v0/v1 documents are migrated on parse (slot pivot/offset \u2192 region attachment).\n */\nimport { z } from \"zod\";\nimport { DEFORM_PROP_RE, DEFORM_BOUNDS } from \"./rig-deform\";\n\n// ---------- primitives ----------\n\n/** the shape of every id in the format; exported so UIs can check a typed id before building a tool call */\nexport const ID_RE = /^[a-z][a-z0-9_]*$/;\nexport const Id = z.string().regex(ID_RE, \"snake_case id\");\n\nexport const Ease = z.union([\n z.enum([\"linear\", \"step\", \"ease_in\", \"ease_out\", \"ease_in_out\", \"back_out\", \"elastic_out\"]),\n // cubic-bezier control points, same semantics as CSS\n z.object({ bezier: z.tuple([z.number(), z.number(), z.number(), z.number()]) }),\n]);\n\nexport const Transform = z.object({\n x: z.number().default(0),\n y: z.number().default(0),\n rotation: z.number().default(0),\n scaleX: z.number().default(1),\n scaleY: z.number().default(1),\n shearX: z.number().default(0),\n shearY: z.number().default(0),\n});\n\nexport const Color = z.string().regex(/^#[0-9a-fA-F]{8}$/, \"color must be #rrggbbaa\");\nexport const Blend = z.enum([\"normal\", \"add\", \"multiply\", \"screen\"]);\nexport const Inherit = z.enum([\"normal\", \"onlyTranslation\", \"noRotationOrReflection\", \"noScale\", \"noScaleOrReflection\"]);\n\n// ---------- assets ----------\n\nexport const Asset = z.object({\n id: Id,\n /** relative path inside the rig package, e.g. \"layers/arm_l.png\" */\n src: z.string(),\n /** original (untrimmed, unrotated) image size \u2014 the space attachments and uvs refer to */\n width: z.number().int().positive(),\n height: z.number().int().positive(),\n /** packed region [x, y, w, h] inside `src` when `src` is an atlas (w/h as packed: trimmed, rotated) */\n frame: z.tuple([z.number(), z.number(), z.number(), z.number()]).optional(),\n /** the packed region is stored rotated 90\u00B0 clockwise */\n rotate: z.union([z.literal(0), z.literal(90)]).default(0),\n /** offset [x, y] of the packed (trimmed) region inside the original image */\n trim: z.tuple([z.number(), z.number()]).optional(),\n /** where this layer came from \u2014 provenance for agents */\n origin: z\n .object({\n sourceImage: z.string().optional(),\n /** bbox in source image: [x, y, w, h] */\n bbox: z.tuple([z.number(), z.number(), z.number(), z.number()]).optional(),\n inpainted: z.boolean().default(false),\n prompt: z.string().optional(),\n })\n .optional(),\n});\n\n// ---------- skeleton ----------\n\nexport const Bone = z.object({\n id: Id,\n parent: Id.optional(),\n /** visual length for the editor gizmo and for chains (ik/path), no effect on child transforms */\n length: z.number().nonnegative().default(0),\n transform: Transform.default({}),\n /** which parts of the parent's world transform this bone inherits */\n inherit: Inherit.default(\"normal\"),\n /** semantic hint: \"head\", \"arm_l\", \"torso\"\u2026 drives auto-rig & presets */\n role: z.string().optional(),\n /** editor colour, no runtime effect */\n color: z.string().optional(),\n});\n\nexport const Slot = z.object({\n id: Id,\n bone: Id,\n /** active attachment id; undefined = hidden */\n attachment: Id.optional(),\n alpha: z.number().min(0).max(1).default(1),\n /** draw order, higher = on top */\n z: z.number().int().default(0),\n /** blend mode: `add` for glows/fire on black, `multiply` for shadows */\n blend: Blend.default(\"normal\"),\n /** tint, #rrggbbaa */\n color: Color.default(\"#ffffffff\"),\n});\n\n// ---------- attachments ----------\n\n/** one bone's influence on a vertex: position in that bone's local space and weight */\nexport const Influence = z.object({ bone: Id, x: z.number(), y: z.number(), w: z.number() });\nconst VertexData = {\n /** unweighted: [x, y, \u2026] in the slot bone's local space */\n vertices: z.array(z.number()).optional(),\n /** weighted: one influence list per vertex */\n weights: z.array(z.array(Influence).min(1)).optional(),\n};\n\nexport const RegionAttachment = z.object({\n id: Id, slot: Id, type: z.literal(\"region\"),\n asset: Id,\n /** placement of the image centre in the slot bone's local space */\n x: z.number().default(0), y: z.number().default(0), rotation: z.number().default(0),\n scaleX: z.number().default(1), scaleY: z.number().default(1),\n /** drawn size; default: the asset size */\n width: z.number().positive().optional(), height: z.number().positive().optional(),\n});\nexport const MeshAttachment = z.object({\n id: Id, slot: Id, type: z.literal(\"mesh\"),\n asset: Id,\n /** texture coordinates 0..1 in the asset's original image, 2 per vertex */\n uvs: z.array(z.number()),\n triangles: z.array(z.number().int().nonnegative()),\n ...VertexData,\n /** number of hull vertices (the outline is uvs[0..hull)) */\n hull: z.number().int().nonnegative().default(0),\n width: z.number().positive().optional(), height: z.number().positive().optional(),\n});\nexport const PathAttachment = z.object({\n id: Id, slot: Id, type: z.literal(\"path\"),\n ...VertexData,\n /** curve lengths for constant-speed positioning */\n lengths: z.array(z.number()).default([]),\n closed: z.boolean().default(false),\n constantSpeed: z.boolean().default(true),\n});\nexport const Attachment = z.discriminatedUnion(\"type\", [RegionAttachment, MeshAttachment, PathAttachment]);\n\n// ---------- constraints ----------\n\nexport const IkConstraint = z.object({\n id: Id, order: z.number().int().default(0),\n bones: z.array(Id).min(1), target: Id,\n mix: z.number().default(1), softness: z.number().default(0),\n bendPositive: z.boolean().default(true), compress: z.boolean().default(false), stretch: z.boolean().default(false), uniform: z.boolean().default(false),\n});\nexport const TransformConstraint = z.object({\n id: Id, order: z.number().int().default(0),\n bones: z.array(Id).min(1), target: Id,\n local: z.boolean().default(false), relative: z.boolean().default(false),\n rotation: z.number().default(0), x: z.number().default(0), y: z.number().default(0),\n scaleX: z.number().default(0), scaleY: z.number().default(0), shearY: z.number().default(0),\n mixRotate: z.number().default(1), mixX: z.number().default(1), mixY: z.number().default(1),\n mixScaleX: z.number().default(1), mixScaleY: z.number().default(1), mixShearY: z.number().default(1),\n});\nexport const PathConstraint = z.object({\n id: Id, order: z.number().int().default(0),\n bones: z.array(Id).min(1),\n /** slot whose active attachment is a path */\n target: Id,\n positionMode: z.enum([\"fixed\", \"percent\"]).default(\"percent\"),\n spacingMode: z.enum([\"length\", \"fixed\", \"percent\", \"proportional\"]).default(\"length\"),\n rotateMode: z.enum([\"tangent\", \"chain\", \"chainScale\"]).default(\"tangent\"),\n rotation: z.number().default(0), position: z.number().default(0), spacing: z.number().default(0),\n mixRotate: z.number().default(1), mixX: z.number().default(1), mixY: z.number().default(1),\n});\n\n/**\n * The mix channels that switch each kind of constraint on \u2014 the solvers' own early-outs, in one place:\n * `applyIk` returns at `mix <= 0`, `applyTransformConstraint` and `applyPathConstraint` when every mix here is 0.\n * `rig_check` (`constraint_dead`), the editor's drag redirection and the constraint forms all read this list, so\n * an early-out that ever changes has a single definition to change with it. They are also the keyable mix tracks.\n */\nexport const MIX_PROPS = {\n ik: [\"mix\"],\n transform: [\"mixRotate\", \"mixX\", \"mixY\", \"mixScaleX\", \"mixScaleY\", \"mixShearY\"],\n path: [\"mixRotate\", \"mixX\", \"mixY\"],\n} as const;\n\n// ---------- animation ----------\n\nexport const BoneProp = z.enum([\"x\", \"y\", \"rotation\", \"scaleX\", \"scaleY\", \"shearX\", \"shearY\"]);\nexport const SlotProp = z.enum([\"alpha\", \"attachment\", \"z\", \"color\"]);\n/** lattice params (fractions of the image size), p<row><col>x|y pixel offsets of one control point, or `vertices` (mesh offsets) */\nexport const DeformProp = z.string().regex(/^(bulge|bend|sway|squash|p[0-2][0-2][xy]|vertices)$/, \"deform prop must be bulge|bend|sway|squash|p<row><col>x|y|vertices\");\nexport const IkProp = z.enum([\"mix\", \"softness\", \"bendPositive\", \"compress\", \"stretch\"]);\nexport const TransformProp = z.enum([\"mixRotate\", \"mixX\", \"mixY\", \"mixScaleX\", \"mixScaleY\", \"mixShearY\"]);\nexport const PathProp = z.enum([\"position\", \"spacing\", \"mixRotate\", \"mixX\", \"mixY\"]);\n\nexport const KeyValue = z.union([z.number(), z.string(), z.null(), z.array(z.number()), z.array(z.string())]);\nexport const Key = z.object({\n t: z.number().nonnegative(),\n v: KeyValue,\n /** easing INTO the next key */\n ease: Ease.default(\"ease_in_out\"),\n});\n\nexport const Track = z.discriminatedUnion(\"target\", [\n z.object({ target: z.literal(\"bone\"), id: Id, prop: BoneProp, keys: z.array(Key).min(1) }),\n z.object({ target: z.literal(\"slot\"), id: Id, prop: SlotProp, keys: z.array(Key).min(1) }),\n z.object({ target: z.literal(\"deform\"), id: Id, prop: DeformProp, keys: z.array(Key).min(1) }),\n z.object({ target: z.literal(\"ik\"), id: Id, prop: IkProp, keys: z.array(Key).min(1) }),\n z.object({ target: z.literal(\"transform\"), id: Id, prop: TransformProp, keys: z.array(Key).min(1) }),\n z.object({ target: z.literal(\"path\"), id: Id, prop: PathProp, keys: z.array(Key).min(1) }),\n z.object({ target: z.literal(\"drawOrder\"), id: Id.default(\"order\"), prop: z.literal(\"order\").default(\"order\"), keys: z.array(Key).min(1) }),\n]);\n\nexport const Event = z.object({\n t: z.number().nonnegative(),\n name: z.string(),\n payload: z.record(z.unknown()).optional(),\n});\n\nexport const Animation = z.object({\n id: Id,\n duration: z.number().positive(),\n loop: z.boolean().default(false),\n tracks: z.array(Track).default([]),\n events: z.array(Event).default([]),\n /** if generated from a preset \u2014 keep params so the agent can re-tune instead of re-keying */\n preset: z.object({ name: z.string(), params: z.record(z.unknown()) }).optional(),\n});\n\n// ---------- document ----------\n\n/** the editor's reference underlay: a PNG in the rig's directory drawn under the canvas \u2014 runtime, preview and export ignore it */\nexport const Reference = z.object({\n src: z.string(),\n opacity: z.number().min(0).max(1).default(0.5),\n x: z.number().default(0), y: z.number().default(0),\n scale: z.number().positive().default(1),\n});\n\nexport const RigSchema = z.object({\n format: z.literal(\"energy8.rig\"),\n version: z.literal(2),\n meta: z.object({\n name: z.string(),\n width: z.number().int().positive(),\n height: z.number().int().positive(),\n /** free-form notes for agents & humans: what this rig is, what's intentionally missing */\n notes: z.string().optional(),\n reference: Reference.optional(),\n }),\n assets: z.array(Asset),\n bones: z.array(Bone).min(1),\n slots: z.array(Slot),\n attachments: z.array(Attachment).default([]),\n ik: z.array(IkConstraint).default([]),\n transform: z.array(TransformConstraint).default([]),\n path: z.array(PathConstraint).default([]),\n animations: z.array(Animation),\n});\n\n/** schema that also accepts v0/v1 input (migrated on the fly) */\nexport const RigDocument = z.preprocess(input => {\n const v = (input as { version?: unknown } | null)?.version;\n return v === 0 || v === 1 ? migrateV1(input) : input;\n}, RigSchema);\n\nexport type RigDocument = z.infer<typeof RigSchema>;\nexport type Bone = z.infer<typeof Bone>;\nexport type Slot = z.infer<typeof Slot>;\nexport type Asset = z.infer<typeof Asset>;\nexport type Reference = z.infer<typeof Reference>;\nexport type Attachment = z.infer<typeof Attachment>;\nexport type RegionAttachment = z.infer<typeof RegionAttachment>;\nexport type MeshAttachment = z.infer<typeof MeshAttachment>;\nexport type PathAttachment = z.infer<typeof PathAttachment>;\nexport type Influence = z.infer<typeof Influence>;\nexport type IkConstraint = z.infer<typeof IkConstraint>;\nexport type TransformConstraint = z.infer<typeof TransformConstraint>;\nexport type PathConstraint = z.infer<typeof PathConstraint>;\nexport type Animation = z.infer<typeof Animation>;\nexport type Track = z.infer<typeof Track>;\nexport type Key = z.infer<typeof Key>;\n\n// ---------- v1 \u2192 v2 migration ----------\n\nconst DEG = Math.PI / 180;\n\n/**\n * v0/v1: slot placement lived on the slot (pivot fraction + bone-local offset) and `attachment` named an ASSET.\n * v2: every showable image is a region attachment with its own placement; deform tracks target attachments.\n */\nexport function migrateV1(input: unknown): unknown {\n const doc = input as Record<string, any>;\n const assets: any[] = doc.assets ?? [], slots: any[] = doc.slots ?? [], anims: any[] = doc.animations ?? [];\n const assetById = new Map(assets.map(a => [a.id, a]));\n // which assets each slot can show: rest attachment + every attachment key value\n const shows = new Map<string, Set<string>>();\n const add = (slot: string, asset: string) => (shows.get(slot) ?? shows.set(slot, new Set()).get(slot)!).add(asset);\n for (const s of slots) if (s.attachment) add(s.id, s.attachment);\n for (const a of anims) for (const t of a.tracks ?? [])\n if (t.target === \"slot\" && t.prop === \"attachment\") for (const k of t.keys ?? []) if (typeof k.v === \"string\") add(t.id, k.v);\n const usage = new Map<string, number>();\n for (const set of shows.values()) for (const asset of set) usage.set(asset, (usage.get(asset) ?? 0) + 1);\n const attachmentId = (slot: string, asset: string) => ((usage.get(asset) ?? 0) > 1 ? `${slot}_${asset}` : asset);\n\n const attachments: any[] = [];\n for (const s of slots) {\n const pivot = s.pivot ?? { x: 0.5, y: 0.5 }, o = { x: 0, y: 0, rotation: 0, scaleX: 1, scaleY: 1, ...(s.offset ?? {}) };\n for (const asset of shows.get(s.id) ?? []) {\n const a = assetById.get(asset);\n if (!a) continue;\n // image centre relative to the pivot point, then through the slot offset transform\n const cx = (0.5 - pivot.x) * a.width, cy = (0.5 - pivot.y) * a.height;\n const r = o.rotation * DEG, cos = Math.cos(r), sin = Math.sin(r);\n const x = o.x + cos * o.scaleX * cx - sin * o.scaleY * cy, y = o.y + sin * o.scaleX * cx + cos * o.scaleY * cy;\n attachments.push({ id: attachmentId(s.id, asset), slot: s.id, type: \"region\", asset, x: round(x), y: round(y), rotation: o.rotation, scaleX: o.scaleX, scaleY: o.scaleY });\n }\n }\n const restAttachment = (slot: string) => {\n const s = slots.find(x => x.id === slot);\n const first = s?.attachment ?? [...(shows.get(slot) ?? [])][0];\n return first ? attachmentId(slot, first) : undefined;\n };\n const newSlots = slots.map(s => {\n const { pivot, offset, attachment, ...rest } = s;\n return { ...rest, ...(attachment ? { attachment: attachmentId(s.id, attachment) } : {}) };\n });\n const newAnims = anims.map(a => ({\n ...a,\n tracks: (a.tracks ?? []).flatMap((t: any) => {\n if (t.target === \"slot\" && t.prop === \"attachment\")\n return [{ ...t, keys: t.keys.map((k: any) => ({ ...k, v: typeof k.v === \"string\" ? attachmentId(t.id, k.v) : k.v })) }];\n if (t.target === \"deform\") { const id = restAttachment(t.id); return id ? [{ ...t, id }] : []; }\n return [t];\n }),\n }));\n return { ...doc, version: 2, slots: newSlots, attachments: [...(doc.attachments ?? []), ...attachments], animations: newAnims };\n}\nconst round = (v: number) => Math.round(v * 1e6) / 1e6 + 0;\n\n// ---------- semantic validation (beyond shape) ----------\n\nconst trackId = (t: Track) => `${t.target}.${t.id}.${t.prop}`;\n\nexport function validate(doc: RigDocument): string[] {\n const errs: string[] = [];\n const dup = (xs: { id: string }[], kind: string) => {\n const seen = new Set<string>();\n for (const x of xs) {\n if (seen.has(x.id)) errs.push(`${kind}: duplicate id \"${x.id}\"`);\n seen.add(x.id);\n }\n };\n dup(doc.assets, \"asset\"); dup(doc.bones, \"bone\"); dup(doc.slots, \"slot\"); dup(doc.attachments, \"attachment\");\n dup(doc.animations, \"animation\"); dup(doc.ik, \"ik\"); dup(doc.transform, \"transform\"); dup(doc.path, \"path\");\n\n const bones = new Set(doc.bones.map(b => b.id));\n const assets = new Map(doc.assets.map(a => [a.id, a]));\n const slots = new Set(doc.slots.map(s => s.id));\n const attachments = new Map(doc.attachments.map(a => [a.id, a]));\n const iks = new Set(doc.ik.map(c => c.id)), transforms = new Set(doc.transform.map(c => c.id)), paths = new Set(doc.path.map(c => c.id));\n\n for (const b of doc.bones) {\n if (b.parent && !bones.has(b.parent)) errs.push(`bone \"${b.id}\": unknown parent \"${b.parent}\"`);\n }\n for (const b of doc.bones) {\n const seen = new Set<string>(); let cur: Bone | undefined = b;\n while (cur?.parent) {\n if (seen.has(cur.id)) { errs.push(`bone \"${b.id}\": parent cycle`); break; }\n seen.add(cur.id); cur = doc.bones.find(x => x.id === cur!.parent);\n }\n }\n if (!doc.bones.some(b => !b.parent)) errs.push(\"no root bone\");\n\n for (const a of doc.assets) {\n if (a.frame && (a.frame[2] <= 0 || a.frame[3] <= 0)) errs.push(`asset \"${a.id}\": frame must have positive size`);\n if (a.frame && !a.trim && !a.rotate && (a.frame[2] !== a.width || a.frame[3] !== a.height)) errs.push(`asset \"${a.id}\": frame size must equal width\u00D7height (or declare trim/rotate)`);\n }\n for (const s of doc.slots) {\n if (!bones.has(s.bone)) errs.push(`slot \"${s.id}\": unknown bone \"${s.bone}\"`);\n if (s.attachment) {\n const a = attachments.get(s.attachment);\n if (!a) errs.push(`slot \"${s.id}\": unknown attachment \"${s.attachment}\"`);\n else if (a.slot !== s.id) errs.push(`slot \"${s.id}\": attachment \"${s.attachment}\" belongs to slot \"${a.slot}\"`);\n }\n }\n const vertexCount = (a: Attachment): number => {\n if (a.type === \"region\") return 4;\n if (a.type === \"mesh\") return a.uvs.length / 2;\n return a.vertices ? a.vertices.length / 2 : a.weights?.length ?? 0;\n };\n for (const a of doc.attachments) {\n if (!slots.has(a.slot)) errs.push(`attachment \"${a.id}\": unknown slot \"${a.slot}\"`);\n if (a.type !== \"path\" && !assets.has(a.asset)) errs.push(`attachment \"${a.id}\": unknown asset \"${a.asset}\"`);\n if (a.type === \"mesh\" || a.type === \"path\") {\n const n = a.type === \"mesh\" ? a.uvs.length / 2 : vertexCount(a);\n if (a.type === \"mesh\") {\n if (a.uvs.length % 2 || n < 3) errs.push(`attachment \"${a.id}\": uvs must have 2 numbers per vertex, at least 3 vertices`);\n if (a.triangles.length % 3) errs.push(`attachment \"${a.id}\": triangles must have 3 indices each`);\n for (const i of a.triangles) if (i >= n) errs.push(`attachment \"${a.id}\": triangle index ${i} out of range (${n} vertices)`);\n }\n if ((a.vertices ? 1 : 0) + (a.weights ? 1 : 0) !== 1) errs.push(`attachment \"${a.id}\": exactly one of vertices / weights`);\n if (a.vertices && a.vertices.length !== 2 * n) errs.push(`attachment \"${a.id}\": vertices must have 2 numbers per vertex (${2 * n}, got ${a.vertices.length})`);\n if (a.weights) {\n if (a.weights.length !== n) errs.push(`attachment \"${a.id}\": weights must have one influence list per vertex (${n}, got ${a.weights.length})`);\n for (const list of a.weights) for (const inf of list) if (!bones.has(inf.bone)) errs.push(`attachment \"${a.id}\": weights reference unknown bone \"${inf.bone}\"`);\n }\n }\n }\n for (const c of doc.ik) {\n if (c.bones.length > 2) errs.push(`ik \"${c.id}\": must have 1 or 2 bones`);\n for (const b of c.bones) if (!bones.has(b)) errs.push(`ik \"${c.id}\": unknown bone \"${b}\"`);\n if (!bones.has(c.target)) errs.push(`ik \"${c.id}\": unknown target bone \"${c.target}\"`);\n }\n for (const c of doc.transform) {\n for (const b of c.bones) if (!bones.has(b)) errs.push(`transform \"${c.id}\": unknown bone \"${b}\"`);\n if (!bones.has(c.target)) errs.push(`transform \"${c.id}\": unknown target bone \"${c.target}\"`);\n }\n for (const c of doc.path) {\n for (const b of c.bones) if (!bones.has(b)) errs.push(`path \"${c.id}\": unknown bone \"${b}\"`);\n if (!slots.has(c.target)) errs.push(`path \"${c.id}\": unknown target slot \"${c.target}\"`);\n }\n\n for (const a of doc.animations) {\n const tracks = new Set<string>();\n for (const t of a.tracks) {\n const tid = trackId(t);\n if (tracks.has(tid)) errs.push(`animation \"${a.id}\": duplicate track ${tid}`);\n tracks.add(tid);\n const known = t.target === \"bone\" ? bones.has(t.id) : t.target === \"slot\" ? slots.has(t.id) : t.target === \"deform\" ? attachments.has(t.id)\n : t.target === \"ik\" ? iks.has(t.id) : t.target === \"transform\" ? transforms.has(t.id) : t.target === \"path\" ? paths.has(t.id) : true;\n if (!known) errs.push(`animation \"${a.id}\": unknown ${t.target} \"${t.id}\"`);\n const bound = t.target === \"deform\" ? (DEFORM_BOUNDS as Record<string, number | undefined>)[t.prop] : undefined;\n const att = t.target === \"deform\" ? attachments.get(t.id) : undefined;\n let prev = -1;\n for (const k of t.keys) {\n if (k.t <= prev && prev >= 0) errs.push(`animation \"${a.id}\" ${tid}: keys not strictly increasing`);\n if (k.t > a.duration) errs.push(`animation \"${a.id}\" ${tid}: key at ${k.t}s exceeds duration`);\n if (t.target === \"slot\" && t.prop === \"attachment\") {\n if (k.v !== null && typeof k.v !== \"string\") errs.push(`animation \"${a.id}\" ${tid}: attachment key must be an attachment id or null`);\n else if (typeof k.v === \"string\") {\n const target = attachments.get(k.v);\n if (!target) errs.push(`animation \"${a.id}\": unknown attachment \"${k.v}\"`);\n else if (target.slot !== t.id) errs.push(`animation \"${a.id}\" ${tid}: attachment \"${k.v}\" belongs to slot \"${target.slot}\"`);\n }\n } else if (t.target === \"slot\" && t.prop === \"color\") {\n const ok = Array.isArray(k.v) && k.v.length === 4 && k.v.every(c => typeof c === \"number\" && c >= 0 && c <= 1);\n if (!ok) errs.push(`animation \"${a.id}\" ${tid}: color key must be [r, g, b, a] in 0..1`);\n } else if (t.target === \"drawOrder\") {\n const order = Array.isArray(k.v) ? (k.v as unknown[]) : [];\n const ok = order.length === doc.slots.length && new Set(order).size === order.length && order.every(s => typeof s === \"string\" && slots.has(s));\n if (!ok) errs.push(`animation \"${a.id}\" drawOrder key at ${k.t}s must list every slot exactly once`);\n } else if (t.target === \"deform\" && t.prop === \"vertices\") {\n if (!Array.isArray(k.v) || !k.v.every(v => typeof v === \"number\")) errs.push(`animation \"${a.id}\" ${tid}: vertices key must be a number array`);\n else if (att && att.type !== \"region\") {\n const expected = att.weights ? 2 * att.weights.reduce((s, list) => s + list.length, 0) : 2 * vertexCount(att);\n if (k.v.length !== expected) errs.push(`animation \"${a.id}\" ${tid}: vertices key needs ${expected} numbers, got ${k.v.length}`);\n } else if (att) errs.push(`animation \"${a.id}\" ${tid}: vertices deform needs a mesh or path attachment`);\n } else if (typeof k.v !== \"number\") errs.push(`animation \"${a.id}\" ${tid}: key must be a number`);\n else if (bound !== undefined && Math.abs(k.v) > bound) errs.push(`animation \"${a.id}\" ${tid}: value ${k.v} out of range [-${bound}, ${bound}]`);\n prev = k.t;\n }\n }\n for (const e of a.events) {\n if (e.t > a.duration) errs.push(`animation \"${a.id}\": event \"${e.name}\" exceeds duration`);\n }\n }\n return errs;\n}\n\nexport function parse(input: unknown): RigDocument {\n const doc = RigDocument.parse(input);\n const errs = validate(doc);\n if (errs.length) throw new Error(\"rig validation failed:\\n\" + errs.join(\"\\n\"));\n return doc;\n}\n", "/**\n * rig-deform \u2014 3\u00D73 control-grid deformer for a slot's attachment (pure math, no PixiJS).\n *\n * Control points live on an interpolating biquadratic (Lagrange) patch over the image:\n * rows r=0..2 at v=0,0.5,1 of the height (top\u2192bottom), cols c=0..2 at u=0,0.5,1 of the width.\n * Each control point carries an offset (dx, dy) in image pixels. With zero offsets the patch is the\n * identity, and moving control point (r,c) by d moves the surface at that point by exactly d.\n *\n * Named params are dimensionless fractions of the image size (see spec \u00A71); raw `p<r><c>x|y` are pixels.\n * All contributions add.\n */\n\nexport const DEFORM_NAMED = [\"bulge\", \"bend\", \"sway\", \"squash\"] as const;\nexport const DEFORM_PROP_RE = /^(bulge|bend|sway|squash|p[0-2][0-2][xy])$/;\n/** |value| bound per named param. bulge/squash reach a degenerate (zero-area) patch at 1, hence 0.9. */\nexport const DEFORM_BOUNDS: Record<(typeof DEFORM_NAMED)[number], number> = { bulge: 0.9, bend: 1, sway: 1, squash: 0.9 };\n\nexport interface Pivot { x: number; y: number }\n\nconst T = [0, 0.5, 1];\nconst basis = (t: number) => [(1 - t) * (1 - 2 * t), 4 * t * (1 - t), t * (2 * t - 1)];\nconst dbasis = (t: number) => [4 * t - 3, 4 - 8 * t, 4 * t - 1];\n\n/** Named params + raw offsets \u2192 18 numbers [dx00, dy00, dx01, dy01, \u2026] row-major by (r*3+c). */\nexport function controlOffsets(params: Record<string, number>, w: number, h: number, pivot: Pivot, out: Float64Array = new Float64Array(18)): Float64Array {\n out.fill(0);\n const bulge = params.bulge ?? 0, bend = params.bend ?? 0, sway = params.sway ?? 0, squash = params.squash ?? 0;\n for (let r = 0; r < 3; r++) for (let c = 0; c < 3; c++) {\n const i = (r * 3 + c) * 2, u = T[c], v = T[r], mid = r === 1 ? 1 : 0;\n // `+ 0` folds IEEE -0 (zero params \u00D7 negative factors) into +0 so pinned points compare equal to 0\n out[i] = mid * (bulge * w * (u - 0.5) + bend * w) + sway * w * (v - pivot.y) + squash * w * (u - pivot.x) * 0.5 + 0;\n out[i + 1] = -squash * h * (v - pivot.y) + 0;\n }\n for (const k in params) {\n if (k.length !== 4 || k[0] !== \"p\") continue;\n const r = +k[1], c = +k[2];\n if (!(r >= 0 && r < 3 && c >= 0 && c < 3) || (k[3] !== \"x\" && k[3] !== \"y\")) continue;\n out[(r * 3 + c) * 2 + (k[3] === \"y\" ? 1 : 0)] += params[k];\n }\n return out;\n}\n\n/** Patch offset at normalized image coords (u, v) \u2208 [0,1]\u00B2. */\nexport function evalPatch(offsets: ArrayLike<number>, u: number, v: number): [number, number] {\n const bu = basis(u), bv = basis(v);\n let x = 0, y = 0;\n for (let r = 0; r < 3; r++) for (let c = 0; c < 3; c++) {\n const wgt = bv[r] * bu[c], i = (r * 3 + c) * 2;\n x += wgt * offsets[i]; y += wgt * offsets[i + 1];\n }\n return [x, y];\n}\n\n/** n\u00D7n render vertices (row-major, x fastest \u2014 PlaneGeometry order), pivot baked in, image-local pixels. */\nexport function gridPositions(offsets: ArrayLike<number>, w: number, h: number, pivot: Pivot, n: number, out: Float32Array = new Float32Array(2 * n * n)): Float32Array {\n const px = pivot.x * w, py = pivot.y * h;\n for (let j = 0; j < n; j++) for (let i = 0; i < n; i++) {\n const u = i / (n - 1), v = j / (n - 1), [ox, oy] = evalPatch(offsets, u, v), k = (j * n + i) * 2;\n out[k] = u * w - px + ox;\n out[k + 1] = v * h - py + oy;\n }\n return out;\n}\n\n/** Minimum Jacobian determinant of (u,v)\u2192image map over a sample grid, normalized so identity = 1. \u2264 0 means a fold. */\nexport function minJacobian(offsets: ArrayLike<number>, w: number, h: number, samples = 17): number {\n let min = Infinity;\n for (let j = 0; j < samples; j++) for (let i = 0; i < samples; i++) {\n const u = i / (samples - 1), v = j / (samples - 1);\n const bu = basis(u), bv = basis(v), du = dbasis(u), dv = dbasis(v);\n let xu = 0, xv = 0, yu = 0, yv = 0;\n for (let r = 0; r < 3; r++) for (let c = 0; c < 3; c++) {\n const k = (r * 3 + c) * 2, dx = offsets[k], dy = offsets[k + 1];\n xu += bv[r] * du[c] * dx; xv += dv[r] * bu[c] * dx;\n yu += bv[r] * du[c] * dy; yv += dv[r] * bu[c] * dy;\n }\n const det = ((w + xu) * (h + yv) - xv * yu) / (w * h);\n if (det < min) min = det;\n }\n return min;\n}\n", "/**\n * rig-anim \u2014 pure animation math shared by the runtime, the checker, the importer and tests. No PixiJS.\n *\n * - easing + track sampling, Pose: Map<\"target:id:prop\", value>\n * - 2D affine matrices with PixiJS layout (a b c d tx ty; x' = a\u00B7x + c\u00B7y + tx, y' = b\u00B7x + d\u00B7y + ty)\n * - bone world transforms with shear and inherit modes, constraints (ik / transform / path) applied in `order`\n * - attachment geometry in document space: region corners, skinned mesh vertices, lattice deformation\n */\nimport type { RigDocument, Animation, Track, Bone, Attachment, RegionAttachment, MeshAttachment, PathAttachment, IkConstraint, TransformConstraint, PathConstraint } from \"./rig-format\";\nimport { controlOffsets, evalPatch, type Pivot } from \"./rig-deform\";\n\nconst DEG = Math.PI / 180;\n\n// ---------- easing ----------\n\nexport type EaseSpec = Track[\"keys\"][number][\"ease\"];\n\nconst named: Record<string, (t: number) => number> = {\n linear: t => t,\n step: () => 0,\n ease_in: t => t * t,\n ease_out: t => 1 - (1 - t) * (1 - t),\n ease_in_out: t => (t < 0.5 ? 2 * t * t : 1 - (-2 * t + 2) ** 2 / 2),\n back_out: t => 1 + 2.70158 * (t - 1) ** 3 + 1.70158 * (t - 1) ** 2,\n elastic_out: t =>\n t === 0 ? 0 : t === 1 ? 1 : 2 ** (-10 * t) * Math.sin((t * 10 - 0.75) * ((2 * Math.PI) / 3)) + 1,\n};\n\n/**\n * Cubic bezier easing sampled into 10 linear segments walked in order of the curve parameter (the same\n * approximation Spine uses: 9 interior samples per curve), so control points with non-monotonic times\n * behave identically to Spine.\n */\nconst BEZIER_SEGMENTS = 10;\nfunction bezier(x1: number, y1: number, x2: number, y2: number) {\n const px: number[] = [0], py: number[] = [0];\n for (let i = 1; i <= BEZIER_SEGMENTS; i++) {\n const t = i / BEZIER_SEGMENTS, u = 1 - t;\n px.push(3 * u * u * t * x1 + 3 * u * t * t * x2 + t * t * t);\n py.push(3 * u * u * t * y1 + 3 * u * t * t * y2 + t * t * t);\n }\n return (x: number) => {\n if (x <= 0) return 0;\n for (let i = 1; i <= BEZIER_SEGMENTS; i++) {\n if (px[i] >= x) {\n const span = px[i] - px[i - 1];\n return py[i - 1] + (span > 0 ? ((x - px[i - 1]) / span) * (py[i] - py[i - 1]) : 0);\n }\n }\n return 1;\n };\n}\n\nconst easeCache = new Map<string, (t: number) => number>();\nexport function ease(spec: EaseSpec): (t: number) => number {\n if (typeof spec === \"string\") return named[spec];\n const key = spec.bezier.join(\",\");\n let f = easeCache.get(key);\n if (!f) easeCache.set(key, (f = bezier(...spec.bezier)));\n return f;\n}\n\n// ---------- sampling ----------\n\nexport type Val = number | string | null | number[] | string[];\n/** key: \"bone:id:prop\" | \"slot:id:prop\" | \"deform:id:prop\" | \"ik:id:prop\" | \"transform:id:prop\" | \"path:id:prop\" | \"drawOrder:order:order\" */\nexport type Pose = Map<string, Val>;\nexport const pk = (target: string, id: string, prop: string) => `${target}:${id}:${prop}`;\n\nexport function sample(track: Track, t: number): Val {\n const keys = track.keys;\n if (t <= keys[0].t) return keys[0].v;\n const last = keys[keys.length - 1];\n if (t >= last.t) return last.v;\n let i = 0;\n while (keys[i + 1].t <= t) i++;\n const a = keys[i], b = keys[i + 1];\n if (typeof a.v === \"number\" && typeof b.v === \"number\") {\n const u = ease(a.ease)((t - a.t) / (b.t - a.t));\n return a.v + (b.v - a.v) * u;\n }\n if (Array.isArray(a.v) && Array.isArray(b.v) && typeof a.v[0] === \"number\") {\n const u = ease(a.ease)((t - a.t) / (b.t - a.t)), av = a.v as number[], bv = b.v as number[];\n return av.map((v, k) => v + ((bv[k] ?? v) - v) * u);\n }\n return a.v; // discrete\n}\n\nexport function poseOf(anim: Animation, t: number, out: Pose = new Map()): Pose {\n for (const tr of anim.tracks) out.set(pk(tr.target, tr.id, tr.prop), sample(tr, t));\n return out;\n}\n\n/** Crossfade: numbers (and number arrays) interpolate toward `to` (or rest when absent there); discrete values hold until w = 1. */\nexport function blendPoses(from: Pose, to: Pose, w: number, restOf: (key: string) => Val): Pose {\n const out = new Map(to);\n for (const [k, f] of from) {\n const cur = to.get(k);\n if (typeof f === \"number\") {\n const target = typeof cur === \"number\" ? cur : (restOf(k) as number);\n out.set(k, f + (target - f) * w);\n } else if (Array.isArray(f) && typeof f[0] === \"number\") {\n const fv = f as number[], tv = (Array.isArray(cur) && typeof cur[0] === \"number\" ? cur : fv.map(() => 0)) as number[];\n out.set(k, fv.map((v, i) => v + ((tv[i] ?? 0) - v) * w));\n } else if (cur === undefined && w < 1) out.set(k, f);\n }\n return out;\n}\n\n/** Setup value of a pose key. */\nexport function restValue(doc: RigDocument, key: string): Val {\n const [target, id, prop] = key.split(\":\");\n if (target === \"bone\") return (doc.bones.find(b => b.id === id)!.transform as Record<string, number>)[prop];\n if (target === \"slot\") {\n const s = doc.slots.find(s => s.id === id)!;\n if (prop === \"color\") return colorToArray(s.color);\n return (s as unknown as Record<string, Val>)[prop];\n }\n if (target === \"ik\" || target === \"transform\" || target === \"path\") {\n const c = (doc[target] as { id: string }[]).find(c => c.id === id) as Record<string, unknown> | undefined;\n const v = c?.[prop];\n return typeof v === \"boolean\" ? (v ? 1 : 0) : ((v as number) ?? 0);\n }\n if (target === \"drawOrder\") return doc.slots.map(s => s.id);\n return 0;\n}\n\n/** \"#rrggbbaa\" \u2192 [r, g, b, a] in 0..1 */\nexport const colorToArray = (c: string): number[] => [0, 2, 4, 6].map(k => parseInt(c.slice(1 + k, 3 + k), 16) / 255);\n\n/** Numeric lattice deform params of one attachment present in the pose, or undefined when it has none. */\nexport function deformParams(pose: Pose, attachmentId: string): Record<string, number> | undefined {\n let out: Record<string, number> | undefined;\n const prefix = `deform:${attachmentId}:`;\n for (const [k, v] of pose)\n if (k.startsWith(prefix) && typeof v === \"number\") (out ??= {})[k.slice(prefix.length)] = v;\n return out;\n}\n\n// ---------- affine ----------\n\nexport interface Affine { a: number; b: number; c: number; d: number; tx: number; ty: number }\n\n/** translate \u00B7 rotate(deg, clockwise in Y-down) \u00B7 shear \u00B7 scale \u2014 PixiJS setTransform semantics with shear as axis angles */\nexport function affineOf(x: number, y: number, rotationDeg: number, sx: number, sy: number, shearX = 0, shearY = 0): Affine {\n const rx = (rotationDeg + shearX) * DEG, ry = (rotationDeg + 90 + shearY) * DEG;\n return { a: Math.cos(rx) * sx, b: Math.sin(rx) * sx, c: Math.cos(ry) * sy, d: Math.sin(ry) * sy, tx: x, ty: y };\n}\n\n/** parent \u2218 local (apply local first, then parent) \u2014 PixiJS Matrix.append */\nexport function mul(p: Affine, l: Affine): Affine {\n return {\n a: p.a * l.a + p.c * l.b, b: p.b * l.a + p.d * l.b,\n c: p.a * l.c + p.c * l.d, d: p.b * l.c + p.d * l.d,\n tx: p.a * l.tx + p.c * l.ty + p.tx, ty: p.b * l.tx + p.d * l.ty + p.ty,\n };\n}\n\nexport const apply = (m: Affine, x: number, y: number): [number, number] => [m.a * x + m.c * y + m.tx, m.b * x + m.d * y + m.ty];\n\nexport function invert(m: Affine): Affine {\n const det = m.a * m.d - m.b * m.c || 1e-12;\n const a = m.d / det, b = -m.b / det, c = -m.c / det, d = m.a / det;\n return { a, b, c, d, tx: -(a * m.tx + c * m.ty), ty: -(b * m.tx + d * m.ty) };\n}\n\n/** rotation of the x axis of an affine, degrees */\nexport const rotationOf = (m: Affine) => Math.atan2(m.b, m.a) / DEG;\n\n/**\n * Where a world matrix puts a bone, which way its x axis points, and how long its axes are \u2014 the inverse of\n * `affineOf` for everything except shear, which cannot be recovered from the axes alone (a sheared y axis is\n * reported by its length, and `angle` follows the x axis only). Reading a posed bone goes through here so the\n * numbers an agent gets are the numbers the runtime drew.\n */\nexport function decompose(m: Affine): { x: number; y: number; angle: number; scaleX: number; scaleY: number } {\n return { x: m.tx, y: m.ty, angle: rotationOf(m), scaleX: Math.hypot(m.a, m.b), scaleY: Math.hypot(m.c, m.d) };\n}\n\nconst num = (pose: Pose, key: string, rest: number) => { const v = pose.get(key); return typeof v === \"number\" ? v : rest; };\n\n// ---------- bones ----------\n\nexport interface BoneState {\n /** effective local values (setup + pose + constraint adjustments) */\n x: number; y: number; rotation: number; scaleX: number; scaleY: number; shearX: number; shearY: number;\n world: Affine;\n}\n\nexport interface Skeleton {\n doc: RigDocument;\n pose: Pose;\n bones: Map<string, BoneState>;\n /** attachment shown per slot (pose or setup), null = hidden */\n attachment: Map<string, Attachment | null>;\n}\n\nconst boneIndex = new WeakMap<RigDocument, Map<string, Bone>>();\nfunction boneOf(doc: RigDocument, id: string): Bone {\n let idx = boneIndex.get(doc);\n if (!idx) boneIndex.set(doc, (idx = new Map(doc.bones.map(b => [b.id, b]))));\n const b = idx.get(id);\n if (!b) throw new Error(`unknown bone \"${id}\"`);\n return b;\n}\n\n/** world transform of one bone from its effective local values and its parent's world transform, honouring `inherit` */\nexport function boneWorldOf(bone: Bone, s: Omit<BoneState, \"world\">, parent: Affine | undefined): Affine {\n const local = affineOf(s.x, s.y, s.rotation, s.scaleX, s.scaleY, s.shearX, s.shearY);\n if (!parent) return local;\n if (bone.inherit === \"normal\") return mul(parent, local);\n const [tx, ty] = apply(parent, s.x, s.y);\n return { ...mul(inheritedParentLinear(bone, parent), { ...local, tx: 0, ty: 0 }), tx, ty };\n}\n\n/** Order bones parent-first (memoized per document). */\nconst orderCache = new WeakMap<RigDocument, Bone[]>();\nexport function boneOrder(doc: RigDocument): Bone[] {\n let order = orderCache.get(doc);\n if (order) return order;\n order = [];\n const emitted = new Set<string>();\n while (order.length < doc.bones.length) {\n let progressed = false;\n for (const b of doc.bones) if (!emitted.has(b.id) && (!b.parent || emitted.has(b.parent))) { emitted.add(b.id); order.push(b); progressed = true; }\n if (!progressed) throw new Error(\"bone hierarchy has a cycle\");\n }\n orderCache.set(doc, order);\n return order;\n}\n\nconst localOf = (doc: RigDocument, pose: Pose, b: Bone): Omit<BoneState, \"world\"> => {\n const r = b.transform, id = b.id;\n return {\n x: num(pose, pk(\"bone\", id, \"x\"), r.x), y: num(pose, pk(\"bone\", id, \"y\"), r.y),\n rotation: num(pose, pk(\"bone\", id, \"rotation\"), r.rotation),\n scaleX: num(pose, pk(\"bone\", id, \"scaleX\"), r.scaleX), scaleY: num(pose, pk(\"bone\", id, \"scaleY\"), r.scaleY),\n shearX: num(pose, pk(\"bone\", id, \"shearX\"), r.shearX), shearY: num(pose, pk(\"bone\", id, \"shearY\"), r.shearY),\n };\n};\n\n/** Recompute world transforms of `bone` and its descendants from their current local values. */\nfunction updateSubtree(skel: Skeleton, root: string) {\n const doc = skel.doc;\n const kids = new Map<string, Bone[]>();\n for (const b of doc.bones) if (b.parent) (kids.get(b.parent) ?? kids.set(b.parent, []).get(b.parent)!).push(b);\n const stack = [root];\n while (stack.length) {\n const id = stack.pop()!, b = boneOf(doc, id), st = skel.bones.get(id)!;\n st.world = boneWorldOf(b, st, b.parent ? skel.bones.get(b.parent)!.world : undefined);\n for (const k of kids.get(id) ?? []) stack.push(k.id);\n }\n}\n\n/** Full skeleton evaluation for a pose: bone locals, constraints in order, world transforms, shown attachments. */\nexport function evaluate(doc: RigDocument, pose: Pose): Skeleton {\n const skel: Skeleton = { doc, pose, bones: new Map(), attachment: new Map() };\n for (const b of boneOrder(doc)) {\n const s = localOf(doc, pose, b);\n const world = boneWorldOf(b, s, b.parent ? skel.bones.get(b.parent)!.world : undefined);\n skel.bones.set(b.id, { ...s, world });\n }\n const attachments = new Map(doc.attachments.map(a => [a.id, a]));\n for (const s of doc.slots) {\n const v = pose.get(pk(\"slot\", s.id, \"attachment\"));\n const id = v === undefined ? s.attachment : (v as string | null);\n skel.attachment.set(s.id, id ? attachments.get(id) ?? null : null);\n }\n // constraints, in document order (ties broken by array order)\n const all: { order: number; kind: \"ik\" | \"transform\" | \"path\"; c: IkConstraint | TransformConstraint | PathConstraint }[] = [\n ...doc.ik.map(c => ({ order: c.order, kind: \"ik\" as const, c })),\n ...doc.transform.map(c => ({ order: c.order, kind: \"transform\" as const, c })),\n ...doc.path.map(c => ({ order: c.order, kind: \"path\" as const, c })),\n ].sort((a, b) => a.order - b.order);\n for (const { kind, c } of all) {\n if (kind === \"ik\") applyIk(skel, c as IkConstraint);\n else if (kind === \"transform\") applyTransformConstraint(skel, c as TransformConstraint);\n else applyPathConstraint(skel, c as PathConstraint);\n }\n return skel;\n}\n\n/** Bone world transforms for a pose (constraints applied). */\nexport function boneWorld(doc: RigDocument, pose: Pose): Map<string, Affine> {\n const skel = evaluate(doc, pose);\n return new Map([...skel.bones].map(([id, s]) => [id, s.world]));\n}\n\n// ---------- constraints ----------\n\n/** a constraint's value at this frame: the keyed one, else the document's \u2014 what every early-out below reads\n * (`applyIk` at `mix <= 0`, the transform/path solvers when all of `MIX_PROPS` are 0). `rig-check`'s `poseNum`\n * answers the same question elsewhere and must keep agreeing with it.\n * Outside the solvers, ask `mixAt` in rig-constraints.ts \u2014 the exported one, so a fourth copy is never needed. */\nconst cnum = (skel: Skeleton, kind: string, id: string, prop: string, rest: number | boolean) =>\n num(skel.pose, pk(kind, id, prop), typeof rest === \"boolean\" ? (rest ? 1 : 0) : rest);\n\n/** point in bone-local space of `bone` for a document-space point */\nfunction toLocal(skel: Skeleton, bone: string, x: number, y: number): [number, number] {\n return apply(invert(skel.bones.get(bone)!.world), x, y);\n}\n/** document-space direction of a bone's local x axis, degrees */\nconst worldRotation = (skel: Skeleton, bone: string) => rotationOf(skel.bones.get(bone)!.world);\n\nconst IDENTITY: Affine = { a: 1, b: 0, c: 0, d: 1, tx: 0, ty: 0 };\nconst wrapRad = (r: number) => (r > Math.PI ? r - 2 * Math.PI : r < -Math.PI ? r + 2 * Math.PI : r);\n\n/**\n * Single-bone IK: rotate `bone` so its (sheared) x axis points at the world point, blended by `mix`. Solved in the\n * parent's local space, which aims correctly under any parent scale; a negative scaleX flips the axis by 180\u00B0.\n * compress/stretch scale the bone's length to the target distance (uniform: both axes).\n */\nfunction aimAt(skel: Skeleton, boneId: string, tx: number, ty: number, mix: number, compress = false, stretch = false, uniform = false) {\n const b = boneOf(skel.doc, boneId), st = skel.bones.get(boneId)!;\n const parent = b.parent ? skel.bones.get(b.parent)!.world : undefined;\n let dx: number, dy: number;\n if (parent && b.inherit === \"onlyTranslation\") { dx = tx - st.world.tx; dy = ty - st.world.ty; }\n else {\n const [px, py] = parent ? apply(invert(parent), tx, ty) : [tx, ty];\n dx = px - st.x; dy = py - st.y;\n }\n let r = Math.atan2(dy, dx) / DEG - st.shearX - st.rotation;\n if (st.scaleX < 0) r += 180;\n r = shortest(r);\n let sx = st.scaleX, sy = st.scaleY;\n if (compress || stretch) {\n const len = b.length * sx;\n if (len > 0.0001) {\n const dd = dx * dx + dy * dy;\n if ((compress && dd < len * len) || (stretch && dd > len * len)) { const f = (Math.sqrt(dd) / len - 1) * mix + 1; sx *= f; if (uniform) sy *= f; }\n }\n }\n st.rotation += r * mix; st.scaleX = sx; st.scaleY = sy;\n updateSubtree(skel, boneId);\n}\n\nconst shortest = (deg: number) => ((((deg + 180) % 360) + 360) % 360) - 180;\n\n/**\n * IK constraint. One bone aims at the target. Two bones: the child is moved onto the parent's x axis and both are\n * rotated so the child's tip reaches the target, bending to the requested side. Solved in the parent's parent space:\n * the law of cosines when the parent's scale is uniform, otherwise the child's tip sweeps an ellipse (parent scale)\n * and the reachable point is solved analytically. Negative scales flip axes by 180\u00B0 and mirror the bend; the parent's\n * shear is dropped. Softness eases the last stretch before full extension; stretch lengthens the parent to reach.\n */\nfunction applyIk(skel: Skeleton, c: IkConstraint) {\n const mix = cnum(skel, \"ik\", c.id, \"mix\", c.mix);\n if (mix <= 0) return;\n const target = skel.bones.get(c.target)!.world;\n const bendDir = cnum(skel, \"ik\", c.id, \"bendPositive\", c.bendPositive) > 0.5 ? 1 : -1;\n const compress = cnum(skel, \"ik\", c.id, \"compress\", c.compress) > 0.5, stretch = cnum(skel, \"ik\", c.id, \"stretch\", c.stretch) > 0.5;\n let softness = cnum(skel, \"ik\", c.id, \"softness\", c.softness);\n if (c.bones.length === 1) { aimAt(skel, c.bones[0], target.tx, target.ty, mix, compress, stretch, c.uniform); return; }\n const [pId, cId] = c.bones;\n const parentBone = boneOf(skel.doc, pId), childBone = boneOf(skel.doc, cId);\n const p = skel.bones.get(pId)!, ch = skel.bones.get(cId)!;\n const px = p.x, py = p.y;\n let psx = p.scaleX, psy = p.scaleY, csx = ch.scaleX, sx = psx, sy = psy;\n let os1 = 0, os2 = 0, s2 = 1;\n if (psx < 0) { psx = -psx; os1 = 180; s2 = -1; }\n if (psy < 0) { psy = -psy; s2 = -s2; }\n if (csx < 0) { csx = -csx; os2 = 180; }\n const uniform = Math.abs(psx - psy) <= 0.0001;\n const cx = ch.x, cy = !uniform || stretch ? 0 : ch.y;\n const [cwx, cwy] = apply(p.world, cx, cy);\n const ppInv = invert(parentBone.parent ? skel.bones.get(parentBone.parent)!.world : IDENTITY);\n const [clx, cly] = apply(ppInv, cwx, cwy);\n const dx = clx - px, dy = cly - py, l1 = Math.hypot(dx, dy);\n let l2 = childBone.length * csx;\n if (l1 < 0.0001) { // parent and child share an origin: aim the parent, the child keeps its offset\n aimAt(skel, pId, target.tx, target.ty, mix, false, stretch, false);\n ch.x = cx; ch.y = cy; ch.rotation = 0;\n updateSubtree(skel, pId);\n return;\n }\n const [tlx, tly] = apply(ppInv, target.tx, target.ty);\n let tx = tlx - px, ty = tly - py, dd = tx * tx + ty * ty;\n if (softness !== 0) {\n softness *= psx * (csx + 1) * 0.5;\n const td = Math.sqrt(dd), sd = td - l1 - l2 * psx + softness;\n if (sd > 0) {\n let q = Math.min(1, sd / (softness * 2)) - 1;\n q = (sd - softness * (1 - q * q)) / td;\n tx -= q * tx; ty -= q * ty; dd = tx * tx + ty * ty;\n }\n }\n let a1: number, a2: number;\n if (uniform) {\n l2 *= psx;\n let cos = (dd - l1 * l1 - l2 * l2) / (2 * l1 * l2);\n if (cos < -1) { cos = -1; a2 = Math.PI * bendDir; }\n else if (cos > 1) {\n cos = 1; a2 = 0;\n if (stretch) { const f = (Math.sqrt(dd) / (l1 + l2) - 1) * mix + 1; sx *= f; if (c.uniform) sy *= f; }\n } else a2 = Math.acos(cos) * bendDir;\n const a = l1 + l2 * cos, b = l2 * Math.sin(a2);\n a1 = Math.atan2(ty * a - tx * b, tx * a + ty * b);\n } else {\n // child tip on the ellipse (l1 + a\u00B7cos \u03B8, b\u00B7sin \u03B8): find the point at distance \u221Add, else the nearest extreme\n const a = psx * l2, b = psy * l2, aa = a * a, bb = b * b, ta = Math.atan2(ty, tx);\n const c0 = bb * l1 * l1 + aa * dd - aa * bb, c1 = -2 * bb * l1, c2 = bb - aa;\n const disc = c1 * c1 - 4 * c2 * c0;\n let solved = false;\n a1 = a2 = 0;\n if (disc >= 0) {\n let q = Math.sqrt(disc);\n if (c1 < 0) q = -q;\n q = -(c1 + q) * 0.5;\n const r0 = q / c2, r1 = c0 / q, r = Math.abs(r0) < Math.abs(r1) ? r0 : r1, yy = dd - r * r;\n if (yy >= 0) {\n const y = Math.sqrt(yy) * bendDir;\n a1 = ta - Math.atan2(y, r);\n a2 = Math.atan2(y / psy, (r - l1) / psx);\n solved = true;\n }\n }\n if (!solved) {\n let minAngle = Math.PI, minX = l1 - a, minDist = minX * minX, minY = 0, maxAngle = 0, maxX = l1 + a, maxDist = maxX * maxX, maxY = 0;\n const k = -a * l1 / (aa - bb);\n if (k >= -1 && k <= 1) {\n const ang = Math.acos(k), x = a * Math.cos(ang) + l1, y = b * Math.sin(ang), dist = x * x + y * y;\n if (dist < minDist) { minAngle = ang; minDist = dist; minX = x; minY = y; }\n if (dist > maxDist) { maxAngle = ang; maxDist = dist; maxX = x; maxY = y; }\n }\n if (dd <= (minDist + maxDist) * 0.5) { a1 = ta - Math.atan2(minY * bendDir, minX); a2 = minAngle * bendDir; }\n else { a1 = ta - Math.atan2(maxY * bendDir, maxX); a2 = maxAngle * bendDir; }\n }\n }\n const os = Math.atan2(cy, cx) * s2;\n const d1 = shortest((a1 - os) / DEG + os1 - p.rotation);\n const d2 = shortest(((a2 + os) / DEG - ch.shearX) * s2 + os2 - ch.rotation);\n p.rotation += d1 * mix; p.scaleX = sx; p.scaleY = sy; p.shearX = 0; p.shearY = 0;\n ch.x = cx; ch.y = cy; ch.rotation += d2 * mix;\n updateSubtree(skel, pId);\n}\n\n/**\n * Transform constraint: each bone follows the target's rotation / position / scale / shear by the mix amounts, with\n * the constraint's offsets. World mode edits the bone's world matrix (rotation turns the whole matrix, scales the\n * axis lengths, shear turns the y axis) and folds it back into effective locals; local mode mixes the effective\n * local values. `relative` adds the target's values instead of matching them.\n */\nfunction applyTransformConstraint(skel: Skeleton, c: TransformConstraint) {\n const mixRotate = cnum(skel, \"transform\", c.id, \"mixRotate\", c.mixRotate), mixX = cnum(skel, \"transform\", c.id, \"mixX\", c.mixX), mixY = cnum(skel, \"transform\", c.id, \"mixY\", c.mixY);\n const mixScaleX = cnum(skel, \"transform\", c.id, \"mixScaleX\", c.mixScaleX), mixScaleY = cnum(skel, \"transform\", c.id, \"mixScaleY\", c.mixScaleY), mixShearY = cnum(skel, \"transform\", c.id, \"mixShearY\", c.mixShearY);\n if (!mixRotate && !mixX && !mixY && !mixScaleX && !mixScaleY && !mixShearY) return;\n const target = skel.bones.get(c.target)!, tw = target.world;\n const offsetRotation = c.rotation * DEG, offsetShearY = c.shearY * DEG;\n for (const id of c.bones) {\n const b = boneOf(skel.doc, id), st = skel.bones.get(id)!;\n if (c.local) {\n if (c.relative) {\n st.rotation += (target.rotation + c.rotation) * mixRotate;\n st.x += (target.x + c.x) * mixX; st.y += (target.y + c.y) * mixY;\n st.scaleX *= (target.scaleX - 1 + c.scaleX) * mixScaleX + 1;\n st.scaleY *= (target.scaleY - 1 + c.scaleY) * mixScaleY + 1;\n st.shearY += (target.shearY + c.shearY) * mixShearY;\n } else {\n st.rotation += (target.rotation - st.rotation + c.rotation) * mixRotate;\n st.x += (target.x - st.x + c.x) * mixX; st.y += (target.y - st.y + c.y) * mixY;\n if (st.scaleX !== 0) st.scaleX += (target.scaleX - st.scaleX + c.scaleX) * mixScaleX;\n if (st.scaleY !== 0) st.scaleY += (target.scaleY - st.scaleY + c.scaleY) * mixScaleY;\n st.shearY += (target.shearY - st.shearY + c.shearY) * mixShearY;\n }\n updateSubtree(skel, id);\n continue;\n }\n let w: Affine = { ...st.world };\n const targetRot = Math.atan2(tw.b, tw.a), rotate = (m: Affine, r: number): Affine => {\n const cos = Math.cos(r), sin = Math.sin(r);\n return { a: cos * m.a - sin * m.b, b: sin * m.a + cos * m.b, c: cos * m.c - sin * m.d, d: sin * m.c + cos * m.d, tx: m.tx, ty: m.ty };\n };\n if (mixRotate !== 0) {\n const r = wrapRad(c.relative ? targetRot + offsetRotation : targetRot - Math.atan2(w.b, w.a) + offsetRotation);\n w = rotate(w, r * mixRotate);\n }\n if (mixX !== 0 || mixY !== 0) {\n const [ox, oy] = apply(tw, c.x, c.y); // the offset lives in the target's space\n if (c.relative) { w.tx += ox * mixX; w.ty += oy * mixY; }\n else { w.tx += (ox - w.tx) * mixX; w.ty += (oy - w.ty) * mixY; }\n }\n if (mixScaleX !== 0) {\n const ts = Math.hypot(tw.a, tw.b);\n let f: number;\n if (c.relative) f = (ts - 1 + c.scaleX) * mixScaleX + 1;\n else { const s0 = Math.hypot(w.a, w.b); f = s0 === 0 ? 1 : (s0 + (ts - s0 + c.scaleX) * mixScaleX) / s0; }\n w.a *= f; w.b *= f;\n }\n if (mixScaleY !== 0) {\n const ts = Math.hypot(tw.c, tw.d);\n let f: number;\n if (c.relative) f = (ts - 1 + c.scaleY) * mixScaleY + 1;\n else { const s0 = Math.hypot(w.c, w.d); f = s0 === 0 ? 1 : (s0 + (ts - s0 + c.scaleY) * mixScaleY) / s0; }\n w.c *= f; w.d *= f;\n }\n if (mixShearY > 0) {\n const by = Math.atan2(w.d, w.c), targetShear = Math.atan2(tw.d, tw.c) - targetRot;\n const r = c.relative\n ? by + (wrapRad(targetShear) - Math.PI / 2 + offsetShearY) * mixShearY\n : by + (wrapRad(targetShear - (by - Math.atan2(w.b, w.a))) + offsetShearY) * mixShearY;\n const len = Math.hypot(w.c, w.d);\n w.c = Math.cos(r) * len; w.d = Math.sin(r) * len;\n }\n setEffectiveWorld(skel, b, st, w);\n }\n}\n\n// ---------- paths ----------\n\n/** world-space control points of a path attachment (2 numbers per vertex) */\nexport function pathWorldVertices(skel: Skeleton, slotId: string, att: PathAttachment): number[] {\n return attachmentWorldVertices(skel, slotId, att);\n}\n\n/** path length: `lengths[i]` is the length up to the end of curve i; an open path stores one extra entry */\nexport function pathLength(vertexCount: number, closed: boolean, lengths: number[]): number {\n const curveCount = closed ? vertexCount / 3 : vertexCount / 3 - 1;\n return curveCount >= 1 && lengths.length >= curveCount ? lengths[curveCount - 1] : lengths[lengths.length - 1] ?? 1;\n}\n\n/**\n * Sample positions and tangents along a path made of cubic bezier curves through the attachment vertices\n * (vertex layout: [c_prev, p, c_next] triples; curve i runs p_i \u2192 c_next_i \u2192 c_prev_{i+1} \u2192 p_{i+1}).\n */\n/**\n * Points along a path attachment (document space). `positions` are absolute distances along the path (or fractions of\n * its length when `percent`). With `constantSpeed` the length of the posed curve is measured (4 chords per curve for\n * the total, 10 chords inside the curve that holds the position); otherwise the stored setup `lengths` and the raw\n * curve parameter are used. Closed paths wrap; positions beyond an open path continue along its end tangents.\n * `angle` is the tangent direction in degrees.\n */\nexport function samplePath(points: number[], closed: boolean, lengths: number[], constantSpeed: boolean, positions: number[], percent: boolean): { x: number; y: number; angle: number }[] {\n const n = points.length / 2;\n // anchors sit at indices 1, 4, 7, \u2026 (each vertex = [cPrev, p, cNext]); curve i runs from anchor i to anchor i + 1\n const curveCount = closed ? n / 3 : n / 3 - 1;\n if (curveCount < 1) return positions.map(() => ({ x: points[2] ?? 0, y: points[3] ?? 0, angle: 0 }));\n const curve = (i: number) => {\n const a = ((i * 3 + 1) % n) * 2, c1 = ((i * 3 + 2) % n) * 2, c2 = ((i * 3 + 3) % n) * 2, b = ((i * 3 + 4) % n) * 2;\n return [points[a], points[a + 1], points[c1], points[c1 + 1], points[c2], points[c2 + 1], points[b], points[b + 1]];\n };\n const pointAt = (i: number, t: number) => {\n const [x0, y0, x1, y1, x2, y2, x3, y3] = curve(i), u = 1 - t;\n return { x: u * u * u * x0 + 3 * u * u * t * x1 + 3 * u * t * t * x2 + t * t * t * x3, y: u * u * u * y0 + 3 * u * u * t * y1 + 3 * u * t * t * y2 + t * t * t * y3 };\n };\n const angleAt = (i: number, t: number) => {\n const [x0, y0, x1, y1, x2, y2, x3, y3] = curve(i), u = 1 - t;\n const dx = 3 * u * u * (x1 - x0) + 6 * u * t * (x2 - x1) + 3 * t * t * (x3 - x2);\n const dy = 3 * u * u * (y1 - y0) + 6 * u * t * (y2 - y1) + 3 * t * t * (y3 - y2);\n return Math.atan2(dy, dx) / DEG;\n };\n const chords = (i: number, count: number) => {\n const acc: number[] = []; let sum = 0, prev = pointAt(i, 0);\n for (let k = 1; k <= count; k++) { const q = pointAt(i, k / count); sum += Math.hypot(q.x - prev.x, q.y - prev.y); acc.push(sum); prev = q; }\n return acc;\n };\n const cum: number[] = [];\n if (constantSpeed) { let acc = 0; for (let i = 0; i < curveCount; i++) { acc += chords(i, 4)[3]; cum.push(acc); } }\n else for (let i = 0; i < curveCount; i++) cum.push(lengths[i] ?? (i ? cum[i - 1] : 0));\n const total = cum[curveCount - 1];\n const out: { x: number; y: number; angle: number }[] = [];\n for (let pos of positions) {\n if (percent) pos *= total;\n if (closed) {\n if (total > 0) { pos %= total; if (pos < 0) pos += total; } else pos = 0;\n } else if (pos < 0) { // before the start: continue the start tangent (anchor 0 towards its outgoing control)\n const r = Math.atan2(points[5] - points[3], points[4] - points[2]);\n out.push({ x: points[2] + pos * Math.cos(r), y: points[3] + pos * Math.sin(r), angle: r / DEG });\n continue;\n } else if (pos > total) { // after the end: continue the end tangent (incoming control towards the last anchor)\n const a = (curveCount * 3 + 1) * 2, c = curveCount * 3 * 2, e = pos - total;\n const r = Math.atan2(points[a + 1] - points[c + 1], points[a] - points[c]);\n out.push({ x: points[a] + e * Math.cos(r), y: points[a + 1] + e * Math.sin(r), angle: r / DEG });\n continue;\n }\n let i = 0;\n while (i < curveCount - 1 && pos > cum[i]) i++;\n const prev = i ? cum[i - 1] : 0, span = cum[i] - prev;\n const f = span > 0 ? (pos - prev) / span : 0;\n let t = f;\n if (constantSpeed) { // weight the parameter by chord lengths inside the curve\n const seg = chords(i, 10), target = f * seg[9];\n let k = 0;\n while (k < 9 && target > seg[k]) k++;\n const sPrev = k ? seg[k - 1] : 0, sSpan = seg[k] - sPrev;\n t = (k + (sSpan > 0 ? (target - sPrev) / sSpan : 0)) / 10;\n }\n out.push({ ...pointAt(i, t), angle: angleAt(i, t) });\n }\n return out;\n}\n\nconst PATH_EPSILON = 0.00001;\n\n/**\n * Path constraint: bones are laid along the target slot's path attachment (spacing modes: length = bone length +\n * spacing, fixed = spacing px, percent = fraction of the path per bone, proportional = the path shared by bone length),\n * translated with mixX/mixY and rotated with mixRotate (tangent = path direction, chain = towards the next bone,\n * chainScale = chain + scaled to reach it). Applied in world space, then folded back into the bones' effective locals.\n */\nfunction applyPathConstraint(skel: Skeleton, c: PathConstraint) {\n const mixRotate = cnum(skel, \"path\", c.id, \"mixRotate\", c.mixRotate), mixX = cnum(skel, \"path\", c.id, \"mixX\", c.mixX), mixY = cnum(skel, \"path\", c.id, \"mixY\", c.mixY);\n if (!mixRotate && !mixX && !mixY) return;\n const att = skel.attachment.get(c.target);\n if (!att || att.type !== \"path\") return;\n const points = pathWorldVertices(skel, c.target, att);\n const position = cnum(skel, \"path\", c.id, \"position\", c.position), spacing = cnum(skel, \"path\", c.id, \"spacing\", c.spacing);\n const tangents = c.rotateMode === \"tangent\", scale = c.rotateMode === \"chainScale\";\n const bones = c.bones.map(id => ({ b: boneOf(skel.doc, id), st: skel.bones.get(id)! }));\n const spacesCount = tangents ? bones.length : bones.length + 1;\n // spacing between consecutive bones; length-based modes scale with the bone's world x axis\n const spaces = new Array<number>(spacesCount).fill(0), worldLengths: number[] = [];\n let sum = 0;\n for (let i = 0; i < spacesCount - 1; i++) {\n const { b, st } = bones[i], setupLength = b.length;\n const len = setupLength < PATH_EPSILON ? 0 : setupLength * Math.hypot(st.world.a, st.world.b);\n worldLengths.push(len);\n if (c.spacingMode === \"percent\") spaces[i + 1] = spacing;\n else if (setupLength < PATH_EPSILON) spaces[i + 1] = spacing;\n else if (c.spacingMode === \"proportional\") { spaces[i + 1] = len; sum += len; }\n else spaces[i + 1] = (c.spacingMode === \"length\" ? setupLength + spacing : spacing) * len / setupLength;\n }\n if (c.spacingMode === \"proportional\" && sum > 0) { const f = spacesCount / sum * spacing; for (let i = 1; i < spacesCount; i++) spaces[i] *= f; }\n const total = measuredPathLength(points, att.closed, att.lengths, att.constantSpeed);\n const multiplier = c.spacingMode === \"percent\" ? total : c.spacingMode === \"proportional\" ? total / spacesCount : 1;\n let p = c.positionMode === \"percent\" ? position * total : position;\n const positions: number[] = [];\n for (let i = 0; i < spacesCount; i++) { p += spaces[i] * multiplier; positions.push(p); }\n const samples = samplePath(points, att.closed, att.lengths, att.constantSpeed, positions, false);\n // offset rotation follows the target bone's handedness; chain mode without an offset links bones tip to tail\n const tip = c.rotation === 0 && c.rotateMode === \"chain\";\n let offsetRotation = c.rotation * DEG;\n if (c.rotation !== 0) {\n const slot = skel.doc.slots.find(sl => sl.id === c.target)!, tw = skel.bones.get(slot.bone)!.world;\n if (tw.a * tw.d - tw.b * tw.c < 0) offsetRotation = -offsetRotation;\n }\n let boneX = samples[0].x, boneY = samples[0].y;\n for (let i = 0; i < bones.length; i++) {\n const { b, st } = bones[i];\n let w: Affine = { ...st.world };\n w.tx += (boneX - w.tx) * mixX;\n w.ty += (boneY - w.ty) * mixY;\n const next = samples[i + 1] ?? { x: 0, y: 0, angle: 0 };\n const dx = next.x - boneX, dy = next.y - boneY;\n if (scale) {\n const len = worldLengths[i];\n if (len !== 0) { const f = (Math.hypot(dx, dy) / len - 1) * mixRotate + 1; w.a *= f; w.b *= f; }\n }\n boneX = next.x; boneY = next.y;\n if (mixRotate > 0) {\n const { a, b: bb, c: cc, d } = w;\n let r = (tangents ? samples[i].angle : spaces[i + 1] === 0 ? next.angle : Math.atan2(dy, dx) / DEG) * DEG;\n r -= Math.atan2(bb, a);\n if (tip) {\n const cos = Math.cos(r), sin = Math.sin(r), length = b.length;\n boneX += (length * (cos * a - sin * bb) - dx) * mixRotate;\n boneY += (length * (sin * a + cos * bb) - dy) * mixRotate;\n } else r += offsetRotation;\n if (r > Math.PI) r -= 2 * Math.PI; else if (r < -Math.PI) r += 2 * Math.PI;\n r *= mixRotate;\n const cos = Math.cos(r), sin = Math.sin(r);\n w = { a: cos * a - sin * bb, b: sin * a + cos * bb, c: cos * cc - sin * d, d: sin * cc + cos * d, tx: w.tx, ty: w.ty };\n }\n setEffectiveWorld(skel, b, st, w);\n }\n}\n\n/** total length used for percent positions/spacing: measured on the posed curve (constant speed) or the stored setup lengths */\nfunction measuredPathLength(points: number[], closed: boolean, lengths: number[], constantSpeed: boolean): number {\n const n = points.length / 2, curveCount = closed ? n / 3 : n / 3 - 1;\n if (curveCount < 1) return 0;\n if (!constantSpeed) return pathLength(n, closed, lengths);\n let total = 0;\n for (let i = 0; i < curveCount; i++) {\n const a = ((i * 3 + 1) % n) * 2, c1 = ((i * 3 + 2) % n) * 2, c2 = ((i * 3 + 3) % n) * 2, b = ((i * 3 + 4) % n) * 2;\n let px = points[a], py = points[a + 1];\n for (let k = 1; k <= 4; k++) {\n const t = k / 4, u = 1 - t;\n const x = u * u * u * points[a] + 3 * u * u * t * points[c1] + 3 * u * t * t * points[c2] + t * t * t * points[b];\n const y = u * u * u * points[a + 1] + 3 * u * u * t * points[c1 + 1] + 3 * u * t * t * points[c2 + 1] + t * t * t * points[b + 1];\n total += Math.hypot(x - px, y - py); px = x; py = y;\n }\n }\n return total;\n}\n\n/** the parent's linear part a bone actually inherits under its `inherit` mode */\nfunction inheritedParentLinear(bone: Bone, parent: Affine): Affine {\n switch (bone.inherit) {\n case \"normal\": return { ...parent, tx: 0, ty: 0 };\n case \"onlyTranslation\": return { a: 1, b: 0, c: 0, d: 1, tx: 0, ty: 0 };\n case \"noRotationOrReflection\": {\n // scale along the parent's axes without its rotation; keeps the parent's area scale, drops reflection\n const lenX = Math.hypot(parent.a, parent.b) || 1;\n const det = parent.a * parent.d - parent.b * parent.c;\n return { a: lenX, b: 0, c: 0, d: Math.abs(det) / lenX, tx: 0, ty: 0 };\n }\n case \"noScale\": case \"noScaleOrReflection\": {\n const lenX = Math.hypot(parent.a, parent.b) || 1;\n const ua = parent.a / lenX, ub = parent.b / lenX;\n const det = parent.a * parent.d - parent.b * parent.c;\n const reflect = det < 0 && bone.inherit === \"noScale\" ? -1 : 1; // noScale keeps the parent's reflection\n return { a: ua, b: ub, c: -ub * reflect, d: ua * reflect, tx: 0, ty: 0 };\n }\n }\n}\n\n/** Give a bone the world transform `world`: its effective locals are decomposed relative to the parent (shearX folds into rotation), descendants follow. */\nfunction setEffectiveWorld(skel: Skeleton, bone: Bone, st: BoneState, world: Affine) {\n const parent = bone.parent ? skel.bones.get(bone.parent)!.world : undefined;\n let lin: Affine = world, tx = world.tx, ty = world.ty;\n if (parent) {\n [tx, ty] = apply(invert(parent), world.tx, world.ty);\n lin = mul(invert(inheritedParentLinear(bone, parent)), { ...world, tx: 0, ty: 0 });\n }\n st.x = tx; st.y = ty;\n st.rotation = Math.atan2(lin.b, lin.a) / DEG;\n st.scaleX = Math.hypot(lin.a, lin.b);\n st.scaleY = Math.hypot(lin.c, lin.d);\n st.shearX = 0;\n st.shearY = shortest(Math.atan2(lin.d, lin.c) / DEG - st.rotation - 90);\n updateSubtree(skel, bone.id);\n}\n\n// ---------- attachment geometry ----------\n\n/** skinned or bone-local vertices of a mesh/path attachment in document space, deform offsets applied */\nexport function attachmentWorldVertices(skel: Skeleton, slotId: string, att: MeshAttachment | PathAttachment): number[] {\n const deform = skel.pose.get(pk(\"deform\", att.id, \"vertices\"));\n const off = Array.isArray(deform) && typeof deform[0] === \"number\" ? (deform as number[]) : undefined;\n const out: number[] = [];\n if (att.weights) {\n let k = 0;\n for (const list of att.weights) {\n let x = 0, y = 0;\n for (const inf of list) {\n const w = skel.bones.get(inf.bone)!.world;\n const vx = inf.x + (off ? off[k] : 0), vy = inf.y + (off ? off[k + 1] : 0);\n k += 2;\n x += (w.a * vx + w.c * vy + w.tx) * inf.w; y += (w.b * vx + w.d * vy + w.ty) * inf.w;\n }\n out.push(x, y);\n }\n } else {\n const slot = skel.doc.slots.find(s => s.id === slotId)!, w = skel.bones.get(slot.bone)!.world, v = att.vertices!;\n for (let i = 0; i < v.length; i += 2) {\n const vx = v[i] + (off ? off[i] : 0), vy = v[i + 1] + (off ? off[i + 1] : 0);\n out.push(w.a * vx + w.c * vy + w.tx, w.b * vx + w.d * vy + w.ty);\n }\n }\n return out;\n}\n\n/** image-local (centre-relative) \u2192 document matrix for a region attachment */\nexport function regionMatrix(skel: Skeleton, slotId: string, att: RegionAttachment): Affine {\n const slot = skel.doc.slots.find(s => s.id === slotId)!;\n return mul(skel.bones.get(slot.bone)!.world, affineOf(att.x, att.y, att.rotation, att.scaleX, att.scaleY));\n}\n\nexport function regionSize(doc: RigDocument, att: RegionAttachment): [number, number] {\n const asset = doc.assets.find(a => a.id === att.asset)!;\n return [att.width ?? asset.width, att.height ?? asset.height];\n}\n\n/**\n * Outline of a slot's shown attachment in document space: region \u2192 `samplesPerEdge` points per edge clockwise\n * from the top-left (lattice deform applied), mesh \u2192 hull vertices (or all), path/hidden \u2192 undefined.\n */\nexport function slotOutline(doc: RigDocument, pose: Pose, slotId: string, samplesPerEdge = 1, skel = evaluate(doc, pose)): [number, number][] | undefined {\n if (!doc.slots.some(s => s.id === slotId)) throw new Error(`unknown slot \"${slotId}\"`);\n const att = skel.attachment.get(slotId);\n if (!att) return undefined;\n if (att.type === \"mesh\") {\n const v = attachmentWorldVertices(skel, slotId, att), n = att.hull > 0 ? att.hull : v.length / 2;\n const pts: [number, number][] = [];\n for (let i = 0; i < n; i++) pts.push([v[i * 2], v[i * 2 + 1]]);\n return pts;\n }\n if (att.type === \"path\") return undefined;\n const [w, h] = regionSize(doc, att), m = regionMatrix(skel, slotId, att), pivot: Pivot = { x: 0.5, y: 0.5 };\n const params = deformParams(pose, att.id);\n const offsets = params ? controlOffsets(params, w, h, pivot) : undefined;\n const pts: [number, number][] = [];\n const push = (u: number, v: number) => {\n const [ox, oy] = offsets ? evalPatch(offsets, u, v) : [0, 0];\n pts.push(apply(m, (u - 0.5) * w + ox, (v - 0.5) * h + oy));\n };\n const n = Math.max(1, samplesPerEdge);\n for (let i = 0; i < n; i++) push(i / n, 0);\n for (let i = 0; i < n; i++) push(1, i / n);\n for (let i = 0; i < n; i++) push(1 - i / n, 1);\n for (let i = 0; i < n; i++) push(0, 1 - i / n);\n return pts;\n}\n", "/**\n * rig-state \u2014 animation state machine over a pose sink (RigPlayer, or anything with `setPose`).\n *\n * - base: the looping default (`idle`); shown whenever nothing else is active. A non-looping base holds its end pose.\n * - main: one-shot (or forced loop) requests with priorities and a FIFO queue. Equal/higher priority interrupts,\n * lower priority queues (or is dropped). After completion \u2192 next queued, else base, else hold the last pose.\n * - overlays: named independent loops whose keys override the shown pose (blink, mouth). Non-looping overlays\n * remove themselves when done.\n * - crossfade: numbers blend from the last composed pose; discrete keys (attachment) hold until the mix ends.\n * Every `play` promise resolves \u2014 a game can `await` it without risk of hanging.\n */\nimport type { RigDocument, Animation } from \"./rig-format\";\nimport { poseOf, blendPoses, restValue, type Pose } from \"./rig-anim\";\n\nexport interface PoseSink { doc: RigDocument; setPose(pose: Pose): void }\nexport type PlayResult = \"completed\" | \"interrupted\" | \"dropped\" | \"stopped\";\nexport interface PlayOptions {\n /** default 0; a request interrupts the current one when its priority is >= */\n priority?: number;\n /** default: the animation's own `loop` */\n loop?: boolean;\n /** crossfade seconds from the current pose; default: the state's `mix` */\n mix?: number;\n /** what to do when a higher-priority animation is playing (default \"queue\") */\n ifBusy?: \"queue\" | \"drop\" | \"interrupt\";\n /** synchronous callback, in addition to the returned promise */\n onComplete?: (result: PlayResult) => void;\n}\n\ninterface Channel {\n anim: Animation; time: number; loop: boolean; done: boolean; priority: number;\n /** first advance fires t=0 events */\n fresh: boolean;\n settle?: (r: PlayResult) => void;\n}\n\nexport class AnimationState {\n onEvent?: (name: string, payload?: Record<string, unknown>) => void;\n private base?: Channel;\n private main?: Channel;\n private queue: Channel[] = [];\n private overlays = new Map<string, Channel>();\n /** last composed pose without overlays \u2014 mix snapshots start here */\n private pose: Pose = new Map();\n private from?: Pose;\n private mixLeft = 0;\n private mixTotal = 0;\n /** a mix begun in this update shows weight 0 for the frame it starts on */\n private mixFresh = false;\n private readonly defaultMix: number;\n\n constructor(private readonly sink: PoseSink, opts: { mix?: number } = {}) {\n this.defaultMix = opts.mix ?? 0;\n }\n\n /** id of the animation currently shown (main, else base) */\n get current(): string | undefined { return (this.main ?? this.base)?.anim.id; }\n get baseId(): string | undefined { return this.base?.anim.id; }\n\n private channel(id: string, loop?: boolean, priority = 0): Channel {\n const anim = this.sink.doc.animations.find(a => a.id === id);\n if (!anim) throw new Error(`unknown animation \"${id}\"`);\n return { anim, time: 0, loop: loop ?? anim.loop, done: false, priority, fresh: true };\n }\n\n setBase(id?: string, opts: { mix?: number } = {}) {\n this.base = id === undefined ? undefined : this.channel(id);\n if (!this.main || this.main.done) { this.main = undefined; this.beginMix(opts.mix); this.update(0); }\n }\n\n play(id: string, opts: PlayOptions = {}): Promise<PlayResult> {\n const ch = this.channel(id, opts.loop, opts.priority ?? 0);\n const promise = new Promise<PlayResult>(resolve => {\n ch.settle = r => { ch.settle = undefined; opts.onComplete?.(r); resolve(r); };\n });\n const cur = this.main, busy = cur !== undefined && !cur.done, mode = opts.ifBusy ?? \"queue\";\n if (!busy || mode === \"interrupt\" || ch.priority >= cur.priority) {\n if (busy) cur.settle?.(\"interrupted\");\n this.main = ch;\n this.beginMix(opts.mix);\n this.update(0);\n } else if (mode === \"drop\") ch.settle!(\"dropped\");\n else this.queue.push(ch);\n return promise;\n }\n\n /** Independent loop on top of the shown pose; `undefined` removes it. */\n setOverlay(name: string, id?: string) {\n if (id === undefined) this.overlays.delete(name);\n else this.overlays.set(name, this.channel(id));\n }\n\n /** Clear everything and show the setup pose. Pending plays resolve as \"stopped\". */\n stop() {\n this.main?.settle?.(\"stopped\");\n for (const ch of this.queue) ch.settle?.(\"stopped\");\n this.main = this.base = undefined; this.queue = []; this.overlays.clear();\n this.from = undefined; this.mixLeft = this.mixTotal = 0; this.mixFresh = false;\n this.pose = new Map();\n this.sink.setPose(new Map());\n }\n\n update(dt: number) {\n if (this.base) this.advance(this.base, dt, this.main === undefined);\n if (this.main) {\n const wasDone = this.main.done;\n this.advance(this.main, dt, true);\n if (this.main.done && !wasDone) {\n this.main.settle?.(\"completed\");\n const next = this.queue.shift();\n if (next || this.base) { this.main = next; this.beginMix(); }\n // else: hold the finished pose until something else is requested\n }\n }\n const shown = this.main ?? this.base;\n let pose: Pose = shown ? poseOf(shown.anim, shown.time) : new Map();\n if (this.from) {\n if (!this.mixFresh) this.mixLeft = Math.max(0, this.mixLeft - dt);\n this.mixFresh = false;\n const w = this.mixTotal > 0 ? 1 - this.mixLeft / this.mixTotal : 1;\n pose = blendPoses(this.from, pose, w, k => restValue(this.sink.doc, k));\n if (this.mixLeft === 0) this.from = undefined;\n }\n this.pose = pose;\n if (this.overlays.size) {\n pose = new Map(pose);\n for (const [name, ov] of this.overlays) {\n this.advance(ov, dt, false);\n poseOf(ov.anim, ov.time, pose);\n if (ov.done) this.overlays.delete(name);\n }\n }\n this.sink.setPose(pose);\n }\n\n private beginMix(mix = this.defaultMix) {\n if (mix > 0) { this.from = new Map(this.pose); this.mixLeft = this.mixTotal = mix; this.mixFresh = true; }\n else { this.from = undefined; this.mixLeft = this.mixTotal = 0; this.mixFresh = false; }\n }\n\n private advance(ch: Channel, dt: number, emit: boolean) {\n if (ch.done) return;\n const prev = ch.fresh ? -1 : ch.time, d = ch.anim.duration;\n ch.fresh = false;\n ch.time += dt;\n if (emit) for (const e of ch.anim.events) if (hit(e.t, prev, ch.time, d, ch.loop)) this.onEvent?.(e.name, e.payload);\n if (ch.time >= d) {\n if (ch.loop) ch.time %= d;\n else { ch.time = d; ch.done = true; }\n }\n }\n}\n\n/** event time t is crossed in (prev, cur]; for loops also across the wrap */\nfunction hit(t: number, prev: number, cur: number, d: number, loop: boolean) {\n if (cur < d || !loop) return t > prev && t <= cur;\n return (t > prev && t <= d) || t <= cur % d;\n}\n", "/**\n * rig-symbol \u2014 a rig as a slot symbol view for @energy8platform/game-engine (SymbolView, engine \u2265 0.43: square or rectangular cells).\n *\n * The interface is copied structurally (playIdle / playWin / showStatic / resize) so this package does not\n * depend on the engine. Centred at the origin and scaled so the rig canvas fits the cell, like AnimatedSymbol.\n * `setDim(on)` is an extra for non-winning symbols. Updated through a ticker (Ticker.shared by default).\n */\nimport { Container, Ticker, type Texture } from \"pixi.js\";\nimport { RigPlayer } from \"./rig-runtime\";\nimport type { RigDocument } from \"./rig-format\";\n\nexport interface TickerLike {\n add(fn: (t: { deltaMS: number }) => void): unknown;\n remove(fn: (t: { deltaMS: number }) => void): unknown;\n}\n\n/** a square cell (px) or a rectangular one, as the engine's SymbolView.resize takes */\nexport type SymbolSize = number | { width: number; height: number };\n\nexport interface RigSymbolOptions {\n /** cell size in px: a number scales the larger canvas side to it, a rectangle fits the canvas inside it */\n size: SymbolSize;\n /** animation ids to use; missing ones are skipped gracefully */\n animations?: { idle?: string; win?: string; dim?: string };\n /** crossfade seconds between states (default 0.15) */\n mix?: number;\n ticker?: TickerLike;\n}\n\n/** structural copy of the engine's SymbolView */\nexport interface SymbolViewLike extends Container {\n playIdle?(): void;\n playWin?(): Promise<void>;\n showStatic?(): void;\n resize?(size: SymbolSize): void;\n}\n\nexport class RigSymbol extends Container implements SymbolViewLike {\n readonly player: RigPlayer;\n private readonly names: Required<NonNullable<RigSymbolOptions[\"animations\"]>>;\n private readonly ticker: TickerLike;\n private readonly onTick = (t: { deltaMS: number }) => this.player.tick(t.deltaMS / 1000);\n\n constructor(readonly doc: RigDocument, textures: Map<string, Texture>, opts: RigSymbolOptions) {\n super();\n this.player = new RigPlayer(doc, textures, { mix: opts.mix ?? 0.15 });\n this.names = { idle: \"idle\", win: \"win\", dim: \"dim\", ...opts.animations };\n this.ticker = opts.ticker ?? Ticker.shared;\n this.addChild(this.player.view);\n this.resize(opts.size);\n this.ticker.add(this.onTick);\n }\n\n private has(id: string) { return this.doc.animations.some(a => a.id === id); }\n\n resize(size: SymbolSize) {\n const { width, height } = this.doc.meta;\n const s = typeof size === \"number\" ? size / Math.max(width, height) : Math.min(size.width / width, size.height / height);\n this.player.view.scale.set(s);\n this.player.view.position.set(-width * s / 2, -height * s / 2);\n }\n\n playIdle() {\n if (this.has(this.names.idle)) this.player.state.setBase(this.names.idle);\n else this.showStatic();\n }\n\n /** resolves when the win animation completes (or immediately if there is none / it was replaced) */\n async playWin(): Promise<void> {\n if (!this.has(this.names.win)) return;\n await this.player.state.play(this.names.win, { priority: 1 });\n }\n\n showStatic() { this.player.stop(); }\n\n /** dim as a held base pose (non-winning symbol); off \u2192 back to idle */\n setDim(on: boolean) {\n if (on && this.has(this.names.dim)) this.player.state.setBase(this.names.dim);\n else this.playIdle();\n }\n\n destroy(options?: Parameters<Container[\"destroy\"]>[0]) {\n this.ticker.remove(this.onTick);\n super.destroy(options);\n }\n}\n"],
|
|
5
|
-
"mappings": "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",
|
|
6
|
-
"names": ["DEG", "s", "c", "b", "DEG", "cos", "sin", "DEG", "Container", "Container"]
|
|
4
|
+
"sourcesContent": ["/**\n * rig-runtime v2 \u2014 PixiJS (v8) binding for `energy8.rig` documents.\n *\n * - Pose math lives in rig-anim.ts / rig-deform.ts (pure); this file only owns display objects.\n * - One display object per attachment: region \u2192 Sprite (or a 9\u00D79 MeshPlane when a lattice deform animates it),\n * mesh \u2192 Mesh with its own geometry, vertices skinned on the CPU every pose (positions in document space).\n * - All display objects live in ONE flat container sorted by draw order (slot z, or the drawOrder track).\n * - play/tick/stop are a thin wrapper over an AnimationState (see rig-state.ts) kept for simple consumers\n * (harness, viewer). Games should drive `state` directly for queues, priorities and overlays.\n */\nimport { Container, Sprite, Mesh, MeshGeometry, MeshPlane, Texture, Matrix, Rectangle, Graphics } from \"pixi.js\";\nimport { parse, type RigDocument, type Slot, type Attachment, type Asset } from \"./rig-format\";\nimport { evaluate, regionMatrix, regionSize, attachmentWorldVertices, colorToArray, pk, deformParams, samplePath, type Pose, type Affine, type Skeleton } from \"./rig-anim\";\nimport { controlOffsets, gridPositions } from \"./rig-deform\";\nimport { AnimationState, type PlayResult } from \"./rig-state\";\n\nconst DEG = Math.PI / 180;\n/** vertices per axis of a lattice-deformed region's render mesh (8 segments) */\nexport const MESH_GRID = 9;\n/** the least alpha an editor-selected slot is drawn with, so a part faded out at rest can still be seen */\nexport const GHOST_ALPHA = 0.5;\n\nexport interface PlayOptions {\n loop?: boolean;\n /** crossfade seconds from current pose */\n mix?: number;\n onComplete?: () => void;\n onEvent?: (name: string, payload?: Record<string, unknown>) => void;\n}\n\ninterface Item {\n att: Attachment;\n slot: Slot;\n node: Sprite | MeshPlane | Mesh;\n /** lattice-deformed region */\n lattice?: { plane: MeshPlane; offsets: Float64Array; applied: Float64Array };\n /** skinned mesh */\n skinned?: { mesh: Mesh; positions: Float32Array };\n}\n\n/** Build the asset-id \u2192 Texture map, loading each `src` once and cutting atlas frames (with rotation and trim). */\nexport async function createTextures(doc: RigDocument, loadSource: (src: string) => Promise<Texture>): Promise<Map<string, Texture>> {\n const bySrc = new Map<string, Texture>(), out = new Map<string, Texture>();\n for (const a of doc.assets) {\n let base = bySrc.get(a.src);\n if (!base) bySrc.set(a.src, (base = await loadSource(a.src)));\n if (!a.frame) { out.set(a.id, base); continue; }\n const [fx, fy, w, h] = a.frame; // unrotated trimmed size\n const trimmed = !!a.trim || w !== a.width || h !== a.height;\n const [ox, oy] = a.trim ?? [0, 0];\n out.set(a.id, new Texture({\n source: base.source,\n frame: new Rectangle(fx, fy, a.rotate ? h : w, a.rotate ? w : h),\n orig: new Rectangle(0, 0, a.width, a.height),\n // packer offsets: x from the left, y from the BOTTOM: top-left of the trimmed image in the original\n trim: trimmed ? new Rectangle(ox, a.height - oy - h, w, h) : undefined,\n rotate: a.rotate ? 2 : 0,\n }));\n }\n return out;\n}\n\n/**\n * Atlas-space uv (0..1 over the source image) for a point given in original-image fractions,\n * honouring frame, trim and 90\u00B0 packing rotation.\n */\nexport function atlasUV(asset: Asset, u: number, v: number, sourceW: number, sourceH: number): [number, number] {\n if (!asset.frame) return [u, v];\n // frame = [x, y, w, h]: packed position with w/h of the UNROTATED trimmed image; trim = packer offsets\n // (offsetY measured from the bottom, as in the Spine atlas format); width/height = original image size\n const [fx, fy, w, h] = asset.frame, [ox, oy] = asset.trim ?? [0, 0], W = asset.width, H = asset.height;\n let ax: number, ay: number;\n if (asset.rotate) { ax = fx - (H - oy - h) + v * H; ay = fy - (W - ox - w) + (1 - u) * W; }\n else { ax = fx - ox + u * W; ay = fy - (H - oy - h) + v * H; }\n return [ax / sourceW, ay / sourceH];\n}\n\nconst rgbOf = (c: number[]) => ((Math.round(c[0] * 255) << 16) | (Math.round(c[1] * 255) << 8) | Math.round(c[2] * 255));\n\n/** element-wise equality \u2014 used by updateDoc to tell mesh geometry (uvs/triangles) changes from vertex/weight ones */\nconst sameNumbers = (a: readonly number[], b: readonly number[]) => a === b || (a.length === b.length && a.every((v, i) => v === b[i]));\n\nexport class RigPlayer {\n readonly view = new Container();\n readonly state: AnimationState;\n private items: Item[] = [];\n private skel!: Skeleton;\n private textures: Map<string, Texture>;\n private pages = new Map<unknown, Texture>();\n /** slots the editor hides; honoured by setPose */\n private hidden = new Set<string>();\n /** slots the editor has selected; setPose draws them at GHOST_ALPHA at least */\n private ghosts = new Set<string>();\n private clipGraphics = new Map<string, Graphics>();\n\n /** Default crossfade is 0.18 seconds; explicit mix: 0 requests a hard cut. */\n constructor(public doc: RigDocument, textures: Map<string, Texture>, opts: { mix?: number; missingAnimation?: \"warn\" | \"throw\"; onWarning?: (message: string) => void } = {}) {\n // Reject invalid hierarchies before any traversal can stall.\n parse(doc);\n this.textures = textures;\n this.view.sortableChildren = true;\n const latticed = new Set<string>();\n for (const a of doc.animations) for (const t of a.tracks) if (t.target === \"deform\" && t.prop !== \"vertices\") latticed.add(t.id);\n const slots = new Map(doc.slots.map(s => [s.id, s]));\n for (const att of doc.attachments) {\n const slot = slots.get(att.slot);\n if (!slot || att.type === \"path\") continue;\n let item: Item;\n if (att.type === \"mesh\") {\n const asset = doc.assets.find(a => a.id === att.asset)!;\n const tex = this.textures.get(att.asset) ?? Texture.EMPTY;\n const page = this.pageTexture(tex);\n const n = att.uvs.length / 2, uvs = new Float32Array(n * 2), positions = new Float32Array(n * 2);\n for (let i = 0; i < n; i++) {\n const [u, v] = atlasUV(asset, att.uvs[i * 2], att.uvs[i * 2 + 1], page.width, page.height);\n uvs[i * 2] = u; uvs[i * 2 + 1] = v;\n }\n const geometry = new MeshGeometry({ positions, uvs, indices: new Uint32Array(att.triangles) });\n const mesh = new Mesh({ geometry, texture: page });\n item = { att, slot, node: mesh, skinned: { mesh, positions } };\n } else if (latticed.has(att.id)) {\n const plane = new MeshPlane({ texture: this.textures.get(att.asset) ?? Texture.EMPTY, verticesX: MESH_GRID, verticesY: MESH_GRID });\n plane.autoResize = false;\n item = { att, slot, node: plane, lattice: { plane, offsets: new Float64Array(18), applied: new Float64Array(18).fill(NaN) } };\n } else {\n const sp = new Sprite(this.textures.get(att.asset) ?? Texture.EMPTY);\n sp.anchor.set(0.5, 0.5);\n item = { att, slot, node: sp };\n }\n item.node.blendMode = slot.blend;\n this.items.push(item);\n this.view.addChild(item.node);\n }\n this.state = new AnimationState(this, { ...opts, mix: opts.mix ?? 0.18 });\n this.setPose(new Map());\n }\n\n /** whole atlas page as a plain texture (identity uv mapping) for skinned meshes */\n private pageTexture(tex: Texture): Texture {\n let page = this.pages.get(tex.source);\n if (!page) this.pages.set(tex.source, (page = tex.frame.x === 0 && tex.frame.y === 0 && tex.frame.width === tex.source.width && tex.frame.height === tex.source.height && !tex.rotate ? tex : new Texture({ source: tex.source })));\n return page;\n }\n\n /** Replace whatever is playing (no queueing). Resolves when the animation completes or is replaced. */\n play(animId: string, opts: PlayOptions = {}): Promise<PlayResult> {\n this.state.onEvent = opts.onEvent;\n return this.state.play(animId, {\n loop: opts.loop, mix: opts.mix, ifBusy: \"interrupt\",\n onComplete: r => { if (r === \"completed\") opts.onComplete?.(); },\n });\n }\n\n /**\n * Swap the document for pose evaluation without rebuilding display objects \u2014 valid only when slots/attachments\n * keep their ids and types (the editor uses it during drags). Throws otherwise: rebuild the player.\n */\n updateDoc(doc: RigDocument) {\n const atts = new Map(doc.attachments.map(a => [a.id, a])), slots = new Map(doc.slots.map(s => [s.id, s]));\n for (const it of this.items) {\n const a = atts.get(it.att.id), s = slots.get(it.slot.id);\n if (!a || !s || a.type !== it.att.type) throw new Error(\"updateDoc: structure changed \u2014 rebuild the player\");\n // mesh geometry (uvs/indices, including vertex count via uvs.length) is baked into the MeshGeometry in\n // the constructor \u2014 a changed uv/triangle set needs a rebuild; vertex/weight VALUES are fine (skinning\n // happens per-pose in setPose, not here).\n if (a.type === \"mesh\" && it.att.type === \"mesh\" && (!sameNumbers(a.uvs, it.att.uvs) || !sameNumbers(a.triangles, it.att.triangles)))\n throw new Error(\"updateDoc: structure changed \u2014 rebuild the player\");\n it.att = a; it.slot = s; it.node.blendMode = s.blend;\n }\n this.doc = doc;\n }\n\n /** Editor-only: hide a slot's display object regardless of the pose (restored by passing `true`). */\n setSlotVisible(slotId: string, visible: boolean) {\n if (visible) this.hidden.delete(slotId); else this.hidden.add(slotId);\n }\n\n /** Editor-only: draw these slots at GHOST_ALPHA at least, whatever the pose says (an empty list clears it). */\n setGhostSlots(slotIds: Iterable<string>) { this.ghosts = new Set(slotIds); }\n\n /** Stop playback and immediately restore the complete setup pose. */\n stop() { this.state.stop(); }\n\n /** dt in seconds */\n tick(dt: number) { this.state.update(dt); }\n\n /** Apply a pose (rest where silent) to the display objects. */\n setPose(pose: Pose) {\n const skel = (this.skel = evaluate(this.doc, pose));\n const clips = new Set(this.doc.slots.flatMap(s => s.clip ? [s.clip] : []));\n for (const [id, g] of this.clipGraphics) if (!clips.has(id)) { g.destroy(); this.clipGraphics.delete(id); }\n for (const id of clips) {\n const att = this.doc.attachments.find(a => a.id === id);\n if (att?.type !== \"path\" || !att.closed) continue;\n let g = this.clipGraphics.get(id);\n if (!g) { g = new Graphics(); this.clipGraphics.set(id, g); this.view.addChild(g); }\n const vertices = attachmentWorldVertices(skel, att.slot, att);\n const n = Math.max(32, vertices.length * 4);\n const points = samplePath(vertices, true, att.lengths, true, Array.from({ length: n }, (_, i) => i / n), true);\n g.clear().poly(points.flatMap(p => [p.x, p.y]), true).fill(0xffffff);\n }\n const m = new Matrix();\n // draw order: the drawOrder track lists slots back-to-front, else slot z\n const orderV = pose.get(pk(\"drawOrder\", \"order\", \"order\"));\n const order = new Map<string, number>();\n if (Array.isArray(orderV)) (orderV as string[]).forEach((id, i) => order.set(id, i));\n for (const it of this.items) {\n const s = it.slot, shown = skel.attachment.get(s.id);\n it.node.mask = s.clip ? this.clipGraphics.get(s.clip) ?? null : null;\n if (shown !== it.att || this.hidden.has(s.id)) { it.node.visible = false; continue; }\n it.node.visible = true;\n const colorV = pose.get(pk(\"slot\", s.id, \"color\"));\n const color = Array.isArray(colorV) && typeof colorV[0] === \"number\" ? (colorV as number[]) : colorToArray(s.color);\n const alpha = numOf(pose, pk(\"slot\", s.id, \"alpha\"), s.alpha) * color[3];\n it.node.alpha = this.ghosts.has(s.id) ? Math.max(alpha, GHOST_ALPHA) : alpha;\n it.node.tint = rgbOf(color);\n it.node.zIndex = order.size ? (order.get(s.id) ?? 0) : numOf(pose, pk(\"slot\", s.id, \"z\"), s.z);\n if (it.skinned) {\n const v = attachmentWorldVertices(skel, s.id, it.att as Extract<Attachment, { type: \"mesh\" }>);\n const buf = it.skinned.mesh.geometry.getBuffer(\"aPosition\");\n (buf.data as Float32Array).set(v);\n buf.update();\n continue; // positions are in document space; the node stays at identity\n }\n const att = it.att as Extract<Attachment, { type: \"region\" }>;\n const [w, h] = regionSize(this.doc, att);\n if (it.lattice) {\n const off = controlOffsets(deformParams(pose, att.id) ?? {}, w, h, { x: 0.5, y: 0.5 }, it.lattice.offsets);\n if (!same(off, it.lattice.applied)) {\n const buf = it.lattice.plane.geometry.getBuffer(\"aPosition\");\n gridPositions(off, w, h, { x: 0.5, y: 0.5 }, MESH_GRID, buf.data as Float32Array);\n buf.update();\n it.lattice.applied.set(off);\n }\n } else {\n const sp = it.node as Sprite, tex = this.textures.get(att.asset);\n if (tex && sp.texture !== tex) sp.texture = tex;\n // drawn size may differ from the asset size\n if (tex && (att.width || att.height)) { sp.width = w; sp.height = h; }\n }\n const a = regionMatrix(skel, s.id, att);\n m.set(a.a, a.b, a.c, a.d, a.tx, a.ty);\n it.node.setFromMatrix(m);\n if (!it.lattice && (att.width || att.height)) { it.node.scale.x *= w / (this.textures.get(att.asset)?.width ?? w); it.node.scale.y *= h / (this.textures.get(att.asset)?.height ?? h); }\n }\n }\n\n /** World-space bone positions \u2014 used by editor gizmos and renderPreview overlays */\n bonePositions(): Record<string, { x: number; y: number; rotation: number }> {\n const out: Record<string, { x: number; y: number; rotation: number }> = {};\n for (const [id, st] of this.skel.bones) out[id] = { x: st.world.tx, y: st.world.ty, rotation: Math.atan2(st.world.b, st.world.a) / DEG };\n return out;\n }\n\n /** current world transforms (for tests and tools) */\n get world(): Map<string, Affine> { return new Map([...this.skel.bones].map(([id, s]) => [id, s.world])); }\n}\n\nconst numOf = (pose: Pose, key: string, rest: number) => { const v = pose.get(key); return typeof v === \"number\" ? v : rest; };\nconst same = (a: Float64Array, b: Float64Array) => { for (let i = 0; i < a.length; i++) if (a[i] !== b[i]) return false; return true; };\n", "/**\n * rig-format v2 \u2014 declarative rig document for slot animation.\n * Source of truth for both AI agents and the editor.\n *\n * Conventions (agents rely on these, keep them stable):\n * - Units: pixels in document space, origin top-left, Y down (PixiJS).\n * - Rotation: degrees, clockwise positive. Shear: degrees added to the x axis (shearX) / y axis (shearY).\n * - Bone transforms are LOCAL (relative to parent, subject to `inherit`). Root bones \u2014 relative to document.\n * - Time: seconds. Animation duration is explicit, keys may end earlier.\n * - Ids: snake_case, unique within their collection.\n *\n * v2 (Spine-class): attachments are first-class (region / mesh with weights / path), bones have shear and\n * inherit modes, slots have a colour, constraints (ik / transform / path) with their own tracks, deform tracks\n * carry vertex offsets, drawOrder tracks. v0/v1 documents are migrated on parse (slot pivot/offset \u2192 region attachment).\n */\nimport { z } from \"zod\";\nimport { DEFORM_PROP_RE, DEFORM_BOUNDS } from \"./rig-deform\";\n\n// ---------- primitives ----------\n\n/** the shape of every id in the format; exported so UIs can check a typed id before building a tool call */\nexport const ID_RE = /^[a-z][a-z0-9_]*$/;\nexport const Id = z.string().regex(ID_RE, \"snake_case id\");\n\nexport const Ease = z.union([\n z.enum([\"linear\", \"step\", \"ease_in\", \"ease_out\", \"ease_in_out\", \"minimum_jerk\", \"back_out\", \"elastic_out\"]),\n // cubic-bezier control points, same semantics as CSS\n z.object({ bezier: z.tuple([z.number(), z.number(), z.number(), z.number()]) }),\n]);\n\nexport const Transform = z.object({\n x: z.number().default(0),\n y: z.number().default(0),\n rotation: z.number().default(0),\n scaleX: z.number().default(1),\n scaleY: z.number().default(1),\n shearX: z.number().default(0),\n shearY: z.number().default(0),\n});\n\nexport const Color = z.string().regex(/^#[0-9a-fA-F]{8}$/, \"color must be #rrggbbaa\");\nexport const Blend = z.enum([\"normal\", \"add\", \"multiply\", \"screen\"]);\nexport const Inherit = z.enum([\"normal\", \"onlyTranslation\", \"noRotationOrReflection\", \"noScale\", \"noScaleOrReflection\"]);\n\n// ---------- assets ----------\n\nexport const Asset = z.object({\n id: Id,\n /** relative path inside the rig package, e.g. \"layers/arm_l.png\" */\n src: z.string(),\n /** original (untrimmed, unrotated) image size \u2014 the space attachments and uvs refer to */\n width: z.number().int().positive(),\n height: z.number().int().positive(),\n /** packed region [x, y, w, h] inside `src` when `src` is an atlas (w/h as packed: trimmed, rotated) */\n frame: z.tuple([z.number(), z.number(), z.number(), z.number()]).optional(),\n /** the packed region is stored rotated 90\u00B0 clockwise */\n rotate: z.union([z.literal(0), z.literal(90)]).default(0),\n /** offset [x, y] of the packed (trimmed) region inside the original image */\n trim: z.tuple([z.number(), z.number()]).optional(),\n /** where this layer came from \u2014 provenance for agents */\n origin: z\n .object({\n sourceImage: z.string().optional(),\n bboxSpace: z.enum([\"source\", \"document\"]).optional(),\n /** bbox in source image: [x, y, w, h] */\n bbox: z.tuple([z.number(), z.number(), z.number(), z.number()]).optional(),\n inpainted: z.boolean().default(false),\n prompt: z.string().optional(),\n })\n .optional(),\n});\n\n// ---------- skeleton ----------\n\nexport const Bone = z.object({\n id: Id,\n parent: Id.optional(),\n /** visual length for the editor gizmo and for chains (ik/path), no effect on child transforms */\n length: z.number().nonnegative().default(0),\n transform: Transform.default({}),\n /** which parts of the parent's world transform this bone inherits */\n inherit: Inherit.default(\"normal\"),\n /** semantic hint: \"head\", \"arm_l\", \"torso\"\u2026 drives auto-rig & presets */\n role: z.string().optional(),\n /** editor colour, no runtime effect */\n color: z.string().optional(),\n});\n\nexport const Slot = z.object({\n id: Id,\n bone: Id,\n /** Closed path attachment used as a moving clipping mask. */\n clip: Id.optional(),\n /** active attachment id; undefined = hidden */\n attachment: Id.optional(),\n alpha: z.number().min(0).max(1).default(1),\n /** draw order, higher = on top */\n z: z.number().int().default(0),\n /** blend mode: `add` for glows/fire on black, `multiply` for shadows */\n blend: Blend.default(\"normal\"),\n /** tint, #rrggbbaa */\n color: Color.default(\"#ffffffff\"),\n});\n\n// ---------- attachments ----------\n\n/** one bone's influence on a vertex: position in that bone's local space and weight */\nexport const Influence = z.object({ bone: Id, x: z.number(), y: z.number(), w: z.number() });\nconst VertexData = {\n /** unweighted: [x, y, \u2026] in the slot bone's local space */\n vertices: z.array(z.number()).optional(),\n /** weighted: one influence list per vertex */\n weights: z.array(z.array(Influence).min(1)).optional(),\n};\n\nexport const RegionAttachment = z.object({\n id: Id, slot: Id, type: z.literal(\"region\"),\n asset: Id,\n /** placement of the image centre in the slot bone's local space */\n x: z.number().default(0), y: z.number().default(0), rotation: z.number().default(0),\n scaleX: z.number().default(1), scaleY: z.number().default(1),\n /** drawn size; default: the asset size */\n width: z.number().positive().optional(), height: z.number().positive().optional(),\n});\nexport const MeshAttachment = z.object({\n id: Id, slot: Id, type: z.literal(\"mesh\"),\n asset: Id,\n /** texture coordinates 0..1 in the asset's original image, 2 per vertex */\n uvs: z.array(z.number()),\n triangles: z.array(z.number().int().nonnegative()),\n ...VertexData,\n /** number of hull vertices (the outline is uvs[0..hull)) */\n hull: z.number().int().nonnegative().default(0),\n width: z.number().positive().optional(), height: z.number().positive().optional(),\n});\nexport const PathAttachment = z.object({\n id: Id, slot: Id, type: z.literal(\"path\"),\n ...VertexData,\n /** curve lengths for constant-speed positioning */\n lengths: z.array(z.number()).default([]),\n closed: z.boolean().default(false),\n constantSpeed: z.boolean().default(true),\n});\nexport const Attachment = z.discriminatedUnion(\"type\", [RegionAttachment, MeshAttachment, PathAttachment]);\n\n// ---------- constraints ----------\n\nexport const IkConstraint = z.object({\n id: Id, order: z.number().int().default(0),\n bones: z.array(Id).min(1), target: Id,\n iterations: z.number().int().min(1).max(1000).optional(),\n tolerance: z.number().positive().optional(),\n mix: z.number().default(1), softness: z.number().default(0),\n bendPositive: z.boolean().default(true), compress: z.boolean().default(false), stretch: z.boolean().default(false), uniform: z.boolean().default(false),\n});\nexport const TransformConstraint = z.object({\n id: Id, order: z.number().int().default(0),\n bones: z.array(Id).min(1), target: Id,\n local: z.boolean().default(false), relative: z.boolean().default(false),\n rotation: z.number().default(0), x: z.number().default(0), y: z.number().default(0),\n scaleX: z.number().default(0), scaleY: z.number().default(0), shearY: z.number().default(0),\n mixRotate: z.number().default(1), mixX: z.number().default(1), mixY: z.number().default(1),\n mixScaleX: z.number().default(1), mixScaleY: z.number().default(1), mixShearY: z.number().default(1),\n});\nexport const PathConstraint = z.object({\n id: Id, order: z.number().int().default(0),\n bones: z.array(Id).min(1),\n /** slot whose active attachment is a path */\n target: Id,\n positionMode: z.enum([\"fixed\", \"percent\"]).default(\"percent\"),\n spacingMode: z.enum([\"length\", \"fixed\", \"percent\", \"proportional\"]).default(\"length\"),\n rotateMode: z.enum([\"tangent\", \"chain\", \"chainScale\"]).default(\"tangent\"),\n rotation: z.number().default(0), position: z.number().default(0), spacing: z.number().default(0),\n mixRotate: z.number().default(1), mixX: z.number().default(1), mixY: z.number().default(1),\n});\n\n/**\n * The mix channels that switch each kind of constraint on \u2014 the solvers' own early-outs, in one place:\n * `applyIk` returns at `mix <= 0`, `applyTransformConstraint` and `applyPathConstraint` when every mix here is 0.\n * `rig_check` (`constraint_dead`), the editor's drag redirection and the constraint forms all read this list, so\n * an early-out that ever changes has a single definition to change with it. They are also the keyable mix tracks.\n */\nexport const MIX_PROPS = {\n ik: [\"mix\"],\n transform: [\"mixRotate\", \"mixX\", \"mixY\", \"mixScaleX\", \"mixScaleY\", \"mixShearY\"],\n path: [\"mixRotate\", \"mixX\", \"mixY\"],\n} as const;\n\n// ---------- animation ----------\n\nexport const BoneProp = z.enum([\"x\", \"y\", \"rotation\", \"scaleX\", \"scaleY\", \"shearX\", \"shearY\"]);\nexport const SlotProp = z.enum([\"alpha\", \"attachment\", \"z\", \"color\"]);\n/** lattice params (fractions of the image size), p<row><col>x|y pixel offsets of one control point, or `vertices` (mesh offsets) */\nexport const DeformProp = z.string().regex(/^(bulge|bend|sway|squash|p[0-2][0-2][xy]|vertices)$/, \"deform prop must be bulge|bend|sway|squash|p<row><col>x|y|vertices\");\nexport const IkProp = z.enum([\"mix\", \"softness\", \"bendPositive\", \"compress\", \"stretch\"]);\nexport const TransformProp = z.enum([\"mixRotate\", \"mixX\", \"mixY\", \"mixScaleX\", \"mixScaleY\", \"mixShearY\", \"x\", \"y\", \"rotation\", \"scaleX\", \"scaleY\", \"shearY\"]);\nexport const PathProp = z.enum([\"position\", \"spacing\", \"mixRotate\", \"mixX\", \"mixY\"]);\n\nexport const KeyValue = z.union([z.number(), z.string(), z.null(), z.array(z.number()), z.array(z.string())]);\nexport const Key = z.object({\n t: z.number().nonnegative(),\n v: KeyValue,\n /** easing INTO the next key */\n ease: Ease.default(\"ease_in_out\"),\n});\n\nconst Interpolation = { interpolation: z.enum([\"segment\", \"pchip\"]).optional() };\nexport const Track = z.discriminatedUnion(\"target\", [\n z.object({ target: z.literal(\"bone\"), id: Id, prop: BoneProp, ...Interpolation, keys: z.array(Key).min(1) }),\n z.object({ target: z.literal(\"slot\"), id: Id, prop: SlotProp, ...Interpolation, keys: z.array(Key).min(1) }),\n z.object({ target: z.literal(\"deform\"), id: Id, prop: DeformProp, ...Interpolation, keys: z.array(Key).min(1) }),\n z.object({ target: z.literal(\"ik\"), id: Id, prop: IkProp, ...Interpolation, keys: z.array(Key).min(1) }),\n z.object({ target: z.literal(\"transform\"), id: Id, prop: TransformProp, ...Interpolation, keys: z.array(Key).min(1) }),\n z.object({ target: z.literal(\"path\"), id: Id, prop: PathProp, ...Interpolation, keys: z.array(Key).min(1) }),\n z.object({ target: z.literal(\"drawOrder\"), id: Id.default(\"order\"), prop: z.literal(\"order\").default(\"order\"), ...Interpolation, keys: z.array(Key).min(1) }),\n]);\n\nexport const Event = z.object({\n t: z.number().nonnegative(),\n name: z.string(),\n payload: z.record(z.unknown()).optional(),\n});\n\nexport const Animation = z.object({\n id: Id,\n duration: z.number().positive(),\n loop: z.boolean().default(false),\n tracks: z.array(Track).default([]),\n events: z.array(Event).default([]),\n /** if generated from a preset \u2014 keep params so the agent can re-tune instead of re-keying */\n preset: z.object({ name: z.string(), params: z.record(z.unknown()) }).optional(),\n});\n\n// ---------- document ----------\n\n/** the editor's reference underlay: a PNG in the rig's directory drawn under the canvas \u2014 runtime, preview and export ignore it */\nexport const Reference = z.object({\n src: z.string(),\n opacity: z.number().min(0).max(1).default(0.5),\n x: z.number().default(0), y: z.number().default(0),\n scale: z.number().positive().default(1),\n});\n\nexport const RigSchema = z.object({\n format: z.literal(\"energy8.rig\"),\n version: z.literal(2),\n meta: z.object({\n name: z.string(),\n width: z.number().int().positive(),\n height: z.number().int().positive(),\n /** free-form notes for agents & humans: what this rig is, what's intentionally missing */\n notes: z.string().optional(),\n reference: Reference.optional(),\n }),\n assets: z.array(Asset),\n bones: z.array(Bone).min(1),\n slots: z.array(Slot),\n attachments: z.array(Attachment).default([]),\n ik: z.array(IkConstraint).default([]),\n transform: z.array(TransformConstraint).default([]),\n path: z.array(PathConstraint).default([]),\n animations: z.array(Animation),\n});\n\n/** schema that also accepts v0/v1 input (migrated on the fly) */\nexport const RigDocument = z.preprocess(input => {\n const v = (input as { version?: unknown } | null)?.version;\n return v === 0 || v === 1 ? migrateV1(input) : input;\n}, RigSchema);\n\nexport type RigDocument = z.infer<typeof RigSchema>;\nexport type Bone = z.infer<typeof Bone>;\nexport type Slot = z.infer<typeof Slot>;\nexport type Asset = z.infer<typeof Asset>;\nexport type Reference = z.infer<typeof Reference>;\nexport type Attachment = z.infer<typeof Attachment>;\nexport type RegionAttachment = z.infer<typeof RegionAttachment>;\nexport type MeshAttachment = z.infer<typeof MeshAttachment>;\nexport type PathAttachment = z.infer<typeof PathAttachment>;\nexport type Influence = z.infer<typeof Influence>;\nexport type IkConstraint = z.infer<typeof IkConstraint>;\nexport type TransformConstraint = z.infer<typeof TransformConstraint>;\nexport type PathConstraint = z.infer<typeof PathConstraint>;\nexport type Animation = z.infer<typeof Animation>;\nexport type Track = z.infer<typeof Track>;\nexport type Key = z.infer<typeof Key>;\n\n// ---------- v1 \u2192 v2 migration ----------\n\nconst DEG = Math.PI / 180;\n\n/**\n * v0/v1: slot placement lived on the slot (pivot fraction + bone-local offset) and `attachment` named an ASSET.\n * v2: every showable image is a region attachment with its own placement; deform tracks target attachments.\n */\nexport function migrateV1(input: unknown): unknown {\n const doc = input as Record<string, any>;\n const assets: any[] = doc.assets ?? [], slots: any[] = doc.slots ?? [], anims: any[] = doc.animations ?? [];\n const assetById = new Map(assets.map(a => [a.id, a]));\n // which assets each slot can show: rest attachment + every attachment key value\n const shows = new Map<string, Set<string>>();\n const add = (slot: string, asset: string) => (shows.get(slot) ?? shows.set(slot, new Set()).get(slot)!).add(asset);\n for (const s of slots) if (s.attachment) add(s.id, s.attachment);\n for (const a of anims) for (const t of a.tracks ?? [])\n if (t.target === \"slot\" && t.prop === \"attachment\") for (const k of t.keys ?? []) if (typeof k.v === \"string\") add(t.id, k.v);\n const usage = new Map<string, number>();\n for (const set of shows.values()) for (const asset of set) usage.set(asset, (usage.get(asset) ?? 0) + 1);\n const attachmentId = (slot: string, asset: string) => ((usage.get(asset) ?? 0) > 1 ? `${slot}_${asset}` : asset);\n\n const attachments: any[] = [];\n for (const s of slots) {\n const pivot = s.pivot ?? { x: 0.5, y: 0.5 }, o = { x: 0, y: 0, rotation: 0, scaleX: 1, scaleY: 1, ...(s.offset ?? {}) };\n for (const asset of shows.get(s.id) ?? []) {\n const a = assetById.get(asset);\n if (!a) continue;\n // image centre relative to the pivot point, then through the slot offset transform\n const cx = (0.5 - pivot.x) * a.width, cy = (0.5 - pivot.y) * a.height;\n const r = o.rotation * DEG, cos = Math.cos(r), sin = Math.sin(r);\n const x = o.x + cos * o.scaleX * cx - sin * o.scaleY * cy, y = o.y + sin * o.scaleX * cx + cos * o.scaleY * cy;\n attachments.push({ id: attachmentId(s.id, asset), slot: s.id, type: \"region\", asset, x: round(x), y: round(y), rotation: o.rotation, scaleX: o.scaleX, scaleY: o.scaleY });\n }\n }\n const restAttachment = (slot: string) => {\n const s = slots.find(x => x.id === slot);\n const first = s?.attachment ?? [...(shows.get(slot) ?? [])][0];\n return first ? attachmentId(slot, first) : undefined;\n };\n const newSlots = slots.map(s => {\n const { pivot, offset, attachment, ...rest } = s;\n return { ...rest, ...(attachment ? { attachment: attachmentId(s.id, attachment) } : {}) };\n });\n const newAnims = anims.map(a => ({\n ...a,\n tracks: (a.tracks ?? []).flatMap((t: any) => {\n if (t.target === \"slot\" && t.prop === \"attachment\")\n return [{ ...t, keys: t.keys.map((k: any) => ({ ...k, v: typeof k.v === \"string\" ? attachmentId(t.id, k.v) : k.v })) }];\n if (t.target === \"deform\") { const id = restAttachment(t.id); return id ? [{ ...t, id }] : []; }\n return [t];\n }),\n }));\n return { ...doc, version: 2, slots: newSlots, attachments: [...(doc.attachments ?? []), ...attachments], animations: newAnims };\n}\nconst round = (v: number) => Math.round(v * 1e6) / 1e6 + 0;\n\n// ---------- semantic validation (beyond shape) ----------\n\nconst trackId = (t: Track) => `${t.target}.${t.id}.${t.prop}`;\n\nexport function validate(doc: RigDocument): string[] {\n const errs: string[] = [];\n const dup = (xs: { id: string }[], kind: string) => {\n const seen = new Set<string>();\n for (const x of xs) {\n if (seen.has(x.id)) errs.push(`${kind}: duplicate id \"${x.id}\"`);\n seen.add(x.id);\n }\n };\n dup(doc.assets, \"asset\"); dup(doc.bones, \"bone\"); dup(doc.slots, \"slot\"); dup(doc.attachments, \"attachment\");\n dup(doc.animations, \"animation\"); dup(doc.ik, \"ik\"); dup(doc.transform, \"transform\"); dup(doc.path, \"path\");\n\n const bones = new Set(doc.bones.map(b => b.id));\n const assets = new Map(doc.assets.map(a => [a.id, a]));\n const slots = new Set(doc.slots.map(s => s.id));\n const attachments = new Map(doc.attachments.map(a => [a.id, a]));\n const iks = new Set(doc.ik.map(c => c.id)), transforms = new Set(doc.transform.map(c => c.id)), paths = new Set(doc.path.map(c => c.id));\n\n for (const b of doc.bones) {\n if (b.parent && !bones.has(b.parent)) errs.push(`bone \"${b.id}\": unknown parent \"${b.parent}\"`);\n }\n for (const b of doc.bones) {\n const seen = new Set<string>(); let cur: Bone | undefined = b;\n while (cur?.parent) {\n if (seen.has(cur.id)) { errs.push(`bone \"${b.id}\": parent cycle`); break; }\n seen.add(cur.id); cur = doc.bones.find(x => x.id === cur!.parent);\n }\n }\n if (!doc.bones.some(b => !b.parent)) errs.push(\"no root bone\");\n\n for (const a of doc.assets) {\n if (a.frame && (a.frame[2] <= 0 || a.frame[3] <= 0)) errs.push(`asset \"${a.id}\": frame must have positive size`);\n if (a.frame && !a.trim && !a.rotate && (a.frame[2] !== a.width || a.frame[3] !== a.height)) errs.push(`asset \"${a.id}\": frame size must equal width\u00D7height (or declare trim/rotate)`);\n }\n for (const s of doc.slots) {\n if (s.clip) {\n const mask = attachments.get(s.clip);\n if (mask?.type !== \"path\" || !mask.closed) errs.push(`slot \"${s.id}\": clip must name a closed path attachment`);\n }\n if (!bones.has(s.bone)) errs.push(`slot \"${s.id}\": unknown bone \"${s.bone}\"`);\n if (s.attachment) {\n const a = attachments.get(s.attachment);\n if (!a) errs.push(`slot \"${s.id}\": unknown attachment \"${s.attachment}\"`);\n else if (a.slot !== s.id) errs.push(`slot \"${s.id}\": attachment \"${s.attachment}\" belongs to slot \"${a.slot}\"`);\n }\n }\n const vertexCount = (a: Attachment): number => {\n if (a.type === \"region\") return 4;\n if (a.type === \"mesh\") return a.uvs.length / 2;\n return a.vertices ? a.vertices.length / 2 : a.weights?.length ?? 0;\n };\n for (const a of doc.attachments) {\n if (!slots.has(a.slot)) errs.push(`attachment \"${a.id}\": unknown slot \"${a.slot}\"`);\n if (a.type !== \"path\" && !assets.has(a.asset)) errs.push(`attachment \"${a.id}\": unknown asset \"${a.asset}\"`);\n if (a.type === \"mesh\" || a.type === \"path\") {\n const n = a.type === \"mesh\" ? a.uvs.length / 2 : vertexCount(a);\n if (a.type === \"mesh\") {\n if (a.uvs.length % 2 || n < 3) errs.push(`attachment \"${a.id}\": uvs must have 2 numbers per vertex, at least 3 vertices`);\n if (a.triangles.length % 3) errs.push(`attachment \"${a.id}\": triangles must have 3 indices each`);\n for (const i of a.triangles) if (i >= n) errs.push(`attachment \"${a.id}\": triangle index ${i} out of range (${n} vertices)`);\n }\n if ((a.vertices ? 1 : 0) + (a.weights ? 1 : 0) !== 1) errs.push(`attachment \"${a.id}\": exactly one of vertices / weights`);\n if (a.vertices && a.vertices.length !== 2 * n) errs.push(`attachment \"${a.id}\": vertices must have 2 numbers per vertex (${2 * n}, got ${a.vertices.length})`);\n if (a.weights) {\n if (a.weights.length !== n) errs.push(`attachment \"${a.id}\": weights must have one influence list per vertex (${n}, got ${a.weights.length})`);\n for (const list of a.weights) for (const inf of list) if (!bones.has(inf.bone)) errs.push(`attachment \"${a.id}\": weights reference unknown bone \"${inf.bone}\"`);\n }\n }\n }\n for (const c of doc.ik) {\n for (let i = 1; i < c.bones.length; i++) if (doc.bones.find(b => b.id === c.bones[i])?.parent !== c.bones[i - 1])\n errs.push(`ik \"${c.id}\": bones must form a contiguous parent-to-child chain`);\n\n for (const b of c.bones) if (!bones.has(b)) errs.push(`ik \"${c.id}\": unknown bone \"${b}\"`);\n if (!bones.has(c.target)) errs.push(`ik \"${c.id}\": unknown target bone \"${c.target}\"`);\n }\n for (const c of doc.transform) {\n for (const b of c.bones) if (!bones.has(b)) errs.push(`transform \"${c.id}\": unknown bone \"${b}\"`);\n if (!bones.has(c.target)) errs.push(`transform \"${c.id}\": unknown target bone \"${c.target}\"`);\n }\n for (const c of doc.path) {\n for (const b of c.bones) if (!bones.has(b)) errs.push(`path \"${c.id}\": unknown bone \"${b}\"`);\n if (!slots.has(c.target)) errs.push(`path \"${c.id}\": unknown target slot \"${c.target}\"`);\n }\n\n for (const a of doc.animations) {\n const tracks = new Set<string>();\n for (const t of a.tracks) {\n const tid = trackId(t);\n if (tracks.has(tid)) errs.push(`animation \"${a.id}\": duplicate track ${tid}`);\n tracks.add(tid);\n const known = t.target === \"bone\" ? bones.has(t.id) : t.target === \"slot\" ? slots.has(t.id) : t.target === \"deform\" ? attachments.has(t.id)\n : t.target === \"ik\" ? iks.has(t.id) : t.target === \"transform\" ? transforms.has(t.id) : t.target === \"path\" ? paths.has(t.id) : true;\n if (!known) errs.push(`animation \"${a.id}\": unknown ${t.target} \"${t.id}\"`);\n const bound = t.target === \"deform\" ? (DEFORM_BOUNDS as Record<string, number | undefined>)[t.prop] : undefined;\n const att = t.target === \"deform\" ? attachments.get(t.id) : undefined;\n let prev = -1;\n for (const k of t.keys) {\n if (k.t <= prev && prev >= 0) errs.push(`animation \"${a.id}\" ${tid}: keys not strictly increasing`);\n if (k.t > a.duration) errs.push(`animation \"${a.id}\" ${tid}: key at ${k.t}s exceeds duration`);\n if (t.target === \"slot\" && t.prop === \"attachment\") {\n if (k.v !== null && typeof k.v !== \"string\") errs.push(`animation \"${a.id}\" ${tid}: attachment key must be an attachment id or null`);\n else if (typeof k.v === \"string\") {\n const target = attachments.get(k.v);\n if (!target) errs.push(`animation \"${a.id}\": unknown attachment \"${k.v}\"`);\n else if (target.slot !== t.id) errs.push(`animation \"${a.id}\" ${tid}: attachment \"${k.v}\" belongs to slot \"${target.slot}\"`);\n }\n } else if (t.target === \"slot\" && t.prop === \"color\") {\n const ok = Array.isArray(k.v) && k.v.length === 4 && k.v.every(c => typeof c === \"number\" && c >= 0 && c <= 1);\n if (!ok) errs.push(`animation \"${a.id}\" ${tid}: color key must be [r, g, b, a] in 0..1`);\n } else if (t.target === \"drawOrder\") {\n const order = Array.isArray(k.v) ? (k.v as unknown[]) : [];\n const ok = order.length === doc.slots.length && new Set(order).size === order.length && order.every(s => typeof s === \"string\" && slots.has(s));\n if (!ok) errs.push(`animation \"${a.id}\" drawOrder key at ${k.t}s must list every slot exactly once`);\n } else if (t.target === \"deform\" && t.prop === \"vertices\") {\n if (!Array.isArray(k.v) || !k.v.every(v => typeof v === \"number\")) errs.push(`animation \"${a.id}\" ${tid}: vertices key must be a number array`);\n else if (att && att.type !== \"region\") {\n const expected = att.weights ? 2 * att.weights.reduce((s, list) => s + list.length, 0) : 2 * vertexCount(att);\n if (k.v.length !== expected) errs.push(`animation \"${a.id}\" ${tid}: vertices key needs ${expected} numbers, got ${k.v.length}`);\n } else if (att) errs.push(`animation \"${a.id}\" ${tid}: vertices deform needs a mesh or path attachment`);\n } else if (typeof k.v !== \"number\") errs.push(`animation \"${a.id}\" ${tid}: key must be a number`);\n else if (bound !== undefined && Math.abs(k.v) > bound) errs.push(`animation \"${a.id}\" ${tid}: value ${k.v} out of range [-${bound}, ${bound}]`);\n prev = k.t;\n }\n }\n for (const e of a.events) {\n if (e.t > a.duration) errs.push(`animation \"${a.id}\": event \"${e.name}\" exceeds duration`);\n }\n }\n return errs;\n}\n\nexport function parse(input: unknown): RigDocument {\n const doc = RigDocument.parse(input);\n const errs = validate(doc);\n if (errs.length) throw new Error(\"rig validation failed:\\n\" + errs.join(\"\\n\"));\n return doc;\n}\n", "/**\n * rig-deform \u2014 3\u00D73 control-grid deformer for a slot's attachment (pure math, no PixiJS).\n *\n * Control points live on an interpolating biquadratic (Lagrange) patch over the image:\n * rows r=0..2 at v=0,0.5,1 of the height (top\u2192bottom), cols c=0..2 at u=0,0.5,1 of the width.\n * Each control point carries an offset (dx, dy) in image pixels. With zero offsets the patch is the\n * identity, and moving control point (r,c) by d moves the surface at that point by exactly d.\n *\n * Named params are dimensionless fractions of the image size (see spec \u00A71); raw `p<r><c>x|y` are pixels.\n * All contributions add.\n */\n\nexport const DEFORM_NAMED = [\"bulge\", \"bend\", \"sway\", \"squash\"] as const;\nexport const DEFORM_PROP_RE = /^(bulge|bend|sway|squash|p[0-2][0-2][xy])$/;\n/** |value| bound per named param. bulge/squash reach a degenerate (zero-area) patch at 1, hence 0.9. */\nexport const DEFORM_BOUNDS: Record<(typeof DEFORM_NAMED)[number], number> = { bulge: 0.9, bend: 1, sway: 1, squash: 0.9 };\n\nexport interface Pivot { x: number; y: number }\n\nconst T = [0, 0.5, 1];\nconst basis = (t: number) => [(1 - t) * (1 - 2 * t), 4 * t * (1 - t), t * (2 * t - 1)];\nconst dbasis = (t: number) => [4 * t - 3, 4 - 8 * t, 4 * t - 1];\n\n/** Named params + raw offsets \u2192 18 numbers [dx00, dy00, dx01, dy01, \u2026] row-major by (r*3+c). */\nexport function controlOffsets(params: Record<string, number>, w: number, h: number, pivot: Pivot, out: Float64Array = new Float64Array(18)): Float64Array {\n out.fill(0);\n const bulge = params.bulge ?? 0, bend = params.bend ?? 0, sway = params.sway ?? 0, squash = params.squash ?? 0;\n for (let r = 0; r < 3; r++) for (let c = 0; c < 3; c++) {\n const i = (r * 3 + c) * 2, u = T[c], v = T[r], mid = r === 1 ? 1 : 0;\n // `+ 0` folds IEEE -0 (zero params \u00D7 negative factors) into +0 so pinned points compare equal to 0\n out[i] = mid * (bulge * w * (u - 0.5) + bend * w) + sway * w * (v - pivot.y) + squash * w * (u - pivot.x) * 0.5 + 0;\n out[i + 1] = -squash * h * (v - pivot.y) + 0;\n }\n for (const k in params) {\n if (k.length !== 4 || k[0] !== \"p\") continue;\n const r = +k[1], c = +k[2];\n if (!(r >= 0 && r < 3 && c >= 0 && c < 3) || (k[3] !== \"x\" && k[3] !== \"y\")) continue;\n out[(r * 3 + c) * 2 + (k[3] === \"y\" ? 1 : 0)] += params[k];\n }\n return out;\n}\n\n/** Patch offset at normalized image coords (u, v) \u2208 [0,1]\u00B2. */\nexport function evalPatch(offsets: ArrayLike<number>, u: number, v: number): [number, number] {\n const bu = basis(u), bv = basis(v);\n let x = 0, y = 0;\n for (let r = 0; r < 3; r++) for (let c = 0; c < 3; c++) {\n const wgt = bv[r] * bu[c], i = (r * 3 + c) * 2;\n x += wgt * offsets[i]; y += wgt * offsets[i + 1];\n }\n return [x, y];\n}\n\n/** n\u00D7n render vertices (row-major, x fastest \u2014 PlaneGeometry order), pivot baked in, image-local pixels. */\nexport function gridPositions(offsets: ArrayLike<number>, w: number, h: number, pivot: Pivot, n: number, out: Float32Array = new Float32Array(2 * n * n)): Float32Array {\n const px = pivot.x * w, py = pivot.y * h;\n for (let j = 0; j < n; j++) for (let i = 0; i < n; i++) {\n const u = i / (n - 1), v = j / (n - 1), [ox, oy] = evalPatch(offsets, u, v), k = (j * n + i) * 2;\n out[k] = u * w - px + ox;\n out[k + 1] = v * h - py + oy;\n }\n return out;\n}\n\n/** Minimum Jacobian determinant of (u,v)\u2192image map over a sample grid, normalized so identity = 1. \u2264 0 means a fold. */\nexport function minJacobian(offsets: ArrayLike<number>, w: number, h: number, samples = 17): number {\n let min = Infinity;\n for (let j = 0; j < samples; j++) for (let i = 0; i < samples; i++) {\n const u = i / (samples - 1), v = j / (samples - 1);\n const bu = basis(u), bv = basis(v), du = dbasis(u), dv = dbasis(v);\n let xu = 0, xv = 0, yu = 0, yv = 0;\n for (let r = 0; r < 3; r++) for (let c = 0; c < 3; c++) {\n const k = (r * 3 + c) * 2, dx = offsets[k], dy = offsets[k + 1];\n xu += bv[r] * du[c] * dx; xv += dv[r] * bu[c] * dx;\n yu += bv[r] * du[c] * dy; yv += dv[r] * bu[c] * dy;\n }\n const det = ((w + xu) * (h + yv) - xv * yu) / (w * h);\n if (det < min) min = det;\n }\n return min;\n}\n", "/**\n * rig-anim \u2014 pure animation math shared by the runtime, the checker, the importer and tests. No PixiJS.\n *\n * - easing + track sampling, Pose: Map<\"target:id:prop\", value>\n * - 2D affine matrices with PixiJS layout (a b c d tx ty; x' = a\u00B7x + c\u00B7y + tx, y' = b\u00B7x + d\u00B7y + ty)\n * - bone world transforms with shear and inherit modes, constraints (ik / transform / path) applied in `order`\n * - attachment geometry in document space: region corners, skinned mesh vertices, lattice deformation\n */\nimport type { RigDocument, Animation, Track, Bone, Attachment, RegionAttachment, MeshAttachment, PathAttachment, IkConstraint, TransformConstraint, PathConstraint } from \"./rig-format\";\nimport { controlOffsets, evalPatch, type Pivot } from \"./rig-deform\";\n\nconst DEG = Math.PI / 180;\n\n// ---------- easing ----------\n\nexport type EaseSpec = Track[\"keys\"][number][\"ease\"];\n\nconst named: Record<string, (t: number) => number> = {\n linear: t => t,\n step: () => 0,\n ease_in: t => t * t,\n ease_out: t => 1 - (1 - t) * (1 - t),\n ease_in_out: t => (t < 0.5 ? 2 * t * t : 1 - (-2 * t + 2) ** 2 / 2),\n minimum_jerk: t => t * t * t * (10 + t * (-15 + 6 * t)),\n back_out: t => 1 + 2.70158 * (t - 1) ** 3 + 1.70158 * (t - 1) ** 2,\n elastic_out: t =>\n t === 0 ? 0 : t === 1 ? 1 : 2 ** (-10 * t) * Math.sin((t * 10 - 0.75) * ((2 * Math.PI) / 3)) + 1,\n};\n\n/**\n * Cubic bezier easing sampled into 10 linear segments walked in order of the curve parameter (the same\n * approximation Spine uses: 9 interior samples per curve), so control points with non-monotonic times\n * behave identically to Spine.\n */\nconst BEZIER_SEGMENTS = 10;\nfunction bezier(x1: number, y1: number, x2: number, y2: number) {\n const px: number[] = [0], py: number[] = [0];\n for (let i = 1; i <= BEZIER_SEGMENTS; i++) {\n const t = i / BEZIER_SEGMENTS, u = 1 - t;\n px.push(3 * u * u * t * x1 + 3 * u * t * t * x2 + t * t * t);\n py.push(3 * u * u * t * y1 + 3 * u * t * t * y2 + t * t * t);\n }\n return (x: number) => {\n if (x <= 0) return 0;\n for (let i = 1; i <= BEZIER_SEGMENTS; i++) {\n if (px[i] >= x) {\n const span = px[i] - px[i - 1];\n return py[i - 1] + (span > 0 ? ((x - px[i - 1]) / span) * (py[i] - py[i - 1]) : 0);\n }\n }\n return 1;\n };\n}\n\nconst easeCache = new Map<string, (t: number) => number>();\nexport function ease(spec: EaseSpec): (t: number) => number {\n if (typeof spec === \"string\") return named[spec];\n const key = spec.bezier.join(\",\");\n let f = easeCache.get(key);\n if (!f) easeCache.set(key, (f = bezier(...spec.bezier)));\n return f;\n}\n\n// ---------- sampling ----------\n\nexport type Val = number | string | null | number[] | string[];\n/** key: \"bone:id:prop\" | \"slot:id:prop\" | \"deform:id:prop\" | \"ik:id:prop\" | \"transform:id:prop\" | \"path:id:prop\" | \"drawOrder:order:order\" */\nexport type Pose = Map<string, Val>;\nexport const pk = (target: string, id: string, prop: string) => `${target}:${id}:${prop}`;\n\n/** Shape-preserving cubic, evaluated analytically rather than through the legacy Bezier lookup table. */\nfunction smoothValue(track: Track, i: number, t: number, component: number | undefined, loop: boolean): number {\n const k = track.keys, n = k.length;\n const v = (j: number) => component === undefined ? k[j].v as number : (k[j].v as number[])[component];\n const h = (j: number) => k[j + 1].t - k[j].t;\n const d = (j: number) => (v(j + 1) - v(j)) / h(j);\n const harmonic = (a: number, b: number, h0: number, h1: number) => a * b <= 0 ? 0 : 3 * (h0 + h1) / ((2 * h1 + h0) / a + (h1 + 2 * h0) / b);\n const tangent = (j: number): number => {\n if (j === 0 || j === n - 1) {\n if (loop && n > 2 && v(0) === v(n - 1) && k[0].ease !== \"step\" && k[n - 2].ease !== \"step\")\n return harmonic(d(n - 2), d(0), h(n - 2), h(0));\n return 0;\n }\n if (k[j - 1].ease === \"step\" || k[j].ease === \"step\") return 0;\n return harmonic(d(j - 1), d(j), h(j - 1), h(j));\n };\n const u = (t - k[i].t) / h(i), u2 = u * u, u3 = u2 * u;\n return (2 * u3 - 3 * u2 + 1) * v(i) + (u3 - 2 * u2 + u) * h(i) * tangent(i)\n + (-2 * u3 + 3 * u2) * v(i + 1) + (u3 - u2) * h(i) * tangent(i + 1);\n}\n\nexport function sample(track: Track, t: number, loop = false): Val {\n const keys = track.keys;\n if (t <= keys[0].t) return keys[0].v;\n const last = keys[keys.length - 1];\n if (t >= last.t) return last.v;\n let i = 0;\n while (keys[i + 1].t <= t) i++;\n const a = keys[i], b = keys[i + 1];\n if (a.ease === \"step\") return a.v;\n if (typeof a.v === \"number\" && typeof b.v === \"number\") {\n if (track.interpolation === \"pchip\") return smoothValue(track, i, t, undefined, loop);\n const u = ease(a.ease)((t - a.t) / (b.t - a.t));\n return a.v + (b.v - a.v) * u;\n }\n if (Array.isArray(a.v) && Array.isArray(b.v) && typeof a.v[0] === \"number\") {\n if (track.interpolation === \"pchip\") return (a.v as number[]).map((_, j) => smoothValue(track, i, t, j, loop));\n const u = ease(a.ease)((t - a.t) / (b.t - a.t)), av = a.v as number[], bv = b.v as number[];\n return av.map((v, k) => v + ((bv[k] ?? v) - v) * u);\n }\n return a.v; // discrete\n}\n\nexport function poseOf(anim: Animation, t: number, out: Pose = new Map()): Pose {\n for (const tr of anim.tracks) out.set(pk(tr.target, tr.id, tr.prop), sample(tr, t, anim.loop && tr.keys[0].t === 0 && tr.keys.at(-1)!.t === anim.duration));\n return out;\n}\n\n/** Crossfade: numbers (and number arrays) interpolate toward `to` (or rest when absent there); discrete values hold until w = 1. */\nexport function blendPoses(from: Pose, to: Pose, w: number, restOf: (key: string) => Val): Pose {\n if (w >= 1) return new Map(to);\n const out: Pose = new Map();\n for (const k of new Set([...from.keys(), ...to.keys()])) {\n const f = from.has(k) ? from.get(k)! : restOf(k);\n const cur = to.has(k) ? to.get(k)! : restOf(k);\n if (typeof f === \"number\" && !Array.isArray(cur)) {\n const target = typeof cur === \"number\" ? cur : (restOf(k) as number);\n out.set(k, f + (target - f) * w);\n } else if (Array.isArray(f) && typeof f[0] === \"number\") {\n const fv = f as number[], tv = (Array.isArray(cur) && typeof cur[0] === \"number\" ? cur : fv.map(() => 0)) as number[];\n out.set(k, fv.map((v, i) => v + ((tv[i] ?? 0) - v) * w));\n } else if (Array.isArray(cur) && typeof cur[0] === \"number\" && typeof f !== \"string\") {\n out.set(k, (cur as number[]).map(v => v * w));\n } else out.set(k, f ?? null);\n }\n return out;\n}\n\n/** Setup value of a pose key. */\nexport function restValue(doc: RigDocument, key: string): Val {\n const [target, id, prop] = key.split(\":\");\n if (target === \"bone\") return (doc.bones.find(b => b.id === id)!.transform as Record<string, number>)[prop];\n if (target === \"slot\") {\n const s = doc.slots.find(s => s.id === id)!;\n if (prop === \"color\") return colorToArray(s.color);\n return (s as unknown as Record<string, Val>)[prop];\n }\n if (target === \"ik\" || target === \"transform\" || target === \"path\") {\n const c = (doc[target] as { id: string }[]).find(c => c.id === id) as Record<string, unknown> | undefined;\n const v = c?.[prop];\n return typeof v === \"boolean\" ? (v ? 1 : 0) : ((v as number) ?? 0);\n }\n if (target === \"drawOrder\") return doc.slots.map(s => s.id);\n return 0;\n}\n\n/** \"#rrggbbaa\" \u2192 [r, g, b, a] in 0..1 */\nexport const colorToArray = (c: string): number[] => [0, 2, 4, 6].map(k => parseInt(c.slice(1 + k, 3 + k), 16) / 255);\n\n/** Numeric lattice deform params of one attachment present in the pose, or undefined when it has none. */\nexport function deformParams(pose: Pose, attachmentId: string): Record<string, number> | undefined {\n let out: Record<string, number> | undefined;\n const prefix = `deform:${attachmentId}:`;\n for (const [k, v] of pose)\n if (k.startsWith(prefix) && typeof v === \"number\") (out ??= {})[k.slice(prefix.length)] = v;\n return out;\n}\n\n// ---------- affine ----------\n\nexport interface Affine { a: number; b: number; c: number; d: number; tx: number; ty: number }\n\n/** translate \u00B7 rotate(deg, clockwise in Y-down) \u00B7 shear \u00B7 scale \u2014 PixiJS setTransform semantics with shear as axis angles */\nexport function affineOf(x: number, y: number, rotationDeg: number, sx: number, sy: number, shearX = 0, shearY = 0): Affine {\n const rx = (rotationDeg + shearX) * DEG, ry = (rotationDeg + 90 + shearY) * DEG;\n return { a: Math.cos(rx) * sx, b: Math.sin(rx) * sx, c: Math.cos(ry) * sy, d: Math.sin(ry) * sy, tx: x, ty: y };\n}\n\n/** parent \u2218 local (apply local first, then parent) \u2014 PixiJS Matrix.append */\nexport function mul(p: Affine, l: Affine): Affine {\n return {\n a: p.a * l.a + p.c * l.b, b: p.b * l.a + p.d * l.b,\n c: p.a * l.c + p.c * l.d, d: p.b * l.c + p.d * l.d,\n tx: p.a * l.tx + p.c * l.ty + p.tx, ty: p.b * l.tx + p.d * l.ty + p.ty,\n };\n}\n\nexport const apply = (m: Affine, x: number, y: number): [number, number] => [m.a * x + m.c * y + m.tx, m.b * x + m.d * y + m.ty];\n\nexport function invert(m: Affine): Affine {\n const det = m.a * m.d - m.b * m.c || 1e-12;\n const a = m.d / det, b = -m.b / det, c = -m.c / det, d = m.a / det;\n return { a, b, c, d, tx: -(a * m.tx + c * m.ty), ty: -(b * m.tx + d * m.ty) };\n}\n\n/** rotation of the x axis of an affine, degrees */\nexport const rotationOf = (m: Affine) => Math.atan2(m.b, m.a) / DEG;\n\n/**\n * Where a world matrix puts a bone, which way its x axis points, and how long its axes are \u2014 the inverse of\n * `affineOf` for everything except shear, which cannot be recovered from the axes alone (a sheared y axis is\n * reported by its length, and `angle` follows the x axis only). Reading a posed bone goes through here so the\n * numbers an agent gets are the numbers the runtime drew.\n */\nexport function decompose(m: Affine): { x: number; y: number; angle: number; scaleX: number; scaleY: number } {\n return { x: m.tx, y: m.ty, angle: rotationOf(m), scaleX: Math.hypot(m.a, m.b), scaleY: Math.hypot(m.c, m.d) };\n}\n\nconst num = (pose: Pose, key: string, rest: number) => { const v = pose.get(key); return typeof v === \"number\" ? v : rest; };\n\n// ---------- bones ----------\n\nexport interface BoneState {\n /** effective local values (setup + pose + constraint adjustments) */\n x: number; y: number; rotation: number; scaleX: number; scaleY: number; shearX: number; shearY: number;\n world: Affine;\n}\n\nexport interface Skeleton {\n doc: RigDocument;\n pose: Pose;\n bones: Map<string, BoneState>;\n /** attachment shown per slot (pose or setup), null = hidden */\n attachment: Map<string, Attachment | null>;\n}\n\nconst boneIndex = new WeakMap<RigDocument, Map<string, Bone>>();\nfunction boneOf(doc: RigDocument, id: string): Bone {\n let idx = boneIndex.get(doc);\n if (!idx) boneIndex.set(doc, (idx = new Map(doc.bones.map(b => [b.id, b]))));\n const b = idx.get(id);\n if (!b) throw new Error(`unknown bone \"${id}\"`);\n return b;\n}\n\n/** world transform of one bone from its effective local values and its parent's world transform, honouring `inherit` */\nexport function boneWorldOf(bone: Bone, s: Omit<BoneState, \"world\">, parent: Affine | undefined): Affine {\n const local = affineOf(s.x, s.y, s.rotation, s.scaleX, s.scaleY, s.shearX, s.shearY);\n if (!parent) return local;\n if (bone.inherit === \"normal\") return mul(parent, local);\n const [tx, ty] = apply(parent, s.x, s.y);\n return { ...mul(inheritedParentLinear(bone, parent), { ...local, tx: 0, ty: 0 }), tx, ty };\n}\n\n/** Order bones parent-first (memoized per document). */\nconst orderCache = new WeakMap<RigDocument, Bone[]>();\nexport function boneOrder(doc: RigDocument): Bone[] {\n let order = orderCache.get(doc);\n if (order) return order;\n order = [];\n const emitted = new Set<string>();\n while (order.length < doc.bones.length) {\n let progressed = false;\n for (const b of doc.bones) if (!emitted.has(b.id) && (!b.parent || emitted.has(b.parent))) { emitted.add(b.id); order.push(b); progressed = true; }\n if (!progressed) throw new Error(\"bone hierarchy has a cycle\");\n }\n orderCache.set(doc, order);\n return order;\n}\n\nconst localOf = (doc: RigDocument, pose: Pose, b: Bone): Omit<BoneState, \"world\"> => {\n const r = b.transform, id = b.id;\n return {\n x: num(pose, pk(\"bone\", id, \"x\"), r.x), y: num(pose, pk(\"bone\", id, \"y\"), r.y),\n rotation: num(pose, pk(\"bone\", id, \"rotation\"), r.rotation),\n scaleX: num(pose, pk(\"bone\", id, \"scaleX\"), r.scaleX), scaleY: num(pose, pk(\"bone\", id, \"scaleY\"), r.scaleY),\n shearX: num(pose, pk(\"bone\", id, \"shearX\"), r.shearX), shearY: num(pose, pk(\"bone\", id, \"shearY\"), r.shearY),\n };\n};\n\n/** Recompute world transforms of `bone` and its descendants from their current local values. */\nfunction updateSubtree(skel: Skeleton, root: string) {\n const doc = skel.doc;\n const kids = new Map<string, Bone[]>();\n for (const b of doc.bones) if (b.parent) (kids.get(b.parent) ?? kids.set(b.parent, []).get(b.parent)!).push(b);\n const stack = [root];\n while (stack.length) {\n const id = stack.pop()!, b = boneOf(doc, id), st = skel.bones.get(id)!;\n st.world = boneWorldOf(b, st, b.parent ? skel.bones.get(b.parent)!.world : undefined);\n for (const k of kids.get(id) ?? []) stack.push(k.id);\n }\n}\n\n/** Full skeleton evaluation for a pose: bone locals, constraints in order, world transforms, shown attachments. */\nexport function evaluate(doc: RigDocument, pose: Pose): Skeleton {\n const skel: Skeleton = { doc, pose, bones: new Map(), attachment: new Map() };\n for (const b of boneOrder(doc)) {\n const s = localOf(doc, pose, b);\n const world = boneWorldOf(b, s, b.parent ? skel.bones.get(b.parent)!.world : undefined);\n skel.bones.set(b.id, { ...s, world });\n }\n const attachments = new Map(doc.attachments.map(a => [a.id, a]));\n for (const s of doc.slots) {\n const v = pose.get(pk(\"slot\", s.id, \"attachment\"));\n const id = v === undefined ? s.attachment : (v as string | null);\n skel.attachment.set(s.id, id ? attachments.get(id) ?? null : null);\n }\n // constraints, in document order (ties broken by array order)\n const all: { order: number; kind: \"ik\" | \"transform\" | \"path\"; c: IkConstraint | TransformConstraint | PathConstraint }[] = [\n ...doc.ik.map(c => ({ order: c.order, kind: \"ik\" as const, c })),\n ...doc.transform.map(c => ({ order: c.order, kind: \"transform\" as const, c })),\n ...doc.path.map(c => ({ order: c.order, kind: \"path\" as const, c })),\n ].sort((a, b) => a.order - b.order);\n for (const { kind, c } of all) {\n if (kind === \"ik\") applyIk(skel, c as IkConstraint);\n else if (kind === \"transform\") applyTransformConstraint(skel, c as TransformConstraint);\n else applyPathConstraint(skel, c as PathConstraint);\n }\n return skel;\n}\n\n/** Bone world transforms for a pose (constraints applied). */\nexport function boneWorld(doc: RigDocument, pose: Pose): Map<string, Affine> {\n const skel = evaluate(doc, pose);\n return new Map([...skel.bones].map(([id, s]) => [id, s.world]));\n}\n\n// ---------- constraints ----------\n\n/** a constraint's value at this frame: the keyed one, else the document's \u2014 what every early-out below reads\n * (`applyIk` at `mix <= 0`, the transform/path solvers when all of `MIX_PROPS` are 0). `rig-check`'s `poseNum`\n * answers the same question elsewhere and must keep agreeing with it.\n * Outside the solvers, ask `mixAt` in rig-constraints.ts \u2014 the exported one, so a fourth copy is never needed. */\nconst cnum = (skel: Skeleton, kind: string, id: string, prop: string, rest: number | boolean) =>\n num(skel.pose, pk(kind, id, prop), typeof rest === \"boolean\" ? (rest ? 1 : 0) : rest);\n\n/** point in bone-local space of `bone` for a document-space point */\nfunction toLocal(skel: Skeleton, bone: string, x: number, y: number): [number, number] {\n return apply(invert(skel.bones.get(bone)!.world), x, y);\n}\n/** document-space direction of a bone's local x axis, degrees */\nconst worldRotation = (skel: Skeleton, bone: string) => rotationOf(skel.bones.get(bone)!.world);\n\nconst IDENTITY: Affine = { a: 1, b: 0, c: 0, d: 1, tx: 0, ty: 0 };\nconst wrapRad = (r: number) => (r > Math.PI ? r - 2 * Math.PI : r < -Math.PI ? r + 2 * Math.PI : r);\n\n/**\n * Single-bone IK: rotate `bone` so its (sheared) x axis points at the world point, blended by `mix`. Solved in the\n * parent's local space, which aims correctly under any parent scale; a negative scaleX flips the axis by 180\u00B0.\n * compress/stretch scale the bone's length to the target distance (uniform: both axes).\n */\nfunction aimAt(skel: Skeleton, boneId: string, tx: number, ty: number, mix: number, compress = false, stretch = false, uniform = false) {\n const b = boneOf(skel.doc, boneId), st = skel.bones.get(boneId)!;\n const parent = b.parent ? skel.bones.get(b.parent)!.world : undefined;\n let dx: number, dy: number;\n if (parent && b.inherit === \"onlyTranslation\") { dx = tx - st.world.tx; dy = ty - st.world.ty; }\n else {\n const [px, py] = parent ? apply(invert(parent), tx, ty) : [tx, ty];\n dx = px - st.x; dy = py - st.y;\n }\n let r = Math.atan2(dy, dx) / DEG - st.shearX - st.rotation;\n if (st.scaleX < 0) r += 180;\n r = shortest(r);\n let sx = st.scaleX, sy = st.scaleY;\n if (compress || stretch) {\n const len = b.length * sx;\n if (len > 0.0001) {\n const dd = dx * dx + dy * dy;\n if ((compress && dd < len * len) || (stretch && dd > len * len)) { const f = (Math.sqrt(dd) / len - 1) * mix + 1; sx *= f; if (uniform) sy *= f; }\n }\n }\n st.rotation += r * mix; st.scaleX = sx; st.scaleY = sy;\n updateSubtree(skel, boneId);\n}\n\nconst shortest = (deg: number) => ((((deg + 180) % 360) + 360) % 360) - 180;\n\n/** CCD for longer chains. Solves a fresh pose each evaluation, then blends the local rotations once. */\nfunction applyLongIk(skel: Skeleton, c: IkConstraint, tx: number, ty: number, mix: number) {\n const initial = c.bones.map(id => ({ ...skel.bones.get(id)! }));\n const last = c.bones.at(-1)!, len = boneOf(skel.doc, last).length;\n const end = () => apply(skel.bones.get(last)!.world, len, 0);\n const tolerance = c.tolerance ?? 0.05;\n // A straight chain aimed along its axis has zero CCD gradient even when it must fold.\n const root = skel.bones.get(c.bones[0])!.world, tip = end();\n if (Math.abs((tip[0] - root.tx) * (ty - root.ty) - (tip[1] - root.ty) * (tx - root.tx)) < 1e-7 && Math.hypot(tx - root.tx, ty - root.ty) < Math.hypot(tip[0] - root.tx, tip[1] - root.ty) - tolerance) {\n skel.bones.get(last)!.rotation += cnum(skel, \"ik\", c.id, \"bendPositive\", c.bendPositive) > 0.5 ? 5 : -5;\n updateSubtree(skel, last);\n }\n for (let iter = 0; iter < (c.iterations ?? 100); iter++) {\n const e = end();\n if (Math.hypot(e[0] - tx, e[1] - ty) <= tolerance) break;\n for (let i = c.bones.length - 1; i >= 0; i--) {\n const id = c.bones[i], b = boneOf(skel.doc, id), st = skel.bones.get(id)!, w = st.world, e = end();\n const angle = wrapRad(Math.atan2(ty - w.ty, tx - w.tx) - Math.atan2(e[1] - w.ty, e[0] - w.tx));\n const cos = Math.cos(angle), sin = Math.sin(angle);\n setEffectiveWorld(skel, b, st, { ...w, a: cos * w.a - sin * w.b, b: sin * w.a + cos * w.b, c: cos * w.c - sin * w.d, d: sin * w.c + cos * w.d });\n }\n }\n if (mix < 1) {\n c.bones.forEach((id, i) => {\n const st = skel.bones.get(id)!, from = initial[i];\n for (const p of [\"rotation\", \"shearX\", \"shearY\"] as const) st[p] = from[p] + shortest(st[p] - from[p]) * mix;\n for (const p of [\"x\", \"y\", \"scaleX\", \"scaleY\"] as const) st[p] = from[p] + (st[p] - from[p]) * mix;\n });\n updateSubtree(skel, c.bones[0]);\n }\n}\n\n/**\n * IK constraint. One bone aims at the target. Two bones: the child is moved onto the parent's x axis and both are\n * rotated so the child's tip reaches the target, bending to the requested side. Solved in the parent's parent space:\n * the law of cosines when the parent's scale is uniform, otherwise the child's tip sweeps an ellipse (parent scale)\n * and the reachable point is solved analytically. Negative scales flip axes by 180\u00B0 and mirror the bend; the parent's\n * shear is dropped. Softness eases the last stretch before full extension; stretch lengthens the parent to reach.\n */\nfunction applyIk(skel: Skeleton, c: IkConstraint) {\n const mix = cnum(skel, \"ik\", c.id, \"mix\", c.mix);\n if (mix <= 0) return;\n const target = skel.bones.get(c.target)!.world;\n if (c.bones.length > 2) { applyLongIk(skel, c, target.tx, target.ty, mix); return; }\n const bendDir = cnum(skel, \"ik\", c.id, \"bendPositive\", c.bendPositive) > 0.5 ? 1 : -1;\n const compress = cnum(skel, \"ik\", c.id, \"compress\", c.compress) > 0.5, stretch = cnum(skel, \"ik\", c.id, \"stretch\", c.stretch) > 0.5;\n let softness = cnum(skel, \"ik\", c.id, \"softness\", c.softness);\n if (c.bones.length === 1) { aimAt(skel, c.bones[0], target.tx, target.ty, mix, compress, stretch, c.uniform); return; }\n const [pId, cId] = c.bones;\n const parentBone = boneOf(skel.doc, pId), childBone = boneOf(skel.doc, cId);\n const p = skel.bones.get(pId)!, ch = skel.bones.get(cId)!;\n const px = p.x, py = p.y;\n let psx = p.scaleX, psy = p.scaleY, csx = ch.scaleX, sx = psx, sy = psy;\n let os1 = 0, os2 = 0, s2 = 1;\n if (psx < 0) { psx = -psx; os1 = 180; s2 = -1; }\n if (psy < 0) { psy = -psy; s2 = -s2; }\n if (csx < 0) { csx = -csx; os2 = 180; }\n const uniform = Math.abs(psx - psy) <= 0.0001;\n const cx = ch.x, cy = !uniform || stretch ? 0 : ch.y;\n const [cwx, cwy] = apply(p.world, cx, cy);\n const ppInv = invert(parentBone.parent ? skel.bones.get(parentBone.parent)!.world : IDENTITY);\n const [clx, cly] = apply(ppInv, cwx, cwy);\n const dx = clx - px, dy = cly - py, l1 = Math.hypot(dx, dy);\n let l2 = childBone.length * csx;\n if (l1 < 0.0001) { // parent and child share an origin: aim the parent, the child keeps its offset\n aimAt(skel, pId, target.tx, target.ty, mix, false, stretch, false);\n ch.x = cx; ch.y = cy; ch.rotation = 0;\n updateSubtree(skel, pId);\n return;\n }\n const [tlx, tly] = apply(ppInv, target.tx, target.ty);\n let tx = tlx - px, ty = tly - py, dd = tx * tx + ty * ty;\n if (softness !== 0) {\n softness *= psx * (csx + 1) * 0.5;\n const td = Math.sqrt(dd), sd = td - l1 - l2 * psx + softness;\n if (sd > 0) {\n let q = Math.min(1, sd / (softness * 2)) - 1;\n q = (sd - softness * (1 - q * q)) / td;\n tx -= q * tx; ty -= q * ty; dd = tx * tx + ty * ty;\n }\n }\n let a1: number, a2: number;\n if (uniform) {\n l2 *= psx;\n let cos = (dd - l1 * l1 - l2 * l2) / (2 * l1 * l2);\n if (cos < -1) { cos = -1; a2 = Math.PI * bendDir; }\n else if (cos > 1) {\n cos = 1; a2 = 0;\n if (stretch) { const f = (Math.sqrt(dd) / (l1 + l2) - 1) * mix + 1; sx *= f; if (c.uniform) sy *= f; }\n } else a2 = Math.acos(cos) * bendDir;\n const a = l1 + l2 * cos, b = l2 * Math.sin(a2);\n a1 = Math.atan2(ty * a - tx * b, tx * a + ty * b);\n } else {\n // child tip on the ellipse (l1 + a\u00B7cos \u03B8, b\u00B7sin \u03B8): find the point at distance \u221Add, else the nearest extreme\n const a = psx * l2, b = psy * l2, aa = a * a, bb = b * b, ta = Math.atan2(ty, tx);\n const c0 = bb * l1 * l1 + aa * dd - aa * bb, c1 = -2 * bb * l1, c2 = bb - aa;\n const disc = c1 * c1 - 4 * c2 * c0;\n let solved = false;\n a1 = a2 = 0;\n if (disc >= 0) {\n let q = Math.sqrt(disc);\n if (c1 < 0) q = -q;\n q = -(c1 + q) * 0.5;\n const r0 = q / c2, r1 = c0 / q, r = Math.abs(r0) < Math.abs(r1) ? r0 : r1, yy = dd - r * r;\n if (yy >= 0) {\n const y = Math.sqrt(yy) * bendDir;\n a1 = ta - Math.atan2(y, r);\n a2 = Math.atan2(y / psy, (r - l1) / psx);\n solved = true;\n }\n }\n if (!solved) {\n let minAngle = Math.PI, minX = l1 - a, minDist = minX * minX, minY = 0, maxAngle = 0, maxX = l1 + a, maxDist = maxX * maxX, maxY = 0;\n const k = -a * l1 / (aa - bb);\n if (k >= -1 && k <= 1) {\n const ang = Math.acos(k), x = a * Math.cos(ang) + l1, y = b * Math.sin(ang), dist = x * x + y * y;\n if (dist < minDist) { minAngle = ang; minDist = dist; minX = x; minY = y; }\n if (dist > maxDist) { maxAngle = ang; maxDist = dist; maxX = x; maxY = y; }\n }\n if (dd <= (minDist + maxDist) * 0.5) { a1 = ta - Math.atan2(minY * bendDir, minX); a2 = minAngle * bendDir; }\n else { a1 = ta - Math.atan2(maxY * bendDir, maxX); a2 = maxAngle * bendDir; }\n }\n }\n const os = Math.atan2(cy, cx) * s2;\n const d1 = shortest((a1 - os) / DEG + os1 - p.rotation);\n const d2 = shortest(((a2 + os) / DEG - ch.shearX) * s2 + os2 - ch.rotation);\n p.rotation += d1 * mix; p.scaleX = sx; p.scaleY = sy; p.shearX = 0; p.shearY = 0;\n ch.x = cx; ch.y = cy; ch.rotation += d2 * mix;\n updateSubtree(skel, pId);\n}\n\n/**\n * Transform constraint: each bone follows the target's rotation / position / scale / shear by the mix amounts, with\n * the constraint's offsets. World mode edits the bone's world matrix (rotation turns the whole matrix, scales the\n * axis lengths, shear turns the y axis) and folds it back into effective locals; local mode mixes the effective\n * local values. `relative` adds the target's values instead of matching them.\n */\nfunction applyTransformConstraint(skel: Skeleton, c: TransformConstraint) {\n const mixRotate = cnum(skel, \"transform\", c.id, \"mixRotate\", c.mixRotate), mixX = cnum(skel, \"transform\", c.id, \"mixX\", c.mixX), mixY = cnum(skel, \"transform\", c.id, \"mixY\", c.mixY);\n const mixScaleX = cnum(skel, \"transform\", c.id, \"mixScaleX\", c.mixScaleX), mixScaleY = cnum(skel, \"transform\", c.id, \"mixScaleY\", c.mixScaleY), mixShearY = cnum(skel, \"transform\", c.id, \"mixShearY\", c.mixShearY);\n if (!mixRotate && !mixX && !mixY && !mixScaleX && !mixScaleY && !mixShearY) return;\n c = { ...c, ...Object.fromEntries([\"x\", \"y\", \"rotation\", \"scaleX\", \"scaleY\", \"shearY\"].map(p => [p, cnum(skel, \"transform\", c.id, p, c[p as \"x\"])])) };\n const target = skel.bones.get(c.target)!, tw = target.world;\n const offsetRotation = c.rotation * DEG, offsetShearY = c.shearY * DEG;\n for (const id of c.bones) {\n const b = boneOf(skel.doc, id), st = skel.bones.get(id)!;\n if (c.local) {\n if (c.relative) {\n st.rotation += (target.rotation + c.rotation) * mixRotate;\n st.x += (target.x + c.x) * mixX; st.y += (target.y + c.y) * mixY;\n st.scaleX *= (target.scaleX - 1 + c.scaleX) * mixScaleX + 1;\n st.scaleY *= (target.scaleY - 1 + c.scaleY) * mixScaleY + 1;\n st.shearY += (target.shearY + c.shearY) * mixShearY;\n } else {\n st.rotation += (target.rotation - st.rotation + c.rotation) * mixRotate;\n st.x += (target.x - st.x + c.x) * mixX; st.y += (target.y - st.y + c.y) * mixY;\n if (st.scaleX !== 0) st.scaleX += (target.scaleX - st.scaleX + c.scaleX) * mixScaleX;\n if (st.scaleY !== 0) st.scaleY += (target.scaleY - st.scaleY + c.scaleY) * mixScaleY;\n st.shearY += (target.shearY - st.shearY + c.shearY) * mixShearY;\n }\n updateSubtree(skel, id);\n continue;\n }\n let w: Affine = { ...st.world };\n const targetRot = Math.atan2(tw.b, tw.a), rotate = (m: Affine, r: number): Affine => {\n const cos = Math.cos(r), sin = Math.sin(r);\n return { a: cos * m.a - sin * m.b, b: sin * m.a + cos * m.b, c: cos * m.c - sin * m.d, d: sin * m.c + cos * m.d, tx: m.tx, ty: m.ty };\n };\n if (mixRotate !== 0) {\n const r = wrapRad(c.relative ? targetRot + offsetRotation : targetRot - Math.atan2(w.b, w.a) + offsetRotation);\n w = rotate(w, r * mixRotate);\n }\n if (mixX !== 0 || mixY !== 0) {\n const [ox, oy] = apply(tw, c.x, c.y); // the offset lives in the target's space\n if (c.relative) { w.tx += ox * mixX; w.ty += oy * mixY; }\n else { w.tx += (ox - w.tx) * mixX; w.ty += (oy - w.ty) * mixY; }\n }\n if (mixScaleX !== 0) {\n const ts = Math.hypot(tw.a, tw.b);\n let f: number;\n if (c.relative) f = (ts - 1 + c.scaleX) * mixScaleX + 1;\n else { const s0 = Math.hypot(w.a, w.b); f = s0 === 0 ? 1 : (s0 + (ts - s0 + c.scaleX) * mixScaleX) / s0; }\n w.a *= f; w.b *= f;\n }\n if (mixScaleY !== 0) {\n const ts = Math.hypot(tw.c, tw.d);\n let f: number;\n if (c.relative) f = (ts - 1 + c.scaleY) * mixScaleY + 1;\n else { const s0 = Math.hypot(w.c, w.d); f = s0 === 0 ? 1 : (s0 + (ts - s0 + c.scaleY) * mixScaleY) / s0; }\n w.c *= f; w.d *= f;\n }\n if (mixShearY > 0) {\n const by = Math.atan2(w.d, w.c), targetShear = Math.atan2(tw.d, tw.c) - targetRot;\n const r = c.relative\n ? by + (wrapRad(targetShear) - Math.PI / 2 + offsetShearY) * mixShearY\n : by + (wrapRad(targetShear - (by - Math.atan2(w.b, w.a))) + offsetShearY) * mixShearY;\n const len = Math.hypot(w.c, w.d);\n w.c = Math.cos(r) * len; w.d = Math.sin(r) * len;\n }\n setEffectiveWorld(skel, b, st, w);\n }\n}\n\n// ---------- paths ----------\n\n/** world-space control points of a path attachment (2 numbers per vertex) */\nexport function pathWorldVertices(skel: Skeleton, slotId: string, att: PathAttachment): number[] {\n return attachmentWorldVertices(skel, slotId, att);\n}\n\n/** path length: `lengths[i]` is the length up to the end of curve i; an open path stores one extra entry */\nexport function pathLength(vertexCount: number, closed: boolean, lengths: number[]): number {\n const curveCount = closed ? vertexCount / 3 : vertexCount / 3 - 1;\n return curveCount >= 1 && lengths.length >= curveCount ? lengths[curveCount - 1] : lengths[lengths.length - 1] ?? 1;\n}\n\n/**\n * Sample positions and tangents along a path made of cubic bezier curves through the attachment vertices\n * (vertex layout: [c_prev, p, c_next] triples; curve i runs p_i \u2192 c_next_i \u2192 c_prev_{i+1} \u2192 p_{i+1}).\n */\n/**\n * Points along a path attachment (document space). `positions` are absolute distances along the path (or fractions of\n * its length when `percent`). With `constantSpeed` the length of the posed curve is measured (4 chords per curve for\n * the total, 10 chords inside the curve that holds the position); otherwise the stored setup `lengths` and the raw\n * curve parameter are used. Closed paths wrap; positions beyond an open path continue along its end tangents.\n * `angle` is the tangent direction in degrees.\n */\nexport function samplePath(points: number[], closed: boolean, lengths: number[], constantSpeed: boolean, positions: number[], percent: boolean): { x: number; y: number; angle: number }[] {\n const n = points.length / 2;\n // anchors sit at indices 1, 4, 7, \u2026 (each vertex = [cPrev, p, cNext]); curve i runs from anchor i to anchor i + 1\n const curveCount = closed ? n / 3 : n / 3 - 1;\n if (curveCount < 1) return positions.map(() => ({ x: points[2] ?? 0, y: points[3] ?? 0, angle: 0 }));\n const curve = (i: number) => {\n const a = ((i * 3 + 1) % n) * 2, c1 = ((i * 3 + 2) % n) * 2, c2 = ((i * 3 + 3) % n) * 2, b = ((i * 3 + 4) % n) * 2;\n return [points[a], points[a + 1], points[c1], points[c1 + 1], points[c2], points[c2 + 1], points[b], points[b + 1]];\n };\n const pointAt = (i: number, t: number) => {\n const [x0, y0, x1, y1, x2, y2, x3, y3] = curve(i), u = 1 - t;\n return { x: u * u * u * x0 + 3 * u * u * t * x1 + 3 * u * t * t * x2 + t * t * t * x3, y: u * u * u * y0 + 3 * u * u * t * y1 + 3 * u * t * t * y2 + t * t * t * y3 };\n };\n const angleAt = (i: number, t: number) => {\n const [x0, y0, x1, y1, x2, y2, x3, y3] = curve(i), u = 1 - t;\n const dx = 3 * u * u * (x1 - x0) + 6 * u * t * (x2 - x1) + 3 * t * t * (x3 - x2);\n const dy = 3 * u * u * (y1 - y0) + 6 * u * t * (y2 - y1) + 3 * t * t * (y3 - y2);\n return Math.atan2(dy, dx) / DEG;\n };\n const chords = (i: number, count: number) => {\n const acc: number[] = []; let sum = 0, prev = pointAt(i, 0);\n for (let k = 1; k <= count; k++) { const q = pointAt(i, k / count); sum += Math.hypot(q.x - prev.x, q.y - prev.y); acc.push(sum); prev = q; }\n return acc;\n };\n const cum: number[] = [];\n if (constantSpeed) { let acc = 0; for (let i = 0; i < curveCount; i++) { acc += chords(i, 4)[3]; cum.push(acc); } }\n else for (let i = 0; i < curveCount; i++) cum.push(lengths[i] ?? (i ? cum[i - 1] : 0));\n const total = cum[curveCount - 1];\n const out: { x: number; y: number; angle: number }[] = [];\n for (let pos of positions) {\n if (percent) pos *= total;\n if (closed) {\n if (total > 0) { pos %= total; if (pos < 0) pos += total; } else pos = 0;\n } else if (pos < 0) { // before the start: continue the start tangent (anchor 0 towards its outgoing control)\n const r = Math.atan2(points[5] - points[3], points[4] - points[2]);\n out.push({ x: points[2] + pos * Math.cos(r), y: points[3] + pos * Math.sin(r), angle: r / DEG });\n continue;\n } else if (pos > total) { // after the end: continue the end tangent (incoming control towards the last anchor)\n const a = (curveCount * 3 + 1) * 2, c = curveCount * 3 * 2, e = pos - total;\n const r = Math.atan2(points[a + 1] - points[c + 1], points[a] - points[c]);\n out.push({ x: points[a] + e * Math.cos(r), y: points[a + 1] + e * Math.sin(r), angle: r / DEG });\n continue;\n }\n let i = 0;\n while (i < curveCount - 1 && pos > cum[i]) i++;\n const prev = i ? cum[i - 1] : 0, span = cum[i] - prev;\n const f = span > 0 ? (pos - prev) / span : 0;\n let t = f;\n if (constantSpeed) { // weight the parameter by chord lengths inside the curve\n const seg = chords(i, 10), target = f * seg[9];\n let k = 0;\n while (k < 9 && target > seg[k]) k++;\n const sPrev = k ? seg[k - 1] : 0, sSpan = seg[k] - sPrev;\n t = (k + (sSpan > 0 ? (target - sPrev) / sSpan : 0)) / 10;\n }\n out.push({ ...pointAt(i, t), angle: angleAt(i, t) });\n }\n return out;\n}\n\nconst PATH_EPSILON = 0.00001;\n\n/**\n * Path constraint: bones are laid along the target slot's path attachment (spacing modes: length = bone length +\n * spacing, fixed = spacing px, percent = fraction of the path per bone, proportional = the path shared by bone length),\n * translated with mixX/mixY and rotated with mixRotate (tangent = path direction, chain = towards the next bone,\n * chainScale = chain + scaled to reach it). Applied in world space, then folded back into the bones' effective locals.\n */\nfunction applyPathConstraint(skel: Skeleton, c: PathConstraint) {\n const mixRotate = cnum(skel, \"path\", c.id, \"mixRotate\", c.mixRotate), mixX = cnum(skel, \"path\", c.id, \"mixX\", c.mixX), mixY = cnum(skel, \"path\", c.id, \"mixY\", c.mixY);\n if (!mixRotate && !mixX && !mixY) return;\n const att = skel.attachment.get(c.target);\n if (!att || att.type !== \"path\") return;\n const points = pathWorldVertices(skel, c.target, att);\n const position = cnum(skel, \"path\", c.id, \"position\", c.position), spacing = cnum(skel, \"path\", c.id, \"spacing\", c.spacing);\n const tangents = c.rotateMode === \"tangent\", scale = c.rotateMode === \"chainScale\";\n const bones = c.bones.map(id => ({ b: boneOf(skel.doc, id), st: skel.bones.get(id)! }));\n const spacesCount = tangents ? bones.length : bones.length + 1;\n // spacing between consecutive bones; length-based modes scale with the bone's world x axis\n const spaces = new Array<number>(spacesCount).fill(0), worldLengths: number[] = [];\n let sum = 0;\n for (let i = 0; i < spacesCount - 1; i++) {\n const { b, st } = bones[i], setupLength = b.length;\n const len = setupLength < PATH_EPSILON ? 0 : setupLength * Math.hypot(st.world.a, st.world.b);\n worldLengths.push(len);\n if (c.spacingMode === \"percent\") spaces[i + 1] = spacing;\n else if (setupLength < PATH_EPSILON) spaces[i + 1] = spacing;\n else if (c.spacingMode === \"proportional\") { spaces[i + 1] = len; sum += len; }\n else spaces[i + 1] = (c.spacingMode === \"length\" ? setupLength + spacing : spacing) * len / setupLength;\n }\n if (c.spacingMode === \"proportional\" && sum > 0) { const f = spacesCount / sum * spacing; for (let i = 1; i < spacesCount; i++) spaces[i] *= f; }\n const total = measuredPathLength(points, att.closed, att.lengths, att.constantSpeed);\n const multiplier = c.spacingMode === \"percent\" ? total : c.spacingMode === \"proportional\" ? total / spacesCount : 1;\n let p = c.positionMode === \"percent\" ? position * total : position;\n const positions: number[] = [];\n for (let i = 0; i < spacesCount; i++) { p += spaces[i] * multiplier; positions.push(p); }\n const samples = samplePath(points, att.closed, att.lengths, att.constantSpeed, positions, false);\n // offset rotation follows the target bone's handedness; chain mode without an offset links bones tip to tail\n const tip = c.rotation === 0 && c.rotateMode === \"chain\";\n let offsetRotation = c.rotation * DEG;\n if (c.rotation !== 0) {\n const slot = skel.doc.slots.find(sl => sl.id === c.target)!, tw = skel.bones.get(slot.bone)!.world;\n if (tw.a * tw.d - tw.b * tw.c < 0) offsetRotation = -offsetRotation;\n }\n let boneX = samples[0].x, boneY = samples[0].y;\n for (let i = 0; i < bones.length; i++) {\n const { b, st } = bones[i];\n let w: Affine = { ...st.world };\n w.tx += (boneX - w.tx) * mixX;\n w.ty += (boneY - w.ty) * mixY;\n const next = samples[i + 1] ?? { x: 0, y: 0, angle: 0 };\n const dx = next.x - boneX, dy = next.y - boneY;\n if (scale) {\n const len = worldLengths[i];\n if (len !== 0) { const f = (Math.hypot(dx, dy) / len - 1) * mixRotate + 1; w.a *= f; w.b *= f; }\n }\n boneX = next.x; boneY = next.y;\n if (mixRotate > 0) {\n const { a, b: bb, c: cc, d } = w;\n let r = (tangents ? samples[i].angle : spaces[i + 1] === 0 ? next.angle : Math.atan2(dy, dx) / DEG) * DEG;\n r -= Math.atan2(bb, a);\n if (tip) {\n const cos = Math.cos(r), sin = Math.sin(r), length = b.length;\n boneX += (length * (cos * a - sin * bb) - dx) * mixRotate;\n boneY += (length * (sin * a + cos * bb) - dy) * mixRotate;\n } else r += offsetRotation;\n if (r > Math.PI) r -= 2 * Math.PI; else if (r < -Math.PI) r += 2 * Math.PI;\n r *= mixRotate;\n const cos = Math.cos(r), sin = Math.sin(r);\n w = { a: cos * a - sin * bb, b: sin * a + cos * bb, c: cos * cc - sin * d, d: sin * cc + cos * d, tx: w.tx, ty: w.ty };\n }\n setEffectiveWorld(skel, b, st, w);\n }\n}\n\n/** total length used for percent positions/spacing: measured on the posed curve (constant speed) or the stored setup lengths */\nfunction measuredPathLength(points: number[], closed: boolean, lengths: number[], constantSpeed: boolean): number {\n const n = points.length / 2, curveCount = closed ? n / 3 : n / 3 - 1;\n if (curveCount < 1) return 0;\n if (!constantSpeed) return pathLength(n, closed, lengths);\n let total = 0;\n for (let i = 0; i < curveCount; i++) {\n const a = ((i * 3 + 1) % n) * 2, c1 = ((i * 3 + 2) % n) * 2, c2 = ((i * 3 + 3) % n) * 2, b = ((i * 3 + 4) % n) * 2;\n let px = points[a], py = points[a + 1];\n for (let k = 1; k <= 4; k++) {\n const t = k / 4, u = 1 - t;\n const x = u * u * u * points[a] + 3 * u * u * t * points[c1] + 3 * u * t * t * points[c2] + t * t * t * points[b];\n const y = u * u * u * points[a + 1] + 3 * u * u * t * points[c1 + 1] + 3 * u * t * t * points[c2 + 1] + t * t * t * points[b + 1];\n total += Math.hypot(x - px, y - py); px = x; py = y;\n }\n }\n return total;\n}\n\n/** the parent's linear part a bone actually inherits under its `inherit` mode */\nfunction inheritedParentLinear(bone: Bone, parent: Affine): Affine {\n switch (bone.inherit) {\n case \"normal\": return { ...parent, tx: 0, ty: 0 };\n case \"onlyTranslation\": return { a: 1, b: 0, c: 0, d: 1, tx: 0, ty: 0 };\n case \"noRotationOrReflection\": {\n // scale along the parent's axes without its rotation; keeps the parent's area scale, drops reflection\n const lenX = Math.hypot(parent.a, parent.b) || 1;\n const det = parent.a * parent.d - parent.b * parent.c;\n return { a: lenX, b: 0, c: 0, d: Math.abs(det) / lenX, tx: 0, ty: 0 };\n }\n case \"noScale\": case \"noScaleOrReflection\": {\n const lenX = Math.hypot(parent.a, parent.b) || 1;\n const ua = parent.a / lenX, ub = parent.b / lenX;\n const det = parent.a * parent.d - parent.b * parent.c;\n const reflect = det < 0 && bone.inherit === \"noScale\" ? -1 : 1; // noScale keeps the parent's reflection\n return { a: ua, b: ub, c: -ub * reflect, d: ua * reflect, tx: 0, ty: 0 };\n }\n }\n}\n\n/** Give a bone the world transform `world`: its effective locals are decomposed relative to the parent (shearX folds into rotation), descendants follow. */\nfunction setEffectiveWorld(skel: Skeleton, bone: Bone, st: BoneState, world: Affine) {\n const parent = bone.parent ? skel.bones.get(bone.parent)!.world : undefined;\n let lin: Affine = world, tx = world.tx, ty = world.ty;\n if (parent) {\n [tx, ty] = apply(invert(parent), world.tx, world.ty);\n lin = mul(invert(inheritedParentLinear(bone, parent)), { ...world, tx: 0, ty: 0 });\n }\n st.x = tx; st.y = ty;\n st.rotation = Math.atan2(lin.b, lin.a) / DEG;\n st.scaleX = Math.hypot(lin.a, lin.b);\n st.scaleY = Math.hypot(lin.c, lin.d);\n st.shearX = 0;\n st.shearY = shortest(Math.atan2(lin.d, lin.c) / DEG - st.rotation - 90);\n updateSubtree(skel, bone.id);\n}\n\n// ---------- attachment geometry ----------\n\n/** skinned or bone-local vertices of a mesh/path attachment in document space, deform offsets applied */\nexport function attachmentWorldVertices(skel: Skeleton, slotId: string, att: MeshAttachment | PathAttachment): number[] {\n const deform = skel.pose.get(pk(\"deform\", att.id, \"vertices\"));\n const off = Array.isArray(deform) && typeof deform[0] === \"number\" ? (deform as number[]) : undefined;\n const out: number[] = [];\n if (att.weights) {\n let k = 0;\n for (const list of att.weights) {\n let x = 0, y = 0;\n for (const inf of list) {\n const w = skel.bones.get(inf.bone)!.world;\n const vx = inf.x + (off ? off[k] : 0), vy = inf.y + (off ? off[k + 1] : 0);\n k += 2;\n x += (w.a * vx + w.c * vy + w.tx) * inf.w; y += (w.b * vx + w.d * vy + w.ty) * inf.w;\n }\n out.push(x, y);\n }\n } else {\n const slot = skel.doc.slots.find(s => s.id === slotId)!, w = skel.bones.get(slot.bone)!.world, v = att.vertices!;\n for (let i = 0; i < v.length; i += 2) {\n const vx = v[i] + (off ? off[i] : 0), vy = v[i + 1] + (off ? off[i + 1] : 0);\n out.push(w.a * vx + w.c * vy + w.tx, w.b * vx + w.d * vy + w.ty);\n }\n }\n return out;\n}\n\n/** image-local (centre-relative) \u2192 document matrix for a region attachment */\nexport function regionMatrix(skel: Skeleton, slotId: string, att: RegionAttachment): Affine {\n const slot = skel.doc.slots.find(s => s.id === slotId)!;\n return mul(skel.bones.get(slot.bone)!.world, affineOf(att.x, att.y, att.rotation, att.scaleX, att.scaleY));\n}\n\nexport function regionSize(doc: RigDocument, att: RegionAttachment): [number, number] {\n const asset = doc.assets.find(a => a.id === att.asset)!;\n return [att.width ?? asset.width, att.height ?? asset.height];\n}\n\n/**\n * Outline of a slot's shown attachment in document space: region \u2192 `samplesPerEdge` points per edge clockwise\n * from the top-left (lattice deform applied), mesh \u2192 hull vertices (or all), path/hidden \u2192 undefined.\n */\nexport function slotOutline(doc: RigDocument, pose: Pose, slotId: string, samplesPerEdge = 1, skel = evaluate(doc, pose)): [number, number][] | undefined {\n if (!doc.slots.some(s => s.id === slotId)) throw new Error(`unknown slot \"${slotId}\"`);\n const att = skel.attachment.get(slotId);\n if (!att) return undefined;\n if (att.type === \"mesh\") {\n const v = attachmentWorldVertices(skel, slotId, att), n = att.hull > 0 ? att.hull : v.length / 2;\n const pts: [number, number][] = [];\n for (let i = 0; i < n; i++) pts.push([v[i * 2], v[i * 2 + 1]]);\n return pts;\n }\n if (att.type === \"path\") return undefined;\n const [w, h] = regionSize(doc, att), m = regionMatrix(skel, slotId, att), pivot: Pivot = { x: 0.5, y: 0.5 };\n const params = deformParams(pose, att.id);\n const offsets = params ? controlOffsets(params, w, h, pivot) : undefined;\n const pts: [number, number][] = [];\n const push = (u: number, v: number) => {\n const [ox, oy] = offsets ? evalPatch(offsets, u, v) : [0, 0];\n pts.push(apply(m, (u - 0.5) * w + ox, (v - 0.5) * h + oy));\n };\n const n = Math.max(1, samplesPerEdge);\n for (let i = 0; i < n; i++) push(i / n, 0);\n for (let i = 0; i < n; i++) push(1, i / n);\n for (let i = 0; i < n; i++) push(1 - i / n, 1);\n for (let i = 0; i < n; i++) push(0, 1 - i / n);\n return pts;\n}\n", "/**\n * rig-state \u2014 animation state machine over a pose sink (RigPlayer, or anything with `setPose`).\n *\n * - base: the looping default (`idle`); shown whenever nothing else is active. A non-looping base holds its end pose.\n * - main: one-shot (or forced loop) requests with priorities and a FIFO queue. Equal/higher priority interrupts,\n * lower priority queues (or is dropped). After completion \u2192 next queued, else base, else hold the last pose.\n * - overlays: named independent loops whose keys override the shown pose (blink, mouth). Non-looping overlays\n * remove themselves when done.\n * - crossfade: numbers blend from the last composed pose; discrete keys (attachment) hold until the mix ends.\n * Every `play` promise resolves \u2014 a game can `await` it without risk of hanging.\n */\nimport type { RigDocument, Animation } from \"./rig-format\";\nimport { poseOf, blendPoses, restValue, type Pose } from \"./rig-anim\";\n\nexport interface PoseSink { doc: RigDocument; setPose(pose: Pose): void }\nexport type PlayResult = \"completed\" | \"interrupted\" | \"dropped\" | \"stopped\";\nexport interface PlayOptions {\n /** default 0; a request interrupts the current one when its priority is >= */\n priority?: number;\n /** default: the animation's own `loop` */\n loop?: boolean;\n /** crossfade seconds from the current pose; default: the state's `mix` */\n mix?: number;\n /** what to do when a higher-priority animation is playing (default \"queue\") */\n ifBusy?: \"queue\" | \"drop\" | \"interrupt\";\n /** synchronous callback, in addition to the returned promise */\n onComplete?: (result: PlayResult) => void;\n}\n\ninterface Channel {\n anim: Animation; time: number; loop: boolean; done: boolean; priority: number;\n /** first advance fires t=0 events */\n fresh: boolean;\n settle?: (r: PlayResult) => void;\n}\n\nexport class AnimationState {\n onEvent?: (name: string, payload?: Record<string, unknown>) => void;\n private base?: Channel;\n private main?: Channel;\n private queue: Channel[] = [];\n private overlays = new Map<string, Channel>();\n /** last composed pose without overlays \u2014 mix snapshots start here */\n private pose: Pose = new Map();\n private from?: Pose;\n private mixLeft = 0;\n private mixTotal = 0;\n /** a mix begun in this update shows weight 0 for the frame it starts on */\n private mixFresh = false;\n private readonly defaultMix: number;\n\n constructor(private readonly sink: PoseSink, private readonly opts: { mix?: number; missingAnimation?: \"warn\" | \"throw\"; onWarning?: (message: string) => void } = {}) {\n this.defaultMix = opts.mix ?? 0;\n }\n\n /** id of the animation currently shown (main, else base) */\n get current(): string | undefined { return (this.main ?? this.base)?.anim.id; }\n get baseId(): string | undefined { return this.base?.anim.id; }\n\n private channel(id: string, loop?: boolean, priority = 0): Channel | undefined {\n const anim = this.sink.doc.animations.find(a => a.id === id);\n if (!anim) {\n const message = `unknown animation \"${id}\"; available: ${this.sink.doc.animations.map(a => a.id).join(\", \")}`;\n if (this.opts.missingAnimation === \"throw\") throw new Error(message);\n (this.opts.onWarning ?? console.warn)(message);\n return undefined;\n }\n return { anim, time: 0, loop: loop ?? anim.loop, done: false, priority, fresh: true };\n }\n\n setBase(id?: string, opts: { mix?: number } = {}) {\n const next = id === undefined ? undefined : this.channel(id);\n if (id !== undefined && !next) return;\n this.base = next;\n if (!this.main || this.main.done) { this.main = undefined; this.beginMix(opts.mix); this.update(0); }\n }\n\n play(id: string, opts: PlayOptions = {}): Promise<PlayResult> {\n const ch = this.channel(id, opts.loop, opts.priority ?? 0);\n if (!ch) {\n this.main?.settle?.(\"interrupted\");\n for (const queued of this.queue) queued.settle?.(\"dropped\");\n this.main = undefined; this.queue = [];\n this.beginMix(opts.mix); this.update(0);\n opts.onComplete?.(\"dropped\");\n return Promise.resolve(\"dropped\");\n }\n const promise = new Promise<PlayResult>(resolve => {\n ch.settle = r => { ch.settle = undefined; opts.onComplete?.(r); resolve(r); };\n });\n const cur = this.main, busy = cur !== undefined && !cur.done, mode = opts.ifBusy ?? \"queue\";\n if (!busy || mode === \"interrupt\" || ch.priority >= cur.priority) {\n if (busy) cur.settle?.(\"interrupted\");\n this.main = ch;\n this.beginMix(opts.mix);\n this.update(0);\n } else if (mode === \"drop\") ch.settle!(\"dropped\");\n else this.queue.push(ch);\n return promise;\n }\n\n /** Independent loop on top of the shown pose; `undefined` removes it. */\n setOverlay(name: string, id?: string) {\n if (id === undefined) this.overlays.delete(name);\n else { const ch = this.channel(id); if (ch) this.overlays.set(name, ch); }\n }\n\n /** Clear everything and show the setup pose. Pending plays resolve as \"stopped\". */\n stop() {\n this.main?.settle?.(\"stopped\");\n for (const ch of this.queue) ch.settle?.(\"stopped\");\n this.main = this.base = undefined; this.queue = []; this.overlays.clear();\n this.from = undefined; this.mixLeft = this.mixTotal = 0; this.mixFresh = false;\n this.pose = new Map();\n this.sink.setPose(new Map());\n }\n\n update(dt: number) {\n if (this.base) this.advance(this.base, dt, this.main === undefined);\n if (this.main) {\n const wasDone = this.main.done;\n this.advance(this.main, dt, true);\n if (this.main.done && !wasDone) {\n this.main.settle?.(\"completed\");\n const next = this.queue.shift();\n if (next || this.base) { this.main = next; this.beginMix(); }\n // else: hold the finished pose until something else is requested\n }\n }\n const shown = this.main ?? this.base;\n let pose: Pose = shown ? poseOf(shown.anim, shown.time) : new Map();\n if (this.from) {\n if (!this.mixFresh) this.mixLeft = Math.max(0, this.mixLeft - dt);\n this.mixFresh = false;\n const w = this.mixTotal > 0 ? 1 - this.mixLeft / this.mixTotal : 1;\n pose = blendPoses(this.from, pose, w, k => restValue(this.sink.doc, k));\n if (this.mixLeft === 0) this.from = undefined;\n }\n this.pose = pose;\n if (this.overlays.size) {\n pose = new Map(pose);\n for (const [name, ov] of this.overlays) {\n this.advance(ov, dt, false);\n poseOf(ov.anim, ov.time, pose);\n if (ov.done) this.overlays.delete(name);\n }\n }\n this.sink.setPose(pose);\n }\n\n private beginMix(mix = this.defaultMix) {\n if (mix > 0) { this.from = new Map(this.pose); this.mixLeft = this.mixTotal = mix; this.mixFresh = true; }\n else { this.from = undefined; this.mixLeft = this.mixTotal = 0; this.mixFresh = false; }\n }\n\n private advance(ch: Channel, dt: number, emit: boolean) {\n if (ch.done) return;\n const prev = ch.fresh ? -1 : ch.time, d = ch.anim.duration;\n ch.fresh = false;\n ch.time += dt;\n if (emit) for (const e of ch.anim.events) if (hit(e.t, prev, ch.time, d, ch.loop)) this.onEvent?.(e.name, e.payload);\n if (ch.time >= d) {\n if (ch.loop) ch.time %= d;\n else { ch.time = d; ch.done = true; }\n }\n }\n}\n\n/** event time t is crossed in (prev, cur]; for loops also across the wrap */\nfunction hit(t: number, prev: number, cur: number, d: number, loop: boolean) {\n if (cur < d || !loop) return t > prev && t <= cur;\n return (t > prev && t <= d) || t <= cur % d;\n}\n", "/**\n * rig-symbol \u2014 a rig as a slot symbol view for @energy8platform/game-engine (SymbolView, engine \u2265 0.43: square or rectangular cells).\n *\n * The interface is copied structurally (playIdle / playWin / showStatic / resize) so this package does not\n * depend on the engine. Centred at the origin and scaled so the rig canvas fits the cell, like AnimatedSymbol.\n * `setDim(on)` is an extra for non-winning symbols. Updated through a ticker (Ticker.shared by default).\n */\nimport { Container, Ticker, type Texture } from \"pixi.js\";\nimport { RigPlayer } from \"./rig-runtime\";\nimport type { RigDocument } from \"./rig-format\";\n\nexport interface TickerLike {\n add(fn: (t: { deltaMS: number }) => void): unknown;\n remove(fn: (t: { deltaMS: number }) => void): unknown;\n}\n\n/** a square cell (px) or a rectangular one, as the engine's SymbolView.resize takes */\nexport type SymbolSize = number | { width: number; height: number };\n\nexport interface RigSymbolOptions {\n /** cell size in px: a number scales the larger canvas side to it, a rectangle fits the canvas inside it */\n size: SymbolSize;\n /** animation ids to use; missing ones are skipped gracefully */\n animations?: { idle?: string; win?: string; dim?: string };\n /** crossfade seconds between states (default 0.15) */\n mix?: number;\n ticker?: TickerLike;\n}\n\n/** structural copy of the engine's SymbolView */\nexport interface SymbolViewLike extends Container {\n playIdle?(): void;\n playWin?(): Promise<void>;\n showStatic?(): void;\n resize?(size: SymbolSize): void;\n}\n\nexport class RigSymbol extends Container implements SymbolViewLike {\n readonly player: RigPlayer;\n private readonly names: Required<NonNullable<RigSymbolOptions[\"animations\"]>>;\n private readonly ticker: TickerLike;\n private readonly onTick = (t: { deltaMS: number }) => this.player.tick(t.deltaMS / 1000);\n\n constructor(readonly doc: RigDocument, textures: Map<string, Texture>, opts: RigSymbolOptions) {\n super();\n this.player = new RigPlayer(doc, textures, { mix: opts.mix ?? 0.15 });\n this.names = { idle: \"idle\", win: \"win\", dim: \"dim\", ...opts.animations };\n this.ticker = opts.ticker ?? Ticker.shared;\n this.addChild(this.player.view);\n this.resize(opts.size);\n this.ticker.add(this.onTick);\n }\n\n private has(id: string) { return this.doc.animations.some(a => a.id === id); }\n\n resize(size: SymbolSize) {\n const { width, height } = this.doc.meta;\n const s = typeof size === \"number\" ? size / Math.max(width, height) : Math.min(size.width / width, size.height / height);\n this.player.view.scale.set(s);\n this.player.view.position.set(-width * s / 2, -height * s / 2);\n }\n\n playIdle() {\n if (this.has(this.names.idle)) this.player.state.setBase(this.names.idle);\n else this.showStatic();\n }\n\n /** resolves when the win animation completes (or immediately if there is none / it was replaced) */\n async playWin(): Promise<void> {\n if (!this.has(this.names.win)) return;\n await this.player.state.play(this.names.win, { priority: 1 });\n }\n\n showStatic() { this.player.stop(); }\n\n /** dim as a held base pose (non-winning symbol); off \u2192 back to idle */\n setDim(on: boolean) {\n if (on && this.has(this.names.dim)) this.player.state.setBase(this.names.dim);\n else this.playIdle();\n }\n\n destroy(options?: Parameters<Container[\"destroy\"]>[0]) {\n this.ticker.remove(this.onTick);\n super.destroy(options);\n }\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["DEG", "s", "c", "b", "DEG", "e", "cos", "sin", "DEG", "Container", "Container"]
|
|
7
7
|
}
|