Skip to main content

lumen_engine/node/
kind.rs

1#[cfg(feature = "metadata")]
2use super::schema::NodeSchema;
3use super::{
4    Node, OutputPortDef, PortRef, PropertyEval, PropertyExpression, compositing, ids::NodeId,
5    media_output, ports::SINGLE_RASTER_OUTPUT, processing, source, vector,
6};
7
8#[derive(Debug)]
9#[allow(clippy::large_enum_variant)]
10pub enum NodeKind {
11    MediaIn(source::media_in::MediaIn),
12    Background(source::background::Background),
13    Text(source::text::Text),
14    Path(vector::path::Path),
15    Shape(vector::shape::Shape),
16    Boolean(compositing::boolean::Boolean),
17    Merge(compositing::merge::Merge),
18    RasterMultiMerge(compositing::raster_multimerge::RasterMultiMerge),
19    AlphaPremultiply(processing::alpha_premultiply::AlphaPremultiply),
20    Blur(processing::blur::Blur),
21    ChannelShuffle(processing::channel_shuffle::ChannelShuffle),
22    ColorGrade(processing::color_grade::ColorGrade),
23    Curves(processing::curves::Curves),
24    Exposure(processing::exposure::Exposure),
25    HueSaturation(processing::hue_saturation::HueSaturation),
26    Levels(processing::levels::Levels),
27    Memo(processing::memo::Memo),
28    TimeRemap(processing::time_remap::TimeRemap),
29    Transform(processing::transform::Transform),
30    Crop(processing::crop::Crop),
31    Resize(processing::resize::Resize),
32    Shadow(processing::shadow::Shadow),
33    WgslShader(processing::wgsl_shader::WgslShader),
34    Switch(compositing::switch::Switch),
35    MediaOutput(media_output::MediaOutput),
36}
37
38impl NodeKind {
39    pub fn id(&self) -> NodeId {
40        match self {
41            Self::MediaIn(node) => node.id,
42            Self::Background(node) => node.id,
43            Self::Text(node) => node.id,
44            Self::Path(node) => node.id,
45            Self::Shape(node) => node.id,
46            Self::Boolean(node) => node.id,
47            Self::Merge(node) => node.id,
48            Self::RasterMultiMerge(node) => node.id,
49            Self::AlphaPremultiply(node) => node.id,
50            Self::Blur(node) => node.id,
51            Self::ChannelShuffle(node) => node.id,
52            Self::ColorGrade(node) => node.id,
53            Self::Curves(node) => node.id,
54            Self::Exposure(node) => node.id,
55            Self::HueSaturation(node) => node.id,
56            Self::Levels(node) => node.id,
57            Self::Memo(node) => node.id,
58            Self::TimeRemap(node) => node.id,
59            Self::Transform(node) => node.id,
60            Self::Crop(node) => node.id,
61            Self::Resize(node) => node.id,
62            Self::Shadow(node) => node.id,
63            Self::WgslShader(node) => node.id,
64            Self::Switch(node) => node.id,
65            Self::MediaOutput(node) => node.id,
66        }
67    }
68
69    pub fn input_ports(&self) -> Vec<PortRef> {
70        match self {
71            Self::MediaIn(node) => node.input_ports(),
72            Self::Background(node) => node.input_ports(),
73            Self::Text(node) => node.input_ports(),
74            Self::Path(node) => node.input_ports(),
75            Self::Shape(node) => node.input_ports(),
76            Self::Boolean(node) => node.input_ports(),
77            Self::Merge(node) => node.input_ports(),
78            Self::RasterMultiMerge(node) => node.input_ports(),
79            Self::AlphaPremultiply(node) => node.input_ports(),
80            Self::Blur(node) => node.input_ports(),
81            Self::ChannelShuffle(node) => node.input_ports(),
82            Self::ColorGrade(node) => node.input_ports(),
83            Self::Curves(node) => node.input_ports(),
84            Self::Exposure(node) => node.input_ports(),
85            Self::HueSaturation(node) => node.input_ports(),
86            Self::Levels(node) => node.input_ports(),
87            Self::Memo(node) => node.input_ports(),
88            Self::TimeRemap(node) => node.input_ports(),
89            Self::Transform(node) => node.input_ports(),
90            Self::Crop(node) => node.input_ports(),
91            Self::Resize(node) => node.input_ports(),
92            Self::Shadow(node) => node.input_ports(),
93            Self::WgslShader(node) => node.input_ports(),
94            Self::Switch(node) => node.input_ports(),
95            Self::MediaOutput(node) => node.input_ports(),
96        }
97    }
98
99    pub fn as_property_eval(&self) -> &dyn PropertyEval {
100        self
101    }
102
103    #[cfg(feature = "metadata")]
104    pub fn schemas() -> Vec<super::NodeSchemaDef> {
105        vec![
106            source::media_in::MediaIn::schema(),
107            source::background::Background::schema(),
108            source::text::Text::schema(),
109            vector::path::Path::schema(),
110            vector::shape::Shape::schema(),
111            compositing::boolean::Boolean::schema(),
112            compositing::merge::Merge::schema(),
113            compositing::raster_multimerge::RasterMultiMerge::schema(),
114            compositing::switch::Switch::schema(),
115            processing::memo::Memo::schema(),
116            processing::alpha_premultiply::AlphaPremultiply::schema(),
117            processing::blur::Blur::schema(),
118            processing::channel_shuffle::ChannelShuffle::schema(),
119            processing::color_grade::ColorGrade::schema(),
120            processing::curves::Curves::schema(),
121            processing::exposure::Exposure::schema(),
122            processing::hue_saturation::HueSaturation::schema(),
123            processing::levels::Levels::schema(),
124            processing::time_remap::TimeRemap::schema(),
125            processing::transform::Transform::schema(),
126            processing::crop::Crop::schema(),
127            processing::resize::Resize::schema(),
128            processing::shadow::Shadow::schema(),
129            processing::wgsl_shader::WgslShader::schema(),
130            media_output::MediaOutput::schema(),
131        ]
132    }
133}
134
135impl Node for NodeKind {
136    fn id(&self) -> NodeId {
137        self.id()
138    }
139
140    fn input_port_defs(&self) -> &'static [super::InputPortDef] {
141        match self {
142            Self::MediaIn(node) => node.input_port_defs(),
143            Self::Background(node) => node.input_port_defs(),
144            Self::Text(node) => node.input_port_defs(),
145            Self::Path(node) => node.input_port_defs(),
146            Self::Shape(node) => node.input_port_defs(),
147            Self::Boolean(node) => node.input_port_defs(),
148            Self::Merge(node) => node.input_port_defs(),
149            Self::RasterMultiMerge(node) => node.input_port_defs(),
150            Self::AlphaPremultiply(node) => node.input_port_defs(),
151            Self::Blur(node) => node.input_port_defs(),
152            Self::ChannelShuffle(node) => node.input_port_defs(),
153            Self::ColorGrade(node) => node.input_port_defs(),
154            Self::Curves(node) => node.input_port_defs(),
155            Self::Exposure(node) => node.input_port_defs(),
156            Self::HueSaturation(node) => node.input_port_defs(),
157            Self::Levels(node) => node.input_port_defs(),
158            Self::Memo(node) => node.input_port_defs(),
159            Self::TimeRemap(node) => node.input_port_defs(),
160            Self::Transform(node) => node.input_port_defs(),
161            Self::Crop(node) => node.input_port_defs(),
162            Self::Resize(node) => node.input_port_defs(),
163            Self::Shadow(node) => node.input_port_defs(),
164            Self::WgslShader(node) => node.input_port_defs(),
165            Self::Switch(node) => node.input_port_defs(),
166            Self::MediaOutput(node) => node.input_port_defs(),
167        }
168    }
169
170    fn input_ports(&self) -> Vec<PortRef> {
171        self.input_ports()
172    }
173
174    fn output_port_defs(&self) -> &'static [OutputPortDef] {
175        SINGLE_RASTER_OUTPUT
176    }
177}
178
179impl PropertyEval for NodeKind {
180    fn get_property(&self, id: &str) -> crate::Result<Option<PropertyExpression>> {
181        match self {
182            Self::MediaIn(node) => node.get_property(id),
183            Self::Background(node) => node.get_property(id),
184            Self::Text(node) => node.get_property(id),
185            Self::Path(node) => node.get_property(id),
186            Self::Shape(node) => node.get_property(id),
187            Self::Boolean(node) => node.get_property(id),
188            Self::Merge(node) => node.get_property(id),
189            Self::RasterMultiMerge(node) => node.get_property(id),
190            Self::AlphaPremultiply(node) => node.get_property(id),
191            Self::Blur(node) => node.get_property(id),
192            Self::ChannelShuffle(node) => node.get_property(id),
193            Self::ColorGrade(node) => node.get_property(id),
194            Self::Curves(node) => node.get_property(id),
195            Self::Exposure(node) => node.get_property(id),
196            Self::HueSaturation(node) => node.get_property(id),
197            Self::Levels(node) => node.get_property(id),
198            Self::Memo(node) => node.get_property(id),
199            Self::TimeRemap(node) => node.get_property(id),
200            Self::Transform(node) => node.get_property(id),
201            Self::Crop(node) => node.get_property(id),
202            Self::Resize(node) => node.get_property(id),
203            Self::Shadow(node) => node.get_property(id),
204            Self::WgslShader(node) => node.get_property(id),
205            Self::Switch(node) => node.get_property(id),
206            Self::MediaOutput(node) => node.get_property(id),
207        }
208    }
209}