use theframework::prelude::*;
#[derive(Copy, Clone, Debug, Serialize, Deserialize, PartialEq)]
pub enum MaterialProfile {
Wood,
Stone,
Dirt,
Metal,
Water,
Plastic,
Fabric,
Glass,
}
impl MaterialProfile {
pub fn evaluate_target(&self, color: Vec3<f32>) -> (f32, f32) {
let r = color.x;
let g = color.y;
let b = color.z;
let max_c = r.max(g).max(b);
let min_c = r.min(g).min(b);
let saturation = max_c - min_c; let brightness = 0.2126 * r + 0.7152 * g + 0.0722 * b;
match *self {
MaterialProfile::Wood => {
let metallic = 0.05 * saturation; let base_r = 0.70 - 0.20 * brightness + 0.20 * (1.0 - saturation);
let roughness = base_r - 0.50; (metallic, roughness)
}
MaterialProfile::Stone => {
let metallic = 0.0;
let base_r = 0.80 + 0.10 * (1.0 - brightness);
let roughness = base_r - 0.60; (metallic, roughness)
}
MaterialProfile::Dirt => {
let metallic = 0.0;
let base_r = 0.90 + 0.30 * (1.0 - saturation);
let roughness = base_r - 0.70; (metallic, roughness)
}
MaterialProfile::Metal => {
let metallic = 0.60 + 0.40 * saturation + 0.20; let base_r = 0.60 + 0.40 * (1.0 - brightness);
let roughness = base_r - 0.60; (metallic, roughness)
}
MaterialProfile::Water => {
let metallic = 0.0;
let base_r = 0.10;
let roughness = base_r - 0.09; (metallic, roughness)
}
MaterialProfile::Plastic => {
let metallic = 0.0;
let base_r = 0.70 + 0.20 * (1.0 - saturation);
let roughness = base_r - 0.60;
(metallic, roughness)
}
MaterialProfile::Fabric => {
let metallic = 0.0;
let base_r = 0.70 + 0.20 * (1.0 - brightness);
let roughness = base_r - 0.40;
(metallic, roughness)
}
MaterialProfile::Glass => {
let metallic = 0.0;
let base_r = 0.05;
let roughness = base_r - 0.04;
(metallic, roughness)
}
}
}
}