aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/render_loop.rs12
1 files changed, 11 insertions, 1 deletions
diff --git a/src/render_loop.rs b/src/render_loop.rs
index 5dcf653..8fc0164 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 `window.requestAnimationFrame()` to schedule calling a
+/// function as long as the function returns true.
pub struct RenderLoop {
inner: Rc<RefCell<Closure<dyn FnMut(f64)>>>,
}
@@ -16,10 +18,16 @@ impl RenderLoop {
Ok(())
}
+ /// `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 {
+ // use stub closure so we don't need an `Option` to flag
+ // whether the `RefCell` is filled or not, and otherwise we'd
+ // need to use `MaybeUninit` and `unsafe`.
let inner = Rc::new(RefCell::new(Closure::new(|_| {})));
- let rloop = inner.clone();
+ let rloop = inner.clone();
*inner.borrow_mut() = Closure::new(move |t| {
if fun(t) {
if let Err(e) = Self::request_animation_frame(&rloop.borrow()) {
@@ -27,9 +35,11 @@ impl RenderLoop {
}
}
});
+
Self { inner }
}
+ /// start animating.
pub fn start(&self) -> Result<(), JsValue> {
Self::request_animation_frame(&self.inner.borrow())?;
Ok(())