@worldmesh/runtime 0.2.1 → 0.2.2
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.
- package/README.md +33 -3
- package/dist/audio/footsteps.d.ts +37 -0
- package/dist/audio/footsteps.d.ts.map +1 -0
- package/dist/audio/footsteps.js +178 -0
- package/dist/audio/footsteps.js.map +1 -0
- package/dist/avatar/descriptor.d.ts +15 -0
- package/dist/avatar/descriptor.d.ts.map +1 -1
- package/dist/avatar/descriptor.js +19 -0
- package/dist/avatar/descriptor.js.map +1 -1
- package/dist/avatar/loader.d.ts +12 -1
- package/dist/avatar/loader.d.ts.map +1 -1
- package/dist/avatar/loader.js +16 -1
- package/dist/avatar/loader.js.map +1 -1
- package/dist/avatar/share.d.ts +30 -0
- package/dist/avatar/share.d.ts.map +1 -0
- package/dist/avatar/share.js +203 -0
- package/dist/avatar/share.js.map +1 -0
- package/dist/camera/cameraRig.d.ts +4 -0
- package/dist/camera/cameraRig.d.ts.map +1 -1
- package/dist/camera/cameraRig.js +10 -1
- package/dist/camera/cameraRig.js.map +1 -1
- package/dist/camera/viewHandoff.d.ts +20 -0
- package/dist/camera/viewHandoff.d.ts.map +1 -0
- package/dist/camera/viewHandoff.js +64 -0
- package/dist/camera/viewHandoff.js.map +1 -0
- package/dist/controls/input.d.ts +29 -0
- package/dist/controls/input.d.ts.map +1 -1
- package/dist/controls/input.js +124 -1
- package/dist/controls/input.js.map +1 -1
- package/dist/controls/touch.d.ts +10 -0
- package/dist/controls/touch.d.ts.map +1 -1
- package/dist/controls/touch.js +57 -1
- package/dist/controls/touch.js.map +1 -1
- package/dist/core/worldmesh.d.ts +9 -0
- package/dist/core/worldmesh.d.ts.map +1 -1
- package/dist/core/worldmesh.js +498 -26
- package/dist/core/worldmesh.js.map +1 -1
- package/dist/index.d.ts +14 -7
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +11 -5
- package/dist/index.js.map +1 -1
- package/dist/net/follow.d.ts +7 -0
- package/dist/net/follow.d.ts.map +1 -0
- package/dist/net/follow.js +10 -0
- package/dist/net/follow.js.map +1 -0
- package/dist/net/presence.d.ts +125 -3
- package/dist/net/presence.d.ts.map +1 -1
- package/dist/net/presence.js +471 -24
- package/dist/net/presence.js.map +1 -1
- package/dist/net/roomFull.d.ts +44 -0
- package/dist/net/roomFull.d.ts.map +1 -0
- package/dist/net/roomFull.js +147 -0
- package/dist/net/roomFull.js.map +1 -0
- package/dist/player/avatar.d.ts +17 -4
- package/dist/player/avatar.d.ts.map +1 -1
- package/dist/player/avatar.js +85 -18
- package/dist/player/avatar.js.map +1 -1
- package/dist/player/player.d.ts +6 -2
- package/dist/player/player.d.ts.map +1 -1
- package/dist/player/player.js +13 -3
- package/dist/player/player.js.map +1 -1
- package/dist/player/stroke.d.ts +11 -0
- package/dist/player/stroke.d.ts.map +1 -0
- package/dist/player/stroke.js +96 -0
- package/dist/player/stroke.js.map +1 -0
- package/dist/portals/portals.d.ts +1 -1
- package/dist/portals/portals.d.ts.map +1 -1
- package/dist/portals/portals.js +6 -2
- package/dist/portals/portals.js.map +1 -1
- package/dist/types.d.ts +53 -9
- package/dist/types.d.ts.map +1 -1
- package/dist/ui/overlay.d.ts +18 -0
- package/dist/ui/overlay.d.ts.map +1 -1
- package/dist/ui/overlay.js +166 -1
- package/dist/ui/overlay.js.map +1 -1
- package/dist/xr/session.d.ts +13 -0
- package/dist/xr/session.d.ts.map +1 -0
- package/dist/xr/session.js +33 -0
- package/dist/xr/session.js.map +1 -0
- package/package.json +1 -1
- package/src/audio/footsteps.ts +185 -0
- package/src/avatar/descriptor.ts +28 -0
- package/src/avatar/loader.ts +19 -2
- package/src/avatar/share.ts +196 -0
- package/src/camera/cameraRig.ts +10 -1
- package/src/camera/viewHandoff.ts +67 -0
- package/src/controls/input.ts +119 -1
- package/src/controls/touch.ts +59 -1
- package/src/core/worldmesh.ts +495 -25
- package/src/index.ts +14 -7
- package/src/net/follow.ts +9 -0
- package/src/net/presence.ts +547 -27
- package/src/net/roomFull.ts +160 -0
- package/src/player/avatar.ts +87 -18
- package/src/player/player.ts +13 -4
- package/src/player/stroke.ts +93 -0
- package/src/portals/portals.ts +5 -2
- package/src/types.ts +52 -9
- package/src/ui/overlay.ts +171 -1
- package/src/xr/session.ts +33 -0
package/README.md
CHANGED
|
@@ -40,7 +40,8 @@ const world = createWorldMesh({
|
|
|
40
40
|
|
|
41
41
|
You get WASD + arrow keys, mouse look, jump, sprint, interact, first/third
|
|
42
42
|
person with a consistent toggle, pointer-lock handling, touch controls on touch
|
|
43
|
-
devices, the shared
|
|
43
|
+
devices, immersive VR through the shared Enter VR control when WebXR is
|
|
44
|
+
available, the shared overlay and portals between worlds.
|
|
44
45
|
|
|
45
46
|
Removing the `createWorldMesh` call leaves you with the Three.js project you
|
|
46
47
|
started with.
|
|
@@ -51,8 +52,8 @@ started with.
|
|
|
51
52
|
createWorldMesh({ scene, camera, renderer, avatar: { source: 'worldmesh' } });
|
|
52
53
|
```
|
|
53
54
|
|
|
54
|
-
Visitors who picked a character in their WorldMesh Avatar Wallet (
|
|
55
|
-
at3d) arrive with a short-lived ticket in the URL fragment. The runtime removes
|
|
55
|
+
Visitors who picked a character in their WorldMesh Avatar Wallet (Sketchfab,
|
|
56
|
+
VRoid Hub, at3d) arrive with a short-lived ticket in the URL fragment. The runtime removes
|
|
56
57
|
it from the address bar, asks the hub for a descriptor, and loads the VRM or
|
|
57
58
|
glTF straight from the platform that hosts it. Portals carry the ticket on.
|
|
58
59
|
Without a ticket, or if anything fails, the player keeps the default body.
|
|
@@ -63,6 +64,32 @@ or call `world.loadAvatar(descriptor)` / `world.clearAvatar()` at any time.
|
|
|
63
64
|
`avatar:load` and `avatar:error` events report the outcome. The VRM and glTF
|
|
64
65
|
loaders (`@pixiv/three-vrm`) are only downloaded when an avatar is shown.
|
|
65
66
|
|
|
67
|
+
## Your own multiplayer backend (optional)
|
|
68
|
+
|
|
69
|
+
`multiplayer: true` uses the WorldMesh presence relay. A world on Nakama,
|
|
70
|
+
Colyseus, PartyKit, Supabase Realtime, Ably or a WebSocket server of its own
|
|
71
|
+
passes a `NetworkAdapter` as `network` instead, and nothing goes through
|
|
72
|
+
WorldMesh's servers. The runtime calls its `attach`, `bodies` and `detach`; the
|
|
73
|
+
adapter listens to `update` for the visitor's state and draws everyone else.
|
|
74
|
+
Guide, a complete example and what the relay does that you then do yourself:
|
|
75
|
+
[Your own network layer](https://github.com/eliaswillnat/worldmesh/blob/main/docs/compatibility.md#your-own-network-layer).
|
|
76
|
+
|
|
77
|
+
## Live doors
|
|
78
|
+
|
|
79
|
+
A hub door can show your world itself, live, as seen from the visitor's own
|
|
80
|
+
camera: water moving, everything as it is. Publish a Doorway file at
|
|
81
|
+
`/.well-known/doorway.json` saying `{ "doorway": 1, "view": true }` and let
|
|
82
|
+
hubs frame your page. The hub opens it with `?doorway-view` and sends its
|
|
83
|
+
camera every frame; the runtime does the rest: offline, no UI, no input,
|
|
84
|
+
drawing only the doorway's part of the screen from that camera, carried onto
|
|
85
|
+
your spawn point (Doorway spec §3.1). Hubs keep the cover for worlds without it.
|
|
86
|
+
|
|
87
|
+
Add `"embed": true` (and `"characters": ["vrm", "glb"]` if you show
|
|
88
|
+
visitors' avatars) and visitors can walk straight in: as they cross the
|
|
89
|
+
doorway the hub hands over their pose, and the same page takes over the
|
|
90
|
+
screen, online, with no reload (§4). While inside, `travelTo` asks the hub to
|
|
91
|
+
open other pages, as the page around your world is the hub's.
|
|
92
|
+
|
|
66
93
|
## What is exported
|
|
67
94
|
|
|
68
95
|
| | |
|
|
@@ -74,7 +101,10 @@ loaders (`@pixiv/three-vrm`) are only downloaded when an avatar is shown.
|
|
|
74
101
|
| `PortalManager`, `buildTravelUrl`, `getReferringWorld` | travel between worlds |
|
|
75
102
|
| `loadAvatarModel`, `resolveWorldMeshAvatar`, `parseAvatarDescriptor`, `AvatarDescriptor` | visitors' own avatars |
|
|
76
103
|
| `Overlay`, `Emitter` | the shared overlay, a tiny typed emitter |
|
|
104
|
+
| `immersiveVrSupported`, `requestImmersiveVr` | the shared WebXR enter-VR path |
|
|
77
105
|
| `Presence`, `DEFAULT_PRESENCE_SERVER`, `NetworkAdapter` | multiplayer (`multiplayer: true`) and the seam for your own |
|
|
106
|
+
| `createNameTag`, `createSpeechBubble`, `easeYaw`, `createShareVerifier` | drawing other people, and checking their avatar links, in a network layer of your own |
|
|
107
|
+
| `DOORWAY_VIEW_PARAM` | a hub drawing your world live in its doorway (`?doorway-view`), from the visitor's camera; walked into, it takes over from their exact pose, goes online without reloading, and asks the hub to open any other page |
|
|
78
108
|
| `WORLDMESH_VERSION`, `WORLDMESH_PROTOCOL` | what your world is speaking |
|
|
79
109
|
|
|
80
110
|
Full option, handle and event reference:
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
export declare class Footsteps {
|
|
2
|
+
/**
|
|
3
|
+
* How loud this walker is where the listener stands: 1 for the player's own
|
|
4
|
+
* feet, less for someone further off, 0 for out of earshot.
|
|
5
|
+
*/
|
|
6
|
+
loudness: number;
|
|
7
|
+
private walked;
|
|
8
|
+
private left;
|
|
9
|
+
private wasGrounded;
|
|
10
|
+
private lastVertical;
|
|
11
|
+
/** Fastest fall since leaving the ground, so landings sound as hard as they were. */
|
|
12
|
+
private fallSpeed;
|
|
13
|
+
/**
|
|
14
|
+
* Call once per frame with the horizontal speed and whether feet are on the
|
|
15
|
+
* ground. `footfall` says whether the avatar's foot landed this frame; when
|
|
16
|
+
* the avatar's animation cannot tell (null), steps fall back to distance.
|
|
17
|
+
*/
|
|
18
|
+
update(dt: number, speed: number, grounded: boolean, footfall?: boolean | null, vertical?: number, flying?: boolean): void;
|
|
19
|
+
/** Jumps, double jumps and landings. */
|
|
20
|
+
private updateAir;
|
|
21
|
+
/** Pushing off: a quick scuff, then a soft rush of air. Every part varies, like the steps. */
|
|
22
|
+
private jump;
|
|
23
|
+
/**
|
|
24
|
+
* Both feet coming down, heavier and longer the harder the fall. Usually one
|
|
25
|
+
* lands a moment before the other, by a different amount each time.
|
|
26
|
+
*/
|
|
27
|
+
private land;
|
|
28
|
+
/**
|
|
29
|
+
* A soft scuff with a faint low thump: a step on firm ground. Every part is
|
|
30
|
+
* jittered, and left and right feet differ slightly, so no two sound alike.
|
|
31
|
+
*/
|
|
32
|
+
private play;
|
|
33
|
+
/** The shared audio, or null when there is none, it is not running yet, or this walker is out of earshot. */
|
|
34
|
+
private audio;
|
|
35
|
+
dispose(): void;
|
|
36
|
+
}
|
|
37
|
+
//# sourceMappingURL=footsteps.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"footsteps.d.ts","sourceRoot":"","sources":["../../src/audio/footsteps.ts"],"names":[],"mappings":"AAaA,qBAAa,SAAS;IACpB;;;OAGG;IACH,QAAQ,SAAK;IACb,OAAO,CAAC,MAAM,CAAK;IACnB,OAAO,CAAC,IAAI,CAAS;IACrB,OAAO,CAAC,WAAW,CAAQ;IAC3B,OAAO,CAAC,YAAY,CAAK;IACzB,qFAAqF;IACrF,OAAO,CAAC,SAAS,CAAK;IAEtB;;;;OAIG;IACH,MAAM,CACJ,EAAE,EAAE,MAAM,EACV,KAAK,EAAE,MAAM,EACb,QAAQ,EAAE,OAAO,EACjB,QAAQ,GAAE,OAAO,GAAG,IAAW,EAC/B,QAAQ,SAAI,EACZ,MAAM,UAAQ,GACb,IAAI;IAmBP,wCAAwC;IACxC,OAAO,CAAC,SAAS;IAcjB,8FAA8F;IAC9F,OAAO,CAAC,IAAI;IAyBZ;;;OAGG;IACH,OAAO,CAAC,IAAI;IAeZ;;;OAGG;IACH,OAAO,CAAC,IAAI;IA0CZ,6GAA6G;IAC7G,OAAO,CAAC,KAAK;IAgBb,OAAO,IAAI,IAAI;CAIhB"}
|
|
@@ -0,0 +1,178 @@
|
|
|
1
|
+
/** Metres walked between two footsteps. */
|
|
2
|
+
const STRIDE = 1.6;
|
|
3
|
+
/** Below this ground speed (m/s) the player is standing, not walking. */
|
|
4
|
+
const MIN_SPEED = 0.6;
|
|
5
|
+
/**
|
|
6
|
+
* Footstep sounds for the local player, synthesised with Web Audio so no
|
|
7
|
+
* world has to ship a sound file. Steps follow distance walked, so sprinting
|
|
8
|
+
* quickens them and crouching slows them without any extra tuning.
|
|
9
|
+
*/
|
|
10
|
+
/** One audio context and noise buffer for every walker: browsers allow only a few contexts per page. */
|
|
11
|
+
let shared = null;
|
|
12
|
+
export class Footsteps {
|
|
13
|
+
/**
|
|
14
|
+
* How loud this walker is where the listener stands: 1 for the player's own
|
|
15
|
+
* feet, less for someone further off, 0 for out of earshot.
|
|
16
|
+
*/
|
|
17
|
+
loudness = 1;
|
|
18
|
+
walked = 0;
|
|
19
|
+
left = false;
|
|
20
|
+
wasGrounded = true;
|
|
21
|
+
lastVertical = 0;
|
|
22
|
+
/** Fastest fall since leaving the ground, so landings sound as hard as they were. */
|
|
23
|
+
fallSpeed = 0;
|
|
24
|
+
/**
|
|
25
|
+
* Call once per frame with the horizontal speed and whether feet are on the
|
|
26
|
+
* ground. `footfall` says whether the avatar's foot landed this frame; when
|
|
27
|
+
* the avatar's animation cannot tell (null), steps fall back to distance.
|
|
28
|
+
*/
|
|
29
|
+
update(dt, speed, grounded, footfall = null, vertical = 0, flying = false) {
|
|
30
|
+
if (!flying)
|
|
31
|
+
this.updateAir(grounded, vertical);
|
|
32
|
+
this.wasGrounded = grounded;
|
|
33
|
+
this.lastVertical = vertical;
|
|
34
|
+
if (footfall !== null) {
|
|
35
|
+
if (footfall && grounded && speed >= MIN_SPEED)
|
|
36
|
+
this.play(Math.min(1, speed / 9));
|
|
37
|
+
return;
|
|
38
|
+
}
|
|
39
|
+
if (!grounded || speed < MIN_SPEED) {
|
|
40
|
+
// Start the next walk half a stride in, so the first step comes quickly.
|
|
41
|
+
this.walked = STRIDE * 0.5;
|
|
42
|
+
return;
|
|
43
|
+
}
|
|
44
|
+
this.walked += speed * dt;
|
|
45
|
+
if (this.walked < STRIDE)
|
|
46
|
+
return;
|
|
47
|
+
this.walked -= STRIDE * (0.92 + Math.random() * 0.16);
|
|
48
|
+
this.play(Math.min(1, speed / 9));
|
|
49
|
+
}
|
|
50
|
+
/** Jumps, double jumps and landings. */
|
|
51
|
+
updateAir(grounded, vertical) {
|
|
52
|
+
if (grounded) {
|
|
53
|
+
if (!this.wasGrounded && this.fallSpeed > 2)
|
|
54
|
+
this.land(Math.min(1, this.fallSpeed / 20));
|
|
55
|
+
this.fallSpeed = 0;
|
|
56
|
+
return;
|
|
57
|
+
}
|
|
58
|
+
this.fallSpeed = Math.max(this.fallSpeed, -vertical);
|
|
59
|
+
const jumped = this.wasGrounded ? vertical > 1 : vertical - this.lastVertical > 3;
|
|
60
|
+
if (jumped) {
|
|
61
|
+
this.jump();
|
|
62
|
+
this.fallSpeed = 0;
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
/** Pushing off: a quick scuff, then a soft rush of air. Every part varies, like the steps. */
|
|
66
|
+
jump() {
|
|
67
|
+
const jitter = (spread) => 1 + (Math.random() * 2 - 1) * spread;
|
|
68
|
+
this.play(0.6, { volume: 0.9 * jitter(0.3), decay: 0.7 * jitter(0.3), tone: 1.3 * jitter(0.2) });
|
|
69
|
+
const audio = this.audio();
|
|
70
|
+
if (!audio)
|
|
71
|
+
return;
|
|
72
|
+
const { context, noise } = audio;
|
|
73
|
+
const now = context.currentTime + Math.random() * 0.02;
|
|
74
|
+
const length = 0.26 * jitter(0.3);
|
|
75
|
+
const source = context.createBufferSource();
|
|
76
|
+
source.buffer = noise;
|
|
77
|
+
source.playbackRate.value = jitter(0.2);
|
|
78
|
+
const filter = context.createBiquadFilter();
|
|
79
|
+
filter.type = 'bandpass';
|
|
80
|
+
filter.Q.value = 0.8 * jitter(0.4);
|
|
81
|
+
filter.frequency.setValueAtTime(500 * jitter(0.25), now);
|
|
82
|
+
filter.frequency.exponentialRampToValueAtTime(1400 * jitter(0.3), now + length * 0.85);
|
|
83
|
+
const gain = context.createGain();
|
|
84
|
+
gain.gain.setValueAtTime(0.0001, now);
|
|
85
|
+
gain.gain.exponentialRampToValueAtTime(0.034 * jitter(0.35) * this.loudness, now + 0.06 * jitter(0.4));
|
|
86
|
+
gain.gain.exponentialRampToValueAtTime(0.0001, now + length);
|
|
87
|
+
source.connect(filter).connect(gain).connect(context.destination);
|
|
88
|
+
source.start(now, Math.random() * (noise.duration - length - 0.05));
|
|
89
|
+
source.stop(now + length + 0.02);
|
|
90
|
+
}
|
|
91
|
+
/**
|
|
92
|
+
* Both feet coming down, heavier and longer the harder the fall. Usually one
|
|
93
|
+
* lands a moment before the other, by a different amount each time.
|
|
94
|
+
*/
|
|
95
|
+
land(hardness) {
|
|
96
|
+
const jitter = (spread) => 1 + (Math.random() * 2 - 1) * spread;
|
|
97
|
+
const shape = () => ({
|
|
98
|
+
volume: (1.4 + hardness) * jitter(0.25),
|
|
99
|
+
decay: (1.4 + hardness * 0.6) * jitter(0.25),
|
|
100
|
+
tone: 0.8 * jitter(0.2),
|
|
101
|
+
});
|
|
102
|
+
this.play(0.4 + hardness * 0.6, shape());
|
|
103
|
+
if (Math.random() < 0.7) {
|
|
104
|
+
const second = shape();
|
|
105
|
+
second.volume *= 0.6;
|
|
106
|
+
window.setTimeout(() => this.play(0.4 + hardness * 0.6, second), 15 + Math.random() * 45);
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
/**
|
|
110
|
+
* A soft scuff with a faint low thump: a step on firm ground. Every part is
|
|
111
|
+
* jittered, and left and right feet differ slightly, so no two sound alike.
|
|
112
|
+
*/
|
|
113
|
+
play(intensity, shape = {}) {
|
|
114
|
+
const { volume: loudness = 1, decay: length = 1, tone = 1 } = shape;
|
|
115
|
+
const audio = this.audio();
|
|
116
|
+
if (!audio)
|
|
117
|
+
return;
|
|
118
|
+
const { context, noise } = audio;
|
|
119
|
+
const jitter = (spread) => 1 + (Math.random() * 2 - 1) * spread;
|
|
120
|
+
this.left = !this.left;
|
|
121
|
+
const now = context.currentTime + Math.random() * 0.025;
|
|
122
|
+
const volume = (0.065 + intensity * 0.065) * jitter(0.3) * (this.left ? 1 : 0.85) * loudness * this.loudness;
|
|
123
|
+
const decay = 0.09 * jitter(0.35) * length;
|
|
124
|
+
const source = context.createBufferSource();
|
|
125
|
+
source.buffer = noise;
|
|
126
|
+
source.playbackRate.value = jitter(0.25);
|
|
127
|
+
const filter = context.createBiquadFilter();
|
|
128
|
+
filter.type = 'lowpass';
|
|
129
|
+
filter.frequency.value = (this.left ? 520 : 440) * jitter(0.3) * tone;
|
|
130
|
+
filter.Q.value = 0.4 + Math.random() * 0.6;
|
|
131
|
+
const gain = context.createGain();
|
|
132
|
+
// A few milliseconds of attack takes the click off the start.
|
|
133
|
+
gain.gain.setValueAtTime(0.0001, now);
|
|
134
|
+
gain.gain.exponentialRampToValueAtTime(volume, now + 0.008 * jitter(0.5));
|
|
135
|
+
gain.gain.exponentialRampToValueAtTime(0.0001, now + decay);
|
|
136
|
+
// Random offset into the noise, so each step starts on different grain.
|
|
137
|
+
const offset = Math.random() * (noise.duration - decay - 0.02);
|
|
138
|
+
source.connect(filter).connect(gain).connect(context.destination);
|
|
139
|
+
source.start(now, Math.max(0, offset));
|
|
140
|
+
source.stop(now + decay + 0.02);
|
|
141
|
+
const thump = context.createOscillator();
|
|
142
|
+
const pitch = 85 * jitter(0.2) * Math.min(1, tone);
|
|
143
|
+
thump.frequency.setValueAtTime(pitch, now);
|
|
144
|
+
thump.frequency.exponentialRampToValueAtTime(pitch * 0.5, now + 0.07 * length);
|
|
145
|
+
const thumpGain = context.createGain();
|
|
146
|
+
thumpGain.gain.setValueAtTime(0.0001, now);
|
|
147
|
+
thumpGain.gain.exponentialRampToValueAtTime(volume * 0.5 * jitter(0.4), now + 0.01);
|
|
148
|
+
thumpGain.gain.exponentialRampToValueAtTime(0.0001, now + 0.08 * length);
|
|
149
|
+
thump.connect(thumpGain).connect(context.destination);
|
|
150
|
+
thump.start(now);
|
|
151
|
+
thump.stop(now + 0.09 * length + 0.01);
|
|
152
|
+
}
|
|
153
|
+
/** The shared audio, or null when there is none, it is not running yet, or this walker is out of earshot. */
|
|
154
|
+
audio() {
|
|
155
|
+
if (this.loudness < 0.02)
|
|
156
|
+
return null;
|
|
157
|
+
if (!shared) {
|
|
158
|
+
if (typeof AudioContext === 'undefined')
|
|
159
|
+
return null;
|
|
160
|
+
const context = new AudioContext();
|
|
161
|
+
const length = Math.floor(context.sampleRate * 0.6);
|
|
162
|
+
const noise = context.createBuffer(1, length, context.sampleRate);
|
|
163
|
+
const data = noise.getChannelData(0);
|
|
164
|
+
for (let i = 0; i < length; i++)
|
|
165
|
+
data[i] = Math.random() * 2 - 1;
|
|
166
|
+
shared = { context, noise };
|
|
167
|
+
}
|
|
168
|
+
// Browsers start audio suspended until the page has had a click or key press.
|
|
169
|
+
if (shared.context.state === 'suspended')
|
|
170
|
+
void shared.context.resume().catch(() => undefined);
|
|
171
|
+
return shared.context.state === 'running' ? shared : null;
|
|
172
|
+
}
|
|
173
|
+
dispose() {
|
|
174
|
+
// The shared context stays for the other walkers; nothing of this one's is left playing.
|
|
175
|
+
this.loudness = 0;
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
//# sourceMappingURL=footsteps.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"footsteps.js","sourceRoot":"","sources":["../../src/audio/footsteps.ts"],"names":[],"mappings":"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"}
|
|
@@ -19,7 +19,22 @@ export interface AvatarDescriptor {
|
|
|
19
19
|
expiresAt: string | null;
|
|
20
20
|
/** The avatar's public page, for credit where its license asks for it. */
|
|
21
21
|
sourceUrl: string | null;
|
|
22
|
+
/**
|
|
23
|
+
* The model link signed by the WorldMesh hub for showing to other players,
|
|
24
|
+
* or null when it may not be shown to them (see avatar/share.ts).
|
|
25
|
+
*/
|
|
26
|
+
share?: SignedAvatarShare | null;
|
|
22
27
|
}
|
|
28
|
+
/** A model link the hub vouched for: `u` link, `f` format, `i` stable id, `x` expiry (unix seconds), `s` Ed25519 signature. */
|
|
29
|
+
export interface SignedAvatarShare {
|
|
30
|
+
u: string;
|
|
31
|
+
f: AvatarFormat;
|
|
32
|
+
i: string;
|
|
33
|
+
x: number;
|
|
34
|
+
s: string;
|
|
35
|
+
}
|
|
36
|
+
/** Accepts a signed share from the network only if it has the right shape. Says nothing about the signature. */
|
|
37
|
+
export declare function parseAvatarShare(value: unknown): SignedAvatarShare | null;
|
|
23
38
|
/** Model URLs must be https, except on a local development machine. */
|
|
24
39
|
export declare function isLoadableUrl(raw: unknown): raw is string;
|
|
25
40
|
/** Accepts a descriptor from the network only if it has the right shape. */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"descriptor.d.ts","sourceRoot":"","sources":["../../src/avatar/descriptor.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,MAAM,MAAM,YAAY,GAAG,KAAK,GAAG,KAAK,GAAG,MAAM,CAAC;AAElD,MAAM,WAAW,gBAAgB;IAC/B,wEAAwE;IACxE,QAAQ,EAAE,MAAM,CAAC;IACjB,uDAAuD;IACvD,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,MAAM,EAAE,YAAY,CAAC;IACrB,yEAAyE;IACzE,QAAQ,EAAE,MAAM,CAAC;IACjB,yDAAyD;IACzD,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,0EAA0E;IAC1E,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;
|
|
1
|
+
{"version":3,"file":"descriptor.d.ts","sourceRoot":"","sources":["../../src/avatar/descriptor.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,MAAM,MAAM,YAAY,GAAG,KAAK,GAAG,KAAK,GAAG,MAAM,CAAC;AAElD,MAAM,WAAW,gBAAgB;IAC/B,wEAAwE;IACxE,QAAQ,EAAE,MAAM,CAAC;IACjB,uDAAuD;IACvD,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,MAAM,EAAE,YAAY,CAAC;IACrB,yEAAyE;IACzE,QAAQ,EAAE,MAAM,CAAC;IACjB,yDAAyD;IACzD,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,0EAA0E;IAC1E,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB;;;OAGG;IACH,KAAK,CAAC,EAAE,iBAAiB,GAAG,IAAI,CAAC;CAClC;AAED,+HAA+H;AAC/H,MAAM,WAAW,iBAAiB;IAChC,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,YAAY,CAAC;IAChB,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;CACX;AAED,gHAAgH;AAChH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,OAAO,GAAG,iBAAiB,GAAG,IAAI,CASzE;AAID,uEAAuE;AACvE,wBAAgB,aAAa,CAAC,GAAG,EAAE,OAAO,GAAG,GAAG,IAAI,MAAM,CASzD;AAED,4EAA4E;AAC5E,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,OAAO,GAAG,gBAAgB,GAAG,IAAI,CAiB7E"}
|
|
@@ -4,6 +4,23 @@
|
|
|
4
4
|
* found (which platform, which account, which OAuth flow) stays with whoever
|
|
5
5
|
* produced it — the WorldMesh hub's Avatar Wallet, or the world itself.
|
|
6
6
|
*/
|
|
7
|
+
/** Accepts a signed share from the network only if it has the right shape. Says nothing about the signature. */
|
|
8
|
+
export function parseAvatarShare(value) {
|
|
9
|
+
if (!value || typeof value !== 'object')
|
|
10
|
+
return null;
|
|
11
|
+
const v = value;
|
|
12
|
+
if (typeof v.u !== 'string' || !v.u.startsWith('https:') || v.u.length > 1800 || !isLoadableUrl(v.u))
|
|
13
|
+
return null;
|
|
14
|
+
if (typeof v.f !== 'string' || !FORMATS.includes(v.f))
|
|
15
|
+
return null;
|
|
16
|
+
if (typeof v.i !== 'string' || !/^[a-z0-9]{1,16}$/.test(v.i))
|
|
17
|
+
return null;
|
|
18
|
+
if (typeof v.x !== 'number' || !Number.isInteger(v.x) || v.x <= 0 || v.x > 1e11)
|
|
19
|
+
return null;
|
|
20
|
+
if (typeof v.s !== 'string' || !/^[A-Za-z0-9_-]{86}$/.test(v.s))
|
|
21
|
+
return null;
|
|
22
|
+
return { u: v.u, f: v.f, i: v.i, x: v.x, s: v.s };
|
|
23
|
+
}
|
|
7
24
|
const FORMATS = ['vrm', 'glb', 'gltf'];
|
|
8
25
|
/** Model URLs must be https, except on a local development machine. */
|
|
9
26
|
export function isLoadableUrl(raw) {
|
|
@@ -36,6 +53,8 @@ export function parseAvatarDescriptor(value) {
|
|
|
36
53
|
modelUrl: d.modelUrl,
|
|
37
54
|
expiresAt: text(d.expiresAt),
|
|
38
55
|
sourceUrl: isLoadableUrl(d.sourceUrl) ? d.sourceUrl : null,
|
|
56
|
+
// Absent (an older hub) is not the same as null (the hub says: do not show to others).
|
|
57
|
+
share: 'share' in d ? parseAvatarShare(d.share) : undefined,
|
|
39
58
|
};
|
|
40
59
|
}
|
|
41
60
|
//# sourceMappingURL=descriptor.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"descriptor.js","sourceRoot":"","sources":["../../src/avatar/descriptor.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;
|
|
1
|
+
{"version":3,"file":"descriptor.js","sourceRoot":"","sources":["../../src/avatar/descriptor.ts"],"names":[],"mappings":"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"}
|
package/dist/avatar/loader.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { type Object3D } from 'three';
|
|
2
|
-
import type
|
|
2
|
+
import { type AvatarMotion } from '../player/avatar.js';
|
|
3
3
|
import type { AvatarDescriptor } from './descriptor.js';
|
|
4
4
|
/** A loaded external avatar, normalised to the WorldMesh body convention. */
|
|
5
5
|
export interface LoadedAvatar {
|
|
@@ -15,7 +15,18 @@ export interface LoadAvatarOptions {
|
|
|
15
15
|
/** Refuse models larger than this. Defaults to 40 MB. */
|
|
16
16
|
maxBytes?: number;
|
|
17
17
|
signal?: AbortSignal;
|
|
18
|
+
/** The model file, already downloaded (downloadAvatarModel): nothing is fetched again. */
|
|
19
|
+
data?: ArrayBuffer;
|
|
18
20
|
}
|
|
21
|
+
/**
|
|
22
|
+
* Just the download: the model file the descriptor points at, within the size
|
|
23
|
+
* limit. Lets a page fetch it once and hand the same bytes to loadAvatarModel
|
|
24
|
+
* and on to an embedded world.
|
|
25
|
+
*/
|
|
26
|
+
export declare function downloadAvatarModel(descriptor: AvatarDescriptor, options?: {
|
|
27
|
+
maxBytes?: number;
|
|
28
|
+
signal?: AbortSignal;
|
|
29
|
+
}): Promise<ArrayBuffer>;
|
|
19
30
|
/**
|
|
20
31
|
* Downloads a VRM / glTF model straight from the URL in the descriptor (the
|
|
21
32
|
* avatar platform's own storage) and turns it into a player body. The loaders
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"loader.d.ts","sourceRoot":"","sources":["../../src/avatar/loader.ts"],"names":[],"mappings":"AAAA,OAAO,EAA+E,KAAK,QAAQ,EAAE,MAAM,OAAO,CAAC;AACnH,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"loader.d.ts","sourceRoot":"","sources":["../../src/avatar/loader.ts"],"names":[],"mappings":"AAAA,OAAO,EAA+E,KAAK,QAAQ,EAAE,MAAM,OAAO,CAAC;AACnH,OAAO,EAAsB,KAAK,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAC5E,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAExD,6EAA6E;AAC7E,MAAM,WAAW,YAAY;IAC3B,+DAA+D;IAC/D,MAAM,EAAE,QAAQ,CAAC;IACjB,qDAAqD;IACrD,OAAO,CAAC,MAAM,EAAE,YAAY,GAAG,IAAI,CAAC;IACpC,OAAO,IAAI,IAAI,CAAC;CACjB;AAED,MAAM,WAAW,iBAAiB;IAChC,wDAAwD;IACxD,MAAM,EAAE,MAAM,CAAC;IACf,yDAAyD;IACzD,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB,0FAA0F;IAC1F,IAAI,CAAC,EAAE,WAAW,CAAC;CACpB;AAID;;;;GAIG;AACH,wBAAgB,mBAAmB,CAAC,UAAU,EAAE,gBAAgB,EAAE,OAAO,GAAE;IAAE,QAAQ,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,WAAW,CAAA;CAAO,GAAG,OAAO,CAAC,WAAW,CAAC,CAEjJ;AAED;;;;;GAKG;AACH,wBAAsB,eAAe,CAAC,UAAU,EAAE,gBAAgB,EAAE,OAAO,EAAE,iBAAiB,GAAG,OAAO,CAAC,YAAY,CAAC,CAsDrH"}
|
package/dist/avatar/loader.js
CHANGED
|
@@ -1,4 +1,14 @@
|
|
|
1
1
|
import { AnimationMixer, Box3, Group, MathUtils, Mesh, Texture } from 'three';
|
|
2
|
+
import { attachAvatarAppear } from '../player/avatar.js';
|
|
3
|
+
const DEFAULT_MAX_BYTES = 40 * 1024 * 1024;
|
|
4
|
+
/**
|
|
5
|
+
* Just the download: the model file the descriptor points at, within the size
|
|
6
|
+
* limit. Lets a page fetch it once and hand the same bytes to loadAvatarModel
|
|
7
|
+
* and on to an embedded world.
|
|
8
|
+
*/
|
|
9
|
+
export function downloadAvatarModel(descriptor, options = {}) {
|
|
10
|
+
return download(descriptor.modelUrl, options.maxBytes ?? DEFAULT_MAX_BYTES, options.signal);
|
|
11
|
+
}
|
|
2
12
|
/**
|
|
3
13
|
* Downloads a VRM / glTF model straight from the URL in the descriptor (the
|
|
4
14
|
* avatar platform's own storage) and turns it into a player body. The loaders
|
|
@@ -6,7 +16,10 @@ import { AnimationMixer, Box3, Group, MathUtils, Mesh, Texture } from 'three';
|
|
|
6
16
|
* never download them.
|
|
7
17
|
*/
|
|
8
18
|
export async function loadAvatarModel(descriptor, options) {
|
|
9
|
-
const
|
|
19
|
+
const maxBytes = options.maxBytes ?? DEFAULT_MAX_BYTES;
|
|
20
|
+
if (options.data && options.data.byteLength > maxBytes)
|
|
21
|
+
throw new Error('Model is too large');
|
|
22
|
+
const buffer = options.data ?? (await download(descriptor.modelUrl, maxBytes, options.signal));
|
|
10
23
|
const [{ GLTFLoader }, vrmModule] = await Promise.all([
|
|
11
24
|
import('three/examples/jsm/loaders/GLTFLoader.js'),
|
|
12
25
|
descriptor.format === 'vrm' ? import('@pixiv/three-vrm') : Promise.resolve(null),
|
|
@@ -31,6 +44,8 @@ export async function loadAvatarModel(descriptor, options) {
|
|
|
31
44
|
if (child.isMesh)
|
|
32
45
|
child.castShadow = true;
|
|
33
46
|
});
|
|
47
|
+
// Warps in like the default body when a page brings it in (setAvatarAppear).
|
|
48
|
+
attachAvatarAppear(model);
|
|
34
49
|
// glTF and VRM face +Z; WorldMesh bodies face -Z. Scale to the player and
|
|
35
50
|
// stand the feet on y = 0.
|
|
36
51
|
const root = new Group();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"loader.js","sourceRoot":"","sources":["../../src/avatar/loader.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,IAAI,EAAE,KAAK,EAAE,SAAS,EAAE,IAAI,EAAE,OAAO,EAAuC,MAAM,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"loader.js","sourceRoot":"","sources":["../../src/avatar/loader.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { type AvatarDescriptor, type SignedAvatarShare } from './descriptor.js';
|
|
2
|
+
/** The hub-signed link other players may be shown, or null when there is none. */
|
|
3
|
+
export declare function shareableAvatar(descriptor: AvatarDescriptor | null): SignedAvatarShare | null;
|
|
4
|
+
/**
|
|
5
|
+
* The avatar this visitor shows other players. Set it whenever the local
|
|
6
|
+
* avatar changes; with `resolve` (asks the hub again), it keeps the signed
|
|
7
|
+
* link current, and fetches one if the descriptor came without.
|
|
8
|
+
*/
|
|
9
|
+
export declare class SharedAvatarLink {
|
|
10
|
+
private resolve;
|
|
11
|
+
private descriptor;
|
|
12
|
+
private shared;
|
|
13
|
+
private timer;
|
|
14
|
+
private turn;
|
|
15
|
+
constructor(resolve: (() => Promise<AvatarDescriptor | null>) | null);
|
|
16
|
+
set(descriptor: AvatarDescriptor | null): void;
|
|
17
|
+
get(): SignedAvatarShare | null;
|
|
18
|
+
dispose(): void;
|
|
19
|
+
private schedule;
|
|
20
|
+
private refresh;
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Checks links other players send against the public key of the hub at
|
|
24
|
+
* `hubUrl` (fetched once from its resolve endpoint). Says no when the hub has
|
|
25
|
+
* no key or the browser cannot check Ed25519, so nothing unchecked is ever
|
|
26
|
+
* downloaded. Throws when the key could not be fetched just now (offline for a
|
|
27
|
+
* moment, the hub mid-deploy): the link may well be fine, so ask again later.
|
|
28
|
+
*/
|
|
29
|
+
export declare function createShareVerifier(hubUrl: string): (share: SignedAvatarShare) => Promise<boolean>;
|
|
30
|
+
//# sourceMappingURL=share.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"share.d.ts","sourceRoot":"","sources":["../../src/avatar/share.ts"],"names":[],"mappings":"AAAA,OAAO,EAAoB,KAAK,gBAAgB,EAAE,KAAK,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AA2BlG,kFAAkF;AAClF,wBAAgB,eAAe,CAAC,UAAU,EAAE,gBAAgB,GAAG,IAAI,GAAG,iBAAiB,GAAG,IAAI,CAG7F;AAQD;;;;GAIG;AACH,qBAAa,gBAAgB;IAMf,OAAO,CAAC,OAAO;IAL3B,OAAO,CAAC,UAAU,CAAiC;IACnD,OAAO,CAAC,MAAM,CAAkC;IAChD,OAAO,CAAC,KAAK,CAAK;IAClB,OAAO,CAAC,IAAI,CAAK;gBAEG,OAAO,EAAE,CAAC,MAAM,OAAO,CAAC,gBAAgB,GAAG,IAAI,CAAC,CAAC,GAAG,IAAI;IAE5E,GAAG,CAAC,UAAU,EAAE,gBAAgB,GAAG,IAAI,GAAG,IAAI;IAc9C,GAAG,IAAI,iBAAiB,GAAG,IAAI;IAI/B,OAAO,IAAI,IAAI;IAMf,OAAO,CAAC,QAAQ;YAWF,OAAO;CAwBtB;AAWD;;;;;;GAMG;AACH,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,MAAM,GAAG,CAAC,KAAK,EAAE,iBAAiB,KAAK,OAAO,CAAC,OAAO,CAAC,CA0DlG"}
|