diff --git a/Cargo.toml b/Cargo.toml index d6d0cac752eb0..5f7f495b539dc 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -552,6 +552,17 @@ description = "Demonstrates how to use the `Camera::viewport_to_world` method" category = "3D Rendering" wasm = true +[[example]] +name = "animated_material" +path = "examples/3d/animated_material.rs" +doc-scrape-examples = true + +[package.metadata.example.animated_material] +name = "Animated Material" +description = "Shows how to animate material properties" +category = "3D Rendering" +wasm = true + [[example]] name = "generate_custom_mesh" path = "examples/3d/generate_custom_mesh.rs" diff --git a/examples/3d/animated_material.rs b/examples/3d/animated_material.rs new file mode 100644 index 0000000000000..4803fc64272e0 --- /dev/null +++ b/examples/3d/animated_material.rs @@ -0,0 +1,78 @@ +//! Shows how to animate material properties + +use bevy::prelude::*; +use bevy::utils::HashSet; + +fn main() { + App::new() + .add_plugins(DefaultPlugins) + .add_systems(Startup, setup) + .add_systems(Update, (animate_materials, make_materials_unique)) + .run(); +} + +fn setup(mut commands: Commands, asset_server: Res) { + commands.spawn(( + Camera3dBundle { + transform: Transform::from_xyz(3.0, 1.0, 3.0) + .looking_at(Vec3::new(0.0, -0.5, 0.0), Vec3::Y), + ..default() + }, + EnvironmentMapLight { + diffuse_map: asset_server.load("environment_maps/pisa_diffuse_rgb9e5_zstd.ktx2"), + specular_map: asset_server.load("environment_maps/pisa_specular_rgb9e5_zstd.ktx2"), + intensity: 1500.0, + }, + )); + + let helmet = asset_server.load("models/FlightHelmet/FlightHelmet.gltf#Scene0"); + for x in -2..3 { + for z in -2..3 { + commands.spawn(SceneBundle { + scene: helmet.clone(), + transform: Transform::from_translation(Vec3::new(x as f32, 0.0, z as f32)), + ..default() + }); + } + } +} + +fn animate_materials( + material_handles: Query<&Handle>, + time: Res