diff --git a/document-legacy/src/document_metadata.rs b/document-legacy/src/document_metadata.rs index f9ba6db1..4ad91b92 100644 --- a/document-legacy/src/document_metadata.rs +++ b/document-legacy/src/document_metadata.rs @@ -230,19 +230,25 @@ impl DocumentMetadata { } pub fn transform_to_viewport(&self, layer: LayerNodeIdentifier) -> DAffine2 { - self.upstream_transforms - .get(&layer.to_node()) + layer + .ancestors(self) + .filter_map(|layer| self.upstream_transforms.get(&layer.to_node())) .copied() .map(|(footprint, transform)| footprint.transform * transform) - .unwrap_or(DAffine2::IDENTITY) + .next() + .unwrap_or(self.document_to_viewport) } pub fn upstream_transform(&self, node_id: NodeId) -> DAffine2 { self.upstream_transforms.get(&node_id).copied().map(|(_, transform)| transform).unwrap_or(DAffine2::IDENTITY) } - pub fn downstream_transform_to_viewport(&self, node_id: NodeId) -> DAffine2 { - self.upstream_transforms.get(&node_id).copied().map(|(footprint, _)| footprint.transform).unwrap_or(DAffine2::IDENTITY) + pub fn downstream_transform_to_viewport(&self, layer: LayerNodeIdentifier) -> DAffine2 { + self.upstream_transforms + .get(&layer.to_node()) + .copied() + .map(|(footprint, _)| footprint.transform) + .unwrap_or_else(|| self.transform_to_viewport(layer)) } } diff --git a/editor/src/messages/portfolio/document/node_graph/graph_operation_message_handler.rs b/editor/src/messages/portfolio/document/node_graph/graph_operation_message_handler.rs index 0298f20d..e5d1955c 100644 --- a/editor/src/messages/portfolio/document/node_graph/graph_operation_message_handler.rs +++ b/editor/src/messages/portfolio/document/node_graph/graph_operation_message_handler.rs @@ -437,11 +437,6 @@ impl<'a> ModifyInputsContext<'a> { } fn vector_modify(&mut self, modification: VectorDataModification) { - // TODO: Allow modifying a graph with a "Text" node. - if self.network.nodes.values().any(|node| node.name == "Text") { - return; - } - let [mut old_bounds_min, mut old_bounds_max] = [DVec2::ZERO, DVec2::ONE]; let [mut new_bounds_min, mut new_bounds_max] = [DVec2::ZERO, DVec2::ONE]; let mut empty = false; @@ -576,7 +571,7 @@ impl MessageHandler { let layer_identifier = LayerNodeIdentifier::new(*layer.last().unwrap(), &document.document_network); - let parent_transform = document.metadata.downstream_transform_to_viewport(layer_identifier.to_node()); + let parent_transform = document.metadata.downstream_transform_to_viewport(layer_identifier); let bounds = LayerBounds::new(document, &layer); if let Some(mut modify_inputs) = ModifyInputsContext::new_layer(&layer, document, node_graph, responses) { modify_inputs.transform_change(transform, transform_in, parent_transform, bounds, skip_rerender); @@ -589,7 +584,7 @@ impl MessageHandler { let layer_identifier = LayerNodeIdentifier::new(*layer.last().unwrap(), &document.document_network); - let parent_transform = document.metadata.downstream_transform_to_viewport(layer_identifier.to_node()); + let parent_transform = document.metadata.downstream_transform_to_viewport(layer_identifier); let current_transform = Some(document.metadata.transform_to_viewport(layer_identifier)); let bounds = LayerBounds::new(document, &layer); diff --git a/editor/src/messages/portfolio/document/utility_types/transformation.rs b/editor/src/messages/portfolio/document/utility_types/transformation.rs index 86a90cc6..6ba78905 100644 --- a/editor/src/messages/portfolio/document/utility_types/transformation.rs +++ b/editor/src/messages/portfolio/document/utility_types/transformation.rs @@ -368,7 +368,7 @@ impl<'a> Selected<'a> { fn transform_layer(document: &Document, layer: LayerNodeIdentifier, original_transform: Option<&DAffine2>, transformation: DAffine2, responses: &mut VecDeque) { let Some(&original_transform) = original_transform else { return }; - let to = document.metadata.downstream_transform_to_viewport(layer.to_node()); + let to = document.metadata.downstream_transform_to_viewport(layer); let new = to.inverse() * transformation * to * original_transform; responses.add(GraphOperationMessage::TransformSet { layer: layer.to_path(), diff --git a/editor/src/messages/tool/tool_messages/freehand_tool.rs b/editor/src/messages/tool/tool_messages/freehand_tool.rs index 01de3acb..c11ac9fb 100644 --- a/editor/src/messages/tool/tool_messages/freehand_tool.rs +++ b/editor/src/messages/tool/tool_messages/freehand_tool.rs @@ -192,8 +192,6 @@ impl Fsm for FreehandToolFsmState { document, global_tool_data, input, .. } = tool_action_data; - let transform = document.metadata().document_to_viewport; - let ToolMessage::Freehand(event) = event else { return self; }; @@ -202,6 +200,8 @@ impl Fsm for FreehandToolFsmState { responses.add(DocumentMessage::StartTransaction); responses.add(DocumentMessage::DeselectAllLayers); + let parent = document.new_layer_parent(); + let transform = document.metadata().transform_to_viewport(parent); let pos = transform.inverse().transform_point2(input.mouse.position); tool_data.dragged = false; @@ -211,7 +211,7 @@ impl Fsm for FreehandToolFsmState { let subpath = bezier_rs::Subpath::from_anchors([pos], false); - let layer = graph_modification_utils::new_vector_layer(vec![subpath], generate_uuid(), document.new_layer_parent(), responses); + let layer = graph_modification_utils::new_vector_layer(vec![subpath], generate_uuid(), parent, responses); tool_data.layer = Some(layer); responses.add(GraphOperationMessage::FillSet { @@ -227,10 +227,11 @@ impl Fsm for FreehandToolFsmState { FreehandToolFsmState::Drawing } (FreehandToolFsmState::Drawing, FreehandToolMessage::PointerMove) => { - let pos = transform.inverse().transform_point2(input.mouse.position); + if let Some(layer) = tool_data.layer.clone() { + let transform = document.metadata().transform_to_viewport(layer); + let pos = transform.inverse().transform_point2(input.mouse.position); - if tool_data.last_point != pos { - if let Some(layer) = tool_data.layer.clone() { + if tool_data.last_point != pos { let manipulator_group = ManipulatorGroup::new_anchor(pos); let modification = VectorDataModification::AddEndManipulatorGroup { subpath_index: 0, manipulator_group }; responses.add(GraphOperationMessage::Vector { layer: layer.to_path(), modification }); diff --git a/editor/src/messages/tool/tool_messages/pen_tool.rs b/editor/src/messages/tool/tool_messages/pen_tool.rs index 5c945f9a..2c439f25 100644 --- a/editor/src/messages/tool/tool_messages/pen_tool.rs +++ b/editor/src/messages/tool/tool_messages/pen_tool.rs @@ -245,7 +245,7 @@ impl PenToolData { responses.add(DocumentMessage::DeselectAllLayers); // Get the position and set properties - let transform = document.metadata().document_to_viewport * document.metadata().transform_to_viewport(parent); + let transform = document.metadata().transform_to_viewport(parent); let snapped_position = self.snap_manager.snap_position(responses, document, input.mouse.position); let start_position = transform.inverse().transform_point2(snapped_position); self.weight = line_weight; diff --git a/editor/src/messages/tool/tool_messages/spline_tool.rs b/editor/src/messages/tool/tool_messages/spline_tool.rs index e5e4282d..1e1ef7d4 100644 --- a/editor/src/messages/tool/tool_messages/spline_tool.rs +++ b/editor/src/messages/tool/tool_messages/spline_tool.rs @@ -203,8 +203,6 @@ impl Fsm for SplineToolFsmState { .. } = tool_action_data; - let transform = document.metadata().document_to_viewport; - let ToolMessage::Spline(event) = event else { return self; }; @@ -217,6 +215,9 @@ impl Fsm for SplineToolFsmState { responses.add(DocumentMessage::StartTransaction); responses.add(DocumentMessage::DeselectAllLayers); + let parent = document.new_layer_parent(); + let transform = document.metadata().transform_to_viewport(parent); + tool_data.snap_manager.start_snap(document, input, document.bounding_boxes(None, None, render_data), true, true); tool_data.snap_manager.add_all_document_handles(document, input, &[], &[], &[]); let snapped_position = tool_data.snap_manager.snap_position(responses, document, input.mouse.position); @@ -228,7 +229,7 @@ impl Fsm for SplineToolFsmState { tool_data.weight = tool_options.line_weight; - let layer = graph_modification_utils::new_vector_layer(vec![], generate_uuid(), document.new_layer_parent(), responses); + let layer = graph_modification_utils::new_vector_layer(vec![], generate_uuid(), parent, responses); responses.add(GraphOperationMessage::FillSet { layer: layer.to_path(), @@ -244,7 +245,11 @@ impl Fsm for SplineToolFsmState { SplineToolFsmState::Drawing } (SplineToolFsmState::Drawing, SplineToolMessage::DragStop) => { + let Some(layer) = tool_data.layer else { + return SplineToolFsmState::Ready; + }; let snapped_position = tool_data.snap_manager.snap_position(responses, document, input.mouse.position); + let transform = document.metadata().transform_to_viewport(layer); let pos = transform.inverse().transform_point2(snapped_position); if let Some(last_pos) = tool_data.points.last() { @@ -259,7 +264,11 @@ impl Fsm for SplineToolFsmState { SplineToolFsmState::Drawing } (SplineToolFsmState::Drawing, SplineToolMessage::PointerMove) => { + let Some(layer) = tool_data.layer else { + return SplineToolFsmState::Ready; + }; let snapped_position = tool_data.snap_manager.snap_position(responses, document, input.mouse.position); + let transform = document.metadata().transform_to_viewport(layer); let pos = transform.inverse().transform_point2(snapped_position); tool_data.next_point = pos; diff --git a/editor/src/messages/tool/tool_messages/text_tool.rs b/editor/src/messages/tool/tool_messages/text_tool.rs index 7dc2926e..bb789162 100644 --- a/editor/src/messages/tool/tool_messages/text_tool.rs +++ b/editor/src/messages/tool/tool_messages/text_tool.rs @@ -294,7 +294,7 @@ impl TextToolData { text: String::new(), font: editing_text.font.clone(), size: editing_text.font_size, - parent: LayerNodeIdentifier::ROOT, + parent: document.new_layer_parent(), insert_index: -1, }); responses.add(GraphOperationMessage::FillSet { diff --git a/node-graph/gcore/src/graphic_element/renderer.rs b/node-graph/gcore/src/graphic_element/renderer.rs index abe4b625..4f8c1397 100644 --- a/node-graph/gcore/src/graphic_element/renderer.rs +++ b/node-graph/gcore/src/graphic_element/renderer.rs @@ -395,7 +395,7 @@ impl GraphicElementRendered for Artboard { } } fn add_click_targets(&self, click_targets: &mut Vec) { - let subpath = Subpath::new_rect(self.location.as_dvec2(), self.location.as_dvec2() + self.dimensions.as_dvec2()); + let subpath = Subpath::new_rect(DVec2::ZERO, self.dimensions.as_dvec2()); click_targets.push(ClickTarget { stroke_width: 0., subpath }); } } diff --git a/node-graph/gcore/src/transform.rs b/node-graph/gcore/src/transform.rs index cbe1450e..006874d6 100644 --- a/node-graph/gcore/src/transform.rs +++ b/node-graph/gcore/src/transform.rs @@ -127,7 +127,7 @@ impl TransformMut for VectorData { impl Transform for Artboard { fn transform(&self) -> DAffine2 { - DAffine2::IDENTITY + DAffine2::from_translation(self.location.as_dvec2()) } fn local_pivot(&self, pivot: DVec2) -> DVec2 { self.location.as_dvec2() + self.dimensions.as_dvec2() * pivot