penguin-application 0.1.1

Appbuilder and abstraction layer for building applications using legion ECS.
Documentation
use std::time::{Duration, Instant};

use crate::ecs::*;


#[derive(Default)]
pub struct TimePlugin;

impl Plugin for TimePlugin {
    fn startup(&mut self, resources: &mut Resources) -> Vec<Step> {
        resources.insert(Time::default());

        vec![]
    }

    fn run() -> Vec<Step> {
        Schedule::builder()
            .add_system(tick_system())
            .build()
            .into_vec()
    }

    fn shutdown() -> Vec<Step> {
        vec![]
    }
}

#[system]
fn tick(#[resource] time: &mut Time) {
    time.tick();
}

#[derive(Debug)]
pub struct Time {
    previous_frame_time: Instant,
    delta_time: Duration,
}
impl Default for Time {
    fn default() -> Self {
        Self {
            previous_frame_time: Instant::now(),
            delta_time: Duration::new(0, 0),
        }
    }
}

impl Time {
    pub fn delta(&self) -> f32 {
        self.delta_time.as_secs_f32()
    }

    #[allow(unused)]
    pub fn delta_f64(&self) -> f64 {
        self.delta_time.as_secs_f64()
    }

    fn tick(&mut self) {
        let delta_time = self.previous_frame_time.elapsed();
        self.previous_frame_time = Instant::now();
        self.delta_time = delta_time;
    }
}