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();
+}