refactor: simplify web bootstrap
Amp-Thread-ID: https://ampcode.com/threads/T-019f9d91-77c1-7206-a60f-ed6554ce92ab Co-authored-by: Heaust Azure <heaust.azure@gmail.com>
This commit is contained in:
+10
-61
@@ -14,27 +14,13 @@ use wasm_bindgen_futures::spawn_local;
|
||||
#[cfg(target_arch = "wasm32")]
|
||||
use web_sys::AddEventListenerOptions;
|
||||
|
||||
/// Helper struct to store event listener closures
|
||||
#[cfg(target_arch = "wasm32")]
|
||||
pub struct EventListeners {
|
||||
pub resize_listener: Option<Closure<dyn FnMut()>>,
|
||||
pub pointer_listener: Option<Closure<dyn FnMut(web_sys::PointerEvent)>>,
|
||||
pub click_listener: Option<Closure<dyn FnMut(web_sys::MouseEvent)>>,
|
||||
pub wheel_listener: Option<Closure<dyn FnMut(web_sys::WheelEvent)>>,
|
||||
pub contextmenu_listener: Option<Closure<dyn FnMut(web_sys::MouseEvent)>>,
|
||||
}
|
||||
|
||||
#[cfg(target_arch = "wasm32")]
|
||||
impl EventListeners {
|
||||
pub fn new() -> Self {
|
||||
Self {
|
||||
resize_listener: None,
|
||||
pointer_listener: None,
|
||||
click_listener: None,
|
||||
wheel_listener: None,
|
||||
contextmenu_listener: None,
|
||||
}
|
||||
}
|
||||
_resize_listener: Closure<dyn FnMut()>,
|
||||
_pointer_listener: Closure<dyn FnMut(web_sys::PointerEvent)>,
|
||||
_click_listener: Closure<dyn FnMut(web_sys::MouseEvent)>,
|
||||
_wheel_listener: Closure<dyn FnMut(web_sys::WheelEvent)>,
|
||||
_contextmenu_listener: Closure<dyn FnMut(web_sys::MouseEvent)>,
|
||||
}
|
||||
|
||||
/// Setup default window event listeners that forward events to the worker thread
|
||||
@@ -152,11 +138,11 @@ pub fn setup_event_listeners(
|
||||
)?;
|
||||
|
||||
Ok(EventListeners {
|
||||
resize_listener: Some(resize_listener),
|
||||
pointer_listener: Some(pointer_listener),
|
||||
click_listener: Some(click_listener),
|
||||
wheel_listener: Some(wheel_listener),
|
||||
contextmenu_listener: Some(contextmenu_listener),
|
||||
_resize_listener: resize_listener,
|
||||
_pointer_listener: pointer_listener,
|
||||
_click_listener: click_listener,
|
||||
_wheel_listener: wheel_listener,
|
||||
_contextmenu_listener: contextmenu_listener,
|
||||
})
|
||||
}
|
||||
|
||||
@@ -164,7 +150,6 @@ pub fn setup_event_listeners(
|
||||
#[cfg(target_arch = "wasm32")]
|
||||
pub struct WebAppRuntime {
|
||||
worker: MainWorker,
|
||||
worker_chan: Sender<WindowEvent>,
|
||||
_event_listeners: EventListeners,
|
||||
ring: Box<CommandRing>,
|
||||
}
|
||||
@@ -199,17 +184,11 @@ impl WebAppRuntime {
|
||||
|
||||
Ok(Self {
|
||||
worker,
|
||||
worker_chan: sender,
|
||||
_event_listeners: event_listeners,
|
||||
ring,
|
||||
})
|
||||
}
|
||||
|
||||
/// Access the worker channel sender for dispatching custom window events.
|
||||
pub fn sender(&self) -> &Sender<WindowEvent> {
|
||||
&self.worker_chan
|
||||
}
|
||||
|
||||
/// Access the spawned worker reference.
|
||||
pub fn worker(&self) -> &MainWorker {
|
||||
&self.worker
|
||||
@@ -218,33 +197,3 @@ impl WebAppRuntime {
|
||||
self.ring.ptr()
|
||||
}
|
||||
}
|
||||
|
||||
/// Trait for applications that rely on the renderer's default WASM setup.
|
||||
#[cfg(target_arch = "wasm32")]
|
||||
pub trait WebApp {
|
||||
type Scene: crate::renderer::scene::Scene + 'static;
|
||||
|
||||
/// Name used for the spawned `MainWorker`.
|
||||
fn worker_name() -> &'static str {
|
||||
"main-worker"
|
||||
}
|
||||
|
||||
/// CSS selector for the canvas element that will be transferred to the worker.
|
||||
fn canvas_selector() -> &'static str {
|
||||
"#canvas0"
|
||||
}
|
||||
|
||||
/// Hook invoked after the runtime has been created.
|
||||
fn on_runtime_initialized(_runtime: &mut WebAppRuntime) {}
|
||||
|
||||
/// Perform the default WASM initialization routine.
|
||||
fn setup_runtime(profile: bool) -> Result<WebAppRuntime, JsValue> {
|
||||
let mut runtime = WebAppRuntime::new::<Self::Scene>(
|
||||
Self::worker_name(),
|
||||
Self::canvas_selector(),
|
||||
profile,
|
||||
)?;
|
||||
Self::on_runtime_initialized(&mut runtime);
|
||||
Ok(runtime)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -6,11 +6,5 @@ pub fn get_canvas_element(selectors: &str) -> web_sys::HtmlCanvasElement {
|
||||
let window = web_sys::window().unwrap();
|
||||
let document = window.document().unwrap();
|
||||
let element = document.query_selector(selectors).unwrap().unwrap();
|
||||
let canvas = element.dyn_into::<web_sys::HtmlCanvasElement>().unwrap();
|
||||
let scale_factor = window.device_pixel_ratio();
|
||||
let width = (canvas.client_width() as f64 * scale_factor) as u32;
|
||||
let height = (canvas.client_height() as f64 * scale_factor) as u32;
|
||||
canvas.set_width(width);
|
||||
canvas.set_height(height);
|
||||
canvas
|
||||
element.dyn_into::<web_sys::HtmlCanvasElement>().unwrap()
|
||||
}
|
||||
|
||||
@@ -2,8 +2,6 @@
|
||||
// Works for any application because the relative depth from this file to pkg is stable.
|
||||
import initWasm, { clear_payloads, discard_payload, stage_payload, worker_entrypoint } from "/level-editor/pkg/level_editor.js";
|
||||
|
||||
export function attachMain() {}
|
||||
|
||||
export function listenerReady() {
|
||||
if (state !== "waiting-listener") return;
|
||||
state = "replaying";
|
||||
|
||||
@@ -20,10 +20,6 @@ extern "C" {
|
||||
/// So that bundler can bundle it together.
|
||||
#[wasm_bindgen(module = "/src/platform/web/worker/mainWorker.js")]
|
||||
extern "C" {
|
||||
/// Nothing to do.
|
||||
#[wasm_bindgen]
|
||||
fn attachMain();
|
||||
|
||||
#[wasm_bindgen(js_name = "listenerReady")]
|
||||
fn listener_ready();
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user