From 7fab87399f0c5121219c3b5a0c8f06a6dbdf084f Mon Sep 17 00:00:00 2001 From: brian cully Date: Sun, 28 Dec 2025 11:44:15 -0500 Subject: more render simplification --- src/lib.rs | 46 +++++++++++++++++++++++++--------------------- 1 file changed, 25 insertions(+), 21 deletions(-) diff --git a/src/lib.rs b/src/lib.rs index 0c767e7..80d089a 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -12,14 +12,31 @@ mod point; mod state; struct RenderLoop { - closure: Option>, + inner: Rc>>>, } impl RenderLoop { - pub fn new() -> Self { - Self { - closure: None, - } + fn new 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) { .expect("should register `requestAnimationFrame` OK"); } -fn rloop2 bool + 'static>(mut fun: T) -> Rc> { - 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::::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)); -- cgit v1.3