From 77e5ec9d4fcbcdcc1a38a6391a700ca7cbcc0a73 Mon Sep 17 00:00:00 2001 From: isiko Date: Tue, 8 Aug 2023 18:44:14 +0200 Subject: [PATCH] Add bounding box node (#1376) * Add bounding box node Generates a rectangle based on the bounding box of the input vector data * Remove redundant <> * Fix formatting --------- Co-authored-by: Dennis Kobert --- .../document_node_types.rs | 9 +++++++++ node-graph/gcore/src/vector/vector_nodes.rs | 12 ++++++++++++ node-graph/graph-craft/src/proto.rs | 2 +- node-graph/interpreted-executor/src/node_registry.rs | 1 + 4 files changed, 23 insertions(+), 1 deletion(-) 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 3269a452..7eabcd68 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 @@ -1867,6 +1867,15 @@ fn static_nodes() -> Vec { properties: node_properties::repeat_properties, ..Default::default() }, + DocumentNodeType { + name: "Bounding Box", + category: "Vector", + identifier: NodeImplementation::proto("graphene_core::vector::BoundingBoxNode"), + inputs: vec![DocumentInputType::value("Vector Data", TaggedValue::VectorData(graphene_core::vector::VectorData::empty()), true)], + outputs: vec![DocumentOutputType::new("Vector", FrontendGraphDataType::Subpath)], + properties: node_properties::no_properties, + ..Default::default() + }, DocumentNodeType { name: "Circular Repeat", category: "Vector", diff --git a/node-graph/gcore/src/vector/vector_nodes.rs b/node-graph/gcore/src/vector/vector_nodes.rs index 40f3216c..1a15e428 100644 --- a/node-graph/gcore/src/vector/vector_nodes.rs +++ b/node-graph/gcore/src/vector/vector_nodes.rs @@ -133,3 +133,15 @@ fn circular_repeat_vector_data(mut vector_data: VectorData, rotation_offset: f32 vector_data.subpaths = new_subpaths; vector_data } + +#[derive(Debug, Clone, Copy)] +pub struct BoundingBoxNode; + +#[node_macro::node_fn(BoundingBoxNode)] +fn generate_bounding_box(mut vector_data: VectorData) -> VectorData { + let bounding_box = vector_data.bounding_box().unwrap(); + VectorData::from_subpaths(vec![Subpath::new_rect( + vector_data.transform.transform_point2(bounding_box[0]), + vector_data.transform.transform_point2(bounding_box[1]), + )]) +} diff --git a/node-graph/graph-craft/src/proto.rs b/node-graph/graph-craft/src/proto.rs index 533a59ff..be7abfce 100644 --- a/node-graph/graph-craft/src/proto.rs +++ b/node-graph/graph-craft/src/proto.rs @@ -307,7 +307,7 @@ impl ProtoNetwork { let outwards_edges = self.collect_outwards_edges(); for index in 0..self.nodes.len() { - let Some(sni) = self.nodes[index].1.stable_node_id() else { + let Some(sni) = self.nodes[index].1.stable_node_id() else { panic!("failed to generate stable node id for node {:#?}", self.nodes[index].1); }; self.replace_node_id(&outwards_edges, index as NodeId, sni, false); diff --git a/node-graph/interpreted-executor/src/node_registry.rs b/node-graph/interpreted-executor/src/node_registry.rs index 3938d410..e3e2d200 100644 --- a/node-graph/interpreted-executor/src/node_registry.rs +++ b/node-graph/interpreted-executor/src/node_registry.rs @@ -567,6 +567,7 @@ fn node_registry() -> HashMap, 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, f32, Vec, 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::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!(