limnus_clock/
lib.rs

1/*
2 * Copyright (c) Peter Bjorklund. All rights reserved. https://github.com/swamp/limnus
3 * Licensed under the MIT License. See LICENSE in the project root for license information.
4 */
5
6pub mod prelude;
7
8use limnus_app::prelude::{App, Plugin};
9use limnus_default_stages::First;
10use limnus_local_resource::LocalResource;
11use limnus_macros::{LocalResource, Resource};
12use limnus_resource::Resource;
13use limnus_system_params::{LoRe, ReM};
14use monotonic_time_rs::{Millis, MonotonicClock, create_monotonic_clock};
15use std::fmt::{Debug, Formatter};
16
17#[derive(LocalResource)]
18pub struct Clock {
19    pub clock: Box<dyn MonotonicClock>,
20}
21
22impl Debug for Clock {
23    fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
24        write!(f, "clock")
25    }
26}
27
28#[derive(Debug, Resource)]
29pub struct MonotonicTime {
30    pub time: Millis,
31}
32
33fn update_time(clock: LoRe<Clock>, mut time: ReM<MonotonicTime>) {
34    time.time = clock.clock.now();
35}
36
37pub struct ClockPlugin;
38
39impl Plugin for ClockPlugin {
40    fn build(&self, app: &mut App) {
41        let clock = create_monotonic_clock();
42        let now = clock.now();
43        app.insert_local_resource(Clock {
44            clock: Box::new(clock),
45        });
46        app.insert_resource(MonotonicTime { time: now });
47
48        app.add_system(First, update_time);
49    }
50}