From fa2af78176550f0f120cd873117ac33ecf67fe05 Mon Sep 17 00:00:00 2001 From: Firestar99 Date: Fri, 27 Jun 2025 15:39:12 +0200 Subject: [PATCH] Extract `gelement-nodes` for nodes accepting both vector, raster and graphic element --- Cargo.lock | 19 +++++++++++ Cargo.toml | 3 ++ .../node_graph/document_node_definitions.rs | 2 +- .../messages/portfolio/document_migration.rs | 31 +++++++++++++----- node-graph/gcore/src/lib.rs | 4 --- node-graph/gcore/src/vector/algorithms/mod.rs | 1 - node-graph/gelement-nodes/Cargo.toml | 32 +++++++++++++++++++ .../src/animation.rs | 2 +- .../src/blending_nodes.rs | 17 +++++----- .../src}/instance.rs | 19 ++++++----- node-graph/gelement-nodes/src/lib.rs | 5 +++ .../{gcore => gelement-nodes}/src/logic.rs | 5 +-- .../src/transform_nodes.rs | 11 ++++--- node-graph/graph-craft/Cargo.toml | 1 + node-graph/graph-craft/src/document/value.rs | 2 +- node-graph/gstd/Cargo.toml | 1 + node-graph/gstd/src/lib.rs | 1 + 17 files changed, 116 insertions(+), 40 deletions(-) create mode 100644 node-graph/gelement-nodes/Cargo.toml rename node-graph/{gcore => gelement-nodes}/src/animation.rs (95%) rename node-graph/{gcore => gelement-nodes}/src/blending_nodes.rs (93%) rename node-graph/{gcore/src/vector/algorithms => gelement-nodes/src}/instance.rs (88%) create mode 100644 node-graph/gelement-nodes/src/lib.rs rename node-graph/{gcore => gelement-nodes}/src/logic.rs (95%) rename node-graph/{gcore => gelement-nodes}/src/transform_nodes.rs (87%) diff --git a/Cargo.lock b/Cargo.lock index c7ae0cdb13..fd8f7a9741 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2132,6 +2132,7 @@ dependencies = [ "graph-craft", "graphene-application-io", "graphene-core", + "graphene-element-nodes", "graphene-path-bool", "graphene-svg-renderer", "iai-callgrind", @@ -2213,6 +2214,23 @@ dependencies = [ "wgpu", ] +[[package]] +name = "graphene-element-nodes" +version = "0.1.0" +dependencies = [ + "bezier-rs", + "dyn-any", + "glam", + "graphene-core", + "graphene-math-nodes", + "log", + "node-macro", + "rand 0.9.0", + "serde", + "specta", + "tokio", +] + [[package]] name = "graphene-math-nodes" version = "0.1.0" @@ -2253,6 +2271,7 @@ dependencies = [ "graph-craft", "graphene-application-io", "graphene-core", + "graphene-element-nodes", "graphene-math-nodes", "graphene-path-bool", "graphene-svg-renderer", diff --git a/Cargo.toml b/Cargo.toml index 56c27ce6fe..3e2d0b586e 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -7,6 +7,7 @@ members = [ "node-graph/gapplication-io", "node-graph/gcore", "node-graph/gstd", + "node-graph/gelement-nodes", "node-graph/gmath-nodes", "node-graph/gpath-bool", "node-graph/graph-craft", @@ -26,6 +27,7 @@ default-members = [ "frontend/wasm", "node-graph/gcore", "node-graph/gstd", + "node-graph/gelement-nodes", "node-graph/gmath-nodes", "node-graph/gpath-bool", "node-graph/graph-craft", @@ -45,6 +47,7 @@ math-parser = { path = "libraries/math-parser" } path-bool = { path = "libraries/path-bool" } graphene-application-io = { path = "node-graph/gapplication-io" } graphene-core = { path = "node-graph/gcore" } +graphene-element-nodes = { path = "node-graph/gelement-nodes" } graphene-math-nodes = { path = "node-graph/gmath-nodes" } graphene-path-bool = { path = "node-graph/gpath-bool" } graph-craft = { path = "node-graph/graph-craft" } diff --git a/editor/src/messages/portfolio/document/node_graph/document_node_definitions.rs b/editor/src/messages/portfolio/document/node_graph/document_node_definitions.rs index c426ac85a1..c8a92bcda6 100644 --- a/editor/src/messages/portfolio/document/node_graph/document_node_definitions.rs +++ b/editor/src/messages/portfolio/document/node_graph/document_node_definitions.rs @@ -1650,7 +1650,7 @@ fn static_nodes() -> Vec { NodeInput::network(concrete!(DVec2), 5), ], manual_composition: Some(concrete!(Context)), - implementation: DocumentNodeImplementation::ProtoNode(ProtoNodeIdentifier::new("graphene_core::transform_nodes::TransformNode")), + implementation: DocumentNodeImplementation::ProtoNode(ProtoNodeIdentifier::new("graphene_element_nodes::transform_nodes::TransformNode")), ..Default::default() }, ] diff --git a/editor/src/messages/portfolio/document_migration.rs b/editor/src/messages/portfolio/document_migration.rs index e8724966c1..0683d74191 100644 --- a/editor/src/messages/portfolio/document_migration.rs +++ b/editor/src/messages/portfolio/document_migration.rs @@ -76,9 +76,12 @@ const REPLACEMENTS: &[(&str, &str)] = &[ ("graphene_core::ops::Vector2ValueNode", "graphene_core::ops::CoordinateValueNode"), ("graphene_core::raster::BlackAndWhiteNode", "graphene_core::raster::adjustments::BlackAndWhiteNode"), ("graphene_core::raster::BlendNode", "graphene_core::raster::adjustments::BlendNode"), - ("graphene_core::raster::BlendModeNode", "graphene_core::blending_nodes::BlendModeNode"), - ("graphene_core::raster::OpacityNode", "graphene_core::blending_nodes::OpacityNode"), - ("graphene_core::raster::BlendingNode", "graphene_core::blending_nodes::BlendingNode"), + ("graphene_core::raster::BlendModeNode", "graphene_element_nodes::blending_nodes::BlendModeNode"), + ("graphene_core::blending_nodes::BlendModeNode", "graphene_element_nodes::blending_nodes::BlendModeNode"), + ("graphene_core::raster::OpacityNode", "graphene_element_nodes::blending_nodes::OpacityNode"), + ("graphene_core::blending_nodes::OpacityNode", "graphene_element_nodes::blending_nodes::OpacityNode"), + ("graphene_core::raster::BlendingNode", "graphene_element_nodes::blending_nodes::BlendingNode"), + ("graphene_core::blending_nodes::BlendingNode", "graphene_element_nodes::blending_nodes::BlendingNode"), ("graphene_core::raster::ChannelMixerNode", "graphene_core::raster::adjustments::ChannelMixerNode"), ("graphene_core::raster::adjustments::ColorOverlayNode", "graphene_core::raster::adjustments::ColorOverlayNode"), ("graphene_core::raster::ExposureNode", "graphene_core::raster::adjustments::ExposureNode"), @@ -96,11 +99,23 @@ const REPLACEMENTS: &[(&str, &str)] = &[ ("graphene_core::raster::ThresholdNode", "graphene_core::raster::adjustments::ThresholdNode"), ("graphene_core::raster::VibranceNode", "graphene_core::raster::adjustments::VibranceNode"), ("graphene_core::text::TextGeneratorNode", "graphene_core::text::TextNode"), - ("graphene_core::transform::SetTransformNode", "graphene_core::transform_nodes::ReplaceTransformNode"), - ("graphene_core::transform::ReplaceTransformNode", "graphene_core::transform_nodes::ReplaceTransformNode"), - ("graphene_core::transform::TransformNode", "graphene_core::transform_nodes::TransformNode"), - ("graphene_core::transform::BoundlessFootprintNode", "graphene_core::transform_nodes::BoundlessFootprintNode"), - ("graphene_core::transform::FreezeRealTimeNode", "graphene_core::transform_nodes::FreezeRealTimeNode"), + ("graphene_core::transform::SetTransformNode", "graphene_element_nodes::transform_nodes::ReplaceTransformNode"), + ("graphene_core::transform::ReplaceTransformNode", "graphene_element_nodes::transform_nodes::ReplaceTransformNode"), + ("graphene_core::transform::TransformNode", "graphene_element_nodes::transform_nodes::TransformNode"), + ("graphene_core::transform_nodes::TransformNode", "graphene_element_nodes::transform_nodes::TransformNode"), + ("graphene_core::transform::BoundlessFootprintNode", "graphene_element_nodes::transform_nodes::BoundlessFootprintNode"), + ( + "graphene_core::transform_nodes::BoundlessFootprintNode", + "graphene_element_nodes::transform_nodes::BoundlessFootprintNode", + ), + ("graphene_core::transform::FreezeRealTimeNode", "graphene_element_nodes::transform_nodes::FreezeRealTimeNode"), + ("graphene_core::transform_nodes::FreezeRealTimeNode", "graphene_element_nodes::transform_nodes::FreezeRealTimeNode"), + ("graphene_core::animation::RealTimeNode", "graphene_element_nodes::animation::RealTimeNode"), + ("graphene_core::animation::AnimationTimeNode", "graphene_element_nodes::animation::AnimationTimeNode"), + ("graphene_core::instance::InstanceOnPointsNode", "graphene_element_nodes::instance::InstanceOnPointsNode"), + ("graphene_core::instance::InstanceRepeatNode", "graphene_element_nodes::instance::InstanceRepeatNode"), + ("graphene_core::instance::InstancePositionNode", "graphene_element_nodes::instance::InstancePositionNode"), + ("graphene_core::instance::InstanceIndexNode", "graphene_element_nodes::instance::InstanceIndexNode"), ("graphene_core::vector::SplinesFromPointsNode", "graphene_core::vector::SplineNode"), ("graphene_core::vector::generator_nodes::EllipseGenerator", "graphene_core::vector::generator_nodes::EllipseNode"), ("graphene_core::vector::generator_nodes::LineGenerator", "graphene_core::vector::generator_nodes::LineNode"), diff --git a/node-graph/gcore/src/lib.rs b/node-graph/gcore/src/lib.rs index 973b2f4d24..78d659bf40 100644 --- a/node-graph/gcore/src/lib.rs +++ b/node-graph/gcore/src/lib.rs @@ -1,9 +1,7 @@ #[macro_use] extern crate log; -pub mod animation; pub mod blending; -pub mod blending_nodes; pub mod bounds; pub mod color; pub mod consts; @@ -14,7 +12,6 @@ pub mod generic; pub mod gradient; mod graphic_element; pub mod instances; -pub mod logic; pub mod math; pub mod memo; pub mod misc; @@ -25,7 +22,6 @@ pub mod registry; pub mod structural; pub mod text; pub mod transform; -pub mod transform_nodes; pub mod uuid; pub mod value; pub mod vector; diff --git a/node-graph/gcore/src/vector/algorithms/mod.rs b/node-graph/gcore/src/vector/algorithms/mod.rs index ed44f25590..9751e2f720 100644 --- a/node-graph/gcore/src/vector/algorithms/mod.rs +++ b/node-graph/gcore/src/vector/algorithms/mod.rs @@ -1,5 +1,4 @@ pub mod bezpath_algorithms; -pub mod instance; pub mod merge_by_distance; pub mod offset_subpath; pub mod poisson_disk; diff --git a/node-graph/gelement-nodes/Cargo.toml b/node-graph/gelement-nodes/Cargo.toml new file mode 100644 index 0000000000..e00195ec9a --- /dev/null +++ b/node-graph/gelement-nodes/Cargo.toml @@ -0,0 +1,32 @@ +[package] +name = "graphene-element-nodes" +version = "0.1.0" +edition = "2024" +description = "graphene element nodes" +authors = ["Graphite Authors "] +license = "MIT OR Apache-2.0" + +[features] +default = ["serde"] +serde = ["dep:serde"] + +[dependencies] +# Local dependencies +dyn-any = { workspace = true } +graphene-core = { workspace = true } +node-macro = { workspace = true } +bezier-rs = { workspace = true } + +# Workspace dependencies +glam = { workspace = true } +specta = { workspace = true } +rand = { workspace = true } +log = { workspace = true } + +# Optional workspace dependencies +serde = { workspace = true, optional = true, features = ["derive"] } + +[dev-dependencies] +# Workspace dependencies +tokio = { workspace = true } +graphene-math-nodes = { workspace = true } diff --git a/node-graph/gcore/src/animation.rs b/node-graph/gelement-nodes/src/animation.rs similarity index 95% rename from node-graph/gcore/src/animation.rs rename to node-graph/gelement-nodes/src/animation.rs index fe992397bc..77e49a1181 100644 --- a/node-graph/gcore/src/animation.rs +++ b/node-graph/gelement-nodes/src/animation.rs @@ -1,4 +1,4 @@ -use crate::{Ctx, ExtractAnimationTime, ExtractTime}; +use graphene_core::context::{Ctx, ExtractAnimationTime, ExtractTime}; const DAY: f64 = 1000. * 3600. * 24.; diff --git a/node-graph/gcore/src/blending_nodes.rs b/node-graph/gelement-nodes/src/blending_nodes.rs similarity index 93% rename from node-graph/gcore/src/blending_nodes.rs rename to node-graph/gelement-nodes/src/blending_nodes.rs index fcf2bd0c00..d74d86cbfe 100644 --- a/node-graph/gcore/src/blending_nodes.rs +++ b/node-graph/gelement-nodes/src/blending_nodes.rs @@ -1,8 +1,10 @@ -use crate::raster::Image; -use crate::raster_types::{CPU, RasterDataTable}; -use crate::registry::types::Percentage; -use crate::vector::VectorDataTable; -use crate::{BlendMode, Color, Ctx, GraphicElement, GraphicGroupTable}; +use graphene_core::GraphicGroupTable; +use graphene_core::blending::BlendMode; +use graphene_core::color::Color; +use graphene_core::context::Ctx; +use graphene_core::raster_types::{CPU, RasterDataTable}; +use graphene_core::registry::types::Percentage; +use graphene_core::vector::VectorDataTable; pub(super) trait MultiplyAlpha { fn multiply_alpha(&mut self, factor: f64); @@ -27,10 +29,7 @@ impl MultiplyAlpha for GraphicGroupTable { } } } -impl MultiplyAlpha for RasterDataTable -where - GraphicElement: From>, -{ +impl MultiplyAlpha for RasterDataTable { fn multiply_alpha(&mut self, factor: f64) { for instance in self.instance_mut_iter() { instance.alpha_blending.opacity *= factor as f32; diff --git a/node-graph/gcore/src/vector/algorithms/instance.rs b/node-graph/gelement-nodes/src/instance.rs similarity index 88% rename from node-graph/gcore/src/vector/algorithms/instance.rs rename to node-graph/gelement-nodes/src/instance.rs index 5b94903702..c23a1d3589 100644 --- a/node-graph/gcore/src/vector/algorithms/instance.rs +++ b/node-graph/gelement-nodes/src/instance.rs @@ -1,8 +1,11 @@ -use crate::instances::{InstanceRef, Instances}; -use crate::raster_types::{CPU, RasterDataTable}; -use crate::vector::VectorDataTable; -use crate::{CloneVarArgs, Context, Ctx, ExtractAll, ExtractIndex, ExtractVarArgs, GraphicElement, GraphicGroupTable, OwnedContextImpl}; use glam::DVec2; +use graphene_core::GraphicElement; +use graphene_core::GraphicGroupTable; +use graphene_core::context::{CloneVarArgs, Context, Ctx, ExtractAll, ExtractIndex, ExtractVarArgs, OwnedContextImpl}; +use graphene_core::instances::{InstanceRef, Instances}; +use graphene_core::raster_types::{CPU, RasterDataTable}; +use graphene_core::vector::VectorDataTable; +use log::warn; #[node_macro::node(name("Instance on Points"), category("Instancing"), path(graphene_core::vector))] async fn instance_on_points + Default + Send + Clone + 'static>( @@ -98,11 +101,11 @@ async fn instance_index(ctx: impl Ctx + ExtractIndex) -> f64 { #[cfg(test)] mod test { use super::*; - use crate::Node; - use crate::extract_xy::{ExtractXyNode, XY}; - use crate::vector::VectorData; use bezier_rs::Subpath; use glam::DVec2; + use graphene_core::Node; + use graphene_core::extract_xy::{ExtractXyNode, XY}; + use graphene_core::vector::VectorData; use std::pin::Pin; #[derive(Clone)] @@ -119,7 +122,7 @@ mod test { #[tokio::test] async fn instance_on_points_test() { let owned = OwnedContextImpl::default().into_context(); - let rect = crate::vector::generator_nodes::RectangleNode::new( + let rect = graphene_core::vector::generator_nodes::RectangleNode::new( FutureWrapperNode(()), ExtractXyNode::new(InstancePositionNode {}, FutureWrapperNode(XY::Y)), FutureWrapperNode(2_f64), diff --git a/node-graph/gelement-nodes/src/lib.rs b/node-graph/gelement-nodes/src/lib.rs new file mode 100644 index 0000000000..6b4e1b1276 --- /dev/null +++ b/node-graph/gelement-nodes/src/lib.rs @@ -0,0 +1,5 @@ +pub mod animation; +pub mod blending_nodes; +pub mod instance; +pub mod logic; +pub mod transform_nodes; diff --git a/node-graph/gcore/src/logic.rs b/node-graph/gelement-nodes/src/logic.rs similarity index 95% rename from node-graph/gcore/src/logic.rs rename to node-graph/gelement-nodes/src/logic.rs index a9a7f4d37c..e9b564ff1f 100644 --- a/node-graph/gcore/src/logic.rs +++ b/node-graph/gelement-nodes/src/logic.rs @@ -1,6 +1,7 @@ -use crate::vector::VectorDataTable; -use crate::{Color, Context, Ctx}; use glam::{DAffine2, DVec2}; +use graphene_core::color::Color; +use graphene_core::context::{Context, Ctx}; +use graphene_core::vector::VectorDataTable; #[node_macro::node(category("Debug"), name("Log to Console"))] fn log_to_console(_: impl Ctx, #[implementations(String, bool, f64, u32, u64, DVec2, VectorDataTable, DAffine2, Color, Option)] value: T) -> T { diff --git a/node-graph/gcore/src/transform_nodes.rs b/node-graph/gelement-nodes/src/transform_nodes.rs similarity index 87% rename from node-graph/gcore/src/transform_nodes.rs rename to node-graph/gelement-nodes/src/transform_nodes.rs index 39024681e6..f4e7ef6d8b 100644 --- a/node-graph/gcore/src/transform_nodes.rs +++ b/node-graph/gelement-nodes/src/transform_nodes.rs @@ -1,10 +1,11 @@ -use crate::instances::Instances; -use crate::raster_types::{CPU, GPU, RasterDataTable}; -use crate::transform::{ApplyTransform, Footprint, Transform}; -use crate::vector::VectorDataTable; -use crate::{CloneVarArgs, Context, Ctx, ExtractAll, GraphicGroupTable, OwnedContextImpl}; use core::f64; use glam::{DAffine2, DVec2}; +use graphene_core::GraphicGroupTable; +use graphene_core::context::{CloneVarArgs, Context, Ctx, ExtractAll, OwnedContextImpl}; +use graphene_core::instances::Instances; +use graphene_core::raster_types::{CPU, GPU, RasterDataTable}; +use graphene_core::transform::{ApplyTransform, Footprint, Transform}; +use graphene_core::vector::VectorDataTable; #[node_macro::node(category(""))] async fn transform( diff --git a/node-graph/graph-craft/Cargo.toml b/node-graph/graph-craft/Cargo.toml index c4bcf7e0d8..01bcaa7803 100644 --- a/node-graph/graph-craft/Cargo.toml +++ b/node-graph/graph-craft/Cargo.toml @@ -16,6 +16,7 @@ loading = ["serde_json"] # Local dependencies dyn-any = { workspace = true } graphene-core = { workspace = true } +graphene-element-nodes = { workspace = true } graphene-path-bool = { workspace = true } graphene-application-io = { workspace = true } graphene-svg-renderer = { workspace = true } diff --git a/node-graph/graph-craft/src/document/value.rs b/node-graph/graph-craft/src/document/value.rs index 742b155557..535a5070bd 100644 --- a/node-graph/graph-craft/src/document/value.rs +++ b/node-graph/graph-craft/src/document/value.rs @@ -224,7 +224,7 @@ tagged_value! { XY(graphene_core::extract_xy::XY), RedGreenBlue(graphene_core::raster::RedGreenBlue), RedGreenBlueAlpha(graphene_core::raster::RedGreenBlueAlpha), - RealTimeMode(graphene_core::animation::RealTimeMode), + RealTimeMode(graphene_element_nodes::animation::RealTimeMode), NoiseType(graphene_core::raster::NoiseType), FractalType(graphene_core::raster::FractalType), CellularDistanceFunction(graphene_core::raster::CellularDistanceFunction), diff --git a/node-graph/gstd/Cargo.toml b/node-graph/gstd/Cargo.toml index b8f4e01631..2ee8b72b2f 100644 --- a/node-graph/gstd/Cargo.toml +++ b/node-graph/gstd/Cargo.toml @@ -32,6 +32,7 @@ graphene-path-bool = { workspace = true } graphene-math-nodes = { workspace = true } graphene-svg-renderer = { workspace = true } graphene-application-io = { workspace = true } +graphene-element-nodes = { workspace = true } # Workspace dependencies fastnoise-lite = { workspace = true } diff --git a/node-graph/gstd/src/lib.rs b/node-graph/gstd/src/lib.rs index eeca277f67..1e24ae49d7 100644 --- a/node-graph/gstd/src/lib.rs +++ b/node-graph/gstd/src/lib.rs @@ -12,6 +12,7 @@ pub mod wasm_application_io; pub use graphene_application_io as application_io; pub use graphene_core::vector; pub use graphene_core::*; +pub use graphene_element_nodes::animation; pub use graphene_math_nodes as math_nodes; pub use graphene_path_bool as path_bool;