#3456: solve again from 3D Camera Tracker tracks saved before 0.23

Analysing a tracker reused its saved tracks only when their key was
today's, so solving a 0.22 project again (after a Solve Method change)
tracked the footage again, and failed when it was offline.
This commit is contained in:
arnav-hiwarkar committed 2026-11-12 10:56:40 +05:30
1 parent cd08781aab
commit e36e25512d
2 files changed
+22 -2

No files matched your search

+1 -1
View File
@@ -334,7 +334,7 @@ impl Session {
let key = tracks_key(&self.project, comp, l, g);
let settings = ct::settings(&params);
let solve_key = ct::solve_key(&settings);
let tracks = ct::tracks(&params).filter(|_| str_of(g, TRACKS_KEY) == key);
let tracks = ct::tracks(&params).filter(|_| tracks_match(&self.project, comp, l, g));
let n = times.len();
let work = CamWork {
project: self.project.clone(),
@@ -1,7 +1,7 @@
//! Warp Stabilizer and 3D Camera Tracker analyses saved by an earlier release keep matching
//! their footage after an edit that doesn't change it (#3456), and a real change still clears them.
use effectcraft_effects::camera_tracker::{TRACKS, TRACKS_KEY};
use effectcraft_effects::camera_tracker::{SOLVE, TRACKS, TRACKS_KEY};
use effectcraft_effects::warp_stab::{ANALYSIS, ANALYSIS_KEY};
use effectcraft_keyframe::Value;
use effectcraft_project::{ItemId, LayerId, Project};
@@ -77,6 +77,26 @@ fn analyses_saved_by_0_22_survive_edits_that_keep_their_frames() {
assert_eq!(saved(&s), before);
}
/// Solving again reuses the 0.22 tracks rather than tracking the (here offline) footage again.
#[test]
fn camera_tracker_solves_again_from_tracks_saved_by_0_22() {
let mut s = open(include_str!("fixtures/tracked-0.22.ecproj"));
let tracks = saved(&s)[1].clone();
let solve = |s: &Session| {
let g = s.project.comp(COMP).unwrap().layer(CLIP).unwrap().props.find_group(TRACKER).unwrap();
crate::camera_track::static_params(g).get(SOLVE).cloned().unwrap()
};
// Another solve method, and back, clears the solve and keeps the tracks.
for method in [1, 0] {
s.execute_checked("prop.set", json!({"layer": CLIP.0, "path": "effects/#2/advanced/solveMethod", "value": method})).unwrap();
}
assert_eq!(solve(&s), Value::Str(String::new()));
assert_eq!(saved(&s)[1], tracks);
s.execute_checked("camera.analyze", json!({"layer": CLIP.0, "effect": TRACKER, "wait": true})).unwrap();
assert!(matches!(solve(&s), Value::Str(v) if !v.is_empty()));
assert_eq!(saved(&s)[1], tracks);
}
/// The footage text analysis keys are hashed from, as 0.23 saved it. A new `Footage` field must
/// not change it (or every saved analysis is dropped again).
#[test]