use bevy::pbr::OpaqueRendererMethod; use bevy::prelude::*; use bevy::pbr::ExtendedMaterial; use bevy::pbr::MaterialExtension; use bevy::pbr::MaterialMeshBundle; use bevy::render::render_resource::*; type MyMat = ExtendedMaterial; fn main() { App::new() .add_plugins(( DefaultPlugins.set(ImagePlugin::default_nearest()), MaterialPlugin::::default(), )) .add_systems(Startup, setup) .add_systems(Update, rotate) .add_systems(Update, setup_material) .run(); } fn setup( mut commands: Commands, assets: Res, ) { commands.spawn(SceneBundle { scene: assets.load("models/Martian Chess.glb#Scene0"), ..default() }); commands.spawn(PointLightBundle { point_light: PointLight { intensity: 10.0, ..default() }, transform: Transform::from_xyz(-1.0, 4.5, 4.0).looking_at(Vec3::ZERO, Vec3::Y), ..default() }); commands.spawn(Camera3dBundle { transform: Transform::from_xyz(-1.0, 1.5, 4.0).looking_at(Vec3::ZERO, Vec3::Y), ..default() }); } #[derive(Asset, AsBindGroup, Reflect, Debug, Clone)] struct MatExt { #[uniform(100)] cutoff: f32, } impl MaterialExtension for MatExt { fn fragment_shader() -> ShaderRef { "examples/shaders/dissolve.wgsl".into() } } fn setup_material( events: Query<(Entity, &Handle), Added>>, standard_materials: Res>, mut materials: ResMut>, mut commands: Commands, ) { events.iter().for_each(|(entity, handle)| { // Extension we will add to existing gltf-sourced materials let extension = MatExt { cutoff: 1.0 }; // Base material we will extend for the duration of the dissolve effect let mut base = standard_materials.get(handle).expect("Resolve material data").clone(); base.opaque_render_method = OpaqueRendererMethod::Auto; base.alpha_mode = AlphaMode::Mask(0.5); commands.entity(entity).insert( materials.add(ExtendedMaterial { base, extension, }) ).remove::>(); }) } fn rotate( mut query: Query<&mut Transform, With>>, time: Res