webvas 0.1.0 → 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/CHANGELOG.md +8 -2
- data/LICENSE.txt +1 -1
- data/README.md +82 -48
- data/docs/performance.md +12 -0
- data/docs/security.md +9 -0
- data/docs/spikes.md +18 -0
- data/exe/webvas +271 -0
- data/js/bridge.js +18 -0
- data/js/loader.js +22 -8
- data/lib/webvas/bridge.rb +5 -0
- data/lib/webvas/shader.rb +36 -0
- data/lib/webvas/version.rb +1 -1
- data/lib/webvas.rb +6 -0
- data/patches/psych-wasi.patch +9 -0
- data/runtime/Gemfile +22 -0
- data/runtime/Gemfile.lock +101 -0
- data/script/build_site +52 -0
- data/sig/webvas.rbs +11 -0
- data/site/app.js +466 -0
- data/site/index.html +56 -0
- data/site/loader-example.html +26 -0
- data/site/style.css +89 -0
- data/{js → site}/worker.js +30 -2
- metadata +40 -5
data/{js → site}/worker.js
RENAMED
|
@@ -4,11 +4,35 @@ const pendingEvents = [];
|
|
|
4
4
|
|
|
5
5
|
globalThis.window = {
|
|
6
6
|
requestAnimationFrame(callback) {
|
|
7
|
-
return setTimeout(() =>
|
|
7
|
+
return setTimeout(() => {
|
|
8
|
+
const now = performance.now();
|
|
9
|
+
const started = now;
|
|
10
|
+
callback(now);
|
|
11
|
+
frameMetrics(now, performance.now() - started);
|
|
12
|
+
}, 1000 / 60);
|
|
8
13
|
}
|
|
9
14
|
};
|
|
10
15
|
globalThis.requestAnimationFrame ||= callback => globalThis.window.requestAnimationFrame(callback);
|
|
11
16
|
|
|
17
|
+
let metricFrames = 0;
|
|
18
|
+
let metricStarted;
|
|
19
|
+
let callbackTime = 0;
|
|
20
|
+
|
|
21
|
+
function frameMetrics(now, elapsed) {
|
|
22
|
+
metricStarted ??= now;
|
|
23
|
+
metricFrames += 1;
|
|
24
|
+
callbackTime += elapsed;
|
|
25
|
+
if (metricFrames < 60) return;
|
|
26
|
+
const duration = now - metricStarted;
|
|
27
|
+
send("metrics", {
|
|
28
|
+
fps: (metricFrames - 1) * 1000 / duration,
|
|
29
|
+
callbackMs: callbackTime / metricFrames
|
|
30
|
+
});
|
|
31
|
+
metricFrames = 0;
|
|
32
|
+
callbackTime = 0;
|
|
33
|
+
metricStarted = now;
|
|
34
|
+
}
|
|
35
|
+
|
|
12
36
|
function send(type, payload = {}) {
|
|
13
37
|
globalThis.postMessage({ type: "webvas:" + type, ...payload });
|
|
14
38
|
}
|
|
@@ -18,7 +42,11 @@ globalThis.addEventListener("message", async event => {
|
|
|
18
42
|
try {
|
|
19
43
|
if (message?.type === "webvas:init") {
|
|
20
44
|
await import(message.bridgeUrl);
|
|
21
|
-
|
|
45
|
+
await import(message.shaderUrl);
|
|
46
|
+
globalThis.WebvasCanvases = {
|
|
47
|
+
[message.screenSelector || "#screen"]: message.screen,
|
|
48
|
+
[message.gpuSelector || "#gpu"]: message.gpu
|
|
49
|
+
};
|
|
22
50
|
pendingEvents.splice(0).forEach(input => globalThis.WebvasBridge.pushEvent(input));
|
|
23
51
|
send("loading", { message: "Downloading the Ruby drawing machine…" });
|
|
24
52
|
const { DefaultRubyVM } = await import("https://cdn.jsdelivr.net/npm/@ruby/wasm-wasi@2.10.1/dist/browser/+esm");
|
metadata
CHANGED
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: webvas
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 0.
|
|
4
|
+
version: 0.3.0
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Yudai Takada
|
|
8
|
-
bindir:
|
|
8
|
+
bindir: exe
|
|
9
9
|
cert_chain: []
|
|
10
10
|
date: 1980-01-02 00:00:00.000000000 Z
|
|
11
11
|
dependencies:
|
|
@@ -29,6 +29,26 @@ dependencies:
|
|
|
29
29
|
- - "<"
|
|
30
30
|
- !ruby/object:Gem::Version
|
|
31
31
|
version: '2'
|
|
32
|
+
- !ruby/object:Gem::Dependency
|
|
33
|
+
name: glaze
|
|
34
|
+
requirement: !ruby/object:Gem::Requirement
|
|
35
|
+
requirements:
|
|
36
|
+
- - ">="
|
|
37
|
+
- !ruby/object:Gem::Version
|
|
38
|
+
version: 0.1.0
|
|
39
|
+
- - "<"
|
|
40
|
+
- !ruby/object:Gem::Version
|
|
41
|
+
version: '0.2'
|
|
42
|
+
type: :runtime
|
|
43
|
+
prerelease: false
|
|
44
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
45
|
+
requirements:
|
|
46
|
+
- - ">="
|
|
47
|
+
- !ruby/object:Gem::Version
|
|
48
|
+
version: 0.1.0
|
|
49
|
+
- - "<"
|
|
50
|
+
- !ruby/object:Gem::Version
|
|
51
|
+
version: '0.2'
|
|
32
52
|
- !ruby/object:Gem::Dependency
|
|
33
53
|
name: base64
|
|
34
54
|
requirement: !ruby/object:Gem::Requirement
|
|
@@ -113,28 +133,43 @@ dependencies:
|
|
|
113
133
|
- - "~>"
|
|
114
134
|
- !ruby/object:Gem::Version
|
|
115
135
|
version: '3.6'
|
|
116
|
-
description: An RBGL canvas backend
|
|
136
|
+
description: An RBGL canvas backend, WebGPU shader bridge, and browser playground
|
|
137
|
+
powered by ruby.wasm.
|
|
117
138
|
email:
|
|
118
139
|
- t.yudai92@gmail.com
|
|
119
|
-
executables:
|
|
140
|
+
executables:
|
|
141
|
+
- webvas
|
|
120
142
|
extensions: []
|
|
121
143
|
extra_rdoc_files: []
|
|
122
144
|
files:
|
|
123
145
|
- CHANGELOG.md
|
|
124
146
|
- LICENSE.txt
|
|
125
147
|
- README.md
|
|
148
|
+
- docs/performance.md
|
|
149
|
+
- docs/security.md
|
|
150
|
+
- docs/spikes.md
|
|
151
|
+
- exe/webvas
|
|
126
152
|
- js/bridge.js
|
|
127
153
|
- js/loader.js
|
|
128
|
-
- js/worker.js
|
|
129
154
|
- lib/webvas.rb
|
|
130
155
|
- lib/webvas/backend.rb
|
|
131
156
|
- lib/webvas/bridge.rb
|
|
132
157
|
- lib/webvas/input.rb
|
|
133
158
|
- lib/webvas/key_map.rb
|
|
134
159
|
- lib/webvas/runner.rb
|
|
160
|
+
- lib/webvas/shader.rb
|
|
135
161
|
- lib/webvas/version.rb
|
|
162
|
+
- patches/psych-wasi.patch
|
|
163
|
+
- runtime/Gemfile
|
|
164
|
+
- runtime/Gemfile.lock
|
|
165
|
+
- script/build_site
|
|
136
166
|
- sig/rbgl.rbs
|
|
137
167
|
- sig/webvas.rbs
|
|
168
|
+
- site/app.js
|
|
169
|
+
- site/index.html
|
|
170
|
+
- site/loader-example.html
|
|
171
|
+
- site/style.css
|
|
172
|
+
- site/worker.js
|
|
138
173
|
homepage: https://github.com/rbgfx/webvas
|
|
139
174
|
licenses:
|
|
140
175
|
- MIT
|