mirror of
https://github.com/storytold/effectcraft.git
synced 2026-10-29 20:47:18 -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.
|
||||
Reference in New Issue
Block a user