mirror of
https://github.com/GraphiteEditor/Graphite.git
synced 2025-08-03 21:08:18 +00:00
Add the first basic version of the GPU blend node (#1243)
* Implement Gpu Blend node * Remove duplicate shader input * Fix formatting --------- Co-authored-by: Dennis Kobert <dennis@kobert.dev>
This commit is contained in:
parent
9da83d3280
commit
57415b948b
14 changed files with 369 additions and 67 deletions
|
@ -84,6 +84,7 @@ impl BlendMode {
|
|||
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
|
||||
#[cfg_attr(feature = "std", derive(specta::Type))]
|
||||
#[derive(Debug, Default, Clone, Copy, Eq, PartialEq, DynAny, Hash)]
|
||||
#[repr(i32)] // TODO: Enable Int8 capability for SPRIV so that we don't need this?
|
||||
pub enum BlendMode {
|
||||
#[default]
|
||||
// Basic group
|
||||
|
@ -173,6 +174,46 @@ impl core::fmt::Display for BlendMode {
|
|||
}
|
||||
}
|
||||
|
||||
pub fn to_primtive_string(blend_mode: &BlendMode) -> &'static str {
|
||||
match blend_mode {
|
||||
BlendMode::Normal => "Normal",
|
||||
|
||||
BlendMode::Multiply => "Multiply",
|
||||
BlendMode::Darken => "Darken",
|
||||
BlendMode::ColorBurn => "ColorBurn",
|
||||
BlendMode::LinearBurn => "LinearBurn",
|
||||
BlendMode::DarkerColor => "DarkerColor",
|
||||
|
||||
BlendMode::Screen => "Screen",
|
||||
BlendMode::Lighten => "Lighten",
|
||||
BlendMode::ColorDodge => "ColorDodge",
|
||||
BlendMode::LinearDodge => "LinearDodge",
|
||||
BlendMode::LighterColor => "LighterColor",
|
||||
|
||||
BlendMode::Overlay => "Overlay",
|
||||
BlendMode::SoftLight => "SoftLight",
|
||||
BlendMode::HardLight => "HardLight",
|
||||
BlendMode::VividLight => "VividLight",
|
||||
BlendMode::LinearLight => "LinearLight",
|
||||
BlendMode::PinLight => "PinLight",
|
||||
BlendMode::HardMix => "HardMix",
|
||||
|
||||
BlendMode::Difference => "Difference",
|
||||
BlendMode::Exclusion => "Exclusion",
|
||||
BlendMode::Subtract => "Subtract",
|
||||
BlendMode::Divide => "Divide",
|
||||
|
||||
BlendMode::Hue => "Hue",
|
||||
BlendMode::Saturation => "Saturation",
|
||||
BlendMode::Color => "Color",
|
||||
BlendMode::Luminosity => "Luminosity",
|
||||
|
||||
BlendMode::InsertRed => "InsertRed",
|
||||
BlendMode::InsertGreen => "InsertGreen",
|
||||
BlendMode::InsertBlue => "InsertBlue",
|
||||
}
|
||||
}
|
||||
|
||||
#[derive(Debug, Clone, Copy, Default)]
|
||||
pub struct LuminanceNode<LuminanceCalculation> {
|
||||
luminance_calc: LuminanceCalculation,
|
||||
|
@ -410,7 +451,7 @@ pub struct BlendNode<BlendMode, Opacity> {
|
|||
}
|
||||
|
||||
#[node_macro::node_fn(BlendNode)]
|
||||
fn blend_node(input: (Color, Color), blend_mode: BlendMode, opacity: f64) -> Color {
|
||||
fn blend_node(input: (Color, Color), blend_mode: BlendMode, opacity: f32) -> Color {
|
||||
let opacity = opacity / 100.;
|
||||
|
||||
let (foreground, background) = input;
|
||||
|
@ -452,7 +493,7 @@ fn blend_node(input: (Color, Color), blend_mode: BlendMode, opacity: f64) -> Col
|
|||
BlendMode::InsertBlue => foreground.with_blue(background.b()),
|
||||
};
|
||||
|
||||
background.alpha_blend(target_color.to_associated_alpha(opacity as f32))
|
||||
background.alpha_blend(target_color.to_associated_alpha(opacity))
|
||||
}
|
||||
|
||||
#[derive(Debug, Clone, Copy)]
|
||||
|
|
|
@ -34,6 +34,19 @@ macro_rules! concrete {
|
|||
})
|
||||
};
|
||||
}
|
||||
|
||||
#[macro_export]
|
||||
macro_rules! concrete_with_name {
|
||||
($type:ty, $name:expr) => {
|
||||
Type::Concrete(TypeDescriptor {
|
||||
id: Some(core::any::TypeId::of::<$type>()),
|
||||
name: Cow::Borrowed($name),
|
||||
size: core::mem::size_of::<$type>(),
|
||||
align: core::mem::align_of::<$type>(),
|
||||
})
|
||||
};
|
||||
}
|
||||
|
||||
#[macro_export]
|
||||
macro_rules! generic {
|
||||
($type:ty) => {{
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue