diff --git a/editor/src/messages/portfolio/document/node_graph/node_graph_message_handler/document_node_types.rs b/editor/src/messages/portfolio/document/node_graph/node_graph_message_handler/document_node_types.rs index c182557e..a52c4038 100644 --- a/editor/src/messages/portfolio/document/node_graph/node_graph_message_handler/document_node_types.rs +++ b/editor/src/messages/portfolio/document/node_graph/node_graph_message_handler/document_node_types.rs @@ -735,19 +735,30 @@ fn static_nodes() -> Vec { }, DocumentNodeType { name: "Transform", - category: "Vector", + category: "Transform", identifier: NodeImplementation::proto("graphene_core::transform::TransformNode<_, _, _, _, _>"), inputs: vec![ - DocumentInputType::value("Vector Data", TaggedValue::VectorData(graphene_core::vector::VectorData::empty()), true), + DocumentInputType::value("Data", TaggedValue::VectorData(graphene_core::vector::VectorData::empty()), true), DocumentInputType::value("Translation", TaggedValue::DVec2(DVec2::ZERO), false), DocumentInputType::value("Rotation", TaggedValue::F64(0.), false), DocumentInputType::value("Scale", TaggedValue::DVec2(DVec2::ONE), false), DocumentInputType::value("Skew", TaggedValue::DVec2(DVec2::ZERO), false), DocumentInputType::value("Pivot", TaggedValue::DVec2(DVec2::splat(0.5)), false), ], - outputs: vec![DocumentOutputType::new("Vector", FrontendGraphDataType::Subpath)], + outputs: vec![DocumentOutputType::new("Data", FrontendGraphDataType::Subpath)], properties: node_properties::transform_properties, }, + DocumentNodeType { + name: "SetTransform", + category: "Transform", + identifier: NodeImplementation::proto("graphene_core::transform::SetTransformNode<_>"), + inputs: vec![ + DocumentInputType::value("Data", TaggedValue::VectorData(graphene_core::vector::VectorData::empty()), true), + DocumentInputType::value("Transform", TaggedValue::DAffine2(DAffine2::IDENTITY), true), + ], + outputs: vec![DocumentOutputType::new("Data", FrontendGraphDataType::Subpath)], + properties: node_properties::no_properties, + }, DocumentNodeType { name: "Fill", category: "Vector", diff --git a/node-graph/gcore/src/transform.rs b/node-graph/gcore/src/transform.rs index 3964bb67..5ca5bdcb 100644 --- a/node-graph/gcore/src/transform.rs +++ b/node-graph/gcore/src/transform.rs @@ -80,3 +80,14 @@ pub(crate) fn transform_vector_data(mut data: Data, translat data } +#[derive(Debug, Clone, Copy)] +pub struct SetTransformNode { + pub(crate) transform: TransformInput, +} + +#[node_macro::node_fn(SetTransformNode)] +pub(crate) fn set_transform(mut data: Data, transform: TransformInput) -> Data { + let data_transform = data.transform_mut(); + *data_transform = transform.transform(); + data +} diff --git a/node-graph/interpreted-executor/src/node_registry.rs b/node-graph/interpreted-executor/src/node_registry.rs index 4fe8d90d..a48813d1 100644 --- a/node-graph/interpreted-executor/src/node_registry.rs +++ b/node-graph/interpreted-executor/src/node_registry.rs @@ -457,6 +457,10 @@ fn node_registry() -> HashMap, input: &QuantizationChannels, params: []), register_node!(graphene_core::transform::TransformNode<_, _, _, _, _>, input: VectorData, params: [DVec2, f64, DVec2, DVec2, DVec2]), register_node!(graphene_core::transform::TransformNode<_, _, _, _, _>, input: ImageFrame, params: [DVec2, f64, DVec2, DVec2, DVec2]), + register_node!(graphene_core::transform::SetTransformNode<_>, input: VectorData, params: [VectorData]), + register_node!(graphene_core::transform::SetTransformNode<_>, input: ImageFrame, params: [ImageFrame]), + register_node!(graphene_core::transform::SetTransformNode<_>, input: VectorData, params: [DAffine2]), + register_node!(graphene_core::transform::SetTransformNode<_>, input: ImageFrame, params: [DAffine2]), register_node!(graphene_core::vector::SetFillNode<_, _, _, _, _, _, _>, input: VectorData, params: [graphene_core::vector::style::FillType, Option, graphene_core::vector::style::GradientType, DVec2, DVec2, DAffine2, Vec<(f64, Option)>]), register_node!(graphene_core::vector::SetStrokeNode<_, _, _, _, _, _, _>, input: VectorData, params: [Option, f64, Vec, f64, graphene_core::vector::style::LineCap, graphene_core::vector::style::LineJoin, f64]), register_node!(graphene_core::vector::generator_nodes::UnitCircleGenerator, input: (), params: []),