Under a tilted parent, the converted keys alone give a different path between them, since Euler
angles are blended. Keys are now added wherever the blend drifts more than 0.05 degrees from the
exact rotation (halving each segment, at most 10 times and 4096 keys). The segments become straight
blends with the original easing baked in; hold segments are kept.
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Euler angles are blended between keys, so re-expressing only the key values cannot keep the motion
between them under a tilted parent. Keyed Orientation is now re-expressed only for a Z-only
correction, which shifts Z exactly at every time; static Orientation is unchanged.
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Parenting a 3D layer under a rotated uniform parent now re-expresses keyed Orientation at every key,
not only the static value. A Z-only correction shifts Z exactly, so the paths between keys stay
exact. Other corrections keep each key's authored turns, so the Euler values stay continuous. This
changes keyed 3D layers under any rotated uniform parent, not only cameras and lights.
The boundary test now sets the non-uniform parent before the animated and static cases, so both
keep their authored pose.
Co-Authored-By: Claude Haiku 5.5 <noreply@anthropic.com>
Parenting a camera or light to a rotated uniform null now re-expresses its static Orientation, so a
one-node light or camera keeps its direction. A two-node camera or light also keeps its roll: its
Orientation is re-expressed against its new aim (aim_correction), so Up does not drift. Keyed
Orientation is still left as authored; a later commit re-expresses it.
Co-Authored-By: Claude Haiku 5.5 <noreply@anthropic.com>
uniform_parent_pose took the Y angle from asin, which loses precision within about 1e-6 degrees of
+-90. The Y angle now comes from atan2 on cos(Y), as the X and Z angles already do. The gimbal
branch and the principal-range output are unchanged.
A new test parents a static Orientation with Y 1e-6 degrees off gimbal lock under a uniform
parent. Its largest corner displacement was 3.3e-8 px before this change and 1.5e-14 px after.
Co-Authored-By: Claude Haiku 5.5 <noreply@anthropic.com>
Parenting a camera or light (layer.setParent, compensate on) now re-expresses its Position and
Point of Interest in the new parent's space, like the other 3D layers. The 3D loop in parent_fixes
skipped cameras and lights, so their positions stayed in the old space and the camera moved by the
null's offset. Orientation is still left as authored; a later commit re-expresses it.
Co-Authored-By: Claude Haiku 5.5 <noreply@anthropic.com>
- Renderer: no cover step for adjustment layers (#686); their buffer is the comp below.
Restores a single CPU step in split adjustment stacks.
- Effect Controls rename (#953): focus the name field the frame it exists. Focusing an id
not yet drawn left AccessKit with a focus outside its tree (a panic in the consumer).
The tests double-click at 60 fps, within egui's double-click time.
- i18n: Russian, French and German entries for Copy Frame to Clipboard and the extrusion
Front/Bevel/Side/Back Color submenus added by today's other PRs.
- Tests: "fr" is now a valid language; the marker dialog's comment is focused on open
(#922), so Enter-is-OK is tested with the focus elsewhere; the toolbar gradient tests
give the selected layer its paint kind, since the toolbar mirrors it (#732).
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Viewer: each composition keeps its Resolution in the project, as in After Effects (#417)
# Conflicts:
# crates/ui-egui/src/control.rs
# crates/ui-egui/src/menus.rs
# crates/ui-egui/src/panels/viewer_tools.rs
- GPU Pixel Motion Blur (#695) declined without a host; it now averages the shutter's
frames like the CPU effect (tests_fx_time::without_a_host).
- add_item_keeps_footage_longer_than_the_comp_at_full_length (#798) built footage with
the default kind (Still), which adds at comp length; it is a movie.
- docs/effects.md regenerated.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Opening movies in place (#796) skipped the whole-file bytes #827 read the
track matrix from, so the pool and the probe lost the turn for movies on
disk. stream::movie_header reads just the ftyp and moov boxes (bounded,
positional reads) and both in-place paths derive the orientation from it.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Keep every entry in contributors/people.toml, and translate the new menu
item (Copy Frame to Clipboard) and the five gradient-editor strings into
Czech.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Czech for all 618 fixed menu entries and the 496 panel, tooltip and dialog
strings of the most complete catalog; settings accept and persist `cs`, Match
System recognises cs, cs-CZ and cs_CZ.UTF-8; native menu, Undo/Redo and
file-manager labels. Czech may lag the Chinese catalogs like Japanese and
Ukrainian (a missing row falls back to English); menu rows use "..." like
the other catalogs. AI-assisted, independently reviewed, not yet proofread
by a native speaker.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>