Skip to content

Commit

Permalink
Fix snapping to respect rotation of bounding box
Browse files Browse the repository at this point in the history
Fixes snapping behaviour which defaulted to X and Y axes.
  • Loading branch information
mTvare6 committed Jan 10, 2025
1 parent bf6ffbd commit b41423a
Show file tree
Hide file tree
Showing 2 changed files with 19 additions and 6 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -74,7 +74,18 @@ impl AlignmentSnapper {
Quad::intersect_rays(target_point.document_point, DVec2::X, origin, direction),
]
} else {
[DVec2::new(point.document_point.x, target_position.y), DVec2::new(target_position.x, point.document_point.y)].map(Some)
let Some(quad) = target_point.quad else {
continue;
};
let quad = quad.0;
let Some(index) = target_point.quad_index else {
continue;
};
let current_vertex = quad[index];
let edges = [current_vertex - quad[(index + 3) % 4], current_vertex - quad[(index + 1) % 4]];
edges
.map(|edge| edge.try_normalize().map(|edge| (point.document_point - current_vertex).project_onto(edge) + current_vertex))
.into()
};

let target_path = matches!(target_point.target, SnapTarget::Path(_));
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -326,20 +326,22 @@ pub struct SnapCandidatePoint {
pub source: SnapSource,
pub target: SnapTarget,
pub quad: Option<Quad>,
pub quad_index: Option<usize>, // TODO: None implies edge midpoint or center of quad, handle them
pub neighbors: Vec<DVec2>,
pub alignment: bool,
}
impl SnapCandidatePoint {
pub fn new(document_point: DVec2, source: SnapSource, target: SnapTarget) -> Self {
Self::new_quad(document_point, source, target, None, true)
Self::new_quad(document_point, source, target, None, None, true)
}

pub fn new_quad(document_point: DVec2, source: SnapSource, target: SnapTarget, quad: Option<Quad>, alignment: bool) -> Self {
pub fn new_quad(document_point: DVec2, source: SnapSource, target: SnapTarget, quad: Option<Quad>, quad_index: Option<usize>, alignment: bool) -> Self {
Self {
document_point,
source,
target,
quad,
quad_index,
alignment,
..Default::default()
}
Expand Down Expand Up @@ -412,15 +414,15 @@ pub fn get_bbox_points(quad: Quad, points: &mut Vec<SnapCandidatePoint>, values:
let start = quad.0[index];
let end = quad.0[(index + 1) % 4];
if document.snapping_state.target_enabled(values.corner_target) {
points.push(SnapCandidatePoint::new_quad(start, values.corner_source, values.corner_target, Some(quad), false));
points.push(SnapCandidatePoint::new_quad(start, values.corner_source, values.corner_target, Some(quad), Some(index), false));
}
if document.snapping_state.target_enabled(values.edge_target) {
points.push(SnapCandidatePoint::new_quad((start + end) / 2., values.edge_source, values.edge_target, Some(quad), false));
points.push(SnapCandidatePoint::new_quad((start + end) / 2., values.edge_source, values.edge_target, Some(quad), None, false));
}
}

if document.snapping_state.target_enabled(values.center_target) {
points.push(SnapCandidatePoint::new_quad(quad.center(), values.center_source, values.center_target, Some(quad), false));
points.push(SnapCandidatePoint::new_quad(quad.center(), values.center_source, values.center_target, Some(quad), None, false));
}
}

Expand Down

0 comments on commit b41423a

Please sign in to comment.