mirror of
https://github.com/storytold/effectcraft.git
synced 2026-10-26 19:18:14 -06:00
G2: improve editing reliability and Windows rendering fidelity
This commit is contained in:
@@ -0,0 +1,57 @@
|
||||
# Measured keyframe fidelity
|
||||
|
||||
The [AE 2026 replacement acceptance gates](ae-2026-acceptance.md) define the broader
|
||||
target across workflows, rendered output, work-project compatibility, performance and platforms.
|
||||
|
||||
The first G1 comparison measures eight original scalar Rotation cases against a live After Effects
|
||||
2026 session through AEsync 2.0.4: Easy Ease, overlapping influences, asymmetric ease, overshoot,
|
||||
descending values, equal endpoints, 100%/100% influence and 0.1%/100% influence. Each case has
|
||||
21 samples over a one-second segment. This is a scalar temporal-interpolation measurement, not an
|
||||
overall animation, rendering, spatial-path or application-parity score.
|
||||
|
||||
## Reproduce
|
||||
|
||||
With Node.js, Rust and an installed AEsync CLI, open a scratch After Effects project and run from
|
||||
the EffectCraft checkout:
|
||||
|
||||
```sh
|
||||
node examples/check-ae-ease.mjs /path/to/aesync/server/dist/cli.js
|
||||
```
|
||||
|
||||
The external bridge must be answering. Signing into AEsync's embedded chat is not required.
|
||||
The script creates a temporary comp with an original text layer, samples its Rotation property and
|
||||
removes the comp on success or failure. It does not save, close or replace the current project.
|
||||
Run in a scratch project: creating/removing the comp still changes the dirty flag and undo history.
|
||||
|
||||
`crates/keyframe/examples/ae_ease_samples.rs` evaluates the corresponding EffectCraft keys.
|
||||
`examples/ae-ease-oracle.jsx` records live property samples and actual ease settings after the setters.
|
||||
`examples/check-ae-ease.mjs` checks case metadata, applied AE settings, finite values and sample times,
|
||||
then compares every value with an absolute tolerance of `1e-7` degrees. A failing score exits nonzero.
|
||||
|
||||
Raw host observations and EffectCraft samples stay in gitignored `plan/aftereffects/ref/ease/`.
|
||||
Only the original harness and aggregate scores in `keyframe-ease.json` are tracked. No Adobe artwork,
|
||||
presets, screenshots, frames or implementation code are included.
|
||||
|
||||
## Finding and validation
|
||||
|
||||
Measured on 5 October 2026 with After Effects `26.3x87` and AEsync 2.0.4. Before the fix,
|
||||
EffectCraft normalized outgoing/incoming influence when their sum exceeded 100%. AE retains each
|
||||
influence. That normalization caused maximum errors of 12.4581 degrees for 80%/80%, 8.8909 degrees
|
||||
for the asymmetric case and 5.5636 degrees for the descending case. Removing normalization in both
|
||||
scalar evaluation and the shared progress helper makes all eight cases pass; the largest difference
|
||||
in the 168 samples is below `3e-11` degrees.
|
||||
|
||||
The numeric regression test checks AE-derived behavioral facts, including the formerly failing
|
||||
sample at 0.1 seconds (0.59243939036327 degrees; previously 1.4621885963370382). Existing linear,
|
||||
hold, spatial, roving and eased-range tests remain green.
|
||||
|
||||
Astra review also found premature Newton convergence near the flat midpoint of the 100%/100%
|
||||
time curve. Its closed-form inverse and a parameter-based convergence check now have a separate
|
||||
mathematical regression test at times within `1e-12` of the midpoint; that test is additional to
|
||||
the 168 live AE samples.
|
||||
|
||||
## Still unmeasured
|
||||
|
||||
Mixed interpolation sides, non-unit durations, automatic/continuous Bezier, spatial speeds and paths,
|
||||
time remapping, expressions, actual rendered motion and other effects need separate corpus cases.
|
||||
The initial probe makes no claim about those features.
|
||||
@@ -0,0 +1,48 @@
|
||||
# After Effects 2026 replacement acceptance
|
||||
|
||||
Target: reproduce observable After Effects 2026 behavior and output closely enough to
|
||||
replace it in professional motion-design work on Windows, macOS, and Linux. Feature
|
||||
presence, internal CPU/GPU agreement, and a polished interface are separate evidence;
|
||||
none establishes this target on its own. Pin each reference case to the exact AE build,
|
||||
platform, fonts, color settings, source files, and project parameters.
|
||||
|
||||
## Acceptance gates
|
||||
|
||||
| Gate | Evidence required | Current boundary |
|
||||
| --- | --- | --- |
|
||||
| Work projects | Representative projects recreated or imported, edited, saved, reopened and delivered without lost state | Native AE project import and third-party AE plug-in execution remain gaps |
|
||||
| Workflow | Pointer and keyboard cases for all panels, tools, shortcuts, docking, undo, dialogs and selections | Current pass covers 34 panel layouts and selected interaction regressions; every control is not verified |
|
||||
| Animation | AE-sampled values for scalar, spatial, multidimensional and expression-driven properties, timing and interpolation | Eight scalar Rotation/ease cases, 168 samples verified against AE 26.3x87; other cases remain open |
|
||||
| Render fidelity | Original test scenes compared at 8/16/32 bpc, specified color spaces and alpha conventions; edges, impulses, gradients and temporal sequences | Most AE-rendered comparisons remain open; CPU/GPU agreement alone is insufficient |
|
||||
| Media and delivery | Real footage import, seek, frame rates, audio sync, relinking, image sequences, codec/container metadata and exports checked in downstream tools | Actual work fixtures still required |
|
||||
| Performance | Matched AE/EffectCraft input-to-present and export timings at 1080p/4K, warm/cold caches, memory/VRAM and long sessions | No claim of beating AE or measured blur response yet |
|
||||
| Platforms | Native Windows, macOS and Linux runs with recorded GPU, driver, backend, device limits and fault cases | RTX 5090 Vulkan viewer/effect CPU comparisons pass; Direct3D FXC setup fails; other platforms not validated in this pass |
|
||||
| Recovery | Save/reopen, interrupted render, invalid input, exhausted resources, lost GPU and cache failures without silent corruption | Catching compositor setup failure does not repair an OS graphics bugcheck |
|
||||
|
||||
## Graphics and technology policy
|
||||
|
||||
Keep one shared Rust scene/effect model and portable wgpu shader/render implementation.
|
||||
Use Vulkan on Linux, validated Vulkan or Direct3D 12 on Windows, and native Metal on
|
||||
macOS. Browser WebGPU is a separate deployment/acceptance target. Record the backend
|
||||
actually selected; an available or compiled backend is not a passed compositor test.
|
||||
Use hardware capabilities and measured results to select optimized paths, with a CPU
|
||||
path that preserves output semantics. Newer APIs, SIMD, parallelism, and hardware codecs
|
||||
must preserve color, precision, timing and file compatibility. Avoid making baseline
|
||||
features depend on a specific GPU vendor or an optional advanced device capability.
|
||||
|
||||
Use current stable dependencies after regression checks; experimental technology belongs
|
||||
behind an explicit optional path. Driver/compiler combinations and shared-device versus
|
||||
headless initialization need the same diagnostic backend selection policy.
|
||||
|
||||
## Reference process
|
||||
|
||||
Use the official [AE 2026 user guide](https://helpx.adobe.com/after-effects/desktop.html),
|
||||
public scripting documentation, legally available publisher samples, and original scratch
|
||||
projects observed through AESync. Do not copy Adobe implementation code or redistribute
|
||||
Adobe lesson artwork. Record documented expectations separately from live observations.
|
||||
Maintain per-case pass/fail/untested results, tolerances and repeatable commands; do not
|
||||
replace them with a global parity percentage.
|
||||
|
||||
Next priorities: qualify the verified Windows Vulkan path on larger workloads; measure
|
||||
Gaussian Blur interaction and output against AE; expand animation/render oracles; exercise
|
||||
representative work projects and required plug-ins; then close each platform acceptance gate.
|
||||
@@ -0,0 +1,57 @@
|
||||
{
|
||||
"generatedAt": "2026-10-06T01:17:41.470Z",
|
||||
"aeVersion": "26.3x87",
|
||||
"property": "Rotation (scalar)",
|
||||
"tolerance": 1e-7,
|
||||
"cases": [
|
||||
{
|
||||
"name": "easy",
|
||||
"samples": 21,
|
||||
"maxAbsoluteError": 2.842170943040401e-14,
|
||||
"pass": true
|
||||
},
|
||||
{
|
||||
"name": "high_influence",
|
||||
"samples": 21,
|
||||
"maxAbsoluteError": 8.965272968453064e-12,
|
||||
"pass": true
|
||||
},
|
||||
{
|
||||
"name": "asymmetric",
|
||||
"samples": 21,
|
||||
"maxAbsoluteError": 1.3642420526593924e-12,
|
||||
"pass": true
|
||||
},
|
||||
{
|
||||
"name": "overshoot",
|
||||
"samples": 21,
|
||||
"maxAbsoluteError": 2.9473312679328956e-11,
|
||||
"pass": true
|
||||
},
|
||||
{
|
||||
"name": "descending",
|
||||
"samples": 21,
|
||||
"maxAbsoluteError": 2.5774937739697634e-12,
|
||||
"pass": true
|
||||
},
|
||||
{
|
||||
"name": "equal_endpoints",
|
||||
"samples": 21,
|
||||
"maxAbsoluteError": 4.220623850414995e-12,
|
||||
"pass": true
|
||||
},
|
||||
{
|
||||
"name": "maximum_influence",
|
||||
"samples": 21,
|
||||
"maxAbsoluteError": 5.684341886080802e-14,
|
||||
"pass": true
|
||||
},
|
||||
{
|
||||
"name": "minimum_maximum",
|
||||
"samples": 21,
|
||||
"maxAbsoluteError": 2.4030555323406588e-11,
|
||||
"pass": true
|
||||
}
|
||||
],
|
||||
"pass": true
|
||||
}
|
||||
@@ -0,0 +1,94 @@
|
||||
# Selection and preview workflow checks
|
||||
|
||||
These checks use original compositions and public interaction behavior. No Adobe assets or
|
||||
implementation code are included. Adobe's [selection documentation](https://helpx.adobe.com/after-effects/desktop/work-with-layers/select-and-arrange-layers/selecting-arranging-layers.html)
|
||||
describes Timeline range selection and Composition Shift-click/Shift-marquee selection.
|
||||
|
||||
`crates/ui-egui/tests/ui_workflow_selection.rs` exercises actual pointer and keyboard events:
|
||||
|
||||
- Timeline Shift-click selects the visible range, skipping locked layers; Ctrl/Command-click toggles a layer.
|
||||
- A drag beginning in the empty Timeline outline selects the intersected layer rows without reordering them.
|
||||
- Project Shift-click selects the displayed range and Ctrl/Command-click toggles an item.
|
||||
- Project Clear uses the undoable project-item deletion command.
|
||||
- Dragging a composition from Project into Render Queue queues that composition.
|
||||
- Render Queue Delete removes its selected queue item without deleting selected Timeline layers.
|
||||
- Composition marquee detects intersections through a layer's interior, including Shift toggle selection.
|
||||
- Gaussian Blur parameter scrubbing activates Adaptive Resolution; release restores settled resolution.
|
||||
An explicitly selected Full resolution is preserved.
|
||||
|
||||
The existing `ui_tabs` tests exercise panel docking, tab rearrangement and splitter resizing.
|
||||
`ui_viewer`, `ui_effect_controls`, and `ui_ram_preview` check neighboring interactions and cached-frame behavior.
|
||||
|
||||
## Preview scheduling
|
||||
|
||||
CPU frames now enter the RAM cache and request repaint before optional RGBA conversion and
|
||||
disk-cache compression. Persistence still uses the same content key and runs on the worker;
|
||||
disk hits are not rewritten. The render-duration display ends at publication and excludes this
|
||||
post-publication persistence work. It still omits queue waiting and is not interaction latency.
|
||||
|
||||
The native preview scheduler now uses the actual render-pool capacity instead of the machine's
|
||||
logical CPU count. Normal paused prefetch schedules at most two frames and leaves one worker
|
||||
available where the pool permits it. A two-worker browser pool schedules at most one background
|
||||
frame; a one-worker pool does not do normal paused prefetch. Explicit cache-before-playback and
|
||||
Cache Frames When Idle retain their separate policies.
|
||||
|
||||
Dragging render-affecting properties in Effect Controls or Timeline now participates in the
|
||||
existing adaptive-preview policy. This reduces the requested pixel count while scrubbing when
|
||||
Auto resolution and Adaptive Resolution are selected. It does not change the blur kernel.
|
||||
|
||||
The checks establish interaction and resolution behavior, not a measured input-to-frame latency
|
||||
improvement or complete visual Gaussian Blur parity. Remaining measurements include cold/warm
|
||||
1080p and 4K latency, stale-frame work, CPU/GPU selection, blur impulse profiles, and edge behavior.
|
||||
|
||||
## Live reference limits
|
||||
|
||||
AESync 2.0.4 answered from AE 26.3x87. Original four-tile compositions were used for desktop
|
||||
interaction study, and extended Timeline selection was verified by querying selected layers
|
||||
after a keyboard gesture. Automated native drags did not produce reliable marquee observations;
|
||||
those results are not claimed as a pixel-perfect AE oracle. Shape/path selection and modifier
|
||||
drag cadence still need controlled live comparison.
|
||||
|
||||
- Composition right-click selects an unselected hit layer, preserves an already selected group,
|
||||
and exposes the shared Timeline layer actions. The pointer-driven regression test invokes
|
||||
Duplicate from the actual popup and verifies both single-layer and group behavior.
|
||||
|
||||
## Wider UI review
|
||||
|
||||
The opt-in `ui_visual_review` suite captures all 34 built-in panels at 1600 × 1000 and
|
||||
1024 × 768, plus common dialogs and Light theme workspaces. Captures use an original fixture
|
||||
and do not establish every panel control's behavior or live input-to-frame performance.
|
||||
|
||||
Additional regression checks cover modal pointer and text isolation, Escape rollback of live
|
||||
Layer Style previews, cancellation with bounded undo history, Project edit command routing,
|
||||
filtered Project Select All, and deleting camera track points without deleting the layer/effect.
|
||||
Layer Style Cancel restores a captured project/history checkpoint rather than replaying Undo.
|
||||
Filtered Project Select All omits structural folders so deleting search results cannot delete
|
||||
unrelated descendants. Its exact AE parity remains to be checked live.
|
||||
|
||||
The Composition context menu's Select submenu lists visible, unlocked layers under its original
|
||||
click position, allowing selection of an obscured layer. Reference:
|
||||
[Adobe layer selection manual](https://helpx.adobe.com/after-effects/desktop/work-with-layers/select-and-arrange-layers/selecting-arranging-layers.html).
|
||||
Workspace behavior reference:
|
||||
[Adobe workspace guide](https://www.adobe.com/learn/after-effects/web/customize-workspaces).
|
||||
The broader reference is the [official AE user guide](https://helpx.adobe.com/after-effects/desktop.html).
|
||||
The [publisher's 2026 Classroom in a Book sample](https://ptgmedia.pearsoncmg.com/images/9780135561430/samplepages/9780135561430_Sample.pdf)
|
||||
was also reviewed. Its Roto Brush lesson supplies future behavior cases for foreground/background
|
||||
strokes, alpha display modes, frame propagation, and freezing. Those cases are reference backlog,
|
||||
not verified EffectCraft parity; book artwork and lesson files are not copied into this repository.
|
||||
|
||||
Theme fixes use matched token backgrounds/text for fields, secondary buttons, notifications,
|
||||
and About links. Compact viewer footers omit render duration when it would collide with timecode.
|
||||
Further design work includes full toolbar overflow, tighter grouping of controls in wide panels,
|
||||
and additional small-window/dynamic panel fixtures.
|
||||
|
||||
GPU compositor initialization now catches backend setup panics and retains CPU compositing.
|
||||
This covers a reproduced Direct3D FXC shader compiler failure; it does not repair an OS driver
|
||||
failure or establish the cause of the reported Windows bugcheck. The GPU parity test is separately
|
||||
reported when this device cannot create its compute pipeline, never counted as a passed test.
|
||||
Native GPU threshold regressions now compare prepared quantized buffers directly with the CPU:
|
||||
quantization uses the CPU-rounded reciprocal and matching half-up arithmetic; channel Arithmetic
|
||||
refines unpremultiplication, and median division refines the residual twice before strict Dust &
|
||||
Scratches thresholds. These checks retain the existing image tolerances. Power Pin admits a small
|
||||
f32 inverse-solve error at exact quad edges and clamps accepted coordinates to the source domain.
|
||||
The original half-scale right-edge fixture and neighboring quantization-boundary samples reproduce
|
||||
the failures. Full backend qualification and performance measurement remain separate acceptance work.
|
||||
+1
-1
@@ -31,7 +31,7 @@ of them have been reconciled.
|
||||
| Dimension | Estimate | Evidence |
|
||||
|---|---|---|
|
||||
| Breadth of features | ≈ 95%+ | All 306 effects, the After Effects menus and panels, Classic and Advanced 3D, tracking, expressions, scripting, render queue (parity.md) |
|
||||
| Behaves like After Effects | unmeasured, ≈ 60–80% | One outside contributor found four bugs in features marked done within a day (PRs #6–#10): Hold keyframes eased the motion into them, `keyInSpatialTangent` / `keyOutSpatialTangent` had the wrong names, a zero frame rate crashed, Find and Enter Full Screen shared Ctrl+F off macOS. There are about 10 After Effects reference captures in total. No test compares our renders or property values with After Effects itself; the tests check what the agents believed After Effects does |
|
||||
| Behaves like After Effects | largely unmeasured, ≈ 60–80% | One outside contributor found four bugs in features marked done within a day (PRs #6–#10): Hold keyframes eased the motion into them, `keyInSpatialTangent` / `keyOutSpatialTangent` had the wrong names, a zero frame rate crashed, Find and Enter Full Screen shared Ctrl+F off macOS. There are about 10 After Effects reference captures in total. The first live G1 comparison now checks eight scalar Rotation/ease cases (168 samples) against AE 26.3x87 via AEsync 2.0.4: all pass after fixing overlapping temporal influences, with maximum error below 3e-11 degrees ([scores and reproduction](fidelity/README.md)). Other animation behavior and rendered frames remain unmeasured |
|
||||
| Opening existing After Effects work | ≈ 0% | `.aep` / `.aepx` projects cannot be opened. Third-party After Effects plug-ins cannot run. Expressions and the scripting object model are strong, so scripts and expressions carry over |
|
||||
| Stability | improving | 23 never-crash PRs landed on 4 October; [AGENTS.md](../AGENTS.md) "Never crash" now binds every crate. On 5 October `cargo xtask ci` failed on main under Rust 1.99's clippy (a fix is in progress) |
|
||||
| Real-user experience | ≈ 70%, uneven by platform | Issues #41–#47 (all from the Linux AppImage 0.1.1, 5 October): panning the viewer snaps back, panels can't be resized or rearranged, drag-and-drop and double-click import don't work, layer rename gets stuck, the Layer Settings arrow does nothing, the Project panel clips, the Wayland window icon is generic. Issues #63–#68 (macOS, 5 October): scaling a layer by its handles goes wrong and can stick at 0, two 3D compasses, the viewer lags while a layer is dragged (a frame renders in 20 ms but showed after ≈ 100 ms, behind RAM preview prefetch), the Discord and other links do nothing, Delete doesn't delete in the Project panel, hidden layers can be selected in the viewer. All but the last two were fixed or confirmed fixed with a test on 5–6 October (those two have community PRs); file drops still can't work on Wayland (winit has no support). The panning, rename and arrow bugs had been fixed in v0.2.0 already; nobody had told the reporter. Most checking happens on macOS. No localisation, no accessibility work |
|
||||
|
||||
Reference in New Issue
Block a user