mirror of
https://github.com/storytold/effectcraft.git
synced 2026-10-24 18:18:17 -06:00
Fix feather points when deleting first vertex of a closed mask path
Found while testing crates/keyframe/src/value.rs:79-95 (ShapePath::feather_after_remove, called from crates/engine/src/commands/mask.rs:330) Co-Authored-By: Claude Haiku 5.5 <noreply@anthropic.com> Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Haiku 5.5
parent
9db7f3b217
commit
b3ff5d4aa6
@@ -82,7 +82,18 @@ impl ShapePath {
|
||||
if i == 0 && f.segment == 0 && !self.closed {
|
||||
return false;
|
||||
}
|
||||
if i > 0 && f.segment == i - 1 {
|
||||
if i == 0 && self.closed && segs > 0 {
|
||||
// The old closing segment and segment 0 merge into the new closing one.
|
||||
if f.segment == segs {
|
||||
f.segment = segs - 1;
|
||||
f.t *= 0.5;
|
||||
} else if f.segment == 0 {
|
||||
f.segment = segs - 1;
|
||||
f.t = 0.5 + f.t * 0.5;
|
||||
} else {
|
||||
f.segment -= 1;
|
||||
}
|
||||
} else if i > 0 && f.segment == i - 1 {
|
||||
f.t *= 0.5;
|
||||
} else if f.segment == i && i > 0 {
|
||||
f.segment = i - 1;
|
||||
|
||||
@@ -0,0 +1,14 @@
|
||||
use effectcraft_keyframe::{FeatherPoint, ShapePath};
|
||||
|
||||
#[test]
|
||||
fn removing_first_vertex_of_closed_path_merges_closing_segment() {
|
||||
let mut p = ShapePath::rect([0.0, 0.0], 10.0, 10.0);
|
||||
let fp = |segment| FeatherPoint { segment, t: 0.5, radius: 1.0, tension: 0.0 };
|
||||
p.feather = vec![fp(3), fp(0)];
|
||||
p.vertices.remove(0);
|
||||
p.in_tangents.remove(0);
|
||||
p.out_tangents.remove(0);
|
||||
p.feather_after_remove(0);
|
||||
let got: Vec<(usize, f64)> = p.feather.iter().map(|f| (f.segment, f.t)).collect();
|
||||
assert_eq!(got, vec![(2, 0.25), (2, 0.75)]);
|
||||
}
|
||||
Reference in New Issue
Block a user