mirror of
https://github.com/GraphiteEditor/Graphite.git
synced 2025-12-23 10:11:54 +00:00
Fix brush layers growing hugely when resizing transforms with Select tool (#1201)
* Fix brush tool resize * Fix typo * Fix image transforms * Remove input from image network * Fix merge error --------- Co-authored-by: Keavon Chambers <keavon@keavon.com>
This commit is contained in:
parent
d7c5658852
commit
ab2de96640
4 changed files with 35 additions and 25 deletions
|
|
@ -31,7 +31,7 @@ use document_legacy::layers::layer_layer::CachedOutputData;
|
|||
use document_legacy::layers::style::{RenderData, ViewMode};
|
||||
use document_legacy::{DocumentError, DocumentResponse, LayerId, Operation as DocumentOperation};
|
||||
use graph_craft::document::value::TaggedValue;
|
||||
use graph_craft::document::{NodeId, NodeInput};
|
||||
use graph_craft::document::{NodeId, NodeInput, NodeNetwork};
|
||||
use graphene_core::raster::ImageFrame;
|
||||
use graphene_core::text::Font;
|
||||
|
||||
|
|
@ -579,8 +579,7 @@ impl MessageHandler<DocumentMessage, (u64, &InputPreprocessorMessageHandler, &Pe
|
|||
};
|
||||
|
||||
let path = vec![generate_uuid()];
|
||||
let [image_node_id, transform_node_id, downres_node_id] = [100, 101, 102];
|
||||
let mut network = crate::messages::portfolio::document::node_graph::new_image_network(32, downres_node_id);
|
||||
let mut network = NodeNetwork::default();
|
||||
|
||||
// Transform of parent folder
|
||||
let to_parent_folder = self.document_legacy.generate_transform_across_scope(&path[..path.len() - 1], None).unwrap_or_default();
|
||||
|
|
@ -600,30 +599,19 @@ impl MessageHandler<DocumentMessage, (u64, &InputPreprocessorMessageHandler, &Pe
|
|||
|
||||
responses.add(DocumentMessage::StartTransaction);
|
||||
|
||||
let mut pos = 8;
|
||||
let mut next_pos = || {
|
||||
pos += 8;
|
||||
graph_craft::document::DocumentNodeMetadata::position((pos, 4))
|
||||
};
|
||||
|
||||
network.nodes.insert(
|
||||
image_node_id,
|
||||
network.push_node(
|
||||
image_node_type.to_document_node(
|
||||
[graph_craft::document::NodeInput::value(
|
||||
graph_craft::document::value::TaggedValue::ImageFrame(ImageFrame { image, transform: DAffine2::IDENTITY }),
|
||||
false,
|
||||
)],
|
||||
next_pos(),
|
||||
graph_craft::document::DocumentNodeMetadata::position((8, 4)),
|
||||
),
|
||||
false,
|
||||
);
|
||||
network.nodes.insert(
|
||||
transform_node_id,
|
||||
transform_node_type.to_document_node_default_inputs([Some(graph_craft::document::NodeInput::node(image_node_id, 0))], next_pos()),
|
||||
);
|
||||
network.nodes.insert(
|
||||
downres_node_id,
|
||||
downres_node_type.to_document_node_default_inputs([Some(graph_craft::document::NodeInput::node(transform_node_id, 0))], next_pos()),
|
||||
);
|
||||
network.push_node(transform_node_type.to_document_node_default_inputs([], Default::default()), true);
|
||||
network.push_node(downres_node_type.to_document_node_default_inputs([], Default::default()), true);
|
||||
network.push_output_node();
|
||||
|
||||
responses.add(DocumentOperation::AddFrame {
|
||||
path: path.clone(),
|
||||
|
|
|
|||
|
|
@ -133,14 +133,26 @@ impl<'a> ModifyInputsContext<'a> {
|
|||
});
|
||||
}
|
||||
|
||||
fn transform_set(&mut self, transform: DAffine2, transform_in: TransformIn, parent_transform: DAffine2, bounds: LayerBounds, skip_rerender: bool) {
|
||||
fn transform_set(&mut self, mut transform: DAffine2, transform_in: TransformIn, parent_transform: DAffine2, current_transform: Option<DAffine2>, bounds: LayerBounds, skip_rerender: bool) {
|
||||
self.modify_inputs("Transform", skip_rerender, |inputs| {
|
||||
let current_transform_node = transform_utils::get_current_transform(inputs);
|
||||
|
||||
let to = match transform_in {
|
||||
TransformIn::Local => DAffine2::IDENTITY,
|
||||
TransformIn::Scope { scope } => scope * parent_transform,
|
||||
TransformIn::Viewport => parent_transform,
|
||||
};
|
||||
let pivot = DAffine2::from_translation(bounds.layerspace_pivot(transform_utils::get_current_normalized_pivot(inputs)));
|
||||
|
||||
if let Some(current_transform) = current_transform.filter(|transform| transform.inverse().is_finite() && current_transform_node.inverse().is_finite()) {
|
||||
// this_transform * upstream_transforms = current_transform
|
||||
// So this_transform.inverse() * current_transform = upstream_transforms
|
||||
let upstream_transform = (pivot * current_transform_node * pivot.inverse()).inverse() * current_transform;
|
||||
// desired_final_transform = this_transform * upstream_transform
|
||||
// So this_transform = desired_final_transform * upstream_transform.inverse()
|
||||
transform = transform * upstream_transform.inverse();
|
||||
}
|
||||
|
||||
let transform = pivot.inverse() * to.inverse() * transform * pivot;
|
||||
transform_utils::update_transform(inputs, transform);
|
||||
});
|
||||
|
|
@ -262,9 +274,10 @@ impl MessageHandler<GraphOperationMessage, (&mut Document, &mut NodeGraphMessage
|
|||
skip_rerender,
|
||||
} => {
|
||||
let parent_transform = document.multiply_transforms(&layer[..layer.len() - 1]).unwrap_or_default();
|
||||
let current_transform = document.layer(&layer).ok().map(|layer| layer.transform);
|
||||
let bounds = LayerBounds::new(document, &layer);
|
||||
if let Some(mut modify_inputs) = ModifyInputsContext::new(&layer, document, node_graph, responses) {
|
||||
modify_inputs.transform_set(transform, transform_in, parent_transform, bounds, skip_rerender);
|
||||
modify_inputs.transform_set(transform, transform_in, parent_transform, current_transform, bounds, skip_rerender);
|
||||
}
|
||||
let transform = transform.to_cols_array();
|
||||
responses.add(match transform_in {
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue