#[derive(Debug, Serialize, Deserialize, PartialEq, Default, Clone)]
pub struct PrincipledBSDF {
pub(crate) base_color: MaterialInput<[f32; 3], String>,
pub(crate) roughness: MaterialInput<f32, (String, Channel)>,
pub(crate) metallic: MaterialInput<f32, (String, Channel)>,
pub(crate) normal_map: Option<String>,
}
#[derive(Debug, Serialize, Deserialize, PartialEq, Clone)]
pub enum MaterialInput<U, I> {
Uniform(U),
ImageTexture(I),
}
#[derive(Debug, Serialize, Deserialize, PartialEq, Copy, Clone)]
pub enum Channel {
#[serde(rename = "R")]
Red,
#[serde(rename = "G")]
Green,
#[serde(rename = "B")]
Blue,
}
impl<U, I> Default for MaterialInput<U, I>
where
U: Default,
{
fn default() -> Self {
MaterialInput::Uniform(U::default())
}
}
impl PrincipledBSDF {
pub fn new(
base_color: MaterialInput<[f32; 3], String>,
roughness: MaterialInput<f32, (String, Channel)>,
metallic: MaterialInput<f32, (String, Channel)>,
normal_map: Option<String>,
) -> Self {
PrincipledBSDF {
base_color,
roughness,
metallic,
normal_map,
}
}
#[inline]
pub fn base_color(&self) -> &MaterialInput<[f32; 3], String> {
&self.base_color
}
#[inline]
pub fn roughness(&self) -> &MaterialInput<f32, (String, Channel)> {
&self.roughness
}
#[inline]
pub fn metallic(&self) -> &MaterialInput<f32, (String, Channel)> {
&self.metallic
}
#[inline]
pub fn normal_map(&self) -> Option<&String> {
self.normal_map.as_ref()
}
}