From 18d91b33562bafd29c848910859ce14180512337 Mon Sep 17 00:00:00 2001 From: ghostly_zsh Date: Sat, 29 Nov 2025 13:25:04 -0600 Subject: [PATCH] fix: orbit prediction actually follows hill spheres --- crates/unified/src/client/starguide/orbit.rs | 32 ++++++++++++-------- 1 file changed, 20 insertions(+), 12 deletions(-) diff --git a/crates/unified/src/client/starguide/orbit.rs b/crates/unified/src/client/starguide/orbit.rs index 262c9b57b952f2dc7908abe2a6c27aa29852b633..407a2d60c672d4244bcc46e0399e8ba1caea5097 100644 --- a/crates/unified/src/client/starguide/orbit.rs +++ b/crates/unified/src/client/starguide/orbit.rs @@ -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;