Path: blob/main/examples/large_scenes/bevy_city/src/settings.rs
30636 views
use bevy::{1camera::visibility::NoCpuCulling,2camera_controller::free_camera::FreeCameraState,3feathers::{4self,5controls::{FeathersButton, FeathersCheckbox},6theme::{ThemeBackgroundColor, ThemedText},7},8pbr::wireframe::WireframeConfig,9prelude::*,10ui::Checked,11ui_widgets::{checkbox_self_update, Activate, ValueChange},12};13use rand::RngExt;1415use crate::assets::CityAssets;16use crate::generate_city::{spawn_city, CityRoot};1718#[derive(Resource)]19pub struct Settings {20pub simulate_cars: bool,21pub shadow_maps_enabled: bool,22pub contact_shadows_enabled: bool,23pub wireframe_enabled: bool,24pub cpu_culling: bool,25}2627impl Default for Settings {28fn default() -> Self {29Self {30simulate_cars: true,31shadow_maps_enabled: true,32contact_shadows_enabled: true,33wireframe_enabled: false,34cpu_culling: true,35}36}37}3839pub fn settings_ui() -> impl Scene {40bsn! {41Node {42position_type: PositionType::Absolute,43top: px(10),44right: px(10),45padding: px(8),46}47ThemeBackgroundColor(feathers::tokens::WINDOW_BG)48on(|_: On<Pointer<Over>>, mut free_camera_state: Single<&mut FreeCameraState>| {49free_camera_state.enabled = false;50})51on(|_: On<Pointer<Out>>, mut free_camera_state: Single<&mut FreeCameraState>| {52free_camera_state.enabled = true;53})54Children [(55Node {56display: Display::Flex,57flex_direction: FlexDirection::Column,58align_items: AlignItems::Stretch,59justify_content: JustifyContent::Start,60row_gap: px(8),61}62Children [63Text("Settings"),64(65@FeathersCheckbox {66@caption: {bsn! { Text("Simulate Cars") ThemedText }}67}68Checked69on(checkbox_self_update)70on(|change: On<ValueChange<bool>>, mut settings: ResMut<Settings>| {71settings.simulate_cars = change.value;72})73),74(75@FeathersCheckbox {76@caption: {bsn! { Text("Shadow maps enabled") ThemedText }}77}78Checked79on(checkbox_self_update)80on(81|change: On<ValueChange<bool>>,82mut settings: ResMut<Settings>,83mut directional_lights: Query<&mut DirectionalLight>| {84settings.shadow_maps_enabled = change.value;85for mut light in &mut directional_lights {86light.shadow_maps_enabled = change.value;8788}89}90)91),92(93@FeathersCheckbox {94@caption: {bsn! { Text("Contact shadows enabled") ThemedText }}95}96Checked97on(checkbox_self_update)98on(99|change: On<ValueChange<bool>>,100mut settings: ResMut<Settings>,101mut directional_lights: Query<&mut DirectionalLight>| {102settings.contact_shadows_enabled = change.value;103for mut light in &mut directional_lights {104light.contact_shadows_enabled = change.value;105106}107}108)109),110(111@FeathersCheckbox {112@caption: {bsn! { Text("Wireframe Enabled") ThemedText }}113}114on(checkbox_self_update)115on(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(125@FeathersCheckbox {126@caption: {bsn! { Text("CPU culling") ThemedText }}127}128Checked129on(checkbox_self_update)130on(131|change: On<ValueChange<bool>>,132mut settings: ResMut<Settings>,133mut commands: Commands,134meshes: Query<Entity, With<Mesh3d>>| {135settings.cpu_culling = change.value;136137for entity in meshes.iter() {138if settings.cpu_culling {139commands.entity(entity).remove::<NoCpuCulling>();140} else {141commands.entity(entity).insert(NoCpuCulling);142}143}144}145)146),147(148@FeathersButton {149@caption: {bsn! { Text("Regenerate City") ThemedText }}150}151on(152|_activate: On<Activate>,153mut commands: Commands,154city_root: Single<Entity, With<CityRoot>>,155assets: Res<CityAssets>| {156commands.entity(*city_root).despawn();157158let mut rng = rand::rng();159let seed = rng.random::<u64>();160println!("new seed: {seed}");161spawn_city(&mut commands, &assets, seed, 32);162}163)164),165]166)]167}168}169170171