use crate::BlenderMesh;
use std::collections::HashMap;
use std::ops::Deref;
#[derive(Debug, Serialize, Deserialize, PartialEq, Default)]
pub struct PrincipledBSDF {
base_color: MaterialInput<[f32; 3], String>,
roughness: MaterialInput<f32, (String, Channel)>,
metallic: MaterialInput<f32, (String, Channel)>,
normal_map: Option<String>,
}
#[derive(Debug, Serialize, Deserialize, PartialEq)]
pub enum MaterialInput<U, I> {
Uniform(U),
ImageTexture(I),
}
#[derive(Debug, Serialize, Deserialize, PartialEq)]
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 {
#[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()
}
}
impl BlenderMesh {
pub fn materials(&self) -> &HashMap<String, PrincipledBSDF> {
&self.materials
}
}