mirror of
https://github.com/GraphiteEditor/Graphite.git
synced 2026-10-01 02:18:12 +08:00
@@ -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 })
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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()
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user