diff --git a/.gitignore b/.gitignore index 2c96eb1..9825d2b 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,4 @@ +package/ target/ + Cargo.lock diff --git a/Cargo.toml b/Cargo.toml index 1763e25..593721a 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -9,7 +9,7 @@ publish = false [lib] name = "renderer" -crate-type = ["rlib"] +crate-type = ["cdylib", "rlib"] path = "src/lib.rs" [[bin]] @@ -17,3 +17,16 @@ name = "renderer" path = "src/main.rs" [dependencies] +cfg-if = "1" +env_logger = "0.10" +log = "0.4" +wgpu = "0.18" +winit = "0.28" + +[target.'cfg(target_arch = "wasm32")'.dependencies] +console_error_panic_hook = "0.1.6" +console_log = "1.0" +wasm-bindgen = "0.2" +wasm-bindgen-futures = "0.4.30" +web-sys = { version = "0.3", features = ["Document", "Window", "Element"] } +wgpu = { version = "0.18", features = ["webgl"] } diff --git a/examples/index.html b/examples/index.html new file mode 100644 index 0000000..091656c --- /dev/null +++ b/examples/index.html @@ -0,0 +1,26 @@ + + + + + + Renderer + + + + + + + + + + diff --git a/scripts/wasm.ps1 b/scripts/wasm.ps1 new file mode 100644 index 0000000..970f336 --- /dev/null +++ b/scripts/wasm.ps1 @@ -0,0 +1,3 @@ +#!/usr/bin/env sh + +wasm-pack build --target web -d package diff --git a/src/lib.rs b/src/lib.rs index e69de29..5b33904 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -0,0 +1,62 @@ +use winit::{ + dpi::LogicalSize, + event::*, + event_loop::{ControlFlow, EventLoop}, + window::WindowBuilder, +}; + +#[cfg(target_arch = "wasm32")] +use wasm_bindgen::prelude::*; + +#[cfg_attr(target_arch = "wasm32", wasm_bindgen(start))] +pub fn run() { + cfg_if::cfg_if! { + if #[cfg(target_arch = "wasm32")] { + std::panic::set_hook(Box::new(console_error_panic_hook::hook)); + console_log::init_with_level(log::Level::Warn).expect("Couldn't initialize logger"); + } else { + env_logger::init(); + } + } + + let event_loop = EventLoop::new(); + let window = WindowBuilder::new() + .with_title("Renderer") + .with_inner_size(LogicalSize::new(1280, 720)) + .build(&event_loop) + .unwrap(); + + #[cfg(target_arch = "wasm32")] + { + use winit::platform::web::WindowExtWebSys; + web_sys::window() + .and_then(|win| win.document()) + .and_then(|doc| { + let dst = doc.get_element_by_id("wasm-example")?; + let canvas = web_sys::Element::from(window.canvas()); + dst.append_child(&canvas).ok()?; + Some(()) + }) + .expect("Couldn't append canvas to document body."); + } + + event_loop.run(move |event, _, control_flow| match event { + Event::WindowEvent { + ref event, + window_id, + } if window_id == window.id() => match event { + WindowEvent::CloseRequested + | WindowEvent::KeyboardInput { + input: + KeyboardInput { + state: ElementState::Pressed, + virtual_keycode: Some(VirtualKeyCode::Escape), + .. + }, + .. + } => *control_flow = ControlFlow::Exit, + _ => {} + }, + _ => {} + }); +} diff --git a/src/main.rs b/src/main.rs index f328e4d..58cc21c 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1 +1,5 @@ -fn main() {} +use renderer::run; + +fn main() { + run(); +}