use crate::ecs::SimTiming;
#[derive(Debug, Clone, Copy)]
pub(crate) struct FixedTimestep {
dt: f32,
ticks: u64,
}
impl Default for FixedTimestep {
fn default() -> Self {
Self {
dt: SimTiming::TICK_DT,
ticks: 0,
}
}
}
impl FixedTimestep {
pub(crate) fn advance(&mut self) -> SimTiming {
self.ticks = self.ticks.saturating_add(1);
SimTiming {
ticks: 1,
tick_dt: self.dt,
alpha: 1.0,
}
}
pub(crate) fn ticks(&self) -> u64 {
self.ticks
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn every_tick_publishes_one_unblended_fixed_step() {
let mut sim = FixedTimestep::default();
for _ in 0..3 {
let timing = sim.advance();
assert_eq!(timing.ticks, 1);
assert_eq!(timing.tick_dt, SimTiming::TICK_DT);
assert_eq!(timing.alpha, 1.0);
}
}
#[test]
fn the_budget_matches_an_undriven_worlds_default() {
let published = FixedTimestep::default().advance();
let default = SimTiming::default();
assert_eq!(published.ticks, default.ticks);
assert_eq!(published.tick_dt, default.tick_dt);
assert_eq!(published.alpha, default.alpha);
}
#[test]
fn ticks_count_the_advances() {
let mut sim = FixedTimestep::default();
assert_eq!(sim.ticks(), 0);
sim.advance();
sim.advance();
assert_eq!(sim.ticks(), 2);
}
}