diff options
| author | brian cully <bjc@spork.org> | 2025-12-28 11:12:40 -0500 |
|---|---|---|
| committer | brian cully <bjc@spork.org> | 2025-12-28 11:12:40 -0500 |
| commit | 72df868e2f5361a41df7e2bdd601fd4ff9877246 (patch) | |
| tree | 880e95cf9a0329aa3c474d52f1f02ebb7dd19500 | |
| parent | 88601f5114bd5038fc997580eeaa4cf1447f0511 (diff) | |
| download | polyring-72df868e2f5361a41df7e2bdd601fd4ff9877246.tar.gz polyring-72df868e2f5361a41df7e2bdd601fd4ff9877246.zip | |
simplify render logic
| -rw-r--r-- | src/lib.rs | 78 |
1 files changed, 26 insertions, 52 deletions
@@ -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)); |
