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 09:06:24 +02:00
committed by Keavon Chambers
parent 97be83c404
commit d0863165a4
4 changed files with 24 additions and 20 deletions

View File

@@ -161,15 +161,15 @@ impl core::fmt::Display for BlendMode {
#[derive(Debug, Clone, Copy, Default)]
pub struct LuminanceNode<LuminanceCalculation> {
luma_calculation: LuminanceCalculation,
luminance_calc: LuminanceCalculation,
}
#[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
let color = color.to_linear_srgb();
let luminance = match luma_calculation {
let luminance = match luminance_calc {
LuminanceCalculation::SRGB => color.luminance_srgb(),
LuminanceCalculation::Perceptual => color.luminance_perceptual(),
LuminanceCalculation::AverageChannels => color.average_rgb_channels(),
@@ -304,19 +304,21 @@ fn invert_image(color: Color) -> Color {
}
#[derive(Debug, Clone, Copy)]
pub struct ThresholdNode<LuminanceCalculation, Threshold> {
luma_calculation: LuminanceCalculation,
threshold: Threshold,
pub struct ThresholdNode<MinLuminance, MaxLuminance, LuminanceCalc> {
min_luminance: MinLuminance,
max_luminance: MaxLuminance,
luminance_calc: LuminanceCalc,
}
#[node_macro::node_fn(ThresholdNode)]
fn threshold_node(color: Color, luma_calculation: LuminanceCalculation, threshold: f64) -> Color {
let threshold = Color::srgb_to_linear(threshold as f32 / 100.);
fn threshold_node(color: Color, min_luminance: f64, max_luminance: f64, luminance_calc: LuminanceCalculation) -> Color {
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
let color = color.to_linear_srgb();
let luminance = match luma_calculation {
let luminance = match luminance_calc {
LuminanceCalculation::SRGB => color.luminance_srgb(),
LuminanceCalculation::Perceptual => color.luminance_perceptual(),
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(),
};
if luminance >= threshold {
if luminance >= min_luminance && luminance <= max_luminance {
Color::WHITE
} else {
Color::BLACK

View File

@@ -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::HueSaturationNode<_, _, _>, params: [f64, f64, f64]),
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::BrightnessContrastNode< _, _>, params: [f64, f64]),
raster_node!(graphene_core::raster::OpacityNode<_>, params: [f64]),