use after_effects::{self as ae, ParamFlag, Parameters};
use crate::params::SetupParams;
#[repr(u32)]
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub enum BlendMode {
Add = 0,
Multiply = 1,
Screen = 2,
ColorBurn = 3,
ColorDodge = 4,
DarkerColor = 5,
Overlay = 6,
Difference = 7,
Subtract = 8,
Divide = 9,
Hue = 10,
Saturation = 11,
Color = 12,
Luminosity = 13,
}
impl BlendMode {
pub const COUNT: usize = 14;
pub fn as_u32(self) -> u32 {
self as u32
}
pub fn to_popup_value(self) -> i32 {
(self as i32) + 1
}
pub fn from_popup_value(v: i32) -> Self {
match v {
1 => Self::Add,
2 => Self::Multiply,
3 => Self::Screen,
4 => Self::ColorBurn,
5 => Self::ColorDodge,
6 => Self::DarkerColor,
7 => Self::Overlay,
8 => Self::Difference,
9 => Self::Subtract,
10 => Self::Divide,
11 => Self::Hue,
12 => Self::Saturation,
13 => Self::Color,
14 => Self::Luminosity,
_ => Self::Add,
}
}
}
pub const BLEND_MODE_OPTIONS: &[&str] = &[
"Add",
"Multiply",
"Screen",
"Color Burn",
"Color Dodge",
"Darker Color",
"Overlay",
"Difference",
"Subtract",
"Divide",
"Hue",
"Saturation",
"Color",
"Luminosity",
];
pub fn add_blend_mode_param<P: SetupParams>(
params: &mut Parameters<'_, P>,
id: P,
label: &str,
default: BlendMode,
) -> Result<(), ae::Error> {
let default_popup = default.to_popup_value();
params.add_customized(
id,
label,
ae::PopupDef::setup(|f| {
f.set_default(default_popup);
f.set_value(default_popup);
f.set_options(BLEND_MODE_OPTIONS);
}),
|p| {
p.set_flag(ParamFlag::SUPERVISE, true);
-1
},
)
}