From e7c544b108ea2c8ad21fb74c7b5cb8402154d8e0 Mon Sep 17 00:00:00 2001 From: watermelon-neko Date: Sun, 15 Feb 2026 19:13:17 +0900 Subject: [PATCH 1/2] fix --- .../tool/common_functionality/shapes/arc_shape.rs | 5 ++++- .../tool/common_functionality/shapes/circle_shape.rs | 5 ++++- .../tool/common_functionality/shapes/ellipse_shape.rs | 9 +++++++-- .../tool/common_functionality/shapes/grid_shape.rs | 6 +++++- .../tool/common_functionality/shapes/polygon_shape.rs | 5 ++++- .../tool/common_functionality/shapes/rectangle_shape.rs | 9 +++++++-- .../tool/common_functionality/shapes/spiral_shape.rs | 7 ++++++- .../tool/common_functionality/shapes/star_shape.rs | 5 ++++- 8 files changed, 41 insertions(+), 10 deletions(-) diff --git a/editor/src/messages/tool/common_functionality/shapes/arc_shape.rs b/editor/src/messages/tool/common_functionality/shapes/arc_shape.rs index 7eabb3c619..8322a819c2 100644 --- a/editor/src/messages/tool/common_functionality/shapes/arc_shape.rs +++ b/editor/src/messages/tool/common_functionality/shapes/arc_shape.rs @@ -158,7 +158,10 @@ impl Arc { return; }; - let dimensions = (start - end).abs(); + // Convert viewport-space dimensions to document-space + let document_to_viewport = document.metadata().document_to_viewport; + let dimensions_viewport = (start - end).abs(); + let dimensions = document_to_viewport.inverse().transform_vector2(dimensions_viewport).abs(); let mut scale = DVec2::ONE; let radius: f64; diff --git a/editor/src/messages/tool/common_functionality/shapes/circle_shape.rs b/editor/src/messages/tool/common_functionality/shapes/circle_shape.rs index 836f50f9e6..cd8374ecbd 100644 --- a/editor/src/messages/tool/common_functionality/shapes/circle_shape.rs +++ b/editor/src/messages/tool/common_functionality/shapes/circle_shape.rs @@ -101,7 +101,10 @@ impl Circle { return; }; - let dimensions = (start - end).abs(); + // Convert viewport-space dimensions to document-space + let document_to_viewport = document.metadata().document_to_viewport; + let dimensions_viewport = (start - end).abs(); + let dimensions = document_to_viewport.inverse().transform_vector2(dimensions_viewport).abs(); // We keep the smaller dimension's scale at 1 and scale the other dimension accordingly let radius: f64 = if dimensions.x > dimensions.y { dimensions.y / 2. } else { dimensions.x / 2. }; diff --git a/editor/src/messages/tool/common_functionality/shapes/ellipse_shape.rs b/editor/src/messages/tool/common_functionality/shapes/ellipse_shape.rs index eb33a08427..001274bcbf 100644 --- a/editor/src/messages/tool/common_functionality/shapes/ellipse_shape.rs +++ b/editor/src/messages/tool/common_functionality/shapes/ellipse_shape.rs @@ -36,13 +36,18 @@ impl Ellipse { return; }; + // Convert viewport-space dimensions to document-space + let document_to_viewport = document.metadata().document_to_viewport; + let dimensions_viewport = (start - end).abs(); + let dimensions_document = document_to_viewport.inverse().transform_vector2(dimensions_viewport).abs(); + responses.add(NodeGraphMessage::SetInput { input_connector: InputConnector::node(node_id, 1), - input: NodeInput::value(TaggedValue::F64(((start.x - end.x) / 2.).abs()), false), + input: NodeInput::value(TaggedValue::F64(dimensions_document.x / 2.), false), }); responses.add(NodeGraphMessage::SetInput { input_connector: InputConnector::node(node_id, 2), - input: NodeInput::value(TaggedValue::F64(((start.y - end.y) / 2.).abs()), false), + input: NodeInput::value(TaggedValue::F64(dimensions_document.y / 2.), false), }); responses.add(GraphOperationMessage::TransformSet { layer, diff --git a/editor/src/messages/tool/common_functionality/shapes/grid_shape.rs b/editor/src/messages/tool/common_functionality/shapes/grid_shape.rs index 7a7f1b0b19..ce54c4fd39 100644 --- a/editor/src/messages/tool/common_functionality/shapes/grid_shape.rs +++ b/editor/src/messages/tool/common_functionality/shapes/grid_shape.rs @@ -115,7 +115,11 @@ impl Grid { let start = shape_tool_data.data.viewport_drag_start(document); let end = ipp.mouse.position; - let (translation, dimensions, angle) = calculate_grid_params(start, end, is_isometric, ipp.keyboard.key(center), ipp.keyboard.key(lock_ratio)); + let (translation, dimensions_viewport, angle) = calculate_grid_params(start, end, is_isometric, ipp.keyboard.key(center), ipp.keyboard.key(lock_ratio)); + + // Convert viewport-space dimensions to document-space + let document_to_viewport = document.metadata().document_to_viewport; + let dimensions = document_to_viewport.inverse().transform_vector2(dimensions_viewport).abs(); // Set dimensions/spacing responses.add(NodeGraphMessage::SetInput { diff --git a/editor/src/messages/tool/common_functionality/shapes/polygon_shape.rs b/editor/src/messages/tool/common_functionality/shapes/polygon_shape.rs index 7b22144a71..a00dd5895c 100644 --- a/editor/src/messages/tool/common_functionality/shapes/polygon_shape.rs +++ b/editor/src/messages/tool/common_functionality/shapes/polygon_shape.rs @@ -129,7 +129,10 @@ impl Polygon { // TODO: We need to determine how to allow the polygon node to make irregular shapes update_radius_sign(end, start, layer, document, responses); - let dimensions = (start - end).abs(); + // Convert viewport-space dimensions to document-space + let document_to_viewport = document.metadata().document_to_viewport; + let dimensions_viewport = (start - end).abs(); + let dimensions = document_to_viewport.inverse().transform_vector2(dimensions_viewport).abs(); // We keep the smaller dimension's scale at 1 and scale the other dimension accordingly let mut scale = DVec2::ONE; diff --git a/editor/src/messages/tool/common_functionality/shapes/rectangle_shape.rs b/editor/src/messages/tool/common_functionality/shapes/rectangle_shape.rs index 787684a8fa..2826d4cdc1 100644 --- a/editor/src/messages/tool/common_functionality/shapes/rectangle_shape.rs +++ b/editor/src/messages/tool/common_functionality/shapes/rectangle_shape.rs @@ -36,13 +36,18 @@ impl Rectangle { return; }; + // Convert viewport-space dimensions to document-space + let document_to_viewport = document.metadata().document_to_viewport; + let dimensions_viewport = (start - end).abs(); + let dimensions_document = document_to_viewport.inverse().transform_vector2(dimensions_viewport).abs(); + responses.add(NodeGraphMessage::SetInput { input_connector: InputConnector::node(node_id, 1), - input: NodeInput::value(TaggedValue::F64((start.x - end.x).abs()), false), + input: NodeInput::value(TaggedValue::F64(dimensions_document.x), false), }); responses.add(NodeGraphMessage::SetInput { input_connector: InputConnector::node(node_id, 2), - input: NodeInput::value(TaggedValue::F64((start.y - end.y).abs()), false), + input: NodeInput::value(TaggedValue::F64(dimensions_document.y), false), }); responses.add(GraphOperationMessage::TransformSet { layer, diff --git a/editor/src/messages/tool/common_functionality/shapes/spiral_shape.rs b/editor/src/messages/tool/common_functionality/shapes/spiral_shape.rs index 9db94ca57f..9c862fcea4 100644 --- a/editor/src/messages/tool/common_functionality/shapes/spiral_shape.rs +++ b/editor/src/messages/tool/common_functionality/shapes/spiral_shape.rs @@ -57,7 +57,12 @@ impl Spiral { let snapped_viewport_point = document.metadata().document_to_viewport.transform_point2(snapped.snapped_point_document); shape_tool_data.data.snap_manager.update_indicator(snapped); - let dragged_distance = (viewport_drag_start - snapped_viewport_point).length(); + // Convert viewport-space distance to document-space + let document_to_viewport = document.metadata().document_to_viewport; + let dragged_distance_viewport = (viewport_drag_start - snapped_viewport_point).length(); + // Use the zoom scale (average of x and y scale factors) to convert distance + let zoom_scale = (document_to_viewport.matrix2.col(0).length() + document_to_viewport.matrix2.col(1).length()) / 2.; + let dragged_distance = dragged_distance_viewport / zoom_scale; let Some(node_id) = graph_modification_utils::get_spiral_id(layer, &document.network_interface) else { return; diff --git a/editor/src/messages/tool/common_functionality/shapes/star_shape.rs b/editor/src/messages/tool/common_functionality/shapes/star_shape.rs index acdde2c286..ebfc41ec5a 100644 --- a/editor/src/messages/tool/common_functionality/shapes/star_shape.rs +++ b/editor/src/messages/tool/common_functionality/shapes/star_shape.rs @@ -134,7 +134,10 @@ impl Star { // TODO: We need to determine how to allow the polygon node to make irregular shapes update_radius_sign(end, start, layer, document, responses); - let dimensions = (start - end).abs(); + // Convert viewport-space dimensions to document-space + let document_to_viewport = document.metadata().document_to_viewport; + let dimensions_viewport = (start - end).abs(); + let dimensions = document_to_viewport.inverse().transform_vector2(dimensions_viewport).abs(); // We keep the smaller dimension's scale at 1 and scale the other dimension accordingly let mut scale = DVec2::ONE; From afbd0ffecb26512fdd3bff14539dffa0ca1f9a13 Mon Sep 17 00:00:00 2001 From: watermelon-neko Date: Wed, 25 Feb 2026 23:53:19 +0900 Subject: [PATCH 2/2] keeping the scale at 1 --- .../tool/common_functionality/shapes/arc_shape.rs | 9 ++++----- .../common_functionality/shapes/circle_shape.rs | 9 ++++----- .../common_functionality/shapes/ellipse_shape.rs | 13 ++++++------- .../tool/common_functionality/shapes/grid_shape.rs | 5 +++-- .../common_functionality/shapes/polygon_shape.rs | 9 ++++----- .../common_functionality/shapes/rectangle_shape.rs | 13 ++++++------- .../common_functionality/shapes/spiral_shape.rs | 9 ++++----- .../tool/common_functionality/shapes/star_shape.rs | 9 ++++----- .../tool/common_functionality/utility_functions.rs | 12 ++++++++++++ 9 files changed, 47 insertions(+), 41 deletions(-) diff --git a/editor/src/messages/tool/common_functionality/shapes/arc_shape.rs b/editor/src/messages/tool/common_functionality/shapes/arc_shape.rs index 8322a819c2..a2723057aa 100644 --- a/editor/src/messages/tool/common_functionality/shapes/arc_shape.rs +++ b/editor/src/messages/tool/common_functionality/shapes/arc_shape.rs @@ -8,6 +8,7 @@ use crate::messages::tool::common_functionality::gizmos::shape_gizmos::circle_ar use crate::messages::tool::common_functionality::gizmos::shape_gizmos::sweep_angle_gizmo::{SweepAngleGizmo, SweepAngleGizmoState}; use crate::messages::tool::common_functionality::graph_modification_utils; use crate::messages::tool::common_functionality::shapes::shape_utility::{ShapeGizmoHandler, arc_outline}; +use crate::messages::tool::common_functionality::utility_functions::{viewport_to_document_dimensions, viewport_zoom}; use crate::messages::tool::tool_messages::tool_prelude::*; use glam::DAffine2; use graph_craft::document::NodeInput; @@ -158,10 +159,8 @@ impl Arc { return; }; - // Convert viewport-space dimensions to document-space - let document_to_viewport = document.metadata().document_to_viewport; - let dimensions_viewport = (start - end).abs(); - let dimensions = document_to_viewport.inverse().transform_vector2(dimensions_viewport).abs(); + let dimensions = viewport_to_document_dimensions(document, start, end); + let zoom = viewport_zoom(document); let mut scale = DVec2::ONE; let radius: f64; @@ -181,7 +180,7 @@ impl Arc { responses.add(GraphOperationMessage::TransformSet { layer, - transform: DAffine2::from_scale_angle_translation(scale, 0., start.midpoint(end)), + transform: DAffine2::from_scale_angle_translation(scale * zoom, 0., start.midpoint(end)), transform_in: TransformIn::Viewport, skip_rerender: false, }); diff --git a/editor/src/messages/tool/common_functionality/shapes/circle_shape.rs b/editor/src/messages/tool/common_functionality/shapes/circle_shape.rs index cd8374ecbd..6e651bd5ec 100644 --- a/editor/src/messages/tool/common_functionality/shapes/circle_shape.rs +++ b/editor/src/messages/tool/common_functionality/shapes/circle_shape.rs @@ -7,6 +7,7 @@ use crate::messages::tool::common_functionality::gizmos::shape_gizmos::circle_ar use crate::messages::tool::common_functionality::graph_modification_utils; use crate::messages::tool::common_functionality::shape_editor::ShapeState; use crate::messages::tool::common_functionality::shapes::shape_utility::{ShapeGizmoHandler, ShapeToolModifierKey}; +use crate::messages::tool::common_functionality::utility_functions::{viewport_to_document_dimensions, viewport_zoom}; use crate::messages::tool::tool_messages::shape_tool::ShapeToolData; use crate::messages::tool::tool_messages::tool_prelude::*; use glam::DAffine2; @@ -101,10 +102,8 @@ impl Circle { return; }; - // Convert viewport-space dimensions to document-space - let document_to_viewport = document.metadata().document_to_viewport; - let dimensions_viewport = (start - end).abs(); - let dimensions = document_to_viewport.inverse().transform_vector2(dimensions_viewport).abs(); + let dimensions = viewport_to_document_dimensions(document, start, end); + let zoom = viewport_zoom(document); // We keep the smaller dimension's scale at 1 and scale the other dimension accordingly let radius: f64 = if dimensions.x > dimensions.y { dimensions.y / 2. } else { dimensions.x / 2. }; @@ -116,7 +115,7 @@ impl Circle { responses.add(GraphOperationMessage::TransformSet { layer, - transform: DAffine2::from_scale_angle_translation(DVec2::ONE, 0., start.midpoint(end)), + transform: DAffine2::from_scale_angle_translation(DVec2::splat(zoom), 0., start.midpoint(end)), transform_in: TransformIn::Viewport, skip_rerender: false, }); diff --git a/editor/src/messages/tool/common_functionality/shapes/ellipse_shape.rs b/editor/src/messages/tool/common_functionality/shapes/ellipse_shape.rs index 001274bcbf..053815023b 100644 --- a/editor/src/messages/tool/common_functionality/shapes/ellipse_shape.rs +++ b/editor/src/messages/tool/common_functionality/shapes/ellipse_shape.rs @@ -5,6 +5,7 @@ use crate::messages::portfolio::document::node_graph::document_node_definitions: use crate::messages::portfolio::document::utility_types::document_metadata::LayerNodeIdentifier; use crate::messages::portfolio::document::utility_types::network_interface::{InputConnector, NodeTemplate}; use crate::messages::tool::common_functionality::graph_modification_utils; +use crate::messages::tool::common_functionality::utility_functions::{viewport_to_document_dimensions, viewport_zoom}; use crate::messages::tool::tool_messages::tool_prelude::*; use glam::DAffine2; use graph_craft::document::NodeInput; @@ -36,22 +37,20 @@ impl Ellipse { return; }; - // Convert viewport-space dimensions to document-space - let document_to_viewport = document.metadata().document_to_viewport; - let dimensions_viewport = (start - end).abs(); - let dimensions_document = document_to_viewport.inverse().transform_vector2(dimensions_viewport).abs(); + let dimensions = viewport_to_document_dimensions(document, start, end); + let zoom = viewport_zoom(document); responses.add(NodeGraphMessage::SetInput { input_connector: InputConnector::node(node_id, 1), - input: NodeInput::value(TaggedValue::F64(dimensions_document.x / 2.), false), + input: NodeInput::value(TaggedValue::F64(dimensions.x / 2.), false), }); responses.add(NodeGraphMessage::SetInput { input_connector: InputConnector::node(node_id, 2), - input: NodeInput::value(TaggedValue::F64(dimensions_document.y / 2.), false), + input: NodeInput::value(TaggedValue::F64(dimensions.y / 2.), false), }); responses.add(GraphOperationMessage::TransformSet { layer, - transform: DAffine2::from_translation(start.midpoint(end)), + transform: DAffine2::from_scale_angle_translation(DVec2::splat(zoom), 0., start.midpoint(end)), transform_in: TransformIn::Viewport, skip_rerender: false, }); diff --git a/editor/src/messages/tool/common_functionality/shapes/grid_shape.rs b/editor/src/messages/tool/common_functionality/shapes/grid_shape.rs index ce54c4fd39..f8fe149237 100644 --- a/editor/src/messages/tool/common_functionality/shapes/grid_shape.rs +++ b/editor/src/messages/tool/common_functionality/shapes/grid_shape.rs @@ -9,6 +9,7 @@ use crate::messages::tool::common_functionality::gizmos::shape_gizmos::grid_rows use crate::messages::tool::common_functionality::graph_modification_utils; use crate::messages::tool::common_functionality::shape_editor::ShapeState; use crate::messages::tool::common_functionality::shapes::shape_utility::ShapeGizmoHandler; +use crate::messages::tool::common_functionality::utility_functions::viewport_zoom; use crate::messages::tool::tool_messages::tool_prelude::*; use glam::DAffine2; use graph_craft::document::NodeInput; @@ -117,9 +118,9 @@ impl Grid { let (translation, dimensions_viewport, angle) = calculate_grid_params(start, end, is_isometric, ipp.keyboard.key(center), ipp.keyboard.key(lock_ratio)); - // Convert viewport-space dimensions to document-space let document_to_viewport = document.metadata().document_to_viewport; let dimensions = document_to_viewport.inverse().transform_vector2(dimensions_viewport).abs(); + let zoom = viewport_zoom(document); // Set dimensions/spacing responses.add(NodeGraphMessage::SetInput { @@ -138,7 +139,7 @@ impl Grid { // Set transform responses.add(GraphOperationMessage::TransformSet { layer, - transform: DAffine2::from_scale_angle_translation(DVec2::ONE, 0., translation), + transform: DAffine2::from_scale_angle_translation(DVec2::splat(zoom), 0., translation), transform_in: TransformIn::Viewport, skip_rerender: false, }); diff --git a/editor/src/messages/tool/common_functionality/shapes/polygon_shape.rs b/editor/src/messages/tool/common_functionality/shapes/polygon_shape.rs index a00dd5895c..8f4875aba7 100644 --- a/editor/src/messages/tool/common_functionality/shapes/polygon_shape.rs +++ b/editor/src/messages/tool/common_functionality/shapes/polygon_shape.rs @@ -10,6 +10,7 @@ use crate::messages::tool::common_functionality::gizmos::shape_gizmos::point_rad use crate::messages::tool::common_functionality::graph_modification_utils::{self, NodeGraphLayer}; use crate::messages::tool::common_functionality::shape_editor::ShapeState; use crate::messages::tool::common_functionality::shapes::shape_utility::{ShapeGizmoHandler, polygon_outline}; +use crate::messages::tool::common_functionality::utility_functions::{viewport_to_document_dimensions, viewport_zoom}; use crate::messages::tool::tool_messages::shape_tool::ShapeOptionsUpdate; use crate::messages::tool::tool_messages::tool_prelude::*; use glam::DAffine2; @@ -129,10 +130,8 @@ impl Polygon { // TODO: We need to determine how to allow the polygon node to make irregular shapes update_radius_sign(end, start, layer, document, responses); - // Convert viewport-space dimensions to document-space - let document_to_viewport = document.metadata().document_to_viewport; - let dimensions_viewport = (start - end).abs(); - let dimensions = document_to_viewport.inverse().transform_vector2(dimensions_viewport).abs(); + let dimensions = viewport_to_document_dimensions(document, start, end); + let zoom = viewport_zoom(document); // We keep the smaller dimension's scale at 1 and scale the other dimension accordingly let mut scale = DVec2::ONE; @@ -156,7 +155,7 @@ impl Polygon { responses.add(GraphOperationMessage::TransformSet { layer, - transform: DAffine2::from_scale_angle_translation(scale, 0., (start + end) / 2.), + transform: DAffine2::from_scale_angle_translation(scale * zoom, 0., (start + end) / 2.), transform_in: TransformIn::Viewport, skip_rerender: false, }); diff --git a/editor/src/messages/tool/common_functionality/shapes/rectangle_shape.rs b/editor/src/messages/tool/common_functionality/shapes/rectangle_shape.rs index 2826d4cdc1..b128a666c3 100644 --- a/editor/src/messages/tool/common_functionality/shapes/rectangle_shape.rs +++ b/editor/src/messages/tool/common_functionality/shapes/rectangle_shape.rs @@ -5,6 +5,7 @@ use crate::messages::portfolio::document::node_graph::document_node_definitions: use crate::messages::portfolio::document::utility_types::document_metadata::LayerNodeIdentifier; use crate::messages::portfolio::document::utility_types::network_interface::{InputConnector, NodeTemplate}; use crate::messages::tool::common_functionality::graph_modification_utils; +use crate::messages::tool::common_functionality::utility_functions::{viewport_to_document_dimensions, viewport_zoom}; use crate::messages::tool::tool_messages::tool_prelude::*; use glam::DAffine2; use graph_craft::document::NodeInput; @@ -36,22 +37,20 @@ impl Rectangle { return; }; - // Convert viewport-space dimensions to document-space - let document_to_viewport = document.metadata().document_to_viewport; - let dimensions_viewport = (start - end).abs(); - let dimensions_document = document_to_viewport.inverse().transform_vector2(dimensions_viewport).abs(); + let dimensions = viewport_to_document_dimensions(document, start, end); + let zoom = viewport_zoom(document); responses.add(NodeGraphMessage::SetInput { input_connector: InputConnector::node(node_id, 1), - input: NodeInput::value(TaggedValue::F64(dimensions_document.x), false), + input: NodeInput::value(TaggedValue::F64(dimensions.x), false), }); responses.add(NodeGraphMessage::SetInput { input_connector: InputConnector::node(node_id, 2), - input: NodeInput::value(TaggedValue::F64(dimensions_document.y), false), + input: NodeInput::value(TaggedValue::F64(dimensions.y), false), }); responses.add(GraphOperationMessage::TransformSet { layer, - transform: DAffine2::from_translation(start.midpoint(end)), + transform: DAffine2::from_scale_angle_translation(DVec2::splat(zoom), 0., start.midpoint(end)), transform_in: TransformIn::Viewport, skip_rerender: false, }); diff --git a/editor/src/messages/tool/common_functionality/shapes/spiral_shape.rs b/editor/src/messages/tool/common_functionality/shapes/spiral_shape.rs index 9c862fcea4..f8ca065161 100644 --- a/editor/src/messages/tool/common_functionality/shapes/spiral_shape.rs +++ b/editor/src/messages/tool/common_functionality/shapes/spiral_shape.rs @@ -5,6 +5,7 @@ use crate::messages::portfolio::document::utility_types::document_metadata::Laye use crate::messages::portfolio::document::utility_types::network_interface::{InputConnector, NodeTemplate}; use crate::messages::tool::common_functionality::graph_modification_utils::{self, NodeGraphLayer}; use crate::messages::tool::common_functionality::snapping::{SnapCandidatePoint, SnapData, SnapTypeConfiguration}; +use crate::messages::tool::common_functionality::utility_functions::viewport_zoom; use crate::messages::tool::tool_messages::shape_tool::ShapeOptionsUpdate; use crate::messages::tool::tool_messages::tool_prelude::*; use glam::DAffine2; @@ -58,11 +59,9 @@ impl Spiral { shape_tool_data.data.snap_manager.update_indicator(snapped); // Convert viewport-space distance to document-space - let document_to_viewport = document.metadata().document_to_viewport; + let zoom = viewport_zoom(document); let dragged_distance_viewport = (viewport_drag_start - snapped_viewport_point).length(); - // Use the zoom scale (average of x and y scale factors) to convert distance - let zoom_scale = (document_to_viewport.matrix2.col(0).length() + document_to_viewport.matrix2.col(1).length()) / 2.; - let dragged_distance = dragged_distance_viewport / zoom_scale; + let dragged_distance = dragged_distance_viewport / zoom; let Some(node_id) = graph_modification_utils::get_spiral_id(layer, &document.network_interface) else { return; @@ -84,7 +83,7 @@ impl Spiral { responses.add(GraphOperationMessage::TransformSet { layer, - transform: DAffine2::from_scale_angle_translation(DVec2::ONE, 0., viewport_drag_start), + transform: DAffine2::from_scale_angle_translation(DVec2::splat(zoom), 0., viewport_drag_start), transform_in: TransformIn::Viewport, skip_rerender: false, }); diff --git a/editor/src/messages/tool/common_functionality/shapes/star_shape.rs b/editor/src/messages/tool/common_functionality/shapes/star_shape.rs index ebfc41ec5a..620134b06a 100644 --- a/editor/src/messages/tool/common_functionality/shapes/star_shape.rs +++ b/editor/src/messages/tool/common_functionality/shapes/star_shape.rs @@ -10,6 +10,7 @@ use crate::messages::tool::common_functionality::gizmos::shape_gizmos::point_rad use crate::messages::tool::common_functionality::graph_modification_utils; use crate::messages::tool::common_functionality::shape_editor::ShapeState; use crate::messages::tool::common_functionality::shapes::shape_utility::{ShapeGizmoHandler, star_outline}; +use crate::messages::tool::common_functionality::utility_functions::{viewport_to_document_dimensions, viewport_zoom}; use crate::messages::tool::tool_messages::tool_prelude::*; use core::f64; use glam::DAffine2; @@ -134,10 +135,8 @@ impl Star { // TODO: We need to determine how to allow the polygon node to make irregular shapes update_radius_sign(end, start, layer, document, responses); - // Convert viewport-space dimensions to document-space - let document_to_viewport = document.metadata().document_to_viewport; - let dimensions_viewport = (start - end).abs(); - let dimensions = document_to_viewport.inverse().transform_vector2(dimensions_viewport).abs(); + let dimensions = viewport_to_document_dimensions(document, start, end); + let zoom = viewport_zoom(document); // We keep the smaller dimension's scale at 1 and scale the other dimension accordingly let mut scale = DVec2::ONE; @@ -166,7 +165,7 @@ impl Star { responses.add(GraphOperationMessage::TransformSet { layer, - transform: DAffine2::from_scale_angle_translation(scale, 0., (start + end) / 2.), + transform: DAffine2::from_scale_angle_translation(scale * zoom, 0., (start + end) / 2.), transform_in: TransformIn::Viewport, skip_rerender: false, }); diff --git a/editor/src/messages/tool/common_functionality/utility_functions.rs b/editor/src/messages/tool/common_functionality/utility_functions.rs index e8d4293721..891adab7c3 100644 --- a/editor/src/messages/tool/common_functionality/utility_functions.rs +++ b/editor/src/messages/tool/common_functionality/utility_functions.rs @@ -22,6 +22,18 @@ use graphene_std::vector::misc::{HandleId, ManipulatorPointId, dvec2_to_point}; use graphene_std::vector::{HandleExt, PointId, SegmentId, Vector, VectorModification, VectorModificationType}; use kurbo::{CubicBez, DEFAULT_ACCURACY, Line, ParamCurve, PathSeg, Point, QuadBez, Shape}; +/// Converts viewport-space dimensions (the absolute difference between two viewport points) to document-space dimensions. +pub fn viewport_to_document_dimensions(document: &DocumentMessageHandler, start: DVec2, end: DVec2) -> DVec2 { + let document_to_viewport = document.metadata().document_to_viewport; + let dimensions_viewport = (start - end).abs(); + document_to_viewport.inverse().transform_vector2(dimensions_viewport).abs() +} + +/// Returns the viewport zoom scale factor from the document-to-viewport transform. +pub fn viewport_zoom(document: &DocumentMessageHandler) -> f64 { + document.metadata().document_to_viewport.matrix2.col(0).length() +} + /// Determines if a path should be extended. Goal in viewport space. Returns the path and if it is extending from the start, if applicable. pub fn should_extend(document: &DocumentMessageHandler, goal: DVec2, tolerance: f64, layers: impl Iterator) -> Option<(LayerNodeIdentifier, PointId, DVec2)> { closest_point(document, goal, tolerance, layers, |_| false)