use std::rc::Rc; use std::cell::RefCell; use log::{Level, info}; use wasm_bindgen::prelude::*; use state::State; mod line; mod point; mod state; struct RenderLoop { animation_id: Option, pub closure: Option>, } 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> = Rc::new(RefCell::new(RenderLoop::new())); { let closure: Closure = { 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(()) }