#[derive(Debug, Default, Clone, serde::Serialize, serde::Deserialize)]
#[serde(default)]
pub struct MaterialPalette {
pub preset: String,
pub entries: Vec<PaletteEntry>,
}
#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)]
#[serde(default)]
pub struct PaletteEntry {
pub alias: String,
#[serde(skip_serializing_if = "String::is_empty")]
pub albedo: String,
#[serde(skip_serializing_if = "String::is_empty")]
pub normal_map: String,
pub roughness: f32,
pub metallic: f32,
pub tint: [f32; 3],
pub emissive_factor: [f32; 3],
}
impl Default for PaletteEntry {
fn default() -> Self {
Self {
alias: String::from("surface"),
albedo: String::new(),
normal_map: String::new(),
roughness: 0.8,
metallic: 0.0,
tint: [1.0, 1.0, 1.0],
emissive_factor: [0.0, 0.0, 0.0],
}
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn entry_deserialises_with_material_defaults() {
let e: PaletteEntry =
serde_json::from_str(r#"{"alias":"floor","albedo":"tex_stone","roughness":0.9}"#)
.unwrap();
assert_eq!(e.alias, "floor");
assert_eq!(e.albedo, "tex_stone");
assert_eq!(e.roughness, 0.9);
assert_eq!(e.metallic, 0.0);
assert_eq!(e.tint, [1.0, 1.0, 1.0]);
assert_eq!(e.emissive_factor, [0.0, 0.0, 0.0]);
}
#[test]
fn preset_palette_leaves_entries_empty() {
let p: MaterialPalette = serde_json::from_str(r#"{"preset":"pal_stone_dungeon"}"#).unwrap();
assert_eq!(p.preset, "pal_stone_dungeon");
assert!(p.entries.is_empty());
}
}