Path: blob/main/examples/stress_tests/many_materials.rs
6592 views
//! Benchmark to test rendering many animated materials1use argh::FromArgs;2use bevy::{3diagnostic::{FrameTimeDiagnosticsPlugin, LogDiagnosticsPlugin},4prelude::*,5window::{PresentMode, WindowResolution},6winit::{UpdateMode, WinitSettings},7};8use std::f32::consts::PI;910#[derive(FromArgs, Resource)]11/// Command-line arguments for the `many_materials` stress test.12struct Args {13/// the size of the grid of materials to render (n x n)14#[argh(option, short = 'n', default = "10")]15grid_size: usize,16}1718fn main() {19// `from_env` panics on the web20#[cfg(not(target_arch = "wasm32"))]21let args: Args = argh::from_env();22#[cfg(target_arch = "wasm32")]23let args = Args::from_args(&[], &[]).unwrap();2425App::new()26.add_plugins((27DefaultPlugins.set(WindowPlugin {28primary_window: Some(Window {29resolution: WindowResolution::new(1920, 1080).with_scale_factor_override(1.0),30title: "many_materials".into(),31present_mode: PresentMode::AutoNoVsync,32..default()33}),34..default()35}),36FrameTimeDiagnosticsPlugin::default(),37LogDiagnosticsPlugin::default(),38))39.insert_resource(WinitSettings {40focused_mode: UpdateMode::Continuous,41unfocused_mode: UpdateMode::Continuous,42})43.insert_resource(args)44.add_systems(Startup, setup)45.add_systems(Update, animate_materials)46.run();47}4849fn setup(50mut commands: Commands,51args: Res<Args>,52mesh_assets: ResMut<Assets<Mesh>>,53material_assets: ResMut<Assets<StandardMaterial>>,54) {55let args = args.into_inner();56let material_assets = material_assets.into_inner();57let mesh_assets = mesh_assets.into_inner();58let n = args.grid_size;5960// Camera61let w = n as f32;62commands.spawn((63Camera3d::default(),64Transform::from_xyz(w * 1.25, w + 1.0, w * 1.25)65.looking_at(Vec3::new(0.0, (w * -1.1) + 1.0, 0.0), Vec3::Y),66));6768// Light69commands.spawn((70Transform::from_rotation(Quat::from_euler(EulerRot::ZYX, 0.0, 1.0, -PI / 4.)),71DirectionalLight {72illuminance: 3000.0,73shadows_enabled: true,74..default()75},76));7778// Cubes79let mesh_handle = mesh_assets.add(Cuboid::from_size(Vec3::ONE));80for x in 0..n {81for z in 0..n {82commands.spawn((83Mesh3d(mesh_handle.clone()),84MeshMaterial3d(material_assets.add(Color::WHITE)),85Transform::from_translation(Vec3::new(x as f32, 0.0, z as f32)),86));87}88}89}9091fn animate_materials(92material_handles: Query<&MeshMaterial3d<StandardMaterial>>,93time: Res<Time>,94mut materials: ResMut<Assets<StandardMaterial>>,95) {96for (i, material_handle) in material_handles.iter().enumerate() {97if let Some(material) = materials.get_mut(material_handle) {98let color = Color::hsl(99((i as f32 * 2.345 + time.elapsed_secs()) * 100.0) % 360.0,1001.0,1010.5,102);103material.base_color = color;104}105}106}107108109