mirror of
https://github.com/GraphiteEditor/Graphite.git
synced 2026-09-30 21:18:12 +08:00
Fix drawing tools to work in viewport space instead of document space (#2438)
* Stroke width in viewports * Update rectangle tests
This commit is contained in:
@@ -316,7 +316,9 @@ impl Fsm for ArtboardToolFsmState {
|
||||
ArtboardToolFsmState::Dragging
|
||||
}
|
||||
(ArtboardToolFsmState::Drawing, ArtboardToolMessage::PointerMove { constrain_axis_or_aspect, center }) => {
|
||||
let [start, end] = tool_data.draw.calculate_points_ignore_layer(document, input, center, constrain_axis_or_aspect);
|
||||
let [start, end] = tool_data.draw.calculate_points_ignore_layer(document, input, center, constrain_axis_or_aspect, true);
|
||||
let viewport_to_document = document.metadata().document_to_viewport.inverse();
|
||||
let [start, end] = [start, end].map(|point| viewport_to_document.transform_point2(point));
|
||||
if let Some(artboard) = tool_data.selected_artboard {
|
||||
assert_ne!(artboard, LayerNodeIdentifier::ROOT_PARENT, "Selected artboard cannot be ROOT_PARENT");
|
||||
|
||||
|
||||
@@ -236,7 +236,7 @@ impl Fsm for EllipseToolFsmState {
|
||||
responses.add(GraphOperationMessage::TransformSet {
|
||||
layer,
|
||||
transform: DAffine2::from_translation((start + end) / 2.),
|
||||
transform_in: TransformIn::Local,
|
||||
transform_in: TransformIn::Viewport,
|
||||
skip_rerender: false,
|
||||
});
|
||||
}
|
||||
@@ -400,17 +400,14 @@ mod test_ellipse {
|
||||
let ellipse = get_ellipse(&mut editor).await;
|
||||
assert_eq!(ellipse.len(), 1);
|
||||
println!("{ellipse:?}");
|
||||
// TODO: re-enable after https://github.com/GraphiteEditor/Graphite/issues/2370
|
||||
// assert_eq!(ellipse[0].radius_x, 5.);
|
||||
// assert_eq!(ellipse[0].radius_y, 5.);
|
||||
assert_eq!(ellipse[0].radius_x, 5.);
|
||||
assert_eq!(ellipse[0].radius_y, 5.);
|
||||
|
||||
// assert!(ellipse[0]
|
||||
// .transform
|
||||
// .abs_diff_eq(DAffine2::from_angle_translation(-f64::consts::FRAC_PI_4, DVec2::X * f64::consts::FRAC_1_SQRT_2 * 10.), 0.001));
|
||||
|
||||
float_eq!(ellipse[0].radius_x, 11. / core::f64::consts::SQRT_2 / 2.);
|
||||
float_eq!(ellipse[0].radius_y, 11. / core::f64::consts::SQRT_2 / 2.);
|
||||
assert!(ellipse[0].transform.abs_diff_eq(DAffine2::from_translation(DVec2::splat(11. / core::f64::consts::SQRT_2 / 2.)), 0.001));
|
||||
assert!(
|
||||
ellipse[0]
|
||||
.transform
|
||||
.abs_diff_eq(DAffine2::from_angle_translation(-f64::consts::FRAC_PI_4, DVec2::X * f64::consts::FRAC_1_SQRT_2 * 10.), 0.001)
|
||||
);
|
||||
}
|
||||
|
||||
#[tokio::test]
|
||||
@@ -427,13 +424,9 @@ mod test_ellipse {
|
||||
|
||||
let ellipse = get_ellipse(&mut editor).await;
|
||||
assert_eq!(ellipse.len(), 1);
|
||||
// TODO: re-enable after https://github.com/GraphiteEditor/Graphite/issues/2370
|
||||
// assert_eq!(ellipse[0].radius_x, 10.);
|
||||
// assert_eq!(ellipse[0].radius_y, 10.);
|
||||
// assert!(ellipse[0].transform.abs_diff_eq(DAffine2::from_angle(-f64::consts::FRAC_PI_4), 0.001));
|
||||
float_eq!(ellipse[0].radius_x, 11. / core::f64::consts::SQRT_2);
|
||||
float_eq!(ellipse[0].radius_y, 11. / core::f64::consts::SQRT_2);
|
||||
assert!(ellipse[0].transform.abs_diff_eq(DAffine2::IDENTITY, 0.001));
|
||||
assert_eq!(ellipse[0].radius_x, 10.);
|
||||
assert_eq!(ellipse[0].radius_y, 10.);
|
||||
assert!(ellipse[0].transform.abs_diff_eq(DAffine2::from_angle(-f64::consts::FRAC_PI_4), 0.001));
|
||||
}
|
||||
|
||||
#[tokio::test]
|
||||
|
||||
@@ -325,7 +325,7 @@ impl Fsm for PolygonToolFsmState {
|
||||
responses.add(GraphOperationMessage::TransformSet {
|
||||
layer,
|
||||
transform: DAffine2::from_scale_angle_translation(scale, 0., (start + end) / 2.),
|
||||
transform_in: TransformIn::Local,
|
||||
transform_in: TransformIn::Viewport,
|
||||
skip_rerender: false,
|
||||
});
|
||||
}
|
||||
|
||||
@@ -241,7 +241,7 @@ impl Fsm for RectangleToolFsmState {
|
||||
responses.add(GraphOperationMessage::TransformSet {
|
||||
layer,
|
||||
transform: DAffine2::from_translation((start + end) / 2.),
|
||||
transform_in: TransformIn::Local,
|
||||
transform_in: TransformIn::Viewport,
|
||||
skip_rerender: false,
|
||||
});
|
||||
}
|
||||
|
||||
@@ -593,9 +593,7 @@ impl Fsm for TextToolFsmState {
|
||||
TextToolFsmState::Ready
|
||||
}
|
||||
(Self::Placing | TextToolFsmState::Dragging, TextToolMessage::PointerMove { center, lock_ratio }) => {
|
||||
let document_points = tool_data.resize.calculate_points_ignore_layer(document, input, center, lock_ratio);
|
||||
let document_to_viewport = document.metadata().document_to_viewport;
|
||||
tool_data.cached_resize_bounds = [document_to_viewport.transform_point2(document_points[0]), document_to_viewport.transform_point2(document_points[1])];
|
||||
tool_data.cached_resize_bounds = tool_data.resize.calculate_points_ignore_layer(document, input, center, lock_ratio, false);
|
||||
|
||||
responses.add(OverlaysMessage::Draw);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user