From d39d5d58e65d30f54f52b811f80644be0645393e Mon Sep 17 00:00:00 2001 From: Jacob Gardner Date: Sat, 19 Jun 2021 01:37:39 -0500 Subject: [PATCH 1/2] Bug fix and tests for #2361 --- crates/bevy_core/src/time/timer.rs | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/crates/bevy_core/src/time/timer.rs b/crates/bevy_core/src/time/timer.rs index 329fcbeb1b94e..7661192a59ad0 100644 --- a/crates/bevy_core/src/time/timer.rs +++ b/crates/bevy_core/src/time/timer.rs @@ -217,7 +217,7 @@ impl Timer { if self.finished() { if self.repeating() { - self.times_finished = self.percent().floor() as u32; + self.times_finished = (self.elapsed().as_nanos() / self.duration().as_nanos()) as u32; // Duration does not have a modulo self.set_elapsed(self.elapsed() - self.duration() * self.times_finished); } else { @@ -464,4 +464,20 @@ mod tests { t.tick(Duration::from_secs_f32(0.5)); assert_eq!(t.times_finished(), 0); } + + #[test] + fn times_finished_precise() { + let mut t = Timer::from_seconds(0.01, true); + let duration = Duration::from_secs_f64(1.0 / 3.0); + + t.tick(duration); + assert_eq!(t.times_finished(), 33); + t.tick(duration); + assert_eq!(t.times_finished(), 33); + t.tick(duration); + assert_eq!(t.times_finished(), 33); + // It has one additional tick this time to compensate for missing 100th tick + t.tick(duration); + assert_eq!(t.times_finished(), 34); + } } From f9eba3fd23cc74653ac1cd3164f993b6fca23666 Mon Sep 17 00:00:00 2001 From: Jacob Gardner Date: Sat, 19 Jun 2021 16:10:56 -0500 Subject: [PATCH 2/2] Run cargo fmt against changed file --- crates/bevy_core/src/time/timer.rs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/crates/bevy_core/src/time/timer.rs b/crates/bevy_core/src/time/timer.rs index 7661192a59ad0..f09f3f950441e 100644 --- a/crates/bevy_core/src/time/timer.rs +++ b/crates/bevy_core/src/time/timer.rs @@ -217,7 +217,8 @@ impl Timer { if self.finished() { if self.repeating() { - self.times_finished = (self.elapsed().as_nanos() / self.duration().as_nanos()) as u32; + self.times_finished = + (self.elapsed().as_nanos() / self.duration().as_nanos()) as u32; // Duration does not have a modulo self.set_elapsed(self.elapsed() - self.duration() * self.times_finished); } else {