 db0d7698e2
			
		
	
	
		db0d7698e2
		
	
	
	
	
		
			
			# Objective - Fixes #6476 ## Solution - Return error instead of panic through `TryFrom` - ~~Add `.except()` in examples~~ - Add `.unwrap()` in examples
		
			
				
	
	
		
			167 lines
		
	
	
		
			4.6 KiB
		
	
	
	
		
			Rust
		
	
	
	
	
	
			
		
		
	
	
			167 lines
		
	
	
		
			4.6 KiB
		
	
	
	
		
			Rust
		
	
	
	
	
	
| //! Illustrates bloom configuration using HDR and emissive materials.
 | |
| 
 | |
| use bevy::{core_pipeline::bloom::BloomSettings, prelude::*};
 | |
| use std::{
 | |
|     collections::hash_map::DefaultHasher,
 | |
|     hash::{Hash, Hasher},
 | |
| };
 | |
| 
 | |
| fn main() {
 | |
|     App::new()
 | |
|         .add_plugins(DefaultPlugins)
 | |
|         .add_startup_system(setup_scene)
 | |
|         .add_system(update_bloom_settings)
 | |
|         .add_system(bounce_spheres)
 | |
|         .run();
 | |
| }
 | |
| 
 | |
| fn setup_scene(
 | |
|     mut commands: Commands,
 | |
|     mut meshes: ResMut<Assets<Mesh>>,
 | |
|     mut materials: ResMut<Assets<StandardMaterial>>,
 | |
|     asset_server: Res<AssetServer>,
 | |
| ) {
 | |
|     commands.spawn((
 | |
|         Camera3dBundle {
 | |
|             camera: Camera {
 | |
|                 hdr: true, // 1. HDR must be enabled on the camera
 | |
|                 ..default()
 | |
|             },
 | |
|             transform: Transform::from_xyz(-2.0, 2.5, 5.0).looking_at(Vec3::ZERO, Vec3::Y),
 | |
|             ..default()
 | |
|         },
 | |
|         BloomSettings::default(), // 2. Enable bloom for the camera
 | |
|     ));
 | |
| 
 | |
|     let material_emissive = materials.add(StandardMaterial {
 | |
|         emissive: Color::rgb_linear(5.2, 1.2, 0.8), // 3. Set StandardMaterial::emissive using Color::rgb_linear, for entities we want to apply bloom to
 | |
|         ..default()
 | |
|     });
 | |
|     let material_non_emissive = materials.add(StandardMaterial {
 | |
|         base_color: Color::GRAY,
 | |
|         ..default()
 | |
|     });
 | |
| 
 | |
|     let mesh = meshes.add(
 | |
|         shape::Icosphere {
 | |
|             radius: 0.5,
 | |
|             subdivisions: 5,
 | |
|         }
 | |
|         .try_into()
 | |
|         .unwrap(),
 | |
|     );
 | |
| 
 | |
|     for x in -10..10 {
 | |
|         for z in -10..10 {
 | |
|             let mut hasher = DefaultHasher::new();
 | |
|             (x, z).hash(&mut hasher);
 | |
|             let rand = hasher.finish() % 2 == 0;
 | |
| 
 | |
|             let material = if rand {
 | |
|                 material_emissive.clone()
 | |
|             } else {
 | |
|                 material_non_emissive.clone()
 | |
|             };
 | |
| 
 | |
|             commands.spawn((
 | |
|                 PbrBundle {
 | |
|                     mesh: mesh.clone(),
 | |
|                     material,
 | |
|                     transform: Transform::from_xyz(x as f32 * 2.0, 0.0, z as f32 * 2.0),
 | |
|                     ..default()
 | |
|                 },
 | |
|                 Bouncing,
 | |
|             ));
 | |
|         }
 | |
|     }
 | |
| 
 | |
|     commands.spawn(
 | |
|         TextBundle::from_section(
 | |
|             "",
 | |
|             TextStyle {
 | |
|                 font: asset_server.load("fonts/FiraMono-Medium.ttf"),
 | |
|                 font_size: 18.0,
 | |
|                 color: Color::BLACK,
 | |
|             },
 | |
|         )
 | |
|         .with_style(Style {
 | |
|             position_type: PositionType::Absolute,
 | |
|             position: UiRect {
 | |
|                 top: Val::Px(10.0),
 | |
|                 left: Val::Px(10.0),
 | |
|                 ..default()
 | |
|             },
 | |
|             ..default()
 | |
|         }),
 | |
|     );
 | |
| }
 | |
| 
 | |
| // ------------------------------------------------------------------------------------------------
 | |
| 
 | |
| fn update_bloom_settings(
 | |
|     mut camera: Query<&mut BloomSettings>,
 | |
|     mut text: Query<&mut Text>,
 | |
|     keycode: Res<Input<KeyCode>>,
 | |
|     time: Res<Time>,
 | |
| ) {
 | |
|     let mut bloom_settings = camera.single_mut();
 | |
|     let mut text = text.single_mut();
 | |
|     let text = &mut text.sections[0].value;
 | |
| 
 | |
|     *text = "BloomSettings\n".to_string();
 | |
|     text.push_str("-------------\n");
 | |
|     text.push_str(&format!("Threshold: {}\n", bloom_settings.threshold));
 | |
|     text.push_str(&format!("Knee: {}\n", bloom_settings.knee));
 | |
|     text.push_str(&format!("Scale: {}\n", bloom_settings.scale));
 | |
|     text.push_str(&format!("Intensity: {}\n", bloom_settings.intensity));
 | |
| 
 | |
|     text.push_str("\n\n");
 | |
| 
 | |
|     text.push_str("Controls (-/+)\n");
 | |
|     text.push_str("---------------\n");
 | |
|     text.push_str("Q/W - Threshold\n");
 | |
|     text.push_str("E/R - Knee\n");
 | |
|     text.push_str("A/S - Scale\n");
 | |
|     text.push_str("D/F - Intensity\n");
 | |
| 
 | |
|     let dt = time.delta_seconds();
 | |
| 
 | |
|     if keycode.pressed(KeyCode::Q) {
 | |
|         bloom_settings.threshold -= dt;
 | |
|     }
 | |
|     if keycode.pressed(KeyCode::W) {
 | |
|         bloom_settings.threshold += dt;
 | |
|     }
 | |
| 
 | |
|     if keycode.pressed(KeyCode::E) {
 | |
|         bloom_settings.knee -= dt;
 | |
|     }
 | |
|     if keycode.pressed(KeyCode::R) {
 | |
|         bloom_settings.knee += dt;
 | |
|     }
 | |
| 
 | |
|     if keycode.pressed(KeyCode::A) {
 | |
|         bloom_settings.scale -= dt;
 | |
|     }
 | |
|     if keycode.pressed(KeyCode::S) {
 | |
|         bloom_settings.scale += dt;
 | |
|     }
 | |
| 
 | |
|     if keycode.pressed(KeyCode::D) {
 | |
|         bloom_settings.intensity -= dt;
 | |
|     }
 | |
|     if keycode.pressed(KeyCode::F) {
 | |
|         bloom_settings.intensity += dt;
 | |
|     }
 | |
| }
 | |
| 
 | |
| #[derive(Component)]
 | |
| struct Bouncing;
 | |
| 
 | |
| fn bounce_spheres(time: Res<Time>, mut query: Query<&mut Transform, With<Bouncing>>) {
 | |
|     for mut transform in query.iter_mut() {
 | |
|         transform.translation.y =
 | |
|             (transform.translation.x + transform.translation.z + time.elapsed_seconds()).sin();
 | |
|     }
 | |
| }
 |