diff options
Diffstat (limited to 'src/render_loop.rs')
| -rw-r--r-- | src/render_loop.rs | 41 |
1 files changed, 41 insertions, 0 deletions
diff --git a/src/render_loop.rs b/src/render_loop.rs new file mode 100644 index 0000000..bc6d8a9 --- /dev/null +++ b/src/render_loop.rs @@ -0,0 +1,41 @@ +use std::cell::RefCell; +use std::rc::Rc; + +use wasm_bindgen::prelude::*; + +pub struct RenderLoop { + inner: Rc<RefCell<Closure<dyn FnMut(f64)>>>, +} + +impl RenderLoop { + fn request_animation_frame(f: &Closure<dyn FnMut(f64)>) { + web_sys::window().expect("no window") + .request_animation_frame(f.as_ref().unchecked_ref()) + .expect("should register `requestAnimationFrame` OK"); + } + + pub fn new<T: FnMut(f64) -> bool + 'static>(mut fun: T) -> Self { + let inner = Rc::new(RefCell::new(Closure::new(|_| {}))); + let rloop = inner.clone(); + + *inner.borrow_mut() = Closure::new(move |t| { + if fun(t) { + Self::request_animation_frame(&rloop.borrow()); + } + }); + Self { inner } + } + + pub fn start(&self) -> Result<(), JsValue> { + Self::request_animation_frame(&self.inner.borrow()); + Ok(()) + } +} + +impl Clone for RenderLoop { + fn clone(&self) -> Self { + Self { + inner: self.inner.clone(), + } + } +} |
