three-live 1.1.1 → 1.2.1

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/dist/index.d.ts CHANGED
@@ -29,8 +29,14 @@ import type {
29
29
  ThreeView,
30
30
  } from './three-live/src/three-view';
31
31
  import type {ARLaunchResult, ARMode} from './three-live/src/three-xr';
32
- import type {TranscriptEvent} from './xr-live/src/plugins/gemini-live';
33
- import type {Detection3D} from './xr-live/src/plugins/world-understanding';
32
+ import type {
33
+ Detection3D,
34
+ DimensionUnit,
35
+ ExplodeMode,
36
+ RemotePeerState,
37
+ SnapSurfaceMode,
38
+ TranscriptEvent,
39
+ } from './xr-live/src/plugins/index';
34
40
  import type {
35
41
  XRAnchorElement,
36
42
  XRDepthMode,
@@ -187,25 +193,241 @@ export interface XRLiveAttributes extends ThreeLiveAttributes {
187
193
  'xr-depth'?: XRDepthMode;
188
194
  /** 25-joint hand tracking and gesture recognition mode ("gestures", "joints", "pinch", "none"). */
189
195
  'xr-hands'?: XRHandsMode;
190
- /** Desktop room simulator environment ("living-room", "office", "tabletop", "none"). */
196
+ /** Desktop 3D room preview environment, unrelated to `xr-live-sim` ("living-room", "office", "tabletop", "none"). */
191
197
  'xr-simulator'?: XRSimulatorRoom;
192
198
  /** Spatial UI profile ("quest3", "android-xr", "visionos", "auto"). */
193
199
  'xr-profile'?: XRProfile;
200
+ /** Play procedural Web Audio earcons and haptics on spatial interactions. */
201
+ 'sound-feedback'?: boolean | string;
194
202
  /** Spatial plugin: enables plane/mesh detection; include "reticle" for a gaze reticle. */
195
203
  'world-understanding'?: boolean | string;
196
204
  /** Spatial plugin: pinch in empty space to paint 3D tubes (optional `#rrggbb` color). */
197
205
  'spatial-paint'?: boolean | string;
206
+ /** Spatial plugin: 3D dimension callouts and AR tape measure ("bounds", "tape", "all", "none"). */
207
+ 'spatial-measure'?: boolean | 'bounds' | 'tape' | 'all' | 'none' | string;
208
+ /** Default display unit for `spatial-measure` ("auto", "m", "cm", "mm", "in", "ft-in"). */
209
+ 'measure-unit'?: DimensionUnit;
210
+ /** Spatial plugin: socket, grid, surface, and angle snapping ("grid", "surface", "sockets", "all", "none"). */
211
+ 'magnetic-snap'?:
212
+ | boolean
213
+ | 'grid'
214
+ | 'surface'
215
+ | 'sockets'
216
+ | 'all'
217
+ | 'none'
218
+ | string;
219
+ /** Cartesian snap grid step in meters ("0.05" or "0.05 0.05 0.05"). */
220
+ 'snap-grid'?: number | string;
221
+ /** Rotational yaw snap increment in degrees (0 to 180). */
222
+ 'snap-angle'?: number | string;
223
+ /** Spatial plugin: hands-free eye/head gaze reticle and dwell selection ("auto", "none", or boolean). */
224
+ 'gaze-dwell'?: boolean | 'auto' | 'none' | string;
225
+ /** Default dwell duration in milliseconds for `gaze-dwell` (250 to 10000, default: 1200). */
226
+ 'dwell-time'?: number | string;
227
+ /** Spatial plugin: normalized [0..1] multi-part exploded-view factor. */
228
+ 'explode'?: number | string;
229
+ /** Multi-part explosion vector strategy ("radial", "axial-x", "axial-y", "axial-z", "hierarchical"). */
230
+ 'explode-mode'?: ExplodeMode;
231
+ /** Multiplier applied to per-part explosion distances (default: 1.0). */
232
+ 'explode-scale'?: number | string;
233
+ /** Real-time cross-section clipping plane ("none", "x:0", "y:0.2", "-z:0", "interactive"). */
234
+ 'section-plane'?: string;
235
+ /** Spatial plugin: persist manipulated anchor transforms under an optional storage namespace. */
236
+ 'persistent-anchors'?: boolean | string;
237
+ /** Sync persisted anchor transforms into `#xr-state=<base64url>` for zero-backend link sharing. */
238
+ 'persist-url-hash'?: boolean | string;
239
+ /** Spatial plugin: XR locomotion mode ("teleport", "snap-turn", "smooth", "teleport snap-turn", "none"). */
240
+ 'locomotion'?: boolean | string;
241
+ /** Thumbstick snap-turn increment in degrees (default: 30). */
242
+ 'snap-turn-deg'?: number | string;
243
+ /** Show a 120ms peripheral FOV comfort vignette on teleport/turn (default: true). */
244
+ 'comfort-vignette'?: boolean | string;
245
+ /** Spatial plugin: join a multi-user room via BroadcastChannel ID or `wss://` relay URL. */
246
+ 'shared-room'?: string;
247
+ /** Local display name broadcast to peers in `shared-room` (max 32 chars). */
248
+ 'peer-name'?: string;
249
+ /** Local avatar visor & laser color (`#rrggbb`) in `shared-room`. */
250
+ 'peer-color'?: string;
251
+ /** xr-live-sim: character camera mode, or `none` to disable the character. */
252
+ 'character-controller'?:
253
+ | 'third-person'
254
+ | 'first-person'
255
+ | 'top-down'
256
+ | 'fixed-camera'
257
+ | 'none';
258
+ /** xr-live-sim: character speed override (m/s). */
259
+ 'character-speed'?: number | string;
260
+ /** xr-live-sim: character jump velocity override (m/s). */
261
+ 'character-jump'?: number | string;
262
+ /** xr-live-sim: on-screen joystick (`auto` shows it on touch screens). */
263
+ 'touch-joystick'?: 'auto' | 'always' | 'none';
264
+ /** xr-live-sim: `false` or `none` pauses steering agents. */
265
+ 'steering-agents'?: boolean | string;
266
+ /** xr-live-sim: firing mode (empty means `projectile`). */
267
+ 'hit-zones'?: '' | 'projectile' | 'hitscan' | 'contact' | 'off';
268
+ /** xr-live-sim: shots per second (default: 4). */
269
+ 'fire-rate'?: number | string;
270
+ /** xr-live-sim: projectile speed in m/s (default: 14). */
271
+ 'projectile-speed'?: number | string;
272
+ /** xr-live-sim: projectile gravity in m/s² (default: 0). */
273
+ 'projectile-gravity'?: number | string;
274
+ /** xr-live-sim: integrity removed per hit (default: 25). */
275
+ 'hit-amount'?: number | string;
276
+ /** xr-live-sim: enables objectives and scoring (`none` disables). */
277
+ 'objectives'?: boolean | string;
278
+ /** xr-live-sim: scenario countdown in seconds. */
279
+ 'scenario-timer'?: number | string;
280
+ /** xr-live-sim: score that passes the scenario. */
281
+ 'target-score'?: number | string;
282
+ /** xr-live-sim: attempts before the scenario fails. */
283
+ 'attempts'?: number | string;
284
+ /** xr-live-sim: score HUD style. */
285
+ 'sim-hud'?: 'auto' | 'minimal' | 'none';
286
+ /** xr-live-sim: plays procedural audio cues (`muted` disables). */
287
+ 'synth-audio'?: boolean | string;
288
+ /** xr-live-sim: cue volume from 0 to 1 (default: 0.7). */
289
+ 'synth-volume'?: number | string;
290
+ /** Register WebMCP browser AI tools on `navigator.modelContext`. */
291
+ 'webmcp'?: boolean | string;
292
+ /** Opt-in gate allowing WebMCP `capture_xr_view` to include the 8x8 depth grid. */
293
+ 'webmcp-allow-depth'?: boolean | string;
294
+ /** Omit `headPosition` from WebMCP `inspect_xr_scene` responses. */
295
+ 'webmcp-omit-pose'?: boolean | string;
296
+
198
297
  'onxr-object-detected'?: (e: CustomEvent<Detection3D>) => void;
199
298
  'onxr-transcription'?: (e: CustomEvent<TranscriptEvent>) => void;
200
299
  'onxr-hold-to-ask'?: (
201
300
  e: CustomEvent<{mesh: string; transcript: string; prompt: string}>,
202
301
  ) => void;
203
302
  'onxr-handles-change'?: (
204
- e: CustomEvent<{mesh: string; scale: number; yawDeg: number}>,
303
+ e: CustomEvent<{mesh: any; scale: number; yawDeg: number}>,
205
304
  ) => void;
206
305
  'onxr-paint-stroke'?: (
207
306
  e: CustomEvent<{index: number; points: number; lengthMeters: number}>,
208
307
  ) => void;
308
+ onmeasurecomplete?: (
309
+ e: CustomEvent<{
310
+ start: [number, number, number];
311
+ end: [number, number, number];
312
+ distanceMeters: number;
313
+ formatted: string;
314
+ }>,
315
+ ) => void;
316
+ onxrsnap?: (
317
+ e: CustomEvent<{
318
+ node: any;
319
+ socket: any;
320
+ position: [number, number, number];
321
+ quaternion: [number, number, number, number];
322
+ mode: 'socket' | 'grid' | 'surface' | 'angle';
323
+ }>,
324
+ ) => void;
325
+ onxrunsnap?: (e: CustomEvent<{node: any; socket: any}>) => void;
326
+ ongazeenter?: (
327
+ e: CustomEvent<{node: any; point: [number, number, number]}>,
328
+ ) => void;
329
+ ongazeleave?: (e: CustomEvent<{node: any}>) => void;
330
+ ongazedwell?: (
331
+ e: CustomEvent<{
332
+ node: any;
333
+ point: [number, number, number];
334
+ action: 'select' | 'ask';
335
+ }>,
336
+ ) => void;
337
+ onexplodechange?: (
338
+ e: CustomEvent<{
339
+ factor: number;
340
+ source: 'attribute' | 'gesture' | 'api' | 'peer';
341
+ }>,
342
+ ) => void;
343
+ onanchorsrestored?: (
344
+ e: CustomEvent<{
345
+ count: number;
346
+ source: 'xr-anchor' | 'storage' | 'url-hash';
347
+ }>,
348
+ ) => void;
349
+ onxrteleport?: (
350
+ e: CustomEvent<{
351
+ from: [number, number, number];
352
+ to: [number, number, number];
353
+ yawDeg: number;
354
+ }>,
355
+ ) => void;
356
+ onpeerjoin?: (
357
+ e: CustomEvent<Pick<RemotePeerState, 'peerId' | 'name' | 'color'>>,
358
+ ) => void;
359
+ onpeerleave?: (
360
+ e: CustomEvent<Pick<RemotePeerState, 'peerId' | 'name' | 'color'>>,
361
+ ) => void;
362
+ onpeersync?: (e: CustomEvent<{peerId: string; nodeId: string}>) => void;
363
+ onpeergrabconflict?: (
364
+ e: CustomEvent<{peerId: string; nodeId: string}>,
365
+ ) => void;
366
+ /** xr-live-sim events. */
367
+ oncharacterjump?: (
368
+ e: CustomEvent<{nodeId: string; position: [number, number, number]}>,
369
+ ) => void;
370
+ oncharacterland?: (
371
+ e: CustomEvent<{nodeId: string; fallSpeed: number}>,
372
+ ) => void;
373
+ onagentstatechange?: (
374
+ e: CustomEvent<{nodeId: string; state: string; targetId: string | null}>,
375
+ ) => void;
376
+ onagentreach?: (
377
+ e: CustomEvent<{
378
+ agentId: string;
379
+ targetId: string;
380
+ position: [number, number, number];
381
+ }>,
382
+ ) => void;
383
+ onxrhit?: (
384
+ e: CustomEvent<{
385
+ targetId: string;
386
+ /** Shooter node name, or `'user'`. */
387
+ sourceId: string;
388
+ amount: number;
389
+ remaining: number;
390
+ point: [number, number, number];
391
+ }>,
392
+ ) => void;
393
+ onxrdepleted?: (
394
+ e: CustomEvent<{targetId: string; group: string; scoreValue: number}>,
395
+ ) => void;
396
+ onxrzoneenter?: (
397
+ e: CustomEvent<{zoneId: string; nodeId: string; group: string}>,
398
+ ) => void;
399
+ onxrzoneexit?: (
400
+ e: CustomEvent<{zoneId: string; nodeId: string; group: string}>,
401
+ ) => void;
402
+ onxrspawn?: (
403
+ e: CustomEvent<{spawnerId: string; instanceId: string; index: number}>,
404
+ ) => void;
405
+ onxrobjective?: (
406
+ e: CustomEvent<{
407
+ nodeId: string;
408
+ tag: string;
409
+ type: string;
410
+ amount: number;
411
+ totalScore: number;
412
+ remainingRequired: number;
413
+ outOfOrder: boolean;
414
+ }>,
415
+ ) => void;
416
+ onxrscorechange?: (
417
+ e: CustomEvent<{
418
+ score: number;
419
+ delta: number;
420
+ attemptsLeft: number | null;
421
+ timeRemaining: number | null;
422
+ }>,
423
+ ) => void;
424
+ onxrscenarioend?: (
425
+ e: CustomEvent<{
426
+ outcome: 'pass' | 'fail' | 'timeout';
427
+ finalScore: number;
428
+ elapsedSec: number;
429
+ }>,
430
+ ) => void;
209
431
  }
210
432
 
211
433
  declare global {