From 771b7743fb4a72da4d888722f057e59ab43e5528 Mon Sep 17 00:00:00 2001 From: Zageron Date: Sun, 25 Sep 2022 18:00:13 -0700 Subject: [PATCH 1/3] First draft --- crates/core/src/play/mod.rs | 17 +++++++++++++---- crates/head-wasm/Cargo.toml | 1 + crates/head-wasm/src/lib.rs | 7 +++---- crates/head/src/lib.rs | 13 +++++++++++++ web/index.html | 3 ++- web/src/judgement.js | 3 +++ 6 files changed, 35 insertions(+), 9 deletions(-) create mode 100644 web/src/judgement.js diff --git a/crates/core/src/play/mod.rs b/crates/core/src/play/mod.rs index 321cc1b..8bd1698 100644 --- a/crates/core/src/play/mod.rs +++ b/crates/core/src/play/mod.rs @@ -17,7 +17,9 @@ use crate::{ use btreemultimap::{BTreeMultiMap, MultiRange}; use std::collections::HashSet; -#[derive(Debug, Default, Clone)] +#[cfg_attr(target_arch = "wasm32", wasm_bindgen::prelude::wasm_bindgen)] +#[derive(Debug, Default, Clone, Copy)] +#[repr(C)] pub struct JudgementReport { pub amazings: u32, pub perfects: u32, @@ -28,9 +30,9 @@ pub struct JudgementReport { } pub struct Play { - field: Field, - state: S, - settings: Settings, + pub field: Field, + pub state: S, + pub settings: Settings, } impl Play { @@ -51,6 +53,13 @@ pub struct Active { judgement_report: JudgementReport, } +impl Active { + #[must_use] + pub fn judgement_report(&self) -> &JudgementReport { + &self.judgement_report + } +} + pub struct Concluded { turntable: Turntable, actions: BTreeMultiMap, diff --git a/crates/head-wasm/Cargo.toml b/crates/head-wasm/Cargo.toml index 26cef9d..b972011 100644 --- a/crates/head-wasm/Cargo.toml +++ b/crates/head-wasm/Cargo.toml @@ -22,6 +22,7 @@ release = ["rrr-head/release", "rrr-head/web"] [dependencies] anyhow = "1.0.65" +js-sys = "0.3.60" log = { version = "0.4.17" } rrr-head = { path = "../head", default-features = false } console_error_panic_hook = "0.1.7" diff --git a/crates/head-wasm/src/lib.rs b/crates/head-wasm/src/lib.rs index a0f8cda..38b2849 100644 --- a/crates/head-wasm/src/lib.rs +++ b/crates/head-wasm/src/lib.rs @@ -11,6 +11,7 @@ use std::rc::Rc; use wasm_bindgen::{closure::Closure, prelude::wasm_bindgen, JsCast}; use web_sys::HtmlCanvasElement; + pub fn build_window( event_loop: &EventLoop<()>, canvas: Option, @@ -29,13 +30,13 @@ pub fn build_window( } } -#[wasm_bindgen(start)] +#[cfg_attr(target_arch = "wasm32", wasm_bindgen::prelude::wasm_bindgen(start))] pub fn initialize() { console_log::init().unwrap(); log::info!("RRR loaded."); } -#[wasm_bindgen] +#[cfg_attr(target_arch = "wasm32", wasm_bindgen::prelude::wasm_bindgen)] pub fn play(canvas: Option, width: u32, height: u32) { std::panic::set_hook(Box::new(console_error_panic_hook::hook)); wasm_bindgen_futures::spawn_local(async move { @@ -104,8 +105,6 @@ async fn initialize_window( } pub fn register_on_visibility_change_listener(window: &web_sys::Window) { - use wasm_bindgen::JsCast; - let closure = Closure::wrap(Box::new(move || { let window = web_sys::window().unwrap(); let document = window.document().unwrap(); diff --git a/crates/head/src/lib.rs b/crates/head/src/lib.rs index 3aed1c8..0b28ac7 100644 --- a/crates/head/src/lib.rs +++ b/crates/head/src/lib.rs @@ -24,10 +24,19 @@ use winit::{ window::WindowBuilder, }; +#[cfg_attr( + target_arch = "wasm32", + wasm_bindgen::prelude::wasm_bindgen(module = "\\/src\\/judgement.js") +)] +extern "C" { + fn update_judgement(judgement_report: play::JudgementReport); +} + pub mod prelude { pub use anyhow; pub use futures; pub use log; + pub use rrr_core::play; pub use winit; } @@ -446,6 +455,10 @@ where self.screen_height, ); } + + unsafe { + update_judgement(*play.state.judgement_report()); + } } } } diff --git a/web/index.html b/web/index.html index 6b1f830..a15711b 100644 --- a/web/index.html +++ b/web/index.html @@ -77,7 +77,8 @@