Extract gelement-nodes for nodes accepting both vector, raster and graphic element

This commit is contained in:
Firestar99
2025-06-30 17:18:43 +02:00
parent 217d112aae
commit fa2af78176
17 changed files with 116 additions and 40 deletions
Generated
+19
View File
@@ -2132,6 +2132,7 @@ dependencies = [
"graph-craft", "graph-craft",
"graphene-application-io", "graphene-application-io",
"graphene-core", "graphene-core",
"graphene-element-nodes",
"graphene-path-bool", "graphene-path-bool",
"graphene-svg-renderer", "graphene-svg-renderer",
"iai-callgrind", "iai-callgrind",
@@ -2213,6 +2214,23 @@ dependencies = [
"wgpu", "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]] [[package]]
name = "graphene-math-nodes" name = "graphene-math-nodes"
version = "0.1.0" version = "0.1.0"
@@ -2253,6 +2271,7 @@ dependencies = [
"graph-craft", "graph-craft",
"graphene-application-io", "graphene-application-io",
"graphene-core", "graphene-core",
"graphene-element-nodes",
"graphene-math-nodes", "graphene-math-nodes",
"graphene-path-bool", "graphene-path-bool",
"graphene-svg-renderer", "graphene-svg-renderer",
+3
View File
@@ -7,6 +7,7 @@ members = [
"node-graph/gapplication-io", "node-graph/gapplication-io",
"node-graph/gcore", "node-graph/gcore",
"node-graph/gstd", "node-graph/gstd",
"node-graph/gelement-nodes",
"node-graph/gmath-nodes", "node-graph/gmath-nodes",
"node-graph/gpath-bool", "node-graph/gpath-bool",
"node-graph/graph-craft", "node-graph/graph-craft",
@@ -26,6 +27,7 @@ default-members = [
"frontend/wasm", "frontend/wasm",
"node-graph/gcore", "node-graph/gcore",
"node-graph/gstd", "node-graph/gstd",
"node-graph/gelement-nodes",
"node-graph/gmath-nodes", "node-graph/gmath-nodes",
"node-graph/gpath-bool", "node-graph/gpath-bool",
"node-graph/graph-craft", "node-graph/graph-craft",
@@ -45,6 +47,7 @@ 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-core = { path = "node-graph/gcore" } graphene-core = { path = "node-graph/gcore" }
graphene-element-nodes = { path = "node-graph/gelement-nodes" }
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" }
graph-craft = { path = "node-graph/graph-craft" } graph-craft = { path = "node-graph/graph-craft" }
@@ -1650,7 +1650,7 @@ fn static_nodes() -> Vec<DocumentNodeDefinition> {
NodeInput::network(concrete!(DVec2), 5), NodeInput::network(concrete!(DVec2), 5),
], ],
manual_composition: Some(concrete!(Context)), 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() ..Default::default()
}, },
] ]
@@ -76,9 +76,12 @@ const REPLACEMENTS: &[(&str, &str)] = &[
("graphene_core::ops::Vector2ValueNode", "graphene_core::ops::CoordinateValueNode"), ("graphene_core::ops::Vector2ValueNode", "graphene_core::ops::CoordinateValueNode"),
("graphene_core::raster::BlackAndWhiteNode", "graphene_core::raster::adjustments::BlackAndWhiteNode"), ("graphene_core::raster::BlackAndWhiteNode", "graphene_core::raster::adjustments::BlackAndWhiteNode"),
("graphene_core::raster::BlendNode", "graphene_core::raster::adjustments::BlendNode"), ("graphene_core::raster::BlendNode", "graphene_core::raster::adjustments::BlendNode"),
("graphene_core::raster::BlendModeNode", "graphene_core::blending_nodes::BlendModeNode"), ("graphene_core::raster::BlendModeNode", "graphene_element_nodes::blending_nodes::BlendModeNode"),
("graphene_core::raster::OpacityNode", "graphene_core::blending_nodes::OpacityNode"), ("graphene_core::blending_nodes::BlendModeNode", "graphene_element_nodes::blending_nodes::BlendModeNode"),
("graphene_core::raster::BlendingNode", "graphene_core::blending_nodes::BlendingNode"), ("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::ChannelMixerNode", "graphene_core::raster::adjustments::ChannelMixerNode"),
("graphene_core::raster::adjustments::ColorOverlayNode", "graphene_core::raster::adjustments::ColorOverlayNode"), ("graphene_core::raster::adjustments::ColorOverlayNode", "graphene_core::raster::adjustments::ColorOverlayNode"),
("graphene_core::raster::ExposureNode", "graphene_core::raster::adjustments::ExposureNode"), ("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::ThresholdNode", "graphene_core::raster::adjustments::ThresholdNode"),
("graphene_core::raster::VibranceNode", "graphene_core::raster::adjustments::VibranceNode"), ("graphene_core::raster::VibranceNode", "graphene_core::raster::adjustments::VibranceNode"),
("graphene_core::text::TextGeneratorNode", "graphene_core::text::TextNode"), ("graphene_core::text::TextGeneratorNode", "graphene_core::text::TextNode"),
("graphene_core::transform::SetTransformNode", "graphene_core::transform_nodes::ReplaceTransformNode"), ("graphene_core::transform::SetTransformNode", "graphene_element_nodes::transform_nodes::ReplaceTransformNode"),
("graphene_core::transform::ReplaceTransformNode", "graphene_core::transform_nodes::ReplaceTransformNode"), ("graphene_core::transform::ReplaceTransformNode", "graphene_element_nodes::transform_nodes::ReplaceTransformNode"),
("graphene_core::transform::TransformNode", "graphene_core::transform_nodes::TransformNode"), ("graphene_core::transform::TransformNode", "graphene_element_nodes::transform_nodes::TransformNode"),
("graphene_core::transform::BoundlessFootprintNode", "graphene_core::transform_nodes::BoundlessFootprintNode"), ("graphene_core::transform_nodes::TransformNode", "graphene_element_nodes::transform_nodes::TransformNode"),
("graphene_core::transform::FreezeRealTimeNode", "graphene_core::transform_nodes::FreezeRealTimeNode"), ("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::SplinesFromPointsNode", "graphene_core::vector::SplineNode"),
("graphene_core::vector::generator_nodes::EllipseGenerator", "graphene_core::vector::generator_nodes::EllipseNode"), ("graphene_core::vector::generator_nodes::EllipseGenerator", "graphene_core::vector::generator_nodes::EllipseNode"),
("graphene_core::vector::generator_nodes::LineGenerator", "graphene_core::vector::generator_nodes::LineNode"), ("graphene_core::vector::generator_nodes::LineGenerator", "graphene_core::vector::generator_nodes::LineNode"),
-4
View File
@@ -1,9 +1,7 @@
#[macro_use] #[macro_use]
extern crate log; extern crate log;
pub mod animation;
pub mod blending; pub mod blending;
pub mod blending_nodes;
pub mod bounds; pub mod bounds;
pub mod color; pub mod color;
pub mod consts; pub mod consts;
@@ -14,7 +12,6 @@ pub mod generic;
pub mod gradient; pub mod gradient;
mod graphic_element; mod graphic_element;
pub mod instances; pub mod instances;
pub mod logic;
pub mod math; pub mod math;
pub mod memo; pub mod memo;
pub mod misc; pub mod misc;
@@ -25,7 +22,6 @@ pub mod registry;
pub mod structural; pub mod structural;
pub mod text; pub mod text;
pub mod transform; pub mod transform;
pub mod transform_nodes;
pub mod uuid; pub mod uuid;
pub mod value; pub mod value;
pub mod vector; pub mod vector;
@@ -1,5 +1,4 @@
pub mod bezpath_algorithms; pub mod bezpath_algorithms;
pub mod instance;
pub mod merge_by_distance; pub mod merge_by_distance;
pub mod offset_subpath; pub mod offset_subpath;
pub mod poisson_disk; pub mod poisson_disk;
+32
View File
@@ -0,0 +1,32 @@
[package]
name = "graphene-element-nodes"
version = "0.1.0"
edition = "2024"
description = "graphene element nodes"
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 }
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 }
@@ -1,4 +1,4 @@
use crate::{Ctx, ExtractAnimationTime, ExtractTime}; use graphene_core::context::{Ctx, ExtractAnimationTime, ExtractTime};
const DAY: f64 = 1000. * 3600. * 24.; const DAY: f64 = 1000. * 3600. * 24.;
@@ -1,8 +1,10 @@
use crate::raster::Image; use graphene_core::GraphicGroupTable;
use crate::raster_types::{CPU, RasterDataTable}; use graphene_core::blending::BlendMode;
use crate::registry::types::Percentage; use graphene_core::color::Color;
use crate::vector::VectorDataTable; use graphene_core::context::Ctx;
use crate::{BlendMode, Color, Ctx, GraphicElement, GraphicGroupTable}; use graphene_core::raster_types::{CPU, RasterDataTable};
use graphene_core::registry::types::Percentage;
use graphene_core::vector::VectorDataTable;
pub(super) trait MultiplyAlpha { pub(super) trait MultiplyAlpha {
fn multiply_alpha(&mut self, factor: f64); fn multiply_alpha(&mut self, factor: f64);
@@ -27,10 +29,7 @@ impl MultiplyAlpha for GraphicGroupTable {
} }
} }
} }
impl MultiplyAlpha for RasterDataTable<CPU> impl MultiplyAlpha for RasterDataTable<CPU> {
where
GraphicElement: From<Image<Color>>,
{
fn multiply_alpha(&mut self, factor: f64) { fn multiply_alpha(&mut self, factor: f64) {
for instance in self.instance_mut_iter() { for instance in self.instance_mut_iter() {
instance.alpha_blending.opacity *= factor as f32; instance.alpha_blending.opacity *= factor as f32;
@@ -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 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))] #[node_macro::node(name("Instance on Points"), category("Instancing"), path(graphene_core::vector))]
async fn instance_on_points<T: Into<GraphicElement> + Default + Send + Clone + 'static>( async fn instance_on_points<T: Into<GraphicElement> + Default + Send + Clone + 'static>(
@@ -98,11 +101,11 @@ async fn instance_index(ctx: impl Ctx + ExtractIndex) -> f64 {
#[cfg(test)] #[cfg(test)]
mod test { mod test {
use super::*; use super::*;
use crate::Node;
use crate::extract_xy::{ExtractXyNode, XY};
use crate::vector::VectorData;
use bezier_rs::Subpath; use bezier_rs::Subpath;
use glam::DVec2; use glam::DVec2;
use graphene_core::Node;
use graphene_core::extract_xy::{ExtractXyNode, XY};
use graphene_core::vector::VectorData;
use std::pin::Pin; use std::pin::Pin;
#[derive(Clone)] #[derive(Clone)]
@@ -119,7 +122,7 @@ mod test {
#[tokio::test] #[tokio::test]
async fn instance_on_points_test() { async fn instance_on_points_test() {
let owned = OwnedContextImpl::default().into_context(); let owned = OwnedContextImpl::default().into_context();
let rect = crate::vector::generator_nodes::RectangleNode::new( let rect = graphene_core::vector::generator_nodes::RectangleNode::new(
FutureWrapperNode(()), FutureWrapperNode(()),
ExtractXyNode::new(InstancePositionNode {}, FutureWrapperNode(XY::Y)), ExtractXyNode::new(InstancePositionNode {}, FutureWrapperNode(XY::Y)),
FutureWrapperNode(2_f64), FutureWrapperNode(2_f64),
+5
View File
@@ -0,0 +1,5 @@
pub mod animation;
pub mod blending_nodes;
pub mod instance;
pub mod logic;
pub mod transform_nodes;
@@ -1,6 +1,7 @@
use crate::vector::VectorDataTable;
use crate::{Color, Context, Ctx};
use glam::{DAffine2, DVec2}; 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"))] #[node_macro::node(category("Debug"), name("Log to Console"))]
fn log_to_console<T: std::fmt::Debug>(_: impl Ctx, #[implementations(String, bool, f64, u32, u64, DVec2, VectorDataTable, DAffine2, Color, Option<Color>)] value: T) -> T { fn log_to_console<T: std::fmt::Debug>(_: impl Ctx, #[implementations(String, bool, f64, u32, u64, DVec2, VectorDataTable, DAffine2, Color, Option<Color>)] value: T) -> T {
@@ -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 core::f64;
use glam::{DAffine2, DVec2}; 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(""))] #[node_macro::node(category(""))]
async fn transform<T: 'n + 'static>( async fn transform<T: 'n + 'static>(
+1
View File
@@ -16,6 +16,7 @@ loading = ["serde_json"]
# Local dependencies # Local dependencies
dyn-any = { workspace = true } dyn-any = { workspace = true }
graphene-core = { workspace = true } graphene-core = { workspace = true }
graphene-element-nodes = { workspace = true }
graphene-path-bool = { workspace = true } graphene-path-bool = { workspace = true }
graphene-application-io = { workspace = true } graphene-application-io = { workspace = true }
graphene-svg-renderer = { workspace = true } graphene-svg-renderer = { workspace = true }
+1 -1
View File
@@ -224,7 +224,7 @@ tagged_value! {
XY(graphene_core::extract_xy::XY), XY(graphene_core::extract_xy::XY),
RedGreenBlue(graphene_core::raster::RedGreenBlue), RedGreenBlue(graphene_core::raster::RedGreenBlue),
RedGreenBlueAlpha(graphene_core::raster::RedGreenBlueAlpha), RedGreenBlueAlpha(graphene_core::raster::RedGreenBlueAlpha),
RealTimeMode(graphene_core::animation::RealTimeMode), RealTimeMode(graphene_element_nodes::animation::RealTimeMode),
NoiseType(graphene_core::raster::NoiseType), NoiseType(graphene_core::raster::NoiseType),
FractalType(graphene_core::raster::FractalType), FractalType(graphene_core::raster::FractalType),
CellularDistanceFunction(graphene_core::raster::CellularDistanceFunction), CellularDistanceFunction(graphene_core::raster::CellularDistanceFunction),
+1
View File
@@ -32,6 +32,7 @@ graphene-path-bool = { workspace = true }
graphene-math-nodes = { workspace = true } 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-element-nodes = { workspace = true }
# Workspace dependencies # Workspace dependencies
fastnoise-lite = { workspace = true } fastnoise-lite = { workspace = true }
+1
View File
@@ -12,6 +12,7 @@ pub mod wasm_application_io;
pub use graphene_application_io as application_io; pub use graphene_application_io as application_io;
pub use graphene_core::vector; pub use graphene_core::vector;
pub use graphene_core::*; pub use graphene_core::*;
pub use graphene_element_nodes::animation;
pub use graphene_math_nodes as math_nodes; pub use graphene_math_nodes as math_nodes;
pub use graphene_path_bool as path_bool; pub use graphene_path_bool as path_bool;