diff options
| author | brian cully <bjc@spork.org> | 2025-12-27 12:58:44 -0500 |
|---|---|---|
| committer | brian cully <bjc@spork.org> | 2025-12-27 12:58:44 -0500 |
| commit | 69591cc5483d36bc819c75dce9347b08b04e33bf (patch) | |
| tree | 93d0f158621c6caea2f54e449a942f45ec829395 /src/lib.rs | |
| parent | 0eaa19448a85473e85d4679faa4ab30108dbf4b5 (diff) | |
| download | polyring-69591cc5483d36bc819c75dce9347b08b04e33bf.tar.gz polyring-69591cc5483d36bc819c75dce9347b08b04e33bf.zip | |
add rust/wasm impl
Diffstat (limited to 'src/lib.rs')
| -rw-r--r-- | src/lib.rs | 62 |
1 files changed, 60 insertions, 2 deletions
@@ -1,11 +1,69 @@ -use log::{Level, error, info}; +use std::rc::Rc; +use std::cell::RefCell; + +use log::{Level, info}; use wasm_bindgen::prelude::*; -use web_sys::js_sys; + +use state::State; + +mod line; +mod point; +mod state; + +struct RenderLoop { + animation_id: Option<i32>, + pub closure: Option<Closure<dyn FnMut(f64)>>, +} + +impl RenderLoop { + pub fn new() -> Self { + Self { + animation_id: None, + closure: None, + } + } +} + +fn window() -> web_sys::Window { + web_sys::window().expect("no window") +} #[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()?; + s.render_frame(0.0)?; + + // + // from https://users.rust-lang.org/t/wasm-web-sys-how-to-use-window-request-animation-frame-resolved/20882 + // + + let render_loop: Rc<RefCell<RenderLoop>> = Rc::new(RefCell::new(RenderLoop::new())); + { + let closure: Closure<dyn FnMut(f64)> = { + let render_loop = 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 { + Some(window().request_animation_frame(closure.as_ref().unchecked_ref()).expect("req anim frame")) + } else { + None + } + } + })) + }; + let mut render_loop = render_loop.borrow_mut(); + render_loop.animation_id = Some(window().request_animation_frame(closure.as_ref().unchecked_ref()).expect("req anim frame")); + render_loop.closure = Some(closure); + } + + // + // + // + Ok(()) } |
