Skip to content

Commit

Permalink
Fixes constrained snap when using compass axes; Fix line banding
Browse files Browse the repository at this point in the history
  • Loading branch information
mTvare6 committed Mar 1, 2025
1 parent 1510ad8 commit 71786dc
Show file tree
Hide file tree
Showing 3 changed files with 21 additions and 6 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -310,8 +310,8 @@ pub fn axis_align_drag(axis_align: bool, position: DVec2, start: DVec2) -> DVec2
}

/// Snaps a dragging event from the artboard or select tool
pub fn snap_drag(start: DVec2, current: DVec2, axis_align: bool, snap_data: SnapData, snap_manager: &mut SnapManager, candidates: &[SnapCandidatePoint]) -> DVec2 {
let mouse_position = axis_align_drag(axis_align, snap_data.input.mouse.position, start);
pub fn snap_drag(start: DVec2, current: DVec2, snap_to_axis: bool, aligned_to_axis: bool, snap_data: SnapData, snap_manager: &mut SnapManager, candidates: &[SnapCandidatePoint]) -> DVec2 {
let mouse_position = axis_align_drag(snap_to_axis, snap_data.input.mouse.position, start);
let document = snap_data.document;
let total_mouse_delta_document = document.metadata().document_to_viewport.inverse().transform_vector2(mouse_position - start);
let mouse_delta_document = document.metadata().document_to_viewport.inverse().transform_vector2(mouse_position - current);
Expand All @@ -331,7 +331,7 @@ pub fn snap_drag(start: DVec2, current: DVec2, axis_align: bool, snap_data: Snap
let mut point = point.clone();
point.document_point += total_mouse_delta_document;

let snapped = if axis_align {
let snapped = if aligned_to_axis {
let constraint = SnapConstraint::Line {
origin: point.document_point,
direction: total_mouse_delta_document.try_normalize().unwrap_or(DVec2::X),
Expand Down
2 changes: 1 addition & 1 deletion editor/src/messages/tool/tool_messages/artboard_tool.rs
Original file line number Diff line number Diff line change
Expand Up @@ -292,7 +292,7 @@ impl Fsm for ArtboardToolFsmState {
let snap_data = SnapData::ignore(document, input, &ignore);
let document_to_viewport = document.metadata().document_to_viewport;
let [start, current] = [tool_data.drag_start, tool_data.drag_current].map(|point| document_to_viewport.transform_point2(point));
let mouse_delta = snap_drag(start, current, axis_align, snap_data, &mut tool_data.snap_manager, &tool_data.snap_candidates);
let mouse_delta = snap_drag(start, current, axis_align, axis_align, snap_data, &mut tool_data.snap_manager, &tool_data.snap_candidates);

let size = bounds.bounds[1] - bounds.bounds[0];
let position = bounds.bounds[0] + bounds.transform.inverse().transform_vector2(mouse_delta);
Expand Down
19 changes: 17 additions & 2 deletions editor/src/messages/tool/tool_messages/select_tool.rs
Original file line number Diff line number Diff line change
Expand Up @@ -309,6 +309,7 @@ struct SelectToolData {
cursor: MouseCursorIcon,
pivot: Pivot,
compass_rose: CompassRose,
line_center: DVec2,
skew_edge: EdgeBool,
nested_selection_behavior: NestedSelectionBehavior,
selected_layers_count: usize,
Expand Down Expand Up @@ -615,6 +616,9 @@ impl Fsm for SelectToolFsmState {
// Update compass rose
tool_data.compass_rose.refresh_position(document);
let compass_center = tool_data.compass_rose.compass_rose_position();
if !matches!(self, Self::Dragging { .. }) {
tool_data.line_center = compass_center;
}
overlay_context.compass_rose(compass_center, angle, show_compass_with_ring);

let axis_state = if let SelectToolFsmState::Dragging { axis, .. } = self {
Expand Down Expand Up @@ -646,7 +650,8 @@ impl Fsm for SelectToolFsmState {
let color_string = &graphene_std::Color::from_rgb_str(color.strip_prefix('#').unwrap()).unwrap().with_alpha(0.25).rgba_hex();
&format!("#{}", color_string)
};
overlay_context.line(compass_center - direction * viewport_diagonal, compass_center + direction * viewport_diagonal, Some(color));
let line_center = tool_data.line_center;
overlay_context.line(line_center - direction * viewport_diagonal, line_center + direction * viewport_diagonal, Some(color));
}
}
}
Expand Down Expand Up @@ -974,12 +979,22 @@ impl Fsm for SelectToolFsmState {

let snap_data = SnapData::ignore(document, input, ignore);
let (start, current) = (tool_data.drag_start, tool_data.drag_current);
let mouse_delta = snap_drag(start, current, tool_data.axis_align, snap_data, &mut tool_data.snap_manager, &tool_data.snap_candidates);
let e0 = tool_data
.bounding_box_manager
.as_ref()
.map(|bounding_box_manager| bounding_box_manager.transform * Quad::from_box(bounding_box_manager.bounds))
.map_or(DVec2::X, |quad| (quad.top_left() - quad.top_right()).normalize_or(DVec2::X));

let aligned_to_axis = tool_data.axis_align || matches!(axis, Axis::X | Axis::Y);
let mouse_delta = snap_drag(
start,
current,
tool_data.axis_align,
aligned_to_axis,
snap_data,
&mut tool_data.snap_manager,
&tool_data.snap_candidates,
);
let mouse_delta = match axis {
Axis::X => mouse_delta.project_onto(e0),
Axis::Y => mouse_delta.project_onto(e0.perp()),
Expand Down

0 comments on commit 71786dc

Please sign in to comment.