Added primary output option in DocumentNodeType (#1275)

* Added primary output option in DocumentNodeType

* Changed position of primary output field

* Changed position of primary output field in type definition

* Update editor/src/messages/portfolio/document/node_graph/node_graph_message_handler/document_node_types.rs

* Add missing default implementations to gpu nodes

---------

Co-authored-by: Dennis Kobert <dennis@kobert.dev>
This commit is contained in:
Prikshit Gautam
2023-07-05 13:06:28 +05:30
committed by Keavon Chambers
parent 3c2d371173
commit aaf28ba7b7

View File

@@ -80,6 +80,12 @@ pub enum NodeImplementation {
Extract,
}
impl Default for NodeImplementation {
fn default() -> Self {
Self::ProtoNode(NodeIdentifier::new("graphene_core::ops::IdNode"))
}
}
impl NodeImplementation {
pub fn proto(name: &'static str) -> Self {
Self::ProtoNode(NodeIdentifier::new(name))
@@ -93,9 +99,24 @@ pub struct DocumentNodeType {
pub identifier: NodeImplementation,
pub inputs: Vec<DocumentInputType>,
pub outputs: Vec<DocumentOutputType>,
pub primary_output: bool,
pub properties: fn(&DocumentNode, NodeId, &mut NodePropertiesContext) -> Vec<LayoutGroup>,
}
impl Default for DocumentNodeType {
fn default() -> Self {
Self {
name: Default::default(),
category: Default::default(),
identifier: Default::default(),
inputs: Default::default(),
outputs: Default::default(),
primary_output: Default::default(),
properties: node_properties::no_properties,
}
}
}
// We use the once cell for lazy initialization to avoid the overhead of reconstructing the node list every time.
// TODO: make document nodes not require a `'static` lifetime to avoid having to split the construction into const and non-const parts.
static DOCUMENT_NODE_TYPES: once_cell::sync::Lazy<Vec<DocumentNodeType>> = once_cell::sync::Lazy::new(static_nodes);
@@ -114,6 +135,7 @@ fn static_nodes() -> Vec<DocumentNodeType> {
}],
outputs: vec![DocumentOutputType::new("Out", FrontendGraphDataType::General)],
properties: |_document_node, _node_id, _context| node_properties::string_properties("The identity node simply returns the input"),
..Default::default()
},
DocumentNodeType {
name: "Monitor",
@@ -126,6 +148,7 @@ fn static_nodes() -> Vec<DocumentNodeType> {
}],
outputs: vec![DocumentOutputType::new("Out", FrontendGraphDataType::General)],
properties: |_document_node, _node_id, _context| node_properties::string_properties("The Monitor node stores the value of its last evaluation"),
..Default::default()
},
DocumentNodeType {
name: "Layer",
@@ -176,6 +199,7 @@ fn static_nodes() -> Vec<DocumentNodeType> {
],
outputs: vec![DocumentOutputType::new("Out", FrontendGraphDataType::GraphicGroup)],
properties: node_properties::layer_properties,
..Default::default()
},
DocumentNodeType {
name: "Artboard",
@@ -189,6 +213,7 @@ fn static_nodes() -> Vec<DocumentNodeType> {
],
outputs: vec![DocumentOutputType::new("Out", FrontendGraphDataType::Artboard)],
properties: node_properties::artboard_properties,
..Default::default()
},
DocumentNodeType {
name: "Downres",
@@ -226,6 +251,7 @@ fn static_nodes() -> Vec<DocumentNodeType> {
inputs: vec![DocumentInputType::value("Image", TaggedValue::ImageFrame(ImageFrame::empty()), false)],
outputs: vec![DocumentOutputType::new("Image", FrontendGraphDataType::Raster)],
properties: |_document_node, _node_id, _context| node_properties::string_properties("Downres the image to a lower resolution"),
..Default::default()
},
// DocumentNodeType {
// name: "Input Frame",
@@ -253,6 +279,7 @@ fn static_nodes() -> Vec<DocumentNodeType> {
data_type: FrontendGraphDataType::Raster,
}],
properties: node_properties::input_properties,
..Default::default()
},
DocumentNodeType {
name: "Load Image",
@@ -297,6 +324,7 @@ fn static_nodes() -> Vec<DocumentNodeType> {
data_type: FrontendGraphDataType::Raster,
}],
properties: node_properties::load_image_properties,
..Default::default()
},
DocumentNodeType {
name: "Create Canvas",
@@ -333,7 +361,7 @@ fn static_nodes() -> Vec<DocumentNodeType> {
name: "Canvas",
data_type: FrontendGraphDataType::General,
}],
properties: node_properties::no_properties,
..Default::default()
},
DocumentNodeType {
name: "Draw Canvas",
@@ -389,7 +417,7 @@ fn static_nodes() -> Vec<DocumentNodeType> {
name: "Canvas",
data_type: FrontendGraphDataType::General,
}],
properties: node_properties::no_properties,
..Default::default()
},
DocumentNodeType {
name: "Begin Scope",
@@ -440,6 +468,7 @@ fn static_nodes() -> Vec<DocumentNodeType> {
},
],
properties: |_document_node, _node_id, _context| node_properties::string_properties("Binds the input in a local scope as a variable"),
..Default::default()
},
DocumentNodeType {
name: "End Scope",
@@ -462,6 +491,7 @@ fn static_nodes() -> Vec<DocumentNodeType> {
data_type: FrontendGraphDataType::Raster,
}],
properties: |_document_node, _node_id, _context| node_properties::string_properties("The graph's output is drawn in the layer"),
..Default::default()
},
DocumentNodeType {
name: "Output",
@@ -474,6 +504,7 @@ fn static_nodes() -> Vec<DocumentNodeType> {
}],
outputs: vec![],
properties: node_properties::output_properties,
..Default::default()
},
DocumentNodeType {
name: "Image Frame",
@@ -485,6 +516,7 @@ fn static_nodes() -> Vec<DocumentNodeType> {
],
outputs: vec![DocumentOutputType::new("Image", FrontendGraphDataType::Raster)],
properties: |_document_node, _node_id, _context| node_properties::string_properties("Creates an embedded image with the given transform"),
..Default::default()
},
DocumentNodeType {
name: "Mask",
@@ -496,6 +528,7 @@ fn static_nodes() -> Vec<DocumentNodeType> {
],
outputs: vec![DocumentOutputType::new("Image", FrontendGraphDataType::Raster)],
properties: node_properties::mask_properties,
..Default::default()
},
DocumentNodeType {
name: "Insert Channel",
@@ -508,6 +541,7 @@ fn static_nodes() -> Vec<DocumentNodeType> {
],
outputs: vec![DocumentOutputType::new("Image", FrontendGraphDataType::Raster)],
properties: node_properties::insert_channel_properties,
..Default::default()
},
DocumentNodeType {
name: "Combine Channels",
@@ -524,7 +558,7 @@ fn static_nodes() -> Vec<DocumentNodeType> {
name: "Image",
data_type: FrontendGraphDataType::Raster,
}],
properties: node_properties::no_properties,
..Default::default()
},
DocumentNodeType {
name: "Blend",
@@ -538,6 +572,7 @@ fn static_nodes() -> Vec<DocumentNodeType> {
],
outputs: vec![DocumentOutputType::new("Image", FrontendGraphDataType::Raster)],
properties: node_properties::blend_properties,
..Default::default()
},
DocumentNodeType {
name: "Levels",
@@ -577,6 +612,7 @@ fn static_nodes() -> Vec<DocumentNodeType> {
],
outputs: vec![DocumentOutputType::new("Image", FrontendGraphDataType::Raster)],
properties: node_properties::levels_properties,
..Default::default()
},
DocumentNodeType {
name: "Grayscale",
@@ -626,6 +662,7 @@ fn static_nodes() -> Vec<DocumentNodeType> {
],
outputs: vec![DocumentOutputType::new("Image", FrontendGraphDataType::Raster)],
properties: node_properties::grayscale_properties,
..Default::default()
},
DocumentNodeType {
name: "Luminance",
@@ -637,6 +674,7 @@ fn static_nodes() -> Vec<DocumentNodeType> {
],
outputs: vec![DocumentOutputType::new("Image", FrontendGraphDataType::Raster)],
properties: node_properties::luminance_properties,
..Default::default()
},
DocumentNodeType {
name: "Extract Channel",
@@ -648,6 +686,7 @@ fn static_nodes() -> Vec<DocumentNodeType> {
],
outputs: vec![DocumentOutputType::new("Image", FrontendGraphDataType::Raster)],
properties: node_properties::extract_channel_properties,
..Default::default()
},
DocumentNodeType {
name: "Extract Alpha",
@@ -655,7 +694,7 @@ fn static_nodes() -> Vec<DocumentNodeType> {
identifier: NodeImplementation::proto("graphene_core::raster::ExtractAlphaNode<>"),
inputs: vec![DocumentInputType::value("Image", TaggedValue::ImageFrame(ImageFrame::empty()), true)],
outputs: vec![DocumentOutputType::new("Image", FrontendGraphDataType::Raster)],
properties: node_properties::no_properties,
..Default::default()
},
DocumentNodeType {
name: "Extract Opaque",
@@ -663,7 +702,7 @@ fn static_nodes() -> Vec<DocumentNodeType> {
identifier: NodeImplementation::proto("graphene_core::raster::ExtractOpaqueNode<>"),
inputs: vec![DocumentInputType::value("Image", TaggedValue::ImageFrame(ImageFrame::empty()), true)],
outputs: vec![DocumentOutputType::new("Image", FrontendGraphDataType::Raster)],
properties: node_properties::no_properties,
..Default::default()
},
DocumentNodeType {
name: "Split Channels",
@@ -724,7 +763,8 @@ fn static_nodes() -> Vec<DocumentNodeType> {
DocumentOutputType::new("Blue", FrontendGraphDataType::Raster),
DocumentOutputType::new("Alpha", FrontendGraphDataType::Raster),
],
properties: node_properties::no_properties,
primary_output: false,
..Default::default()
},
DocumentNodeType {
name: "Brush",
@@ -740,7 +780,7 @@ fn static_nodes() -> Vec<DocumentNodeType> {
name: "Image",
data_type: FrontendGraphDataType::Raster,
}],
properties: node_properties::no_properties,
..Default::default()
},
DocumentNodeType {
name: "Extract Vector Points",
@@ -751,7 +791,7 @@ fn static_nodes() -> Vec<DocumentNodeType> {
name: "Vector Points",
data_type: FrontendGraphDataType::General,
}],
properties: node_properties::no_properties,
..Default::default()
},
DocumentNodeType {
name: "Memoize",
@@ -762,7 +802,7 @@ fn static_nodes() -> Vec<DocumentNodeType> {
DocumentInputType::value("Image", TaggedValue::ImageFrame(ImageFrame::empty()), true),
],
outputs: vec![DocumentOutputType::new("Image", FrontendGraphDataType::Raster)],
properties: node_properties::no_properties,
..Default::default()
},
DocumentNodeType {
name: "Image",
@@ -771,6 +811,7 @@ fn static_nodes() -> Vec<DocumentNodeType> {
inputs: vec![DocumentInputType::value("Image", TaggedValue::ImageFrame(ImageFrame::empty()), false)],
outputs: vec![DocumentOutputType::new("Image", FrontendGraphDataType::Raster)],
properties: |_document_node, _node_id, _context| node_properties::string_properties("A bitmap image embedded in this node"),
..Default::default()
},
DocumentNodeType {
name: "Ref",
@@ -778,7 +819,7 @@ fn static_nodes() -> Vec<DocumentNodeType> {
identifier: NodeImplementation::proto("graphene_core::memo::MemoNode<_, _>"),
inputs: vec![DocumentInputType::value("Image", TaggedValue::ImageFrame(ImageFrame::empty()), true)],
outputs: vec![DocumentOutputType::new("Image", FrontendGraphDataType::Raster)],
properties: node_properties::no_properties,
..Default::default()
},
#[cfg(feature = "gpu")]
DocumentNodeType {
@@ -829,7 +870,7 @@ fn static_nodes() -> Vec<DocumentNodeType> {
name: "Uniform",
data_type: FrontendGraphDataType::General,
}],
properties: node_properties::no_properties,
..Default::default()
},
#[cfg(feature = "gpu")]
DocumentNodeType {
@@ -880,7 +921,7 @@ fn static_nodes() -> Vec<DocumentNodeType> {
name: "Storage",
data_type: FrontendGraphDataType::General,
}],
properties: node_properties::no_properties,
..Default::default()
},
#[cfg(feature = "gpu")]
DocumentNodeType {
@@ -937,6 +978,7 @@ fn static_nodes() -> Vec<DocumentNodeType> {
data_type: FrontendGraphDataType::General,
}],
properties: node_properties::input_properties,
..Default::default()
},
#[cfg(feature = "gpu")]
DocumentNodeType {
@@ -1003,6 +1045,7 @@ fn static_nodes() -> Vec<DocumentNodeType> {
data_type: FrontendGraphDataType::General,
}],
properties: node_properties::input_properties,
..Default::default()
},
#[cfg(feature = "gpu")]
DocumentNodeType {
@@ -1036,6 +1079,7 @@ fn static_nodes() -> Vec<DocumentNodeType> {
data_type: FrontendGraphDataType::General,
}],
properties: node_properties::input_properties,
..Default::default()
},
#[cfg(feature = "gpu")]
DocumentNodeType {
@@ -1086,7 +1130,7 @@ fn static_nodes() -> Vec<DocumentNodeType> {
name: "PipelineResult",
data_type: FrontendGraphDataType::General,
}],
properties: node_properties::no_properties,
..Default::default()
},
#[cfg(feature = "gpu")]
DocumentNodeType {
@@ -1137,7 +1181,7 @@ fn static_nodes() -> Vec<DocumentNodeType> {
name: "Buffer",
data_type: FrontendGraphDataType::General,
}],
properties: node_properties::no_properties,
..Default::default()
},
#[cfg(feature = "gpu")]
DocumentNodeType {
@@ -1175,7 +1219,7 @@ fn static_nodes() -> Vec<DocumentNodeType> {
name: "GpuSurface",
data_type: FrontendGraphDataType::General,
}],
properties: node_properties::no_properties,
..Default::default()
},
#[cfg(feature = "gpu")]
DocumentNodeType {
@@ -1229,7 +1273,7 @@ fn static_nodes() -> Vec<DocumentNodeType> {
name: "RenderedTexture",
data_type: FrontendGraphDataType::General,
}],
properties: node_properties::no_properties,
..Default::default()
},
#[cfg(feature = "gpu")]
DocumentNodeType {
@@ -1280,7 +1324,7 @@ fn static_nodes() -> Vec<DocumentNodeType> {
name: "Texture",
data_type: FrontendGraphDataType::General,
}],
properties: node_properties::no_properties,
..Default::default()
},
#[cfg(feature = "gpu")]
DocumentNodeType {
@@ -1301,7 +1345,7 @@ fn static_nodes() -> Vec<DocumentNodeType> {
},
],
outputs: vec![DocumentOutputType::new("Image", FrontendGraphDataType::Raster)],
properties: node_properties::no_properties,
..Default::default()
},
#[cfg(feature = "gpu")]
DocumentNodeType {
@@ -1316,6 +1360,7 @@ fn static_nodes() -> Vec<DocumentNodeType> {
],
outputs: vec![DocumentOutputType::new("Image", FrontendGraphDataType::Raster)],
properties: node_properties::blend_properties,
..Default::default()
},
DocumentNodeType {
name: "Extract",
@@ -1327,7 +1372,7 @@ fn static_nodes() -> Vec<DocumentNodeType> {
default: NodeInput::value(TaggedValue::DocumentNode(DocumentNode::default()), true),
}],
outputs: vec![DocumentOutputType::new("DocumentNode", FrontendGraphDataType::General)],
properties: node_properties::no_properties,
..Default::default()
},
#[cfg(feature = "quantization")]
DocumentNodeType {
@@ -1353,6 +1398,7 @@ fn static_nodes() -> Vec<DocumentNodeType> {
],
outputs: vec![DocumentOutputType::new("Quantization", FrontendGraphDataType::General)],
properties: node_properties::quantize_properties,
..Default::default()
},
#[cfg(feature = "quantization")]
DocumentNodeType {
@@ -1373,6 +1419,7 @@ fn static_nodes() -> Vec<DocumentNodeType> {
],
outputs: vec![DocumentOutputType::new("Encoded", FrontendGraphDataType::Raster)],
properties: node_properties::quantize_properties,
..Default::default()
},
#[cfg(feature = "quantization")]
DocumentNodeType {
@@ -1393,6 +1440,7 @@ fn static_nodes() -> Vec<DocumentNodeType> {
],
outputs: vec![DocumentOutputType::new("Decoded", FrontendGraphDataType::Raster)],
properties: node_properties::quantize_properties,
..Default::default()
},
DocumentNodeType {
name: "Invert RGB",
@@ -1400,7 +1448,7 @@ fn static_nodes() -> Vec<DocumentNodeType> {
identifier: NodeImplementation::proto("graphene_core::raster::InvertRGBNode"),
inputs: vec![DocumentInputType::value("Image", TaggedValue::ImageFrame(ImageFrame::empty()), true)],
outputs: vec![DocumentOutputType::new("Image", FrontendGraphDataType::Raster)],
properties: node_properties::no_properties,
..Default::default()
},
DocumentNodeType {
name: "Hue/Saturation",
@@ -1414,6 +1462,7 @@ fn static_nodes() -> Vec<DocumentNodeType> {
],
outputs: vec![DocumentOutputType::new("Image", FrontendGraphDataType::Raster)],
properties: node_properties::adjust_hsl_properties,
..Default::default()
},
DocumentNodeType {
name: "Brightness/Contrast",
@@ -1427,6 +1476,7 @@ fn static_nodes() -> Vec<DocumentNodeType> {
],
outputs: vec![DocumentOutputType::new("Image", FrontendGraphDataType::Raster)],
properties: node_properties::brightness_contrast_properties,
..Default::default()
},
DocumentNodeType {
name: "Threshold",
@@ -1440,6 +1490,7 @@ fn static_nodes() -> Vec<DocumentNodeType> {
],
outputs: vec![DocumentOutputType::new("Image", FrontendGraphDataType::Raster)],
properties: node_properties::adjust_threshold_properties,
..Default::default()
},
DocumentNodeType {
name: "Vibrance",
@@ -1451,6 +1502,7 @@ fn static_nodes() -> Vec<DocumentNodeType> {
],
outputs: vec![DocumentOutputType::new("Image", FrontendGraphDataType::Raster)],
properties: node_properties::adjust_vibrance_properties,
..Default::default()
},
DocumentNodeType {
name: "Channel Mixer",
@@ -1485,6 +1537,7 @@ fn static_nodes() -> Vec<DocumentNodeType> {
],
outputs: vec![DocumentOutputType::new("Image", FrontendGraphDataType::Raster)],
properties: node_properties::adjust_channel_mixer_properties,
..Default::default()
},
DocumentNodeType {
name: "Selective Color",
@@ -1546,6 +1599,7 @@ fn static_nodes() -> Vec<DocumentNodeType> {
],
outputs: vec![DocumentOutputType::new("Image", FrontendGraphDataType::Raster)],
properties: node_properties::adjust_selective_color_properties,
..Default::default()
},
DocumentNodeType {
name: "Opacity",
@@ -1557,6 +1611,7 @@ fn static_nodes() -> Vec<DocumentNodeType> {
],
outputs: vec![DocumentOutputType::new("Image", FrontendGraphDataType::Raster)],
properties: node_properties::multiply_opacity,
..Default::default()
},
DocumentNodeType {
name: "Posterize",
@@ -1568,6 +1623,7 @@ fn static_nodes() -> Vec<DocumentNodeType> {
],
outputs: vec![DocumentOutputType::new("Image", FrontendGraphDataType::Raster)],
properties: node_properties::posterize_properties,
..Default::default()
},
DocumentNodeType {
name: "Exposure",
@@ -1581,6 +1637,7 @@ fn static_nodes() -> Vec<DocumentNodeType> {
],
outputs: vec![DocumentOutputType::new("Image", FrontendGraphDataType::Raster)],
properties: node_properties::exposure_properties,
..Default::default()
},
DocumentNodeType {
name: "Add",
@@ -1592,6 +1649,7 @@ fn static_nodes() -> Vec<DocumentNodeType> {
],
outputs: vec![DocumentOutputType::new("Output", FrontendGraphDataType::Number)],
properties: node_properties::add_properties,
..Default::default()
},
(*IMAGINATE_NODE).clone(),
DocumentNodeType {
@@ -1600,7 +1658,7 @@ fn static_nodes() -> Vec<DocumentNodeType> {
identifier: NodeImplementation::proto("graphene_core::vector::generator_nodes::UnitCircleGenerator"),
inputs: vec![DocumentInputType::none()],
outputs: vec![DocumentOutputType::new("Vector", FrontendGraphDataType::Subpath)],
properties: node_properties::no_properties,
..Default::default()
},
DocumentNodeType {
name: "Path Generator",
@@ -1611,7 +1669,7 @@ fn static_nodes() -> Vec<DocumentNodeType> {
DocumentInputType::value("Mirror", TaggedValue::ManipulatorGroupIds(vec![]), false),
],
outputs: vec![DocumentOutputType::new("Vector", FrontendGraphDataType::Subpath)],
properties: node_properties::no_properties,
..Default::default()
},
DocumentNodeType {
name: "Text",
@@ -1625,6 +1683,7 @@ fn static_nodes() -> Vec<DocumentNodeType> {
],
outputs: vec![DocumentOutputType::new("Vector", FrontendGraphDataType::Subpath)],
properties: node_properties::node_section_font,
..Default::default()
},
DocumentNodeType {
name: "Transform",
@@ -1640,6 +1699,7 @@ fn static_nodes() -> Vec<DocumentNodeType> {
],
outputs: vec![DocumentOutputType::new("Data", FrontendGraphDataType::Subpath)],
properties: node_properties::transform_properties,
..Default::default()
},
DocumentNodeType {
name: "SetTransform",
@@ -1650,7 +1710,7 @@ fn static_nodes() -> Vec<DocumentNodeType> {
DocumentInputType::value("Transform", TaggedValue::DAffine2(DAffine2::IDENTITY), true),
],
outputs: vec![DocumentOutputType::new("Data", FrontendGraphDataType::Subpath)],
properties: node_properties::no_properties,
..Default::default()
},
DocumentNodeType {
name: "Fill",
@@ -1668,6 +1728,7 @@ fn static_nodes() -> Vec<DocumentNodeType> {
],
outputs: vec![DocumentOutputType::new("Vector", FrontendGraphDataType::Subpath)],
properties: node_properties::fill_properties,
..Default::default()
},
DocumentNodeType {
name: "Stroke",
@@ -1685,6 +1746,7 @@ fn static_nodes() -> Vec<DocumentNodeType> {
],
outputs: vec![DocumentOutputType::new("Vector", FrontendGraphDataType::Subpath)],
properties: node_properties::stroke_properties,
..Default::default()
},
DocumentNodeType {
name: "Image Segmentation",
@@ -1695,7 +1757,7 @@ fn static_nodes() -> Vec<DocumentNodeType> {
DocumentInputType::value("Mask", TaggedValue::ImageFrame(ImageFrame::empty()), true),
],
outputs: vec![DocumentOutputType::new("Segments", FrontendGraphDataType::Raster)],
properties: node_properties::no_properties,
..Default::default()
},
DocumentNodeType {
name: "Index",
@@ -1707,6 +1769,7 @@ fn static_nodes() -> Vec<DocumentNodeType> {
],
outputs: vec![DocumentOutputType::new("Image", FrontendGraphDataType::Raster)],
properties: node_properties::index_node_properties,
..Default::default()
},
]
}
@@ -1787,6 +1850,7 @@ pub static IMAGINATE_NODE: Lazy<DocumentNodeType> = Lazy::new(|| DocumentNodeTyp
],
outputs: vec![DocumentOutputType::new("Image", FrontendGraphDataType::Raster)],
properties: node_properties::imaginate_properties,
..Default::default()
});
pub fn resolve_document_node_type(name: &str) -> Option<&DocumentNodeType> {