Fix various crashes and bugs (#2075)

* Fix offset brush tool

* Fixes
This commit is contained in:
adamgerhant
2024-10-25 16:54:37 -07:00
committed by GitHub
parent 3e0178a032
commit fd20d51e85
4 changed files with 49 additions and 45 deletions
@@ -749,6 +749,8 @@ impl MessageHandler<PortfolioMessage, PortfolioMessageData<'_>> for PortfolioMes
responses.add(MenuBarMessage::SendLayout); responses.add(MenuBarMessage::SendLayout);
responses.add(PortfolioMessage::UpdateOpenDocumentsList); responses.add(PortfolioMessage::UpdateOpenDocumentsList);
responses.add(FrontendMessage::UpdateActiveDocument { document_id }); responses.add(FrontendMessage::UpdateActiveDocument { document_id });
responses.add(ToolMessage::InitTools);
responses.add(NodeGraphMessage::Init);
responses.add(OverlaysMessage::Draw); responses.add(OverlaysMessage::Draw);
responses.add(BroadcastEvent::ToolAbort); responses.add(BroadcastEvent::ToolAbort);
responses.add(BroadcastEvent::SelectionChanged); responses.add(BroadcastEvent::SelectionChanged);
@@ -317,60 +317,63 @@ impl Fsm for BrushToolFsmState {
responses.add(DocumentMessage::StartTransaction); responses.add(DocumentMessage::StartTransaction);
let loaded_layer = tool_data.load_existing_strokes(document); let loaded_layer = tool_data.load_existing_strokes(document);
let layer = loaded_layer.unwrap_or_else(|| new_brush_layer(document, responses)); if let Some(layer) = loaded_layer {
tool_data.layer = Some(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)); // TODO: Also scale it based on the input image ('Background' input).
let parent_transform = document // TODO: Resizing the input image results in a different brush size from the chosen diameter.
.network_interface let layer_scale = 0.0001_f64 // Safety against division by zero
.document_metadata() .max((layer_document_scale.matrix2 * glam::DVec2::X).length())
.transform_to_viewport(parent) .max((layer_document_scale.matrix2 * glam::DVec2::Y).length());
.inverse()
.transform_point2(input.mouse.position);
let layer_position = tool_data.transform.inverse().transform_point2(parent_transform);
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). tool_data.update_strokes(responses);
// TODO: Resizing the input image results in a different brush size from the chosen diameter. BrushToolFsmState::Drawing
let layer_scale = 0.0001_f64 // Safety against division by zero }
.max((layer_document_scale.matrix2 * glam::DVec2::X).length()) // Create the new layer, wait for the render output to return its transform, and then create the rest of the layer
.max((layer_document_scale.matrix2 * glam::DVec2::Y).length()); else {
new_brush_layer(document, responses);
// Start a new stroke with a single sample responses.add(NodeGraphMessage::RunDocumentGraph);
let blend_mode = match tool_options.draw_mode { responses.add(Message::StartBuffer);
DrawMode::Draw => tool_options.blend_mode, responses.add(BrushToolMessage::DragStart);
DrawMode::Erase => BlendMode::Erase, BrushToolFsmState::Ready
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
} }
(BrushToolFsmState::Drawing, BrushToolMessage::PointerMove) => { (BrushToolFsmState::Drawing, BrushToolMessage::PointerMove) => {
if let Some(layer) = tool_data.layer { if let Some(layer) = tool_data.layer {
if let Some(stroke) = tool_data.strokes.last_mut() { if let Some(stroke) = tool_data.strokes.last_mut() {
let parent = layer.parent(document.metadata()).unwrap_or(LayerNodeIdentifier::ROOT_PARENT); let layer_position = document
let parent_position = document
.network_interface .network_interface
.document_metadata() .document_metadata()
.transform_to_viewport(parent) .downstream_transform_to_viewport(layer)
.inverse() .inverse()
.transform_point2(input.mouse.position); .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 }) stroke.trace.push(BrushInputSample { position: layer_position })
} }
+1 -1
View File
@@ -488,7 +488,7 @@ impl NodeGraphExecutor {
let render_config = RenderConfig { let render_config = RenderConfig {
viewport: Footprint { 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(), resolution: (size * export_config.scale_factor).as_uvec2(),
..Default::default() ..Default::default()
}, },
+1 -2
View File
@@ -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:#?}"); warn!("The node which was supposed to be flattened does not exist in the network, id {node_id} network {self:#?}");
return; return;
}; };
// If the node is hidden, replace it with an identity node // If the node is hidden, replace it with an identity node
let identity_node = DocumentNodeImplementation::ProtoNode("graphene_core::ops::IdentityNode".into()); let identity_node = DocumentNodeImplementation::ProtoNode("graphene_core::ops::IdentityNode".into());
if !node.visible && node.implementation != identity_node { if !node.visible && node.implementation != identity_node {
@@ -1033,8 +1032,8 @@ impl NodeNetwork {
// Connect layer node to the graphic group below // Connect layer node to the graphic group below
node.inputs.drain(1..); node.inputs.drain(1..);
node.manual_composition = None;
self.nodes.insert(id, node); self.nodes.insert(id, node);
return; return;
} }