Path: blob/main/examples/large_scenes/bevy_city/src/settings.rs
9730 views
use bevy::{1camera_controller::free_camera::FreeCameraState,2feathers::{3self,4controls::{button, checkbox, ButtonProps},5theme::{ThemeBackgroundColor, ThemedText},6},7pbr::wireframe::WireframeConfig,8prelude::*,9ui::Checked,10ui_widgets::{checkbox_self_update, observe, Activate, ValueChange},11};12use rand::RngExt;1314use crate::assets::CityAssets;15use crate::generate_city::{spawn_city, CityRoot};1617#[derive(Resource)]18pub struct Settings {19pub simulate_cars: bool,20pub shadow_maps_enabled: bool,21pub contact_shadows_enabled: bool,22pub wireframe_enabled: bool,23}2425impl Default for Settings {26fn default() -> Self {27Self {28simulate_cars: true,29shadow_maps_enabled: true,30contact_shadows_enabled: true,31wireframe_enabled: false,32}33}34}3536pub fn setup_settings_ui(mut commands: Commands) {37commands.spawn((38Node {39position_type: PositionType::Absolute,40top: Val::Px(10.0),41right: Val::Px(10.0),42padding: UiRect::all(Val::Px(8.0)),43..default()44},45ThemeBackgroundColor(feathers::tokens::WINDOW_BG),46observe(47|_: On<Pointer<Over>>, mut free_camera_state: Single<&mut FreeCameraState>| {48free_camera_state.enabled = false;49},50),51observe(52|_: On<Pointer<Out>>, mut free_camera_state: Single<&mut FreeCameraState>| {53free_camera_state.enabled = true;54},55),56children![(57Node {58display: Display::Flex,59flex_direction: FlexDirection::Column,60align_items: AlignItems::Stretch,61justify_content: JustifyContent::Start,62row_gap: px(8),63..default()64},65children![66(Text("Settings".to_owned())),67(68checkbox(Checked, Spawn((Text::new("Simulate Cars"), ThemedText))),69observe(checkbox_self_update),70observe(71|change: On<ValueChange<bool>>, mut settings: ResMut<Settings>| {72settings.simulate_cars = change.value;73}74)75),76(77checkbox(78Checked,79Spawn((Text::new("Shadow maps enabled"), ThemedText))80),81observe(checkbox_self_update),82observe(83|change: On<ValueChange<bool>>,84mut settings: ResMut<Settings>,85mut directional_lights: Query<&mut DirectionalLight>| {86settings.shadow_maps_enabled = change.value;87for mut light in &mut directional_lights {88light.shadow_maps_enabled = change.value;8990}91}92)93),94(95checkbox(96Checked,97Spawn((Text::new("Contact shadows enabled"), ThemedText))98),99observe(checkbox_self_update),100observe(101|change: On<ValueChange<bool>>,102mut settings: ResMut<Settings>,103mut directional_lights: Query<&mut DirectionalLight>| {104settings.contact_shadows_enabled = change.value;105for mut light in &mut directional_lights {106light.contact_shadows_enabled = change.value;107108}109}110)111),112(113checkbox((), Spawn((Text::new("Wireframe Enabled"), ThemedText))),114observe(checkbox_self_update),115observe(116|change: On<ValueChange<bool>>,117mut settings: ResMut<Settings>,118mut wireframe_config: ResMut<WireframeConfig>| {119settings.wireframe_enabled = change.value;120wireframe_config.global = change.value;121}122)123),124(125button(126ButtonProps::default(),127(),128Spawn((Text::new("Regenerate City"), ThemedText))129),130observe(131|_activate: On<Activate>,132mut commands: Commands,133city_root: Single<Entity, With<CityRoot>>,134assets: Res<CityAssets>| {135commands.entity(*city_root).despawn();136137let mut rng = rand::rng();138let seed = rng.random::<u64>();139println!("new seed: {seed}");140spawn_city(&mut commands, &assets, seed, 32);141}142)143),144]145)],146));147}148149150