use crate::config::planet::Planet;
use crate::ecs::Part;
use crate::server::world_config::WorldConfigResource;
use bevy::math::FloatPow;
use bevy::prelude::*;
use bevy_rapier2d::prelude::*;
pub fn newtonian_gravity_plugin(app: &mut App) {
app.add_systems(Update, update_gravity);
}
fn update_gravity(
mut part_query: Query<
(
&Transform,
&ReadMassProperties,
&mut ExternalForce,
),
With<Part>,
>,
planet_query: Query<(&Transform, &ReadMassProperties), With<Planet>>,
world_config: Res<WorldConfigResource>,
) {
let Some(world_config) = &world_config.config else {
return;
};
for (part_transform, part_mass, mut forces) in &mut part_query {
let part_mass = part_mass.mass;
let part_translation = part_transform.translation;
debug!(?part_transform, "part transform");
for (planet_transform, planet_mass) in &planet_query {
let planet_mass = planet_mass.mass;
let planet_translation = planet_transform.translation;
let distance = planet_translation.distance(part_translation);
let force =
world_config.world.gravity * ((part_mass * planet_mass) / distance.squared());
let direction = (planet_translation - part_translation).normalize() * force;
forces.force += direction.xy();
}
}
}