diff options
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(()) } |
