#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum ParamVisMode {
Checker = 1,
Grid = 2,
LocalChecker = 3,
LocalRadial = 4,
}
#[derive(Debug, Clone, Copy, PartialEq)]
pub struct ParamVis {
pub mode: ParamVisMode,
pub scale: f32,
}
impl Default for ParamVis {
fn default() -> Self {
Self {
mode: ParamVisMode::Checker,
scale: 8.0,
}
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum BackfacePattern {
Checker = 0,
Hatching = 1,
Crosshatch = 2,
Stripes = 3,
}
#[derive(Debug, Clone, Copy, PartialEq)]
pub enum BackfacePolicy {
Cull,
Identical,
DifferentColor([f32; 3]),
Tint(f32),
Pattern {
pattern: BackfacePattern,
color: [f32; 3],
},
}
impl Default for BackfacePolicy {
fn default() -> Self {
BackfacePolicy::Cull
}
}
#[non_exhaustive]
#[derive(Debug, Clone, Copy, PartialEq)]
pub struct Material {
pub base_color: [f32; 3],
pub ambient: f32,
pub diffuse: f32,
pub specular: f32,
pub shininess: f32,
pub metallic: f32,
pub roughness: f32,
pub opacity: f32,
pub texture_id: Option<u64>,
pub normal_map_id: Option<u64>,
pub ao_map_id: Option<u64>,
pub use_pbr: bool,
pub matcap_id: Option<crate::resources::MatcapId>,
pub param_vis: Option<ParamVis>,
pub backface_policy: BackfacePolicy,
}
impl Default for Material {
fn default() -> Self {
Self {
base_color: [0.7, 0.7, 0.7],
ambient: 0.15,
diffuse: 0.75,
specular: 0.4,
shininess: 32.0,
metallic: 0.0,
roughness: 0.5,
opacity: 1.0,
texture_id: None,
normal_map_id: None,
ao_map_id: None,
use_pbr: false,
matcap_id: None,
param_vis: None,
backface_policy: BackfacePolicy::Cull,
}
}
}
impl Material {
pub fn is_two_sided(&self) -> bool {
!matches!(self.backface_policy, BackfacePolicy::Cull)
}
pub fn from_color(color: [f32; 3]) -> Self {
Self {
base_color: color,
..Default::default()
}
}
pub fn pbr(base_color: [f32; 3], metallic: f32, roughness: f32) -> Self {
Self {
base_color,
use_pbr: true,
metallic,
roughness,
..Default::default()
}
}
}