diff --git a/README.md b/README.md deleted file mode 100644 index aef82d8..0000000 --- a/README.md +++ /dev/null @@ -1,19 +0,0 @@ -# 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/src/gen.rs b/src/gen.rs index ee57f63..32243d7 100644 --- a/src/gen.rs +++ b/src/gen.rs @@ -2,14 +2,28 @@ use bevy::{prelude::*, render::render_resource::PrimitiveTopology}; use opensimplex_noise_rs::OpenSimplexNoise; use rand::Rng; -pub fn _planet() -> Mesh { +pub fn planet() -> Mesh { let mut rng = rand::thread_rng(); - let _simplex = OpenSimplexNoise::new(Some(rng.gen())); + let simplex = OpenSimplexNoise::new(Some(rng.gen())); let mut mesh = Mesh::new(PrimitiveTopology::TriangleList); + let perimeter: u32 = 1000; mesh.insert_attribute( Mesh::ATTRIBUTE_POSITION, - vec![[0.0, 0.0, 0.0], [1.0, 0.0, 0.0], [0.0, 1.0, 0.0]], + (0..perimeter) + .map(|i| { + 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; + let a = std::f32::consts::TAU * i as f32 / perimeter as f32; + [r * a.cos(), r * a.sin(), 0.] + }) + .chain([[0., 0., 0.]].into_iter()) + .collect::>(), ); - mesh.set_indices(Some(bevy::render::mesh::Indices::U32(vec![0, 1, 2]))); + 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 } diff --git a/src/main.rs b/src/main.rs index 8ec9ad3..097c611 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,11 +1,14 @@ mod gen; +mod quadtree; -use bevy::{prelude::*, sprite::MaterialMesh2dBundle}; +use bevy::{ecs::query::BatchingStrategy, prelude::*, sprite::MaterialMesh2dBundle}; #[global_allocator] static ALLOCATOR: cap::Cap = cap::Cap::new(std::alloc::System, 1024 * 1024 * 1024); +static UNIVERSE_POS: (Vec2, Vec2) = (Vec2::new(-1e6, -1e6), Vec2::new(1e6, 1e6)); + fn main() { App::new() .add_plugins(( @@ -13,9 +16,16 @@ fn main() { bevy_fps_counter::FpsCounterPlugin, bevy_pancam::PanCamPlugin, )) + .insert_resource(Constants { g: 6.674e-11 }) .add_systems(Startup, setup) - .configure_sets(Update, (Set::Demo).chain()) - .add_systems(Update, (demo_system.in_set(Set::Demo),)) + .configure_sets(Update, (Set::Force, Set::Apply).chain()) + .add_systems( + Update, + ( + weight_system.in_set(Set::Force), + apply_system.in_set(Set::Apply), + ), + ) .run(); } @@ -28,34 +38,150 @@ fn setup( .spawn(Camera2dBundle::default()) .insert(bevy_pancam::PanCam::default()); - commands - .spawn(Ball { - pos: TransformBundle::from(Transform::from_translation(Vec3::new(0., 0., 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::ORANGE)), + commands.spawn(Planet { + mass: Mass(1.988e18), + speed: Speed(Vec2::new(0.0, 0.0)), + mesh: MaterialMesh2dBundle { + mesh: meshes.add(gen::planet()).into(), + material: materials.add(ColorMaterial::from(Color::YELLOW)), + transform: Transform::from_translation(Vec3::new(0., 0., 0.)), + ..default() + }, + }); + commands.spawn(Planet { + mass: Mass(5.9736e14), + speed: Speed(Vec2::new(0.0, 500.0)), + mesh: MaterialMesh2dBundle { + mesh: meshes.add(shape::Circle::new(10.).into()).into(), + material: materials.add(ColorMaterial::from(Color::BLUE)), + transform: Transform::from_translation(Vec3::new(400., 0., 0.)), + ..default() + }, + }); + commands.spawn(Planet { + mass: Mass(5.9736e14), + speed: Speed(Vec2::new(0.0, -500.0)), + mesh: MaterialMesh2dBundle { + mesh: meshes.add(shape::Circle::new(10.).into()).into(), + material: materials.add(ColorMaterial::from(Color::BLUE)), + transform: Transform::from_translation(Vec3::new(-400., 0., 0.)), + ..default() + }, + }); + for i in 0..4000u32 { + commands.spawn(Planet { + mass: Mass(1.), + speed: Speed(Vec2::new(0.0, -500.0)), + mesh: MaterialMesh2dBundle { + mesh: meshes.add(shape::Circle::new(5.).into()).into(), + material: materials.add(ColorMaterial::from(Color::RED)), + transform: Transform::from_translation(Vec3::new(-450. - i as f32 / 4., 0., 0.)), ..default() - }); + }, }); + } } #[derive(Clone, Debug, Eq, Hash, PartialEq, SystemSet)] enum Set { - Demo, + Force, + Apply, } +#[derive(Component)] +struct Speed(Vec2); + +#[derive(Component)] +struct Mass(f32); + #[derive(Bundle)] -struct Ball { - pos: TransformBundle, - visibility: InheritedVisibility, +struct Planet { + mass: Mass, + speed: Speed, + mesh: MaterialMesh2dBundle, } -fn demo_system(query: Query<&Transform>, time: Res