From fb367dac72155868120e96ac46146b08070e535b Mon Sep 17 00:00:00 2001 From: vero Date: Fri, 26 Jan 2024 05:34:46 -0800 Subject: [PATCH] Add Animated Material example (#11524) # Objective - Fixes #11516 ## Solution - Add Animated Material example (colors are hue-cycling smoothly per-mesh) ![image](https://github.com/bevyengine/bevy/assets/11307157/c75b9e66-0019-41b8-85ec-647559c6ba01) Note: this example reproduces the perf issue found in #10610 pretty consistently, with and without the changes from that PR included. Frame time is sometimes around 4.3ms, other times around 12-14ms. Its pretty random per run. I think this clears #10610 for merge. --- Cargo.toml | 11 +++++ examples/3d/animated_material.rs | 78 ++++++++++++++++++++++++++++++++ examples/README.md | 1 + 3 files changed, 90 insertions(+) create mode 100644 examples/3d/animated_material.rs diff --git a/Cargo.toml b/Cargo.toml index d6d0cac752..5f7f495b53 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 0000000000..4803fc6427 --- /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