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