From a182a7347ef89e1a5420fc12423c8bd9998cea39 Mon Sep 17 00:00:00 2001 From: Firestar99 Date: Tue, 1 Jul 2025 20:38:47 +0200 Subject: [PATCH] Extract `gbrush` (#2784) --- Cargo.lock | 15 ++++++++++ Cargo.toml | 3 ++ .../graph_operation_message.rs | 2 +- .../document/graph_operation/utility_types.rs | 2 +- .../node_graph/document_node_definitions.rs | 4 +-- .../messages/portfolio/document_migration.rs | 4 +++ .../messages/tool/tool_messages/brush_tool.rs | 2 +- node-graph/gbrush/Cargo.toml | 28 +++++++++++++++++++ node-graph/{gstd => gbrush}/src/brush.rs | 19 +++++++------ .../src/raster => gbrush/src}/brush_cache.rs | 16 +++++------ .../src/vector => gbrush/src}/brush_stroke.rs | 6 ++-- node-graph/gbrush/src/lib.rs | 3 ++ node-graph/gcore/src/raster.rs | 1 - node-graph/gcore/src/vector/mod.rs | 1 - node-graph/graph-craft/Cargo.toml | 1 + node-graph/graph-craft/src/document/value.rs | 5 ++-- node-graph/gstd/Cargo.toml | 1 + node-graph/gstd/src/lib.rs | 2 +- 18 files changed, 85 insertions(+), 30 deletions(-) create mode 100644 node-graph/gbrush/Cargo.toml rename node-graph/{gstd => gbrush}/src/brush.rs (97%) rename node-graph/{gcore/src/raster => gbrush/src}/brush_cache.rs (91%) rename node-graph/{gcore/src/vector => gbrush/src}/brush_stroke.rs (96%) create mode 100644 node-graph/gbrush/src/lib.rs diff --git a/Cargo.lock b/Cargo.lock index 51526e9fb..da16bddb2 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2195,6 +2195,7 @@ dependencies = [ "glam", "graph-craft", "graphene-application-io", + "graphene-brush", "graphene-core", "graphene-path-bool", "graphene-raster-nodes", @@ -2229,6 +2230,19 @@ dependencies = [ "wgpu", ] +[[package]] +name = "graphene-brush" +version = "0.1.0" +dependencies = [ + "dyn-any", + "glam", + "graphene-core", + "graphene-raster-nodes", + "node-macro", + "serde", + "tokio", +] + [[package]] name = "graphene-cli" version = "0.1.0" @@ -2339,6 +2353,7 @@ dependencies = [ "glam", "graph-craft", "graphene-application-io", + "graphene-brush", "graphene-core", "graphene-math-nodes", "graphene-path-bool", diff --git a/Cargo.toml b/Cargo.toml index 863cef67a..faeac043e 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -5,6 +5,7 @@ members = [ "frontend/wasm", "frontend/src-tauri", "node-graph/gapplication-io", + "node-graph/gbrush", "node-graph/gcore", "node-graph/gstd", "node-graph/gmath-nodes", @@ -25,6 +26,7 @@ members = [ default-members = [ "editor", "frontend/wasm", + "node-graph/gbrush", "node-graph/gcore", "node-graph/gstd", "node-graph/gmath-nodes", @@ -46,6 +48,7 @@ preprocessor = { path = "node-graph/preprocessor"} math-parser = { path = "libraries/math-parser" } path-bool = { path = "libraries/path-bool" } graphene-application-io = { path = "node-graph/gapplication-io" } +graphene-brush = { path = "node-graph/gbrush" } graphene-core = { path = "node-graph/gcore" } graphene-math-nodes = { path = "node-graph/gmath-nodes" } graphene-path-bool = { path = "node-graph/gpath-bool" } diff --git a/editor/src/messages/portfolio/document/graph_operation/graph_operation_message.rs b/editor/src/messages/portfolio/document/graph_operation/graph_operation_message.rs index db4fe3732..abb1aa859 100644 --- a/editor/src/messages/portfolio/document/graph_operation/graph_operation_message.rs +++ b/editor/src/messages/portfolio/document/graph_operation/graph_operation_message.rs @@ -6,12 +6,12 @@ use bezier_rs::Subpath; use glam::{DAffine2, DVec2, IVec2}; use graph_craft::document::NodeId; use graphene_std::Artboard; +use graphene_std::brush::brush_stroke::BrushStroke; use graphene_std::raster::BlendMode; use graphene_std::raster_types::{CPU, RasterDataTable}; use graphene_std::text::{Font, TypesettingConfig}; use graphene_std::vector::PointId; use graphene_std::vector::VectorModificationType; -use graphene_std::vector::brush_stroke::BrushStroke; use graphene_std::vector::style::{Fill, Stroke}; #[impl_message(Message, DocumentMessage, GraphOperation)] diff --git a/editor/src/messages/portfolio/document/graph_operation/utility_types.rs b/editor/src/messages/portfolio/document/graph_operation/utility_types.rs index 245b2f41e..311e22aaa 100644 --- a/editor/src/messages/portfolio/document/graph_operation/utility_types.rs +++ b/editor/src/messages/portfolio/document/graph_operation/utility_types.rs @@ -9,10 +9,10 @@ use graph_craft::concrete; use graph_craft::document::value::TaggedValue; use graph_craft::document::{NodeId, NodeInput}; use graphene_std::Artboard; +use graphene_std::brush::brush_stroke::BrushStroke; use graphene_std::raster::BlendMode; use graphene_std::raster_types::{CPU, RasterDataTable}; use graphene_std::text::{Font, TypesettingConfig}; -use graphene_std::vector::brush_stroke::BrushStroke; use graphene_std::vector::style::{Fill, Stroke}; use graphene_std::vector::{PointId, VectorModificationType}; use graphene_std::vector::{VectorData, VectorDataTable}; 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 dd07a07c5..625c1a3e0 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 @@ -16,8 +16,8 @@ use graph_craft::ProtoNodeIdentifier; use graph_craft::concrete; use graph_craft::document::value::*; use graph_craft::document::*; +use graphene_std::brush::brush_cache::BrushCache; use graphene_std::extract_xy::XY; -use graphene_std::raster::brush_cache::BrushCache; use graphene_std::raster::{CellularDistanceFunction, CellularReturnType, Color, DomainWarpType, FractalType, NoiseType, RedGreenBlueAlpha}; use graphene_std::raster_types::{CPU, RasterDataTable}; use graphene_std::text::{Font, TypesettingConfig}; @@ -1032,7 +1032,7 @@ fn static_nodes() -> Vec { nodes: vec![DocumentNode { inputs: vec![ NodeInput::network(concrete!(RasterDataTable), 0), - NodeInput::network(concrete!(Vec), 1), + NodeInput::network(concrete!(Vec), 1), NodeInput::network(concrete!(BrushCache), 2), ], manual_composition: Some(concrete!(Context)), diff --git a/editor/src/messages/portfolio/document_migration.rs b/editor/src/messages/portfolio/document_migration.rs index 66463aa16..fc8f42ff7 100644 --- a/editor/src/messages/portfolio/document_migration.rs +++ b/editor/src/messages/portfolio/document_migration.rs @@ -147,6 +147,10 @@ const REPLACEMENTS: &[(&str, &str)] = &[ ("graphene_std::raster::MaskImageNode", "graphene_std::raster::MaskNode"), ("graphene_core::vector::FlattenVectorElementsNode", "graphene_core::vector::FlattenPathNode"), ("graphene_std::vector::BooleanOperationNode", "graphene_path_bool::BooleanOperationNode"), + // brush + ("graphene_std::brush::BrushStampGeneratorNode", "graphene_brush::brush::BrushStampGeneratorNode"), + ("graphene_std::brush::BlitNode", "graphene_brush::brush::BlitNode"), + ("graphene_std::brush::BrushNode", "graphene_brush::brush::BrushNode"), ]; pub fn document_migration_string_preprocessing(document_serialized_content: String) -> String { diff --git a/editor/src/messages/tool/tool_messages/brush_tool.rs b/editor/src/messages/tool/tool_messages/brush_tool.rs index 0e8a2f81c..b46860398 100644 --- a/editor/src/messages/tool/tool_messages/brush_tool.rs +++ b/editor/src/messages/tool/tool_messages/brush_tool.rs @@ -8,8 +8,8 @@ use crate::messages::tool::common_functionality::color_selector::{ToolColorOptio use graph_craft::document::NodeId; use graph_craft::document::value::TaggedValue; use graphene_std::Color; +use graphene_std::brush::brush_stroke::{BrushInputSample, BrushStroke, BrushStyle}; use graphene_std::raster::BlendMode; -use graphene_std::vector::brush_stroke::{BrushInputSample, BrushStroke, BrushStyle}; const BRUSH_MAX_SIZE: f64 = 5000.; diff --git a/node-graph/gbrush/Cargo.toml b/node-graph/gbrush/Cargo.toml new file mode 100644 index 000000000..7b2f8b340 --- /dev/null +++ b/node-graph/gbrush/Cargo.toml @@ -0,0 +1,28 @@ +[package] +name = "graphene-brush" +version = "0.1.0" +edition = "2024" +description = "graphene brush" +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 } +graphene-raster-nodes = { workspace = true } +node-macro = { workspace = true } + +# Workspace dependencies +glam = { workspace = true } + +# Optional workspace dependencies +serde = { workspace = true, optional = true, features = ["derive"] } + +[dev-dependencies] +# Workspace dependencies +tokio = { workspace = true } diff --git a/node-graph/gstd/src/brush.rs b/node-graph/gbrush/src/brush.rs similarity index 97% rename from node-graph/gstd/src/brush.rs rename to node-graph/gbrush/src/brush.rs index 24c3b00d8..b2782adc8 100644 --- a/node-graph/gstd/src/brush.rs +++ b/node-graph/gbrush/src/brush.rs @@ -1,17 +1,19 @@ +use crate::brush_cache::BrushCache; +use crate::brush_stroke::{BrushStroke, BrushStyle}; use glam::{DAffine2, DVec2}; -use graph_craft::generic::FnNode; -use graph_craft::proto::FutureWrapperNode; +use graphene_core::blending::BlendMode; use graphene_core::bounds::BoundingBox; +use graphene_core::color::{Alpha, Color, Pixel, Sample}; +use graphene_core::generic::FnNode; use graphene_core::instances::Instance; use graphene_core::math::bbox::{AxisAlignedBbox, Bbox}; -use graphene_core::raster::brush_cache::BrushCache; +use graphene_core::raster::BitmapMut; use graphene_core::raster::image::Image; -use graphene_core::raster::{Alpha, BitmapMut, BlendMode, Color, Pixel, Sample}; use graphene_core::raster_types::{CPU, Raster, RasterDataTable}; +use graphene_core::registry::FutureWrapperNode; use graphene_core::transform::Transform; use graphene_core::value::ClonedNode; -use graphene_core::vector::brush_stroke::{BrushStroke, BrushStyle}; -use graphene_core::{Ctx, GraphicElement, Node}; +use graphene_core::{Ctx, Node}; use graphene_raster_nodes::adjustments::blend_colors; use graphene_raster_nodes::std_nodes::{empty_image, extend_image_to_bounds}; @@ -50,7 +52,7 @@ impl Sample for BrushStampGenerator

{ return None; }; - use graphene_core::raster::Channel; + use graphene_core::color::Channel; Some(self.color.multiplied_alpha(P::AlphaChannel::from_linear(result))) } } @@ -78,7 +80,6 @@ fn brush_stamp_generator(#[unit(" px")] diameter: f64, color: Color, hardness: f fn blit(mut target: RasterDataTable, texture: Raster, positions: Vec, blend_mode: BlendFn) -> RasterDataTable where BlendFn: for<'any_input> Node<'any_input, (Color, Color), Output = Color>, - GraphicElement: From>, { if positions.is_empty() { return target; @@ -392,7 +393,7 @@ mod test { (), RasterDataTable::::new(Raster::new_cpu(Image::::default())), vec![BrushStroke { - trace: vec![crate::vector::brush_stroke::BrushInputSample { position: DVec2::ZERO }], + trace: vec![crate::brush_stroke::BrushInputSample { position: DVec2::ZERO }], style: BrushStyle { color: Color::BLACK, diameter: 20., diff --git a/node-graph/gcore/src/raster/brush_cache.rs b/node-graph/gbrush/src/brush_cache.rs similarity index 91% rename from node-graph/gcore/src/raster/brush_cache.rs rename to node-graph/gbrush/src/brush_cache.rs index 564b5c801..853a13ca3 100644 --- a/node-graph/gcore/src/raster/brush_cache.rs +++ b/node-graph/gbrush/src/brush_cache.rs @@ -1,9 +1,9 @@ -use crate::instances::Instance; -use crate::raster_types::CPU; -use crate::raster_types::Raster; -use crate::vector::brush_stroke::BrushStroke; -use crate::vector::brush_stroke::BrushStyle; +use crate::brush_stroke::BrushStroke; +use crate::brush_stroke::BrushStyle; use dyn_any::DynAny; +use graphene_core::instances::Instance; +use graphene_core::raster_types::CPU; +use graphene_core::raster_types::Raster; use std::collections::HashMap; use std::hash::Hash; use std::sync::Arc; @@ -15,11 +15,11 @@ struct BrushCacheImpl { prev_input: Vec, // The strokes that have been fully processed and blended into the background. - #[serde(deserialize_with = "crate::graphene_core::raster::image::migrate_image_frame_instance")] + #[serde(deserialize_with = "graphene_core::raster::image::migrate_image_frame_instance")] background: Instance>, - #[serde(deserialize_with = "crate::graphene_core::raster::image::migrate_image_frame_instance")] + #[serde(deserialize_with = "graphene_core::raster::image::migrate_image_frame_instance")] blended_image: Instance>, - #[serde(deserialize_with = "crate::graphene_core::raster::image::migrate_image_frame_instance")] + #[serde(deserialize_with = "graphene_core::raster::image::migrate_image_frame_instance")] last_stroke_texture: Instance>, // A cache for brush textures. diff --git a/node-graph/gcore/src/vector/brush_stroke.rs b/node-graph/gbrush/src/brush_stroke.rs similarity index 96% rename from node-graph/gcore/src/vector/brush_stroke.rs rename to node-graph/gbrush/src/brush_stroke.rs index 17ec7fe44..5b07e0136 100644 --- a/node-graph/gcore/src/vector/brush_stroke.rs +++ b/node-graph/gbrush/src/brush_stroke.rs @@ -1,8 +1,8 @@ -use crate::Color; -use crate::math::bbox::AxisAlignedBbox; -use crate::raster::BlendMode; use dyn_any::DynAny; use glam::DVec2; +use graphene_core::blending::BlendMode; +use graphene_core::color::Color; +use graphene_core::math::bbox::AxisAlignedBbox; use std::hash::{Hash, Hasher}; /// The style of a brush. diff --git a/node-graph/gbrush/src/lib.rs b/node-graph/gbrush/src/lib.rs new file mode 100644 index 000000000..76fc7348d --- /dev/null +++ b/node-graph/gbrush/src/lib.rs @@ -0,0 +1,3 @@ +pub mod brush; +pub mod brush_cache; +pub mod brush_stroke; diff --git a/node-graph/gcore/src/raster.rs b/node-graph/gcore/src/raster.rs index 7d1063252..60106bdc7 100644 --- a/node-graph/gcore/src/raster.rs +++ b/node-graph/gcore/src/raster.rs @@ -12,7 +12,6 @@ pub mod color { pub use super::*; } -pub mod brush_cache; pub mod image; pub use self::image::Image; diff --git a/node-graph/gcore/src/vector/mod.rs b/node-graph/gcore/src/vector/mod.rs index e54620307..75bcc3b7d 100644 --- a/node-graph/gcore/src/vector/mod.rs +++ b/node-graph/gcore/src/vector/mod.rs @@ -1,5 +1,4 @@ pub mod algorithms; -pub mod brush_stroke; pub mod click_target; pub mod generator_nodes; pub mod misc; diff --git a/node-graph/graph-craft/Cargo.toml b/node-graph/graph-craft/Cargo.toml index fe86be714..ce27305cc 100644 --- a/node-graph/graph-craft/Cargo.toml +++ b/node-graph/graph-craft/Cargo.toml @@ -17,6 +17,7 @@ loading = ["serde_json"] dyn-any = { workspace = true } graphene-core = { workspace = true } graphene-path-bool = { workspace = true } +graphene-brush = { workspace = true } graphene-application-io = { workspace = true } graphene-svg-renderer = { workspace = true } graphene-raster-nodes = { workspace = true } diff --git a/node-graph/graph-craft/src/document/value.rs b/node-graph/graph-craft/src/document/value.rs index 25b63feb0..d3b82eae1 100644 --- a/node-graph/graph-craft/src/document/value.rs +++ b/node-graph/graph-craft/src/document/value.rs @@ -5,7 +5,8 @@ use dyn_any::DynAny; pub use dyn_any::StaticType; pub use glam::{DAffine2, DVec2, IVec2, UVec2}; use graphene_application_io::SurfaceFrame; -use graphene_core::raster::brush_cache::BrushCache; +use graphene_brush::brush_cache::BrushCache; +use graphene_brush::brush_stroke::BrushStroke; use graphene_core::raster_types::CPU; use graphene_core::transform::ReferencePoint; use graphene_core::uuid::NodeId; @@ -208,7 +209,7 @@ tagged_value! { #[serde(alias = "GradientPositions")] // TODO: Eventually remove this alias document upgrade code GradientStops(graphene_core::vector::style::GradientStops), Font(graphene_core::text::Font), - BrushStrokes(Vec), + BrushStrokes(Vec), BrushCache(BrushCache), DocumentNode(DocumentNode), Curve(graphene_raster_nodes::curve::Curve), diff --git a/node-graph/gstd/Cargo.toml b/node-graph/gstd/Cargo.toml index 147c5aad7..0c20bd8f3 100644 --- a/node-graph/gstd/Cargo.toml +++ b/node-graph/gstd/Cargo.toml @@ -33,6 +33,7 @@ graphene-math-nodes = { workspace = true } graphene-svg-renderer = { workspace = true } graphene-application-io = { workspace = true } graphene-raster-nodes = { workspace = true } +graphene-brush = { 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 e3a874cbe..d121234c3 100644 --- a/node-graph/gstd/src/lib.rs +++ b/node-graph/gstd/src/lib.rs @@ -1,11 +1,11 @@ pub mod any; -pub mod brush; pub mod http; pub mod text; #[cfg(feature = "wasm")] pub mod wasm_application_io; pub use graphene_application_io as application_io; +pub use graphene_brush as brush; pub use graphene_core::vector; pub use graphene_core::*; pub use graphene_math_nodes as math_nodes;