From f532a678022d4f52a6b665bec3295254d2a3eb64 Mon Sep 17 00:00:00 2001 From: Jangidyogesh12 Date: Tue, 13 Oct 2026 13:13:53 +0530 Subject: [PATCH 1/3] feat : snapping bezier segment to x or y axis with with center at t = 0.5 --- .../messages/tool/tool_messages/path_tool.rs | 28 +++++++++++++++++-- 1 file changed, 25 insertions(+), 3 deletions(-) diff --git a/editor/src/messages/tool/tool_messages/path_tool.rs b/editor/src/messages/tool/tool_messages/path_tool.rs index 1cbb5a8951a..fe1c4de6f95 100644 --- a/editor/src/messages/tool/tool_messages/path_tool.rs +++ b/editor/src/messages/tool/tool_messages/path_tool.rs @@ -594,6 +594,7 @@ struct PathToolData { temporary_colinear_handles: bool, molding_info: Option<(DVec2, DVec2)>, molding_segment: bool, + molding_snap_origin: Option, temporary_adjacent_handles_while_molding: Option<[Option; 2]>, frontier_handles_info: Option>>>, adjacent_anchor_offset: Option, @@ -1986,7 +1987,7 @@ impl Fsm for PathToolFsmState { // Draw the snapping axis lines if tool_data.snapping_axis.is_some() { let Some(axis) = tool_data.snapping_axis else { return self }; - let origin = tool_data.drag_start_pos; + let origin = tool_data.molding_snap_origin.unwrap_or(tool_data.drag_start_pos); let viewport_diagonal = viewport.size().into_dvec2().length(); match axis { @@ -2123,16 +2124,38 @@ impl Fsm for PathToolFsmState { } let break_molding = input.keyboard.get(break_colinear_molding as usize); + let snap_angle_state = input.keyboard.get(snap_angle as usize); // Logic for molding segment if let Some(segment) = &mut tool_data.segment && let Some(molding_segment_handles) = tool_data.molding_info { + let mouse_position = if snap_angle_state { + let transform = document.metadata().transform_to_viewport_if_feeds(segment.layer(), &document.network_interface); + let parametric_bezier_mid = point_to_dvec2(segment.pathseg().eval(0.5)); + let mid = transform.transform_point2(parametric_bezier_mid); + + tool_data.molding_snap_origin = Some(mid); + let drag_start = tool_data.drag_start_pos; + + let delta = input.mouse.position - drag_start; + tool_data.snapping_axis = Some(if delta.x.abs() >= delta.y.abs() { Axis::X } else { Axis::Y }); + match tool_data.snapping_axis { + Some(Axis::X) => DVec2::new(input.mouse.position.x, drag_start.y), + Some(Axis::Y) => DVec2::new(drag_start.x, input.mouse.position.y), + _ => input.mouse.position, + } + } else { + tool_data.snapping_axis = None; + tool_data.molding_snap_origin = None; + input.mouse.position + }; + tool_data.temporary_adjacent_handles_while_molding = segment.mold_handle_positions( document, responses, molding_segment_handles, - input.mouse.position, + mouse_position, break_molding, tool_data.temporary_adjacent_handles_while_molding, ); @@ -2166,7 +2189,6 @@ impl Fsm for PathToolFsmState { let toggle_colinear_state = input.keyboard.get(toggle_colinear as usize); let equidistant_state = input.keyboard.get(equidistant as usize); let lock_angle_state = input.keyboard.get(lock_angle as usize); - let snap_angle_state = input.keyboard.get(snap_angle as usize); if !lock_angle_state { tool_data.angle_locked = false; From b978c1456c03a84ed6481bf4310ecde05f1c3947 Mon Sep 17 00:00:00 2001 From: Jangidyogesh12 Date: Tue, 13 Oct 2026 13:48:06 +0530 Subject: [PATCH 2/3] ran formating and test command --- editor/src/messages/tool/tool_messages/path_tool.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/editor/src/messages/tool/tool_messages/path_tool.rs b/editor/src/messages/tool/tool_messages/path_tool.rs index 23aae363920..5dcf8be4219 100644 --- a/editor/src/messages/tool/tool_messages/path_tool.rs +++ b/editor/src/messages/tool/tool_messages/path_tool.rs @@ -2140,7 +2140,7 @@ impl Fsm for PathToolFsmState { let transform = document.metadata().transform_to_viewport_if_feeds(segment.layer(), &document.network_interface); let parametric_bezier_mid = point_to_dvec2(segment.pathseg().eval(0.5)); let mid = transform.transform_point2(parametric_bezier_mid); - + tool_data.molding_snap_origin = Some(mid); let drag_start = tool_data.drag_start_pos; From 8549cb82e5833d44daa9030fa57b511180da27c8 Mon Sep 17 00:00:00 2001 From: Jangidyogesh12 Date: Tue, 13 Oct 2026 14:28:46 +0530 Subject: [PATCH 3/3] chore : cleared mold_snap_origin and snap_axis to avoide stale value --- editor/src/messages/tool/tool_messages/path_tool.rs | 3 +++ 1 file changed, 3 insertions(+) diff --git a/editor/src/messages/tool/tool_messages/path_tool.rs b/editor/src/messages/tool/tool_messages/path_tool.rs index 5dcf8be4219..749b3482810 100644 --- a/editor/src/messages/tool/tool_messages/path_tool.rs +++ b/editor/src/messages/tool/tool_messages/path_tool.rs @@ -2413,6 +2413,8 @@ impl Fsm for PathToolFsmState { } tool_data.molding_info = None; tool_data.molding_segment = false; + tool_data.molding_snap_origin = None; + tool_data.snapping_axis = None; tool_data.temporary_adjacent_handles_while_molding = None; tool_data.angle_locked = false; responses.add(DocumentMessage::AbortTransaction); @@ -2664,6 +2666,7 @@ impl Fsm for PathToolFsmState { tool_data.snapping_axis = None; tool_data.sliding_point_info = None; + tool_data.snapping_axis = None; if drag_occurred || extend_selection { responses.add(DocumentMessage::EndTransaction);