diff options
| author | brian cully <bjc@spork.org> | 2025-12-28 11:44:15 -0500 |
|---|---|---|
| committer | brian cully <bjc@spork.org> | 2025-12-28 11:44:15 -0500 |
| commit | 7fab87399f0c5121219c3b5a0c8f06a6dbdf084f (patch) | |
| tree | 8355f62be5d8753b605d34443414e620ae9ffb57 /src/lib.rs | |
| parent | 72df868e2f5361a41df7e2bdd601fd4ff9877246 (diff) | |
| download | polyring-7fab87399f0c5121219c3b5a0c8f06a6dbdf084f.tar.gz polyring-7fab87399f0c5121219c3b5a0c8f06a6dbdf084f.zip | |
more render simplification
Diffstat (limited to 'src/lib.rs')
| -rw-r--r-- | src/lib.rs | 46 |
1 files changed, 25 insertions, 21 deletions
@@ -12,14 +12,31 @@ mod point; mod state; struct RenderLoop { - closure: Option<Closure<dyn FnMut(f64)>>, + inner: Rc<RefCell<Option<Closure<dyn FnMut(f64)>>>>, } impl RenderLoop { - pub fn new() -> Self { - Self { - closure: None, - } + fn new<T: FnMut(f64) -> bool + 'static>(mut fun: T) -> Self { + let inner = Rc::new(RefCell::new(None)); + let rloop = inner.clone(); + + *inner.borrow_mut() = Some(Closure::new(move |t| { + if fun(t) { + request_animation_frame(rloop.borrow().as_ref().expect("can borrow rloop")); + } + })); + Self { inner } + } + + fn start(&self) -> Result<(), JsValue> { + request_animation_frame(self.inner.borrow().as_ref().ok_or("closure exists")?); + Ok(()) + } +} + +impl Clone for RenderLoop { + fn clone(&self) -> Self { + Self { inner: self.inner.clone() } } } @@ -58,19 +75,6 @@ fn request_animation_frame(f: &Closure<dyn FnMut(f64)>) { .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"); @@ -82,11 +86,11 @@ pub fn init() -> Result<(), JsValue> { let mut s = State::new(canvas()?, fps()?)?; s.render_frame(0.0)?; - let render_loop = rloop2(move |t| { + let render_loop = RenderLoop::new(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")); + render_loop.start()?; let a = Closure::<dyn FnMut()>::new(move || { let mut p = p1.lock().unwrap(); @@ -95,7 +99,7 @@ pub fn init() -> Result<(), JsValue> { let text = if *p { "go" } else { - request_animation_frame(render_loop.borrow().closure.as_ref().expect("render closure exists")); + render_loop.start().expect("start render loop"); "pause" }; go().expect("go button works").set_text_content(Some(text)); |
