mirror of
https://github.com/storytold/effectcraft.git
synced 2026-10-14 19:27:05 -04:00
Convert Expression to Keyframes: sort the keys by layer time on a time-reversed layer (#531)
This commit is contained in:
1 parent
1446e27d85
commit
60a85e97d4
2 files changed
+21
No files matched your search
@@ -981,6 +981,8 @@ fn convert_expr_to_keys(s: &mut Session, p: &Value) -> Result<Value> {
|
||||
keys.push(Keyframe::new(layer.layer_time(t), ctx.value(&layer, &pr)));
|
||||
t += fd;
|
||||
}
|
||||
// A time-reversed layer maps ascending comp times to descending layer times; keys must stay ordered by layer time.
|
||||
keys.sort_by_key(|k| k.time);
|
||||
let n = keys.len();
|
||||
with_prop(s, "Convert Expression to Keyframes", None, cid, lid, uid, move |pr, _| {
|
||||
pr.keys = keys;
|
||||
|
||||
@@ -242,6 +242,25 @@ fn graph_editor_key_and_handle_edits() {
|
||||
assert_eq!(prop(&s, l, "transform/opacity").keys[0].out_interp, Interp::Linear);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn convert_expression_to_keyframes_on_a_reversed_layer_keeps_values() {
|
||||
let (mut s, l) = setup();
|
||||
// These tests run without an expression host, so the conversion bakes the keyed ramp under the expression.
|
||||
animate(&mut s, l, "transform/rotation", &[(0.0, json!(0)), (3.0, json!(30))]);
|
||||
s.execute("prop.setExpression", json!({"layer": l, "path": "transform/rotation", "expression": "value"})).unwrap();
|
||||
s.execute("layer.timeReverse", json!({"layers": [l]})).unwrap();
|
||||
let at = |t: f64| json!({"layer": l, "path": "transform/rotation", "time": t});
|
||||
let sample = |s: &mut Session| [0.5, 1.0, 2.0].map(|t| s.execute("prop.get", at(t)).unwrap()["value"].as_f64().unwrap());
|
||||
let before = sample(&mut s);
|
||||
assert!(before[0] > before[1] && before[1] > before[2], "{before:?}");
|
||||
s.execute("prop.convertExpressionToKeyframes", json!({"layer": l, "path": "transform/rotation"})).unwrap();
|
||||
let keys = prop(&s, l, "transform/rotation").keys;
|
||||
assert!(keys.len() > 1);
|
||||
assert!(keys.windows(2).all(|w| w[0].time < w[1].time));
|
||||
let after = sample(&mut s);
|
||||
assert!(before.iter().zip(after).all(|(b, a)| (b - a).abs() < 1e-6), "{before:?} -> {after:?}");
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn time_reverse_keyframes() {
|
||||
let (mut s, l) = setup();
|
||||
|
||||
Reference in new issue
Block a user