mirror of
https://github.com/GraphiteEditor/Graphite.git
synced 2025-08-02 04:22:15 +00:00
Add Vector Repeat Node (#1371)
* Implement skeleton for repeat node * Implemen RepeatNode
This commit is contained in:
parent
8b9f279f12
commit
388d51deac
4 changed files with 49 additions and 0 deletions
|
@ -1749,6 +1749,19 @@ fn static_nodes() -> Vec<DocumentNodeType> {
|
||||||
properties: node_properties::stroke_properties,
|
properties: node_properties::stroke_properties,
|
||||||
..Default::default()
|
..Default::default()
|
||||||
},
|
},
|
||||||
|
DocumentNodeType {
|
||||||
|
name: "Repeat",
|
||||||
|
category: "Vector",
|
||||||
|
identifier: NodeImplementation::proto("graphene_core::vector::RepeatNode<_, _>"),
|
||||||
|
inputs: vec![
|
||||||
|
DocumentInputType::value("Vector Data", TaggedValue::VectorData(graphene_core::vector::VectorData::empty()), true),
|
||||||
|
DocumentInputType::value("Direction", TaggedValue::DVec2((100., 0.).into()), false),
|
||||||
|
DocumentInputType::value("Count", TaggedValue::U32(10), false),
|
||||||
|
],
|
||||||
|
outputs: vec![DocumentOutputType::new("Vector", FrontendGraphDataType::Subpath)],
|
||||||
|
properties: node_properties::repeat_properties,
|
||||||
|
..Default::default()
|
||||||
|
},
|
||||||
DocumentNodeType {
|
DocumentNodeType {
|
||||||
name: "Image Segmentation",
|
name: "Image Segmentation",
|
||||||
category: "Image Adjustments",
|
category: "Image Adjustments",
|
||||||
|
|
|
@ -1583,6 +1583,13 @@ pub fn stroke_properties(document_node: &DocumentNode, node_id: NodeId, _context
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn repeat_properties(document_node: &DocumentNode, node_id: NodeId, _context: &mut NodePropertiesContext) -> Vec<LayoutGroup> {
|
||||||
|
let direction = vec2_widget(document_node, node_id, 1, "Direction", "X", "Y", " px", add_blank_assist);
|
||||||
|
let count = number_widget(document_node, node_id, 2, "Count", NumberInput::default().min(1.), true);
|
||||||
|
|
||||||
|
vec![direction, LayoutGroup::Row { widgets: count }]
|
||||||
|
}
|
||||||
|
|
||||||
/// Fill Node Widgets LayoutGroup
|
/// Fill Node Widgets LayoutGroup
|
||||||
pub fn fill_properties(document_node: &DocumentNode, node_id: NodeId, _context: &mut NodePropertiesContext) -> Vec<LayoutGroup> {
|
pub fn fill_properties(document_node: &DocumentNode, node_id: NodeId, _context: &mut NodePropertiesContext) -> Vec<LayoutGroup> {
|
||||||
let fill_type_index = 1;
|
let fill_type_index = 1;
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
use super::style::{Fill, FillType, Gradient, GradientType, Stroke};
|
use super::style::{Fill, FillType, Gradient, GradientType, Stroke};
|
||||||
use super::VectorData;
|
use super::VectorData;
|
||||||
use crate::{Color, Node};
|
use crate::{Color, Node};
|
||||||
|
use bezier_rs::Subpath;
|
||||||
use glam::{DAffine2, DVec2};
|
use glam::{DAffine2, DVec2};
|
||||||
|
|
||||||
#[derive(Debug, Clone, Copy)]
|
#[derive(Debug, Clone, Copy)]
|
||||||
|
@ -71,3 +72,30 @@ fn set_vector_data_stroke(
|
||||||
});
|
});
|
||||||
vector_data
|
vector_data
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[derive(Debug, Clone, Copy)]
|
||||||
|
pub struct RepeatNode<Direction, Count> {
|
||||||
|
direction: Direction,
|
||||||
|
count: Count,
|
||||||
|
}
|
||||||
|
|
||||||
|
#[node_macro::node_fn(RepeatNode)]
|
||||||
|
fn repeat_vector_data(mut vector_data: VectorData, direction: DVec2, count: u32) -> VectorData {
|
||||||
|
// repeat the vector data
|
||||||
|
let VectorData { subpaths, transform, .. } = &vector_data;
|
||||||
|
|
||||||
|
let mut new_subpaths: Vec<Subpath<_>> = Vec::with_capacity(subpaths.len() * count as usize);
|
||||||
|
let inverse = transform.inverse();
|
||||||
|
let direction = inverse.transform_vector2(direction);
|
||||||
|
for i in 0..count {
|
||||||
|
let transform = DAffine2::from_translation(direction * i as f64);
|
||||||
|
log::debug!("transform: {:?}", transform);
|
||||||
|
for mut subpath in subpaths.clone() {
|
||||||
|
subpath.apply_transform(transform);
|
||||||
|
new_subpaths.push(subpath);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
vector_data.subpaths = new_subpaths;
|
||||||
|
vector_data
|
||||||
|
}
|
||||||
|
|
|
@ -526,6 +526,7 @@ fn node_registry() -> HashMap<NodeIdentifier, HashMap<NodeIOTypes, NodeConstruct
|
||||||
register_node!(graphene_core::transform::SetTransformNode<_>, input: ImageFrame<Color>, params: [DAffine2]),
|
register_node!(graphene_core::transform::SetTransformNode<_>, input: ImageFrame<Color>, params: [DAffine2]),
|
||||||
register_node!(graphene_core::vector::SetFillNode<_, _, _, _, _, _, _>, input: VectorData, params: [graphene_core::vector::style::FillType, Option<graphene_core::Color>, graphene_core::vector::style::GradientType, DVec2, DVec2, DAffine2, Vec<(f64, Option<graphene_core::Color>)>]),
|
register_node!(graphene_core::vector::SetFillNode<_, _, _, _, _, _, _>, input: VectorData, params: [graphene_core::vector::style::FillType, Option<graphene_core::Color>, graphene_core::vector::style::GradientType, DVec2, DVec2, DAffine2, Vec<(f64, Option<graphene_core::Color>)>]),
|
||||||
register_node!(graphene_core::vector::SetStrokeNode<_, _, _, _, _, _, _>, input: VectorData, params: [Option<graphene_core::Color>, f32, Vec<f32>, f32, graphene_core::vector::style::LineCap, graphene_core::vector::style::LineJoin, f32]),
|
register_node!(graphene_core::vector::SetStrokeNode<_, _, _, _, _, _, _>, input: VectorData, params: [Option<graphene_core::Color>, f32, Vec<f32>, f32, graphene_core::vector::style::LineCap, graphene_core::vector::style::LineJoin, f32]),
|
||||||
|
register_node!(graphene_core::vector::RepeatNode<_, _>, input: VectorData, params: [DVec2, u32]),
|
||||||
register_node!(graphene_core::vector::generator_nodes::UnitCircleGenerator, input: (), params: []),
|
register_node!(graphene_core::vector::generator_nodes::UnitCircleGenerator, input: (), params: []),
|
||||||
register_node!(
|
register_node!(
|
||||||
graphene_core::vector::generator_nodes::PathGenerator<_>,
|
graphene_core::vector::generator_nodes::PathGenerator<_>,
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue