Commit Graph
4443 Commits
Author SHA1 Message Date
vangel76 eee7519494 Merge remote-tracking branch 'upstream/main' into aep-import-bounds-3299 2026-11-09 19:22:01 +01:00
vangel76 28206a3c1d Merge remote-tracking branch 'origin/aep-audit-3300' into aep-import-bounds-3299 2026-11-09 19:22:00 +01:00
vangel76 04dcececf2 Merge remote-tracking branch 'upstream/main' into aep-audit-3300
# Conflicts:
#	crates/aep/tests/it/export/built.rs
2026-11-09 19:17:42 +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 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 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
vangel76 0c2e1bc017 Merge remote-tracking branch 'origin/aep-audit-3300' into aep-import-bounds-3299 2026-11-08 18:53:06 +01:00
vangel76 6dcaea2ac6 #3300: read_aepx keeps its own owned-tree reader
read_aepx, read_aepx_with_limits and parse_any build the owned chunk
tree element by element again, as before the .aepx index, instead of
converting the index (which held the decoded buffer and the owned tree
at the same time). Import keeps the index reader. The tests now
compare the two production readers.
2026-11-08 18:49:19 +01:00
vangel76 3a9cb48259 Merge remote-tracking branch 'upstream/main' into aep-audit-3300 2026-11-08 18:29:49 +01:00
vangel76 a33fb4abf6 #3300: import .aepx through the flat index
The .aepx reader no longer builds the owned chunk tree element by
element. It decodes every body (hex, text, alias JSON, numbers) into
one buffer and records the chunks as depth-first entries whose bodies
are ranges of that buffer; TreeIndex::from_drafts turns them into the
index the importer reads, which borrows the buffer. read_aepx converts
that index into the owned tree in one pass.

The tree and the errors are those of the previous reader, which the
tests keep as the reference: generated and damaged documents under
seven limit sets, invalid UTF-8, hostile input, the fixture directory,
and imports through both. Bound tests pin the chunk list to the input
and the limit, and check that dropped content leaves nothing behind.
2026-11-08 18:19:12 +01:00
vangel76 39628a2ba0 #3299: aep: one pard decoder, bounded precomp loop search inside a loop
The container's `Pard` is now the only decoder of parameter definitions:
`EffectParam` delegates to it and the export's test reference reads its
encoded table back through it (no big-endian readers of its own). The
export stores a checkbox default as on/off, as the importer reads it.

Inside a strongly connected component of candidate precomp links (a file
with a precomp loop), the per-composition searches share one budget of
link visits; past it, a layer that would need a search is refused and
reported, which never lets a loop in. Below the budget the decisions are
the old ones exactly.
2026-11-08 18:05:27 +01:00
vangel76 2c6fe5f108 Merge remote-tracking branch 'origin/aep-audit-3300' into aep-import-bounds-3299
# Conflicts:
#	crates/aep/src/export/emit.rs
2026-11-08 17:21:44 +01:00
vangel76 603ad5e886 Merge remote-tracking branch 'upstream/main' into aep-import-bounds-3299
# Conflicts:
#	crates/aep/src/export/effects.rs
#	docs/aep-import.md
2026-11-08 17:21:37 +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
vangel76 5f4e7ffc18 Merge remote-tracking branch 'upstream/main' into aep-audit-3300 2026-11-08 16:21:58 +01:00
vangel76 2e24ae47a1 aep export: the time remap and Transform keys use the shared key-list and match-name helpers; doc comments for the audit's functions (#3300) 2026-11-08 16:21:57 +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 4aabf112b6 #3299: aep import/export: linear hostile-input bounds, reported losses, deduplicated export code
Import: precomp loop check by candidate-graph components (no search
without a loop), one LayerId -> index map for mattes, parents and effect
layer references, popup mapping linear in the file's items, lazy loss
details (lose_with), orientation keys at one time reported, mask path
ease speeds under the property limit, Blending Options nested past the
read depth reported.

Export: precomp loops by components, parent loops found once, cached
natural sort keys, one exported-layer set, parameter definitions built
from the effect table (old encode-and-parse path kept as a test
reference), shared key-time loop, key-list rewrite, spatial record,
tdmn/tdsn helpers, unreadable curve and mesh entries reported.

Corpus import and export dumps are byte-identical to the base.
2026-11-08 15:09:45 +01:00
vangel76 b80ac9edb9 aep: read imports through a flat tree index (#3300)
Import reads an .aep through TreeIndex, one depth-first array of chunks that
borrows the file's bytes, instead of building and freeing the owned Chunk tree
(one Vec per list). The parser mirrors read::Parser step for step: the same
chunk count order against max_chunks, the same depth limit and opaque
fallbacks, the same errors. The typed view reads through Node, a handle to a
chunk of either tree, so the accessors work unchanged on both; .aepx keeps its
owned tree. Chunk, parse and write stay for export and editing.

The array starts small and doubles, never past what the input can hold or the
chunk limit allows; a failed allocation is TooLarge, a tree past u32 indices
TooManyChunks.
2026-11-08 15:00:52 +01:00
vangel76 31b99925b0 Merge remote-tracking branch 'origin/aep-cleanup-3281' into aep-import-bounds-3299 2026-11-08 14:47:48 +01:00
vangel76 eca5424636 Merge remote-tracking branch 'origin/aep-export-dedup-3278' into aep-import-bounds-3299 2026-11-08 14:47:48 +01:00
vangel76 d2ca544404 Merge remote-tracking branch 'origin/aep-cleanup-3281' into aep-audit-3300 2026-11-08 14:23:06 +01:00
vangel76 a7456fac62 Merge remote-tracking branch 'origin/aep-export-dedup-3278' into aep-audit-3300 2026-11-08 14:23:06 +01:00
vangel76 47d988f658 Merge remote-tracking branch 'origin/aep-export-template-3277' into aep-audit-3300 2026-11-08 14:23:06 +01:00
vangel76 525250c8e0 Merge remote-tracking branch 'origin/aep-import-thirdparty' into aep-import-bounds-3299
# 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
2026-11-08 14:16:33 +01:00
vangel76 e642fe329f Merge remote-tracking branch 'origin/aep-import-lumetri' into aep-import-bounds-3299
# Conflicts:
#	docs/aep-import.md
2026-11-08 14:16:04 +01:00
vangel76 4a61b02675 Merge remote-tracking branch 'origin/aep-import-puppet-3093' into aep-import-bounds-3299 2026-11-08 14:15:53 +01:00
vangel76 22a705e689 Merge remote-tracking branch 'origin/clamp-time-stretch-3247' into aep-import-bounds-3299 2026-11-08 14:15:53 +01:00