Fix benchmarks for latest glium/glutin API
[mandelwow.git] / timer.rs
index defc9e88324c1ee7cc65427d612e052c3adc4e4d..93458388961fc272201867377c5357033cf2b947 100644 (file)
--- a/timer.rs
+++ b/timer.rs
@@ -1,10 +1,23 @@
 use std::time::{Duration, Instant};
 
+#[cfg(feature = "editor")]
+use rust_rocket;
+
+#[cfg(feature = "editor")]
+type Rocket = rust_rocket::client::RocketClient;
+
+#[cfg(not(feature = "editor"))]
+type Rocket = ();
+
+#[cfg(feature = "editor")]
+const BPS: f32 = 10.0;
+
 #[derive(Debug)]
 pub struct Timer {
-    pub t: f32,
-
-    frame: u32,
+    pub t: f32,          /// Simulation time (starts from 0 and does not advance while on pause).
+    pub now: Instant,    /// Wall time, use instead of Instant::now() for frame-consistent time.
+    prev_time: Instant,  /// Time of previous frame.
+    frame: u32,          /// Frame count, starts from 0 and does not increment while on pause.
 
     last_report_time: Instant,
     last_report_frame: u32,
@@ -13,6 +26,8 @@ pub struct Timer {
     accum_idle_time: Duration,
 
     pub pause: bool,
+
+    pub rocket: Option<Rocket>,
 }
 
 impl Timer {
@@ -20,33 +35,40 @@ impl Timer {
         let now = Instant::now();
         Timer {
             t: 0.0,
+            now,
+            prev_time: now,
             frame: 0,
             last_report_time: now,
             last_report_frame: 0,
             accum_draw_time: Duration::default(),
             accum_idle_time: Duration::default(),
             pause: false,
+            rocket: Timer::init_rocket(),
         }
     }
 
+    // To be called once per frame, just before rendering
     pub fn update(&mut self) {
-        let now = Instant::now();
+        self.prev_time = self.now;
+        self.now = Instant::now();
         if !self.pause {
-            // Increment time
-            self.t += 0.01;
+            // Increment simulation time
+            let frame_time = self.now - self.prev_time;
+            self.t += frame_time.as_secs_f32();
             self.frame += 1;
         }
-        self.maybe_report(now);
+        self.poll_rocket();
+        self.maybe_report();
     }
 
     #[cfg(not(feature = "logging"))]
-    fn maybe_report(&mut self, _: Instant) {}
+    fn maybe_report(&mut self) {}
 
     #[cfg(feature = "logging")]
-    fn maybe_report(&mut self, now: Instant) {
-        if now - self.last_report_time > Duration::from_secs(5) {
-            self.report(now);
-            self.last_report_time = now;
+    fn maybe_report(&mut self) {
+        if self.now - self.last_report_time > Duration::from_secs(5) {
+            self.report(self.now);
+            self.last_report_time = self.now;
             self.last_report_frame = self.frame;
             self.accum_draw_time = Duration::new(0, 0);
             self.accum_idle_time = Duration::new(0, 0);
@@ -64,4 +86,41 @@ impl Timer {
         let avg_idle_time = millis(self.accum_idle_time / frames_done);
         println!("fps={:.1} draw={:.1}ms idle={:.1}ms", fps, avg_draw_time, avg_idle_time);
     }
+
+    #[cfg(not(feature = "editor"))]
+    fn init_rocket() -> Option<Rocket> { None }
+
+    #[cfg(not(feature = "editor"))]
+    fn poll_rocket(&mut self) {}
+
+    #[cfg(feature = "editor")]
+    fn init_rocket() -> Option<Rocket> {
+        Rocket::new().ok()
+    }
+
+    #[cfg(feature = "editor")]
+    fn poll_rocket(&mut self) {
+        use rust_rocket::client::Event;
+
+        match self.rocket {
+            Some(ref mut rocket) => {
+                let current_row = (self.t * BPS) as u32;
+                if let Some(event) = rocket.poll_events().unwrap() {
+                    match event {
+                        Event::SetRow(row) => {
+                            println!("SetRow (row: {:?})", row);
+                            self.t = row as f32 / BPS;
+                        }
+                        Event::Pause(_) => {
+                            let track1 = rocket.get_track_mut("test").unwrap();
+                            println!("Pause (value: {:?}) (row: {:?})", track1.get_value(current_row as f32), current_row);
+                        }
+                        _ => (),
+                    }
+                    println!("{:?}", event);
+                }
+            }
+            None => ()
+        }
+    }
 }