Accept original clothing colour resets in outfit validation

This commit is contained in:
chazmm committed 2026-09-10 03:27:06 +01:00
1 parent 5badc2d9f4
commit 4d5f70cb5e
2 files changed
+23

No files matched your search

+20
View File
@@ -1371,6 +1371,26 @@ mod tests {
assert_eq!(option_index(&entry, &p), Some(0)); assert_eq!(option_index(&entry, &p), Some(0));
merge(&mut p, entry.options[1].patch.as_ref().unwrap()); merge(&mut p, entry.options[1].patch.as_ref().unwrap());
assert_eq!(option_index(&entry, &p), Some(1)); assert_eq!(option_index(&entry, &p), Some(1));
let material = json!({"name":"original","flags":{},"diffuse":"",
"alpha":false,"tint":[0.4,0.5,0.6],"metallic":0.,"roughness":0.7});
let library: Library = serde_json::from_value(json!({
"models":{
"shoe":{"slot":"Feet","name":"shoe","flags":{},"materials":["new"],"scene":""},
"head":{"slot":"Rostral","name":"head","flags":{},"materials":["head"],"scene":""}},
"materials":{"new":material.clone(),"head":material},"defaults":{},"morphs":[]
})).unwrap();
let parts = Parts::for_test(library);
p["selections"]["Rostral"] = json!({"asset_id":"head","material_id":"head"});
assert!(parts.resolve(&p).is_ok());
merge(&mut p, entry.options[0].patch.as_ref().unwrap());
assert_eq!(option_index(&entry, &p), Some(0));
assert!(parts.resolve(&p).is_ok(), "original material tint must be selectable");
let restored: Value = serde_json::from_slice(&serde_json::to_vec(&p).unwrap()).unwrap();
assert!(parts.resolve(&restored).is_ok(), "saved/online null reset must remain valid");
for invalid in [json!([2.,0.,0.]),json!([-0.1,0.,0.]),json!([0.,1.]),json!("red")] {
p["colours"]["Feet"] = invalid;
assert_eq!(parts.resolve(&p).unwrap_err(), "Invalid clothing colour");
}
} }
#[test] #[test]
fn customiser_owned_menu_presets_tattoos_and_search() { fn customiser_owned_menu_presets_tattoos_and_search() {
@@ -117,6 +117,9 @@ impl Parts {
} }
if let Some(colours) = profile["colours"].as_object() { if let Some(colours) = profile["colours"].as_object() {
for value in colours.values() { for value in colours.values() {
// The menu uses null to clear a tint and restore the authored
// material colour; profile_material already handles this reset.
if value.is_null() { continue; }
let rgb=serde_json::from_value::<[f32;3]>(value.clone()).map_err(|_|"Invalid clothing colour")?; let rgb=serde_json::from_value::<[f32;3]>(value.clone()).map_err(|_|"Invalid clothing colour")?;
if rgb.iter().any(|v|!(0.0..=1.0).contains(v)) {return Err("Invalid clothing colour".into());} if rgb.iter().any(|v|!(0.0..=1.0).contains(v)) {return Err("Invalid clothing colour".into());}
} }