//! 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::{ math::ops, 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(( Camera3d::default(), DistanceFog { 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(( Mesh3d(meshes.add(Cuboid::new(1.0, 3.0, 1.0))), MeshMaterial3d(stone.clone()), Transform::from_xyz(*x, 1.5, *z), )); } // orb commands.spawn(( Mesh3d(meshes.add(Sphere::default())), MeshMaterial3d(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::from_scale(Vec3::splat(1.75)).with_translation(Vec3::new(0.0, 4.0, 0.0)), 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(( Mesh3d(meshes.add(Cuboid::new(2.0 * half_size, 0.5, 2.0 * half_size))), MeshMaterial3d(stone.clone()), Transform::from_xyz(0.0, y + 0.25, 0.0), )); } // sky commands.spawn(( Mesh3d(meshes.add(Cuboid::new(2.0, 1.0, 1.0))), MeshMaterial3d(materials.add(StandardMaterial { base_color: Srgba::hex("888888").unwrap().into(), unlit: true, cull_mode: None, ..default() })), Transform::from_scale(Vec3::splat(1_000_000.0)), )); // light commands.spawn(( PointLight { shadows_enabled: true, ..default() }, Transform::from_xyz(0.0, 1.0, 0.0), )); } fn setup_instructions(mut commands: Commands) { commands.spawn(( Text::default(), Style { position_type: PositionType::Absolute, top: Val::Px(12.0), left: Val::Px(12.0), ..default() }, )); } fn update_system( camera: Single<(&mut DistanceFog, &mut Transform)>, mut text: Single<&mut Text>, time: Res