diff options
| author | brian cully <bjc@spork.org> | 2025-12-29 11:20:12 -0500 |
|---|---|---|
| committer | brian cully <bjc@spork.org> | 2025-12-29 11:20:12 -0500 |
| commit | 5378626d85b69b53b79d2539dea9c8746af88616 (patch) | |
| tree | 435214a5407a151dcc644af3a47d5f0ad2ece32e | |
| parent | f3bc843bcaa5c40ce93a6f1777d48e2ad7d097f5 (diff) | |
| download | polyring-5378626d85b69b53b79d2539dea9c8746af88616.tar.gz polyring-5378626d85b69b53b79d2539dea9c8746af88616.zip | |
wasm: separate update/render for later benching
| -rw-r--r-- | src/lib.rs | 5 | ||||
| -rw-r--r-- | src/render_loop.rs | 16 | ||||
| -rw-r--r-- | src/state.rs | 12 |
3 files changed, 22 insertions, 11 deletions
@@ -52,8 +52,9 @@ pub fn init() -> JSResult<()> { s.render_frame(0.0)?; let render_loop = RenderLoop::new(move |t| { - s.render_frame(t).expect("should render frame"); - !*paused.lock().unwrap() + s.render_frame(t)?; + s.update()?; + Ok(!*paused.lock().unwrap()) }); let a: HandlerClosure = Closure::new(move |e| { diff --git a/src/render_loop.rs b/src/render_loop.rs index 628e687..7056493 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 crate::JSResult; + /// use `window.requestAnimationFrame()` to schedule calling a /// function as long as the function returns true. pub struct RenderLoop { @@ -21,7 +23,7 @@ impl RenderLoop { /// `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 { + pub fn new<T: FnMut(f64) -> JSResult<bool> + 'static>(mut fun: T) -> Self { // init with stub closure because rust wants that, then change // it later once we have our rc clone. let inner = Rc::new(UnsafeCell::new(Closure::new(|_| {}))); @@ -29,11 +31,15 @@ impl RenderLoop { let rloop = inner.clone(); let f = unsafe { &mut *inner.get() }; *f = Closure::new(move |t| { - if fun(t) { - let cl = unsafe { &*rloop.get() }; - if let Err(e) = Self::request_animation_frame(cl) { - error!("couldn't request animation frame: {:?}", e); + match fun(t) { + Err(e) => error!("render callback error: {:?}", e), + Ok(true) => { + let cl = unsafe { &*rloop.get() }; + if let Err(e) = Self::request_animation_frame(cl) { + error!("couldn't request animation frame: {:?}", e); + } } + Ok(false) => {}, } }); diff --git a/src/state.rs b/src/state.rs index 61e82c9..09120fb 100644 --- a/src/state.rs +++ b/src/state.rs @@ -67,10 +67,6 @@ impl State { self.canvas.height().into(), ); self.render_points()?; - if self.bounce_points() { - //debug!("point bounced"); - } - self.move_points(); // poly finding assumes sorted self.points.sort_by(|a, b| { @@ -100,6 +96,14 @@ impl State { Ok(()) } + pub fn update(&mut self) -> JSResult<()> { + if self.bounce_points() { + //debug!("point bounced"); + } + self.move_points(); + Ok(()) + } + fn render_points(&self) -> JSResult<()> { for p in &self.points { self.ctx.set_fill_style_str(&p.color); |
