From 820a2672b8486d0e2baa65178635691e389f0141 Mon Sep 17 00:00:00 2001 From: isiko Date: Sun, 4 Jun 2023 21:51:42 +0200 Subject: [PATCH] Add the Extract Opaque node (#1276) * Add 'Extract Opaqueue Node' * Fix node --------- Co-authored-by: Keavon Chambers --- .../node_graph_message_handler/document_node_types.rs | 8 ++++++++ node-graph/gcore/src/raster/adjustments.rs | 11 +++++++++++ node-graph/interpreted-executor/src/node_registry.rs | 1 + 3 files changed, 20 insertions(+) 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 c655ac0b..a131278b 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 @@ -605,6 +605,14 @@ fn static_nodes() -> Vec { outputs: vec![DocumentOutputType::new("Image", FrontendGraphDataType::Raster)], properties: node_properties::no_properties, }, + DocumentNodeType { + name: "Extract Opaque", + category: "Image Adjustments", + 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, + }, DocumentNodeType { name: "Split Channels", category: "Image Adjustments", diff --git a/node-graph/gcore/src/raster/adjustments.rs b/node-graph/gcore/src/raster/adjustments.rs index 87ee6ba7..c8aa6669 100644 --- a/node-graph/gcore/src/raster/adjustments.rs +++ b/node-graph/gcore/src/raster/adjustments.rs @@ -207,6 +207,17 @@ fn extract_alpha_node(color: Color) -> Color { Color::from_rgbaf32(alpha, alpha, alpha, 1.0).unwrap() } +#[derive(Debug, Clone, Copy, Default)] +pub struct ExtractOpaqueNode; + +#[node_macro::node_fn(ExtractOpaqueNode)] +fn extract_opaque_node(color: Color) -> Color { + if color.a() == 0. { + return color.with_alpha(1.); + } + Color::from_rgbaf32(color.r() / color.a(), color.g() / color.a(), color.b() / color.a(), 1.0).unwrap() +} + #[derive(Debug, Clone, Copy, Default)] pub struct LevelsNode { input_start: InputStart, diff --git a/node-graph/interpreted-executor/src/node_registry.rs b/node-graph/interpreted-executor/src/node_registry.rs index 308b735e..a8a2eee3 100644 --- a/node-graph/interpreted-executor/src/node_registry.rs +++ b/node-graph/interpreted-executor/src/node_registry.rs @@ -304,6 +304,7 @@ fn node_registry() -> HashMap, params: [LuminanceCalculation]), raster_node!(graphene_core::raster::ExtractChannelNode<_>, params: [RedGreenBlue]), raster_node!(graphene_core::raster::ExtractAlphaNode<>, params: []), + raster_node!(graphene_core::raster::ExtractOpaqueNode<>, params: []), raster_node!(graphene_core::raster::LevelsNode<_, _, _, _, _>, params: [f64, f64, f64, f64, f64]), register_node!(graphene_std::image_segmentation::ImageSegmentationNode<_>, input: ImageFrame, params: [ImageFrame]), register_node!(graphene_core::raster::IndexNode<_>, input: Vec>, params: [u32]),