diff options
| author | brian cully <bjc@spork.org> | 2025-12-27 16:53:11 -0500 |
|---|---|---|
| committer | brian cully <bjc@spork.org> | 2025-12-27 16:53:11 -0500 |
| commit | fdc957cae7f5efca792b40df7ff90ec4f512269b (patch) | |
| tree | c66b53403d31b152cce22b7c68559b3d78f1bb07 /src/lib.rs | |
| parent | 4a8f968b6cf8e7e3fc3cee72cc8b552a8ceec047 (diff) | |
| download | polyring-fdc957cae7f5efca792b40df7ff90ec4f512269b.tar.gz polyring-fdc957cae7f5efca792b40df7ff90ec4f512269b.zip | |
get wasm go button working
Diffstat (limited to 'src/lib.rs')
| -rw-r--r-- | src/lib.rs | 76 |
1 files changed, 67 insertions, 9 deletions
@@ -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(()) } |
