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