use bevy_materialize::prelude::GenericMaterial;
use crate::BevyMaterialWizardConfigResource;
use bevy::prelude::*;
use bevy::platform::collections::hash_map::HashMap;
#[derive( Resource, Clone )]
pub struct RegisteredMaterialsMap ( pub HashMap<String, Handle<GenericMaterial>> );
impl RegisteredMaterialsMap {
pub fn find_material(&self, mat_name: &String) -> Option<&Handle<GenericMaterial>> {
return self.0.get( mat_name )
}
pub fn from_manifest_path(
manifest_path: &str,
asset_server: &mut AssetServer,
wizard_config: BevyMaterialWizardConfigResource
) -> Option<Self> {
let mut registered_materials = HashMap::new();
let file_content = match std::fs::read_to_string(manifest_path) {
Ok(content) => content,
Err(e) => {
warn!("{:?}", e );
return None
}
};
let manifest: HashMap<String, String> = match ron::from_str(&file_content) {
Ok(parsed) => parsed,
Err( e ) => {
warn!("{:?}", e );
return None
},
};
let path_prefix = & wizard_config.material_defs_folder_prefix;
for (material_name, material_path) in manifest {
let material_path = format!("{}{}", path_prefix, material_path );
let material_handle = asset_server.load( material_path );
registered_materials.insert(material_name, material_handle);
}
Some(Self( registered_materials ))
}
}
impl FromWorld for RegisteredMaterialsMap {
fn from_world(world: &mut World) -> Self {
let wizard_config = world.resource::<BevyMaterialWizardConfigResource>().clone() ;
let manifest_path = world.resource::< BevyMaterialWizardConfigResource >().material_defs_manifest_path.clone() ;
let mut asset_server = world.resource_mut::<AssetServer>() ;
RegisteredMaterialsMap::from_manifest_path( &manifest_path, &mut asset_server , wizard_config ) .unwrap()
}
}