From 415d3f6bba4ad2437cf2ed3575c4c16b1a882fd8 Mon Sep 17 00:00:00 2001 From: Ezbaze Date: Mon, 14 Aug 2023 02:48:58 +0100 Subject: [PATCH 01/12] Add new Primitive Shape/Curve Nodes --- .../document_node_types.rs | 74 +++++++++++++++++- .../node_properties.rs | 45 +++++++++++ .../gcore/src/vector/generator_nodes.rs | 78 +++++++++++++++++-- .../interpreted-executor/src/node_registry.rs | 7 +- 4 files changed, 193 insertions(+), 11 deletions(-) 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 280c9d03bdf..315b0120a09 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 @@ -1915,11 +1915,79 @@ fn static_nodes() -> Vec { }, (*IMAGINATE_NODE).clone(), DocumentNodeType { - name: "Unit Circle Generator", + name: "Circle", category: "Vector", - identifier: NodeImplementation::proto("graphene_core::vector::generator_nodes::UnitCircleGenerator"), - inputs: vec![DocumentInputType::none()], + identifier: NodeImplementation::proto("graphene_core::vector::generator_nodes::UnitCircleGenerator<_>"), + inputs: vec![DocumentInputType::none(), DocumentInputType::value("Radius", TaggedValue::F32(0.), false)], outputs: vec![DocumentOutputType::new("Vector", FrontendGraphDataType::Subpath)], + properties: node_properties::circle_properties, + ..Default::default() + }, + DocumentNodeType { + name: "Rectangle", + category: "Vector", + identifier: NodeImplementation::proto("graphene_core::vector::generator_nodes::UnitRectangleGenerator<_, _>"), + inputs: vec![ + DocumentInputType::none(), + DocumentInputType::value("Size X", TaggedValue::F32(0.), false), + DocumentInputType::value("Size Y", TaggedValue::F32(0.), false), + ], + outputs: vec![DocumentOutputType::new("Vector", FrontendGraphDataType::Subpath)], + properties: node_properties::rectangle_properties, + ..Default::default() + }, + DocumentNodeType { + name: "Polygon", + category: "Vector", + identifier: NodeImplementation::proto("graphene_core::vector::generator_nodes::UnitPolygonGenerator<_, _>"), + inputs: vec![ + DocumentInputType::none(), + DocumentInputType::value("Sides", TaggedValue::U32(3), false), + DocumentInputType::value("Radius", TaggedValue::F32(0.), false), + ], + outputs: vec![DocumentOutputType::new("Vector", FrontendGraphDataType::Subpath)], + properties: node_properties::polygon_properties, + ..Default::default() + }, + DocumentNodeType { + name: "Star", + category: "Vector", + identifier: NodeImplementation::proto("graphene_core::vector::generator_nodes::UnitStarGenerator<_, _, _>"), + inputs: vec![ + DocumentInputType::none(), + DocumentInputType::value("Sides", TaggedValue::U32(3), false), + DocumentInputType::value("Radius", TaggedValue::F32(0.), false), + DocumentInputType::value("Inner Radius", TaggedValue::F32(0.), false), + ], + outputs: vec![DocumentOutputType::new("Vector", FrontendGraphDataType::Subpath)], + properties: node_properties::star_properties, + ..Default::default() + }, + DocumentNodeType { + name: "Line", + category: "Vector", + identifier: NodeImplementation::proto("graphene_core::vector::generator_nodes::UnitLineGenerator<_, _>"), + inputs: vec![ + DocumentInputType::none(), + DocumentInputType::value("Start", TaggedValue::DVec2(DVec2::new(0., 1.)), false), + DocumentInputType::value("End", TaggedValue::DVec2(DVec2::new(0., 1.)), false), + ], + outputs: vec![DocumentOutputType::new("Vector", FrontendGraphDataType::Subpath)], + properties: node_properties::line_properties, + ..Default::default() + }, + DocumentNodeType { + name: "Spline", + category: "Vector", + identifier: NodeImplementation::proto("graphene_core::vector::generator_nodes::UnitSplineGenerator<_, _, _>"), + inputs: vec![ + DocumentInputType::none(), + DocumentInputType::value("Start", TaggedValue::DVec2(DVec2::new(0., 1.)), false), + DocumentInputType::value("middle", TaggedValue::DVec2(DVec2::new(0., 1.)), false), + DocumentInputType::value("End", TaggedValue::DVec2(DVec2::new(0., 1.)), false), + ], + outputs: vec![DocumentOutputType::new("Vector", FrontendGraphDataType::Subpath)], + properties: node_properties::spline_properties, ..Default::default() }, DocumentNodeType { diff --git a/editor/src/messages/portfolio/document/node_graph/node_graph_message_handler/node_properties.rs b/editor/src/messages/portfolio/document/node_graph/node_graph_message_handler/node_properties.rs index 0c94a7470a6..7a3283a4642 100644 --- a/editor/src/messages/portfolio/document/node_graph/node_graph_message_handler/node_properties.rs +++ b/editor/src/messages/portfolio/document/node_graph/node_graph_message_handler/node_properties.rs @@ -1139,6 +1139,51 @@ pub fn modulo_properties(document_node: &DocumentNode, node_id: NodeId, _context vec![operand("Modulo", 1)] } +pub fn circle_properties(document_node: &DocumentNode, node_id: NodeId, _context: &mut NodePropertiesContext) -> Vec { + let operand = |name: &str, index| { + let widgets = number_widget(document_node, node_id, index, name, NumberInput::default(), true); + + LayoutGroup::Row { widgets } + }; + vec![operand("Radius", 1)] +} + +pub fn rectangle_properties(document_node: &DocumentNode, node_id: NodeId, _context: &mut NodePropertiesContext) -> Vec { + let operand = |name: &str, index| { + let widgets = number_widget(document_node, node_id, index, name, NumberInput::default(), true); + + LayoutGroup::Row { widgets } + }; + vec![operand("Size X", 1), operand("Size Y", 2)] +} + +pub fn polygon_properties(document_node: &DocumentNode, node_id: NodeId, _context: &mut NodePropertiesContext) -> Vec { + let operand = |name: &str, index| { + let widgets = number_widget(document_node, node_id, index, name, NumberInput::default(), true); + + LayoutGroup::Row { widgets } + }; + vec![operand("Points", 1), operand("Radius", 2)] +} + +pub fn star_properties(document_node: &DocumentNode, node_id: NodeId, _context: &mut NodePropertiesContext) -> Vec { + let operand = |name: &str, index| { + let widgets = number_widget(document_node, node_id, index, name, NumberInput::default(), true); + + LayoutGroup::Row { widgets } + }; + vec![operand("Points", 1), operand("Radius", 2), operand("Inner Radius", 3)] +} + +pub fn line_properties(document_node: &DocumentNode, node_id: NodeId, _context: &mut NodePropertiesContext) -> Vec { + let operand = |name: &str, index| vec2_widget(document_node, node_id, index, name, "X", "Y", "px", add_blank_assist); + vec![operand("Start", 1), operand("End", 2)] +} +pub fn spline_properties(document_node: &DocumentNode, node_id: NodeId, _context: &mut NodePropertiesContext) -> Vec { + let operand = |name: &str, index| vec2_widget(document_node, node_id, index, name, "X", "Y", "px", add_blank_assist); + vec![operand("Start", 1), operand("Middle", 2), operand("End", 3)] +} + pub fn transform_properties(document_node: &DocumentNode, node_id: NodeId, _context: &mut NodePropertiesContext) -> Vec { let translation_assist = |widgets: &mut Vec| { let pivot_index = 5; diff --git a/node-graph/gcore/src/vector/generator_nodes.rs b/node-graph/gcore/src/vector/generator_nodes.rs index bd2d6b26663..79e4fcec960 100644 --- a/node-graph/gcore/src/vector/generator_nodes.rs +++ b/node-graph/gcore/src/vector/generator_nodes.rs @@ -6,19 +6,83 @@ use bezier_rs::Subpath; use glam::DVec2; -pub struct UnitCircleGenerator; +#[derive(Debug, Clone, Copy)] +pub struct UnitCircleGenerator { + radius: Radius, +} #[node_macro::node_fn(UnitCircleGenerator)] -fn unit_circle(_input: ()) -> VectorData { - super::VectorData::from_subpath(Subpath::new_ellipse(DVec2::ZERO, DVec2::ONE)) +fn unit_circle(_input: (), radius: f32) -> VectorData { + let radius = radius.into(); + super::VectorData::from_subpath(Subpath::new_ellipse(DVec2::splat(radius * -1.), DVec2::splat(radius))) +} + +#[derive(Debug, Clone, Copy)] +pub struct UnitRectangleGenerator { + size_x: SizeX, + size_y: SizeY, +} + +#[node_macro::node_fn(UnitRectangleGenerator)] +fn unit_square(_input: (), size_x: f32, size_y: f32) -> VectorData { + let size_x: f64 = size_x.into(); + let size_y: f64 = size_y.into(); + let corner1 = DVec2::new(size_x * -1., size_y * -1.); + let corner2 = DVec2::new(size_x, size_y); + + super::VectorData::from_subpaths(vec![Subpath::new_rect(corner1, corner2)]) +} + +#[derive(Debug, Clone, Copy)] +pub struct UnitPolygonGenerator { + points: Points, + radius: Radius, +} + +#[node_macro::node_fn(UnitPolygonGenerator)] +fn unit_polygon(_input: (), points: u32, radius: f32) -> VectorData { + let points = points.into(); + let radius = radius.into(); + super::VectorData::from_subpath(Subpath::new_regular_polygon(DVec2::splat(radius * -1.), points, radius)) } #[derive(Debug, Clone, Copy)] -pub struct UnitSquareGenerator; +pub struct UnitStarGenerator { + points: Points, + radius: Radius, + inner_radius: InnerRadius, +} + +#[node_macro::node_fn(UnitStarGenerator)] +fn unit_star(_input: (), points: u32, radius: f32, inner_radius: f32) -> VectorData { + let points: u64 = points.into(); + let radius: f64 = radius.into(); + let inner_radius: f64 = inner_radius.into(); + + super::VectorData::from_subpath(Subpath::new_regular_star_polygon(DVec2::splat(radius * -1.), points, radius, inner_radius)) +} + +#[derive(Debug, Clone, Copy)] +pub struct UnitLineGenerator { + pos_1: Pos1, + pos_2: Pos2, +} + +#[node_macro::node_fn(UnitLineGenerator)] +fn unit_line(_input: (), pos_1: DVec2, pos_2: DVec2) -> VectorData { + super::VectorData::from_subpaths(vec![Subpath::new_line(pos_1, pos_2)]) +} + +#[derive(Debug, Clone, Copy)] +pub struct UnitSplineGenerator { + pos_1: Pos1, + pos_2: Pos2, + pos_3: Pos3, +} -#[node_macro::node_fn(UnitSquareGenerator)] -fn unit_square(_input: ()) -> VectorData { - super::VectorData::from_subpaths(vec![Subpath::new_ellipse(DVec2::ZERO, DVec2::ONE)]) +#[node_macro::node_fn(UnitSplineGenerator)] +fn unit_spline(_input: (), pos_1: DVec2, pos_2: DVec2, pos_3: DVec2) -> VectorData { + super::VectorData::from_subpaths(vec![Subpath::new_cubic_spline(vec![pos_1, pos_2, pos_3])]) } // TODO(TrueDoctor): I removed the Arc requirement we should think about when it makes sense to use it vs making a generic value node diff --git a/node-graph/interpreted-executor/src/node_registry.rs b/node-graph/interpreted-executor/src/node_registry.rs index cb0e0f958a4..c0a8fd38559 100644 --- a/node-graph/interpreted-executor/src/node_registry.rs +++ b/node-graph/interpreted-executor/src/node_registry.rs @@ -630,7 +630,12 @@ fn node_registry() -> HashMap, input: VectorData, params: [DVec2, u32]), register_node!(graphene_core::vector::BoundingBoxNode, input: VectorData, params: []), register_node!(graphene_core::vector::CircularRepeatNode<_, _, _>, input: VectorData, params: [f32, f32, u32]), - register_node!(graphene_core::vector::generator_nodes::UnitCircleGenerator, input: (), params: []), + register_node!(graphene_core::vector::generator_nodes::UnitCircleGenerator<_>, input: (), params: [f32]), + register_node!(graphene_core::vector::generator_nodes::UnitRectangleGenerator<_, _>, input: (), params: [f32, f32]), + register_node!(graphene_core::vector::generator_nodes::UnitPolygonGenerator<_, _>, input: (), params: [u32, f32]), + register_node!(graphene_core::vector::generator_nodes::UnitStarGenerator<_, _, _>, input: (), params: [u32, f32, f32]), + register_node!(graphene_core::vector::generator_nodes::UnitLineGenerator<_, _>, input: (), params: [DVec2, DVec2]), + register_node!(graphene_core::vector::generator_nodes::UnitSplineGenerator<_, _, _>, input: (), params: [DVec2, DVec2, DVec2]), register_node!( graphene_core::vector::generator_nodes::PathGenerator<_>, input: Vec>, From 336ed143e1dfc7f99de502f86b229772f9ae3968 Mon Sep 17 00:00:00 2001 From: Ezbaze Date: Tue, 15 Aug 2023 02:54:36 +0100 Subject: [PATCH 02/12] Elipse Node and Debug --- .../document_node_types.rs | 39 ++++++++++++------- .../node_properties.rs | 24 +++++++----- .../gcore/src/vector/generator_nodes.rs | 27 ++++++++++--- .../interpreted-executor/src/node_registry.rs | 1 + 4 files changed, 63 insertions(+), 28 deletions(-) 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 315b0120a09..a557ff62ab0 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 @@ -1918,19 +1918,32 @@ fn static_nodes() -> Vec { name: "Circle", category: "Vector", identifier: NodeImplementation::proto("graphene_core::vector::generator_nodes::UnitCircleGenerator<_>"), - inputs: vec![DocumentInputType::none(), DocumentInputType::value("Radius", TaggedValue::F32(0.), false)], + inputs: vec![DocumentInputType::none(), DocumentInputType::value("Radius", TaggedValue::F32(50.), false)], outputs: vec![DocumentOutputType::new("Vector", FrontendGraphDataType::Subpath)], properties: node_properties::circle_properties, ..Default::default() }, + DocumentNodeType { + name: "Elipse", + category: "Vector", + identifier: NodeImplementation::proto("graphene_core::vector::generator_nodes::UnitElipseGenerator<_, _>"), + inputs: vec![ + DocumentInputType::none(), + DocumentInputType::value("Radius X", TaggedValue::F32(50.), false), + DocumentInputType::value("Radius Y", TaggedValue::F32(25.), false), + ], + outputs: vec![DocumentOutputType::new("Vector", FrontendGraphDataType::Subpath)], + properties: node_properties::elipse_properties, + ..Default::default() + }, DocumentNodeType { name: "Rectangle", category: "Vector", identifier: NodeImplementation::proto("graphene_core::vector::generator_nodes::UnitRectangleGenerator<_, _>"), inputs: vec![ DocumentInputType::none(), - DocumentInputType::value("Size X", TaggedValue::F32(0.), false), - DocumentInputType::value("Size Y", TaggedValue::F32(0.), false), + DocumentInputType::value("Size X", TaggedValue::F32(100.), false), + DocumentInputType::value("Size Y", TaggedValue::F32(100.), false), ], outputs: vec![DocumentOutputType::new("Vector", FrontendGraphDataType::Subpath)], properties: node_properties::rectangle_properties, @@ -1942,8 +1955,8 @@ fn static_nodes() -> Vec { identifier: NodeImplementation::proto("graphene_core::vector::generator_nodes::UnitPolygonGenerator<_, _>"), inputs: vec![ DocumentInputType::none(), - DocumentInputType::value("Sides", TaggedValue::U32(3), false), - DocumentInputType::value("Radius", TaggedValue::F32(0.), false), + DocumentInputType::value("Sides", TaggedValue::U32(32), false), + DocumentInputType::value("Radius", TaggedValue::F32(50.), false), ], outputs: vec![DocumentOutputType::new("Vector", FrontendGraphDataType::Subpath)], properties: node_properties::polygon_properties, @@ -1955,9 +1968,9 @@ fn static_nodes() -> Vec { identifier: NodeImplementation::proto("graphene_core::vector::generator_nodes::UnitStarGenerator<_, _, _>"), inputs: vec![ DocumentInputType::none(), - DocumentInputType::value("Sides", TaggedValue::U32(3), false), - DocumentInputType::value("Radius", TaggedValue::F32(0.), false), - DocumentInputType::value("Inner Radius", TaggedValue::F32(0.), false), + DocumentInputType::value("Sides", TaggedValue::U32(32), false), + DocumentInputType::value("Radius", TaggedValue::F32(50.), false), + DocumentInputType::value("Inner Radius", TaggedValue::F32(40.), false), ], outputs: vec![DocumentOutputType::new("Vector", FrontendGraphDataType::Subpath)], properties: node_properties::star_properties, @@ -1969,8 +1982,8 @@ fn static_nodes() -> Vec { identifier: NodeImplementation::proto("graphene_core::vector::generator_nodes::UnitLineGenerator<_, _>"), inputs: vec![ DocumentInputType::none(), - DocumentInputType::value("Start", TaggedValue::DVec2(DVec2::new(0., 1.)), false), - DocumentInputType::value("End", TaggedValue::DVec2(DVec2::new(0., 1.)), false), + DocumentInputType::value("Start", TaggedValue::DVec2(DVec2::new(0., -50.)), false), + DocumentInputType::value("End", TaggedValue::DVec2(DVec2::new(0., 50.)), false), ], outputs: vec![DocumentOutputType::new("Vector", FrontendGraphDataType::Subpath)], properties: node_properties::line_properties, @@ -1982,9 +1995,9 @@ fn static_nodes() -> Vec { identifier: NodeImplementation::proto("graphene_core::vector::generator_nodes::UnitSplineGenerator<_, _, _>"), inputs: vec![ DocumentInputType::none(), - DocumentInputType::value("Start", TaggedValue::DVec2(DVec2::new(0., 1.)), false), - DocumentInputType::value("middle", TaggedValue::DVec2(DVec2::new(0., 1.)), false), - DocumentInputType::value("End", TaggedValue::DVec2(DVec2::new(0., 1.)), false), + DocumentInputType::value("Start", TaggedValue::DVec2(DVec2::new(0., -50.)), false), + DocumentInputType::value("middle", TaggedValue::DVec2(DVec2::new(25., 0.)), false), + DocumentInputType::value("End", TaggedValue::DVec2(DVec2::new(0., 50.)), false), ], outputs: vec![DocumentOutputType::new("Vector", FrontendGraphDataType::Subpath)], properties: node_properties::spline_properties, diff --git a/editor/src/messages/portfolio/document/node_graph/node_graph_message_handler/node_properties.rs b/editor/src/messages/portfolio/document/node_graph/node_graph_message_handler/node_properties.rs index 7a3283a4642..4b9bb5cf669 100644 --- a/editor/src/messages/portfolio/document/node_graph/node_graph_message_handler/node_properties.rs +++ b/editor/src/messages/portfolio/document/node_graph/node_graph_message_handler/node_properties.rs @@ -1148,31 +1148,37 @@ pub fn circle_properties(document_node: &DocumentNode, node_id: NodeId, _context vec![operand("Radius", 1)] } -pub fn rectangle_properties(document_node: &DocumentNode, node_id: NodeId, _context: &mut NodePropertiesContext) -> Vec { +pub fn elipse_properties(document_node: &DocumentNode, node_id: NodeId, _context: &mut NodePropertiesContext) -> Vec { let operand = |name: &str, index| { let widgets = number_widget(document_node, node_id, index, name, NumberInput::default(), true); LayoutGroup::Row { widgets } }; - vec![operand("Size X", 1), operand("Size Y", 2)] + vec![operand("Radius X", 1), operand("Radius Y", 2)] } -pub fn polygon_properties(document_node: &DocumentNode, node_id: NodeId, _context: &mut NodePropertiesContext) -> Vec { +pub fn rectangle_properties(document_node: &DocumentNode, node_id: NodeId, _context: &mut NodePropertiesContext) -> Vec { let operand = |name: &str, index| { let widgets = number_widget(document_node, node_id, index, name, NumberInput::default(), true); LayoutGroup::Row { widgets } }; - vec![operand("Points", 1), operand("Radius", 2)] + vec![operand("Size X", 1), operand("Size Y", 2)] +} + +pub fn polygon_properties(document_node: &DocumentNode, node_id: NodeId, _context: &mut NodePropertiesContext) -> Vec { + let points = number_widget(document_node, node_id, 1, "Points", NumberInput::default().min(3.), true); + let radius = number_widget(document_node, node_id, 2, "Radius", NumberInput::default(), true); + + vec![LayoutGroup::Row { widgets: points }, LayoutGroup::Row { widgets: radius }] } pub fn star_properties(document_node: &DocumentNode, node_id: NodeId, _context: &mut NodePropertiesContext) -> Vec { - let operand = |name: &str, index| { - let widgets = number_widget(document_node, node_id, index, name, NumberInput::default(), true); + let points = number_widget(document_node, node_id, 1, "Points", NumberInput::default().min(2.), true); + let radius = number_widget(document_node, node_id, 2, "Radius", NumberInput::default(), true); + let inner_radius = number_widget(document_node, node_id, 3, "Inner Radius", NumberInput::default(), true); - LayoutGroup::Row { widgets } - }; - vec![operand("Points", 1), operand("Radius", 2), operand("Inner Radius", 3)] + vec![LayoutGroup::Row { widgets: points }, LayoutGroup::Row { widgets: radius }, LayoutGroup::Row { widgets: inner_radius }] } pub fn line_properties(document_node: &DocumentNode, node_id: NodeId, _context: &mut NodePropertiesContext) -> Vec { diff --git a/node-graph/gcore/src/vector/generator_nodes.rs b/node-graph/gcore/src/vector/generator_nodes.rs index 79e4fcec960..c41e493271b 100644 --- a/node-graph/gcore/src/vector/generator_nodes.rs +++ b/node-graph/gcore/src/vector/generator_nodes.rs @@ -17,6 +17,21 @@ fn unit_circle(_input: (), radius: f32) -> VectorData { super::VectorData::from_subpath(Subpath::new_ellipse(DVec2::splat(radius * -1.), DVec2::splat(radius))) } +#[derive(Debug, Clone, Copy)] +pub struct UnitElipseGenerator { + radius_x: RadiusX, + radius_y: RadiusY, +} + +#[node_macro::node_fn(UnitElipseGenerator)] +fn unit_elipse(_input: (), radius_x: f32, radius_y: f32) -> VectorData { + let radius_x = radius_x.into(); + let radius_y: f64 = radius_y.into(); + let corner1 = DVec2::new(radius_x * -1., radius_y * -1.); + let corner2: DVec2 = DVec2::new(radius_x, radius_y); + super::VectorData::from_subpath(Subpath::new_ellipse(corner1, corner2)) +} + #[derive(Debug, Clone, Copy)] pub struct UnitRectangleGenerator { size_x: SizeX, @@ -25,8 +40,8 @@ pub struct UnitRectangleGenerator { #[node_macro::node_fn(UnitRectangleGenerator)] fn unit_square(_input: (), size_x: f32, size_y: f32) -> VectorData { - let size_x: f64 = size_x.into(); - let size_y: f64 = size_y.into(); + let size_x = (size_x / 2.).into(); + let size_y = (size_y / 2.).into(); let corner1 = DVec2::new(size_x * -1., size_y * -1.); let corner2 = DVec2::new(size_x, size_y); @@ -42,7 +57,7 @@ pub struct UnitPolygonGenerator { #[node_macro::node_fn(UnitPolygonGenerator)] fn unit_polygon(_input: (), points: u32, radius: f32) -> VectorData { let points = points.into(); - let radius = radius.into(); + let radius = (radius * 2.).into(); super::VectorData::from_subpath(Subpath::new_regular_polygon(DVec2::splat(radius * -1.), points, radius)) } @@ -55,9 +70,9 @@ pub struct UnitStarGenerator { #[node_macro::node_fn(UnitStarGenerator)] fn unit_star(_input: (), points: u32, radius: f32, inner_radius: f32) -> VectorData { - let points: u64 = points.into(); - let radius: f64 = radius.into(); - let inner_radius: f64 = inner_radius.into(); + let points = points.into(); + let radius = (radius * 2.).into(); + let inner_radius = (inner_radius * 2.).into(); super::VectorData::from_subpath(Subpath::new_regular_star_polygon(DVec2::splat(radius * -1.), points, radius, inner_radius)) } diff --git a/node-graph/interpreted-executor/src/node_registry.rs b/node-graph/interpreted-executor/src/node_registry.rs index c0a8fd38559..abff946d080 100644 --- a/node-graph/interpreted-executor/src/node_registry.rs +++ b/node-graph/interpreted-executor/src/node_registry.rs @@ -631,6 +631,7 @@ fn node_registry() -> HashMap, input: VectorData, params: [f32, f32, u32]), register_node!(graphene_core::vector::generator_nodes::UnitCircleGenerator<_>, input: (), params: [f32]), + register_node!(graphene_core::vector::generator_nodes::UnitElipseGenerator<_, _>, input: (), params: [f32, f32]), register_node!(graphene_core::vector::generator_nodes::UnitRectangleGenerator<_, _>, input: (), params: [f32, f32]), register_node!(graphene_core::vector::generator_nodes::UnitPolygonGenerator<_, _>, input: (), params: [u32, f32]), register_node!(graphene_core::vector::generator_nodes::UnitStarGenerator<_, _, _>, input: (), params: [u32, f32, f32]), From 418574a7a91af732dd43234958c721827d2f4d1c Mon Sep 17 00:00:00 2001 From: Ezbaze Date: Sat, 19 Aug 2023 23:29:50 +0100 Subject: [PATCH 03/12] N-input Spline node --- .../document_node_types.rs | 6 +-- .../node_properties.rs | 42 ++++++++++++++++++- .../gcore/src/vector/generator_nodes.rs | 11 +++-- node-graph/graph-craft/src/document/value.rs | 5 +++ .../interpreted-executor/src/node_registry.rs | 2 +- 5 files changed, 53 insertions(+), 13 deletions(-) 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 a557ff62ab0..97d141cbeb2 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 @@ -1992,12 +1992,10 @@ fn static_nodes() -> Vec { DocumentNodeType { name: "Spline", category: "Vector", - identifier: NodeImplementation::proto("graphene_core::vector::generator_nodes::UnitSplineGenerator<_, _, _>"), + identifier: NodeImplementation::proto("graphene_core::vector::generator_nodes::UnitSplineGenerator<_>"), inputs: vec![ DocumentInputType::none(), - DocumentInputType::value("Start", TaggedValue::DVec2(DVec2::new(0., -50.)), false), - DocumentInputType::value("middle", TaggedValue::DVec2(DVec2::new(25., 0.)), false), - DocumentInputType::value("End", TaggedValue::DVec2(DVec2::new(0., 50.)), false), + DocumentInputType::value("Test", TaggedValue::VecDVec2(vec![DVec2::new(0., -50.), DVec2::new(25., 0.), DVec2::new(0., 50.)]), false), ], outputs: vec![DocumentOutputType::new("Vector", FrontendGraphDataType::Subpath)], properties: node_properties::spline_properties, diff --git a/editor/src/messages/portfolio/document/node_graph/node_graph_message_handler/node_properties.rs b/editor/src/messages/portfolio/document/node_graph/node_graph_message_handler/node_properties.rs index 4b9bb5cf669..e70d859e144 100644 --- a/editor/src/messages/portfolio/document/node_graph/node_graph_message_handler/node_properties.rs +++ b/editor/src/messages/portfolio/document/node_graph/node_graph_message_handler/node_properties.rs @@ -217,6 +217,43 @@ fn vec_f32_input(document_node: &DocumentNode, node_id: NodeId, index: usize, na } widgets } + +fn vec_dvec2_input(document_node: &DocumentNode, node_id: NodeId, index: usize, name: &str, text_props: TextInput, blank_assist: bool) -> Vec { + let mut widgets = start_widgets(document_node, node_id, index, name, FrontendGraphDataType::Color, blank_assist); + + let from_string = |string: &str| { + string + .split("],") + .map(|item| { + let parts: Vec<_> = item.split(",").collect(); + let x = parts[0].parse::(); + let y = parts[1].parse::(); + if let (Ok(x_val), Ok(y_val)) = (x, y) { + Some(DVec2 { x: x_val, y: y_val }) + } else { + None + } + }) + .collect::>>() + .map(TaggedValue::VecDVec2) + }; + + if let NodeInput::Value { + tagged_value: TaggedValue::VecDVec2(x), + exposed: false, + } = &document_node.inputs[index] + { + widgets.extend_from_slice(&[ + Separator::new(SeparatorType::Unrelated).widget_holder(), + text_props + .value(x.iter().map(|v| v.to_string()).collect::>().join(", ")) + .on_update(optionally_update_value(move |x: &TextInput| from_string(&x.value), node_id, index)) + .widget_holder(), + ]) + } + widgets +} + fn font_inputs(document_node: &DocumentNode, node_id: NodeId, index: usize, name: &str, blank_assist: bool) -> (Vec, Option>) { let mut first_widgets = start_widgets(document_node, node_id, index, name, FrontendGraphDataType::General, blank_assist); let mut second_widgets = None; @@ -1186,8 +1223,9 @@ pub fn line_properties(document_node: &DocumentNode, node_id: NodeId, _context: vec![operand("Start", 1), operand("End", 2)] } pub fn spline_properties(document_node: &DocumentNode, node_id: NodeId, _context: &mut NodePropertiesContext) -> Vec { - let operand = |name: &str, index| vec2_widget(document_node, node_id, index, name, "X", "Y", "px", add_blank_assist); - vec![operand("Start", 1), operand("Middle", 2), operand("End", 3)] + vec![LayoutGroup::Row { + widgets: vec_dvec2_input(document_node, node_id, 1, "Test", TextInput::default().centered(true), true), + }] } pub fn transform_properties(document_node: &DocumentNode, node_id: NodeId, _context: &mut NodePropertiesContext) -> Vec { diff --git a/node-graph/gcore/src/vector/generator_nodes.rs b/node-graph/gcore/src/vector/generator_nodes.rs index c41e493271b..c5ee481a8eb 100644 --- a/node-graph/gcore/src/vector/generator_nodes.rs +++ b/node-graph/gcore/src/vector/generator_nodes.rs @@ -89,15 +89,14 @@ fn unit_line(_input: (), pos_1: DVec2, pos_2: DVec2) -> VectorData { } #[derive(Debug, Clone, Copy)] -pub struct UnitSplineGenerator { - pos_1: Pos1, - pos_2: Pos2, - pos_3: Pos3, +pub struct UnitSplineGenerator { + positions: Positions, } #[node_macro::node_fn(UnitSplineGenerator)] -fn unit_spline(_input: (), pos_1: DVec2, pos_2: DVec2, pos_3: DVec2) -> VectorData { - super::VectorData::from_subpaths(vec![Subpath::new_cubic_spline(vec![pos_1, pos_2, pos_3])]) +fn unit_spline(_input: (), positions: Vec) -> VectorData { + debug!("Should work: First Y-{}", positions[0].y); + super::VectorData::from_subpaths(vec![Subpath::new_cubic_spline(positions)]) } // TODO(TrueDoctor): I removed the Arc requirement we should think about when it makes sense to use it vs making a generic value node diff --git a/node-graph/graph-craft/src/document/value.rs b/node-graph/graph-craft/src/document/value.rs index b7951eed9e7..cb2675375de 100644 --- a/node-graph/graph-craft/src/document/value.rs +++ b/node-graph/graph-craft/src/document/value.rs @@ -42,6 +42,7 @@ pub enum TaggedValue { Fill(graphene_core::vector::style::Fill), Stroke(graphene_core::vector::style::Stroke), VecF32(Vec), + VecDVec2(Vec), RedGreenBlue(graphene_core::raster::RedGreenBlue), NoiseType(graphene_core::raster::NoiseType), RelativeAbsolute(graphene_core::raster::RelativeAbsolute), @@ -100,6 +101,7 @@ impl Hash for TaggedValue { Self::Fill(fill) => fill.hash(state), Self::Stroke(stroke) => stroke.hash(state), Self::VecF32(vec_f32) => vec_f32.iter().for_each(|val| val.to_bits().hash(state)), + Self::VecDVec2(vec_dvec2) => vec_dvec2.iter().for_each(|val| val.x.to_bits().hash(state)), Self::RedGreenBlue(red_green_blue) => red_green_blue.hash(state), Self::NoiseType(noise_type) => noise_type.hash(state), Self::RelativeAbsolute(relative_absolute) => relative_absolute.hash(state), @@ -165,6 +167,7 @@ impl<'a> TaggedValue { TaggedValue::Fill(x) => Box::new(x), TaggedValue::Stroke(x) => Box::new(x), TaggedValue::VecF32(x) => Box::new(x), + TaggedValue::VecDVec2(x) => Box::new(x), TaggedValue::RedGreenBlue(x) => Box::new(x), TaggedValue::NoiseType(x) => Box::new(x), TaggedValue::RelativeAbsolute(x) => Box::new(x), @@ -233,6 +236,7 @@ impl<'a> TaggedValue { TaggedValue::Fill(_) => concrete!(graphene_core::vector::style::Fill), TaggedValue::Stroke(_) => concrete!(graphene_core::vector::style::Stroke), TaggedValue::VecF32(_) => concrete!(Vec), + TaggedValue::VecDVec2(_) => concrete!(Vec), TaggedValue::RedGreenBlue(_) => concrete!(graphene_core::raster::RedGreenBlue), TaggedValue::NoiseType(_) => concrete!(graphene_core::raster::NoiseType), TaggedValue::RelativeAbsolute(_) => concrete!(graphene_core::raster::RelativeAbsolute), @@ -288,6 +292,7 @@ impl<'a> TaggedValue { x if x == TypeId::of::() => Ok(TaggedValue::Fill(*downcast(input).unwrap())), x if x == TypeId::of::() => Ok(TaggedValue::Stroke(*downcast(input).unwrap())), x if x == TypeId::of::>() => Ok(TaggedValue::VecF32(*downcast(input).unwrap())), + x if x == TypeId::of::>() => Ok(TaggedValue::VecDVec2(*downcast(input).unwrap())), x if x == TypeId::of::() => Ok(TaggedValue::RedGreenBlue(*downcast(input).unwrap())), x if x == TypeId::of::() => Ok(TaggedValue::NoiseType(*downcast(input).unwrap())), x if x == TypeId::of::() => Ok(TaggedValue::RelativeAbsolute(*downcast(input).unwrap())), diff --git a/node-graph/interpreted-executor/src/node_registry.rs b/node-graph/interpreted-executor/src/node_registry.rs index abff946d080..58c967aa25b 100644 --- a/node-graph/interpreted-executor/src/node_registry.rs +++ b/node-graph/interpreted-executor/src/node_registry.rs @@ -636,7 +636,7 @@ fn node_registry() -> HashMap, input: (), params: [u32, f32]), register_node!(graphene_core::vector::generator_nodes::UnitStarGenerator<_, _, _>, input: (), params: [u32, f32, f32]), register_node!(graphene_core::vector::generator_nodes::UnitLineGenerator<_, _>, input: (), params: [DVec2, DVec2]), - register_node!(graphene_core::vector::generator_nodes::UnitSplineGenerator<_, _, _>, input: (), params: [DVec2, DVec2, DVec2]), + register_node!(graphene_core::vector::generator_nodes::UnitSplineGenerator<_>, input: (), params: [Vec]), register_node!( graphene_core::vector::generator_nodes::PathGenerator<_>, input: Vec>, From c73ced754a6b68fc2a58258d733c72848527033a Mon Sep 17 00:00:00 2001 From: Ezbaze Date: Wed, 23 Aug 2023 01:50:37 +0100 Subject: [PATCH 04/12] Debuging --- Cargo.lock | 1 + editor/Cargo.toml | 1 + .../document_node_types.rs | 6 ++++- .../node_properties.rs | 26 +++++++++++++------ node-graph/graph-craft/src/document/value.rs | 2 +- 5 files changed, 26 insertions(+), 10 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 5a4996b124a..c96b9c20e64 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2143,6 +2143,7 @@ dependencies = [ "log", "num_enum 0.6.1", "once_cell", + "regex", "remain", "serde", "serde_json", diff --git a/editor/Cargo.toml b/editor/Cargo.toml index a58cc3886d6..b3040d7ddf7 100644 --- a/editor/Cargo.toml +++ b/editor/Cargo.toml @@ -21,6 +21,7 @@ wasm = ["wasm-bindgen", "future-executor", "graphene-std/wasm"] [dependencies] log = "0.4" +regex = "1.4" bitflags = { version = "2.3", features = ["serde"] } thiserror = "1.0" serde = { version = "1.0", features = ["derive"] } 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 97d141cbeb2..bda7f91ab79 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 @@ -1995,7 +1995,11 @@ fn static_nodes() -> Vec { identifier: NodeImplementation::proto("graphene_core::vector::generator_nodes::UnitSplineGenerator<_>"), inputs: vec![ DocumentInputType::none(), - DocumentInputType::value("Test", TaggedValue::VecDVec2(vec![DVec2::new(0., -50.), DVec2::new(25., 0.), DVec2::new(0., 50.)]), false), + DocumentInputType::value( + "Points", + TaggedValue::VecDVec2(vec![DVec2::new(0., -50.), DVec2::new(25., 0.), DVec2::new(0., 50.)]), + false, + ), ], outputs: vec![DocumentOutputType::new("Vector", FrontendGraphDataType::Subpath)], properties: node_properties::spline_properties, diff --git a/editor/src/messages/portfolio/document/node_graph/node_graph_message_handler/node_properties.rs b/editor/src/messages/portfolio/document/node_graph/node_graph_message_handler/node_properties.rs index e70d859e144..e47dff9e1c7 100644 --- a/editor/src/messages/portfolio/document/node_graph/node_graph_message_handler/node_properties.rs +++ b/editor/src/messages/portfolio/document/node_graph/node_graph_message_handler/node_properties.rs @@ -16,6 +16,7 @@ use graphene_core::vector::style::{FillType, GradientType, LineCap, LineJoin}; use graphene_core::{Cow, Type, TypeDescriptor}; use glam::{DVec2, IVec2}; +use regex::Regex; pub fn string_properties(text: impl Into) -> Vec { let widget = TextLabel::new(text).widget_holder(); @@ -222,14 +223,22 @@ fn vec_dvec2_input(document_node: &DocumentNode, node_id: NodeId, index: usize, let mut widgets = start_widgets(document_node, node_id, index, name, FrontendGraphDataType::Color, blank_assist); let from_string = |string: &str| { + debug!("UUU-- String1: {}", string); + let string = &Regex::new(r",+").unwrap().replace_all(string, ",").to_string(); + debug!("UUU-- String2: {}", string); string - .split("],") + .trim() + .trim_end_matches(')') + .trim_start_matches('(') + .trim() + .split("),") .map(|item| { - let parts: Vec<_> = item.split(",").collect(); - let x = parts[0].parse::(); - let y = parts[1].parse::(); - if let (Ok(x_val), Ok(y_val)) = (x, y) { - Some(DVec2 { x: x_val, y: y_val }) + debug!("UUU-- Point: {}", item); + let parts: Vec<_> = item.trim().split(",").collect(); + if parts.len() == 2 { + let x = parts[0].trim().trim_end_matches(')').trim_start_matches('(').trim().parse::().ok()?; + let y = parts[1].trim().trim_end_matches(')').trim_start_matches('(').trim().parse::().ok()?; + Some(DVec2 { x: x, y: y }) } else { None } @@ -237,6 +246,7 @@ fn vec_dvec2_input(document_node: &DocumentNode, node_id: NodeId, index: usize, .collect::>>() .map(TaggedValue::VecDVec2) }; + debug!("Point END"); if let NodeInput::Value { tagged_value: TaggedValue::VecDVec2(x), @@ -246,7 +256,7 @@ fn vec_dvec2_input(document_node: &DocumentNode, node_id: NodeId, index: usize, widgets.extend_from_slice(&[ Separator::new(SeparatorType::Unrelated).widget_holder(), text_props - .value(x.iter().map(|v| v.to_string()).collect::>().join(", ")) + .value(x.iter().map(|v| v.to_string()).collect::>().join(", ").replace("]", ")").replace("[", "(")) .on_update(optionally_update_value(move |x: &TextInput| from_string(&x.value), node_id, index)) .widget_holder(), ]) @@ -1224,7 +1234,7 @@ pub fn line_properties(document_node: &DocumentNode, node_id: NodeId, _context: } pub fn spline_properties(document_node: &DocumentNode, node_id: NodeId, _context: &mut NodePropertiesContext) -> Vec { vec![LayoutGroup::Row { - widgets: vec_dvec2_input(document_node, node_id, 1, "Test", TextInput::default().centered(true), true), + widgets: vec_dvec2_input(document_node, node_id, 1, "Points", TextInput::default().centered(true), true), }] } diff --git a/node-graph/graph-craft/src/document/value.rs b/node-graph/graph-craft/src/document/value.rs index cb2675375de..0bf632b4a16 100644 --- a/node-graph/graph-craft/src/document/value.rs +++ b/node-graph/graph-craft/src/document/value.rs @@ -101,7 +101,7 @@ impl Hash for TaggedValue { Self::Fill(fill) => fill.hash(state), Self::Stroke(stroke) => stroke.hash(state), Self::VecF32(vec_f32) => vec_f32.iter().for_each(|val| val.to_bits().hash(state)), - Self::VecDVec2(vec_dvec2) => vec_dvec2.iter().for_each(|val| val.x.to_bits().hash(state)), + Self::VecDVec2(vec_dvec2) => vec_dvec2.iter().for_each(|val| val.to_array().iter().for_each(|x| x.to_bits().hash(state))), Self::RedGreenBlue(red_green_blue) => red_green_blue.hash(state), Self::NoiseType(noise_type) => noise_type.hash(state), Self::RelativeAbsolute(relative_absolute) => relative_absolute.hash(state), From f45fbcc51c9f142bee179e32a1ba0fcc3652ecd4 Mon Sep 17 00:00:00 2001 From: Ezbaze Date: Wed, 23 Aug 2023 21:15:22 +0100 Subject: [PATCH 05/12] Debug --- .../node_graph_message_handler/node_properties.rs | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/editor/src/messages/portfolio/document/node_graph/node_graph_message_handler/node_properties.rs b/editor/src/messages/portfolio/document/node_graph/node_graph_message_handler/node_properties.rs index e47dff9e1c7..82dcba7d838 100644 --- a/editor/src/messages/portfolio/document/node_graph/node_graph_message_handler/node_properties.rs +++ b/editor/src/messages/portfolio/document/node_graph/node_graph_message_handler/node_properties.rs @@ -223,18 +223,16 @@ fn vec_dvec2_input(document_node: &DocumentNode, node_id: NodeId, index: usize, let mut widgets = start_widgets(document_node, node_id, index, name, FrontendGraphDataType::Color, blank_assist); let from_string = |string: &str| { - debug!("UUU-- String1: {}", string); let string = &Regex::new(r",+").unwrap().replace_all(string, ",").to_string(); - debug!("UUU-- String2: {}", string); string .trim() .trim_end_matches(')') .trim_start_matches('(') .trim() .split("),") + .filter(|x| !x.is_empty()) .map(|item| { - debug!("UUU-- Point: {}", item); - let parts: Vec<_> = item.trim().split(",").collect(); + let parts: Vec<_> = item.trim().split(",").filter(|x| !x.is_empty()).collect(); if parts.len() == 2 { let x = parts[0].trim().trim_end_matches(')').trim_start_matches('(').trim().parse::().ok()?; let y = parts[1].trim().trim_end_matches(')').trim_start_matches('(').trim().parse::().ok()?; @@ -246,7 +244,6 @@ fn vec_dvec2_input(document_node: &DocumentNode, node_id: NodeId, index: usize, .collect::>>() .map(TaggedValue::VecDVec2) }; - debug!("Point END"); if let NodeInput::Value { tagged_value: TaggedValue::VecDVec2(x), From a22b285582f59361665864efcad840655f848631 Mon Sep 17 00:00:00 2001 From: Ezbaze Date: Wed, 23 Aug 2023 21:19:37 +0100 Subject: [PATCH 06/12] fmt --- .../node_graph_message_handler/document_node_types.rs | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) 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 bda7f91ab79..ff474d3c476 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 @@ -1995,11 +1995,7 @@ fn static_nodes() -> Vec { identifier: NodeImplementation::proto("graphene_core::vector::generator_nodes::UnitSplineGenerator<_>"), inputs: vec![ DocumentInputType::none(), - DocumentInputType::value( - "Points", - TaggedValue::VecDVec2(vec![DVec2::new(0., -50.), DVec2::new(25., 0.), DVec2::new(0., 50.)]), - false, - ), + DocumentInputType::value("Points", TaggedValue::VecDVec2(vec![DVec2::new(0., -50.), DVec2::new(25., 0.), DVec2::new(0., 50.)]), false), ], outputs: vec![DocumentOutputType::new("Vector", FrontendGraphDataType::Subpath)], properties: node_properties::spline_properties, From 7d5b722796d98b9f04f017c8843ee77d042748c9 Mon Sep 17 00:00:00 2001 From: Ezbaze Date: Thu, 24 Aug 2023 00:27:44 +0100 Subject: [PATCH 07/12] remov debug --- node-graph/gcore/src/vector/generator_nodes.rs | 1 - 1 file changed, 1 deletion(-) diff --git a/node-graph/gcore/src/vector/generator_nodes.rs b/node-graph/gcore/src/vector/generator_nodes.rs index c5ee481a8eb..b64eb21cee1 100644 --- a/node-graph/gcore/src/vector/generator_nodes.rs +++ b/node-graph/gcore/src/vector/generator_nodes.rs @@ -95,7 +95,6 @@ pub struct UnitSplineGenerator { #[node_macro::node_fn(UnitSplineGenerator)] fn unit_spline(_input: (), positions: Vec) -> VectorData { - debug!("Should work: First Y-{}", positions[0].y); super::VectorData::from_subpaths(vec![Subpath::new_cubic_spline(positions)]) } From 52e5233b011b15bc61b109d16a90dd9668312221 Mon Sep 17 00:00:00 2001 From: Ezbaze Date: Thu, 24 Aug 2023 22:34:09 +0100 Subject: [PATCH 08/12] Changes from code review --- .../document_node_types.rs | 14 ++-- .../node_properties.rs | 29 ++------ .../gcore/src/vector/generator_nodes.rs | 70 +++++++++---------- .../interpreted-executor/src/node_registry.rs | 14 ++-- 4 files changed, 55 insertions(+), 72 deletions(-) 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 ff474d3c476..86cb89617a7 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 @@ -1917,7 +1917,7 @@ fn static_nodes() -> Vec { DocumentNodeType { name: "Circle", category: "Vector", - identifier: NodeImplementation::proto("graphene_core::vector::generator_nodes::UnitCircleGenerator<_>"), + identifier: NodeImplementation::proto("graphene_core::vector::generator_nodes::CircleGenerator<_>"), inputs: vec![DocumentInputType::none(), DocumentInputType::value("Radius", TaggedValue::F32(50.), false)], outputs: vec![DocumentOutputType::new("Vector", FrontendGraphDataType::Subpath)], properties: node_properties::circle_properties, @@ -1926,7 +1926,7 @@ fn static_nodes() -> Vec { DocumentNodeType { name: "Elipse", category: "Vector", - identifier: NodeImplementation::proto("graphene_core::vector::generator_nodes::UnitElipseGenerator<_, _>"), + identifier: NodeImplementation::proto("graphene_core::vector::generator_nodes::ElipseGenerator<_, _>"), inputs: vec![ DocumentInputType::none(), DocumentInputType::value("Radius X", TaggedValue::F32(50.), false), @@ -1939,7 +1939,7 @@ fn static_nodes() -> Vec { DocumentNodeType { name: "Rectangle", category: "Vector", - identifier: NodeImplementation::proto("graphene_core::vector::generator_nodes::UnitRectangleGenerator<_, _>"), + identifier: NodeImplementation::proto("graphene_core::vector::generator_nodes::RectangleGenerator<_, _>"), inputs: vec![ DocumentInputType::none(), DocumentInputType::value("Size X", TaggedValue::F32(100.), false), @@ -1952,7 +1952,7 @@ fn static_nodes() -> Vec { DocumentNodeType { name: "Polygon", category: "Vector", - identifier: NodeImplementation::proto("graphene_core::vector::generator_nodes::UnitPolygonGenerator<_, _>"), + identifier: NodeImplementation::proto("graphene_core::vector::generator_nodes::PolygonGenerator<_, _>"), inputs: vec![ DocumentInputType::none(), DocumentInputType::value("Sides", TaggedValue::U32(32), false), @@ -1965,7 +1965,7 @@ fn static_nodes() -> Vec { DocumentNodeType { name: "Star", category: "Vector", - identifier: NodeImplementation::proto("graphene_core::vector::generator_nodes::UnitStarGenerator<_, _, _>"), + identifier: NodeImplementation::proto("graphene_core::vector::generator_nodes::StarGenerator<_, _, _>"), inputs: vec![ DocumentInputType::none(), DocumentInputType::value("Sides", TaggedValue::U32(32), false), @@ -1979,7 +1979,7 @@ fn static_nodes() -> Vec { DocumentNodeType { name: "Line", category: "Vector", - identifier: NodeImplementation::proto("graphene_core::vector::generator_nodes::UnitLineGenerator<_, _>"), + identifier: NodeImplementation::proto("graphene_core::vector::generator_nodes::LineGenerator<_, _>"), inputs: vec![ DocumentInputType::none(), DocumentInputType::value("Start", TaggedValue::DVec2(DVec2::new(0., -50.)), false), @@ -1992,7 +1992,7 @@ fn static_nodes() -> Vec { DocumentNodeType { name: "Spline", category: "Vector", - identifier: NodeImplementation::proto("graphene_core::vector::generator_nodes::UnitSplineGenerator<_>"), + identifier: NodeImplementation::proto("graphene_core::vector::generator_nodes::SplineGenerator<_>"), inputs: vec![ DocumentInputType::none(), DocumentInputType::value("Points", TaggedValue::VecDVec2(vec![DVec2::new(0., -50.), DVec2::new(25., 0.), DVec2::new(0., 50.)]), false), diff --git a/editor/src/messages/portfolio/document/node_graph/node_graph_message_handler/node_properties.rs b/editor/src/messages/portfolio/document/node_graph/node_graph_message_handler/node_properties.rs index 82dcba7d838..2d7783ed87b 100644 --- a/editor/src/messages/portfolio/document/node_graph/node_graph_message_handler/node_properties.rs +++ b/editor/src/messages/portfolio/document/node_graph/node_graph_message_handler/node_properties.rs @@ -225,23 +225,11 @@ fn vec_dvec2_input(document_node: &DocumentNode, node_id: NodeId, index: usize, let from_string = |string: &str| { let string = &Regex::new(r",+").unwrap().replace_all(string, ",").to_string(); string - .trim() - .trim_end_matches(')') - .trim_start_matches('(') - .trim() - .split("),") + .split(|c: char| !c.is_alphanumeric() && !matches!(c, '.' | '+' | '-')) .filter(|x| !x.is_empty()) - .map(|item| { - let parts: Vec<_> = item.trim().split(",").filter(|x| !x.is_empty()).collect(); - if parts.len() == 2 { - let x = parts[0].trim().trim_end_matches(')').trim_start_matches('(').trim().parse::().ok()?; - let y = parts[1].trim().trim_end_matches(')').trim_start_matches('(').trim().parse::().ok()?; - Some(DVec2 { x: x, y: y }) - } else { - None - } - }) + .map(|x| x.parse::().ok()) .collect::>>() + .map(|numbers| numbers.chunks_exact(2).map(|vals| DVec2::new(vals[0], vals[1])).collect()) .map(TaggedValue::VecDVec2) }; @@ -253,7 +241,7 @@ fn vec_dvec2_input(document_node: &DocumentNode, node_id: NodeId, index: usize, widgets.extend_from_slice(&[ Separator::new(SeparatorType::Unrelated).widget_holder(), text_props - .value(x.iter().map(|v| v.to_string()).collect::>().join(", ").replace("]", ")").replace("[", "(")) + .value(x.iter().map(|v| format!("({}, {})", v.x, v.y)).collect::>().join(", ")) .on_update(optionally_update_value(move |x: &TextInput| from_string(&x.value), node_id, index)) .widget_holder(), ]) @@ -1184,12 +1172,9 @@ pub fn modulo_properties(document_node: &DocumentNode, node_id: NodeId, _context } pub fn circle_properties(document_node: &DocumentNode, node_id: NodeId, _context: &mut NodePropertiesContext) -> Vec { - let operand = |name: &str, index| { - let widgets = number_widget(document_node, node_id, index, name, NumberInput::default(), true); - - LayoutGroup::Row { widgets } - }; - vec![operand("Radius", 1)] + vec![LayoutGroup::Row { + widgets: number_widget(document_node, node_id, 1, "Radius", NumberInput::default(), true), + }] } pub fn elipse_properties(document_node: &DocumentNode, node_id: NodeId, _context: &mut NodePropertiesContext) -> Vec { diff --git a/node-graph/gcore/src/vector/generator_nodes.rs b/node-graph/gcore/src/vector/generator_nodes.rs index b64eb21cee1..9484876f73e 100644 --- a/node-graph/gcore/src/vector/generator_nodes.rs +++ b/node-graph/gcore/src/vector/generator_nodes.rs @@ -7,94 +7,92 @@ use bezier_rs::Subpath; use glam::DVec2; #[derive(Debug, Clone, Copy)] -pub struct UnitCircleGenerator { +pub struct CircleGenerator { radius: Radius, } -#[node_macro::node_fn(UnitCircleGenerator)] -fn unit_circle(_input: (), radius: f32) -> VectorData { - let radius = radius.into(); - super::VectorData::from_subpath(Subpath::new_ellipse(DVec2::splat(radius * -1.), DVec2::splat(radius))) +#[node_macro::node_fn(CircleGenerator)] +fn circle_generator(_input: (), radius: f32) -> VectorData { + let radius: f64 = radius.into(); + super::VectorData::from_subpath(Subpath::new_ellipse(DVec2::splat(-radius), DVec2::splat(radius))) } #[derive(Debug, Clone, Copy)] -pub struct UnitElipseGenerator { +pub struct ElipseGenerator { radius_x: RadiusX, radius_y: RadiusY, } -#[node_macro::node_fn(UnitElipseGenerator)] -fn unit_elipse(_input: (), radius_x: f32, radius_y: f32) -> VectorData { - let radius_x = radius_x.into(); - let radius_y: f64 = radius_y.into(); - let corner1 = DVec2::new(radius_x * -1., radius_y * -1.); - let corner2: DVec2 = DVec2::new(radius_x, radius_y); +#[node_macro::node_fn(ElipseGenerator)] +fn elipse_generator(_input: (), radius_x: f32, radius_y: f32) -> VectorData { + let radius = DVec2::new(radius_x as f64, radius_y as f64); + let corner1 = -radius; + let corner2 = radius; super::VectorData::from_subpath(Subpath::new_ellipse(corner1, corner2)) } #[derive(Debug, Clone, Copy)] -pub struct UnitRectangleGenerator { +pub struct RectangleGenerator { size_x: SizeX, size_y: SizeY, } -#[node_macro::node_fn(UnitRectangleGenerator)] -fn unit_square(_input: (), size_x: f32, size_y: f32) -> VectorData { - let size_x = (size_x / 2.).into(); - let size_y = (size_y / 2.).into(); - let corner1 = DVec2::new(size_x * -1., size_y * -1.); - let corner2 = DVec2::new(size_x, size_y); +#[node_macro::node_fn(RectangleGenerator)] +fn square_generator(_input: (), size_x: f32, size_y: f32) -> VectorData { + let size = DVec2::new(size_x as f64, size_y as f64); + let corner1 = -size / 2.; + let corner2 = size / 2.; super::VectorData::from_subpaths(vec![Subpath::new_rect(corner1, corner2)]) } #[derive(Debug, Clone, Copy)] -pub struct UnitPolygonGenerator { +pub struct PolygonGenerator { points: Points, radius: Radius, } -#[node_macro::node_fn(UnitPolygonGenerator)] -fn unit_polygon(_input: (), points: u32, radius: f32) -> VectorData { +#[node_macro::node_fn(PolygonGenerator)] +fn polygon_generator(_input: (), points: u32, radius: f32) -> VectorData { let points = points.into(); - let radius = (radius * 2.).into(); - super::VectorData::from_subpath(Subpath::new_regular_polygon(DVec2::splat(radius * -1.), points, radius)) + let radius: f64 = (radius * 2.).into(); + super::VectorData::from_subpath(Subpath::new_regular_polygon(DVec2::splat(-radius), points, radius)) } #[derive(Debug, Clone, Copy)] -pub struct UnitStarGenerator { +pub struct StarGenerator { points: Points, radius: Radius, inner_radius: InnerRadius, } -#[node_macro::node_fn(UnitStarGenerator)] -fn unit_star(_input: (), points: u32, radius: f32, inner_radius: f32) -> VectorData { +#[node_macro::node_fn(StarGenerator)] +fn star_generator(_input: (), points: u32, radius: f32, inner_radius: f32) -> VectorData { let points = points.into(); - let radius = (radius * 2.).into(); - let inner_radius = (inner_radius * 2.).into(); + let diameter: f64 = (radius * 2.).into(); + let inner_diameter = (inner_radius * 2.).into(); - super::VectorData::from_subpath(Subpath::new_regular_star_polygon(DVec2::splat(radius * -1.), points, radius, inner_radius)) + super::VectorData::from_subpath(Subpath::new_regular_star_polygon(DVec2::splat(-diameter), points, diameter, inner_diameter)) } #[derive(Debug, Clone, Copy)] -pub struct UnitLineGenerator { +pub struct LineGenerator { pos_1: Pos1, pos_2: Pos2, } -#[node_macro::node_fn(UnitLineGenerator)] -fn unit_line(_input: (), pos_1: DVec2, pos_2: DVec2) -> VectorData { +#[node_macro::node_fn(LineGenerator)] +fn line_generator(_input: (), pos_1: DVec2, pos_2: DVec2) -> VectorData { super::VectorData::from_subpaths(vec![Subpath::new_line(pos_1, pos_2)]) } #[derive(Debug, Clone, Copy)] -pub struct UnitSplineGenerator { +pub struct SplineGenerator { positions: Positions, } -#[node_macro::node_fn(UnitSplineGenerator)] -fn unit_spline(_input: (), positions: Vec) -> VectorData { +#[node_macro::node_fn(SplineGenerator)] +fn spline_generator(_input: (), positions: Vec) -> VectorData { super::VectorData::from_subpaths(vec![Subpath::new_cubic_spline(positions)]) } diff --git a/node-graph/interpreted-executor/src/node_registry.rs b/node-graph/interpreted-executor/src/node_registry.rs index 58c967aa25b..36bf9d46110 100644 --- a/node-graph/interpreted-executor/src/node_registry.rs +++ b/node-graph/interpreted-executor/src/node_registry.rs @@ -630,13 +630,13 @@ fn node_registry() -> HashMap, input: VectorData, params: [DVec2, u32]), register_node!(graphene_core::vector::BoundingBoxNode, input: VectorData, params: []), register_node!(graphene_core::vector::CircularRepeatNode<_, _, _>, input: VectorData, params: [f32, f32, u32]), - register_node!(graphene_core::vector::generator_nodes::UnitCircleGenerator<_>, input: (), params: [f32]), - register_node!(graphene_core::vector::generator_nodes::UnitElipseGenerator<_, _>, input: (), params: [f32, f32]), - register_node!(graphene_core::vector::generator_nodes::UnitRectangleGenerator<_, _>, input: (), params: [f32, f32]), - register_node!(graphene_core::vector::generator_nodes::UnitPolygonGenerator<_, _>, input: (), params: [u32, f32]), - register_node!(graphene_core::vector::generator_nodes::UnitStarGenerator<_, _, _>, input: (), params: [u32, f32, f32]), - register_node!(graphene_core::vector::generator_nodes::UnitLineGenerator<_, _>, input: (), params: [DVec2, DVec2]), - register_node!(graphene_core::vector::generator_nodes::UnitSplineGenerator<_>, input: (), params: [Vec]), + register_node!(graphene_core::vector::generator_nodes::CircleGenerator<_>, input: (), params: [f32]), + register_node!(graphene_core::vector::generator_nodes::ElipseGenerator<_, _>, input: (), params: [f32, f32]), + register_node!(graphene_core::vector::generator_nodes::RectangleGenerator<_, _>, input: (), params: [f32, f32]), + register_node!(graphene_core::vector::generator_nodes::PolygonGenerator<_, _>, input: (), params: [u32, f32]), + register_node!(graphene_core::vector::generator_nodes::StarGenerator<_, _, _>, input: (), params: [u32, f32, f32]), + register_node!(graphene_core::vector::generator_nodes::LineGenerator<_, _>, input: (), params: [DVec2, DVec2]), + register_node!(graphene_core::vector::generator_nodes::SplineGenerator<_>, input: (), params: [Vec]), register_node!( graphene_core::vector::generator_nodes::PathGenerator<_>, input: Vec>, From 7a1cb60ae650f72935a28ae2fc1e10a4cac046b1 Mon Sep 17 00:00:00 2001 From: Ezbaze Date: Thu, 24 Aug 2023 23:12:28 +0100 Subject: [PATCH 09/12] Debug: Empty Spline Input --- libraries/bezier-rs/src/subpath/core.rs | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/libraries/bezier-rs/src/subpath/core.rs b/libraries/bezier-rs/src/subpath/core.rs index 288e1cf7699..3991fe9aa57 100644 --- a/libraries/bezier-rs/src/subpath/core.rs +++ b/libraries/bezier-rs/src/subpath/core.rs @@ -254,6 +254,10 @@ impl Subpath { /// Construct a cubic spline from a list of points. /// Based on . pub fn new_cubic_spline(points: Vec) -> Self { + if points.is_empty() { + return Self::new(Vec::new(), false); + } + // Number of points = number of points to find handles for let len_points = points.len(); From 0ec2086739dfc48a546480fd86f5b1d52b73c2ca Mon Sep 17 00:00:00 2001 From: Ezbaze Date: Fri, 25 Aug 2023 23:45:20 +0100 Subject: [PATCH 10/12] Changes from code review --- Cargo.lock | 1 - editor/Cargo.toml | 1 - .../node_graph/node_graph_message_handler/node_properties.rs | 2 -- 3 files changed, 4 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index c96b9c20e64..5a4996b124a 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2143,7 +2143,6 @@ dependencies = [ "log", "num_enum 0.6.1", "once_cell", - "regex", "remain", "serde", "serde_json", diff --git a/editor/Cargo.toml b/editor/Cargo.toml index b3040d7ddf7..a58cc3886d6 100644 --- a/editor/Cargo.toml +++ b/editor/Cargo.toml @@ -21,7 +21,6 @@ wasm = ["wasm-bindgen", "future-executor", "graphene-std/wasm"] [dependencies] log = "0.4" -regex = "1.4" bitflags = { version = "2.3", features = ["serde"] } thiserror = "1.0" serde = { version = "1.0", features = ["derive"] } diff --git a/editor/src/messages/portfolio/document/node_graph/node_graph_message_handler/node_properties.rs b/editor/src/messages/portfolio/document/node_graph/node_graph_message_handler/node_properties.rs index 2d7783ed87b..23fe8567211 100644 --- a/editor/src/messages/portfolio/document/node_graph/node_graph_message_handler/node_properties.rs +++ b/editor/src/messages/portfolio/document/node_graph/node_graph_message_handler/node_properties.rs @@ -16,7 +16,6 @@ use graphene_core::vector::style::{FillType, GradientType, LineCap, LineJoin}; use graphene_core::{Cow, Type, TypeDescriptor}; use glam::{DVec2, IVec2}; -use regex::Regex; pub fn string_properties(text: impl Into) -> Vec { let widget = TextLabel::new(text).widget_holder(); @@ -223,7 +222,6 @@ fn vec_dvec2_input(document_node: &DocumentNode, node_id: NodeId, index: usize, let mut widgets = start_widgets(document_node, node_id, index, name, FrontendGraphDataType::Color, blank_assist); let from_string = |string: &str| { - let string = &Regex::new(r",+").unwrap().replace_all(string, ",").to_string(); string .split(|c: char| !c.is_alphanumeric() && !matches!(c, '.' | '+' | '-')) .filter(|x| !x.is_empty()) From d5d7f60c1ad47f1854f8e74ff95977adc740eb86 Mon Sep 17 00:00:00 2001 From: Keavon Chambers Date: Sun, 27 Aug 2023 01:35:56 -0700 Subject: [PATCH 11/12] Fix spelling of ellipse --- .../node_graph_message_handler/document_node_types.rs | 6 +++--- .../node_graph_message_handler/node_properties.rs | 2 +- node-graph/gcore/src/vector/generator_nodes.rs | 6 +++--- node-graph/interpreted-executor/src/node_registry.rs | 2 +- 4 files changed, 8 insertions(+), 8 deletions(-) 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 86cb89617a7..0c98f9e42f5 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 @@ -1924,16 +1924,16 @@ fn static_nodes() -> Vec { ..Default::default() }, DocumentNodeType { - name: "Elipse", + name: "Ellipse", category: "Vector", - identifier: NodeImplementation::proto("graphene_core::vector::generator_nodes::ElipseGenerator<_, _>"), + identifier: NodeImplementation::proto("graphene_core::vector::generator_nodes::EllipseGenerator<_, _>"), inputs: vec![ DocumentInputType::none(), DocumentInputType::value("Radius X", TaggedValue::F32(50.), false), DocumentInputType::value("Radius Y", TaggedValue::F32(25.), false), ], outputs: vec![DocumentOutputType::new("Vector", FrontendGraphDataType::Subpath)], - properties: node_properties::elipse_properties, + properties: node_properties::ellipse_properties, ..Default::default() }, DocumentNodeType { diff --git a/editor/src/messages/portfolio/document/node_graph/node_graph_message_handler/node_properties.rs b/editor/src/messages/portfolio/document/node_graph/node_graph_message_handler/node_properties.rs index 23fe8567211..698ec1281bf 100644 --- a/editor/src/messages/portfolio/document/node_graph/node_graph_message_handler/node_properties.rs +++ b/editor/src/messages/portfolio/document/node_graph/node_graph_message_handler/node_properties.rs @@ -1175,7 +1175,7 @@ pub fn circle_properties(document_node: &DocumentNode, node_id: NodeId, _context }] } -pub fn elipse_properties(document_node: &DocumentNode, node_id: NodeId, _context: &mut NodePropertiesContext) -> Vec { +pub fn ellipse_properties(document_node: &DocumentNode, node_id: NodeId, _context: &mut NodePropertiesContext) -> Vec { let operand = |name: &str, index| { let widgets = number_widget(document_node, node_id, index, name, NumberInput::default(), true); diff --git a/node-graph/gcore/src/vector/generator_nodes.rs b/node-graph/gcore/src/vector/generator_nodes.rs index 9484876f73e..44bf1fc208c 100644 --- a/node-graph/gcore/src/vector/generator_nodes.rs +++ b/node-graph/gcore/src/vector/generator_nodes.rs @@ -18,13 +18,13 @@ fn circle_generator(_input: (), radius: f32) -> VectorData { } #[derive(Debug, Clone, Copy)] -pub struct ElipseGenerator { +pub struct EllipseGenerator { radius_x: RadiusX, radius_y: RadiusY, } -#[node_macro::node_fn(ElipseGenerator)] -fn elipse_generator(_input: (), radius_x: f32, radius_y: f32) -> VectorData { +#[node_macro::node_fn(EllipseGenerator)] +fn ellipse_generator(_input: (), radius_x: f32, radius_y: f32) -> VectorData { let radius = DVec2::new(radius_x as f64, radius_y as f64); let corner1 = -radius; let corner2 = radius; diff --git a/node-graph/interpreted-executor/src/node_registry.rs b/node-graph/interpreted-executor/src/node_registry.rs index 36bf9d46110..32d6600643b 100644 --- a/node-graph/interpreted-executor/src/node_registry.rs +++ b/node-graph/interpreted-executor/src/node_registry.rs @@ -631,7 +631,7 @@ fn node_registry() -> HashMap, input: VectorData, params: [f32, f32, u32]), register_node!(graphene_core::vector::generator_nodes::CircleGenerator<_>, input: (), params: [f32]), - register_node!(graphene_core::vector::generator_nodes::ElipseGenerator<_, _>, input: (), params: [f32, f32]), + register_node!(graphene_core::vector::generator_nodes::EllipseGenerator<_, _>, input: (), params: [f32, f32]), register_node!(graphene_core::vector::generator_nodes::RectangleGenerator<_, _>, input: (), params: [f32, f32]), register_node!(graphene_core::vector::generator_nodes::PolygonGenerator<_, _>, input: (), params: [u32, f32]), register_node!(graphene_core::vector::generator_nodes::StarGenerator<_, _, _>, input: (), params: [u32, f32, f32]), From 2e6b258623d5b77cd02b037d5e5d06ab52fef917 Mon Sep 17 00:00:00 2001 From: Keavon Chambers Date: Sun, 27 Aug 2023 01:45:32 -0700 Subject: [PATCH 12/12] Rename polygon to regular polygon --- .../document_node_types.rs | 12 ++++++------ .../node_graph_message_handler/node_properties.rs | 2 +- .../src/messages/tool/tool_messages/polygon_tool.rs | 2 +- libraries/bezier-rs/src/subpath/core.rs | 4 ++-- node-graph/gcore/src/vector/generator_nodes.rs | 8 ++++---- node-graph/interpreted-executor/src/node_registry.rs | 2 +- 6 files changed, 15 insertions(+), 15 deletions(-) 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 0c98f9e42f5..f3d360e9eba 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 @@ -1950,16 +1950,16 @@ fn static_nodes() -> Vec { ..Default::default() }, DocumentNodeType { - name: "Polygon", + name: "Regular Polygon", category: "Vector", - identifier: NodeImplementation::proto("graphene_core::vector::generator_nodes::PolygonGenerator<_, _>"), + identifier: NodeImplementation::proto("graphene_core::vector::generator_nodes::RegularPolygonGenerator<_, _>"), inputs: vec![ DocumentInputType::none(), - DocumentInputType::value("Sides", TaggedValue::U32(32), false), + DocumentInputType::value("Sides", TaggedValue::U32(6), false), DocumentInputType::value("Radius", TaggedValue::F32(50.), false), ], outputs: vec![DocumentOutputType::new("Vector", FrontendGraphDataType::Subpath)], - properties: node_properties::polygon_properties, + properties: node_properties::regular_polygon_properties, ..Default::default() }, DocumentNodeType { @@ -1968,9 +1968,9 @@ fn static_nodes() -> Vec { identifier: NodeImplementation::proto("graphene_core::vector::generator_nodes::StarGenerator<_, _, _>"), inputs: vec![ DocumentInputType::none(), - DocumentInputType::value("Sides", TaggedValue::U32(32), false), + DocumentInputType::value("Sides", TaggedValue::U32(5), false), DocumentInputType::value("Radius", TaggedValue::F32(50.), false), - DocumentInputType::value("Inner Radius", TaggedValue::F32(40.), false), + DocumentInputType::value("Inner Radius", TaggedValue::F32(25.), false), ], outputs: vec![DocumentOutputType::new("Vector", FrontendGraphDataType::Subpath)], properties: node_properties::star_properties, diff --git a/editor/src/messages/portfolio/document/node_graph/node_graph_message_handler/node_properties.rs b/editor/src/messages/portfolio/document/node_graph/node_graph_message_handler/node_properties.rs index 698ec1281bf..8e4336597af 100644 --- a/editor/src/messages/portfolio/document/node_graph/node_graph_message_handler/node_properties.rs +++ b/editor/src/messages/portfolio/document/node_graph/node_graph_message_handler/node_properties.rs @@ -1193,7 +1193,7 @@ pub fn rectangle_properties(document_node: &DocumentNode, node_id: NodeId, _cont vec![operand("Size X", 1), operand("Size Y", 2)] } -pub fn polygon_properties(document_node: &DocumentNode, node_id: NodeId, _context: &mut NodePropertiesContext) -> Vec { +pub fn regular_polygon_properties(document_node: &DocumentNode, node_id: NodeId, _context: &mut NodePropertiesContext) -> Vec { let points = number_widget(document_node, node_id, 1, "Points", NumberInput::default().min(3.), true); let radius = number_widget(document_node, node_id, 2, "Radius", NumberInput::default(), true); diff --git a/editor/src/messages/tool/tool_messages/polygon_tool.rs b/editor/src/messages/tool/tool_messages/polygon_tool.rs index f7cbe911f8c..b3afca510bd 100644 --- a/editor/src/messages/tool/tool_messages/polygon_tool.rs +++ b/editor/src/messages/tool/tool_messages/polygon_tool.rs @@ -265,7 +265,7 @@ impl Fsm for PolygonToolFsmState { let subpath = match tool_options.primitive_shape_type { PrimitiveShapeType::Polygon => bezier_rs::Subpath::new_regular_polygon(DVec2::ZERO, tool_options.vertices as u64, 1.), - PrimitiveShapeType::Star => bezier_rs::Subpath::new_regular_star_polygon(DVec2::ZERO, tool_options.vertices as u64, 1., 0.5), + PrimitiveShapeType::Star => bezier_rs::Subpath::new_star_polygon(DVec2::ZERO, tool_options.vertices as u64, 1., 0.5), }; graph_modification_utils::new_vector_layer(vec![subpath], layer_path.clone(), responses); diff --git a/libraries/bezier-rs/src/subpath/core.rs b/libraries/bezier-rs/src/subpath/core.rs index 3991fe9aa57..3abf507aebb 100644 --- a/libraries/bezier-rs/src/subpath/core.rs +++ b/libraries/bezier-rs/src/subpath/core.rs @@ -235,8 +235,8 @@ impl Subpath { Self::from_anchors(anchor_positions, true) } - /// Constructs a regular star polygon (n-star). See [new_regular_polygon], but with interspersed vertices at an `inner_radius`. - pub fn new_regular_star_polygon(center: DVec2, sides: u64, radius: f64, inner_radius: f64) -> Self { + /// Constructs a star polygon (n-star). See [new_regular_polygon], but with interspersed vertices at an `inner_radius`. + pub fn new_star_polygon(center: DVec2, sides: u64, radius: f64, inner_radius: f64) -> Self { let anchor_positions = (0..sides * 2).map(|i| { let angle = (i as f64) * 0.5 * std::f64::consts::TAU / (sides as f64); let center = center + DVec2::ONE * radius; diff --git a/node-graph/gcore/src/vector/generator_nodes.rs b/node-graph/gcore/src/vector/generator_nodes.rs index 44bf1fc208c..a4e223a9a30 100644 --- a/node-graph/gcore/src/vector/generator_nodes.rs +++ b/node-graph/gcore/src/vector/generator_nodes.rs @@ -47,13 +47,13 @@ fn square_generator(_input: (), size_x: f32, size_y: f32) -> VectorData { } #[derive(Debug, Clone, Copy)] -pub struct PolygonGenerator { +pub struct RegularPolygonGenerator { points: Points, radius: Radius, } -#[node_macro::node_fn(PolygonGenerator)] -fn polygon_generator(_input: (), points: u32, radius: f32) -> VectorData { +#[node_macro::node_fn(RegularPolygonGenerator)] +fn regular_polygon_generator(_input: (), points: u32, radius: f32) -> VectorData { let points = points.into(); let radius: f64 = (radius * 2.).into(); super::VectorData::from_subpath(Subpath::new_regular_polygon(DVec2::splat(-radius), points, radius)) @@ -72,7 +72,7 @@ fn star_generator(_input: (), points: u32, radius: f32, inner_radius: f32) -> Ve let diameter: f64 = (radius * 2.).into(); let inner_diameter = (inner_radius * 2.).into(); - super::VectorData::from_subpath(Subpath::new_regular_star_polygon(DVec2::splat(-diameter), points, diameter, inner_diameter)) + super::VectorData::from_subpath(Subpath::new_star_polygon(DVec2::splat(-diameter), points, diameter, inner_diameter)) } #[derive(Debug, Clone, Copy)] diff --git a/node-graph/interpreted-executor/src/node_registry.rs b/node-graph/interpreted-executor/src/node_registry.rs index 32d6600643b..1bdb38f13f7 100644 --- a/node-graph/interpreted-executor/src/node_registry.rs +++ b/node-graph/interpreted-executor/src/node_registry.rs @@ -633,7 +633,7 @@ fn node_registry() -> HashMap, input: (), params: [f32]), register_node!(graphene_core::vector::generator_nodes::EllipseGenerator<_, _>, input: (), params: [f32, f32]), register_node!(graphene_core::vector::generator_nodes::RectangleGenerator<_, _>, input: (), params: [f32, f32]), - register_node!(graphene_core::vector::generator_nodes::PolygonGenerator<_, _>, input: (), params: [u32, f32]), + register_node!(graphene_core::vector::generator_nodes::RegularPolygonGenerator<_, _>, input: (), params: [u32, f32]), register_node!(graphene_core::vector::generator_nodes::StarGenerator<_, _, _>, input: (), params: [u32, f32, f32]), register_node!(graphene_core::vector::generator_nodes::LineGenerator<_, _>, input: (), params: [DVec2, DVec2]), register_node!(graphene_core::vector::generator_nodes::SplineGenerator<_>, input: (), params: [Vec]),