limnus_clock/
lib.rs

1pub mod prelude;
2
3use limnus_app::prelude::{App, Plugin};
4use limnus_default_stages::First;
5use limnus_local_resource::LocalResource;
6use limnus_macros::{LocalResource, Resource};
7use limnus_resource::Resource;
8use limnus_system_params::{LoRe, ReM};
9use monotonic_time_rs::{create_monotonic_clock, Millis, MonotonicClock};
10use std::fmt::{Debug, Formatter};
11
12#[derive(LocalResource)]
13pub struct Clock {
14    pub clock: Box<dyn MonotonicClock>,
15}
16
17impl Debug for Clock {
18    fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
19        write!(f, "clock")
20    }
21}
22
23#[derive(Debug, Resource)]
24pub struct MonotonicTime {
25    pub time: Millis,
26}
27
28fn update_time(clock: LoRe<Clock>, mut time: ReM<MonotonicTime>) {
29    time.time = clock.clock.now();
30}
31
32pub struct ClockPlugin;
33
34impl Plugin for ClockPlugin {
35    fn build(&self, app: &mut App) {
36        let clock = create_monotonic_clock();
37        let now = clock.now();
38        app.insert_local_resource(Clock {
39            clock: Box::new(clock),
40        });
41        app.insert_resource(MonotonicTime { time: now });
42
43        app.add_system(First, update_time);
44    }
45}