@worldmesh/runtime 0.2.1 → 0.2.3

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.
Files changed (115) hide show
  1. package/README.md +48 -8
  2. package/dist/audio/footsteps.d.ts +37 -0
  3. package/dist/audio/footsteps.d.ts.map +1 -0
  4. package/dist/audio/footsteps.js +178 -0
  5. package/dist/audio/footsteps.js.map +1 -0
  6. package/dist/avatar/descriptor.d.ts +15 -0
  7. package/dist/avatar/descriptor.d.ts.map +1 -1
  8. package/dist/avatar/descriptor.js +19 -0
  9. package/dist/avatar/descriptor.js.map +1 -1
  10. package/dist/avatar/loader.d.ts +12 -1
  11. package/dist/avatar/loader.d.ts.map +1 -1
  12. package/dist/avatar/loader.js +16 -1
  13. package/dist/avatar/loader.js.map +1 -1
  14. package/dist/avatar/share.d.ts +30 -0
  15. package/dist/avatar/share.d.ts.map +1 -0
  16. package/dist/avatar/share.js +203 -0
  17. package/dist/avatar/share.js.map +1 -0
  18. package/dist/camera/cameraRig.d.ts +4 -0
  19. package/dist/camera/cameraRig.d.ts.map +1 -1
  20. package/dist/camera/cameraRig.js +10 -1
  21. package/dist/camera/cameraRig.js.map +1 -1
  22. package/dist/camera/viewHandoff.d.ts +20 -0
  23. package/dist/camera/viewHandoff.d.ts.map +1 -0
  24. package/dist/camera/viewHandoff.js +64 -0
  25. package/dist/camera/viewHandoff.js.map +1 -0
  26. package/dist/controls/input.d.ts +29 -0
  27. package/dist/controls/input.d.ts.map +1 -1
  28. package/dist/controls/input.js +124 -1
  29. package/dist/controls/input.js.map +1 -1
  30. package/dist/controls/touch.d.ts +10 -0
  31. package/dist/controls/touch.d.ts.map +1 -1
  32. package/dist/controls/touch.js +57 -1
  33. package/dist/controls/touch.js.map +1 -1
  34. package/dist/core/worldmesh.d.ts +9 -0
  35. package/dist/core/worldmesh.d.ts.map +1 -1
  36. package/dist/core/worldmesh.js +498 -26
  37. package/dist/core/worldmesh.js.map +1 -1
  38. package/dist/hosted.d.ts +3 -0
  39. package/dist/hosted.d.ts.map +1 -0
  40. package/dist/hosted.js +5 -0
  41. package/dist/hosted.js.map +1 -0
  42. package/dist/index.d.ts +16 -9
  43. package/dist/index.d.ts.map +1 -1
  44. package/dist/index.js +12 -7
  45. package/dist/index.js.map +1 -1
  46. package/dist/load.d.ts +23 -0
  47. package/dist/load.d.ts.map +1 -0
  48. package/dist/load.js +83 -0
  49. package/dist/load.js.map +1 -0
  50. package/dist/net/follow.d.ts +7 -0
  51. package/dist/net/follow.d.ts.map +1 -0
  52. package/dist/net/follow.js +10 -0
  53. package/dist/net/follow.js.map +1 -0
  54. package/dist/net/presence.d.ts +125 -3
  55. package/dist/net/presence.d.ts.map +1 -1
  56. package/dist/net/presence.js +471 -24
  57. package/dist/net/presence.js.map +1 -1
  58. package/dist/net/roomFull.d.ts +44 -0
  59. package/dist/net/roomFull.d.ts.map +1 -0
  60. package/dist/net/roomFull.js +147 -0
  61. package/dist/net/roomFull.js.map +1 -0
  62. package/dist/player/avatar.d.ts +17 -4
  63. package/dist/player/avatar.d.ts.map +1 -1
  64. package/dist/player/avatar.js +85 -18
  65. package/dist/player/avatar.js.map +1 -1
  66. package/dist/player/player.d.ts +6 -2
  67. package/dist/player/player.d.ts.map +1 -1
  68. package/dist/player/player.js +13 -3
  69. package/dist/player/player.js.map +1 -1
  70. package/dist/player/stroke.d.ts +11 -0
  71. package/dist/player/stroke.d.ts.map +1 -0
  72. package/dist/player/stroke.js +96 -0
  73. package/dist/player/stroke.js.map +1 -0
  74. package/dist/portals/portals.d.ts +1 -1
  75. package/dist/portals/portals.d.ts.map +1 -1
  76. package/dist/portals/portals.js +6 -2
  77. package/dist/portals/portals.js.map +1 -1
  78. package/dist/types.d.ts +53 -9
  79. package/dist/types.d.ts.map +1 -1
  80. package/dist/ui/overlay.d.ts +18 -0
  81. package/dist/ui/overlay.d.ts.map +1 -1
  82. package/dist/ui/overlay.js +166 -1
  83. package/dist/ui/overlay.js.map +1 -1
  84. package/dist/version.d.ts +4 -0
  85. package/dist/version.d.ts.map +1 -0
  86. package/dist/version.js +4 -0
  87. package/dist/version.js.map +1 -0
  88. package/dist/xr/session.d.ts +13 -0
  89. package/dist/xr/session.d.ts.map +1 -0
  90. package/dist/xr/session.js +33 -0
  91. package/dist/xr/session.js.map +1 -0
  92. package/package.json +1 -1
  93. package/src/audio/footsteps.ts +185 -0
  94. package/src/avatar/descriptor.ts +28 -0
  95. package/src/avatar/loader.ts +19 -2
  96. package/src/avatar/share.ts +196 -0
  97. package/src/camera/cameraRig.ts +10 -1
  98. package/src/camera/viewHandoff.ts +67 -0
  99. package/src/controls/input.ts +119 -1
  100. package/src/controls/touch.ts +59 -1
  101. package/src/core/worldmesh.ts +495 -25
  102. package/src/hosted.ts +4 -0
  103. package/src/index.ts +16 -9
  104. package/src/load.ts +103 -0
  105. package/src/net/follow.ts +9 -0
  106. package/src/net/presence.ts +547 -27
  107. package/src/net/roomFull.ts +160 -0
  108. package/src/player/avatar.ts +87 -18
  109. package/src/player/player.ts +13 -4
  110. package/src/player/stroke.ts +93 -0
  111. package/src/portals/portals.ts +5 -2
  112. package/src/types.ts +52 -9
  113. package/src/ui/overlay.ts +171 -1
  114. package/src/version.ts +3 -0
  115. package/src/xr/session.ts +33 -0
package/README.md CHANGED
@@ -25,9 +25,9 @@ The package is ESM only and targets ES2022 browsers. It touches `window` and
25
25
  If you already have a scene, a camera and a renderer, this is the whole job:
26
26
 
27
27
  ```js
28
- import { createWorldMesh } from '@worldmesh/runtime';
28
+ import { loadWorldMesh } from '@worldmesh/runtime';
29
29
 
30
- const world = createWorldMesh({
30
+ const world = await loadWorldMesh({
31
31
  scene,
32
32
  camera,
33
33
  renderer,
@@ -40,19 +40,29 @@ 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 overlay and portals between worlds.
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
- Removing the `createWorldMesh` call leaves you with the Three.js project you
46
+ Removing the `loadWorldMesh` call leaves you with the Three.js project you
46
47
  started with.
47
48
 
49
+ ## Staying current
50
+
51
+ `loadWorldMesh` runs the current runtime from worldmesh.net, with your copy of
52
+ Three.js, so fixes and improvements reach your world without a rebuild. If it
53
+ cannot be loaded, the copy in this package runs instead (in its own chunk,
54
+ downloaded only then). `createWorldMesh` takes the same options and always
55
+ runs the copy in this package, synchronously. Details:
56
+ [Staying current](https://github.com/eliaswillnat/worldmesh/blob/main/docs/compatibility.md#staying-current-loadworldmesh-and-createworldmesh).
57
+
48
58
  ## Visitors' own avatars (optional)
49
59
 
50
60
  ```js
51
- createWorldMesh({ scene, camera, renderer, avatar: { source: 'worldmesh' } });
61
+ loadWorldMesh({ scene, camera, renderer, avatar: { source: 'worldmesh' } });
52
62
  ```
53
63
 
54
- Visitors who picked a character in their WorldMesh Avatar Wallet (VRoid Hub,
55
- at3d) arrive with a short-lived ticket in the URL fragment. The runtime removes
64
+ Visitors who picked a character in their WorldMesh Avatar Wallet (Sketchfab,
65
+ VRoid Hub, at3d) arrive with a short-lived ticket in the URL fragment. The runtime removes
56
66
  it from the address bar, asks the hub for a descriptor, and loads the VRM or
57
67
  glTF straight from the platform that hosts it. Portals carry the ticket on.
58
68
  Without a ticket, or if anything fails, the player keeps the default body.
@@ -63,18 +73,48 @@ or call `world.loadAvatar(descriptor)` / `world.clearAvatar()` at any time.
63
73
  `avatar:load` and `avatar:error` events report the outcome. The VRM and glTF
64
74
  loaders (`@pixiv/three-vrm`) are only downloaded when an avatar is shown.
65
75
 
76
+ ## Your own multiplayer backend (optional)
77
+
78
+ `multiplayer: true` uses the WorldMesh presence relay. A world on Nakama,
79
+ Colyseus, PartyKit, Supabase Realtime, Ably or a WebSocket server of its own
80
+ passes a `NetworkAdapter` as `network` instead, and nothing goes through
81
+ WorldMesh's servers. The runtime calls its `attach`, `bodies` and `detach`; the
82
+ adapter listens to `update` for the visitor's state and draws everyone else.
83
+ Guide, a complete example and what the relay does that you then do yourself:
84
+ [Your own network layer](https://github.com/eliaswillnat/worldmesh/blob/main/docs/compatibility.md#your-own-network-layer).
85
+
86
+ ## Live doors
87
+
88
+ A hub door can show your world itself, live, as seen from the visitor's own
89
+ camera: water moving, everything as it is. Publish a Doorway file at
90
+ `/.well-known/doorway.json` saying `{ "doorway": 1, "view": true }` and let
91
+ hubs frame your page. The hub opens it with `?doorway-view` and sends its
92
+ camera every frame; the runtime does the rest: offline, no UI, no input,
93
+ drawing only the doorway's part of the screen from that camera, carried onto
94
+ your spawn point (Doorway spec §3.1). Hubs keep the cover for worlds without it.
95
+
96
+ Add `"embed": true` (and `"characters": ["vrm", "glb"]` if you show
97
+ visitors' avatars) and visitors can walk straight in: as they cross the
98
+ doorway the hub hands over their pose, and the same page takes over the
99
+ screen, online, with no reload (§4). While inside, `travelTo` asks the hub to
100
+ open other pages, as the page around your world is the hub's.
101
+
66
102
  ## What is exported
67
103
 
68
104
  | | |
69
105
  | --- | --- |
70
- | `createWorldMesh` | the one call a world needs |
106
+ | `loadWorldMesh` | the one call a world needs, kept current |
107
+ | `createWorldMesh`, `HOSTED_RUNTIME_URL` | the same call on the copy in this package; where `loadWorldMesh` loads from |
71
108
  | `Input`, `TouchControls`, `DEFAULT_KEYMAP`, `resolveKeymap` | the control convention |
72
109
  | `MovementController`, `CollisionWorld`, `DEFAULT_TUNING` | movement and collision |
73
110
  | `CameraRig`, `Player`, `createDefaultAvatar`, `AVATAR_EXPRESSIONS` | camera and figure |
74
111
  | `PortalManager`, `buildTravelUrl`, `getReferringWorld` | travel between worlds |
75
112
  | `loadAvatarModel`, `resolveWorldMeshAvatar`, `parseAvatarDescriptor`, `AvatarDescriptor` | visitors' own avatars |
76
113
  | `Overlay`, `Emitter` | the shared overlay, a tiny typed emitter |
114
+ | `immersiveVrSupported`, `requestImmersiveVr` | the shared WebXR enter-VR path |
77
115
  | `Presence`, `DEFAULT_PRESENCE_SERVER`, `NetworkAdapter` | multiplayer (`multiplayer: true`) and the seam for your own |
116
+ | `createNameTag`, `createSpeechBubble`, `easeYaw`, `createShareVerifier` | drawing other people, and checking their avatar links, in a network layer of your own |
117
+ | `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
118
  | `WORLDMESH_VERSION`, `WORLDMESH_PROTOCOL` | what your world is speaking |
79
119
 
80
120
  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;CAC1B;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,CAe7E"}
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;AAoBH,MAAM,OAAO,GAAsB,CAAC,KAAK,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC;AAE1D,uEAAuE;AACvE,MAAM,UAAU,aAAa,CAAC,GAAY;IACxC,IAAI,OAAO,GAAG,KAAK,QAAQ;QAAE,OAAO,KAAK,CAAC;IAC1C,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC;QACzB,IAAI,GAAG,CAAC,QAAQ,KAAK,QAAQ;YAAE,OAAO,IAAI,CAAC;QAC3C,OAAO,GAAG,CAAC,QAAQ,KAAK,OAAO,IAAI,CAAC,WAAW,EAAE,WAAW,EAAE,OAAO,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;IAChG,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED,4EAA4E;AAC5E,MAAM,UAAU,qBAAqB,CAAC,KAAc;IAClD,IAAI,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,IAAI,CAAC;IACrD,MAAM,CAAC,GAAG,KAAgC,CAAC;IAC3C,IAAI,OAAO,CAAC,CAAC,MAAM,KAAK,QAAQ,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,QAAQ,CAAC;QAAE,OAAO,IAAI,CAAC;IAC3G,MAAM,IAAI,GAAG,CAAC,CAAU,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;IAChE,OAAO;QACL,QAAQ,EAAE,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,SAAS;QACvC,QAAQ,EAAE,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,EAAE;QAChC,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC;QAClB,SAAS,EAAE,aAAa,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI;QAC1D,MAAM,EAAE,CAAC,CAAC,MAAsB;QAChC,QAAQ,EAAE,CAAC,CAAC,QAAQ;QACpB,SAAS,EAAE,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC;QAC5B,SAAS,EAAE,aAAa,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI;KAC3D,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"descriptor.js","sourceRoot":"","sources":["../../src/avatar/descriptor.ts"],"names":[],"mappings":"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"}
@@ -1,5 +1,5 @@
1
1
  import { type Object3D } from 'three';
2
- import type { AvatarMotion } from '../player/avatar.js';
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,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACxD,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;CACtB;AAED;;;;;GAKG;AACH,wBAAsB,eAAe,CAAC,UAAU,EAAE,gBAAgB,EAAE,OAAO,EAAE,iBAAiB,GAAG,OAAO,CAAC,YAAY,CAAC,CAkDrH"}
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"}
@@ -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 buffer = await download(descriptor.modelUrl, options.maxBytes ?? 40 * 1024 * 1024, options.signal);
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":"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"}
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"}