From 63c9d816875d32527e99a3f8fcf856c9fe50f55d Mon Sep 17 00:00:00 2001 From: iceiix <43691553+iceiix@users.noreply.github.com> Date: Tue, 25 May 2021 08:13:07 -0700 Subject: [PATCH] Update to glow 0.9.0. Closes #532 (#545) --- Cargo.lock | 4 +-- Cargo.toml | 2 +- src/main.rs | 70 ++++++++++++++++++++++++++++++++++++++--------------- 3 files changed, 54 insertions(+), 22 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 443e11c..853f091 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -808,9 +808,9 @@ dependencies = [ [[package]] name = "glow" -version = "0.7.2" +version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "072136d2c3783f3a92f131acb227bc806d3886278e2a4dc1e9990ec89ef9e70b" +checksum = "4b80b98efaa8a34fce11d60dd2ce2760d5d83c373cbcc73bb87c2a3a84a54108" dependencies = [ "js-sys", "slotmap", diff --git a/Cargo.toml b/Cargo.toml index 0a80daa..0f42246 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -28,7 +28,7 @@ opt-level = 1 cfg-if = "1.0.0" wasm-bindgen = "0.2.74" winit = { version = "0.24.0", features = [ "web-sys" ]} -glow = "0.7.2" +glow = "0.9.0" byteorder = "1.4.3" serde = "1.0.126" serde_json = "1.0.61" diff --git a/src/main.rs b/src/main.rs index a763253..3e43e7a 100644 --- a/src/main.rs +++ b/src/main.rs @@ -211,11 +211,11 @@ struct Opt { cfg_if! { if #[cfg(target_arch = "wasm32")] { - use glow::HasRenderLoop; extern crate console_error_panic_hook; pub use console_error_panic_hook::set_once as set_panic_hook; use wasm_bindgen::prelude::*; + use wasm_bindgen::JsCast; #[wasm_bindgen] pub fn main() { main2(); } @@ -276,11 +276,10 @@ fn main2() { .with_inner_size(winit::dpi::LogicalSize::new(854.0, 480.0)); #[cfg(target_arch = "wasm32")] - let (context, shader_version, dpi_factor, winit_window, render_loop) = { + let (context, shader_version, dpi_factor, winit_window) = { let winit_window = window_builder.build(&events_loop).unwrap(); let dpi_factor = winit_window.scale_factor(); - use wasm_bindgen::JsCast; use winit::platform::web::WindowExtWebSys; let canvas = winit_window.canvas(); @@ -304,7 +303,6 @@ fn main2() { "#version 300 es", // WebGL 2 dpi_factor, winit_window, - glow::RenderLoop::from_request_animation_frame(), ) }; @@ -425,22 +423,56 @@ fn main2() { let game = Rc::clone(&game); let ui_container = Rc::clone(&ui_container); - render_loop.run(move |running: &mut bool| { - let winit_window = winit_window.borrow_mut(); - let mut game = game.borrow_mut(); - let mut ui_container = ui_container.borrow_mut(); + // Based on https://github.com/grovesNL/glow/blob/2d42c5b105d979efe764191b5b1ce78fab99ffcf/src/web_sys.rs#L3258 + fn request_animation_frame(f: &Closure) { + web_sys::window() + .unwrap() + .request_animation_frame(f.as_ref().unchecked_ref()) + .unwrap(); + } - tick_all( - &winit_window, - &mut game, - &mut ui_container, - &mut last_frame, - &mut resui, - &mut last_resource_version, - &mut vsync, - ); - println!("render_loop"); - }); + let f = Rc::new(RefCell::new(None)); + + let mut last_timestamp = None; + let mut running = true; + + *f.borrow_mut() = Some(Closure::wrap(Box::new({ + let f = f.clone(); + + move |timestamp: f64| { + let dt = last_timestamp.map_or(Duration::from_secs(0), |last_timestamp: f64| { + let dt_ms = (timestamp - last_timestamp).max(0.0); + let dt_secs = dt_ms / 1000.0; + + Duration::from_secs_f64(dt_secs) + }); + last_timestamp = Some(timestamp); + + let winit_window = winit_window.borrow_mut(); + let mut game = game.borrow_mut(); + let mut ui_container = ui_container.borrow_mut(); + + tick_all( + &winit_window, + &mut game, + &mut ui_container, + &mut last_frame, + &mut resui, + &mut last_resource_version, + &mut vsync, + ); + println!("render_loop"); + + if !running { + let _ = f.borrow_mut().take(); + return; + } + + request_animation_frame(f.borrow().as_ref().unwrap()); + } + }) as Box)); + + request_animation_frame(f.borrow().as_ref().unwrap()); } #[cfg(target_arch = "wasm32")]