diff --git a/README.md b/README.md index 44b1874..aef82d8 100644 --- a/README.md +++ b/README.md @@ -1,17 +1,19 @@ -## Feuille de route -* Créer deuxième planète -* Gravité naïve - * Vitesse - * Poids -* Faire un système solaire (trouver valeurs) -* Quadtree -* Réutiliser les mêmes Mesh et Material (augmente FPS en dézoom) -* Générer un mesh avec noise -* Générer plusieurs meshes -* (?) Collision - * Détection - * Double boucle naïve - * Intégré au quadtree - * Fusion simple - * Fragmentation - * Cratère +# Stage JSB : Simulation spatiale + +## Aide + +[Documentation de Bevy](https://docs.rs/bevy/latest/bevy/) + +## Commandes + +Vérifier la validité du code : + + cargo check + +Compiler et lancer le programme : + + cargo run + +Compiler et lancer le programme optimisé (plus lent à compiler, mais plus léger et rapide à exécuter) : + + cargo run --release diff --git a/build-wasm.sh b/build-wasm.sh deleted file mode 100644 index 857a29e..0000000 --- a/build-wasm.sh +++ /dev/null @@ -1,3 +0,0 @@ -cargo build --release --target wasm32-unknown-unknown || exit 1 -echo "==> wasm-bindgen..." -wasm-bindgen --out-name jsb-gravity --out-dir target --target web target/wasm32-unknown-unknown/release/jsb-gravity.wasm || exit 1 diff --git a/index.html b/index.html deleted file mode 100644 index fe9cb7d..0000000 --- a/index.html +++ /dev/null @@ -1,32 +0,0 @@ - - - - - JSB Gravity - - - - Canvas did not load. - - - diff --git a/src/gen.rs b/src/gen.rs index 1a76b24..ee57f63 100644 --- a/src/gen.rs +++ b/src/gen.rs @@ -2,40 +2,14 @@ use bevy::{prelude::*, render::render_resource::PrimitiveTopology}; use opensimplex_noise_rs::OpenSimplexNoise; use rand::Rng; -/// Générer une planète -pub fn planet() -> Mesh { - // Initialiser l'aléatoire +pub fn _planet() -> Mesh { let mut rng = rand::thread_rng(); - let simplex = OpenSimplexNoise::new(Some(rng.gen())); - - // Créer un mesh vide + let _simplex = OpenSimplexNoise::new(Some(rng.gen())); let mut mesh = Mesh::new(PrimitiveTopology::TriangleList); - - let perimeter: u32 = 1000; - - // Ajouter des points dans le mesh mesh.insert_attribute( Mesh::ATTRIBUTE_POSITION, - (0..perimeter) - .map(|i| { - // Rayon - let mut r = simplex.eval_2d(i as f64 * 0.02, 0.) as f32 * 20.0 + 100.0; - r += simplex.eval_2d(i as f64 * 0.05, 10.) as f32 * 10.0; - r += simplex.eval_2d(i as f64 * 0.2, 10.) as f32 * 4.0; - // Angle - let a = std::f32::consts::TAU * i as f32 / perimeter as f32; - // Coordonnées du point - [r * a.cos(), r * a.sin(), 0.] - }) - .chain([[0., 0., 0.]]) - .collect::>(), + vec![[0.0, 0.0, 0.0], [1.0, 0.0, 0.0], [0.0, 1.0, 0.0]], ); - - // Ajouter des triangles en indiquant quels points (de ceux définis juste avant) doivent être reliés - let mut triangles = Vec::new(); - for i in 0..perimeter { - triangles.extend_from_slice(&[i, perimeter, (i + 1) % perimeter]); - } - mesh.set_indices(Some(bevy::render::mesh::Indices::U32(triangles))); + mesh.set_indices(Some(bevy::render::mesh::Indices::U32(vec![0, 1, 2]))); mesh } diff --git a/src/main.rs b/src/main.rs index 60465a6..8ec9ad3 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,21 +1,11 @@ mod gen; -mod quadtree; -use bevy::{ - ecs::query::BatchingStrategy, - prelude::*, - sprite::{MaterialMesh2dBundle, Mesh2dHandle}, -}; +use bevy::{prelude::*, sprite::MaterialMesh2dBundle}; -/// Empêche les fuites mémoire, arrête tout à 1 Go #[global_allocator] static ALLOCATOR: cap::Cap = cap::Cap::new(std::alloc::System, 1024 * 1024 * 1024); -/// Ces deux points définissent le rectangle contenant tout l'univers -static UNIVERSE_POS: (Vec2, Vec2) = (Vec2::new(-1e6, -1e6), Vec2::new(1e6, 1e6)); - -/// Cette fonction est l'entrée du programme fn main() { App::new() .add_plugins(( @@ -23,228 +13,49 @@ fn main() { bevy_fps_counter::FpsCounterPlugin, bevy_pancam::PanCamPlugin, )) - .insert_resource(Constants { g: 6.674e-11 }) .add_systems(Startup, setup) - .configure_sets(Update, (Set::Force, Set::Apply).chain()) - .add_systems( - Update, - ( - weight_system.in_set(Set::Force), - apply_system.in_set(Set::Apply), - ), - ) + .configure_sets(Update, (Set::Demo).chain()) + .add_systems(Update, (demo_system.in_set(Set::Demo),)) .run(); } -/// Cette fonction est appelée à l'initialisation du jeu, par main fn setup( mut commands: Commands, mut meshes: ResMut>, mut materials: ResMut>, ) { - // Créer une caméra qui filme ce qu'on va afficher à l'écran commands .spawn(Camera2dBundle::default()) .insert(bevy_pancam::PanCam::default()); - let red = materials.add(ColorMaterial::from(Color::RED)); - let circle_5: Mesh2dHandle = meshes.add(shape::Circle::new(5.).into()).into(); - - // Créer des planètes commands - .spawn(Planet { + .spawn(Ball { pos: TransformBundle::from(Transform::from_translation(Vec3::new(0., 0., 0.))), - mass: Mass(1.988e18), - speed: Speed(Vec2::new(0.0, 0.0)), - visibility: InheritedVisibility::VISIBLE, - }) - .with_children(|parent| { - parent.spawn(MaterialMesh2dBundle { - mesh: meshes.add(gen::planet()).into(), - material: materials.add(ColorMaterial::from(Color::YELLOW)), - ..default() - }); - }); - commands - .spawn(Planet { - pos: TransformBundle::from(Transform::from_translation(Vec3::new(400., 0., 0.))), - mass: Mass(5.9736e14), - speed: Speed(Vec2::new(0.0, 500.0)), visibility: InheritedVisibility::VISIBLE, }) .with_children(|parent| { parent.spawn(MaterialMesh2dBundle { mesh: meshes.add(shape::Circle::new(10.).into()).into(), - material: materials.add(ColorMaterial::from(Color::BLUE)), + material: materials.add(ColorMaterial::from(Color::ORANGE)), ..default() }); }); - commands - .spawn(Planet { - pos: TransformBundle::from(Transform::from_translation(Vec3::new(-400., 0., 0.))), - mass: Mass(5.9736e14), - speed: Speed(Vec2::new(0.0, -500.0)), - visibility: InheritedVisibility::VISIBLE, - }) - .with_children(|parent| { - parent.spawn(MaterialMesh2dBundle { - mesh: meshes.add(shape::Circle::new(10.).into()).into(), - material: materials.add(ColorMaterial::from(Color::BLUE)), - ..default() - }); - }); - // Créer plein de planètes ! - for i in 0..4000u32 { - commands - .spawn(Planet { - pos: TransformBundle::from(Transform::from_translation(Vec3::new( - -450. - i as f32 / 4., - 0., - 0., - ))), - mass: Mass(1.), - speed: Speed(Vec2::new(0.0, -500.0)), - visibility: InheritedVisibility::VISIBLE, - }) - .with_children(|parent| { - parent.spawn(MaterialMesh2dBundle { - mesh: circle_5.clone(), - material: red.clone(), - ..default() - }); - }); - } } -/// Un set est un ensemble de systèmes. -/// Chaque système est dans un set, ici Force ou Apply. -/// Les sets sont exécutés dans un certain ordre (défini dans main) #[derive(Clone, Debug, Eq, Hash, PartialEq, SystemSet)] enum Set { - /// Systèmes modélisant des forces (poids, champ électrique, rebonds...), donc changeant la vitesse des objets - Force, - /// Systèmes appliquant les forces, donc changeant la position des objets selon leur vitesse - Apply, + Demo, } -/// Une vitesse (x, y) en m/s -#[derive(Component)] -struct Speed(Vec2); - -/// Une masse en kg -#[derive(Component)] -struct Mass(f32); - -/// Une planète #[derive(Bundle)] -struct Planet { - /// Position du centre de la planète +struct Ball { pos: TransformBundle, - /// Masse de la planète - mass: Mass, - /// Vitesse de la planète - speed: Speed, visibility: InheritedVisibility, } -/// Constantes physiques -#[derive(Resource)] -struct Constants { - /// Constante gravitationnelle - g: f32, -} - -/// Corps. Sert à utiliser le quadtree -struct Body { - mass: f32, - pos: Vec2, -} - -/// On implémente le trait Body pour la struct Body. -/// C'est-à-dire qu'on ajoute à la struct Body l'information qu'elle se comporte comme un corps. -/// On lui ajoute les méthodes (fonctions) d'un corps. -impl quadtree::Body for Body { - fn mass(&self) -> f32 { - self.mass - } - fn pos(&self) -> Vec2 { - self.pos - } - fn add_mass(&mut self, mass: f32) { - self.mass += mass; +fn demo_system(query: Query<&Transform>, time: Res