use bevy::math::FloatPow; use crate::config::planet::Planet; use crate::ecs::Part; use crate::prelude::*; use crate::server::system_sets::WorldUpdateSet; use crate::world_config::WorldConfigResource; pub fn newtonian_gravity_plugin(app: &mut App) { app.add_systems(Update, update_gravity.in_set(WorldUpdateSet)); } fn update_gravity( mut part_query: Query<(&Transform, &Mass, &mut ConstantForce), With>, planet_query: Query<(&Transform, &Mass), With>, world_config: Res, ) { let Some(world_config) = &world_config.config else { return; }; for (part_transform, part_mass, mut forces) in &mut part_query { *forces = ConstantForce::new(0.0, 0.0); let part_mass = part_mass.0; let part_translation = part_transform.translation; for (planet_transform, planet_mass) in &planet_query { let planet_mass = planet_mass.0; 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.x += direction.x; forces.y += direction.y; } } }