mirror of
https://github.com/GraphiteEditor/Graphite.git
synced 2025-07-07 15:55:00 +00:00
Extract gbrush
(#2784)
This commit is contained in:
parent
602d7e8bd1
commit
a182a7347e
18 changed files with 85 additions and 30 deletions
15
Cargo.lock
generated
15
Cargo.lock
generated
|
@ -2195,6 +2195,7 @@ dependencies = [
|
||||||
"glam",
|
"glam",
|
||||||
"graph-craft",
|
"graph-craft",
|
||||||
"graphene-application-io",
|
"graphene-application-io",
|
||||||
|
"graphene-brush",
|
||||||
"graphene-core",
|
"graphene-core",
|
||||||
"graphene-path-bool",
|
"graphene-path-bool",
|
||||||
"graphene-raster-nodes",
|
"graphene-raster-nodes",
|
||||||
|
@ -2229,6 +2230,19 @@ dependencies = [
|
||||||
"wgpu",
|
"wgpu",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "graphene-brush"
|
||||||
|
version = "0.1.0"
|
||||||
|
dependencies = [
|
||||||
|
"dyn-any",
|
||||||
|
"glam",
|
||||||
|
"graphene-core",
|
||||||
|
"graphene-raster-nodes",
|
||||||
|
"node-macro",
|
||||||
|
"serde",
|
||||||
|
"tokio",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "graphene-cli"
|
name = "graphene-cli"
|
||||||
version = "0.1.0"
|
version = "0.1.0"
|
||||||
|
@ -2339,6 +2353,7 @@ dependencies = [
|
||||||
"glam",
|
"glam",
|
||||||
"graph-craft",
|
"graph-craft",
|
||||||
"graphene-application-io",
|
"graphene-application-io",
|
||||||
|
"graphene-brush",
|
||||||
"graphene-core",
|
"graphene-core",
|
||||||
"graphene-math-nodes",
|
"graphene-math-nodes",
|
||||||
"graphene-path-bool",
|
"graphene-path-bool",
|
||||||
|
|
|
@ -5,6 +5,7 @@ members = [
|
||||||
"frontend/wasm",
|
"frontend/wasm",
|
||||||
"frontend/src-tauri",
|
"frontend/src-tauri",
|
||||||
"node-graph/gapplication-io",
|
"node-graph/gapplication-io",
|
||||||
|
"node-graph/gbrush",
|
||||||
"node-graph/gcore",
|
"node-graph/gcore",
|
||||||
"node-graph/gstd",
|
"node-graph/gstd",
|
||||||
"node-graph/gmath-nodes",
|
"node-graph/gmath-nodes",
|
||||||
|
@ -25,6 +26,7 @@ members = [
|
||||||
default-members = [
|
default-members = [
|
||||||
"editor",
|
"editor",
|
||||||
"frontend/wasm",
|
"frontend/wasm",
|
||||||
|
"node-graph/gbrush",
|
||||||
"node-graph/gcore",
|
"node-graph/gcore",
|
||||||
"node-graph/gstd",
|
"node-graph/gstd",
|
||||||
"node-graph/gmath-nodes",
|
"node-graph/gmath-nodes",
|
||||||
|
@ -46,6 +48,7 @@ preprocessor = { path = "node-graph/preprocessor"}
|
||||||
math-parser = { path = "libraries/math-parser" }
|
math-parser = { path = "libraries/math-parser" }
|
||||||
path-bool = { path = "libraries/path-bool" }
|
path-bool = { path = "libraries/path-bool" }
|
||||||
graphene-application-io = { path = "node-graph/gapplication-io" }
|
graphene-application-io = { path = "node-graph/gapplication-io" }
|
||||||
|
graphene-brush = { path = "node-graph/gbrush" }
|
||||||
graphene-core = { path = "node-graph/gcore" }
|
graphene-core = { path = "node-graph/gcore" }
|
||||||
graphene-math-nodes = { path = "node-graph/gmath-nodes" }
|
graphene-math-nodes = { path = "node-graph/gmath-nodes" }
|
||||||
graphene-path-bool = { path = "node-graph/gpath-bool" }
|
graphene-path-bool = { path = "node-graph/gpath-bool" }
|
||||||
|
|
|
@ -6,12 +6,12 @@ use bezier_rs::Subpath;
|
||||||
use glam::{DAffine2, DVec2, IVec2};
|
use glam::{DAffine2, DVec2, IVec2};
|
||||||
use graph_craft::document::NodeId;
|
use graph_craft::document::NodeId;
|
||||||
use graphene_std::Artboard;
|
use graphene_std::Artboard;
|
||||||
|
use graphene_std::brush::brush_stroke::BrushStroke;
|
||||||
use graphene_std::raster::BlendMode;
|
use graphene_std::raster::BlendMode;
|
||||||
use graphene_std::raster_types::{CPU, RasterDataTable};
|
use graphene_std::raster_types::{CPU, RasterDataTable};
|
||||||
use graphene_std::text::{Font, TypesettingConfig};
|
use graphene_std::text::{Font, TypesettingConfig};
|
||||||
use graphene_std::vector::PointId;
|
use graphene_std::vector::PointId;
|
||||||
use graphene_std::vector::VectorModificationType;
|
use graphene_std::vector::VectorModificationType;
|
||||||
use graphene_std::vector::brush_stroke::BrushStroke;
|
|
||||||
use graphene_std::vector::style::{Fill, Stroke};
|
use graphene_std::vector::style::{Fill, Stroke};
|
||||||
|
|
||||||
#[impl_message(Message, DocumentMessage, GraphOperation)]
|
#[impl_message(Message, DocumentMessage, GraphOperation)]
|
||||||
|
|
|
@ -9,10 +9,10 @@ use graph_craft::concrete;
|
||||||
use graph_craft::document::value::TaggedValue;
|
use graph_craft::document::value::TaggedValue;
|
||||||
use graph_craft::document::{NodeId, NodeInput};
|
use graph_craft::document::{NodeId, NodeInput};
|
||||||
use graphene_std::Artboard;
|
use graphene_std::Artboard;
|
||||||
|
use graphene_std::brush::brush_stroke::BrushStroke;
|
||||||
use graphene_std::raster::BlendMode;
|
use graphene_std::raster::BlendMode;
|
||||||
use graphene_std::raster_types::{CPU, RasterDataTable};
|
use graphene_std::raster_types::{CPU, RasterDataTable};
|
||||||
use graphene_std::text::{Font, TypesettingConfig};
|
use graphene_std::text::{Font, TypesettingConfig};
|
||||||
use graphene_std::vector::brush_stroke::BrushStroke;
|
|
||||||
use graphene_std::vector::style::{Fill, Stroke};
|
use graphene_std::vector::style::{Fill, Stroke};
|
||||||
use graphene_std::vector::{PointId, VectorModificationType};
|
use graphene_std::vector::{PointId, VectorModificationType};
|
||||||
use graphene_std::vector::{VectorData, VectorDataTable};
|
use graphene_std::vector::{VectorData, VectorDataTable};
|
||||||
|
|
|
@ -16,8 +16,8 @@ use graph_craft::ProtoNodeIdentifier;
|
||||||
use graph_craft::concrete;
|
use graph_craft::concrete;
|
||||||
use graph_craft::document::value::*;
|
use graph_craft::document::value::*;
|
||||||
use graph_craft::document::*;
|
use graph_craft::document::*;
|
||||||
|
use graphene_std::brush::brush_cache::BrushCache;
|
||||||
use graphene_std::extract_xy::XY;
|
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::{CellularDistanceFunction, CellularReturnType, Color, DomainWarpType, FractalType, NoiseType, RedGreenBlueAlpha};
|
||||||
use graphene_std::raster_types::{CPU, RasterDataTable};
|
use graphene_std::raster_types::{CPU, RasterDataTable};
|
||||||
use graphene_std::text::{Font, TypesettingConfig};
|
use graphene_std::text::{Font, TypesettingConfig};
|
||||||
|
@ -1032,7 +1032,7 @@ fn static_nodes() -> Vec<DocumentNodeDefinition> {
|
||||||
nodes: vec![DocumentNode {
|
nodes: vec![DocumentNode {
|
||||||
inputs: vec![
|
inputs: vec![
|
||||||
NodeInput::network(concrete!(RasterDataTable<CPU>), 0),
|
NodeInput::network(concrete!(RasterDataTable<CPU>), 0),
|
||||||
NodeInput::network(concrete!(Vec<graphene_std::vector::brush_stroke::BrushStroke>), 1),
|
NodeInput::network(concrete!(Vec<brush::brush_stroke::BrushStroke>), 1),
|
||||||
NodeInput::network(concrete!(BrushCache), 2),
|
NodeInput::network(concrete!(BrushCache), 2),
|
||||||
],
|
],
|
||||||
manual_composition: Some(concrete!(Context)),
|
manual_composition: Some(concrete!(Context)),
|
||||||
|
|
|
@ -147,6 +147,10 @@ const REPLACEMENTS: &[(&str, &str)] = &[
|
||||||
("graphene_std::raster::MaskImageNode", "graphene_std::raster::MaskNode"),
|
("graphene_std::raster::MaskImageNode", "graphene_std::raster::MaskNode"),
|
||||||
("graphene_core::vector::FlattenVectorElementsNode", "graphene_core::vector::FlattenPathNode"),
|
("graphene_core::vector::FlattenVectorElementsNode", "graphene_core::vector::FlattenPathNode"),
|
||||||
("graphene_std::vector::BooleanOperationNode", "graphene_path_bool::BooleanOperationNode"),
|
("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 {
|
pub fn document_migration_string_preprocessing(document_serialized_content: String) -> String {
|
||||||
|
|
|
@ -8,8 +8,8 @@ use crate::messages::tool::common_functionality::color_selector::{ToolColorOptio
|
||||||
use graph_craft::document::NodeId;
|
use graph_craft::document::NodeId;
|
||||||
use graph_craft::document::value::TaggedValue;
|
use graph_craft::document::value::TaggedValue;
|
||||||
use graphene_std::Color;
|
use graphene_std::Color;
|
||||||
|
use graphene_std::brush::brush_stroke::{BrushInputSample, BrushStroke, BrushStyle};
|
||||||
use graphene_std::raster::BlendMode;
|
use graphene_std::raster::BlendMode;
|
||||||
use graphene_std::vector::brush_stroke::{BrushInputSample, BrushStroke, BrushStyle};
|
|
||||||
|
|
||||||
const BRUSH_MAX_SIZE: f64 = 5000.;
|
const BRUSH_MAX_SIZE: f64 = 5000.;
|
||||||
|
|
||||||
|
|
28
node-graph/gbrush/Cargo.toml
Normal file
28
node-graph/gbrush/Cargo.toml
Normal file
|
@ -0,0 +1,28 @@
|
||||||
|
[package]
|
||||||
|
name = "graphene-brush"
|
||||||
|
version = "0.1.0"
|
||||||
|
edition = "2024"
|
||||||
|
description = "graphene brush"
|
||||||
|
authors = ["Graphite Authors <contact@graphite.rs>"]
|
||||||
|
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 }
|
|
@ -1,17 +1,19 @@
|
||||||
|
use crate::brush_cache::BrushCache;
|
||||||
|
use crate::brush_stroke::{BrushStroke, BrushStyle};
|
||||||
use glam::{DAffine2, DVec2};
|
use glam::{DAffine2, DVec2};
|
||||||
use graph_craft::generic::FnNode;
|
use graphene_core::blending::BlendMode;
|
||||||
use graph_craft::proto::FutureWrapperNode;
|
|
||||||
use graphene_core::bounds::BoundingBox;
|
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::instances::Instance;
|
||||||
use graphene_core::math::bbox::{AxisAlignedBbox, Bbox};
|
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::image::Image;
|
||||||
use graphene_core::raster::{Alpha, BitmapMut, BlendMode, Color, Pixel, Sample};
|
|
||||||
use graphene_core::raster_types::{CPU, Raster, RasterDataTable};
|
use graphene_core::raster_types::{CPU, Raster, RasterDataTable};
|
||||||
|
use graphene_core::registry::FutureWrapperNode;
|
||||||
use graphene_core::transform::Transform;
|
use graphene_core::transform::Transform;
|
||||||
use graphene_core::value::ClonedNode;
|
use graphene_core::value::ClonedNode;
|
||||||
use graphene_core::vector::brush_stroke::{BrushStroke, BrushStyle};
|
use graphene_core::{Ctx, Node};
|
||||||
use graphene_core::{Ctx, GraphicElement, Node};
|
|
||||||
use graphene_raster_nodes::adjustments::blend_colors;
|
use graphene_raster_nodes::adjustments::blend_colors;
|
||||||
use graphene_raster_nodes::std_nodes::{empty_image, extend_image_to_bounds};
|
use graphene_raster_nodes::std_nodes::{empty_image, extend_image_to_bounds};
|
||||||
|
|
||||||
|
@ -50,7 +52,7 @@ impl<P: Pixel + Alpha> Sample for BrushStampGenerator<P> {
|
||||||
return None;
|
return None;
|
||||||
};
|
};
|
||||||
|
|
||||||
use graphene_core::raster::Channel;
|
use graphene_core::color::Channel;
|
||||||
Some(self.color.multiplied_alpha(P::AlphaChannel::from_linear(result)))
|
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<BlendFn>(mut target: RasterDataTable<CPU>, texture: Raster<CPU>, positions: Vec<DVec2>, blend_mode: BlendFn) -> RasterDataTable<CPU>
|
fn blit<BlendFn>(mut target: RasterDataTable<CPU>, texture: Raster<CPU>, positions: Vec<DVec2>, blend_mode: BlendFn) -> RasterDataTable<CPU>
|
||||||
where
|
where
|
||||||
BlendFn: for<'any_input> Node<'any_input, (Color, Color), Output = Color>,
|
BlendFn: for<'any_input> Node<'any_input, (Color, Color), Output = Color>,
|
||||||
GraphicElement: From<Raster<CPU>>,
|
|
||||||
{
|
{
|
||||||
if positions.is_empty() {
|
if positions.is_empty() {
|
||||||
return target;
|
return target;
|
||||||
|
@ -392,7 +393,7 @@ mod test {
|
||||||
(),
|
(),
|
||||||
RasterDataTable::<CPU>::new(Raster::new_cpu(Image::<Color>::default())),
|
RasterDataTable::<CPU>::new(Raster::new_cpu(Image::<Color>::default())),
|
||||||
vec![BrushStroke {
|
vec![BrushStroke {
|
||||||
trace: vec![crate::vector::brush_stroke::BrushInputSample { position: DVec2::ZERO }],
|
trace: vec![crate::brush_stroke::BrushInputSample { position: DVec2::ZERO }],
|
||||||
style: BrushStyle {
|
style: BrushStyle {
|
||||||
color: Color::BLACK,
|
color: Color::BLACK,
|
||||||
diameter: 20.,
|
diameter: 20.,
|
|
@ -1,9 +1,9 @@
|
||||||
use crate::instances::Instance;
|
use crate::brush_stroke::BrushStroke;
|
||||||
use crate::raster_types::CPU;
|
use crate::brush_stroke::BrushStyle;
|
||||||
use crate::raster_types::Raster;
|
|
||||||
use crate::vector::brush_stroke::BrushStroke;
|
|
||||||
use crate::vector::brush_stroke::BrushStyle;
|
|
||||||
use dyn_any::DynAny;
|
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::collections::HashMap;
|
||||||
use std::hash::Hash;
|
use std::hash::Hash;
|
||||||
use std::sync::Arc;
|
use std::sync::Arc;
|
||||||
|
@ -15,11 +15,11 @@ struct BrushCacheImpl {
|
||||||
prev_input: Vec<BrushStroke>,
|
prev_input: Vec<BrushStroke>,
|
||||||
|
|
||||||
// The strokes that have been fully processed and blended into the background.
|
// 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<Raster<CPU>>,
|
background: Instance<Raster<CPU>>,
|
||||||
#[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<Raster<CPU>>,
|
blended_image: Instance<Raster<CPU>>,
|
||||||
#[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<Raster<CPU>>,
|
last_stroke_texture: Instance<Raster<CPU>>,
|
||||||
|
|
||||||
// A cache for brush textures.
|
// A cache for brush textures.
|
|
@ -1,8 +1,8 @@
|
||||||
use crate::Color;
|
|
||||||
use crate::math::bbox::AxisAlignedBbox;
|
|
||||||
use crate::raster::BlendMode;
|
|
||||||
use dyn_any::DynAny;
|
use dyn_any::DynAny;
|
||||||
use glam::DVec2;
|
use glam::DVec2;
|
||||||
|
use graphene_core::blending::BlendMode;
|
||||||
|
use graphene_core::color::Color;
|
||||||
|
use graphene_core::math::bbox::AxisAlignedBbox;
|
||||||
use std::hash::{Hash, Hasher};
|
use std::hash::{Hash, Hasher};
|
||||||
|
|
||||||
/// The style of a brush.
|
/// The style of a brush.
|
3
node-graph/gbrush/src/lib.rs
Normal file
3
node-graph/gbrush/src/lib.rs
Normal file
|
@ -0,0 +1,3 @@
|
||||||
|
pub mod brush;
|
||||||
|
pub mod brush_cache;
|
||||||
|
pub mod brush_stroke;
|
|
@ -12,7 +12,6 @@ pub mod color {
|
||||||
pub use super::*;
|
pub use super::*;
|
||||||
}
|
}
|
||||||
|
|
||||||
pub mod brush_cache;
|
|
||||||
pub mod image;
|
pub mod image;
|
||||||
|
|
||||||
pub use self::image::Image;
|
pub use self::image::Image;
|
||||||
|
|
|
@ -1,5 +1,4 @@
|
||||||
pub mod algorithms;
|
pub mod algorithms;
|
||||||
pub mod brush_stroke;
|
|
||||||
pub mod click_target;
|
pub mod click_target;
|
||||||
pub mod generator_nodes;
|
pub mod generator_nodes;
|
||||||
pub mod misc;
|
pub mod misc;
|
||||||
|
|
|
@ -17,6 +17,7 @@ loading = ["serde_json"]
|
||||||
dyn-any = { workspace = true }
|
dyn-any = { workspace = true }
|
||||||
graphene-core = { workspace = true }
|
graphene-core = { workspace = true }
|
||||||
graphene-path-bool = { workspace = true }
|
graphene-path-bool = { workspace = true }
|
||||||
|
graphene-brush = { workspace = true }
|
||||||
graphene-application-io = { workspace = true }
|
graphene-application-io = { workspace = true }
|
||||||
graphene-svg-renderer = { workspace = true }
|
graphene-svg-renderer = { workspace = true }
|
||||||
graphene-raster-nodes = { workspace = true }
|
graphene-raster-nodes = { workspace = true }
|
||||||
|
|
|
@ -5,7 +5,8 @@ use dyn_any::DynAny;
|
||||||
pub use dyn_any::StaticType;
|
pub use dyn_any::StaticType;
|
||||||
pub use glam::{DAffine2, DVec2, IVec2, UVec2};
|
pub use glam::{DAffine2, DVec2, IVec2, UVec2};
|
||||||
use graphene_application_io::SurfaceFrame;
|
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::raster_types::CPU;
|
||||||
use graphene_core::transform::ReferencePoint;
|
use graphene_core::transform::ReferencePoint;
|
||||||
use graphene_core::uuid::NodeId;
|
use graphene_core::uuid::NodeId;
|
||||||
|
@ -208,7 +209,7 @@ tagged_value! {
|
||||||
#[serde(alias = "GradientPositions")] // TODO: Eventually remove this alias document upgrade code
|
#[serde(alias = "GradientPositions")] // TODO: Eventually remove this alias document upgrade code
|
||||||
GradientStops(graphene_core::vector::style::GradientStops),
|
GradientStops(graphene_core::vector::style::GradientStops),
|
||||||
Font(graphene_core::text::Font),
|
Font(graphene_core::text::Font),
|
||||||
BrushStrokes(Vec<graphene_core::vector::brush_stroke::BrushStroke>),
|
BrushStrokes(Vec<BrushStroke>),
|
||||||
BrushCache(BrushCache),
|
BrushCache(BrushCache),
|
||||||
DocumentNode(DocumentNode),
|
DocumentNode(DocumentNode),
|
||||||
Curve(graphene_raster_nodes::curve::Curve),
|
Curve(graphene_raster_nodes::curve::Curve),
|
||||||
|
|
|
@ -33,6 +33,7 @@ graphene-math-nodes = { workspace = true }
|
||||||
graphene-svg-renderer = { workspace = true }
|
graphene-svg-renderer = { workspace = true }
|
||||||
graphene-application-io = { workspace = true }
|
graphene-application-io = { workspace = true }
|
||||||
graphene-raster-nodes = { workspace = true }
|
graphene-raster-nodes = { workspace = true }
|
||||||
|
graphene-brush = { workspace = true }
|
||||||
|
|
||||||
# Workspace dependencies
|
# Workspace dependencies
|
||||||
fastnoise-lite = { workspace = true }
|
fastnoise-lite = { workspace = true }
|
||||||
|
|
|
@ -1,11 +1,11 @@
|
||||||
pub mod any;
|
pub mod any;
|
||||||
pub mod brush;
|
|
||||||
pub mod http;
|
pub mod http;
|
||||||
pub mod text;
|
pub mod text;
|
||||||
#[cfg(feature = "wasm")]
|
#[cfg(feature = "wasm")]
|
||||||
pub mod wasm_application_io;
|
pub mod wasm_application_io;
|
||||||
|
|
||||||
pub use graphene_application_io as 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::vector;
|
||||||
pub use graphene_core::*;
|
pub use graphene_core::*;
|
||||||
pub use graphene_math_nodes as math_nodes;
|
pub use graphene_math_nodes as math_nodes;
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue