Commit Graph
4415 Commits
Author SHA1 Message Date
ash bb908a6ae3 Merge pull request #3393 from arnav-hiwarkar/fix/keyframe-marquee-scroll
Timeline: keep marquee selection anchored while scrolling
2026-11-10 11:53:07 +05:30
arnav-hiwarkarandClaude Opus 5.5 58a1f3df17 #2859: test the real marquee selection path
The unit test re-implemented Marquee::selection's box/outline split, so it
only covered `targets`. Move the anchor math into `Anchor::press` /
`Anchor::selection` over a plain `View`, call it from the test, and add a
scrolled-drag case that fails with a screen-fixed anchor.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-10 11:01:42 +05:30
ash 6a105aa285 Merge pull request #3392 from arnav-hiwarkar/feat/aep-drag-drop
File ▸ Import: drop or pick After Effects projects to import them; name the project imports alike (#3103)
2026-11-10 10:16:48 +05:30
arnav-hiwarkar 384184a12b #2859: document marquee gesture contracts and regression cases 2026-11-10 09:40:22 +05:30
arnav-hiwarkar eec3c51296 #3103: doc comments for the touched import and prompt functions 2026-11-10 09:35:56 +05:30
arnav-hiwarkar 51ef332c05 #2859: keep timeline marquee anchored while scrolling 2026-11-10 09:23:04 +05:30
arnav-hiwarkar 9e58108288 #3103: import dropped and picked After Effects projects; name the project imports alike
Dropping an .aep or .aepx on the window, or picking one in File > Import > File...
or Multiple Files... (also from the Home screen and the Project panel), imports it
as File > Import > Adobe After Effects Project... does, instead of failing as
unsupported footage: the losses prompt first when parts cannot come over, its
items in a folder named after the file, its first composition open.

- Several projects are asked about one at a time: the others wait in the
  prompt's queue, and Cancel skips only the one it asks about. A prompt another
  dialog replaced (Save changes?) strands nothing: its projects are tried with
  the next import or queued behind the next prompt.
- The other files of a drop or pick import as footage, into the Project panel
  only when a project is in the drop. While the prompt shows, a Photoshop file
  or image sequence imports with its defaults instead of replacing the prompt,
  an Interpret Footage question leaves a note instead, and a dropped .ecproj is
  skipped with a note. While Save changes? waits for a dropped .ecproj, the rest
  of the drop is skipped with a note instead of landing in the replaced project.
- Errors of every picked project reach the status line on both the blocking and
  the non-blocking file dialog.
- The Import File dialogs list .aep, .aepx, .ecproj and .ecprojx; Replace
  Footage offers footage only.
- For scripts and agents, file.import hands After Effects projects to
  file.importAep; a refusal (new EngineError::Refused) names the menu entry and
  `file.importAep` with `allowLosses`.
- File > Import / Export name the entry Adobe After Effects Project..., as
  Adobe Premiere Pro Project...; File > Import keeps After Effects' order with
  the project imports together and the formats only EffectCraft imports after a
  separator. All 13 menu catalogs and the losses dialog title are updated.
- Docs: aep-import, aep-export, footage, file-format-parity, agents.

Supersedes #3312.
2026-11-10 08:49:26 +05:30
FredApps 93b69a8cf9 Merge pull request #3384 from storytold/release-0.23.1-version
Release: EffectCraft v0.23.1
2026-11-10 00:08:31 +01:00
FredApps 360e21f539 Release: EffectCraft v0.23.1 2026-11-09 23:36:18 +01:00
FredApps 308a906043 Merge pull request #3047 from MarekSpodBiedry/issue-3028
Preview: render at most two frames on the GPU at once so video memory stays flat (#3028)
2026-11-09 23:22:54 +01:00
FredApps 3c2a6d54f7 Merge pull request #1956 from ded-achtung/g5-near-camera-1388
#1388: 3D text and shapes rasterise only the part the frame shows
2026-11-09 23:21:49 +01:00
FredApps 5909f9cf76 Merge remote-tracking branch 'origin/main' into maintainer/1956-raster-20261109 2026-11-09 22:54:41 +01:00
FredApps 2d6d08f29f #1388: retain whole text raster for animator blur 2026-11-09 22:54:40 +01:00
FredApps 4ed549588e Merge pull request #3377 from FredApps/fix/3357-crash-diagnostics
Report unexpected desktop exits with local diagnostics
2026-11-09 22:28:13 +01:00
FredApps 8d9d9c446b #3357: preserve concurrent session log identity 2026-11-09 22:04:08 +01:00
FredApps 47c9b4a99b #3357: finish crash reporter after accepted macOS teardown 2026-11-09 20:58:45 +01:00
FredApps 59c41fee0a #3028: keep dedicated preview lanes waiting on GPU admission 2026-11-09 20:21:23 +01:00
FredApps fc4bcd21d4 #3357: report unexpected desktop exits with local diagnostics 2026-11-09 20:15:19 +01:00
FredApps 989b37b1d1 #3028: reconcile GPU admission with current preview workers 2026-11-09 19:42:59 +01:00
FredApps 636dc1578c #1388: synchronize current main and retain raster regression modules 2026-11-09 19:14:30 +01:00
FredApps 1197414255 Merge pull request #3363 from FredApps/fix/3357-gpu-fallback-exit
#3357: release retired GPU resources before CPU fallback
2026-11-09 19:10:21 +01:00
FredApps 5207194f30 Merge pull request #3336 from vangel76/rq-readback-3335
GPU render speed: footage uploaded once per frame, single-copy readback, Render Queue picks the faster renderer (2.6× on a 1080p EXR job)
2026-11-09 19:00:20 +01:00
FredApps d643e7f8f0 #1388: distinguish fine raster clips and update layer test fixtures 2026-11-09 18:55:46 +01:00
FredApps e8634b1f4b #3357: release retired GPU resources before CPU fallback 2026-11-09 18:41:39 +01:00
FredApps 9ce936d197 Merge pull request #3360 from FredApps/fix/3357-drop-shadow-cover
#3357: avoid whole-layer cover for Drop Shadow
2026-11-09 18:31:49 +01:00
FredApps 38e7b5e16b #1388: integrate raster clipping and preserve whole-layer consumers 2026-11-09 18:17:25 +01:00
FredApps 45e81e603e #3335: isolate proxy caches and settle small render batches 2026-11-09 18:16:57 +01:00
FredApps 43e82587fd #3357: avoid whole-layer cover for Drop Shadow 2026-11-09 18:10:06 +01:00
FredApps d07aed85c3 Merge pull request #3355 from arnav-hiwarkar/fix/3345-gpu-preview-lanes
Preview: the window stays smooth while lanes render on the GPU (#3345)
2026-11-09 16:49:13 +01:00
vangel76 d77d978973 Merge remote-tracking branch 'upstream/main' into rq-readback-3335
# Conflicts:
#	crates/render/src/lib.rs
2026-11-09 16:06:16 +01:00
arnav-hiwarkar 9a0a198ff1 Preview: the window stays smooth while lanes render on the GPU (#3345)
Since #595 (v0.19.0) a playing preview and Cache Frames When Idle render one frame per
lane, a lane per core, each recording, submitting and reading back a whole frame on the
GPU the window draws with. On a GPU that can't keep up, the window froze for hundreds of
milliseconds to seconds and the playhead jumped ahead when it came back.

Lanes now take a GPU frame only while fewer than a limit of them composite. The limit
starts at one lane and adapts to the window's frame gaps while a preview plays: a stall
(>100 ms) with lanes compositing halves it, half a second of smooth frames (<50 ms) with
every allowed lane busy adds one, up to every lane; a limit that stalled is tried again
only after 10 s. Frames on the CPU (Software Only, no or retired GPU, GPU memory
pressure) and disk-cache hits use every lane; the pool and the viewer's frame are not
limited, and frames ahead of the playhead still start first.
2026-11-09 19:58:51 +05:30
just_anshhandjustanshh 544eebf904 WebAssembly ABI 2: neighbouring frames for effect plug-ins (#2773) (#3329)
* WebAssembly ABI 2: neighbouring frames for effect plug-ins (#2773)

A wasm plug-in can export ec_api_version 2 and ec_render2 to receive the layer's previous and next frames, their layer times and validity flags. Neighbours come from PluginHost::input_at, are resampled onto the current grid, and are zeroed when absent. ABI 1 modules (ec_render) load and render unchanged; the manifest api stays independent. A layer with an ABI 2 plug-in keys the render cache on layer time; the Plug-in Library accepts ABI 1-2 releases. Docs, help text and tests updated.

* Fix ABI 2 neighbour times on NTSC frame boundaries

	ime * fps is often a few ulps off an integer at rates such as 24000/1001. The old boundary test then took the bracket branch and passed the current frame back as prev (or
ext). Treat a near-integer as a frame boundary within 1e-6 frames, and test 2400 frames at 24000/1001: every boundary must get the frames either side. Also document the loader helpers for the docstring coverage check.

---------

Co-authored-by: justanshh <294019246+justanshh@users.noreply.github.com>
2026-11-09 10:49:53 +01:00
Dylan M. Taylor 81a12ffffc Merge pull request #3340 from dotCooCoo/chore/craft-update-1b34eba41
Updates: take craft-update from craft-libs main at 1b34eba41
2026-11-08 23:25:07 -05:00
dotCooCoo 91f35c73e1 Updates: restart from the update result dialog 2026-11-08 20:01:20 -08:00
Valentin Klein 7c62272305 .aep import: placed .ai/PDF footage framed by its ArtBox, Null anchors at the corner (#3099) (#3311)
* #3099: placed .ai pages fill the size After Effects stored; null anchors default to the corner

Footage of an .aep keeps the size After Effects stored for a placed PDF / Illustrator / EPS
file (the ArtBox, rounded up), and masks and anchors are measured against it. The page was
drawn as a PDF viewer frames it (CropBox, /Rotate) at its own size, scaled by the width ratio
at full resolution and stretched to the stored aspect below 3/4: masks too large, art off
centre, squeezed at half resolution.

- effectcraft-pdf: Framing::Placed / parse_page_framed (ArtBox clipped to the CropBox,
  /Rotate ignored); boxes with a non-finite corner or span are not used
- Footage::placed_page (set by the .aep importer, serialized only when true): the page is
  framed so and filled into the stored size (effectcraft_render::vector_fit), decoded,
  continuously rasterised and in Create Shapes from Vector Layer; Reload keeps the size;
  the frame cache keys it by size and framing
- .aep import/export: a null's absent Anchor Point is [0, 0], as After Effects reads it
- fixture ai-mask-3099.aep (own synthetic files, scrubbed, profiles stubbed) and tests
  against After Effects 2026's read-back

* #3099: placed-page framing only for .ai and .pdf, EPS as before; doc comments

After Effects' sizing was measured with PDFs named .ai only; an EPS from an .aep keeps its
bounding box at its own size (listed as not measured in docs/gaps.md and docs/aep-import.md).
Doc comments on the touched functions.

* #3099: shapes from a placed page keep its frame (track matte)

Create Shapes from Vector Layer converted every path of a placed page, so bleed, art past the
artboard or the page's background showed where the footage's raster hides them. The layers it
makes from a placed page now take a hidden "<layer> Frame" shape layer (the footage's
width x height) as their Alpha track matte: drawn at the comp's resolution, its edge is the
raster's on shape and image layers alike. The command returns the frame layer's id too.
2026-11-08 21:52:32 -06:00
FredApps 9893eb0d8d Naming: descriptive names for the CC effects, Lumetri, Mocha, Keylight and Mercury (#3327)
Related to #1365. Display labels only; effect, command, parameter, panel and serialized ids and the AEP/script match-name tables are unchanged.

- 69 Cycore CC effects, Key Light, Mocha shape, Lumetri Color/Scopes and the Mercury renderer labels get descriptive names; the old names stay case-insensitive lookup and search aliases.
- Backend::parse accepts the new renderer labels, so reported settings round-trip.
- Display names are unique per language in every effect catalog (new test).
- Warp Stabilizer and Roto Brush keep their names until RFC-0029 settles.
- Mapping in docs/feature-naming.md.
2026-11-09 04:51:10 +01:00
dotCooCoo 9253b5bdc6 Updates: take craft-update from craft-libs main at 1b34eba41 2026-11-08 19:47:28 -08:00
vangel76 74ac5a2f26 #3335: choose the GPU frames in flight from measured GPU memory, with a Memory & CPU setting 2026-11-09 02:04:15 +01:00
vangel76 e0154351f3 #3335: time the CPU on up to eight frames in parallel when choosing the renderer 2026-11-09 01:18:49 +01:00
vangel76 885ee302d7 Merge remote-tracking branch 'origin/gpu-upload-once-3333' into rq-readback-3335 2026-11-09 00:55:36 +01:00
vangel76 4649c27ef9 #3335: Render Queue reads frames back once, pipelines GPU frames and picks the faster renderer 2026-11-09 00:55:30 +01:00
vangel76 2320255c8b #3333: upload each footage frame once per frame and share it across layers 2026-11-09 00:47:50 +01:00
FredApps a41ff5015c Merge pull request #3129 from vangel76/aep-import-lumetri
.aep import: map Lumetri Color
2026-11-08 17:19:43 +01:00
FredApps 86c08aa0ee Keep native control renders responsive (#3306)
* Keep native control renders responsive

* Refresh replies for immediately completed render jobs

* #3289: Bind waiting replies to their native render
2026-11-08 16:43:06 +01:00
vangel76 5f2d88ea5c Merge remote-tracking branch 'upstream/main' into aep-import-lumetri
# Conflicts:
#	crates/aep/src/container/effect_map.rs
#	crates/aep/src/export/effects.rs
#	crates/aep/src/import/effects.rs
#	crates/aep/tests/it/export/effects.rs
#	crates/aep/tests/it/import/effects.rs
#	docs/aep-import.md
2026-11-08 16:32:43 +01:00
FredApps 07be19d402 Merge pull request #3255 from vangel76/aep-import-puppet-3093
AEP import: Puppet arrives as EffectCraft's Puppet, its meshes and pins are reported
2026-11-08 15:46:00 +01:00
FredApps 7ca249d085 Merge pull request #3120 from vangel76/aep-import-thirdparty
.aep import: map CC Color Neutralizer, EXtractoR and IDentifier
2026-11-08 15:45:08 +01:00
FredApps 5832219d76 Merge pull request #3248 from vangel76/text-layer-name-follow-3233
Text layers: the name follows the text until the user renames the layer
2026-11-08 15:44:58 +01:00
FredApps 362b39038f Merge pull request #3256 from vangel76/clamp-time-stretch-3247
Time stretch: hold a loaded or imported stretch to ±1 % to ±9900 %
2026-11-08 15:44:45 +01:00
vangel76 c8ccf807e1 #3233: AEP import names an unnamed text layer as a following name is cut, so export and import agree 2026-11-08 04:53:01 +01:00