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>
- Footage sources: the cancellable wrapper (#784) forwards frame_with (#752 float curves)
and problem (#887); problem's default lives on the trait.
- Media: a called-off decode (#784) is not a footage problem (#887).
- Effect Controls rename (#953): Escape cancels (egui drops focus on Escape the same
frame), the Rename item is translated; regression test.
- i18n (#873): drop the /out-i18n/ ignore rule and the note about an uncommitted script.
- Tests: text range selector caps (#926) re-borrow the layer; the RAM preview test (#793)
sets the comp's own Resolution (#462).
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