aboutsummaryrefslogtreecommitdiffstats
path: root/src/lib.rs
diff options
context:
space:
mode:
authorbrian cully <bjc@spork.org>2025-12-27 16:53:11 -0500
committerbrian cully <bjc@spork.org>2025-12-27 16:53:11 -0500
commitfdc957cae7f5efca792b40df7ff90ec4f512269b (patch)
treec66b53403d31b152cce22b7c68559b3d78f1bb07 /src/lib.rs
parent4a8f968b6cf8e7e3fc3cee72cc8b552a8ceec047 (diff)
downloadpolyring-fdc957cae7f5efca792b40df7ff90ec4f512269b.tar.gz
polyring-fdc957cae7f5efca792b40df7ff90ec4f512269b.zip
get wasm go button working
Diffstat (limited to 'src/lib.rs')
-rw-r--r--src/lib.rs76
1 files changed, 67 insertions, 9 deletions
diff --git a/src/lib.rs b/src/lib.rs
index f43b2ad..1c5f028 100644
--- a/src/lib.rs
+++ b/src/lib.rs
@@ -1,7 +1,8 @@
use std::cell::RefCell;
+use std::sync::{Mutex};
use std::rc::Rc;
-use log::{Level, info};
+use log::{Level, info, debug};
use wasm_bindgen::prelude::*;
use state::State;
@@ -28,12 +29,40 @@ fn window() -> web_sys::Window {
web_sys::window().expect("no window")
}
+fn document() -> web_sys::Document {
+ window().document().expect("no document")
+}
+
+fn canvas() -> Result<web_sys::HtmlCanvasElement, JsValue> {
+ let x = document()
+ .query_selector("canvas")?
+ .expect("canvas element");
+ Ok(x.dyn_into::<web_sys::HtmlCanvasElement>()?)
+}
+
+fn fps() -> Result<web_sys::HtmlElement, JsValue> {
+ let x = document()
+ .query_selector("#fps")?
+ .expect("fps counter exists");
+ Ok(x.dyn_into::<web_sys::HtmlElement>()?)
+}
+
+fn go() -> Result<web_sys::HtmlElement, JsValue> {
+ let x = document()
+ .query_selector("button")?
+ .expect("go button exists");
+ Ok(x.dyn_into::<web_sys::HtmlElement>()?)
+}
+
#[wasm_bindgen(start)]
pub fn init() -> Result<(), JsValue> {
console_log::init_with_level(Level::Debug).expect("couldn't init console log");
info!("wasm init");
- let mut s = State::new()?;
+ let paused = Rc::new(Mutex::new(true));
+ let p1 = paused.clone();
+
+ let mut s = State::new(canvas()?, fps()?)?;
s.render_frame(0.0)?;
//
@@ -43,12 +72,13 @@ pub fn init() -> Result<(), JsValue> {
let render_loop: Rc<RefCell<RenderLoop>> = Rc::new(RefCell::new(RenderLoop::new()));
{
let closure: Closure<dyn FnMut(f64)> = {
- let render_loop = render_loop.clone();
+ let render_loop_clone = render_loop.clone();
Closure::wrap(Box::new(move |t| {
s.render_frame(t).expect("should render frame");
- if !s.paused {
- let mut render_loop = render_loop.borrow_mut();
- render_loop.animation_id = if let Some(ref closure) = render_loop.closure {
+ 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())
@@ -60,18 +90,46 @@ pub fn init() -> Result<(), JsValue> {
}
}))
};
- let mut render_loop = render_loop.borrow_mut();
- render_loop.animation_id = Some(
+
+ 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.closure = Some(closure);
+ render_loop_last.closure = Some(closure);
}
//
//
//
+ let a = Closure::<dyn FnMut()>::new(move || {
+ let mut p = p1.lock().unwrap();
+ debug!("go clicked: {}", *p);
+ *p = !*p;
+ 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
+ };
+ "pause"
+ };
+ go().expect("go button works").set_text_content(Some(text));
+ });
+ go()?.set_onclick(Some(a.as_ref().unchecked_ref()));
+ // otherwise it gets dropped after we're done, invalidating the
+ // handler.
+ a.forget();
+
Ok(())
}