Take recorded_value from #3134 for ordinary effects in import_mapped; the ValueRecord switch is gone (stored_value now reads default-state records too).
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
A record in another tdsb state is reported as damaged data again, as before the
default-state change. The synthetic test checks Levels' recorded popup directly.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
After Effects 2026 presets made by hand (1200 lumetri-58 ... -62) decode
the data the scripted samples could not set.
- RGB curve (-0039): the first of the four curves is the master curve
and arrives as curves/rgbCurves/master. A moved red, green or blue
curve is reported: no sample tells which slot is which channel.
- Hue vs Sat (-0042): y is the offset from neutral, 1 doubling the
saturation (in linear light), so EffectCraft's y is 0.5 + y / 2. The
other four hue / saturation curves stay reported when moved.
- Color Wheels (-0047): four triples of hue (degrees), brightness slider
(0.5 neutral) and distance. Shadows, Midtones and Highlights become
EffectCraft's wheel colours (HSL of that hue, saturation = distance,
lightness 0.5); the brightness sliders and the fourth wheel are
reported.
- Damaged curve or wheel data is reported as damaged.
- Legacy Tone And Saturation is reported when a record says on: its pard
default turns from off to on when the project is saved again (the
25.x / 24.x / 26 copies of 1200), so comparing with it missed it.
- The Input LUT and Look presets confirm -0095 / -0096 hold the names;
the LUT files are After Effects' own and are not embedded.
Evidence: the 62 read-backs still equal the imported values in the new
63-composition 1200 file. The version copies store the same Lumetri
definitions, ranges and values and give the same report. Renders: master
curve within 0.024 (After Effects uses a natural spline, EffectCraft's
Lumetri a monotone one), Hue vs Sat mean 0.008, wheels mean 0.042.
Part of #3111
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
After Effects records some effect parameters as value records in the
default state (tdsb 3) that still hold the value it uses. A survey of 839
corpus and sample files finds 25 such effect records, all in Lumetri
Color (its hidden controls) and Cryptomatte (Selection Mode on); every one
differs from its pard default and reads back in After Effects as recorded.
No effect record in the default state holds a value that does not count.
The general reader now takes them: EffectParam::recorded_value (the same
name, signature and body as in the Lumetri import) reads a record whatever
its state, value() and is_default() use it, and the importer's mapped
parameters read it, so such a record imports like a written one instead of
being reported as an unreadable value with the default used.
stored_value keeps to written records.
Layer, camera, light, shape and text properties in the default state all
hold After Effects' defaults or values with no effect on that layer
(the point light cone, a polygon's inner radius, a camera's opacity), so
their readers are unchanged. docs/aep-format.md records both findings.
Closes#3126
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The importer now converts After Effects' Lumetri Color. Its parameters are
found by match-name suffix, not by parT index: After Effects inserted
-0127 ... -0130 mid-list and five tone sliders share one valid range.
- Values are read from every value record, also those in the default
state (tdsb 3), where Lumetri keeps High Dynamic Range, HDR Specular and
the second Look popup (EffectParam::recorded_value; stored_value is
unchanged).
- A switched-off section, and HSL Secondary without a picked key colour,
draws nothing in After Effects: its set values are reported in one line
and not imported.
- The HSL key data is decoded into hue / saturation / lightness ranges.
- LUTs and Looks (by name), controls without a counterpart, eyedropper
colours and undecoded curves, wheels and Split Toning are reported.
- EffectCraft's Lumetri sliders take After Effects' valid ranges.
- import_param is split into lookup plus import_mapped for reuse.
Evidence: 1200 samples (After Effects 2026). The 62 read-backs of mapped
controls in sections that act equal the imported values. The other 61
lie in sections that do nothing and are reported. Renders of identity
grades are within 1/255.
Part of #3111
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Add After Effects project import with bounded parsing, explicit loss reports, and regression coverage.
Fetch the cleaned external test corpus at commit 97262276f625afdeeb61787e4cbb74b3f17af510 and verify each fixture against the pinned SHA-256 manifest.