From 0c5bccc2fddce83188169043fa129321d3eed7e6 Mon Sep 17 00:00:00 2001 From: Mohamed Osama <67656249+moOsama76@users.noreply.github.com> Date: Sun, 15 Sep 2024 02:15:56 +0300 Subject: [PATCH] Make the primitive shape tools avoid setting a negative transform scale (#1973) * Fix transformation for primitive tools, make odd-sided polygons and stars flipped with radius instead of scale * Extract to function and add comment * Code review --------- Co-authored-by: hypercube <0hypercube@gmail.com> Co-authored-by: Keavon Chambers --- .../tool/tool_messages/ellipse_tool.rs | 2 +- .../tool/tool_messages/polygon_tool.rs | 37 ++++++++++++++++++- .../tool/tool_messages/rectangle_tool.rs | 2 +- node-graph/graph-craft/src/document/value.rs | 7 ++++ 4 files changed, 44 insertions(+), 4 deletions(-) diff --git a/editor/src/messages/tool/tool_messages/ellipse_tool.rs b/editor/src/messages/tool/tool_messages/ellipse_tool.rs index 2893b127..7331e3f3 100644 --- a/editor/src/messages/tool/tool_messages/ellipse_tool.rs +++ b/editor/src/messages/tool/tool_messages/ellipse_tool.rs @@ -224,7 +224,7 @@ impl Fsm for EllipseToolFsmState { if let Some(layer) = shape_data.layer { responses.add(GraphOperationMessage::TransformSet { layer, - transform: DAffine2::from_scale_angle_translation(end - start, 0., (start + end) / 2.), + transform: DAffine2::from_scale_angle_translation((end - start).abs(), 0., (start + end) / 2.), transform_in: TransformIn::Viewport, skip_rerender: false, }); diff --git a/editor/src/messages/tool/tool_messages/polygon_tool.rs b/editor/src/messages/tool/tool_messages/polygon_tool.rs index 14f922b8..d3b7c155 100644 --- a/editor/src/messages/tool/tool_messages/polygon_tool.rs +++ b/editor/src/messages/tool/tool_messages/polygon_tool.rs @@ -2,9 +2,11 @@ use super::tool_prelude::*; use crate::messages::portfolio::document::graph_operation::utility_types::TransformIn; use crate::messages::portfolio::document::node_graph::document_node_definitions::resolve_document_node_type; use crate::messages::portfolio::document::overlays::utility_types::OverlayContext; +use crate::messages::portfolio::document::utility_types::document_metadata::LayerNodeIdentifier; +use crate::messages::portfolio::document::utility_types::network_interface::InputConnector; use crate::messages::tool::common_functionality::auto_panning::AutoPanning; use crate::messages::tool::common_functionality::color_selector::{ToolColorOptions, ToolColorType}; -use crate::messages::tool::common_functionality::graph_modification_utils; +use crate::messages::tool::common_functionality::graph_modification_utils::{self, NodeGraphLayer}; use crate::messages::tool::common_functionality::resize::Resize; use crate::messages::tool::common_functionality::snapping::SnapData; @@ -280,9 +282,11 @@ impl Fsm for PolygonToolFsmState { if let Some([start, end]) = tool_data.data.calculate_points(document, input, center, lock_ratio) { if let Some(layer) = tool_data.data.layer { // TODO: make the scale impact the polygon/star node - we need to determine how to allow the polygon node to make irregular shapes + + update_radius_sign(end, start, layer, document, responses); responses.add(GraphOperationMessage::TransformSet { layer, - transform: DAffine2::from_scale_angle_translation(end - start, 0., (start + end) / 2.), + transform: DAffine2::from_scale_angle_translation((end - start).abs(), 0., (start + end) / 2.), transform_in: TransformIn::Viewport, skip_rerender: false, }); @@ -363,3 +367,32 @@ impl Fsm for PolygonToolFsmState { responses.add(FrontendMessage::UpdateMouseCursor { cursor: MouseCursorIcon::Crosshair }); } } + +/// In the case where the polygon/star is upside down and the number of sides is odd, we negate the radius instead of using a negative scale. +fn update_radius_sign(end: DVec2, start: DVec2, layer: LayerNodeIdentifier, document: &mut DocumentMessageHandler, responses: &mut VecDeque) { + let sign_num = if end[1] > start[1] { 1. } else { -1. }; + let new_layer = NodeGraphLayer::new(layer, &document.network_interface); + + if new_layer.find_input("Regular Polygon", 1).unwrap_or(&TaggedValue::U32(0)).to_u32() % 2 == 1 { + let Some(polygon_node_id) = new_layer.upstream_node_id_from_name("Regular Polygon") else { return }; + + responses.add(NodeGraphMessage::SetInput { + input_connector: InputConnector::node(polygon_node_id, 2), + input: NodeInput::value(TaggedValue::F64(sign_num * 0.5), false), + }); + return; + } + + if new_layer.find_input("Star", 1).unwrap_or(&TaggedValue::U32(0)).to_u32() % 2 == 1 { + let Some(star_node_id) = new_layer.upstream_node_id_from_name("Star") else { return }; + + responses.add(NodeGraphMessage::SetInput { + input_connector: InputConnector::node(star_node_id, 2), + input: NodeInput::value(TaggedValue::F64(sign_num * 0.5), false), + }); + responses.add(NodeGraphMessage::SetInput { + input_connector: InputConnector::node(star_node_id, 3), + input: NodeInput::value(TaggedValue::F64(sign_num * 0.25), false), + }); + } +} diff --git a/editor/src/messages/tool/tool_messages/rectangle_tool.rs b/editor/src/messages/tool/tool_messages/rectangle_tool.rs index 69772908..672d88be 100644 --- a/editor/src/messages/tool/tool_messages/rectangle_tool.rs +++ b/editor/src/messages/tool/tool_messages/rectangle_tool.rs @@ -231,7 +231,7 @@ impl Fsm for RectangleToolFsmState { // TODO: make the scale impact the rect node responses.add(GraphOperationMessage::TransformSet { layer, - transform: DAffine2::from_scale_angle_translation(end - start, 0., (start + end) / 2.), + transform: DAffine2::from_scale_angle_translation((end - start).abs(), 0., (start + end) / 2.), transform_in: TransformIn::Viewport, skip_rerender: false, }); diff --git a/node-graph/graph-craft/src/document/value.rs b/node-graph/graph-craft/src/document/value.rs index 32b62b4b..e5f7b6b1 100644 --- a/node-graph/graph-craft/src/document/value.rs +++ b/node-graph/graph-craft/src/document/value.rs @@ -194,6 +194,13 @@ impl TaggedValue { _ => panic!("Cannot convert to primitive string"), } } + + pub fn to_u32(&self) -> u32 { + match self { + TaggedValue::U32(x) => *x, + _ => panic!("Passed value is not of type u32"), + } + } } impl Display for TaggedValue {