@opsydyn/effect-three-foldkit 0.0.0-stage → 0.1.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.
- package/CHANGELOG.md +56 -0
- package/LICENSE +21 -0
- package/README.md +99 -2
- package/dist/assets.d.ts +53 -0
- package/dist/assets.d.ts.map +1 -0
- package/dist/dom/animationFrames.d.ts +12 -0
- package/dist/dom/animationFrames.d.ts.map +1 -0
- package/dist/dom/canvas.d.ts +26 -0
- package/dist/dom/canvas.d.ts.map +1 -0
- package/dist/dom/latch.d.ts +15 -0
- package/dist/dom/latch.d.ts.map +1 -0
- package/dist/dom/models.d.ts +10 -0
- package/dist/dom/models.d.ts.map +1 -0
- package/dist/dom/overlays.d.ts +24 -0
- package/dist/dom/overlays.d.ts.map +1 -0
- package/dist/dom/pointer.d.ts +49 -0
- package/dist/dom/pointer.d.ts.map +1 -0
- package/dist/dom/postprocessing.d.ts +22 -0
- package/dist/dom/postprocessing.d.ts.map +1 -0
- package/dist/dom/property.d.ts +15 -0
- package/dist/dom/property.d.ts.map +1 -0
- package/dist/dom/reconciled.d.ts +10 -0
- package/dist/dom/reconciled.d.ts.map +1 -0
- package/dist/dom/renderSettings.d.ts +58 -0
- package/dist/dom/renderSettings.d.ts.map +1 -0
- package/dist/dom/typedScenes.d.ts +14 -0
- package/dist/dom/typedScenes.d.ts.map +1 -0
- package/dist/dom/updates.d.ts +8 -0
- package/dist/dom/updates.d.ts.map +1 -0
- package/dist/dom/viewport.d.ts +40 -0
- package/dist/dom/viewport.d.ts.map +1 -0
- package/dist/dom/webgl.d.ts +12 -0
- package/dist/dom/webgl.d.ts.map +1 -0
- package/dist/dom/webgpu.d.ts +23 -0
- package/dist/dom/webgpu.d.ts.map +1 -0
- package/dist/dom/webgpuPostprocessing.d.ts +4 -0
- package/dist/dom/webgpuPostprocessing.d.ts.map +1 -0
- package/dist/dom/xr.d.ts +53 -0
- package/dist/dom/xr.d.ts.map +1 -0
- package/dist/dom/xrGlide.d.ts +49 -0
- package/dist/dom/xrGlide.d.ts.map +1 -0
- package/dist/dom/xrHub.d.ts +45 -0
- package/dist/dom/xrHub.d.ts.map +1 -0
- package/dist/dom/xrInputs.d.ts +40 -0
- package/dist/dom/xrInputs.d.ts.map +1 -0
- package/dist/dom/xrSpaces.d.ts +33 -0
- package/dist/dom/xrSpaces.d.ts.map +1 -0
- package/dist/dom/xrTarget.d.ts +36 -0
- package/dist/dom/xrTarget.d.ts.map +1 -0
- package/dist/element.d.ts +771 -0
- package/dist/element.d.ts.map +1 -0
- package/dist/environment.d.ts +64 -0
- package/dist/environment.d.ts.map +1 -0
- package/dist/index.d.ts +32 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +2037 -0
- package/dist/index.js.map +38 -0
- package/dist/mount.d.ts +14 -0
- package/dist/mount.d.ts.map +1 -0
- package/dist/overlayView.d.ts +23 -0
- package/dist/overlayView.d.ts.map +1 -0
- package/dist/view.d.ts +179 -0
- package/dist/view.d.ts.map +1 -0
- package/dist/xr.d.ts +34 -0
- package/dist/xr.d.ts.map +1 -0
- package/package.json +72 -4
- package/src/assets.ts +151 -0
- package/src/dom/animationFrames.ts +32 -0
- package/src/dom/canvas.ts +54 -0
- package/src/dom/latch.ts +36 -0
- package/src/dom/models.ts +37 -0
- package/src/dom/overlays.ts +63 -0
- package/src/dom/pointer.ts +163 -0
- package/src/dom/postprocessing.ts +116 -0
- package/src/dom/property.ts +43 -0
- package/src/dom/reconciled.ts +51 -0
- package/src/dom/renderSettings.ts +117 -0
- package/src/dom/typedScenes.ts +21 -0
- package/src/dom/updates.ts +14 -0
- package/src/dom/viewport.ts +97 -0
- package/src/dom/webgl.ts +216 -0
- package/src/dom/webgpu.ts +204 -0
- package/src/dom/webgpuPostprocessing.ts +95 -0
- package/src/dom/xr.ts +211 -0
- package/src/dom/xrGlide.ts +114 -0
- package/src/dom/xrHub.ts +118 -0
- package/src/dom/xrInputs.ts +309 -0
- package/src/dom/xrSpaces.ts +287 -0
- package/src/dom/xrTarget.ts +71 -0
- package/src/element.ts +114 -0
- package/src/environment.ts +78 -0
- package/src/index.ts +71 -0
- package/src/mount.ts +305 -0
- package/src/overlayView.ts +71 -0
- package/src/view.ts +254 -0
- package/src/xr.ts +36 -0
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Element size, visibility and motion preference.
|
|
3
|
+
*
|
|
4
|
+
* @module
|
|
5
|
+
*/
|
|
6
|
+
import type { Viewport } from '@opsydyn/effect-three';
|
|
7
|
+
/**
|
|
8
|
+
* The drawing buffer's pixel ratio: a fixed number, or `[min, max]` to follow the device
|
|
9
|
+
* within bounds. React Three Fiber's `dpr`, with its `[1, 2]` default (`calculateDpr` in
|
|
10
|
+
* `core/utils.tsx` at `d74622e`): ratios above 2 cost GPU time for little visible gain.
|
|
11
|
+
*/
|
|
12
|
+
export type PixelRatio = number | readonly [min: number, max: number];
|
|
13
|
+
export declare const defaultPixelRatio: PixelRatio;
|
|
14
|
+
/** Resolves a pixel ratio setting against the device's ratio. */
|
|
15
|
+
export declare const resolvePixelRatio: (devicePixelRatio: number, setting: PixelRatio) => number;
|
|
16
|
+
/** The element's current viewport, with the pixel ratio resolved. */
|
|
17
|
+
export declare const measureViewport: (element: Element, devicePixelRatio: number, pixelRatio?: PixelRatio) => Viewport;
|
|
18
|
+
/** Calls `onResize` whenever the element's size changes. Returns a disconnect function. */
|
|
19
|
+
export declare const observeSize: (element: Element, onResize: () => void) => (() => void);
|
|
20
|
+
/** Calls `onVisible` with whether any part of the element is on screen. */
|
|
21
|
+
export declare const observeVisibility: (element: Element, onVisible: (visible: boolean) => void) => (() => void);
|
|
22
|
+
/** Calls `onChange` with the current reduced-motion preference, then on every change. */
|
|
23
|
+
export declare const observeReducedMotion: (view: Pick<Window, 'matchMedia'>, onChange: (reduced: boolean) => void) => (() => void);
|
|
24
|
+
/** The media query calls the pixel-ratio watch needs; `window` provides them. */
|
|
25
|
+
type ChangeTarget = {
|
|
26
|
+
addEventListener(type: 'change', listener: () => void): void;
|
|
27
|
+
removeEventListener(type: 'change', listener: () => void): void;
|
|
28
|
+
};
|
|
29
|
+
export type PixelRatioHost = {
|
|
30
|
+
readonly devicePixelRatio: number;
|
|
31
|
+
readonly matchMedia: (query: string) => ChangeTarget;
|
|
32
|
+
};
|
|
33
|
+
/**
|
|
34
|
+
* Calls `onChange` whenever the device pixel ratio changes (moving to another display, or
|
|
35
|
+
* zooming), which resizes nothing. As React Three Fiber's `watchDpr`: a media query for
|
|
36
|
+
* the current resolution, re-armed for the new ratio after each change.
|
|
37
|
+
*/
|
|
38
|
+
export declare const observePixelRatio: (view: PixelRatioHost, onChange: () => void) => (() => void);
|
|
39
|
+
export {};
|
|
40
|
+
//# sourceMappingURL=viewport.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"viewport.d.ts","sourceRoot":"","sources":["../../src/dom/viewport.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AAEtD;;;;GAIG;AACH,MAAM,MAAM,UAAU,GAAG,MAAM,GAAG,SAAS,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,CAAC,CAAC;AAEtE,eAAO,MAAM,iBAAiB,EAAE,UAAmB,CAAC;AAEpD,iEAAiE;AACjE,eAAO,MAAM,iBAAiB,qBAAsB,MAAM,WAAW,UAAU,KAAG,MAGhB,CAAC;AAEnE,qEAAqE;AACrE,eAAO,MAAM,eAAe,YACjB,OAAO,oBACE,MAAM,eACZ,UAAU,KACrB,QAOF,CAAC;AAEF,2FAA2F;AAC3F,eAAO,MAAM,WAAW,YAAa,OAAO,YAAY,MAAM,IAAI,KAAG,CAAC,MAAM,IAAI,CAI/E,CAAC;AAEF,2EAA2E;AAC3E,eAAO,MAAM,iBAAiB,YACnB,OAAO,aACL,CAAC,OAAO,EAAE,OAAO,KAAK,IAAI,KACpC,CAAC,MAAM,IAAI,CAMb,CAAC;AAEF,yFAAyF;AACzF,eAAO,MAAM,oBAAoB,SACzB,IAAI,CAAC,MAAM,EAAE,YAAY,CAAC,YACtB,CAAC,OAAO,EAAE,OAAO,KAAK,IAAI,KACnC,CAAC,MAAM,IAAI,CAMb,CAAC;AAEF,iFAAiF;AACjF,KAAK,YAAY,GAAG;IAClB,gBAAgB,CAAC,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,IAAI,GAAG,IAAI,CAAC;IAC7D,mBAAmB,CAAC,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,IAAI,GAAG,IAAI,CAAC;CACjE,CAAC;AAEF,MAAM,MAAM,cAAc,GAAG;IAC3B,QAAQ,CAAC,gBAAgB,EAAE,MAAM,CAAC;IAClC,QAAQ,CAAC,UAAU,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,YAAY,CAAC;CACtD,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,iBAAiB,SAAU,cAAc,YAAY,MAAM,IAAI,KAAG,CAAC,MAAM,IAAI,CAazF,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The WebGL2 renderer behind the core's backend-neutral renderer contract.
|
|
3
|
+
*
|
|
4
|
+
* @module
|
|
5
|
+
*/
|
|
6
|
+
import type { RendererFactory } from '@opsydyn/effect-three';
|
|
7
|
+
import { type WebGLRendererParameters } from 'three';
|
|
8
|
+
/** Options passed through to three's `WebGLRenderer`. The canvas is always the scene's own. */
|
|
9
|
+
export type WebGLOptions = Omit<WebGLRendererParameters, 'canvas'>;
|
|
10
|
+
/** A factory for a WebGL2 renderer drawing into `canvas`. `create` throws if WebGL2 is unavailable. */
|
|
11
|
+
export declare const webglRendererFactory: (canvas: HTMLCanvasElement, options?: WebGLOptions) => RendererFactory;
|
|
12
|
+
//# sourceMappingURL=webgl.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"webgl.d.ts","sourceRoot":"","sources":["../../src/dom/webgl.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,KAAK,EAAE,eAAe,EAAgC,MAAM,uBAAuB,CAAC;AAE3F,OAAO,EASL,KAAK,uBAAuB,EAE7B,MAAM,OAAO,CAAC;AAaf,+FAA+F;AAC/F,MAAM,MAAM,YAAY,GAAG,IAAI,CAAC,uBAAuB,EAAE,QAAQ,CAAC,CAAC;AAyEnE,uGAAuG;AACvG,eAAO,MAAM,oBAAoB,WACvB,iBAAiB,YAChB,YAAY,KACpB,eA0GD,CAAC"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* three.js's `WebGPURenderer` behind the core's renderer contract: WebGPU where the browser
|
|
3
|
+
* has it, otherwise its WebGL 2 backend (or always, with `forceWebGL`), drawing the same
|
|
4
|
+
* node materials either way. It carries the WebGPU render kit (the sky, shader grid and
|
|
5
|
+
* contact shadows in TSL), post-processes with `RenderPipeline`, and presents in WebXR.
|
|
6
|
+
* It starts asynchronously (`init()`), which the runtime waits for.
|
|
7
|
+
*
|
|
8
|
+
* Not drawn under it: labels, which troika makes from WebGL shaders; a label engine's
|
|
9
|
+
* labels are silently empty here.
|
|
10
|
+
*
|
|
11
|
+
* @module
|
|
12
|
+
*/
|
|
13
|
+
import type { RendererFactory } from '@opsydyn/effect-three';
|
|
14
|
+
/** Options for three's `WebGPURenderer`. The canvas is always the scene's own. */
|
|
15
|
+
export type WebGPUOptions = {
|
|
16
|
+
/** Use the WebGL 2 backend even where WebGPU is available. */
|
|
17
|
+
readonly forceWebGL?: boolean;
|
|
18
|
+
readonly alpha?: boolean;
|
|
19
|
+
readonly antialias?: boolean;
|
|
20
|
+
};
|
|
21
|
+
/** A factory for three's `WebGPURenderer` drawing into `canvas`. */
|
|
22
|
+
export declare const webgpuRendererFactory: (canvas: HTMLCanvasElement, options?: WebGPUOptions) => RendererFactory;
|
|
23
|
+
//# sourceMappingURL=webgpu.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"webgpu.d.ts","sourceRoot":"","sources":["../../src/dom/webgpu.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AACH,OAAO,KAAK,EAAE,eAAe,EAAgC,MAAM,uBAAuB,CAAC;AAwB3F,kFAAkF;AAClF,MAAM,MAAM,aAAa,GAAG;IAC1B,8DAA8D;IAC9D,QAAQ,CAAC,UAAU,CAAC,EAAE,OAAO,CAAC;IAC9B,QAAQ,CAAC,KAAK,CAAC,EAAE,OAAO,CAAC;IACzB,QAAQ,CAAC,SAAS,CAAC,EAAE,OAAO,CAAC;CAC9B,CAAC;AA+DF,oEAAoE;AACpE,eAAO,MAAM,qBAAqB,WACxB,iBAAiB,YAChB,aAAa,KACrB,eA8FD,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"webgpuPostprocessing.d.ts","sourceRoot":"","sources":["../../src/dom/webgpuPostprocessing.ts"],"names":[],"mappings":"AA4BA,OAAO,EAA6B,KAAK,cAAc,EAAE,MAAM,cAAc,CAAC;AAE9E,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAwB1D,eAAO,MAAM,0BAA0B,aAAc,cAAc,KAAG,cAwCrE,CAAC"}
|
package/dist/dom/xr.d.ts
ADDED
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Presenting a scene in a WebXR session through three.js's `WebXRManager`.
|
|
3
|
+
*
|
|
4
|
+
* Behavioural references: React Three Fiber `core/configuration.ts` at `d74622e` (on
|
|
5
|
+
* `sessionstart` enable XR and hand frames to `xr.setAnimationLoop`; on `sessionend` take
|
|
6
|
+
* them back and draw again), and pmndrs/xr at `0e1acd8` (`store.ts` `setupXRManager`:
|
|
7
|
+
* reference space type and framebuffer scale before `setSession`; `init.ts`
|
|
8
|
+
* `buildXRSessionInit`: the reference space required, other features optional). The
|
|
9
|
+
* player's origin is an offset reference space, as three.js's teleport example moves
|
|
10
|
+
* the viewer. Controller selects become rays, as `@react-three/xr`'s pointers hit-test
|
|
11
|
+
* along each controller's target ray.
|
|
12
|
+
*
|
|
13
|
+
* @module
|
|
14
|
+
*/
|
|
15
|
+
import type { Xr, XrInput } from '@opsydyn/effect-three';
|
|
16
|
+
import { type Object3D } from 'three';
|
|
17
|
+
import type { PresentableRenderer } from './renderSettings.ts';
|
|
18
|
+
import { type Follow, type LendGeometry } from './xrSpaces.ts';
|
|
19
|
+
/** Where an immersive session can come from: `navigator.xr`, or an emulator's. */
|
|
20
|
+
export type XrSystem = Pick<XRSystem, 'requestSession' | 'isSessionSupported'>;
|
|
21
|
+
/** The immersive session modes. */
|
|
22
|
+
export type XrMode = 'immersive-vr' | 'immersive-ar';
|
|
23
|
+
/**
|
|
24
|
+
* The session request for a scene's settings: its reference space required, other
|
|
25
|
+
* floors, hand tracking and anchors optional, and plane detection, a DOM overlay (on
|
|
26
|
+
* `overlay`, the scene's element) and in AR hit testing when the scene asks for them
|
|
27
|
+
* (pmndrs/xr's `buildXRSessionInit` asks for every feature it may use, optionally, and
|
|
28
|
+
* roots the overlay on the element it is given). Anchors are asked for whether or not
|
|
29
|
+
* the scene has any yet: it may place them mid-session.
|
|
30
|
+
*/
|
|
31
|
+
export declare const sessionInit: (settings: Xr, mode?: XrMode, overlay?: Element) => XRSessionInit;
|
|
32
|
+
export type Presentation = {
|
|
33
|
+
/** Applies new settings mid-session: a new origin or heading moves the player. */
|
|
34
|
+
readonly update: (settings: Xr) => void;
|
|
35
|
+
readonly session: XRSession;
|
|
36
|
+
};
|
|
37
|
+
/** What a session presents: the scene, and how it is drawn, followed and told of input. */
|
|
38
|
+
export type Presented = {
|
|
39
|
+
readonly scene: Object3D;
|
|
40
|
+
readonly draw: () => void;
|
|
41
|
+
/** Places the groups that follow tracked spaces (`group({ follow })`). */
|
|
42
|
+
readonly follow: Follow;
|
|
43
|
+
/** Lends detected meshes' geometry to the scene (`xrMesh(id)`). */
|
|
44
|
+
readonly lend: LendGeometry;
|
|
45
|
+
readonly input: (input: XrInput) => void;
|
|
46
|
+
};
|
|
47
|
+
/**
|
|
48
|
+
* Presents into `session`: frames come from the session (each read for input and the
|
|
49
|
+
* spaces groups follow, then drawn) until it ends, when `ended` is called and the page's
|
|
50
|
+
* own frames take over again. Input sources are drawn into the scene while it presents.
|
|
51
|
+
*/
|
|
52
|
+
export declare const present: (renderer: PresentableRenderer, session: XRSession, settings: Xr, presented: Presented, ended: () => void) => Promise<Presentation>;
|
|
53
|
+
//# sourceMappingURL=xr.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"xr.d.ts","sourceRoot":"","sources":["../../src/dom/xr.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AACH,OAAO,KAAK,EAAE,EAAE,EAAE,OAAO,EAAE,MAAM,uBAAuB,CAAC;AACzD,OAAO,EAAS,KAAK,QAAQ,EAAE,MAAM,OAAO,CAAC;AAE7C,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAG/D,OAAO,EAAE,KAAK,MAAM,EAAE,KAAK,YAAY,EAAe,MAAM,eAAe,CAAC;AAE5E,kFAAkF;AAClF,MAAM,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,EAAE,gBAAgB,GAAG,oBAAoB,CAAC,CAAC;AAE/E,mCAAmC;AACnC,MAAM,MAAM,MAAM,GAAG,cAAc,GAAG,cAAc,CAAC;AAErD;;;;;;;GAOG;AACH,eAAO,MAAM,WAAW,aACZ,EAAE,SACN,MAAM,YACF,OAAO,KAChB,aAYD,CAAC;AAkDH,MAAM,MAAM,YAAY,GAAG;IACzB,kFAAkF;IAClF,QAAQ,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,EAAE,KAAK,IAAI,CAAC;IACxC,QAAQ,CAAC,OAAO,EAAE,SAAS,CAAC;CAC7B,CAAC;AAEF,2FAA2F;AAC3F,MAAM,MAAM,SAAS,GAAG;IACtB,QAAQ,CAAC,KAAK,EAAE,QAAQ,CAAC;IACzB,QAAQ,CAAC,IAAI,EAAE,MAAM,IAAI,CAAC;IAC1B,0EAA0E;IAC1E,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,mEAAmE;IACnE,QAAQ,CAAC,IAAI,EAAE,YAAY,CAAC;IAC5B,QAAQ,CAAC,KAAK,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,IAAI,CAAC;CAC1C,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,OAAO,aACR,mBAAmB,WACpB,SAAS,YACR,EAAE,aACD,SAAS,SACb,MAAM,IAAI,KAChB,OAAO,CAAC,YAAY,CAgFtB,CAAC"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Gliding with the thumbsticks while presenting (`xr({ glide })`), one frame at a time.
|
|
3
|
+
*
|
|
4
|
+
* Behavioural reference: pmndrs/xr at `0e1acd8`, `packages/xr/src/controller-locomotion.ts`:
|
|
5
|
+
* the left stick moves the player along the head's facing, flattened onto the floor, at
|
|
6
|
+
* `speed` metres per second at full stick (forward is the stick pushed away, negative y);
|
|
7
|
+
* the right stick turns, smoothly at `turnSpeed`, or by `snapDegrees` once per push past
|
|
8
|
+
* halfway, ready again once back under it. Unlike there, a still stick is a still player
|
|
9
|
+
* (a small dead zone keeps resting thumbsticks from drifting), and the frame that stops
|
|
10
|
+
* says where the player ended, for the Model.
|
|
11
|
+
*
|
|
12
|
+
* @module
|
|
13
|
+
*/
|
|
14
|
+
import type { Vec3, XrGlide } from '@opsydyn/effect-three';
|
|
15
|
+
/** Where the player stands: the reference space's origin in the scene, and its heading. */
|
|
16
|
+
export type GlidePose = {
|
|
17
|
+
readonly origin: Vec3;
|
|
18
|
+
readonly heading: number;
|
|
19
|
+
};
|
|
20
|
+
/** A thumbstick, `[x, y]`, each −1 to 1 (`y` negative pushed away). */
|
|
21
|
+
export type Stick = readonly [x: number, y: number];
|
|
22
|
+
/** Gliding's state between frames. */
|
|
23
|
+
export type Glider = {
|
|
24
|
+
readonly pose: GlidePose;
|
|
25
|
+
/** Whether a snap turn is ready (the turning stick has been back under halfway). */
|
|
26
|
+
readonly snapReady: boolean;
|
|
27
|
+
/** Whether the pose moved since the last report. */
|
|
28
|
+
readonly moved: boolean;
|
|
29
|
+
};
|
|
30
|
+
export declare const startGlider: (pose: GlidePose) => Glider;
|
|
31
|
+
/** The head's facing on the floor, from its orientation quaternion: −z turned, flattened. */
|
|
32
|
+
export declare const floorFacing: (q: {
|
|
33
|
+
readonly x: number;
|
|
34
|
+
readonly y: number;
|
|
35
|
+
readonly z: number;
|
|
36
|
+
readonly w: number;
|
|
37
|
+
}) => readonly [x: number, z: number];
|
|
38
|
+
/**
|
|
39
|
+
* One frame of gliding. Returns the next state, and the pose to report when the sticks
|
|
40
|
+
* have just come to rest after moving it.
|
|
41
|
+
*/
|
|
42
|
+
export declare const glideFrame: (glider: Glider, glide: XrGlide, sticks: {
|
|
43
|
+
readonly move: Stick;
|
|
44
|
+
readonly turn: Stick;
|
|
45
|
+
}, facing: readonly [number, number], seconds: number) => {
|
|
46
|
+
readonly glider: Glider;
|
|
47
|
+
readonly stopped: GlidePose | undefined;
|
|
48
|
+
};
|
|
49
|
+
//# sourceMappingURL=xrGlide.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"xrGlide.d.ts","sourceRoot":"","sources":["../../src/dom/xrGlide.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AACH,OAAO,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,uBAAuB,CAAC;AAE3D,2FAA2F;AAC3F,MAAM,MAAM,SAAS,GAAG;IAAE,QAAQ,CAAC,MAAM,EAAE,IAAI,CAAC;IAAC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC;AAE5E,uEAAuE;AACvE,MAAM,MAAM,KAAK,GAAG,SAAS,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,CAAC,CAAC;AAEpD,sCAAsC;AACtC,MAAM,MAAM,MAAM,GAAG;IACnB,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAC;IACzB,oFAAoF;IACpF,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC;IAC5B,oDAAoD;IACpD,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC;CACzB,CAAC;AAOF,eAAO,MAAM,WAAW,SAAU,SAAS,KAAG,MAAmD,CAAC;AAElG,6FAA6F;AAC7F,eAAO,MAAM,WAAW,MAAO;IAC7B,QAAQ,CAAC,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,CAAC,EAAE,MAAM,CAAC;CACpB,KAAG,SAAS,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,CAKjC,CAAC;AA2CF;;;GAGG;AACH,eAAO,MAAM,UAAU,WACb,MAAM,SACP,OAAO,UACN;IAAE,QAAQ,CAAC,IAAI,EAAE,KAAK,CAAC;IAAC,QAAQ,CAAC,IAAI,EAAE,KAAK,CAAA;CAAE,UAC9C,SAAS,CAAC,MAAM,EAAE,MAAM,CAAC,WACxB,MAAM,KACd;IAAE,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,OAAO,EAAE,SAAS,GAAG,SAAS,CAAA;CAYpE,CAAC"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The page's immersive sessions: which mounted scenes can be presented, and the one
|
|
3
|
+
* session (WebXR allows one at a time) presenting a scene.
|
|
4
|
+
*
|
|
5
|
+
* @module
|
|
6
|
+
*/
|
|
7
|
+
import type { Xr, XrInput } from '@opsydyn/effect-three';
|
|
8
|
+
import type { Object3D } from 'three';
|
|
9
|
+
import { type XrMode, type XrSystem } from './xr.ts';
|
|
10
|
+
import type { Follow, LendGeometry } from './xrSpaces.ts';
|
|
11
|
+
export type { XrMode } from './xr.ts';
|
|
12
|
+
/** A mounted scene that can be presented. */
|
|
13
|
+
export type XrTarget = {
|
|
14
|
+
readonly canvas: HTMLCanvasElement;
|
|
15
|
+
/** The scene's current `xr` description; `null` while it does not ask to be presented. */
|
|
16
|
+
readonly settings: () => Xr | null;
|
|
17
|
+
/** Draws one frame now (the session calls it for each of its frames). */
|
|
18
|
+
readonly draw: () => void;
|
|
19
|
+
/** The scene's three.js root, where input sources are drawn while it presents. */
|
|
20
|
+
readonly scene: Object3D;
|
|
21
|
+
/** The scene's element: the DOM overlay's root, when the scene asks for one. */
|
|
22
|
+
readonly element: Element;
|
|
23
|
+
/** Places the groups that follow tracked spaces. */
|
|
24
|
+
readonly follow: Follow;
|
|
25
|
+
/** Lends a geometry to the scene's store, for detected meshes. */
|
|
26
|
+
readonly lend: LendGeometry;
|
|
27
|
+
/** Input from the session: aims, selects, sticks, buttons and surfaces. */
|
|
28
|
+
readonly input: (input: XrInput) => void;
|
|
29
|
+
/** The session began presenting this scene in `mode`, or (with `null`) ended. */
|
|
30
|
+
readonly presenting: (mode: XrMode | null) => void;
|
|
31
|
+
};
|
|
32
|
+
export type XrHub = {
|
|
33
|
+
/** Makes a scene presentable; returns a function that withdraws it (ending its session). */
|
|
34
|
+
readonly register: (target: XrTarget) => () => void;
|
|
35
|
+
readonly supported: (mode: XrMode) => Promise<boolean>;
|
|
36
|
+
/**
|
|
37
|
+
* Requests a session and presents the first registered scene that describes `xr`.
|
|
38
|
+
* Call from a user gesture's handling: browsers require one to start a session.
|
|
39
|
+
*/
|
|
40
|
+
readonly enter: (mode: XrMode) => Promise<void>;
|
|
41
|
+
readonly exit: () => Promise<void>;
|
|
42
|
+
};
|
|
43
|
+
/** Creates the hub for a page; `system` is `navigator.xr` when the browser has WebXR. */
|
|
44
|
+
export declare const createXrHub: (system: () => XrSystem | undefined) => XrHub;
|
|
45
|
+
//# sourceMappingURL=xrHub.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"xrHub.d.ts","sourceRoot":"","sources":["../../src/dom/xrHub.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,KAAK,EAAE,EAAE,EAAE,OAAO,EAAE,MAAM,uBAAuB,CAAC;AACzD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAGtC,OAAO,EAA2C,KAAK,MAAM,EAAE,KAAK,QAAQ,EAAE,MAAM,SAAS,CAAC;AAC9F,OAAO,KAAK,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAE1D,YAAY,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AAEtC,6CAA6C;AAC7C,MAAM,MAAM,QAAQ,GAAG;IACrB,QAAQ,CAAC,MAAM,EAAE,iBAAiB,CAAC;IACnC,0FAA0F;IAC1F,QAAQ,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC;IACnC,yEAAyE;IACzE,QAAQ,CAAC,IAAI,EAAE,MAAM,IAAI,CAAC;IAC1B,kFAAkF;IAClF,QAAQ,CAAC,KAAK,EAAE,QAAQ,CAAC;IACzB,gFAAgF;IAChF,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,oDAAoD;IACpD,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,kEAAkE;IAClE,QAAQ,CAAC,IAAI,EAAE,YAAY,CAAC;IAC5B,2EAA2E;IAC3E,QAAQ,CAAC,KAAK,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,IAAI,CAAC;IACzC,iFAAiF;IACjF,QAAQ,CAAC,UAAU,EAAE,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,KAAK,IAAI,CAAC;CACpD,CAAC;AAEF,MAAM,MAAM,KAAK,GAAG;IAClB,4FAA4F;IAC5F,QAAQ,CAAC,QAAQ,EAAE,CAAC,MAAM,EAAE,QAAQ,KAAK,MAAM,IAAI,CAAC;IACpD,QAAQ,CAAC,SAAS,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;IACvD;;;OAGG;IACH,QAAQ,CAAC,KAAK,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAChD,QAAQ,CAAC,IAAI,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CACpC,CAAC;AAIF,yFAAyF;AACzF,eAAO,MAAM,WAAW,WAAY,MAAM,QAAQ,GAAG,SAAS,KAAG,KAkEhE,CAAC"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* A session's input sources, each frame: where each points (`Aim`), its gamepad's sticks
|
|
3
|
+
* and buttons, in AR where its ray meets a real surface, and drawing its ray and a hand's
|
|
4
|
+
* joints into the presented scene.
|
|
5
|
+
*
|
|
6
|
+
* Behavioural references: pmndrs/xr at `0e1acd8` (`packages/xr/src/pointer` ray-casts
|
|
7
|
+
* along every source's target ray each frame; `controller-locomotion.ts` reads the
|
|
8
|
+
* `xr-standard` thumbstick, axes 2 and 3, forward negative; `hit-test.ts` requests a hit
|
|
9
|
+
* test source per space and reads `getHitTestResults` each frame), and three.js's
|
|
10
|
+
* `XRHandPrimitiveModel` at 0.186.1 (a sphere per hand joint, sized by its radius).
|
|
11
|
+
*
|
|
12
|
+
* @module
|
|
13
|
+
*/
|
|
14
|
+
import type { Ray, Xr, XrInput, XrStickDirection } from '@opsydyn/effect-three';
|
|
15
|
+
import { Group } from 'three';
|
|
16
|
+
/** A target ray pose as a ray in the reference space: from its position along its −z. */
|
|
17
|
+
export declare const rayOf: (pose: XRPose) => Ray;
|
|
18
|
+
/** Where a stick at `(x, y)` points, keeping `previous` until it clearly changes. */
|
|
19
|
+
export declare const stickDirection: (x: number, y: number, previous: XrStickDirection) => XrStickDirection;
|
|
20
|
+
export type XrInputs = {
|
|
21
|
+
/** Reads every input source in this frame, in `space` (the scene's). */
|
|
22
|
+
readonly frame: (frame: XRFrame, space: XRReferenceSpace) => void;
|
|
23
|
+
/** A source's id, the same for its selects as for its aims. */
|
|
24
|
+
readonly idOf: (source: XRInputSource) => number;
|
|
25
|
+
/** A select ended: in AR with hit tests, report where its ray met a surface. */
|
|
26
|
+
readonly selected: (source: XRInputSource) => void;
|
|
27
|
+
/** Ends tracking: every source is lost, and the visuals go. */
|
|
28
|
+
readonly stop: () => void;
|
|
29
|
+
/** Each hand's thumbstick this frame (`[0, 0]` without one). */
|
|
30
|
+
readonly sticks: () => {
|
|
31
|
+
readonly left: readonly [number, number];
|
|
32
|
+
readonly right: readonly [number, number];
|
|
33
|
+
};
|
|
34
|
+
};
|
|
35
|
+
/**
|
|
36
|
+
* Tracks `session`'s input sources, sending what they do to `input` and drawing them into
|
|
37
|
+
* `group` (added to the presented scene) while `settings().showInputs`.
|
|
38
|
+
*/
|
|
39
|
+
export declare const trackInputs: (session: XRSession, group: Group, settings: () => Xr | null, input: (input: XrInput) => void) => XrInputs;
|
|
40
|
+
//# sourceMappingURL=xrInputs.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"xrInputs.d.ts","sourceRoot":"","sources":["../../src/dom/xrInputs.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AACH,OAAO,KAAK,EACV,GAAG,EAEH,EAAE,EAGF,OAAO,EACP,gBAAgB,EACjB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAGL,KAAK,EASN,MAAM,OAAO,CAAC;AAEf,yFAAyF;AACzF,eAAO,MAAM,KAAK,SAAU,MAAM,KAAG,GAQpC,CAAC;AAeF,qFAAqF;AACrF,eAAO,MAAM,cAAc,MACtB,MAAM,KACN,MAAM,YACC,gBAAgB,KACzB,gBAKF,CAAC;AA8FF,MAAM,MAAM,QAAQ,GAAG;IACrB,wEAAwE;IACxE,QAAQ,CAAC,KAAK,EAAE,CAAC,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,gBAAgB,KAAK,IAAI,CAAC;IAClE,+DAA+D;IAC/D,QAAQ,CAAC,IAAI,EAAE,CAAC,MAAM,EAAE,aAAa,KAAK,MAAM,CAAC;IACjD,gFAAgF;IAChF,QAAQ,CAAC,QAAQ,EAAE,CAAC,MAAM,EAAE,aAAa,KAAK,IAAI,CAAC;IACnD,+DAA+D;IAC/D,QAAQ,CAAC,IAAI,EAAE,MAAM,IAAI,CAAC;IAC1B,gEAAgE;IAChE,QAAQ,CAAC,MAAM,EAAE,MAAM;QACrB,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QACzC,QAAQ,CAAC,KAAK,EAAE,SAAS,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;KAC3C,CAAC;CACH,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,WAAW,YACb,SAAS,SACX,KAAK,YACF,MAAM,EAAE,GAAG,IAAI,SAClB,CAAC,KAAK,EAAE,OAAO,KAAK,IAAI,KAC9B,QAuHF,CAAC"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* What a session tracks for the scene's description, each frame: where every space a
|
|
3
|
+
* group follows is (`group({ follow })`), the anchors the scene placed
|
|
4
|
+
* (`xr({ anchors })`), and the planes the session detected (`xr({ planes: true })`).
|
|
5
|
+
*
|
|
6
|
+
* Behavioural reference: pmndrs/xr at `0e1acd8`: `space.ts` `createGetXRSpaceMatrix` (an
|
|
7
|
+
* object on a space takes the space's pose in the reference space each frame, and none
|
|
8
|
+
* while the frame has no pose for it), `anchor.ts` `requestXRAnchor` (`frame.createAnchor`
|
|
9
|
+
* with a rigid transform in the origin's reference space), `store.ts` `updateSession` (the
|
|
10
|
+
* frame's `detectedPlanes` and `detectedMeshes` read each frame, passed on when the set
|
|
11
|
+
* changes), `plane.ts` (a plane is made again once it changes) and `mesh.ts` (a detected
|
|
12
|
+
* mesh's geometry built from its `vertices` and `indices`, again when they change).
|
|
13
|
+
*
|
|
14
|
+
* @module
|
|
15
|
+
*/
|
|
16
|
+
import { type BodyPose, type Xr, type XrInput, type XrSpace } from '@opsydyn/effect-three';
|
|
17
|
+
import { BufferGeometry } from 'three';
|
|
18
|
+
/** Places the scene's following groups where `locate` finds their spaces. */
|
|
19
|
+
export type Follow = (locate: (space: XrSpace) => BodyPose | undefined) => void;
|
|
20
|
+
/** Lends a geometry to the scene's store under `id`; returns a function that withdraws it. */
|
|
21
|
+
export type LendGeometry = (id: string, geometry: BufferGeometry) => () => void;
|
|
22
|
+
export type XrSpaces = {
|
|
23
|
+
/** Brings anchors and planes up to date in this frame, then places the following groups. */
|
|
24
|
+
readonly frame: (frame: XRFrame, space: XRReferenceSpace) => void;
|
|
25
|
+
/** Ends tracking: anchors are deleted, and every following group is hidden. */
|
|
26
|
+
readonly stop: () => void;
|
|
27
|
+
};
|
|
28
|
+
/**
|
|
29
|
+
* Tracks the spaces `session` can locate for the description `settings()`, placing its
|
|
30
|
+
* following groups with `follow` and reporting detected planes to `input`.
|
|
31
|
+
*/
|
|
32
|
+
export declare const trackSpaces: (session: XRSession, settings: () => Xr | null, follow: Follow, input: (input: XrInput) => void, lend: LendGeometry) => XrSpaces;
|
|
33
|
+
//# sourceMappingURL=xrSpaces.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"xrSpaces.d.ts","sourceRoot":"","sources":["../../src/dom/xrSpaces.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AACH,OAAO,EACL,KAAK,QAAQ,EAEb,KAAK,EAAE,EAEP,KAAK,OAAO,EAIZ,KAAK,OAAO,EACb,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAmB,cAAc,EAAqB,MAAM,OAAO,CAAC;AAE3E,6EAA6E;AAC7E,MAAM,MAAM,MAAM,GAAG,CAAC,MAAM,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,QAAQ,GAAG,SAAS,KAAK,IAAI,CAAC;AAEhF,8FAA8F;AAC9F,MAAM,MAAM,YAAY,GAAG,CAAC,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,cAAc,KAAK,MAAM,IAAI,CAAC;AAEhF,MAAM,MAAM,QAAQ,GAAG;IACrB,4FAA4F;IAC5F,QAAQ,CAAC,KAAK,EAAE,CAAC,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,gBAAgB,KAAK,IAAI,CAAC;IAClE,+EAA+E;IAC/E,QAAQ,CAAC,IAAI,EAAE,MAAM,IAAI,CAAC;CAC3B,CAAC;AAqEF;;;GAGG;AACH,eAAO,MAAM,WAAW,YACb,SAAS,YACR,MAAM,EAAE,GAAG,IAAI,UACjB,MAAM,SACP,CAAC,KAAK,EAAE,OAAO,KAAK,IAAI,QACzB,YAAY,KACjB,QAwKF,CAAC"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* A mounted scene as an immersive session target: its frames handed to the session while
|
|
3
|
+
* it presents, and the session's start and end dispatched as `scene-xr` events.
|
|
4
|
+
*
|
|
5
|
+
* @module
|
|
6
|
+
*/
|
|
7
|
+
import type { GatedFrames, SceneEvent, Xr, XrInput } from '@opsydyn/effect-three';
|
|
8
|
+
import type { Object3D } from 'three';
|
|
9
|
+
import type { Latch } from './latch.ts';
|
|
10
|
+
import type { XrMode, XrTarget } from './xrHub.ts';
|
|
11
|
+
import type { Follow, LendGeometry } from './xrSpaces.ts';
|
|
12
|
+
/**
|
|
13
|
+
* The page's frames for a scene: open while it is visible and no session presents it
|
|
14
|
+
* (a session brings its own frames, as React Three Fiber's loop stands aside).
|
|
15
|
+
*/
|
|
16
|
+
export declare const createFrameGate: (frames: GatedFrames) => {
|
|
17
|
+
setVisible: (next: boolean) => void;
|
|
18
|
+
setPresenting: (next: boolean) => void;
|
|
19
|
+
};
|
|
20
|
+
export type FrameGate = ReturnType<typeof createFrameGate>;
|
|
21
|
+
/** The `scene-xr` event: the mode presenting, or `null` when the session ended. */
|
|
22
|
+
export declare const dispatchXrSession: (element: Element, live: Latch, mode: XrMode | null) => void;
|
|
23
|
+
/** A scene as a target for the page's immersive sessions. */
|
|
24
|
+
export declare const xrTarget: (scene: {
|
|
25
|
+
readonly element: Element;
|
|
26
|
+
readonly canvas: HTMLCanvasElement;
|
|
27
|
+
readonly live: Latch;
|
|
28
|
+
readonly gate: FrameGate;
|
|
29
|
+
readonly settings: () => Xr | null;
|
|
30
|
+
readonly draw: () => void;
|
|
31
|
+
readonly scene: Object3D;
|
|
32
|
+
readonly follow: Follow;
|
|
33
|
+
readonly lend: LendGeometry;
|
|
34
|
+
readonly input: (input: XrInput) => ReadonlyArray<SceneEvent>;
|
|
35
|
+
}) => XrTarget;
|
|
36
|
+
//# sourceMappingURL=xrTarget.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"xrTarget.d.ts","sourceRoot":"","sources":["../../src/dom/xrTarget.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,KAAK,EAAE,WAAW,EAAE,UAAU,EAAE,EAAE,EAAE,OAAO,EAAE,MAAM,uBAAuB,CAAC;AAClF,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAEtC,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AACxC,OAAO,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AACnD,OAAO,KAAK,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAE1D;;;GAGG;AACH,eAAO,MAAM,eAAe,WAAY,WAAW;IAK/C,UAAU,SAAS,OAAO,KAAG,IAAI;IAIjC,aAAa,SAAS,OAAO,KAAG,IAAI;CAKvC,CAAC;AAEF,MAAM,MAAM,SAAS,GAAG,UAAU,CAAC,OAAO,eAAe,CAAC,CAAC;AAE3D,mFAAmF;AACnF,eAAO,MAAM,iBAAiB,YAAa,OAAO,QAAQ,KAAK,QAAQ,MAAM,GAAG,IAAI,KAAG,IAEtF,CAAC;AAEF,6DAA6D;AAC7D,eAAO,MAAM,QAAQ,UAAW;IAC9B,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,QAAQ,CAAC,MAAM,EAAE,iBAAiB,CAAC;IACnC,QAAQ,CAAC,IAAI,EAAE,KAAK,CAAC;IACrB,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAC;IACzB,QAAQ,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC;IACnC,QAAQ,CAAC,IAAI,EAAE,MAAM,IAAI,CAAC;IAC1B,QAAQ,CAAC,KAAK,EAAE,QAAQ,CAAC;IACzB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,IAAI,EAAE,YAAY,CAAC;IAC5B,QAAQ,CAAC,KAAK,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,aAAa,CAAC,UAAU,CAAC,CAAC;CAC/D,KAAG,QAkBF,CAAC"}
|