animated_material/
animated_material.rs

1//! Shows how to animate material properties
2
3use bevy::prelude::*;
4
5fn main() {
6    App::new()
7        .add_plugins(DefaultPlugins)
8        .add_systems(Startup, setup)
9        .add_systems(Update, animate_materials)
10        .run();
11}
12
13fn setup(
14    mut commands: Commands,
15    asset_server: Res<AssetServer>,
16    mut meshes: ResMut<Assets<Mesh>>,
17    mut materials: ResMut<Assets<StandardMaterial>>,
18) {
19    commands.spawn((
20        Camera3d::default(),
21        Transform::from_xyz(3.0, 1.0, 3.0).looking_at(Vec3::new(0.0, -0.5, 0.0), Vec3::Y),
22        EnvironmentMapLight {
23            diffuse_map: asset_server.load("environment_maps/pisa_diffuse_rgb9e5_zstd.ktx2"),
24            specular_map: asset_server.load("environment_maps/pisa_specular_rgb9e5_zstd.ktx2"),
25            intensity: 2_000.0,
26            ..default()
27        },
28    ));
29
30    let cube = meshes.add(Cuboid::new(0.5, 0.5, 0.5));
31
32    const GOLDEN_ANGLE: f32 = 137.507_77;
33
34    let mut hsla = Hsla::hsl(0.0, 1.0, 0.5);
35    for x in -1..2 {
36        for z in -1..2 {
37            commands.spawn((
38                Mesh3d(cube.clone()),
39                MeshMaterial3d(materials.add(Color::from(hsla))),
40                Transform::from_translation(Vec3::new(x as f32, 0.0, z as f32)),
41            ));
42            hsla = hsla.rotate_hue(GOLDEN_ANGLE);
43        }
44    }
45}
46
47fn animate_materials(
48    material_handles: Query<&MeshMaterial3d<StandardMaterial>>,
49    time: Res<Time>,
50    mut materials: ResMut<Assets<StandardMaterial>>,
51) {
52    for material_handle in material_handles.iter() {
53        if let Some(material) = materials.get_mut(material_handle)
54            && let Color::Hsla(ref mut hsla) = material.base_color
55        {
56            *hsla = hsla.rotate_hue(time.delta_secs() * 100.0);
57        }
58    }
59}