parent
9e570d953d
commit
63c9d81687
|
@ -808,9 +808,9 @@ dependencies = [
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "glow"
|
name = "glow"
|
||||||
version = "0.7.2"
|
version = "0.9.0"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "072136d2c3783f3a92f131acb227bc806d3886278e2a4dc1e9990ec89ef9e70b"
|
checksum = "4b80b98efaa8a34fce11d60dd2ce2760d5d83c373cbcc73bb87c2a3a84a54108"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"js-sys",
|
"js-sys",
|
||||||
"slotmap",
|
"slotmap",
|
||||||
|
|
|
@ -28,7 +28,7 @@ opt-level = 1
|
||||||
cfg-if = "1.0.0"
|
cfg-if = "1.0.0"
|
||||||
wasm-bindgen = "0.2.74"
|
wasm-bindgen = "0.2.74"
|
||||||
winit = { version = "0.24.0", features = [ "web-sys" ]}
|
winit = { version = "0.24.0", features = [ "web-sys" ]}
|
||||||
glow = "0.7.2"
|
glow = "0.9.0"
|
||||||
byteorder = "1.4.3"
|
byteorder = "1.4.3"
|
||||||
serde = "1.0.126"
|
serde = "1.0.126"
|
||||||
serde_json = "1.0.61"
|
serde_json = "1.0.61"
|
||||||
|
|
70
src/main.rs
70
src/main.rs
|
@ -211,11 +211,11 @@ struct Opt {
|
||||||
|
|
||||||
cfg_if! {
|
cfg_if! {
|
||||||
if #[cfg(target_arch = "wasm32")] {
|
if #[cfg(target_arch = "wasm32")] {
|
||||||
use glow::HasRenderLoop;
|
|
||||||
extern crate console_error_panic_hook;
|
extern crate console_error_panic_hook;
|
||||||
pub use console_error_panic_hook::set_once as set_panic_hook;
|
pub use console_error_panic_hook::set_once as set_panic_hook;
|
||||||
|
|
||||||
use wasm_bindgen::prelude::*;
|
use wasm_bindgen::prelude::*;
|
||||||
|
use wasm_bindgen::JsCast;
|
||||||
|
|
||||||
#[wasm_bindgen]
|
#[wasm_bindgen]
|
||||||
pub fn main() { main2(); }
|
pub fn main() { main2(); }
|
||||||
|
@ -276,11 +276,10 @@ fn main2() {
|
||||||
.with_inner_size(winit::dpi::LogicalSize::new(854.0, 480.0));
|
.with_inner_size(winit::dpi::LogicalSize::new(854.0, 480.0));
|
||||||
|
|
||||||
#[cfg(target_arch = "wasm32")]
|
#[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 winit_window = window_builder.build(&events_loop).unwrap();
|
||||||
let dpi_factor = winit_window.scale_factor();
|
let dpi_factor = winit_window.scale_factor();
|
||||||
|
|
||||||
use wasm_bindgen::JsCast;
|
|
||||||
use winit::platform::web::WindowExtWebSys;
|
use winit::platform::web::WindowExtWebSys;
|
||||||
|
|
||||||
let canvas = winit_window.canvas();
|
let canvas = winit_window.canvas();
|
||||||
|
@ -304,7 +303,6 @@ fn main2() {
|
||||||
"#version 300 es", // WebGL 2
|
"#version 300 es", // WebGL 2
|
||||||
dpi_factor,
|
dpi_factor,
|
||||||
winit_window,
|
winit_window,
|
||||||
glow::RenderLoop::from_request_animation_frame(),
|
|
||||||
)
|
)
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -425,22 +423,56 @@ fn main2() {
|
||||||
let game = Rc::clone(&game);
|
let game = Rc::clone(&game);
|
||||||
let ui_container = Rc::clone(&ui_container);
|
let ui_container = Rc::clone(&ui_container);
|
||||||
|
|
||||||
render_loop.run(move |running: &mut bool| {
|
// Based on https://github.com/grovesNL/glow/blob/2d42c5b105d979efe764191b5b1ce78fab99ffcf/src/web_sys.rs#L3258
|
||||||
let winit_window = winit_window.borrow_mut();
|
fn request_animation_frame(f: &Closure<dyn FnMut(f64)>) {
|
||||||
let mut game = game.borrow_mut();
|
web_sys::window()
|
||||||
let mut ui_container = ui_container.borrow_mut();
|
.unwrap()
|
||||||
|
.request_animation_frame(f.as_ref().unchecked_ref())
|
||||||
|
.unwrap();
|
||||||
|
}
|
||||||
|
|
||||||
tick_all(
|
let f = Rc::new(RefCell::new(None));
|
||||||
&winit_window,
|
|
||||||
&mut game,
|
let mut last_timestamp = None;
|
||||||
&mut ui_container,
|
let mut running = true;
|
||||||
&mut last_frame,
|
|
||||||
&mut resui,
|
*f.borrow_mut() = Some(Closure::wrap(Box::new({
|
||||||
&mut last_resource_version,
|
let f = f.clone();
|
||||||
&mut vsync,
|
|
||||||
);
|
move |timestamp: f64| {
|
||||||
println!("render_loop");
|
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<dyn FnMut(f64)>));
|
||||||
|
|
||||||
|
request_animation_frame(f.borrow().as_ref().unwrap());
|
||||||
}
|
}
|
||||||
|
|
||||||
#[cfg(target_arch = "wasm32")]
|
#[cfg(target_arch = "wasm32")]
|
||||||
|
|
Loading…
Reference in New Issue