aboutsummaryrefslogtreecommitdiffstats
path: root/src/lib.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/lib.rs')
-rw-r--r--src/lib.rs62
1 files changed, 60 insertions, 2 deletions
diff --git a/src/lib.rs b/src/lib.rs
index 66bafe7..223e28a 100644
--- a/src/lib.rs
+++ b/src/lib.rs
@@ -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(())
}