diff options
Diffstat (limited to 'src/render_loop.rs')
| -rw-r--r-- | src/render_loop.rs | 16 |
1 files changed, 11 insertions, 5 deletions
diff --git a/src/render_loop.rs b/src/render_loop.rs index 628e687..7056493 100644 --- a/src/render_loop.rs +++ b/src/render_loop.rs @@ -4,6 +4,8 @@ use std::rc::Rc; use log::error; use wasm_bindgen::prelude::*; +use crate::JSResult; + /// use `window.requestAnimationFrame()` to schedule calling a /// function as long as the function returns true. pub struct RenderLoop { @@ -21,7 +23,7 @@ impl RenderLoop { /// `fun` takes a timestamp in the same space as the document /// timeline and returns a flag specifying whether we should /// schedule another frame.. - pub fn new<T: FnMut(f64) -> bool + 'static>(mut fun: T) -> Self { + pub fn new<T: FnMut(f64) -> JSResult<bool> + 'static>(mut fun: T) -> Self { // init with stub closure because rust wants that, then change // it later once we have our rc clone. let inner = Rc::new(UnsafeCell::new(Closure::new(|_| {}))); @@ -29,11 +31,15 @@ impl RenderLoop { let rloop = inner.clone(); let f = unsafe { &mut *inner.get() }; *f = Closure::new(move |t| { - if fun(t) { - let cl = unsafe { &*rloop.get() }; - if let Err(e) = Self::request_animation_frame(cl) { - error!("couldn't request animation frame: {:?}", e); + match fun(t) { + Err(e) => error!("render callback error: {:?}", e), + Ok(true) => { + let cl = unsafe { &*rloop.get() }; + if let Err(e) = Self::request_animation_frame(cl) { + error!("couldn't request animation frame: {:?}", e); + } } + Ok(false) => {}, } }); |
