Add Range parameter to the Threshold node (#1079)

* Add Range

* Naming, order, and defaults

---------

Co-authored-by: Keavon Chambers <keavon@keavon.com>
This commit is contained in:
isiko
2023-03-28 00:06:24 -07:00
committed by GitHub
co-authored by Keavon Chambers
parent d1630c73de
commit 7d1a8860ff
4 changed files with 24 additions and 20 deletions
@@ -393,7 +393,7 @@ fn static_nodes() -> Vec<DocumentNodeType> {
identifier: NodeImplementation::proto("graphene_core::raster::LuminanceNode<_>"), identifier: NodeImplementation::proto("graphene_core::raster::LuminanceNode<_>"),
inputs: vec![ inputs: vec![
DocumentInputType::value("Image", TaggedValue::ImageFrame(ImageFrame::empty()), true), DocumentInputType::value("Image", TaggedValue::ImageFrame(ImageFrame::empty()), true),
DocumentInputType::value("Luma Calculation", TaggedValue::LuminanceCalculation(LuminanceCalculation::SRGB), false), DocumentInputType::value("Luminance Calc", TaggedValue::LuminanceCalculation(LuminanceCalculation::SRGB), false),
], ],
outputs: vec![DocumentOutputType::new("Image", FrontendGraphDataType::Raster)], outputs: vec![DocumentOutputType::new("Image", FrontendGraphDataType::Raster)],
properties: node_properties::luminance_properties, properties: node_properties::luminance_properties,
@@ -590,11 +590,12 @@ fn static_nodes() -> Vec<DocumentNodeType> {
DocumentNodeType { DocumentNodeType {
name: "Threshold", name: "Threshold",
category: "Image Adjustments", category: "Image Adjustments",
identifier: NodeImplementation::proto("graphene_core::raster::ThresholdNode<_, _>"), identifier: NodeImplementation::proto("graphene_core::raster::ThresholdNode<_, _, _>"),
inputs: vec![ inputs: vec![
DocumentInputType::value("Image", TaggedValue::ImageFrame(ImageFrame::empty()), true), DocumentInputType::value("Image", TaggedValue::ImageFrame(ImageFrame::empty()), true),
DocumentInputType::value("Luma Calculation", TaggedValue::LuminanceCalculation(LuminanceCalculation::SRGB), false), DocumentInputType::value("Min Luminance", TaggedValue::F64(50.), false),
DocumentInputType::value("Threshold", TaggedValue::F64(50.), false), DocumentInputType::value("Max Luminance", TaggedValue::F64(100.), false),
DocumentInputType::value("Luminance Calc", TaggedValue::LuminanceCalculation(LuminanceCalculation::SRGB), false),
], ],
outputs: vec![DocumentOutputType::new("Image", FrontendGraphDataType::Raster)], outputs: vec![DocumentOutputType::new("Image", FrontendGraphDataType::Raster)],
properties: node_properties::adjust_threshold_properties, properties: node_properties::adjust_threshold_properties,
@@ -478,9 +478,9 @@ pub fn blend_properties(document_node: &DocumentNode, node_id: NodeId, _context:
} }
pub fn luminance_properties(document_node: &DocumentNode, node_id: NodeId, _context: &mut NodePropertiesContext) -> Vec<LayoutGroup> { pub fn luminance_properties(document_node: &DocumentNode, node_id: NodeId, _context: &mut NodePropertiesContext) -> Vec<LayoutGroup> {
let luma_calculation = luminance_calculation(document_node, node_id, 1, "Luma Calculation", true); let luminance_calc = luminance_calculation(document_node, node_id, 1, "Luminance Calc", true);
vec![luma_calculation] vec![luminance_calc]
} }
pub fn adjust_hsl_properties(document_node: &DocumentNode, node_id: NodeId, _context: &mut NodePropertiesContext) -> Vec<LayoutGroup> { pub fn adjust_hsl_properties(document_node: &DocumentNode, node_id: NodeId, _context: &mut NodePropertiesContext) -> Vec<LayoutGroup> {
@@ -510,10 +510,11 @@ pub fn blur_image_properties(document_node: &DocumentNode, node_id: NodeId, _con
} }
pub fn adjust_threshold_properties(document_node: &DocumentNode, node_id: NodeId, _context: &mut NodePropertiesContext) -> Vec<LayoutGroup> { pub fn adjust_threshold_properties(document_node: &DocumentNode, node_id: NodeId, _context: &mut NodePropertiesContext) -> Vec<LayoutGroup> {
let luma_calculation = luminance_calculation(document_node, node_id, 1, "Luma Calculation", true); let thereshold_min = number_widget(document_node, node_id, 1, "Min Luminance", NumberInput::default().min(0.).max(100.).unit("%"), true);
let thereshold = number_widget(document_node, node_id, 2, "Threshold", NumberInput::default().min(0.).max(100.).unit("%"), true); let thereshold_max = number_widget(document_node, node_id, 2, "Max Luminance", NumberInput::default().min(0.).max(100.).unit("%"), true);
let luminance_calc = luminance_calculation(document_node, node_id, 3, "Luminance Calc", true);
vec![luma_calculation, LayoutGroup::Row { widgets: thereshold }] vec![LayoutGroup::Row { widgets: thereshold_min }, LayoutGroup::Row { widgets: thereshold_max }, luminance_calc]
} }
pub fn adjust_vibrance_properties(document_node: &DocumentNode, node_id: NodeId, _context: &mut NodePropertiesContext) -> Vec<LayoutGroup> { pub fn adjust_vibrance_properties(document_node: &DocumentNode, node_id: NodeId, _context: &mut NodePropertiesContext) -> Vec<LayoutGroup> {
+12 -10
View File
@@ -161,15 +161,15 @@ impl core::fmt::Display for BlendMode {
#[derive(Debug, Clone, Copy, Default)] #[derive(Debug, Clone, Copy, Default)]
pub struct LuminanceNode<LuminanceCalculation> { pub struct LuminanceNode<LuminanceCalculation> {
luma_calculation: LuminanceCalculation, luminance_calc: LuminanceCalculation,
} }
#[node_macro::node_fn(LuminanceNode)] #[node_macro::node_fn(LuminanceNode)]
fn luminance_color_node(color: Color, luma_calculation: LuminanceCalculation) -> Color { fn luminance_color_node(color: Color, luminance_calc: LuminanceCalculation) -> Color {
// TODO: Remove conversion to linear when the whole node graph uses linear color // TODO: Remove conversion to linear when the whole node graph uses linear color
let color = color.to_linear_srgb(); let color = color.to_linear_srgb();
let luminance = match luma_calculation { let luminance = match luminance_calc {
LuminanceCalculation::SRGB => color.luminance_srgb(), LuminanceCalculation::SRGB => color.luminance_srgb(),
LuminanceCalculation::Perceptual => color.luminance_perceptual(), LuminanceCalculation::Perceptual => color.luminance_perceptual(),
LuminanceCalculation::AverageChannels => color.average_rgb_channels(), LuminanceCalculation::AverageChannels => color.average_rgb_channels(),
@@ -304,19 +304,21 @@ fn invert_image(color: Color) -> Color {
} }
#[derive(Debug, Clone, Copy)] #[derive(Debug, Clone, Copy)]
pub struct ThresholdNode<LuminanceCalculation, Threshold> { pub struct ThresholdNode<MinLuminance, MaxLuminance, LuminanceCalc> {
luma_calculation: LuminanceCalculation, min_luminance: MinLuminance,
threshold: Threshold, max_luminance: MaxLuminance,
luminance_calc: LuminanceCalc,
} }
#[node_macro::node_fn(ThresholdNode)] #[node_macro::node_fn(ThresholdNode)]
fn threshold_node(color: Color, luma_calculation: LuminanceCalculation, threshold: f64) -> Color { fn threshold_node(color: Color, min_luminance: f64, max_luminance: f64, luminance_calc: LuminanceCalculation) -> Color {
let threshold = Color::srgb_to_linear(threshold as f32 / 100.); let min_luminance = Color::srgb_to_linear(min_luminance as f32 / 100.);
let max_luminance = Color::srgb_to_linear(max_luminance as f32 / 100.);
// TODO: Remove conversion to linear when the whole node graph uses linear color // TODO: Remove conversion to linear when the whole node graph uses linear color
let color = color.to_linear_srgb(); let color = color.to_linear_srgb();
let luminance = match luma_calculation { let luminance = match luminance_calc {
LuminanceCalculation::SRGB => color.luminance_srgb(), LuminanceCalculation::SRGB => color.luminance_srgb(),
LuminanceCalculation::Perceptual => color.luminance_perceptual(), LuminanceCalculation::Perceptual => color.luminance_perceptual(),
LuminanceCalculation::AverageChannels => color.average_rgb_channels(), LuminanceCalculation::AverageChannels => color.average_rgb_channels(),
@@ -324,7 +326,7 @@ fn threshold_node(color: Color, luma_calculation: LuminanceCalculation, threshol
LuminanceCalculation::MaximumChannels => color.maximum_rgb_channels(), LuminanceCalculation::MaximumChannels => color.maximum_rgb_channels(),
}; };
if luminance >= threshold { if luminance >= min_luminance && luminance <= max_luminance {
Color::WHITE Color::WHITE
} else { } else {
Color::BLACK Color::BLACK
@@ -171,7 +171,7 @@ fn node_registry() -> HashMap<NodeIdentifier, HashMap<NodeIOTypes, NodeConstruct
raster_node!(graphene_core::raster::GrayscaleNode<_, _, _, _, _, _, _>, params: [Color, f64, f64, f64, f64, f64, f64]), raster_node!(graphene_core::raster::GrayscaleNode<_, _, _, _, _, _, _>, params: [Color, f64, f64, f64, f64, f64, f64]),
raster_node!(graphene_core::raster::HueSaturationNode<_, _, _>, params: [f64, f64, f64]), raster_node!(graphene_core::raster::HueSaturationNode<_, _, _>, params: [f64, f64, f64]),
raster_node!(graphene_core::raster::InvertRGBNode, params: []), raster_node!(graphene_core::raster::InvertRGBNode, params: []),
raster_node!(graphene_core::raster::ThresholdNode<_, _>, params: [LuminanceCalculation, f64]), raster_node!(graphene_core::raster::ThresholdNode<_, _, _>, params: [f64, f64, LuminanceCalculation]),
raster_node!(graphene_core::raster::VibranceNode<_>, params: [f64]), raster_node!(graphene_core::raster::VibranceNode<_>, params: [f64]),
raster_node!(graphene_core::raster::BrightnessContrastNode< _, _>, params: [f64, f64]), raster_node!(graphene_core::raster::BrightnessContrastNode< _, _>, params: [f64, f64]),
raster_node!(graphene_core::raster::OpacityNode<_>, params: [f64]), raster_node!(graphene_core::raster::OpacityNode<_>, params: [f64]),