animated_material/
animated_material.rs1use 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}