aboutsummaryrefslogtreecommitdiffstats
path: root/src/lib.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/lib.rs')
-rw-r--r--src/lib.rs78
1 files changed, 26 insertions, 52 deletions
diff --git a/src/lib.rs b/src/lib.rs
index 1c5f028..0c767e7 100644
--- a/src/lib.rs
+++ b/src/lib.rs
@@ -12,14 +12,12 @@ mod point;
mod state;
struct RenderLoop {
- animation_id: Option<i32>,
- pub closure: Option<Closure<dyn FnMut(f64)>>,
+ closure: Option<Closure<dyn FnMut(f64)>>,
}
impl RenderLoop {
pub fn new() -> Self {
Self {
- animation_id: None,
closure: None,
}
}
@@ -54,6 +52,25 @@ fn go() -> Result<web_sys::HtmlElement, JsValue> {
Ok(x.dyn_into::<web_sys::HtmlElement>()?)
}
+fn request_animation_frame(f: &Closure<dyn FnMut(f64)>) {
+ window()
+ .request_animation_frame(f.as_ref().unchecked_ref())
+ .expect("should register `requestAnimationFrame` OK");
+}
+
+fn rloop2<T: FnMut(f64) -> bool + 'static>(mut fun: T) -> Rc<RefCell<RenderLoop>> {
+ let res = Rc::new(RefCell::new(RenderLoop::new()));
+ let rloop = res.clone();
+
+ (*res).borrow_mut().closure = Some(Closure::new(move |t| {
+ if fun(t) {
+ request_animation_frame(rloop.borrow().closure.as_ref().expect("can borrow rloop"));
+ }
+ }));
+
+ res
+}
+
#[wasm_bindgen(start)]
pub fn init() -> Result<(), JsValue> {
console_log::init_with_level(Level::Debug).expect("couldn't init console log");
@@ -65,44 +82,11 @@ pub fn init() -> Result<(), JsValue> {
let mut s = State::new(canvas()?, fps()?)?;
s.render_frame(0.0)?;
- //
- // from https://users.rust-lang.org/t/wasm-web-sys-how-to-use-window-request-animation-frame-resolved/20882
- //
-
- let render_loop: Rc<RefCell<RenderLoop>> = Rc::new(RefCell::new(RenderLoop::new()));
- {
- let closure: Closure<dyn FnMut(f64)> = {
- let render_loop_clone = render_loop.clone();
- Closure::wrap(Box::new(move |t| {
- s.render_frame(t).expect("should render frame");
- let p = paused.lock().unwrap();
- if !*p {
- let mut render_loop_mut = render_loop_clone.borrow_mut();
- render_loop_mut.animation_id = if let Some(ref closure) = render_loop_mut.closure {
- Some(
- window()
- .request_animation_frame(closure.as_ref().unchecked_ref())
- .expect("req anim frame"),
- )
- } else {
- None
- }
- }
- }))
- };
-
- let mut render_loop_last = render_loop.borrow_mut();
- render_loop_last.animation_id = Some(
- window()
- .request_animation_frame(closure.as_ref().unchecked_ref())
- .expect("req anim frame"),
- );
- render_loop_last.closure = Some(closure);
- }
-
- //
- //
- //
+ let render_loop = rloop2(move |t| {
+ s.render_frame(t).expect("should render frame");
+ !*paused.lock().unwrap()
+ });
+ request_animation_frame(render_loop.borrow().closure.as_ref().expect("can borrow res"));
let a = Closure::<dyn FnMut()>::new(move || {
let mut p = p1.lock().unwrap();
@@ -111,17 +95,7 @@ pub fn init() -> Result<(), JsValue> {
let text = if *p {
"go"
} else {
- let render_loop_clone = render_loop.clone();
- let mut render_loop_mut = render_loop_clone.borrow_mut();
- render_loop_mut.animation_id = if let Some(ref closure) = render_loop_mut.closure {
- Some(
- window()
- .request_animation_frame(closure.as_ref().unchecked_ref())
- .expect("req anim frame"),
- )
- } else {
- None
- };
+ request_animation_frame(render_loop.borrow().closure.as_ref().expect("render closure exists"));
"pause"
};
go().expect("go button works").set_text_content(Some(text));