//! This interactive example shows how to use distance fog, //! and allows playing around with different fog settings. //! //! ## Controls //! //! | Key Binding | Action | //! |:-------------------|:------------------------------------| //! | `1` / `2` / `3` | Fog Falloff Mode | //! | `A` / `S` | Move Start Distance (Linear Fog) | //! | | Change Density (Exponential Fogs) | //! | `Z` / `X` | Move End Distance (Linear Fog) | //! | `-` / `=` | Adjust Fog Red Channel | //! | `[` / `]` | Adjust Fog Green Channel | //! | `;` / `'` | Adjust Fog Blue Channel | //! | `.` / `?` | Adjust Fog Alpha Channel | use bevy::{ pbr::{NotShadowCaster, NotShadowReceiver}, prelude::*, }; fn main() { App::new() .add_plugins(DefaultPlugins) .add_systems( Startup, (setup_camera_fog, setup_pyramid_scene, setup_instructions), ) .add_systems(Update, update_system) .run(); } fn setup_camera_fog(mut commands: Commands) { commands.spawn(( Camera3dBundle::default(), FogSettings { color: Color::rgba(0.25, 0.25, 0.25, 1.0), falloff: FogFalloff::Linear { start: 5.0, end: 20.0, }, ..default() }, )); } fn setup_pyramid_scene( mut commands: Commands, mut meshes: ResMut>, mut materials: ResMut>, ) { let stone = materials.add(StandardMaterial { base_color: Color::hex("28221B").unwrap(), perceptual_roughness: 1.0, ..default() }); // pillars for (x, z) in &[(-1.5, -1.5), (1.5, -1.5), (1.5, 1.5), (-1.5, 1.5)] { commands.spawn(PbrBundle { mesh: meshes.add(Mesh::from(shape::Box { min_x: -0.5, max_x: 0.5, min_z: -0.5, max_z: 0.5, min_y: 0.0, max_y: 3.0, })), material: stone.clone(), transform: Transform::from_xyz(*x, 0.0, *z), ..default() }); } // orb commands.spawn(( PbrBundle { mesh: meshes.add(Mesh::try_from(shape::Icosphere::default()).unwrap()), material: materials.add(StandardMaterial { base_color: Color::hex("126212CC").unwrap(), reflectance: 1.0, perceptual_roughness: 0.0, metallic: 0.5, alpha_mode: AlphaMode::Blend, ..default() }), transform: Transform::from_scale(Vec3::splat(1.75)) .with_translation(Vec3::new(0.0, 4.0, 0.0)), ..default() }, NotShadowCaster, NotShadowReceiver, )); // steps for i in 0..50 { let size = i as f32 / 2.0 + 3.0; let y = -i as f32 / 2.0; commands.spawn(PbrBundle { mesh: meshes.add(Mesh::from(shape::Box { min_x: -size, max_x: size, min_z: -size, max_z: size, min_y: 0.0, max_y: 0.5, })), material: stone.clone(), transform: Transform::from_xyz(0.0, y, 0.0), ..default() }); } // sky commands.spawn(PbrBundle { mesh: meshes.add(Mesh::from(shape::Box::default())), material: materials.add(StandardMaterial { base_color: Color::hex("888888").unwrap(), unlit: true, cull_mode: None, ..default() }), transform: Transform::from_scale(Vec3::splat(1_000_000.0)), ..default() }); // light commands.spawn(PointLightBundle { transform: Transform::from_xyz(0.0, 1.0, 0.0), point_light: PointLight { intensity: 1500., range: 100., shadows_enabled: true, ..default() }, ..default() }); } fn setup_instructions(mut commands: Commands) { commands.spawn( TextBundle::from_section( "", TextStyle { font_size: 20.0, ..default() }, ) .with_style(Style { position_type: PositionType::Absolute, top: Val::Px(12.0), left: Val::Px(12.0), ..default() }), ); } fn update_system( mut camera: Query<(&mut FogSettings, &mut Transform)>, mut text: Query<&mut Text>, time: Res