From f95eface83f816c372359a9c952bfb374bc6fc5f Mon Sep 17 00:00:00 2001 From: bflatastic Date: Sun, 4 Oct 2026 01:10:36 +0700 Subject: [PATCH] =?UTF-8?q?M13.20:=20docs=20=E2=80=94=20README=20(Timeline?= =?UTF-8?q?=20shortcuts=20and=20Puppet=20tools),=20control=20protocol=20(r?= =?UTF-8?q?eveal=20/=20keyAt=20/=20twirlSelected=20UI=20commands,=20timeli?= =?UTF-8?q?ne.layer..row=20and=20viewer.puppetPin.=20element=20id?= =?UTF-8?q?s),=20agents=20guide=20(Timeline:=20layer.arrange=20above,=20re?= =?UTF-8?q?veal=20shortcuts,=20keys.toggleTransform,=20rename),=20architec?= =?UTF-8?q?ture=20(puppet=20selection,=20rigging=20and=20follow-through;?= =?UTF-8?q?=20per-thread=20expression=20context=20recovery),=20parity=20(M?= =?UTF-8?q?13.17=E2=80=93M13.20)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 7 +++++++ docs/agents.md | 18 ++++++++++++++++++ docs/architecture.md | 9 +++++++-- docs/control-protocol.md | 8 +++++--- docs/parity.md | 2 +- 5 files changed, 38 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index 3a9cabbc..fc809483 100644 --- a/README.md +++ b/README.md @@ -101,6 +101,13 @@ Paragraph, Align, Info, Preview, Audio and the Render Queue, docked the way you text animators with range selectors. - **Expressions:** JavaScript with the After Effects object model (`wiggle`, `loopOut`, `thisComp.layer("…")`, vector maths on arrays), an inline editor and the pick-whip. +- **Timeline like you know it:** twirl layers open to Transform, masks, effects and the rest; drag + rows to reorder layers; rename with Enter or a double-click; the property shortcuts (A, P, S, + R, T, M, F, E, L, U and their double presses AA, PP, SS, RR, TT, MM, FF, EE, LL, UU), Shift to + add properties, Alt+Shift+A/P/S/R/T to key the current time, Ctrl+` to twirl selected layers. +- **Puppet tools:** Position, Advanced, Bend, Starch and Overlap pins on a mesh built from the + layer, real-time pin recording, rotate/scale handles, pins driven by (or carrying) nulls for + rigging, and follow-through for hair and cloth.

The Graph Editor showing an eased value curve for a text animator's Range Start, with the graph editor's button bar for hold, linear, auto Bezier and Easy Ease diff --git a/docs/agents.md b/docs/agents.md index 634811de..2c9c586a 100644 --- a/docs/agents.md +++ b/docs/agents.md @@ -287,6 +287,24 @@ A dialog's `show()` waits for the user: the `script.run` / `file.runScript` repl that closes the dialog). File ▸ Scripts: `file.scripts.list`, `file.runScript {"name": …}`, `file.installScript` / `file.installScriptUIPanel {"path": …}`, `window.scriptPanel {"name": …}`. +### Timeline: layer order, properties and shortcuts + +* `layer.arrange {"layers": [...], "above": "Layer Name"}` moves layers to just above another + one (what dragging Timeline rows does: the selected layers move together, one undo step); + `to: front|forward|backward|back` and `index` still work. +* The reveal shortcuts are UI commands (`ui.menu.invoke` or the keys themselves): A Anchor Point, + P Position, S Scale, R Rotation, T Opacity, M Mask Path, F Mask Feather, E Effects, L Audio + Levels, U keyframed properties; pressed twice quickly AA Material Options, PP paint / Roto + Brush / Puppet, SS selected properties, RR Time Remap, TT Mask Opacity, MM all mask + properties, FF missing effects, EE Expressions, LL Waveform, UU everything changed from its + default. Shift+key adds or removes a set; the same key again hides it; Ctrl/Cmd+` twirls the + selected layers open or closed. With no layer selected they apply to every layer. +* `keys.toggleTransform {"layers"?: [...], "prop": "position"}` (Alt+Shift+A/P/S/R/T) adds or + removes a keyframe at the current time on that Transform property of each layer, in one undo + step (separated X/Y/Z Position; Orientation and X/Y/Z Rotation on 3D layers). +* Rename a layer with Enter (or double-click a name): the whole name is selected, Enter or a + click elsewhere commits, Escape cancels; `layer.rename {layer, name}` does it directly. + ### History, puppet recording, plug-ins * `edit.history.list` lists every undo state as a tree (undoing then editing keeps the undone diff --git a/docs/architecture.md b/docs/architecture.md index b53b059d..c37511dc 100644 --- a/docs/architecture.md +++ b/docs/architecture.md @@ -152,7 +152,10 @@ strokes rasterize as brush-tip dabs and composite in order, and the layer cache strokes are visible at the frame. Puppet (`effects::puppet`) holds meshes and pins: the mesh is traced from the input alpha, expanded, and triangulated (Delaunay + constraint recovery, cached by content); pins drive an as-rigid-as-possible solve (Igarashi et al. 2005) each frame and the -input is texture-mapped through the deformed triangles. The renderer flattens nested effect +input is texture-mapped through the deformed triangles. Pins are selected like properties +(`puppet.selectPins`, marquee, Select All by kind) and rigged with expressions: Points Follow +Nulls / Nulls Follow Points take pins as well as paths, and `puppet.follow` gives follower pins a +Position expression that trails the leader by a delay. The renderer flattens nested effect groups into `Params` keys (`effects::flatten_params`). Commands: `paint.*`, `puppet.*`. Half, Third and Quarter resolution render proportionally fewer pixels end to end. @@ -375,7 +378,9 @@ text, disables the expression and shows a warning, like After Effects. `sampleIm sampled layer through the evaluating renderer's footage source (`EvalCtx::footage`), cached per thread and frame; `footage(name)` reads data footage (JSON, CSV, TSV imported with File ▸ Import, text kept in the project) through `sourceData`, `sourceText` and `dataValue`. `expr.errors` -lists failing expressions for the viewer's error bar. +lists failing expressions for the viewer's error bar. Each thread keeps one boa context; boa +leaves values on its stack whenever an exception unwinds through call frames (every pending +host request does), so a run that hits the stack limit gets a fresh context and is retried once. ## 5a. Scripting diff --git a/docs/control-protocol.md b/docs/control-protocol.md index 7763ee03..f70bf3f3 100644 --- a/docs/control-protocol.md +++ b/docs/control-protocol.md @@ -27,7 +27,7 @@ printf '{"id":1,"method":"engine.execute","params":{"command":"comp.new","params |---|---|---| | `engine.execute` | `{command, params?}` | The command's result. Every engine command (`effectcraft-cli commands`) runs exactly as it does headless, so it never opens a dialog: `comp.new {}` creates a default comp. UI-only ids (`tool.*`, `view.*`, `window.*`, `playback.*`, `timeline.*`, `app.*`) fall through to the menu dispatcher. Unknown top-level params are rejected, and the error lists the accepted keys. | | `ui.menu.invoke` | `{id, params?}` | Like a menu click: commands with empty params may open their dialog (New Composition, Solid Settings, file pickers). | -| UI commands (via either) | | `timeline.column {column, visible?}` (av, keys, label, num, comment, switches, modes, parent, in, out, duration, stretch), `timeline.sourceName {value?}`, `timeline.search {query}`, `timeline.revealAdd.`, `flowchart.options {layers?, effects?, solids?, direction?: lr\|tb, comp?}`, `flowchart.graph {comp?}` → `{nodes, edges}`, `window.workspace {name}` (all After Effects workspaces). | +| UI commands (via either) | | `timeline.column {column, visible?}` (av, keys, label, num, comment, switches, modes, parent, in, out, duration, stretch), `timeline.sourceName {value?}`, `timeline.search {query}`, `timeline.reveal.` / `timeline.revealAdd.` (the property shortcuts and Shift+shortcut: position, scale, rotation, opacity, anchor, effects, masks, feather, levels, animated, and the double-press sets maskPath, maskOpacity, timeRemap, expressions, material, paint, selected, missingEffects, waveform), `timeline.keyAt.` (Alt+Shift+A/P/S/R/T), `timeline.twirlSelected` (Ctrl/Cmd+`), `timeline.collapseAll`, `flowchart.options {layers?, effects?, solids?, direction?: lr\|tb, comp?}`, `flowchart.graph {comp?}` → `{nodes, edges}`, `window.workspace {name}` (all After Effects workspaces). | | `engine.commands` | `{filter?, enabledOnly?}` | `[{id, label, menu, shortcut, params, enabled, why}]` | | `ui.menu.list` | `{}` | The menu tree with enablement. | | `render.frame` | `{comp?, time?, max_side?, path?, base64?}` | Renders a comp frame through the session, independent of the viewer zoom or resolution. `comp` is an id or name (default: the active comp), `time` is in comp seconds (default: the CTI), `max_side` caps the longest side (0 = full size). Writes a PNG to `path` (default: a temp file) and returns `{comp, time, width, height, path}`. With `base64: true` it returns `{…, png: ""}` and writes no file. | @@ -80,13 +80,15 @@ Points are logical window coordinates. A target is `{id}` (the element's centre; Element ids are stable, for example `tools.Selection`, `panel.Timeline`, `panel.tab.EffectControls`, `header.workspace.Animation`, `project.item.`, `viewer.comp`, `viewer.handle..`, -`timeline.layer..bar`, `timeline.layer..twirl`, `timeline.prop..stopwatch`, +`timeline.layer..bar`, `timeline.layer..twirl`, `timeline.layer..row` (click selects, +Enter or a double-click renames, drag reorders), `timeline.prop..stopwatch`, `timeline.key..`, `timeline.cti`, `effectControls.prop..value` and `effects.item.`. The Composition viewer adds `viewer.magnification`, `viewer.resolution`, `viewer.roi`, `viewer.grid`, `viewer.channel`, `viewer.exposure`, `viewer.snapshot`, `viewer.showSnapshot`, `viewer.fastPreviews` (their popup entries are `viewer.

Item.`), `viewer.ruler.top|left|origin`, `viewer.mask..vertex.`, `viewer.shapePath..vertex.`, -`viewer.motionPath..[.in|.out]`, `viewer.freeTransform.handle.` and +`viewer.motionPath..[.in|.out]`, `viewer.puppetPin.[.rotate|.scale]`, +`viewer.freeTransform.handle.` and `viewer.regionOfInterest`; the Graph Editor adds `timeline.graph.transformBox[.]`, `timeline.graph.snap` and `timeline.graph.reference`. Use `ui.elements` to see what is on screen. diff --git a/docs/parity.md b/docs/parity.md index 6ae2353f..fd8056e2 100644 --- a/docs/parity.md +++ b/docs/parity.md @@ -137,7 +137,7 @@ the disk cache in the formats wave; the 3D Camera Tracker in M12.6.) | Web | 93% | 0.5 | GPU effects in the browser (WebGPU compositing only on the page), no disk cache, no shared-memory threads inside one engine instance (browser storage, Web Audio, Web Worker renders/analyses, WebGPU viewer and offline install landed in M15.2; viewer frames in frame workers fed by project diffs, Roto Brush propagation in a worker, non-blocking `wait: true` jobs and a browser Media Browser (File System Access folders, browser storage) in M13.10) | | 3D | 88% | 5.5 | multi-view layouts, the Extended Viewer for Advanced 3D comps (Classic 3D Extended Viewer landed in M13.5 UI completion); collapsed precomps of another size seen through the parent's camera render (fixed in M13.2); stereo rigs, orbit nulls, lights controlled by the camera, cameras/lights from glTF models, environment backgrounds, Advanced 3D motion blur, blend modes and track mattes landed in M7.7; Classic 3D iris-shaped bokeh with highlights, progressive depth of field on tilted layers and the focus-link commands landed in M13.5; Advanced 3D depth of field with the iris and highlight options, collapsed precomps as real Advanced 3D geometry and extruded text/shape strokes landed in M13.8; Advanced 3D (glTF/OBJ models, primitives, extruded text and shapes, PBR, image-based light, shadow maps, GPU rasteriser) in M7.4–M7.6; Advanced 3D end to end on the GPU (motion blur, iris depth of field, compositing) in M13.11 | | Effects | ≈ 85% | 3.0 | GPU versions of the remaining effects (166 run on the GPU since M13.13, EFF-5: Warp, Bezier Warp, Reshape, Smear, CC Bend It, CC Page Turn, Cartoon, Color Emboss, Circle, Ellipse, Iris Wipe, Bevel Alpha / Edges and Gaussian Blur (Legacy) joined the 152 of M13.9; simulations, 3D channel, VR, audio-driven, OCIO, text and the CC light / transition families still render on the CPU) and the missing controls listed as partial in [effects.md](effects.md) (every After Effects effect exists since M9.11, M12.5 and M12.6; parameter names, order, twirl-downs, popups, units and defaults were aligned in M9.12) | -| Interface | 74% | 5.0 | more Learn tutorials and pixel-level fidelity of dialogs (the Home ▸ Learn tab with interactive tutorials and a UI fidelity pass landed in M13.5 UI completion; visual editors for Lumetri RGB / hue-saturation curves, Colorama's output cycle wheel, Glow's colour map and Reshape's correspondence points (viewer handles), a scrolling Preview panel and AE-style Composition / Timeline tabs (close, label swatch, viewer lock) landed in M13.10; Timeline outline and Project panel columns scroll horizontally, the Layer Style dialog, ROI resize handles, Pan Behind snapping and 3D Reference Axes landed in M13.5; native macOS menu bar, Timeline columns/search/reveal-add, Home screen with recent projects and all AE workspaces landed; viewer rulers/snapping/channels/snapshots landed in M0.13) | +| Interface | 74% | 5.0 | more Learn tutorials and pixel-level fidelity of dialogs (Timeline layer reordering by drag, a non-snapping viewer pan, a working rename field and twirl arrows, and the full set of property reveal shortcuts — double presses, Alt+Shift keyframes, Ctrl+` — landed in M13.17–M13.20; the Home ▸ Learn tab with interactive tutorials and a UI fidelity pass landed in M13.5 UI completion; visual editors for Lumetri RGB / hue-saturation curves, Colorama's output cycle wheel, Glow's colour map and Reshape's correspondence points (viewer handles), a scrolling Preview panel and AE-style Composition / Timeline tabs (close, label swatch, viewer lock) landed in M13.10; Timeline outline and Project panel columns scroll horizontally, the Layer Style dialog, ROI resize handles, Pan Behind snapping and 3D Reference Axes landed in M13.5; native macOS menu bar, Timeline columns/search/reveal-add, Home screen with recent projects and all AE workspaces landed; viewer rulers/snapping/channels/snapshots landed in M0.13) | | Project | ≈ 68% | 5.5 | auto-save, folder moves, OCIO displays beyond the built-in tone map (Color Engine with OCIO/ACES working spaces, HDR compand/tone mapping, Rec. 2100 PQ/HLG output, Feet + Frames, display colour management, Simulate Output and the locked viewer landed in M7.7; proxies and Interpret Footage fields / pixel aspect / alpha guess landed: PRJ-8, PRJ-3) | | Masks & roto | 74% | 5.0 | Roto Brush's learned (3.0) segmentation model (variable-width mask feather points with the Mask Feather tool landed in M13.5; mask tracking and Mask Interpolation landed in M6.6; Roto Brush & Refine Edge with graph-cut segmentation, flow propagation, edge matting, decontamination and Freeze in M6.7) | | Preview | 77% | 2.8 | GPU compositing of Advanced 3D layers with blend modes / track mattes and of environment backgrounds (pooled GPU textures and fused quantisation since M13.13: Lower Third GPU warm 21 → 4 ms/frame, and Auto now picks the CPU or the GPU per comp from measured frame times; Advanced 3D runs — raster, motion blur, iris depth of field, compositing — and wireframes run on the GPU since M13.11: CPU warm 3394 → GPU warm 290 ms/frame at 1920×1080 (11.7×; Half 968 → 85 ms), GPU ≠ CPU on 0.005 % of pixels, on an M4 Pro under load; Classic 3D bokeh depth of field — iris shapes, highlights, fringe, progressive blur on tilted planes — runs in WGSL since M13.6: 3D Showcase GPU warm 205 → 54 ms/frame at full size on an M4 Pro; the Preview panel's five shortcuts with their own Include / Loop / Cache Before Playback / Range / Play From / Frame Rate / Skip / Resolution / Full Screen / stop options and `playback.settings.get/set` landed in M13.8; Classic 3D runs and adjustment layers composite on the GPU since M12.7; persistent disk cache with the blue cache bar landed; region of interest, snapshots, exposure and Fast Previews landed in M0.13) |