~starkingdoms/starkingdoms

ref: 4ccbefd5580d250ce9105d94129613957cdb1c0d starkingdoms/crates/unified/src/server/gravity.rs -rw-r--r-- 1.4 KiB
4ccbefd5 — core chore(fmt,lint): pass clippy 5 months ago
                                                                                
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
use crate::config::planet::Planet;
use crate::ecs::Part;
use crate::server::system_sets::WorldUpdateSet;
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.in_set(WorldUpdateSet));
}

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 {
        forces.force = Vec2::ZERO;
        forces.torque = 0.0;

        let part_mass = part_mass.mass;
        let part_translation = part_transform.translation;

        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();
        }
    }
}