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 <keavon@keavon.com>
This commit is contained in:
Mohamed Osama 2024-09-15 02:15:56 +03:00 committed by GitHub
parent 426f3b2cb4
commit 0c5bccc2fd
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
4 changed files with 44 additions and 4 deletions

View file

@ -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,
});

View file

@ -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<Message>) {
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),
});
}
}

View file

@ -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,
});

View file

@ -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 {