Repository navigation
Design skeleton
github-actions[bot] edited this page Aug 5, 2026
·
1 revision
Status: agreed design, not yet implemented (character sheets — the prerequisite — shipped as M5a). This is deliberately not Spine/Toon Boom puppet animation: the output of every pose is an ordinary drawn keyframe on the timeline, keeping the frame-by-frame feel. Bones exist to draft the next frame, and AI keeps the character complete and on-model where the pose reveals things that were never drawn.
Side-view run cycle. The character is drawn once; the near arm covers part of the torso. The animator swings the arm forward with a bone:
- The arm's strokes move rigidly with the bone — the artist's own lines, re-posed, as the draft of the next frame.
- The torso region the arm used to cover is now blank, and part of the character's back has rotated into view that never existed in any frame.
- The AI is asked to fill exactly those regions with strokes, using the document's character sheet (front/side views) as the authoritative design.
- The result is committed as a normal keyed frame the artist keeps drawing on. Nothing about playback, inbetweening, or export changes.
Per-layer rig, serialized in the document like everything else:
-
Rig mode in the tool bar: draw bones (click joint, drag tip; a bone
started on another bone's tip becomes its child), then draw closed spline
regions to cut parts. Strokes are assigned by containment; a stroke crossing
a region boundary is split at the intersection so each side belongs to its
own part (
GeometryOpsgains point-in-polygon and segment–polygon intersection). - A part with no region binds a whole layer — the trivial pre-separated case.
-
Partis the extension point for the later mesh/spline deformation feature: a lattice per part can replace the rigid transform without touching bones, bindings, or the AI contract.
- Pose mode on a keyed frame: dragging a bone rotates it (and its children)
around its joint; each bound part's strokes get the same rigid transform,
rendered in
zOrder. - Commit pose creates a new keyed frame whose stroke record is the transformed copy (role: key). It is a draft: the artist draws over it with the normal tools.
- No automatic pose tweening — the deterministic stroke inbetweener stays the interpolation between drawn frames. (Pose-aware inbetweening can be added later as an option once poses exist on keys.)
- After a pose, exposed regions = (previous cover of the moved parts) minus (their new cover), via polygon difference on the part regions; coarse convex hulls are enough — the AI needs a where, not a pixel mask. The same computation naturally captures body areas newly revealed to the observer (the run-cycle back: the torso region no longer covered by the arm).
- Request to the artist (API or MCP): posed frame render + gap hull(s) +
character-sheet views (
ReferenceImages, shipped in M5a) + the strokes neighbouring each gap. Response: strokes in the existing wire format, inserted through the existing validated, undoable path, and tagged with the covering part id so subsequent poses carry them along. - One button in the UI: “Pose → fill gaps”. Deterministic fallback when no AI is configured: borrow and rigidly fit strokes from the matching part of a reference view.
-
Mesh/spline deformation per part (bend a limb instead of rotating it) —
builds on
Partwithout changing the rest. - Pose-guide mode: skeleton-only keys; the AI draws complete frames from the stick figure + character sheet.
- Getting started
- Documents and projects
- Tools and strokes
- Brushes
- Colour
- Layers, selections and guides
- The timeline
- Onion skin, references and the camera
- Symbols
- Saving and recovery
- Exporting to a game engine
- AI assistance
- Keyboard, performance and what is planned
- Bones and rigging
- Effects — fire, smoke and water
- A simplified 3D space to draw in: planes, parallax first, orbit second
- Brush performance beyond 4k: what the GPU can and cannot buy us
- The add-on boundary
- Making the AI trustworthy
- What an AI request actually costs
- Bones and spline deformers for 2D — design
- Brush tips — a generated library, not a live calculation
- Cloud and SaaS: what the architecture already fits, and what it does not
- Colour mixing — paint that picks up what it is laid on
- DESIGN: Effects
- DESIGN: Fluid effects — fire, smoke and water as drawn line and fill
- Fluid and viscous media — notes for the next brush-engine pass
- Compositing on the GPU
- Decomposing the two big files: which pieces come out, and with which tool
- One memory limit for pictures
- .NET 10: what is safe, what is unverified, and what it narrows
- One picture cache: the paused canvas on tiles
- The paint path: one mark, made once, under the pen
- Pen dynamics: tilt and speed
- A pencil is graphite on the paper's tooth
- Performance: the ratchet and the map
- Playback's first loop
- Pressure curves — a shape, not an exponent
- Importing Procreate brushes
- A project as a game's asset set
- One hierarchy: folders scope everything
- Puppet pins — design and plan
- The raster checkpoint: making a painting cheap to reopen
- Scoped resources — palettes, references and everything else shared
- Sensitive topics, and the three-track flow
- Design: pose-assisted frame-by-frame animation (rigid bones + AI gap filling)
- Stroke groups: why a merge should never turn strokes into pixels
- The project window: what you do between drawings
- Reading the subject before drawing on it
- The ceiling of a swept soft mark (B349)
- Q171 — a symbol owns a layer stack
- Pillar 3 — reusable assets, as live symbols
- What a template is
- Text, and where fonts sit
- The tiled compositor, and getting it off the CPU
- Design tokens
- Transform tool design (M14)
- Why a brush stamps twice, and when it does not
- Migrating to the designed UI
- Undo stores only what changed
- Vector tooling: making the lines you already drew editable
- The smudge/blur family, and aligning brush settings with Photoshop
Generated from the repository. Edit the files under docs/, not these pages.