jupiters 0.0.3

Jupiter celestial simulation crate for the MilkyWay SolarSystem workspace
Documentation
use super::calendar::SECONDSPERDAY;

pub const JUPITERDAYSECONDS: f64 = 35730.0;

pub struct TimeScale {
    pub simulationtimes: f64,
    pub realtimes: f64,
    pub speedmultiplier: f64,
    pub paused: bool,
}

impl TimeScale {
    pub fn new(speedmultiplier: f64) -> Self {
        Self {
            simulationtimes: 0.0,
            realtimes: 0.0,
            speedmultiplier,
            paused: false,
        }
    }

    pub fn realtime() -> Self {
        Self::new(1.0)
    }

    pub fn fastforward(factor: f64) -> Self {
        Self::new(factor)
    }

    pub fn slowmotion(factor: f64) -> Self {
        Self::new(1.0 / factor)
    }

    pub fn step(&mut self, realdts: f64) {
        self.realtimes += realdts;
        if !self.paused {
            self.simulationtimes += realdts * self.speedmultiplier;
        }
    }

    pub fn pause(&mut self) {
        self.paused = true;
    }

    pub fn resume(&mut self) {
        self.paused = false;
    }

    pub fn togglepause(&mut self) {
        self.paused = !self.paused;
    }

    pub fn setspeed(&mut self, multiplier: f64) {
        self.speedmultiplier = multiplier;
    }

    pub fn simulationdt(&self, realdts: f64) -> f64 {
        if self.paused {
            0.0
        } else {
            realdts * self.speedmultiplier
        }
    }

    pub fn simhours(&self) -> f64 {
        self.simulationtimes / 3600.0
    }

    pub fn simdays(&self) -> f64 {
        self.simulationtimes / SECONDSPERDAY
    }

    pub fn simjupiterdays(&self) -> f64 {
        self.simulationtimes / JUPITERDAYSECONDS
    }

    pub fn simjupiteryears(&self) -> f64 {
        self.simulationtimes / (SECONDSPERDAY * 4332.59)
    }
}