Skip to content

Commit c340ea2

Browse files
committed
wasm32-unknown-unknown
1 parent 664e25b commit c340ea2

File tree

19 files changed

+790
-44
lines changed

19 files changed

+790
-44
lines changed

.github/workflows/check.yml

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
11
name: Check
22
on:
33
push:
4-
branches: [master]
4+
branches: [master, vange-rs-web]
55
pull_request:
6-
branches: [master]
6+
branches: [master, vange-rs-web]
77

88
jobs:
99
build:
@@ -17,4 +17,6 @@ jobs:
1717
- run: cargo check
1818
- if: matrix.os == 'ubuntu-latest'
1919
run: cargo check --features glsl
20+
- if: matrix.os == 'unbunt-latest'
21+
run: cargo check --bin road --features nodata --target wasm32-unknown-unknown
2022
- run: cargo test

.gitignore

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,3 +4,9 @@
44
.fuse_hidden*
55
.DS_Store
66
last-shader.wgsl
7+
8+
# web version
9+
web/assets/res
10+
web/assets/road.css
11+
web/road*
12+
res_linux

Cargo.lock

Lines changed: 17 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Cargo.toml

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ members = [
2020
default = []
2121
glsl = ["glsl-to-spirv", "wgpu/spirv"]
2222
profile = ["profiling/profile-with-tracy"]
23+
nodata = []
2324

2425
[[bin]]
2526
name = "road"
@@ -60,13 +61,13 @@ rust-ini = "0.17"
6061
serde = "1.0"
6162
serde_derive = "1.0"
6263
serde_scan = "0.4"
63-
wgpu = { git = "https://github.com/gfx-rs/wgpu", rev = "c8d572a", features = [] }
64+
wgpu = { git = "https://github.com/gfx-rs/wgpu", rev = "c8d572a", features = ["webgl"] }
6465
# binaries
6566
env_logger = "0.8"
6667
getopts = "0.2"
6768
obj = "0.10"
6869
png = "0.16"
69-
winit = "0.26"
70+
winit = { version = "0.26", features = [] }
7071

7172
[dev-dependencies]
7273
naga = { git = "https://github.com/gfx-rs/naga", rev = "c69f676", features = ["wgsl-in"] }
@@ -82,5 +83,11 @@ default-features = false
8283
#wgpu-core = { path = "../wgpu/wgpu-core" }
8384
#wgpu-types = { path = "../wgpu/wgpu-types" }
8485

85-
[patch."https://github.com/gfx-rs/naga"]
86-
#naga = { path = "../naga" }
86+
[target.'cfg(target_arch = "wasm32")'.dependencies]
87+
web-sys = { version = "0.3.55", features = [] }
88+
wasm-bindgen = "0.2.78"
89+
wasm-bindgen-futures = "0.4"
90+
console_error_panic_hook = { version = "0.1.7" }
91+
92+
[target.'cfg(target_arch = "wasm32")'.dependencies.getrandom]
93+
features = ["js"]

README.md

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,43 @@ Controls:
4242

4343
<img alt="game" src="etc/shots/Road11-pause.png" width="25%">
4444

45+
### Web version
46+
47+
Stage | State | Note |
48+
-------------------- | ------------------ | ----------- |
49+
Support FS | :white_check_mark: | [memfs]() |
50+
WebGL Initialization | :white_check_mark: ||
51+
Loading worlds | :white_check_mark: ||
52+
Loading heights | :white_check_mark: ||
53+
Loading data | :white_check_mark: ||
54+
Loading flood | :white_check_mark: ||
55+
Render | :white_check_mark: | WebGPU not tested |
56+
57+
**Resources**
58+
59+
To build game **you must** put resources of original game in `res_linux/data` folder.
60+
61+
**Debug build**
62+
63+
```sh
64+
cargo build --target wasm32-unknown-unknown --bin road --verbose && \
65+
wasm-bindgen --out-dir web/ --target web --keep-debug target/wasm32-unknown-unknown/debug/road.wasm
66+
```
67+
68+
**Release build**
69+
```sh
70+
cargo build --target wasm32-unknown-unknown --bin road --verbose --release && \
71+
wasm-bindgen --out-dir web/ --target web target/wasm32-unknown-unknown/release/road.wasm
72+
```
73+
74+
**Build web page**
75+
```sh
76+
cd web
77+
./build.sh
78+
```
79+
80+
After building you can run game just by serving `web` folder.
81+
4582
### Mechous viewer/debugger
4683
`car` binary allows to see the mechos with items selected by the configuration. It also shows the debug collision info.
4784
```bash

bin/boilerplate.rs

Lines changed: 58 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -4,14 +4,17 @@ use vangers::{
44
render::{ScreenTargets, DEPTH_FORMAT},
55
};
66

7-
use futures::executor::{LocalPool, LocalSpawner};
7+
use futures::executor::{block_on, LocalPool, LocalSpawner};
88
use log::info;
99
use winit::{
1010
event,
1111
event_loop::{ControlFlow, EventLoop},
1212
window::{Window, WindowBuilder},
1313
};
1414

15+
#[cfg(target_arch = "wasm32")]
16+
use crate::web;
17+
1518
pub trait Application {
1619
fn on_key(&mut self, input: event::KeyboardInput) -> bool;
1720
fn on_mouse_wheel(&mut self, _delta: event::MouseScrollDelta) {}
@@ -53,12 +56,15 @@ pub struct HarnessOptions {
5356
}
5457

5558
impl Harness {
59+
#[cfg(not(target_arch = "wasm32"))]
5660
pub fn init(options: HarnessOptions) -> (Self, config::Settings) {
57-
env_logger::init();
58-
let mut task_pool = LocalPool::new();
61+
block_on(Harness::init_async(options))
62+
}
5963

64+
pub async fn init_async(options: HarnessOptions) -> (Self, config::Settings) {
6065
info!("Loading the settings");
6166
let settings = config::Settings::load("config/settings.ron");
67+
6268
let extent = wgpu::Extent3d {
6369
width: settings.window.size[0],
6470
height: settings.window.size[1],
@@ -76,19 +82,25 @@ impl Harness {
7682
.unwrap();
7783
let surface = unsafe { instance.create_surface(&window) };
7884

79-
info!("Initializing the device");
80-
let adapter = task_pool
81-
.run_until(instance.request_adapter(&wgpu::RequestAdapterOptions {
85+
info!("Initializing the device:adapter");
86+
let adapter = instance
87+
.request_adapter(&wgpu::RequestAdapterOptions {
8288
power_preference: wgpu::PowerPreference::HighPerformance,
8389
compatible_surface: Some(&surface),
8490
force_fallback_adapter: false,
85-
}))
86-
.expect("Unable to initialize GPU via the selected backend.");
91+
})
92+
.await
93+
.expect("Unable to initialize GPU via the selected backend (adapter).");
8794

8895
let downlevel_caps = adapter.get_downlevel_properties();
8996
let adapter_limits = adapter.limits();
9097

98+
#[cfg(target_arch = "wasm32")]
9199
let mut limits = wgpu::Limits::downlevel_webgl2_defaults();
100+
101+
#[cfg(not(target_arch = "wasm32"))]
102+
let mut limits = wgpu::Limits::downlevel_defaults();
103+
92104
if options.uses_level {
93105
let desired_height = 16 << 10;
94106
limits.max_texture_dimension_2d =
@@ -102,8 +114,10 @@ impl Harness {
102114
desired_height
103115
};
104116
}
105-
let (device, queue) = task_pool
106-
.run_until(adapter.request_device(
117+
118+
info!("Initializing the device:request");
119+
let (device, queue) = adapter
120+
.request_device(
107121
&wgpu::DeviceDescriptor {
108122
label: None,
109123
features: wgpu::Features::empty(),
@@ -114,8 +128,9 @@ impl Harness {
114128
} else {
115129
Some(std::path::Path::new(&settings.render.wgpu_trace_path))
116130
},
117-
))
118-
.unwrap();
131+
)
132+
.await
133+
.expect("Unable to initialize GPU via the selected backend (request).");
119134

120135
let config = wgpu::SurfaceConfiguration {
121136
usage: wgpu::TextureUsages::RENDER_ATTACHMENT,
@@ -141,7 +156,7 @@ impl Harness {
141156
.create_view(&wgpu::TextureViewDescriptor::default());
142157

143158
let harness = Harness {
144-
task_pool,
159+
task_pool: LocalPool::new(),
145160
event_loop,
146161
window,
147162
device,
@@ -158,9 +173,15 @@ impl Harness {
158173
}
159174

160175
pub fn main_loop<A: 'static + Application>(self, mut app: A) {
176+
#[cfg(not(target_arch = "wasm32"))]
161177
use std::time;
162178

179+
#[cfg(target_arch = "wasm32")]
180+
let mut last_time = web::now();
181+
182+
#[cfg(not(target_arch = "wasm32"))]
163183
let mut last_time = time::Instant::now();
184+
164185
let mut needs_reload = false;
165186
let Harness {
166187
mut task_pool,
@@ -181,6 +202,9 @@ impl Harness {
181202
*control_flow = ControlFlow::Poll;
182203
task_pool.run_until_stalled();
183204

205+
#[cfg(target_arch = "wasm32")]
206+
web::bind_once(&mut app);
207+
184208
match event {
185209
event::Event::WindowEvent {
186210
event: event::WindowEvent::Resized(size),
@@ -241,13 +265,28 @@ impl Harness {
241265
},
242266
event::Event::MainEventsCleared => {
243267
let spawner = task_pool.spawner();
244-
let duration = time::Instant::now() - last_time;
245-
last_time += duration;
246-
let delta = duration.as_secs() as f32 + duration.subsec_nanos() as f32 * 1.0e-9;
247268

248-
let update_command_buffers = app.update(&device, delta, &spawner);
249-
if !update_command_buffers.is_empty() {
250-
queue.submit(update_command_buffers);
269+
let delta: f32;
270+
271+
#[cfg(target_arch = "wasm32")]
272+
{
273+
let duration = web::now() - last_time;
274+
last_time += duration;
275+
delta = (duration / 1000.0) as f32;
276+
}
277+
278+
#[cfg(not(target_arch = "wasm32"))]
279+
{
280+
let duration = time::Instant::now() - last_time;
281+
last_time += duration;
282+
delta = duration.as_secs() as f32 + duration.subsec_nanos() as f32 * 1.0e-9;
283+
}
284+
285+
if delta > 0.0 {
286+
let update_command_buffers = app.update(&device, delta, &spawner);
287+
if !update_command_buffers.is_empty() {
288+
queue.submit(update_command_buffers);
289+
}
251290
}
252291

253292
match surface.get_current_texture() {

bin/road/game.rs

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -811,14 +811,21 @@ impl Application for Game {
811811
}
812812

813813
{
814+
#[cfg(not(target_arch = "wasm32"))]
814815
use rayon::prelude::*;
815816

816817
let clipper = Clipper::new(&self.cam);
817818
let max_quant = self.max_quant;
818819
let common = &self.db.common;
819820
let level = &self.level;
820821

821-
self.agents.par_iter_mut().for_each(|a| {
822+
#[cfg(not(target_arch = "wasm32"))]
823+
let agent_iter = self.agents.par_iter_mut();
824+
825+
#[cfg(target_arch = "wasm32")]
826+
let agent_iter = self.agents.iter_mut();
827+
828+
agent_iter.for_each(|a| {
822829
let mut dt = physics_dt;
823830
a.cpu_apply_control(input_factor, common);
824831

0 commit comments

Comments
 (0)