use crate::foliage_material;
use crate::foliage_material::FoliageMaterial;
use crate::foliage_scene::FoliageRoot;
use crate::foliage_scene::FoliageScene;
use crate::foliage_types::FoliageMaterialPreset;
use crate::foliage_material::FoliageMaterialExtension;
use crate::foliage_assets::FoliageMaterialHandle;
use crate::foliage_types::FoliageTypesManifest;
use bevy::prelude::*;
use crate::foliage_assets::FoliageAssetsResource;
use crate::foliage_assets::FoliageAssetsState;
pub(crate) fn foliage_registration_plugin(app: &mut App) {
app
.add_systems(
Update,
(
register_foliage_assets.run_if( any_with_component::<FoliageTypesManifest> )
)
.chain()
);
}
fn register_foliage_assets(
asset_server: Res<AssetServer>,
foliage_root_query: Query< ( &FoliageRoot,&FoliageScene, & FoliageTypesManifest ) , Added< FoliageTypesManifest > >,
mut assets_resource: ResMut<FoliageAssetsResource>,
mut next_state: ResMut<NextState<FoliageAssetsState>>,
) {
let Ok( (foliage_root, foliage_scene, foliage_types ) ) = foliage_root_query.get_single () else {
return ;
};
let foliage_material_definitions_array = &foliage_types.foliage_material_definitions ;
for (mat_name, mat_def) in foliage_material_definitions_array {
let base_color = mat_def.base_color.unwrap_or( Srgba::WHITE ).into();
let base_material_path = &mat_def.base_color_texture;
let base_color_texture_handle_opt = base_material_path.as_ref().map( |p| asset_server.load(p) );
let standard_material = StandardMaterial {
base_color , base_color_texture: base_color_texture_handle_opt ,
cull_mode: None,
unlit: true,
fog_enabled: true ,
double_sided: true,
alpha_mode: AlphaMode::Mask(0.2),
..default()
} ;
info!("register foliage material {}", mat_name );
match mat_def.material_preset {
FoliageMaterialPreset::Standard => {
assets_resource.register_foliage_material(
mat_name,
FoliageMaterialHandle::Standard(asset_server.add( standard_material )),
);
}
FoliageMaterialPreset::Foliage => {
let fog_cloud_texture = asset_server.load("embedded://bevy_foliage_tool/internal_assets/fog_noise.png");
let foliage_material = FoliageMaterial {
fog_cloud_texture: Some( fog_cloud_texture )
};
assets_resource.register_foliage_material(
mat_name,
FoliageMaterialHandle::Extended(asset_server.add( FoliageMaterialExtension {
base : standard_material,
extension: foliage_material,
} )),
);
}
}
}
for (mesh_name, mesh_path) in &foliage_types.foliage_mesh_definitions {
info!("register foliage mesh {}", mesh_name );
assets_resource.register_foliage_mesh( mesh_name , asset_server.load( mesh_path ));
}
next_state.set(FoliageAssetsState::Loaded);
}