mirror of
https://github.com/storytold/effectcraft.git
synced 2026-10-30 04:57:54 -06:00
Merge main into M13.2
This commit is contained in:
@@ -288,6 +288,42 @@ demand (`self_at`) and `roto.propagate` fills in the background; `Session::edit`
|
||||
Key in step with the layer's source, masks and upstream effects. Freeze stores final 8-bit mattes
|
||||
in the effect.
|
||||
|
||||
**Content-Aware Fill** (`raster::inpaint`, `engine::commands::content_fill`): the hole is
|
||||
where the layer's masked source (`Renderer::layer_input` with no effects) is under half
|
||||
opacity, grown by Alpha Expansion. Optical flow between neighbouring membrane-filled frames is
|
||||
*completed* inside the holes (membrane interpolation of the surrounding tiles' motion); each
|
||||
missing pixel follows it forwards and backwards to the nearest frame (or reference frame) where
|
||||
it is visible, the two candidates blended by temporal distance, with Lighting Correction adding
|
||||
the membrane of the border mismatch (Poisson-style). What no frame shows is synthesised by
|
||||
PatchMatch (Barnes et al. 2009) inside Wexler et al.'s (2007) multi-scale EM: Object refines each
|
||||
frame starting from the previous result warped along the flow; Surface carries one synthesised
|
||||
fill through the range; Edge Blend is the membrane fill alone. The frames are written as a PNG
|
||||
sequence and imported into a "Fill" layer above the source. It runs as a generic **background
|
||||
task** (`engine::jobs`: a closure with progress and cancel on a thread, inline on wasm32 or
|
||||
with `wait`, whose result is applied on the UI thread as one undo step); the Progress panel and
|
||||
`jobs.list` / `jobs.cancel` show these tasks together with the render queue and the analyses.
|
||||
|
||||
**Scene Edit Detection** (`raster::cuts`) compares consecutive frames by colour-histogram
|
||||
distance and motion-compensated (block-flow warped) luma error, takes their geometric mean and
|
||||
marks frames that exceed a threshold and several times their neighbours' median; the cuts
|
||||
become layer markers, split layers, or split-and-precomposed layers. **Auto-trace**
|
||||
(`path::trace`) runs marching squares on the chosen channel, Douglas–Peucker simplification and
|
||||
cubic fitting with Corner Roundness blending chord and smooth tangents; holes become Subtract
|
||||
masks, and a work-area trace keys Mask Path per frame.
|
||||
|
||||
**Align Video to Data** reads data footage (File ▸ Import of `.json`, `.csv`, `.tsv`, kept as
|
||||
text in the project). Supported data: JSON as an array of objects or an object holding one
|
||||
(`{"samples": [...]}`), CSV/TSV with a header row (quoted fields allowed). The time key is the
|
||||
`key` parameter or the first field named `time`, `timestamp`, `t`, `date`, `datetime`, `utc`,
|
||||
`gps_time`, `seconds` or `time_s`; values may be ISO 8601 date-times (with `Z` or `±hh:mm`),
|
||||
times of day (`hh:mm:ss.sss`), timecode (`hh:mm:ss:ff` at the footage rate), Unix seconds or
|
||||
Unix milliseconds. The layer's Start Time becomes `dataStart + videoStart − firstSample`
|
||||
(`videoStart` given, or the file's creation date on the desktop; reduced to a time of day when
|
||||
the data has no dates).
|
||||
|
||||
**Lumetri Scopes** (`raster::scopes`) are density plots of the viewer frame (rendered over the
|
||||
comp background) with BT.601 / BT.709 / BT.2020 luma and colour-difference coefficients.
|
||||
|
||||
## 5. Expressions
|
||||
|
||||
Expressions are JavaScript, run by boa, with After Effects' object model (`thisComp`, `thisLayer`,
|
||||
|
||||
+20
-3
@@ -22,9 +22,7 @@ Tracking 88%, Effects 85%, Web 65%.
|
||||
What is left, in priority order: the web app's depth (threads, storage, audio, non-blocking
|
||||
renders); stroke taper/wave and multi-segment dashes; variable mask feather points; camera iris/bokeh and focus-link commands; Render Queue field render, crop/resize and templates;
|
||||
approximated effects (Subspace Warp, Key Cleaner) and Liquify's viewer brush; text in imported
|
||||
PDF/AI files and Illustrator procset EPS; more codecs; 59 preferences not yet wired; ScriptUI;
|
||||
Lumetri Scopes, Footage, Media Browser and Metadata panels; Content-Aware Fill; face tracking; and
|
||||
the "better than After Effects" items (a plug-in API, branching history; GPU particles landed in M12.7).
|
||||
PDF/AI files and Illustrator procset EPS; more codecs; 59 preferences not yet wired; ScriptUI; face tracking; and the "better than After Effects" items (a plug-in API, branching history; GPU particles landed in M12.7).
|
||||
|
||||
The sections below are the original audit (morning of 2 October, ≈ 64%) and its updates, kept for
|
||||
history.
|
||||
@@ -165,6 +163,25 @@ style runs; the Layer Style dialog (LYR-9); Graph Editor snapping to markers and
|
||||
Reference Axes; Animate Text ▸ Variable Font Axes. Remaining in these rows: Lottie can't carry
|
||||
taper/wave, Advanced 3D's DOF has no iris shapes, and variable axes don't change advances.
|
||||
|
||||
## Update: M13.6 panels and content tools
|
||||
|
||||
The last placeholder panels became real panels with automation ids: **Lumetri Scopes**
|
||||
(waveform RGB / Luma / YC, vectorscope YUV / HLS, histogram, parade RGB / YUV; Rec. 601 / 709 /
|
||||
2020, 8-bit or float scale, clamp; `scopes.analyze`), **Footage** (double-click footage: its own
|
||||
time ruler, play, In/Out, Overlay Edit and Ripple Insert Edit; `footage.*`), **Media Browser**
|
||||
(desktop file system, favourites, thumbnails, import and drag to the Project panel or timeline;
|
||||
`mediaBrowser.*`), **Metadata** (codec, size, rate, duration, colour profile, file dates; item
|
||||
and project comments; `item.metadata`) and **Progress** (every render and analysis with
|
||||
progress and cancel; `jobs.*`). **Content-Aware Fill** (panel and Layer ▸ New ▸ Content-Aware
|
||||
Fill Layer): Object / Surface / Edge Blend, Work Area / Entire Duration, Alpha Expansion,
|
||||
Lighting Correction and a reference frame from a layer, rendered to a PNG sequence in a Fill
|
||||
layer above the source as a background job. **Scene Edit Detection** (markers, split, split and
|
||||
precompose), **Auto-trace** (alpha / RGB / luminance, current frame or work area, to the layer
|
||||
or a new layer) and **Align Video to Data** (JSON / CSV / TSV time keys) replace their disabled
|
||||
menu entries. Not yet: creating a reference frame by editing a still (After Effects hands it to
|
||||
Photoshop), Content-Aware Fill's learned model (ours is PatchMatch + flow propagation), and Media
|
||||
Browser in the web app.
|
||||
|
||||
## Highest-value gaps, in order
|
||||
|
||||
1. ~~On-canvas text editing and per-character styles~~ (landed: M9.9–M9.10).
|
||||
|
||||
+71
-63
@@ -70,72 +70,80 @@ Commands (CLI, MCP, control channel):
|
||||
- `threeD.defaultRenderer`: Default 3D Renderer
|
||||
- `labels.N.name` / `labels.N.color`: the 16 label names and colours, used by the Label menu,
|
||||
the timeline, project panel, render queue and viewer handles
|
||||
- `general.switchesAffectNestedComps`: a precomp layer's Quality (Draft / Wireframe) and Motion
|
||||
Blur switches limit the layers of the nested comp (viewer, Render Queue, `render`)
|
||||
- `general.preserveConstantVertexCount`: adding or deleting mask / shape path vertices at one
|
||||
keyframe does the same on every other keyframe (added vertices split the matching segment)
|
||||
- `general.syncTimeRelatedItems`: moving the current time moves it in the comps nested in this
|
||||
one and in the comps that nest it (through the precomp layers' timing)
|
||||
- `general.expressionPickWhipCompact`: off, the pick whip writes match names
|
||||
(`thisComp.layer("A")("transform")("opacity")`)
|
||||
- `general.createSplitLayersAbove`: where Edit ▸ Split Layer puts the new layer
|
||||
- `startup.showHomeOnOpenProject`: the Home screen comes up after File ▸ Open / Open Recent
|
||||
- `composition.motionPath`, `composition.motionPathSeconds`, `composition.motionPathKeyframes`:
|
||||
how much of a position motion path the viewer draws (all, none, N seconds or N keyframes
|
||||
around the current time)
|
||||
- `previews.showInternalWireframes`: outlines of the layers inside a selected collapsed precomp
|
||||
- `previews.zoomQuality`: Faster = nearest-neighbour viewer scaling, More Accurate = bilinear
|
||||
- `previews.displayProfile`: the monitor's colour space for View ▸ Use Display Color Management
|
||||
- `appearance.useLabelColorForTabs`: Composition / Timeline tabs show the comp's label colour,
|
||||
Effect Controls / Properties the layer's
|
||||
- `appearance.cycleMaskColors`: new masks cycle through the mask colours (off: all the first)
|
||||
- `appearance.useGradients`: soft gradient on panel tab strips
|
||||
- `grids.gridStyle`, `grids.guideStyle`: lines, dashed lines or dots (grid, proportional grid,
|
||||
guides); `grids.proportionalHorizontal` / `grids.proportionalVertical`: View ▸ Show
|
||||
Proportional Grid divisions
|
||||
- `type.textEngine`: South Asian and Middle Eastern shows the paragraph direction and the
|
||||
World-Ready composers in the Paragraph panel
|
||||
- `type.fontPreview`: a "Sample" preview in each font of the Character panel's font menu
|
||||
- `type.recentFonts`: how many recently used fonts head the font menu
|
||||
- `type.fontNamesInEnglish`: off, fonts with a native-language family name show it
|
||||
- `import.reportMissingFrames`: gaps in an image sequence's numbering are reported on import
|
||||
- `import.unlabeledAlpha`: alpha of TGA / TIFF / movie footage (Ask opens Interpret Footage;
|
||||
Guess takes premultiplied for movies, straight for stills)
|
||||
- `import.dragImportAs`: layered files dropped on the window import as footage or a comp
|
||||
- `export.defaultOutputFolder`: where relative Render Queue outputs go
|
||||
- `export.segmentSequences`, `export.segmentSequenceFiles`: sequences split into numbered
|
||||
folders of N files; `export.segmentMovies`, `export.segmentMovieMb`: movies split into
|
||||
numbered files of about N MB (cut at the frame count the output's data rate gives)
|
||||
- `export.appendBitsToName`: `Comp 1.png` → `Comp 1_16bpc.png`
|
||||
- `audio.previewSampleRate`: the rate previews are mixed at (and the device is opened at, when
|
||||
it supports it)
|
||||
- `disk.diskCacheEnabled`, `disk.diskCacheMaxGb`, `disk.diskCacheFolder`: the persistent disk
|
||||
cache of processed layers
|
||||
- `disk.mediaCacheFolder`: audio waveform summaries kept between sessions (`Peaks/`)
|
||||
- `disk.conformedMediaFolder`: decoded (conformed) footage audio, written once per file and
|
||||
sample rate and read back instead of decoding again
|
||||
- `memory.ramReservedGb`: the cache budgets together leave this much physical memory free
|
||||
- `memory.reduceCacheWhenLow`: cache budgets halve while the system is low on memory (checked
|
||||
every 10 s by the desktop app)
|
||||
- `video.enableOutput`, `video.device`, `video.outputDuringPlayback`, `video.mirrorOnMonitor`,
|
||||
`video.disableWhenBackground`: Video Preview, a second window (or full screen on the display
|
||||
it is on) showing the composition frame, Mercury Transmit-style
|
||||
- `threeD.showReferenceAxes`: world X/Y/Z axes in the viewer corner of comps with 3D layers
|
||||
- `threeD.extendedViewer`: 3D layers reaching beyond the comp frame are outlined on the
|
||||
pasteboard
|
||||
- `threeD.realtimeShadows`: draft (Fast Previews) renders keep 3D shadows
|
||||
- `scripting.allowScriptsWriteFiles`: the scripting file / network gate (and `File.execute()`)
|
||||
- `scripting.warnExecutingFiles`: `File.execute()` asks before opening a file
|
||||
- `scripting.editorFontSize`, `scripting.syntaxHighlighting`, `scripting.lineNumbers`,
|
||||
`scripting.autoComplete` (Tab accepts), `scripting.bracketMatching`, `scripting.wordWrap`:
|
||||
the Timeline's expression editor
|
||||
- `scripting.errorBanner`: a banner along the bottom of the Composition panel names the first
|
||||
failing expression (click: reveal it)
|
||||
|
||||
### Not wired yet (TODO)
|
||||
### Display-only settings
|
||||
|
||||
These rows are in the dialog for After Effects parity and are stored, but nothing reads them yet.
|
||||
`prefs.pages` reports them with `"live": false`. A test keeps this list in step with the schema.
|
||||
These rows are in the dialog for After Effects parity and are stored, but have no EffectCraft
|
||||
behaviour to change. `prefs.pages` reports them with `"live": false`; a test keeps this list in
|
||||
step with the schema.
|
||||
|
||||
- `general.switchesAffectNestedComps`: Switches Affect Nested Comps
|
||||
- `general.preserveConstantVertexCount`: Preserve Constant Vertex and Feather Point Count when Editing Masks
|
||||
- `general.syncTimeRelatedItems`: Synchronize Time of All Related Items
|
||||
- `general.expressionPickWhipCompact`: Expression Pick Whip Writes Compact English
|
||||
- `general.createSplitLayersAbove`: Create Split Layers Above Original Layer
|
||||
- `general.useSystemColorPicker`: Use System Color Picker
|
||||
- `startup.showHomeOnOpenProject`: Show Home Screen When Opening a Project
|
||||
- `composition.motionPath`: Motion Path
|
||||
- `composition.motionPathSeconds`: Seconds
|
||||
- `composition.motionPathKeyframes`: Keyframes
|
||||
- `composition.hardwareAcceleratePanels`: Hardware Accelerate Composition, Layer and Footage Panels
|
||||
- `previews.showInternalWireframes`: Show Internal Wireframes
|
||||
- `previews.zoomQuality`: Viewer Zoom Quality
|
||||
- `previews.displayProfile`: Display Color Space
|
||||
- `appearance.useLabelColorForTabs`: Use Label Color for Related Tabs
|
||||
- `appearance.cycleMaskColors`: Cycle Mask Colors
|
||||
- `appearance.useGradients`: Use Gradients
|
||||
- `grids.gridStyle`: Style
|
||||
- `grids.proportionalHorizontal`: Horizontal
|
||||
- `grids.proportionalVertical`: Vertical
|
||||
- `grids.guideStyle`: Style
|
||||
- `type.textEngine`: Text Engine
|
||||
- `type.fontPreview`: Show Font Preview
|
||||
- `type.recentFonts`: Number of Recent Fonts to Display
|
||||
- `type.fontNamesInEnglish`: Show Font Names in English
|
||||
- `import.reportMissingFrames`: Report Missing Frames
|
||||
- `import.unlabeledAlpha`: Interpret Unlabeled Alpha As
|
||||
- `import.dragImportAs`: Default Drag Import As
|
||||
- `export.defaultOutputFolder`: Default Output Folder
|
||||
- `export.segmentSequences`: Segment Sequences
|
||||
- `export.segmentSequenceFiles`: Files per Segment
|
||||
- `export.segmentMovies`: Segment Movie Files
|
||||
- `export.segmentMovieMb`: Segment Size
|
||||
- `export.appendBitsToName`: Append Bit Depth to File Name
|
||||
- `audio.previewSampleRate`: Preview Sample Rate
|
||||
- `disk.diskCacheEnabled`: Enable Disk Cache
|
||||
- `disk.diskCacheMaxGb`: Maximum Disk Cache Size
|
||||
- `disk.diskCacheFolder`: Disk Cache Folder
|
||||
- `disk.mediaCacheFolder`: Database and Cache Folder
|
||||
- `disk.conformedMediaFolder`: Conformed Audio Folder
|
||||
- `memory.ramReservedGb`: RAM Reserved for Other Applications
|
||||
- `memory.reduceCacheWhenLow`: Reduce Cache Size When System Is Low on Memory
|
||||
- `video.enableOutput`: Enable Video Preview Output
|
||||
- `video.device`: Video Device
|
||||
- `video.outputDuringPlayback`: Video Output During Playback
|
||||
- `video.mirrorOnMonitor`: Mirror on Computer Monitor
|
||||
- `video.disableWhenBackground`: Disable Video Output When in Background
|
||||
- `threeD.showReferenceAxes`: Show 3D Reference Axes
|
||||
- `threeD.extendedViewer`: Extended Viewer
|
||||
- `threeD.realtimeShadows`: Realtime Shadows in Draft
|
||||
- `scripting.allowScriptsWriteFiles`: Allow Scripts to Write Files and Access Network
|
||||
- `scripting.warnExecutingFiles`: Warn User When Executing Files
|
||||
- `scripting.enableJsDebugger`: Enable JavaScript Debugger
|
||||
- `scripting.editorFontSize`: Font Size
|
||||
- `scripting.syntaxHighlighting`: Syntax Highlighting
|
||||
- `scripting.lineNumbers`: Line Numbers
|
||||
- `scripting.autoComplete`: Auto-complete
|
||||
- `scripting.bracketMatching`: Bracket Matching
|
||||
- `scripting.wordWrap`: Word Wrap
|
||||
- `scripting.errorBanner`: Show Expression Error Banner
|
||||
- `general.useSystemColorPicker`: EffectCraft has one colour picker on every platform and the
|
||||
web; there is no pure-Rust way to open the system colour panels.
|
||||
- `composition.hardwareAcceleratePanels`: the Composition, Layer and Footage panels are always
|
||||
drawn by the GPU (egui on wgpu).
|
||||
- `scripting.enableJsDebugger`: the JavaScript engine has no step debugger; script errors report
|
||||
their file and line in the Script Console.
|
||||
|
||||
## Keyboard shortcuts
|
||||
|
||||
|
||||
Reference in New Issue
Block a user