com_croftsoft_lib_animation/metronome/
delta.rs

1// =============================================================================
2//! - An alternative implementation of the Metronome trait
3//!
4//! # Metadata
5//! - Copyright: © 2023 [`CroftSoft Inc`]
6//! - Author: [`David Wallace Croft`]
7//! - Created: 2023-02-22
8//! - Updated: 2023-02-22
9//!
10//! [`CroftSoft Inc`]: https://www.croftsoft.com/
11//! [`David Wallace Croft`]: https://www.croftsoft.com/people/david/
12// =============================================================================
13
14use super::Metronome;
15
16pub struct DeltaMetronome {
17  pub period_millis: f64,
18  pub time_millis_next_tick: f64,
19}
20
21impl Metronome for DeltaMetronome {
22  fn reset(
23    &mut self,
24    current_time_millis: f64,
25  ) {
26    self.time_millis_next_tick = current_time_millis + self.period_millis
27  }
28
29  fn set_period_millis(
30    &mut self,
31    period_millis: f64,
32  ) {
33    self.period_millis = period_millis;
34  }
35
36  fn set_time_millis_next_tick(
37    &mut self,
38    time_millis_next_tick: f64,
39  ) {
40    self.time_millis_next_tick = time_millis_next_tick;
41  }
42
43  fn tick(
44    &mut self,
45    current_time_millis: f64,
46  ) -> bool {
47    let overshoot_millis = current_time_millis - self.time_millis_next_tick;
48    if overshoot_millis < 0. {
49      return false;
50    }
51    let mut delta_millis = self.period_millis - overshoot_millis;
52    if delta_millis < 0. {
53      delta_millis = self.period_millis;
54    }
55    self.time_millis_next_tick = current_time_millis + delta_millis;
56    true
57  }
58}