aboutsummaryrefslogtreecommitdiffstats
path: root/src/render_loop.rs
diff options
context:
space:
mode:
authorbrian cully <bjc@spork.org>2025-12-28 11:58:17 -0500
committerbrian cully <bjc@spork.org>2025-12-28 11:58:17 -0500
commit260ddcad131c1907f8eea154ce8bfb4a30dc717b (patch)
treeb45bd7f8e122a59977dfd7e5541377c0a9df3fd7 /src/render_loop.rs
parent4aa3ac264ff0a5cb102dcbd0d4e70a1df2ec96dd (diff)
downloadpolyring-260ddcad131c1907f8eea154ce8bfb4a30dc717b.tar.gz
polyring-260ddcad131c1907f8eea154ce8bfb4a30dc717b.zip
move render loop to its own module
Diffstat (limited to 'src/render_loop.rs')
-rw-r--r--src/render_loop.rs41
1 files changed, 41 insertions, 0 deletions
diff --git a/src/render_loop.rs b/src/render_loop.rs
new file mode 100644
index 0000000..bc6d8a9
--- /dev/null
+++ b/src/render_loop.rs
@@ -0,0 +1,41 @@
+use std::cell::RefCell;
+use std::rc::Rc;
+
+use wasm_bindgen::prelude::*;
+
+pub struct RenderLoop {
+ inner: Rc<RefCell<Closure<dyn FnMut(f64)>>>,
+}
+
+impl RenderLoop {
+ fn request_animation_frame(f: &Closure<dyn FnMut(f64)>) {
+ web_sys::window().expect("no window")
+ .request_animation_frame(f.as_ref().unchecked_ref())
+ .expect("should register `requestAnimationFrame` OK");
+ }
+
+ pub fn new<T: FnMut(f64) -> bool + 'static>(mut fun: T) -> Self {
+ let inner = Rc::new(RefCell::new(Closure::new(|_| {})));
+ let rloop = inner.clone();
+
+ *inner.borrow_mut() = Closure::new(move |t| {
+ if fun(t) {
+ Self::request_animation_frame(&rloop.borrow());
+ }
+ });
+ Self { inner }
+ }
+
+ pub fn start(&self) -> Result<(), JsValue> {
+ Self::request_animation_frame(&self.inner.borrow());
+ Ok(())
+ }
+}
+
+impl Clone for RenderLoop {
+ fn clone(&self) -> Self {
+ Self {
+ inner: self.inner.clone(),
+ }
+ }
+}