//! 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() .insert_resource(AmbientLight::NONE) .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::srgb(0.25, 0.25, 0.25), 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: Srgba::hex("28221B").unwrap().into(), 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(Cuboid::new(1.0, 3.0, 1.0)), material: stone.clone(), transform: Transform::from_xyz(*x, 1.5, *z), ..default() }); } // orb commands.spawn(( PbrBundle { mesh: meshes.add(Sphere::default()), material: materials.add(StandardMaterial { base_color: Srgba::hex("126212CC").unwrap().into(), 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 half_size = i as f32 / 2.0 + 3.0; let y = -i as f32 / 2.0; commands.spawn(PbrBundle { mesh: meshes.add(Cuboid::new(2.0 * half_size, 0.5, 2.0 * half_size)), material: stone.clone(), transform: Transform::from_xyz(0.0, y + 0.25, 0.0), ..default() }); } // sky commands.spawn(PbrBundle { mesh: meshes.add(Cuboid::new(2.0, 1.0, 1.0)), material: materials.add(StandardMaterial { base_color: Srgba::hex("888888").unwrap().into(), 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 { 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