diff --git a/editor/src/messages/portfolio/document/node_graph/node_graph_message_handler.rs b/editor/src/messages/portfolio/document/node_graph/node_graph_message_handler.rs index 1f07ca0d..5ee946c9 100644 --- a/editor/src/messages/portfolio/document/node_graph/node_graph_message_handler.rs +++ b/editor/src/messages/portfolio/document/node_graph/node_graph_message_handler.rs @@ -1,5 +1,6 @@ use crate::messages::layout::utility_types::layout_widget::LayoutGroup; use crate::messages::prelude::*; +use graph_craft::document::value::TaggedValue; use graph_craft::document::{DocumentNode, DocumentNodeImplementation, DocumentNodeMetadata, NodeId, NodeInput, NodeNetwork}; use graphene::document::Document; use graphene::layers::layer_info::LayerDataType; @@ -23,9 +24,25 @@ pub enum FrontendGraphDataType { Number, #[serde(rename = "boolean")] Boolean, + #[serde(rename = "string")] + String, #[serde(rename = "vec2")] Vector, } +impl FrontendGraphDataType { + pub const fn with_tagged_value(value: &TaggedValue) -> Self { + match value { + TaggedValue::None => Self::General, + TaggedValue::String(_) => Self::String, + TaggedValue::F32(_) | TaggedValue::F64(_) | TaggedValue::U32(_) => Self::Number, + TaggedValue::Bool(_) => Self::Boolean, + TaggedValue::DVec2(_) => Self::Vector, + TaggedValue::Image(_) => Self::Raster, + TaggedValue::Color(_) => Self::Color, + TaggedValue::RcSubpath(_) | TaggedValue::Subpath(_) => Self::Subpath, + } + } +} #[derive(Clone, Debug, Eq, PartialEq, serde::Serialize, serde::Deserialize)] pub struct NodeGraphInput { 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 65e148dd..56bbda41 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 @@ -18,12 +18,10 @@ pub struct DocumentInputType { } impl DocumentInputType { - pub const fn none() -> Self { - Self { - name: "None", - data_type: FrontendGraphDataType::General, - default: NodeInput::value(TaggedValue::None, false), - } + pub const fn new(name: &'static str, tagged_value: TaggedValue, exposed: bool) -> Self { + let data_type = FrontendGraphDataType::with_tagged_value(&tagged_value); + let default = NodeInput::value(tagged_value, exposed); + Self { name, data_type, default } } } @@ -85,11 +83,7 @@ static DOCUMENT_NODE_TYPES: &[DocumentNodeType] = &[ name: "Grayscale", category: "Image Adjustments", identifier: NodeIdentifier::new("graphene_std::raster::GrayscaleNode", &[]), - inputs: &[DocumentInputType { - name: "Image", - data_type: FrontendGraphDataType::Raster, - default: NodeInput::value(TaggedValue::Image(Image::empty()), true), - }], + inputs: &[DocumentInputType::new("Image", TaggedValue::Image(Image::empty()), true)], outputs: &[FrontendGraphDataType::Raster], properties: node_properties::no_properties, }, @@ -97,11 +91,7 @@ static DOCUMENT_NODE_TYPES: &[DocumentNodeType] = &[ name: "Invert RGB", category: "Image Adjustments", identifier: NodeIdentifier::new("graphene_std::raster::InvertRGBNode", &[]), - inputs: &[DocumentInputType { - name: "Image", - data_type: FrontendGraphDataType::Raster, - default: NodeInput::value(TaggedValue::Image(Image::empty()), true), - }], + inputs: &[DocumentInputType::new("Image", TaggedValue::Image(Image::empty()), true)], outputs: &[FrontendGraphDataType::Raster], properties: node_properties::no_properties, }, @@ -110,26 +100,10 @@ static DOCUMENT_NODE_TYPES: &[DocumentNodeType] = &[ category: "Image Adjustments", identifier: NodeIdentifier::new("graphene_std::raster::HueSaturationNode", &[Type::Concrete(Cow::Borrowed("&TypeErasedNode"))]), inputs: &[ - DocumentInputType { - name: "Image", - data_type: FrontendGraphDataType::Raster, - default: NodeInput::value(TaggedValue::Image(Image::empty()), true), - }, - DocumentInputType { - name: "Hue Shift", - data_type: FrontendGraphDataType::Number, - default: NodeInput::value(TaggedValue::F64(0.), false), - }, - DocumentInputType { - name: "Saturation Shift", - data_type: FrontendGraphDataType::Number, - default: NodeInput::value(TaggedValue::F64(0.), false), - }, - DocumentInputType { - name: "Lightness Shift", - data_type: FrontendGraphDataType::Number, - default: NodeInput::value(TaggedValue::F64(0.), false), - }, + DocumentInputType::new("Image", TaggedValue::Image(Image::empty()), true), + DocumentInputType::new("Hue Shift", TaggedValue::F64(0.), false), + DocumentInputType::new("Saturation Shift", TaggedValue::F64(0.), false), + DocumentInputType::new("Lightness Shift", TaggedValue::F64(0.), false), ], outputs: &[FrontendGraphDataType::Raster], properties: node_properties::adjust_hsl_properties, @@ -139,21 +113,9 @@ static DOCUMENT_NODE_TYPES: &[DocumentNodeType] = &[ category: "Image Adjustments", identifier: NodeIdentifier::new("graphene_std::raster::BrightnessContrastNode", &[Type::Concrete(Cow::Borrowed("&TypeErasedNode"))]), inputs: &[ - DocumentInputType { - name: "Image", - data_type: FrontendGraphDataType::Raster, - default: NodeInput::value(TaggedValue::Image(Image::empty()), true), - }, - DocumentInputType { - name: "Brightness", - data_type: FrontendGraphDataType::Number, - default: NodeInput::value(TaggedValue::F64(0.), false), - }, - DocumentInputType { - name: "Contrast", - data_type: FrontendGraphDataType::Number, - default: NodeInput::value(TaggedValue::F64(0.), false), - }, + DocumentInputType::new("Image", TaggedValue::Image(Image::empty()), true), + DocumentInputType::new("Brightness", TaggedValue::F64(0.), false), + DocumentInputType::new("Contrast", TaggedValue::F64(0.), false), ], outputs: &[FrontendGraphDataType::Raster], properties: node_properties::brighten_image_properties, @@ -163,16 +125,8 @@ static DOCUMENT_NODE_TYPES: &[DocumentNodeType] = &[ category: "Image Adjustments", identifier: NodeIdentifier::new("graphene_std::raster::GammaNode", &[Type::Concrete(Cow::Borrowed("&TypeErasedNode"))]), inputs: &[ - DocumentInputType { - name: "Image", - data_type: FrontendGraphDataType::Raster, - default: NodeInput::value(TaggedValue::Image(Image::empty()), true), - }, - DocumentInputType { - name: "Gamma", - data_type: FrontendGraphDataType::Number, - default: NodeInput::value(TaggedValue::F64(1.), false), - }, + DocumentInputType::new("Image", TaggedValue::Image(Image::empty()), true), + DocumentInputType::new("Gamma", TaggedValue::F64(1.), false), ], outputs: &[FrontendGraphDataType::Raster], properties: node_properties::adjust_gamma_properties, @@ -182,16 +136,8 @@ static DOCUMENT_NODE_TYPES: &[DocumentNodeType] = &[ category: "Image Adjustments", identifier: NodeIdentifier::new("graphene_std::raster::OpacityNode", &[Type::Concrete(Cow::Borrowed("&TypeErasedNode"))]), inputs: &[ - DocumentInputType { - name: "Image", - data_type: FrontendGraphDataType::Raster, - default: NodeInput::value(TaggedValue::Image(Image::empty()), true), - }, - DocumentInputType { - name: "Factor", - data_type: FrontendGraphDataType::Number, - default: NodeInput::value(TaggedValue::F64(1.), false), - }, + DocumentInputType::new("Image", TaggedValue::Image(Image::empty()), true), + DocumentInputType::new("Factor", TaggedValue::F64(1.), false), ], outputs: &[FrontendGraphDataType::Raster], properties: node_properties::multiply_opacity, @@ -201,16 +147,8 @@ static DOCUMENT_NODE_TYPES: &[DocumentNodeType] = &[ category: "Image Adjustments", identifier: NodeIdentifier::new("graphene_std::raster::PosterizeNode", &[Type::Concrete(Cow::Borrowed("&TypeErasedNode"))]), inputs: &[ - DocumentInputType { - name: "Image", - data_type: FrontendGraphDataType::Raster, - default: NodeInput::value(TaggedValue::Image(Image::empty()), true), - }, - DocumentInputType { - name: "Value", - data_type: FrontendGraphDataType::Number, - default: NodeInput::value(TaggedValue::F64(5.), false), - }, + DocumentInputType::new("Image", TaggedValue::Image(Image::empty()), true), + DocumentInputType::new("Value", TaggedValue::F64(5.), false), ], outputs: &[FrontendGraphDataType::Raster], properties: node_properties::posterize_properties, @@ -220,16 +158,8 @@ static DOCUMENT_NODE_TYPES: &[DocumentNodeType] = &[ category: "Image Adjustments", identifier: NodeIdentifier::new("graphene_std::raster::ExposureNode", &[Type::Concrete(Cow::Borrowed("&TypeErasedNode"))]), inputs: &[ - DocumentInputType { - name: "Image", - data_type: FrontendGraphDataType::Raster, - default: NodeInput::value(TaggedValue::Image(Image::empty()), true), - }, - DocumentInputType { - name: "Value", - data_type: FrontendGraphDataType::Number, - default: NodeInput::value(TaggedValue::F64(0.), false), - }, + DocumentInputType::new("Image", TaggedValue::Image(Image::empty()), true), + DocumentInputType::new("Value", TaggedValue::F64(0.), false), ], outputs: &[FrontendGraphDataType::Raster], properties: node_properties::exposure_properties, @@ -239,16 +169,8 @@ static DOCUMENT_NODE_TYPES: &[DocumentNodeType] = &[ category: "Math", identifier: NodeIdentifier::new("graphene_core::ops::AddNode", &[Type::Concrete(Cow::Borrowed("&TypeErasedNode"))]), inputs: &[ - DocumentInputType { - name: "Input", - data_type: FrontendGraphDataType::Number, - default: NodeInput::value(TaggedValue::F64(0.), true), - }, - DocumentInputType { - name: "Addend", - data_type: FrontendGraphDataType::Number, - default: NodeInput::value(TaggedValue::F64(0.), true), - }, + DocumentInputType::new("Input", TaggedValue::F64(0.), true), + DocumentInputType::new("Addend", TaggedValue::F64(0.), true), ], outputs: &[FrontendGraphDataType::Number], properties: node_properties::add_properties, diff --git a/editor/src/messages/portfolio/document/node_graph/node_graph_message_handler/node_properties.rs b/editor/src/messages/portfolio/document/node_graph/node_graph_message_handler/node_properties.rs index e010f613..5d1ceda1 100644 --- a/editor/src/messages/portfolio/document/node_graph/node_graph_message_handler/node_properties.rs +++ b/editor/src/messages/portfolio/document/node_graph/node_graph_message_handler/node_properties.rs @@ -126,16 +126,16 @@ pub fn add_properties(document_node: &DocumentNode, node_id: NodeId) -> Vec = DowncastBothNode::new(value_node); - let node: DynAnyNode<_, f32, _, _> = DynAnyNode::new(ConsNode::new(input_node).then(graphene_core::ops::AddNode)); + let input_node: DowncastBothNode<_, (), f64> = DowncastBothNode::new(value_node); + let node: DynAnyNode<_, f64, _, _> = DynAnyNode::new(ConsNode::new(input_node).then(graphene_core::ops::AddNode)); if let ProtoNodeInput::Node(node_id) = proto_node.input { let pre_node = nodes.get(node_id as usize).unwrap(); diff --git a/node-graph/gstd/test-image-1-result.png b/node-graph/gstd/test-image-1-result.png index 67da108e..0089fa30 100644 Binary files a/node-graph/gstd/test-image-1-result.png and b/node-graph/gstd/test-image-1-result.png differ