From fd20d51e851174b9a17296b6c0dc803cd1fb5e7e Mon Sep 17 00:00:00 2001 From: adamgerhant <116332429+adamgerhant@users.noreply.github.com> Date: Fri, 25 Oct 2024 16:54:37 -0700 Subject: [PATCH] Fix various crashes and bugs (#2075) * Fix offset brush tool * Fixes --- .../portfolio/portfolio_message_handler.rs | 2 + .../messages/tool/tool_messages/brush_tool.rs | 87 ++++++++++--------- editor/src/node_graph_executor.rs | 2 +- node-graph/graph-craft/src/document.rs | 3 +- 4 files changed, 49 insertions(+), 45 deletions(-) diff --git a/editor/src/messages/portfolio/portfolio_message_handler.rs b/editor/src/messages/portfolio/portfolio_message_handler.rs index 8eede2d1..436081b7 100644 --- a/editor/src/messages/portfolio/portfolio_message_handler.rs +++ b/editor/src/messages/portfolio/portfolio_message_handler.rs @@ -749,6 +749,8 @@ impl MessageHandler> for PortfolioMes responses.add(MenuBarMessage::SendLayout); responses.add(PortfolioMessage::UpdateOpenDocumentsList); responses.add(FrontendMessage::UpdateActiveDocument { document_id }); + responses.add(ToolMessage::InitTools); + responses.add(NodeGraphMessage::Init); responses.add(OverlaysMessage::Draw); responses.add(BroadcastEvent::ToolAbort); responses.add(BroadcastEvent::SelectionChanged); diff --git a/editor/src/messages/tool/tool_messages/brush_tool.rs b/editor/src/messages/tool/tool_messages/brush_tool.rs index f2928c15..342ca96b 100644 --- a/editor/src/messages/tool/tool_messages/brush_tool.rs +++ b/editor/src/messages/tool/tool_messages/brush_tool.rs @@ -317,60 +317,63 @@ impl Fsm for BrushToolFsmState { responses.add(DocumentMessage::StartTransaction); let loaded_layer = tool_data.load_existing_strokes(document); - let layer = loaded_layer.unwrap_or_else(|| new_brush_layer(document, responses)); - tool_data.layer = Some(layer); + if let Some(layer) = loaded_layer { + let pos = document + .network_interface + .document_metadata() + .downstream_transform_to_viewport(layer) + .inverse() + .transform_point2(input.mouse.position); + let layer_position = tool_data.transform.inverse().transform_point2(pos); + let layer_document_scale = document.metadata().downstream_transform_to_viewport(layer) * tool_data.transform; - let parent = layer.parent(document.metadata()).unwrap_or_else(|| document.new_layer_parent(true)); - let parent_transform = document - .network_interface - .document_metadata() - .transform_to_viewport(parent) - .inverse() - .transform_point2(input.mouse.position); - let layer_position = tool_data.transform.inverse().transform_point2(parent_transform); + // TODO: Also scale it based on the input image ('Background' input). + // TODO: Resizing the input image results in a different brush size from the chosen diameter. + let layer_scale = 0.0001_f64 // Safety against division by zero + .max((layer_document_scale.matrix2 * glam::DVec2::X).length()) + .max((layer_document_scale.matrix2 * glam::DVec2::Y).length()); - let layer_document_scale = document.metadata().transform_to_document(parent) * tool_data.transform; + // Start a new stroke with a single sample + let blend_mode = match tool_options.draw_mode { + DrawMode::Draw => tool_options.blend_mode, + DrawMode::Erase => BlendMode::Erase, + DrawMode::Restore => BlendMode::Restore, + }; + tool_data.strokes.push(BrushStroke { + trace: vec![BrushInputSample { position: layer_position }], + style: BrushStyle { + color: tool_options.color.active_color().unwrap_or_default(), + diameter: tool_options.diameter / layer_scale, + hardness: tool_options.hardness, + flow: tool_options.flow, + spacing: tool_options.spacing, + blend_mode, + }, + }); - // TODO: Also scale it based on the input image ('Background' input). - // TODO: Resizing the input image results in a different brush size from the chosen diameter. - let layer_scale = 0.0001_f64 // Safety against division by zero - .max((layer_document_scale.matrix2 * glam::DVec2::X).length()) - .max((layer_document_scale.matrix2 * glam::DVec2::Y).length()); - - // Start a new stroke with a single sample - let blend_mode = match tool_options.draw_mode { - DrawMode::Draw => tool_options.blend_mode, - DrawMode::Erase => BlendMode::Erase, - DrawMode::Restore => BlendMode::Restore, - }; - tool_data.strokes.push(BrushStroke { - trace: vec![BrushInputSample { position: layer_position }], - style: BrushStyle { - color: tool_options.color.active_color().unwrap_or_default(), - diameter: tool_options.diameter / layer_scale, - hardness: tool_options.hardness, - flow: tool_options.flow, - spacing: tool_options.spacing, - blend_mode, - }, - }); - - tool_data.update_strokes(responses); - - BrushToolFsmState::Drawing + tool_data.update_strokes(responses); + BrushToolFsmState::Drawing + } + // Create the new layer, wait for the render output to return its transform, and then create the rest of the layer + else { + new_brush_layer(document, responses); + responses.add(NodeGraphMessage::RunDocumentGraph); + responses.add(Message::StartBuffer); + responses.add(BrushToolMessage::DragStart); + BrushToolFsmState::Ready + } } (BrushToolFsmState::Drawing, BrushToolMessage::PointerMove) => { if let Some(layer) = tool_data.layer { if let Some(stroke) = tool_data.strokes.last_mut() { - let parent = layer.parent(document.metadata()).unwrap_or(LayerNodeIdentifier::ROOT_PARENT); - let parent_position = document + let layer_position = document .network_interface .document_metadata() - .transform_to_viewport(parent) + .downstream_transform_to_viewport(layer) .inverse() .transform_point2(input.mouse.position); - let layer_position = tool_data.transform.inverse().transform_point2(parent_position); + let layer_position = tool_data.transform.inverse().transform_point2(layer_position); stroke.trace.push(BrushInputSample { position: layer_position }) } diff --git a/editor/src/node_graph_executor.rs b/editor/src/node_graph_executor.rs index 9dc90c37..1dd24236 100644 --- a/editor/src/node_graph_executor.rs +++ b/editor/src/node_graph_executor.rs @@ -488,7 +488,7 @@ impl NodeGraphExecutor { let render_config = RenderConfig { viewport: Footprint { - transform: transform * DAffine2::from_scale(DVec2::splat(export_config.scale_factor)), + transform: DAffine2::from_scale(DVec2::splat(export_config.scale_factor)) * transform, resolution: (size * export_config.scale_factor).as_uvec2(), ..Default::default() }, diff --git a/node-graph/graph-craft/src/document.rs b/node-graph/graph-craft/src/document.rs index 7c106f09..d29c536f 100644 --- a/node-graph/graph-craft/src/document.rs +++ b/node-graph/graph-craft/src/document.rs @@ -1025,7 +1025,6 @@ impl NodeNetwork { warn!("The node which was supposed to be flattened does not exist in the network, id {node_id} network {self:#?}"); return; }; - // If the node is hidden, replace it with an identity node let identity_node = DocumentNodeImplementation::ProtoNode("graphene_core::ops::IdentityNode".into()); if !node.visible && node.implementation != identity_node { @@ -1033,8 +1032,8 @@ impl NodeNetwork { // Connect layer node to the graphic group below node.inputs.drain(1..); + node.manual_composition = None; self.nodes.insert(id, node); - return; }