From 9c72b1afb6b44d490787dbc95260afff95661f31 Mon Sep 17 00:00:00 2001 From: "DESKTOP-H5OV7DN\\Mohamed Osama" Date: Fri, 18 Apr 2025 02:33:03 +0200 Subject: [PATCH 1/4] line midpoint snapper --- .../messages/tool/tool_messages/line_tool.rs | 24 +++++++++++++++---- 1 file changed, 20 insertions(+), 4 deletions(-) diff --git a/editor/src/messages/tool/tool_messages/line_tool.rs b/editor/src/messages/tool/tool_messages/line_tool.rs index 7e8fa5be97..a8c55aaccc 100644 --- a/editor/src/messages/tool/tool_messages/line_tool.rs +++ b/editor/src/messages/tool/tool_messages/line_tool.rs @@ -394,6 +394,7 @@ fn generate_line(tool_data: &mut LineToolData, snap_data: SnapData, lock_angle: let near_point = SnapCandidatePoint::handle_neighbors(document_points[1], [tool_data.drag_start]); let far_point = SnapCandidatePoint::handle_neighbors(2. * document_points[0] - document_points[1], [tool_data.drag_start]); + let mid_point = SnapCandidatePoint::handle_neighbors((tool_data.drag_start + document_points[1]) / 2.0, [tool_data.drag_start]); let config = SnapTypeConfiguration::default(); if constrained { @@ -410,8 +411,15 @@ fn generate_line(tool_data: &mut LineToolData, snap_data: SnapData, lock_angle: snap.update_indicator(best); } else { let snapped = snap.constrained_snap(&snap_data, &near_point, constraint, config); - document_points[1] = snapped.snapped_point_document; - snap.update_indicator(snapped); + let snapped_mid = snap.constrained_snap(&snap_data, &mid_point, constraint, config); + let best = if snapped_mid.other_snap_better(&snapped) { + document_points[1] = snapped.snapped_point_document; + snapped.clone() + } else { + document_points[1] += (snapped_mid.snapped_point_document - mid_point.document_point) * 2.0; + snapped_mid + }; + snap.update_indicator(best); } } else if center { let snapped = snap.free_snap(&snap_data, &near_point, config); @@ -422,8 +430,16 @@ fn generate_line(tool_data: &mut LineToolData, snap_data: SnapData, lock_angle: snap.update_indicator(best); } else { let snapped = snap.free_snap(&snap_data, &near_point, config); - document_points[1] = snapped.snapped_point_document; - snap.update_indicator(snapped); + let snapped_mid = snap.free_snap(&snap_data, &mid_point, config); + let best = if snapped_mid.other_snap_better(&snapped) { + document_points[1] = snapped.snapped_point_document; + snapped.clone() + } else { + document_points[1] += (snapped_mid.snapped_point_document - mid_point.document_point) * 2.0; + snapped_mid + }; + //document_points[1] = snapped.snapped_point_document; + snap.update_indicator(best); } // Snapping happens in other space, while document graph renders in another. From f486507ce3f9779033c7b8b7c9df0d319df2787d Mon Sep 17 00:00:00 2001 From: "DESKTOP-H5OV7DN\\Mohamed Osama" Date: Fri, 18 Apr 2025 04:02:37 +0200 Subject: [PATCH 2/4] Add to snap option menu --- .../portfolio/document/utility_types/misc.rs | 9 ++++++++- .../messages/tool/tool_messages/line_tool.rs | 19 +++++++++---------- 2 files changed, 17 insertions(+), 11 deletions(-) diff --git a/editor/src/messages/portfolio/document/utility_types/misc.rs b/editor/src/messages/portfolio/document/utility_types/misc.rs index 64633f197d..9396e14ec3 100644 --- a/editor/src/messages/portfolio/document/utility_types/misc.rs +++ b/editor/src/messages/portfolio/document/utility_types/misc.rs @@ -144,6 +144,7 @@ pub struct PathSnapping { pub path_intersection_point: bool, pub align_with_anchor_point: bool, // TODO: Rename pub perpendicular_from_endpoint: bool, + pub being_drawn_line_midpoint: bool, } impl Default for PathSnapping { @@ -157,6 +158,7 @@ impl Default for PathSnapping { path_intersection_point: true, align_with_anchor_point: true, perpendicular_from_endpoint: true, + being_drawn_line_midpoint: true, } } } @@ -380,7 +382,7 @@ impl fmt::Display for SnapSource { } type GetSnapState = for<'a> fn(&'a mut SnappingState) -> &'a mut bool; -pub const SNAP_FUNCTIONS_FOR_BOUNDING_BOXES: [(&str, GetSnapState, &str); 5] = [ +pub const SNAP_FUNCTIONS_FOR_BOUNDING_BOXES: [(&str, GetSnapState, &str); 6] = [ ( "Align with Edges", (|snapping_state| &mut snapping_state.bounding_box.align_with_edges) as GetSnapState, @@ -407,6 +409,11 @@ pub const SNAP_FUNCTIONS_FOR_BOUNDING_BOXES: [(&str, GetSnapState, &str); 5] = [ // TODO: Fix the bug/limitation that requires 'Center Points' and 'Corner Points' to be enabled "Snaps to a consistent distance offset established by the bounding boxes of nearby layers\n(due to a bug, 'Center Points' and 'Corner Points' must be enabled)", ), + ( + "Being Drawn Line Midpoint", + (|snapping_state: &mut SnappingState| &mut snapping_state.path.being_drawn_line_midpoint) as GetSnapState, + "Snaps a being drawn lines's midpoint to a vector path)", + ), ]; pub const SNAP_FUNCTIONS_FOR_PATHS: [(&str, GetSnapState, &str); 7] = [ ( diff --git a/editor/src/messages/tool/tool_messages/line_tool.rs b/editor/src/messages/tool/tool_messages/line_tool.rs index a8c55aaccc..71e2edbc6a 100644 --- a/editor/src/messages/tool/tool_messages/line_tool.rs +++ b/editor/src/messages/tool/tool_messages/line_tool.rs @@ -394,7 +394,7 @@ fn generate_line(tool_data: &mut LineToolData, snap_data: SnapData, lock_angle: let near_point = SnapCandidatePoint::handle_neighbors(document_points[1], [tool_data.drag_start]); let far_point = SnapCandidatePoint::handle_neighbors(2. * document_points[0] - document_points[1], [tool_data.drag_start]); - let mid_point = SnapCandidatePoint::handle_neighbors((tool_data.drag_start + document_points[1]) / 2.0, [tool_data.drag_start]); + let mid_point = SnapCandidatePoint::handle_neighbors((tool_data.drag_start + document_points[1]) / 2., [tool_data.drag_start]); let config = SnapTypeConfiguration::default(); if constrained { @@ -412,12 +412,12 @@ fn generate_line(tool_data: &mut LineToolData, snap_data: SnapData, lock_angle: } else { let snapped = snap.constrained_snap(&snap_data, &near_point, constraint, config); let snapped_mid = snap.constrained_snap(&snap_data, &mid_point, constraint, config); - let best = if snapped_mid.other_snap_better(&snapped) { + let best = if snap_data.document.snapping_state.path.being_drawn_line_midpoint && snapped_mid.other_snap_better(&snapped_mid) { + document_points[1] += (snapped_mid.snapped_point_document - mid_point.document_point) * 2.; + snapped_mid + } else { document_points[1] = snapped.snapped_point_document; snapped.clone() - } else { - document_points[1] += (snapped_mid.snapped_point_document - mid_point.document_point) * 2.0; - snapped_mid }; snap.update_indicator(best); } @@ -431,14 +431,13 @@ fn generate_line(tool_data: &mut LineToolData, snap_data: SnapData, lock_angle: } else { let snapped = snap.free_snap(&snap_data, &near_point, config); let snapped_mid = snap.free_snap(&snap_data, &mid_point, config); - let best = if snapped_mid.other_snap_better(&snapped) { + let best = if snap_data.document.snapping_state.path.being_drawn_line_midpoint && snapped_mid.other_snap_better(&snapped_mid) { + document_points[1] += (snapped_mid.snapped_point_document - mid_point.document_point) * 2.; + snapped_mid + } else { document_points[1] = snapped.snapped_point_document; snapped.clone() - } else { - document_points[1] += (snapped_mid.snapped_point_document - mid_point.document_point) * 2.0; - snapped_mid }; - //document_points[1] = snapped.snapped_point_document; snap.update_indicator(best); } From 740f37846ef46a9857167baf5d05c84d98dd4c5a Mon Sep 17 00:00:00 2001 From: "DESKTOP-H5OV7DN\\Mohamed Osama" Date: Fri, 18 Apr 2025 04:52:28 +0200 Subject: [PATCH 3/4] remove being_drawn_line_midpoint --- .../messages/portfolio/document/utility_types/misc.rs | 9 +-------- editor/src/messages/tool/tool_messages/line_tool.rs | 4 ++-- 2 files changed, 3 insertions(+), 10 deletions(-) diff --git a/editor/src/messages/portfolio/document/utility_types/misc.rs b/editor/src/messages/portfolio/document/utility_types/misc.rs index 9396e14ec3..64633f197d 100644 --- a/editor/src/messages/portfolio/document/utility_types/misc.rs +++ b/editor/src/messages/portfolio/document/utility_types/misc.rs @@ -144,7 +144,6 @@ pub struct PathSnapping { pub path_intersection_point: bool, pub align_with_anchor_point: bool, // TODO: Rename pub perpendicular_from_endpoint: bool, - pub being_drawn_line_midpoint: bool, } impl Default for PathSnapping { @@ -158,7 +157,6 @@ impl Default for PathSnapping { path_intersection_point: true, align_with_anchor_point: true, perpendicular_from_endpoint: true, - being_drawn_line_midpoint: true, } } } @@ -382,7 +380,7 @@ impl fmt::Display for SnapSource { } type GetSnapState = for<'a> fn(&'a mut SnappingState) -> &'a mut bool; -pub const SNAP_FUNCTIONS_FOR_BOUNDING_BOXES: [(&str, GetSnapState, &str); 6] = [ +pub const SNAP_FUNCTIONS_FOR_BOUNDING_BOXES: [(&str, GetSnapState, &str); 5] = [ ( "Align with Edges", (|snapping_state| &mut snapping_state.bounding_box.align_with_edges) as GetSnapState, @@ -409,11 +407,6 @@ pub const SNAP_FUNCTIONS_FOR_BOUNDING_BOXES: [(&str, GetSnapState, &str); 6] = [ // TODO: Fix the bug/limitation that requires 'Center Points' and 'Corner Points' to be enabled "Snaps to a consistent distance offset established by the bounding boxes of nearby layers\n(due to a bug, 'Center Points' and 'Corner Points' must be enabled)", ), - ( - "Being Drawn Line Midpoint", - (|snapping_state: &mut SnappingState| &mut snapping_state.path.being_drawn_line_midpoint) as GetSnapState, - "Snaps a being drawn lines's midpoint to a vector path)", - ), ]; pub const SNAP_FUNCTIONS_FOR_PATHS: [(&str, GetSnapState, &str); 7] = [ ( diff --git a/editor/src/messages/tool/tool_messages/line_tool.rs b/editor/src/messages/tool/tool_messages/line_tool.rs index 71e2edbc6a..7cbda027be 100644 --- a/editor/src/messages/tool/tool_messages/line_tool.rs +++ b/editor/src/messages/tool/tool_messages/line_tool.rs @@ -412,7 +412,7 @@ fn generate_line(tool_data: &mut LineToolData, snap_data: SnapData, lock_angle: } else { let snapped = snap.constrained_snap(&snap_data, &near_point, constraint, config); let snapped_mid = snap.constrained_snap(&snap_data, &mid_point, constraint, config); - let best = if snap_data.document.snapping_state.path.being_drawn_line_midpoint && snapped_mid.other_snap_better(&snapped_mid) { + let best = if snap_data.document.snapping_state.path.line_midpoint && snapped_mid.other_snap_better(&snapped_mid) { document_points[1] += (snapped_mid.snapped_point_document - mid_point.document_point) * 2.; snapped_mid } else { @@ -431,7 +431,7 @@ fn generate_line(tool_data: &mut LineToolData, snap_data: SnapData, lock_angle: } else { let snapped = snap.free_snap(&snap_data, &near_point, config); let snapped_mid = snap.free_snap(&snap_data, &mid_point, config); - let best = if snap_data.document.snapping_state.path.being_drawn_line_midpoint && snapped_mid.other_snap_better(&snapped_mid) { + let best = if snap_data.document.snapping_state.path.line_midpoint && snapped_mid.other_snap_better(&snapped_mid) { document_points[1] += (snapped_mid.snapped_point_document - mid_point.document_point) * 2.; snapped_mid } else { From ad1179f29aae56bbfc5881fa2dc5c640af0cfe1c Mon Sep 17 00:00:00 2001 From: Keavon Chambers Date: Tue, 29 Apr 2025 22:01:07 -0700 Subject: [PATCH 4/4] Code review --- .../portfolio/document/utility_types/network_interface.rs | 1 - editor/src/messages/tool/tool_messages/line_tool.rs | 3 ++- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/editor/src/messages/portfolio/document/utility_types/network_interface.rs b/editor/src/messages/portfolio/document/utility_types/network_interface.rs index 70541b6cfc..db083e5409 100644 --- a/editor/src/messages/portfolio/document/utility_types/network_interface.rs +++ b/editor/src/messages/portfolio/document/utility_types/network_interface.rs @@ -4198,7 +4198,6 @@ impl NodeNetworkInterface { let Some(downstream_nodes) = outward_wires.get(¤t_node) else { continue }; for downstream_node in downstream_nodes { if let InputConnector::Node { node_id: downstream_id, .. } = downstream_node { - let downstream_node_output = OutputConnector::node(*downstream_id, 0); if !delete_nodes.contains(downstream_id) { can_delete = false; break; diff --git a/editor/src/messages/tool/tool_messages/line_tool.rs b/editor/src/messages/tool/tool_messages/line_tool.rs index d786cedadb..0bd281a620 100644 --- a/editor/src/messages/tool/tool_messages/line_tool.rs +++ b/editor/src/messages/tool/tool_messages/line_tool.rs @@ -448,7 +448,8 @@ fn generate_line(tool_data: &mut LineToolData, snap_data: SnapData, lock_angle: #[cfg(test)] mod test_line_tool { use crate::messages::portfolio::document::graph_operation::utility_types::TransformIn; - use crate::{messages::tool::common_functionality::graph_modification_utils::NodeGraphLayer, test_utils::test_prelude::*}; + use crate::messages::tool::common_functionality::graph_modification_utils::NodeGraphLayer; + use crate::test_utils::test_prelude::*; use glam::DAffine2; use graph_craft::document::value::TaggedValue;