use crate::BevyMaterialWizardConfigResource;
use std::io::Read;
use std::fs::File;
use bevy::platform::collections::hash_map::HashMap;
use bevy::prelude::*;
use serde::Deserialize;
use serde::Serialize;
#[derive( Resource, Clone )]
pub struct MaterialReplacementsMap {
pub material_replacement_sets: HashMap < ReplacementSetName, HashMap< String, String > >
}
pub type ReplacementSetName = String ;
impl FromWorld for MaterialReplacementsMap {
fn from_world(world: &mut World) -> Self {
let folder_load_path = world.get_resource::< BevyMaterialWizardConfigResource >().unwrap().material_replacements_folder_path.clone() ;
let mut material_replacement_sets = HashMap::new();
if let Ok(entries) = std::fs::read_dir(folder_load_path.clone()) {
for entry in entries {
if let Ok(entry) = entry {
let path = entry.path();
if path.is_file() {
if let Some(extension) = path.extension() {
if extension == "ron" {
let file_path = path.to_string_lossy().to_string();
match MaterialReplacementManifest::load_from_file(&file_path) {
Ok(repl_def) => {
material_replacement_sets
.insert(repl_def.replacement_set_name.clone(), repl_def.material_replacements.clone());
}
Err(err) => {
eprintln!("Failed to load material definition from {}: {}", file_path, err);
}
}
}
}
}
}
}
} else {
eprintln!("Failed to read directory: {}", folder_load_path.clone());
}
MaterialReplacementsMap { material_replacement_sets }
}
}
#[derive( Deserialize, Serialize, Clone)]
pub struct MaterialReplacementManifest {
pub replacement_set_name: ReplacementSetName, pub material_replacements: HashMap< String, String >
}
impl MaterialReplacementManifest {
pub fn load_from_file(file_path: &str) -> Result<Self, ron::Error> {
let mut file = File::open(file_path).expect("Failed to open file");
let mut contents = String::new();
file.read_to_string(&mut contents)
.expect("Failed to read file");
Ok(ron::from_str(&contents)?)
}
}