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