~starkingdoms/starkingdoms

18d91b33562bafd29c848910859ce14180512337 — ghostly_zsh 16 days ago 6516d7c
fix: orbit prediction actually follows hill spheres
1 files changed, 20 insertions(+), 12 deletions(-)

M crates/unified/src/client/starguide/orbit.rs
M crates/unified/src/client/starguide/orbit.rs => crates/unified/src/client/starguide/orbit.rs +20 -12
@@ 1,4 1,4 @@
use std::{f32::consts::PI, ops::Range};
use std::{f32::{self, consts::PI}, ops::Range};

use bevy::window::WindowResized;



@@ 30,24 30,32 @@ fn update_orbits(
    let Projection::Orthographic(ref projection) = camera.2.clone() else { return };
    //image.clear(&(Color::BLACK.to_srgba().to_u8_array()));

    let mut p_mass = 0.0;
    let mut p_transform = Transform::default();
    let mut p_mass = None;
    let mut p_transform = None;
    let (sun_mass, _, sun_transform) = planets.iter().filter(|planet| planet.1.name == "Sun").next().unwrap();
    let mut closest = f32::INFINITY;
    for (mass, planet, transform) in planets {
        if planet.name == "Sun" { continue }

        let a = sun_transform.translation - transform.translation;
        let hill_sphere = a.length()*(mass.0/(3.0*(sun_mass.0+mass.0))).powf(1.0/3.0);
        if hill_sphere > (me.0.translation - transform.translation).length() {
            p_mass = mass.0;
            p_transform = *transform;
            break;
        let (other_mass, p, other_transform) = planets.iter().filter(|f_planet| f_planet.1.name == planet.orbit.clone().unwrap().orbiting).next().unwrap();
        let a = other_transform.translation - transform.translation;
        let hill_sphere = a.length()*(mass.0/(3.0*(other_mass.0+mass.0))).powf(1.0/3.0);

        gizmos.circle_2d(transform.translation.truncate(), hill_sphere, Color::linear_rgb(0.02, 0.02, 0.02));

        let rel_dist = (me.0.translation - transform.translation).length();
        if rel_dist < closest && hill_sphere > rel_dist {
            p_mass = Some(mass.0);
            p_transform = Some(*transform);
            closest = rel_dist;
        }
    }
    if p_mass == 0.0 {
        p_mass = sun_mass.0;
        p_transform = *sun_transform;
    if p_mass.is_none()  {
        p_mass = Some(sun_mass.0);
        p_transform = Some(*sun_transform);
    }
    let p_mass = p_mass.unwrap();
    let p_transform = p_transform.unwrap();

    // orbit magic
    let rel_pos = me.0.translation - p_transform.translation;