pub struct TimeScale {
pub simulation_time_s: f64,
pub real_time_s: f64,
pub speed_multiplier: f64,
pub paused: bool,
}
impl Default for TimeScale {
fn default() -> Self {
Self::new()
}
}
impl TimeScale {
pub fn new() -> Self {
Self {
simulation_time_s: 0.0,
real_time_s: 0.0,
speed_multiplier: crate::SOL_S,
paused: false,
}
}
pub fn realtime() -> Self {
Self {
simulation_time_s: 0.0,
real_time_s: 0.0,
speed_multiplier: 1.0,
paused: false,
}
}
pub fn fast_forward(factor: f64) -> Self {
Self {
simulation_time_s: 0.0,
real_time_s: 0.0,
speed_multiplier: factor,
paused: false,
}
}
pub fn step(&mut self, real_dt_s: f64) {
self.real_time_s += real_dt_s;
if !self.paused {
self.simulation_time_s += real_dt_s * self.speed_multiplier;
}
}
pub fn simulation_dt(&self, real_dt_s: f64) -> f64 {
if self.paused {
0.0
} else {
real_dt_s * self.speed_multiplier
}
}
pub fn pause(&mut self) {
self.paused = true;
}
pub fn resume(&mut self) {
self.paused = false;
}
pub fn toggle_pause(&mut self) {
self.paused = !self.paused;
}
pub fn set_speed(&mut self, multiplier: f64) {
self.speed_multiplier = multiplier;
}
pub fn sim_sols(&self) -> f64 {
self.simulation_time_s / crate::SOL_S
}
pub fn sim_mars_years(&self) -> f64 {
self.simulation_time_s / crate::MARS_YEAR_S
}
}