From 7681f6f16cdab41f5fb36567a134e4a6cdee559b Mon Sep 17 00:00:00 2001 From: Aditya Garud <153842990+yashranaway@users.noreply.github.com> Date: Wed, 21 Oct 2026 12:05:19 +0000 Subject: [PATCH 1/2] fix(rendering): clamp scene exit transitions to their duration --- crates/rendering/src/scene.rs | 45 ++++++++++++++++++++++++++++++++++- 1 file changed, 44 insertions(+), 1 deletion(-) diff --git a/crates/rendering/src/scene.rs b/crates/rendering/src/scene.rs index 6c12e8152a8..858e5e6c153 100644 --- a/crates/rendering/src/scene.rs +++ b/crates/rendering/src/scene.rs @@ -108,7 +108,10 @@ impl InterpolatedScene { let (current_mode, next_mode, transition_progress) = if let Some(segment) = cursor.segment { let transition_in = segment.transition_in.max(0.0); - let transition_out = segment.transition_out.max(0.0); + let transition_out = segment + .transition_out + .min(segment.end - segment.start) + .max(0.0); let transition_start = segment.start - transition_in; let transition_end = segment.end - transition_out; @@ -382,6 +385,46 @@ mod tests { } } + #[test] + fn long_exit_transition_does_not_jump_at_scene_start() { + let values = |scene: InterpolatedScene| { + [ + scene.camera_opacity, + scene.camera_only_transition_opacity(), + scene.camera_only_zoom, + scene.split_factor, + scene.floating_factor, + ] + }; + for mode in [ + SceneMode::CameraOnly, + SceneMode::HideCamera, + SceneMode::SplitScreen, + SceneMode::Floating, + ] { + for duration in [0.1, 1.0] { + let segments = [SceneSegment { + end: 2.0 + duration, + mode, + transition_out: 2.0, + ..camera_scene(0.3) + }]; + let before = values(scene_at(2.0 - 1e-6, &segments)); + let start = values(scene_at(2.0, &segments)); + for (before, start) in before.into_iter().zip(start) { + assert!( + (before - start).abs() < 1e-5, + "{mode:?}, {duration}s: jumped from {before} to {start}" + ); + } + let midpoint = scene_at(2.0 + duration / 2.0, &segments); + assert!((midpoint.transition_progress - 0.5).abs() < 1e-5); + let end = scene_at(segments[0].end, &segments); + assert!(matches!(end.scene_mode, SceneMode::Default)); + } + } + } + #[test] fn camera_only_blur_tracks_motion_at_both_boundaries() { let segments = [camera_scene(0.3)]; From 1a083c6bf1d3cd6cccd988fae372f1df9f3dccb8 Mon Sep 17 00:00:00 2001 From: Aditya Garud <153842990+yashranaway@users.noreply.github.com> Date: Thu, 22 Oct 2026 05:54:30 +0000 Subject: [PATCH 2/2] fix(rendering): use clamp for the scene exit transition cap --- crates/rendering/src/scene.rs | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/crates/rendering/src/scene.rs b/crates/rendering/src/scene.rs index 858e5e6c153..49fbde5eb5d 100644 --- a/crates/rendering/src/scene.rs +++ b/crates/rendering/src/scene.rs @@ -110,8 +110,7 @@ impl InterpolatedScene { let transition_in = segment.transition_in.max(0.0); let transition_out = segment .transition_out - .min(segment.end - segment.start) - .max(0.0); + .clamp(0.0, (segment.end - segment.start).max(0.0)); let transition_start = segment.start - transition_in; let transition_end = segment.end - transition_out;