Skip to content

Commit

Permalink
removed more extraneous files, old crates and made progress on WASM
Browse files Browse the repository at this point in the history
  • Loading branch information
schell committed May 5, 2024
1 parent 1afce9b commit bf1a2f7
Show file tree
Hide file tree
Showing 52 changed files with 419 additions and 2,124 deletions.
77 changes: 76 additions & 1 deletion Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

5 changes: 4 additions & 1 deletion Cargo.toml
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
[workspace]
members = [
"crates/example",
#"crates/example-wasm",
"crates/example-wasm",
"crates/loading-bytes",
"crates/renderling",
#"crates/renderling-gpui",
Expand Down Expand Up @@ -30,5 +30,8 @@ proc-macro2 = { version = "1.0", features = ["span-locations"] }
glam = { version = "0.24.2", default-features = false }
snafu = "0.7"
syn = { version = "2.0.49", features = ["full", "extra-traits", "parsing"] }
wasm-bindgen = "0.2"
wasm-bindgen-futures = "0.4"
web-sys = "0.3"
winit = { version = "0.29" }
wgpu = { version = "0.19" }
15 changes: 7 additions & 8 deletions crates/example-wasm/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -13,14 +13,13 @@ console_log = "^0.2"
console_error_panic_hook = "^0.1"
example = { path = "../example" }
fern = "0.6"
renderling = { path = "../renderling", features = ["wasm"] }
renderling-gpui = { path = "../renderling-gpui" }
wasm-bindgen = "^0.2"
wasm-bindgen-futures = "^0.4"
wasm-bindgen-test = "^0.3"
web-sys = { version = "^0.3", features = ["Document", "Element", "HtmlElement", "Window"] }

futures-lite = { workspace = true }
gltf = { workspace = true }
log = { workspace = true }
renderling = { path = "../renderling", features = ["wasm"] }
wasm-bindgen = { workspace = true }
wasm-bindgen-futures = { workspace = true }
wasm-bindgen-test = "^0.3"
web-sys = { workspace = true, features = ["Document", "Element", "Event", "HtmlCanvasElement", "HtmlElement", "Window"] }
winit = { workspace = true }
wgpu = { workspace = true }
wgpu = { workspace = true }
75 changes: 70 additions & 5 deletions crates/example-wasm/index.html
Original file line number Diff line number Diff line change
@@ -1,7 +1,72 @@
<!doctype html>
<html>
<head>
<link data-trunk rel="copy-dir" href="../../img" />
<link data-trunk rel="copy-dir" href="../../gltf" />
<link data-trunk rel="copy-dir" href="../../fonts" />
</head>
<head>
<style>
/* A sane CSS reset from
* https://www.digitalocean.com/community/tutorials/css-minimal-css-reset
*/
html {
box-sizing: border-box;
font-size: 16px;
}

*,
*:before,
*:after {
box-sizing: inherit;
}

body,
h1,
h2,
h3,
h4,
h5,
h6,
p,
ol,
ul {
margin: 0;
padding: 0;
font-weight: normal;
}

ol,
ul {
list-style: none;
}

img {
max-width: 100%;
height: auto;
}

main {
margin: 0;
width: 100%;
height: 100%;
background-color: #7f7f7f;
}

main canvas {
margin: 0;
padding: 0;
position: absolute;
left: 0;
right: 0;
top: 0;
bottom: 0;
background-color: #ffffff;
}

section fieldset {
margin: 0 0.25em 0.5em 0.25em;
}
</style>
</head>
<body>
<main>
<canvas></canvas>
</main>
</body>
</html>
88 changes: 88 additions & 0 deletions crates/example-wasm/src/event.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,88 @@
//! A light abstraction over UI event callbacks.
//!
//! This uses [`futures-lite::Stream`] to send events to downstream listeners.
use std::{
pin::Pin,
sync::{Arc, Mutex},
task::Waker,
};

use futures_lite::Stream;
use wasm_bindgen::{prelude::Closure, JsCast, JsValue};
use web_sys::EventTarget;

struct WebCallback {
target: EventTarget,
name: String,
closure: Option<Arc<Closure<dyn FnMut(JsValue)>>>,
waker: Arc<Mutex<Option<Waker>>>,
event: Arc<Mutex<Option<web_sys::Event>>>,
}

impl Drop for WebCallback {
fn drop(&mut self) {
if let Some(arc) = self.closure.take() {
if let Some(closure) = Arc::try_unwrap(arc).ok() {
self.target
.remove_event_listener_with_callback(
self.name.as_str(),
closure.as_ref().unchecked_ref(),
)
.unwrap();
log::trace!("dropping event {}", self.name);
}
}
}
}

impl Stream for WebCallback {
type Item = web_sys::Event;

fn poll_next(
self: Pin<&mut Self>,
cx: &mut std::task::Context<'_>,
) -> std::task::Poll<Option<Self::Item>> {
let data = self.get_mut();
*data.waker.lock().unwrap() = Some(cx.waker().clone());

if let Some(event) = data.event.lock().unwrap().take() {
std::task::Poll::Ready(Some(event))
} else {
std::task::Poll::Pending
}
}
}

/// Listen for events of the given name on the given target.
/// All events will be sent downstream until the stream is
/// dropped.
pub fn event_stream(
ev_name: &str,
target: &web_sys::EventTarget,
) -> impl Stream<Item = web_sys::Event> {
let waker: Arc<Mutex<Option<Waker>>> = Default::default();
let waker_here = waker.clone();

let event: Arc<Mutex<Option<web_sys::Event>>> = Default::default();
let event_here = event.clone();

let closure = Closure::wrap(Box::new(move |val: JsValue| {
let ev = val.unchecked_into();
*event.lock().unwrap() = Some(ev);
if let Some(waker) = waker.lock().unwrap().take() {
waker.wake()
}
}) as Box<dyn FnMut(JsValue)>);

target
.add_event_listener_with_callback(ev_name, closure.as_ref().unchecked_ref())
.unwrap();

WebCallback {
target: target.clone(),
name: ev_name.to_string(),
closure: Some(closure.into()),
event: event_here,
waker: waker_here,
}
}
Loading

0 comments on commit bf1a2f7

Please sign in to comment.