Moved level creation into its own module. Rocks and track control points are now created together, including a first pass at make them work together as a level.
WJUQ6XL5O3OAXRXK5744AQ4CTTO33LZE5G2WJU7XCSRKFCGJ2F3QC KBRPBNDCPWA63T2TRQTWWHOHPDXCLSVP7WGPUJKGYJ4RLXNBZBYQC 3WQ5QOBGRJNWTTRRNOAEQH6FM6LJGMJ6KYBVC4OZIBBKB6DVCYXAC 3DPJX5VJ4MAWJZDPIQUECTBN47RRKSBAQZKINUJMTRKQ3YPPYNFAC KDUAVWRKNFIX4AMHALKW4SHGGB26JJ4BVOL4LVB63V7IADIXNKWQC M25YKIY2JP6OEYV2AXC6PBHDU36AFR5ELCRC5HGRPVV4HKK4URLAC YA64LETHZUTXO3KLY6FD7CRQHGCVF5JMBBRMRETPRYV5DBJWWJOAC 7FY3BW7JRAG6T66QQTJEX4F3FPDYPPO2JCR2RAMA65D6HCUIL3YAC 43N4PVKE6I5J6DSCYTW2JYOIKLZ7PN7HNLHK4JNT7L23FZDIARSAC use bevy::prelude::*;let mut r = thread_rng();}}for _ in 0..100 {commands.spawn(SceneBundle {scene: rock.clone(),transform: Transform::from_xyz((-0.5 + r.gen::<f32>()) * 100.0,(-0.5 + r.gen::<f32>()) * 100.0,(-0.5 + r.gen::<f32>()) * 100.0,).with_scale(r.gen::<f32>() * Vec3::splat(3.0)),..default()});pub fn scatter(mut commands: Commands, assets: ResMut<AssetServer>) {let rock = assets.load("Rock 1.glb#Scene0");use rand::{thread_rng, Rng};
use crate::track::Track;use bevy::{math::{cubic_splines::CubicCurve, vec3},prelude::*,render::{mesh::{Indices, PrimitiveTopology},render_asset::RenderAssetUsages,texture::{ImageAddressMode, ImageLoaderSettings, ImageSampler, ImageSamplerDescriptor},},};use std::f32::consts::PI;use rand::{thread_rng, Rng};#[derive(Debug, Clone, Copy, PartialEq, Eq)]enum Cube {Rock,Ring,Empty,}pub fn build_level(mut commands: Commands,assets: ResMut<AssetServer>,mut meshes: ResMut<Assets<Mesh>>,mut images: ResMut<Assets<Image>>,mut mat: ResMut<Assets<StandardMaterial>>,) {let mut model: [[[Cube; 10]; 10]; 10] = [[[Cube::Empty; 10]; 10]; 10];let mut rocks_ct = 300;let rock = assets.load("Rock 1.glb#Scene0");let mut r = thread_rng();while rocks_ct > 0 {let (x, y, z) = (r.gen_range(0..10), r.gen_range(0..10), r.gen_range(0..10));if model[x][y][z] == Cube::Empty {rocks_ct -= 1;model[x][y][z] = Cube::Rock;}}let mut curve_points = vec![Vec3::new(0.0, 0.0, -10.0), Vec3::new(0.0, 0.0, -20.0)];for _ in 0..8 {let point = vec3((-0.5 + r.gen::<f32>()) * 100.0,(-0.5 + r.gen::<f32>()) * 100.0,(-0.5 + r.gen::<f32>()) * 100.0,);let p2 = point.clone();model[((p2.x / 10.0).round() + 4.5) as usize][((p2.y / 10.0).round() + 4.5) as usize][((p2.z / 10.0).round() + 4.5) as usize] = Cube::Ring;curve_points.push(point);}for i in 0..10 {for j in 0..10 {for k in 0..10 {if model[i][j][k] == Cube::Rock {commands.spawn(SceneBundle {scene: rock.clone(),transform: Transform::from_xyz((-5.0 + i as f32) * 20.0,(-5.0 + j as f32) * 20.0,(-5.0 + k as f32) * 20.0,).with_scale(r.gen::<f32>() * Vec3::splat(3.0)),..default()});}}}}// set up track.let texture_handle = assets.load_with_settings("checkerboard_albedo.png", |s: &mut _| {*s = ImageLoaderSettings {sampler: ImageSampler::Descriptor(ImageSamplerDescriptor {// rewriting mode to repeat image,address_mode_u: ImageAddressMode::Repeat,address_mode_v: ImageAddressMode::Repeat,..default()}),..default()}});let track = Track::new(curve_points, 1.0, 16, 200);let mesh = track.mesh();let mut texture_mat = StandardMaterial::default();texture_mat.base_color_texture = Some(texture_handle.clone());commands.spawn(PbrBundle {mesh: meshes.add(mesh),material: mat.add(texture_mat),..default()});}