Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
bevyengine
GitHub Repository: bevyengine/bevy
Path: blob/main/examples/large_scenes/bevy_city/src/assets.rs
9730 views
1
use bevy::{color::palettes::css::WHITE, prelude::*};
2
use rand::RngExt;
3
4
#[derive(Resource)]
5
pub struct CityAssets {
6
pub cars: Vec<Handle<Scene>>,
7
pub crossroad: Handle<Scene>,
8
pub road_straight: Handle<Scene>,
9
pub high_density: Buildings,
10
pub medium_density: Buildings,
11
pub low_density: Buildings,
12
pub ground_tile: (
13
Handle<Mesh>,
14
Handle<StandardMaterial>,
15
Handle<StandardMaterial>,
16
),
17
pub tree_small: Handle<Scene>,
18
pub tree_large: Handle<Scene>,
19
pub path_stones_long: Handle<Scene>,
20
pub fence: Handle<Scene>,
21
}
22
23
impl CityAssets {
24
pub fn get_random_car<R: RngExt>(&self, rng: &mut R) -> Handle<Scene> {
25
self.cars[rng.random_range(0..self.cars.len())].clone()
26
}
27
}
28
29
pub struct Buildings {
30
meshes: Vec<Handle<Mesh>>,
31
materials: Vec<Handle<StandardMaterial>>,
32
}
33
34
impl Buildings {
35
pub fn get_random_building<R: RngExt>(
36
&self,
37
rng: &mut R,
38
) -> (Mesh3d, MeshMaterial3d<StandardMaterial>) {
39
let mesh = self.meshes[rng.random_range(0..self.meshes.len())].clone();
40
let material = self.materials[rng.random_range(0..self.materials.len())].clone();
41
(Mesh3d(mesh), MeshMaterial3d(material))
42
}
43
}
44
45
pub fn load_assets(
46
mut commands: Commands,
47
asset_server: Res<AssetServer>,
48
mut materials: ResMut<Assets<StandardMaterial>>,
49
) {
50
let base_url = "https://github.com/bevyengine/bevy_asset_files/raw/main/kenney";
51
52
let cars = {
53
// TODO generate color variations
54
[
55
"hatchback-sports",
56
"suv",
57
"suv-luxury",
58
"sedan",
59
"sedan-sports",
60
"truck",
61
"truck-flat",
62
"van",
63
"delivery",
64
"delivery-flat",
65
"taxi",
66
"garbage-truck",
67
"ambulance",
68
"police",
69
"firetruck",
70
]
71
.iter()
72
.map(|t| {
73
asset_server
74
.load(GltfAssetLabel::Scene(0).from_asset(format!("{base_url}/car-kit/{t}.glb")))
75
})
76
.collect::<Vec<_>>()
77
};
78
79
let crossroad = asset_server.load(
80
GltfAssetLabel::Scene(0)
81
.from_asset(format!("{base_url}/city-kit-roads/road-crossroad-path.glb")),
82
);
83
let road_straight = asset_server.load(
84
GltfAssetLabel::Scene(0).from_asset(format!("{base_url}/city-kit-roads/road-straight.glb")),
85
);
86
87
let high_density = {
88
let materials = ["colormap", "variation-a", "variation-b"]
89
.iter()
90
.map(|variation| {
91
materials.add(StandardMaterial {
92
base_color_texture: Some(asset_server.load(format!(
93
"{base_url}/city-kit-commercial/Textures/{variation}.png"
94
))),
95
..Default::default()
96
})
97
})
98
.collect::<Vec<_>>();
99
100
let mut meshes = ["a", "b", "c", "d", "e"]
101
.iter()
102
.map(|t| {
103
asset_server.load(
104
GltfAssetLabel::Primitive {
105
mesh: 0,
106
primitive: 0,
107
}
108
.from_asset(format!(
109
"{base_url}/city-kit-commercial/building-skyscraper-{t}.glb"
110
)),
111
)
112
})
113
.collect::<Vec<_>>();
114
meshes.extend(["m", "l"].iter().map(|t| {
115
asset_server.load(
116
GltfAssetLabel::Primitive {
117
mesh: 0,
118
primitive: 0,
119
}
120
.from_asset(format!("{base_url}/city-kit-commercial/building-{t}.glb")),
121
)
122
}));
123
124
Buildings { meshes, materials }
125
};
126
127
let medium_density = {
128
let materials = ["colormap", "variation-a", "variation-b"]
129
.iter()
130
.map(|variation| {
131
materials.add(StandardMaterial {
132
base_color_texture: Some(asset_server.load(format!(
133
"{base_url}/city-kit-commercial/Textures/{variation}.png"
134
))),
135
..Default::default()
136
})
137
})
138
.collect::<Vec<_>>();
139
let meshes = ["a", "b", "c", "d", "f", "g", "h"]
140
.iter()
141
.map(|t| {
142
asset_server.load(
143
GltfAssetLabel::Primitive {
144
mesh: 0,
145
primitive: 0,
146
}
147
.from_asset(format!("{base_url}/city-kit-commercial/building-{t}.glb")),
148
)
149
})
150
.collect::<Vec<_>>();
151
152
Buildings { meshes, materials }
153
};
154
let low_density = {
155
let materials = ["colormap", "variation-a", "variation-b", "variation-c"]
156
.iter()
157
.map(|variation| {
158
materials.add(StandardMaterial {
159
base_color_texture: Some(asset_server.load(format!(
160
"{base_url}/city-kit-suburban/Textures/{variation}.png"
161
))),
162
..Default::default()
163
})
164
})
165
.collect::<Vec<_>>();
166
let meshes = ["b", "c", "d", "e", "f", "g", "h", "i", "k", "l", "o", "u"]
167
.iter()
168
.map(|t| {
169
asset_server.load(
170
GltfAssetLabel::Primitive {
171
mesh: 0,
172
primitive: 0,
173
}
174
.from_asset(format!(
175
"{base_url}/city-kit-suburban/building-type-{t}.glb"
176
)),
177
)
178
})
179
.collect::<Vec<_>>();
180
181
Buildings { meshes, materials }
182
};
183
184
let ground_tile = {
185
let mesh = asset_server.load(
186
GltfAssetLabel::Primitive {
187
mesh: 0,
188
primitive: 0,
189
}
190
.from_asset(format!("{base_url}/city-kit-roads/tile-low.glb")),
191
);
192
// TODO use this once https://github.com/bevyengine/bevy/pull/22943 is merged
193
// let default_material: Handle<StandardMaterial> = asset_server.load(format!(
194
// "ground_tile/tile-low.glb#{}/std",
195
// GltfAssetLabel::DefaultMaterial
196
// ));
197
let white_material = materials.add(StandardMaterial::from_color(WHITE));
198
let grass_material =
199
materials.add(StandardMaterial::from_color(Color::srgb_u8(97, 203, 139)));
200
201
(mesh, white_material, grass_material)
202
};
203
204
let tree_small: Handle<Scene> = asset_server.load(
205
GltfAssetLabel::Scene(0).from_asset(format!("{base_url}/city-kit-suburban/tree-small.glb")),
206
);
207
let tree_large: Handle<Scene> = asset_server.load(
208
GltfAssetLabel::Scene(0).from_asset(format!("{base_url}/city-kit-suburban/tree-large.glb")),
209
);
210
211
let path_stones_long: Handle<Scene> = asset_server.load(
212
GltfAssetLabel::Scene(0)
213
.from_asset(format!("{base_url}/city-kit-suburban/path-stones-long.glb")),
214
);
215
216
let fence: Handle<Scene> = asset_server.load(
217
GltfAssetLabel::Scene(0).from_asset(format!("{base_url}/city-kit-suburban/fence.glb")),
218
);
219
220
commands.insert_resource(CityAssets {
221
cars,
222
crossroad,
223
road_straight,
224
high_density,
225
medium_density,
226
low_density,
227
ground_tile,
228
tree_small,
229
tree_large,
230
path_stones_long,
231
fence,
232
});
233
}
234
235