* AEP import: map the Cryptomatte plug-in to EffectCraft's Cryptomatte
The importer reported every instance of the free Cryptomatte plug-in
(match name `Cryptomatte`) as a lost effect. It now becomes
`ec.3d.cryptomatte`:
- CryptomatteData decodes the plug-in's Settings data (its own
little-endian layout, documented in docs/aep-format.md 3.7): the
Cryptomatte layer name and the selection text, both carried verbatim.
- Output maps to Display / Matte Only (Colors -> Colors, Matted RGBA ->
Matte, Matte Only -> Matte Only). Matted Colors, Selection Mode when on,
keys or expressions and anything else stored are reported, and
unreadable data is reported as damaged.
- EffectCraft's Cryptomatte gains a Layer Name text parameter. A layer the
footage has under exactly that name wins; otherwise the Layer popup
decides as before. The CPU, GPU and pick paths share one resolver
(AuxChannels::resolve_crypto_layer_named). Without it, plug-in layer
names such as Crypto_Material would silently fall back to the first
layer.
On a real production project this takes the effect losses from 132 to 44.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* AEP import: check Cryptomatte against an After Effects 2026 sample of our own
A sample made in After Effects 2026 (plug-in 2.6.6: a fresh effect,
Selection Mode on, each Output item, with read-backs and renders)
corrected three points of the mapping:
- Selection Mode on was dropped silently: After Effects writes it as a
default-state record (tdsb 3) holding 1, which the general reader does
not take. The Cryptomatte step reads that record itself and reports it.
- No Output record is now the plug-in's default Colors, also for an
instance that borrows the project's definition (every instance after
the first), which was reported as having no reliable default and fell
back to EffectCraft's Preview. Keyed or unreadable Output values fall
back to Colors too, still reported.
- Matted Colors imports as Display Matte (the same matte over the layer's
own colours) instead of Preview, still reported as an approximation.
docs/aep-format.md 3.7 gets the sampled Output default, the tdsb 3
Selection Mode record and the real fresh Settings data (an empty text of
length 1 and its MurmurHash3, twice, not cry1 and zeros); docs/aep-import.md
the render comparison with After Effects (Matted RGBA matches; Matte Only
differs in alpha; Colors with no layer chosen shows another layer).
Tests: the exact fresh Settings bytes, tdsb 3 Selection Mode, borrowed
definitions, and an opt-in test against the sample once it is in the
corpus (aep/cryptomatte.aep, ignored until the corpus pin includes it).
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* AEP import: write Cryptomatte's popup items in the test as After Effects does
The injected Cryptomatte definition wrote `pdnm` and `fnam` as `LIST`
chunks. After Effects writes them as plain chunks whose body is chunks
(`NESTED_IDS`), and the reader only looks there, so the tests never read
Output's item names: they passed through the fallback for a definition
with four items and no `pdnm`, which uses the plug-in's own list.
The harness now writes both as After Effects does. New tests check that
the injected definition reads back with its items and instance name,
that Output is mapped by the item the stored index names (items in
another order, case, an unknown item), and that the fallback without a
`pdnm` still works. With the old `LIST` form, or with the mapping
ignoring the items, the new tests fail.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* AEP import: check Cryptomatte's layer and selection against presets of our own
The After Effects 2026 sample 1400 now has two preset compositions that choose a layer and
pick one object (box_red on CryptoObject) or one material (mat_paint on CryptoMaterial).
CryptomatteData reads both as they are; the picked tokens are the EXR manifest's hashes,
which EffectCraft's selection grammar reads the same as the names.
- The u32 at 108 is MurmurHash3 of the selection text with its NUL (three texts).
- A unit test pins the 127-byte preset data; the sample test now covers all eight
compositions with their layer and selection.
- Render check: EffectCraft's matte covers exactly the pixels After Effects draws as
selected, edge coverage within 0.0002. docs/aep-format.md 3.7 and docs/aep-import.md.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Cryptomatte import: report damaged Settings and Selection Mode records
Review follow-ups for #3109:
- CryptomatteData refuses a selection text without its NUL and checks the zero byte
at 112 for an empty text too.
- A Settings record without its data, and a Selection Mode record whose value cannot
be read, are reported as damaged data, not taken as the default.
- Layer Name is the effect's last parameter, so the earlier parameters keep their
indexes and upgraded instances have the same order as new ones.
- A Cryptomatte layer name is matched as given before it is trimmed.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Cryptomatte settings: require the selection's NUL to end its declared length
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Cryptomatte: match rank planes by the exact layer name
crypto_rank_planes looked planes up with a case-insensitive whole-name match, so
layers Crypto_A and crypto_a shared planes. The layer prefix now matches
case-sensitively; component letters still match in either case.
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
* Format
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
* AEP: the exporter knows Extra::Cryptomatte; rustfmt
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
---------
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
Co-authored-by: FredApps <153173854+FredApps@users.noreply.github.com>
* Cryptomatte: the Layer popup lists the footage's Cryptomatte layers (#473)
The popup was the constant CryptoObject / CryptoMaterial / CryptoAsset. It now lists the
Cryptomatte layers of the layer's OpenEXR footage, and those three when there are none. The
stored value keeps its meaning (0-2 the standard layers, 3 and up the file's other layers in
name order), so older projects render the same.
Refs #473
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
* Cryptomatte Layer popup: timeline editor, one menu helper, probe and fallback tests (#473)
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
* Cryptomatte Layer popup: give further layers of a standard kind a custom slot
A.CryptoObject keeps slot 0; B.CryptoObject and later ones get 3+ instead of
being dropped, so they can be selected, picked and rendered.
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
* Format; note same-kind layers in the footage docs
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
* Format the merged code with rustfmt
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
---------
Co-authored-by: Claude Sonnet 5.5 <noreply@anthropic.com>
With Matte Only on, Cryptomatte wrote the matte into all four channels:
a premultiplied white only as opaque as the matte. After Effects'
Cryptomatte plug-in shows Matte Only as an opaque grey picture, the
matte in RGB with alpha 1 (its Matte Only render of 2026-11-05 is opaque
black where nothing is selected). The CPU effect and the GPU shader now
both give (m, m, m, 1).
Projects saved before keep their render: a hidden Matte Only In Alpha
switch (off for new instances, presets and AEP imports) is turned on by
migrate::legacy_default when an older instance is upgraded on open, and
then keeps the matte in every channel on CPU and GPU.
Tests: the CPU path for a partly covered pixel, an unselected one and
outside the aux area, in both forms; the upgrade of a saved instance;
the GPU parity test over every display with Matte Only off, on and on
with the legacy switch; the host pick tests read whole pixels.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
crypto_aux_image_with takes CryptoAux::{ColorsAndMatte, MatteOnly}, and
CryptoAux::for_display holds the rule for which displays read the ID
colours. A new GPU test checks every display x Matte Only against the CPU,
so the GPU fails the test if the shader starts reading RGB in a mode that
skips it (checked by mutation: forcing MatteOnly fails display 0).
Output is bit-identical (all displays, CPU and GPU). At 2560x1440 with 3 ranks and 2000 IDs on 8 cores the CPU effect drops from ~87-135 ms to ~44-54 ms and the GPU path's aux reduction from 38 to 8 ms for Matte, Preview and Matte Only.
AuxChannels::crypto_rank_planes resolves a layer's (ID, coverage) planes once; crypto_ranks keeps its signature on top of it. The CPU effect and the GPU effect's aux image (effectcraft_effects::crypto_aux_image, rayon) index the planes per pixel. Output is bit-identical.
3D Channel Extract, Cryptomatte, Depth Matte, Depth of Field, EXtractoR, Fog 3D,
ID Matte and IDentifier run on the GPU (fx_depth.rs / fx_depth.wgsl): aux planes
upload as a texture and are resampled onto the buffer grid with the CPU's index
arithmetic; tests compare against the CPU at 1x / 2x aux resolution, padded
buffers, half resolution and 8 / 32 bpc composites.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>