@xrift/world-components 0.45.0 → 0.47.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/dist/components/DevEnvironment/index.d.ts.map +1 -1
- package/dist/components/DevEnvironment/index.js +16 -1
- package/dist/components/DevEnvironment/index.js.map +1 -1
- package/dist/components/ScreenShareDisplay/hooks.d.ts +10 -0
- package/dist/components/ScreenShareDisplay/hooks.d.ts.map +1 -1
- package/dist/components/ScreenShareDisplay/hooks.js +41 -0
- package/dist/components/ScreenShareDisplay/hooks.js.map +1 -1
- package/dist/components/ScreenShareDisplay/index.d.ts +1 -1
- package/dist/components/ScreenShareDisplay/index.d.ts.map +1 -1
- package/dist/components/ScreenShareDisplay/index.js +5 -3
- package/dist/components/ScreenShareDisplay/index.js.map +1 -1
- package/dist/components/ScreenShareDisplay/types.d.ts +2 -0
- package/dist/components/ScreenShareDisplay/types.d.ts.map +1 -1
- package/dist/contexts/ServerClockContext.d.ts +108 -0
- package/dist/contexts/ServerClockContext.d.ts.map +1 -0
- package/dist/contexts/ServerClockContext.js +48 -0
- package/dist/contexts/ServerClockContext.js.map +1 -0
- package/dist/contexts/XRiftContext.d.ts +7 -1
- package/dist/contexts/XRiftContext.d.ts.map +1 -1
- package/dist/contexts/XRiftContext.js +5 -1
- package/dist/contexts/XRiftContext.js.map +1 -1
- package/dist/contexts/__tests__/ServerClockContext.test.d.ts +2 -0
- package/dist/contexts/__tests__/ServerClockContext.test.d.ts.map +1 -0
- package/dist/contexts/__tests__/ServerClockContext.test.js +43 -0
- package/dist/contexts/__tests__/ServerClockContext.test.js.map +1 -0
- package/dist/hooks/useServerClock.d.ts +60 -0
- package/dist/hooks/useServerClock.d.ts.map +1 -0
- package/dist/hooks/useServerClock.js +58 -0
- package/dist/hooks/useServerClock.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/DevEnvironment/index.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/DevEnvironment/index.tsx"],"names":[],"mappings":"AAWA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,SAAS,CAAA;AAqCpC,MAAM,MAAM,mBAAmB,GAAG,KAAK,CAAA;AAmBvC,wBAAgB,cAAc,CAAC,EAC7B,QAAQ,EACR,MAAM,EACN,SAAsB,EACtB,OAAc,EACd,aAAsC,EACtC,gBAAsC,EACtC,aAAa,EACb,gBAAgB,EAAE,mBAAmB,GACtC,EAAE,KAAK,2CAoHP"}
|
|
@@ -6,6 +6,7 @@ import { Physics } from '@react-three/rapier';
|
|
|
6
6
|
import { GrabbableProvider } from '../../contexts/GrabbableContext';
|
|
7
7
|
import { SpawnPointProvider } from '../../contexts/SpawnPointContext';
|
|
8
8
|
import { UsersProvider } from '../../contexts/UsersContext';
|
|
9
|
+
import { XRiftContext } from '../../contexts/XRiftContext';
|
|
9
10
|
import { PCFShadowMap } from 'three';
|
|
10
11
|
import { toThreeOutputBufferType } from './utils';
|
|
11
12
|
import { DEFAULT_SPAWN_POSITION, DEFAULT_GRAVITY, DEFAULT_ALLOW_INFINITE_JUMP, DEFAULT_CAMERA_NEAR, DEFAULT_CAMERA_FAR, MOVE_SPEED, RESPAWN_Y_THRESHOLD, DEV_LOCAL_USER_ID, DEV_LOCAL_USER_DISPLAY_NAME, DEV_AVATAR_HEIGHT, DEV_EYE_HEIGHT, } from './constants';
|
|
@@ -66,6 +67,20 @@ export function DevEnvironment({ children, camera, moveSpeed = MOVE_SPEED, shado
|
|
|
66
67
|
getAvatarHeight: () => undefined,
|
|
67
68
|
getLocalAvatarHeight: () => DEV_LOCAL_AVATAR_HEIGHT,
|
|
68
69
|
}), []);
|
|
70
|
+
// Interactable の登録先(useXRift を使うコンポーネントを dev 環境で動かすため)
|
|
71
|
+
const [interactableObjects] = useState(() => new Set());
|
|
72
|
+
const registerInteractable = useCallback((object) => {
|
|
73
|
+
interactableObjects.add(object);
|
|
74
|
+
}, [interactableObjects]);
|
|
75
|
+
const unregisterInteractable = useCallback((object) => {
|
|
76
|
+
interactableObjects.delete(object);
|
|
77
|
+
}, [interactableObjects]);
|
|
78
|
+
const xriftContextValue = useMemo(() => ({
|
|
79
|
+
baseUrl: '/',
|
|
80
|
+
interactableObjects,
|
|
81
|
+
registerInteractable,
|
|
82
|
+
unregisterInteractable,
|
|
83
|
+
}), [interactableObjects, registerInteractable, unregisterInteractable]);
|
|
69
84
|
const gravity = physicsConfig?.gravity ?? DEFAULT_GRAVITY;
|
|
70
85
|
const allowInfiniteJump = physicsConfig?.allowInfiniteJump ?? DEFAULT_ALLOW_INFINITE_JUMP;
|
|
71
86
|
const outputBufferType = toThreeOutputBufferType(outputBufferTypeStr);
|
|
@@ -81,6 +96,6 @@ export function DevEnvironment({ children, camera, moveSpeed = MOVE_SPEED, shado
|
|
|
81
96
|
fov: cameraFov,
|
|
82
97
|
near: cameraNear,
|
|
83
98
|
far: cameraFar,
|
|
84
|
-
}, gl: glProps, children: [_jsx(PointerLockControls, {}), _jsx(CenterRaycaster, { onHitChange: handleHitChange }), _jsx(Physics, { gravity: [0, -gravity, 0], timeStep: "vary", children: _jsx(SpawnPointProvider, { children: _jsx(UsersProvider, { implementation: usersImplementation, children: _jsxs(GrabbableProvider, { implementation: grabStore.contextValue, children: [_jsx(PhysicsPlayer, { moveSpeed: moveSpeed, spawnPosition: spawnPosition, respawnThreshold: respawnThreshold, allowInfiniteJump: allowInfiniteJump, movementRef: localMovementRef }), _jsx(GrabSystem, { store: grabStore }), children] }) }) }) })] }), _jsx(Crosshair, { active: isHit }), _jsx(PointerLockStatus, { isLocked: isPointerLocked }), _jsx(ControlsHelp, {})] }));
|
|
99
|
+
}, gl: glProps, children: [_jsx(PointerLockControls, {}), _jsx(CenterRaycaster, { onHitChange: handleHitChange }), _jsx(Physics, { gravity: [0, -gravity, 0], timeStep: "vary", children: _jsx(XRiftContext.Provider, { value: xriftContextValue, children: _jsx(SpawnPointProvider, { children: _jsx(UsersProvider, { implementation: usersImplementation, children: _jsxs(GrabbableProvider, { implementation: grabStore.contextValue, children: [_jsx(PhysicsPlayer, { moveSpeed: moveSpeed, spawnPosition: spawnPosition, respawnThreshold: respawnThreshold, allowInfiniteJump: allowInfiniteJump, movementRef: localMovementRef }), _jsx(GrabSystem, { store: grabStore }), children] }) }) }) }) })] }), _jsx(Crosshair, { active: isHit }), _jsx(PointerLockStatus, { isLocked: isPointerLocked }), _jsx(ControlsHelp, {})] }));
|
|
85
100
|
}
|
|
86
101
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/components/DevEnvironment/index.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,WAAW,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,oBAAoB,EAAE,MAAM,OAAO,CAAA;AACpF,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAA;AAC3C,OAAO,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAA;AACvD,OAAO,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAA;AAC7C,OAAO,EAAE,iBAAiB,EAAE,MAAM,iCAAiC,CAAA;AACnE,OAAO,EAAE,kBAAkB,EAAE,MAAM,kCAAkC,CAAA;AACrE,OAAO,EAAE,aAAa,EAAqC,MAAM,6BAA6B,CAAA;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/components/DevEnvironment/index.tsx"],"names":[],"mappings":"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"}
|
|
@@ -10,4 +10,14 @@ export declare const useVideoTexture: (videoElement: HTMLVideoElement | null, sc
|
|
|
10
10
|
hasVideo: boolean;
|
|
11
11
|
videoSize: [number, number];
|
|
12
12
|
};
|
|
13
|
+
/**
|
|
14
|
+
* 画像URLからプレースホルダー用のテクスチャを作成し管理するフック
|
|
15
|
+
* 読み込み失敗時は null を返す(呼び出し側でフォールバック表示する)
|
|
16
|
+
* @param imageUrl 画像のURL(省略時はテクスチャを作成しない)
|
|
17
|
+
* @param screenSize スクリーンのサイズ [幅, 高さ]
|
|
18
|
+
*/
|
|
19
|
+
export declare const usePlaceholderTexture: (imageUrl: string | undefined, screenSize: [number, number]) => {
|
|
20
|
+
placeholderTexture: THREE.Texture<unknown, THREE.TextureEventMap> | null;
|
|
21
|
+
placeholderSize: [number, number];
|
|
22
|
+
};
|
|
13
23
|
//# sourceMappingURL=hooks.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"hooks.d.ts","sourceRoot":"","sources":["../../../src/components/ScreenShareDisplay/hooks.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAG9B;;;;;GAKG;AACH,eAAO,MAAM,eAAe,GAC1B,cAAc,gBAAgB,GAAG,IAAI,EACrC,YAAY,CAAC,MAAM,EAAE,MAAM,CAAC,EAC5B,YAAY,MAAM;;;;CA6FnB,CAAA"}
|
|
1
|
+
{"version":3,"file":"hooks.d.ts","sourceRoot":"","sources":["../../../src/components/ScreenShareDisplay/hooks.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAG9B;;;;;GAKG;AACH,eAAO,MAAM,eAAe,GAC1B,cAAc,gBAAgB,GAAG,IAAI,EACrC,YAAY,CAAC,MAAM,EAAE,MAAM,CAAC,EAC5B,YAAY,MAAM;;;;CA6FnB,CAAA;AAED;;;;;GAKG;AACH,eAAO,MAAM,qBAAqB,GAChC,UAAU,MAAM,GAAG,SAAS,EAC5B,YAAY,CAAC,MAAM,EAAE,MAAM,CAAC;;;CAmD7B,CAAA"}
|
|
@@ -86,4 +86,45 @@ export const useVideoTexture = (videoElement, screenSize, targetFps) => {
|
|
|
86
86
|
}, [videoElement]);
|
|
87
87
|
return { texture, hasVideo, videoSize };
|
|
88
88
|
};
|
|
89
|
+
/**
|
|
90
|
+
* 画像URLからプレースホルダー用のテクスチャを作成し管理するフック
|
|
91
|
+
* 読み込み失敗時は null を返す(呼び出し側でフォールバック表示する)
|
|
92
|
+
* @param imageUrl 画像のURL(省略時はテクスチャを作成しない)
|
|
93
|
+
* @param screenSize スクリーンのサイズ [幅, 高さ]
|
|
94
|
+
*/
|
|
95
|
+
export const usePlaceholderTexture = (imageUrl, screenSize) => {
|
|
96
|
+
const [texture, setTexture] = useState(null);
|
|
97
|
+
useEffect(() => {
|
|
98
|
+
if (!imageUrl) {
|
|
99
|
+
setTexture(null);
|
|
100
|
+
return;
|
|
101
|
+
}
|
|
102
|
+
const loader = new THREE.TextureLoader();
|
|
103
|
+
loader.setCrossOrigin('anonymous');
|
|
104
|
+
let cancelled = false;
|
|
105
|
+
loader.load(imageUrl, (loaded) => {
|
|
106
|
+
if (cancelled)
|
|
107
|
+
return;
|
|
108
|
+
loaded.colorSpace = THREE.SRGBColorSpace;
|
|
109
|
+
setTexture(loaded);
|
|
110
|
+
}, undefined, (err) => {
|
|
111
|
+
console.error('ScreenShareDisplay: placeholder image load failed', err);
|
|
112
|
+
});
|
|
113
|
+
return () => {
|
|
114
|
+
cancelled = true;
|
|
115
|
+
setTexture((prev) => {
|
|
116
|
+
prev?.dispose();
|
|
117
|
+
return null;
|
|
118
|
+
});
|
|
119
|
+
};
|
|
120
|
+
}, [imageUrl]);
|
|
121
|
+
// 画像サイズをスクリーン内に contain フィットさせる
|
|
122
|
+
const placeholderSize = useMemo(() => {
|
|
123
|
+
const image = texture?.image;
|
|
124
|
+
if (!image?.width || !image?.height)
|
|
125
|
+
return screenSize;
|
|
126
|
+
return calculateContainSize(image.width, image.height, screenSize[0], screenSize[1]);
|
|
127
|
+
}, [texture, screenSize]);
|
|
128
|
+
return { placeholderTexture: texture, placeholderSize };
|
|
129
|
+
};
|
|
89
130
|
//# sourceMappingURL=hooks.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"hooks.js","sourceRoot":"","sources":["../../../src/components/ScreenShareDisplay/hooks.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAA;AAC7C,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAA;AAC5D,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAC9B,OAAO,EAAE,oBAAoB,EAAE,MAAM,SAAS,CAAA;AAE9C;;;;;GAKG;AACH,MAAM,CAAC,MAAM,eAAe,GAAG,CAC7B,YAAqC,EACrC,UAA4B,EAC5B,SAAkB,EAClB,EAAE;IACF,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,QAAQ,CAA4B,IAAI,CAAC,CAAA;IACvE,MAAM,CAAC,eAAe,EAAE,kBAAkB,CAAC,GAAG,QAAQ,CAEpD,IAAI,CAAC,CAAA;IACP,MAAM,aAAa,GAAG,MAAM,CAAC,CAAC,CAAC,CAAA;IAC/B,MAAM,QAAQ,GAAG,OAAO,KAAK,IAAI,CAAA;IAEjC,sCAAsC;IACtC,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,CAAC,YAAY,EAAE,CAAC;YAClB,UAAU,CAAC,IAAI,CAAC,CAAA;YAChB,kBAAkB,CAAC,IAAI,CAAC,CAAA;YACxB,OAAM;QACR,CAAC;QAED,MAAM,YAAY,GAAG,IAAI,KAAK,CAAC,YAAY,CAAC,YAAY,CAAC,CAAA;QACzD,YAAY,CAAC,SAAS,GAAG,KAAK,CAAC,YAAY,CAAA;QAC3C,YAAY,CAAC,SAAS,GAAG,KAAK,CAAC,YAAY,CAAA;QAC3C,YAAY,CAAC,UAAU,GAAG,KAAK,CAAC,cAAc,CAAA;QAC9C,UAAU,CAAC,YAAY,CAAC,CAAA;QAExB,yBAAyB;QACzB,uEAAuE;QACvE,oCAAoC;QACpC,MAAM,oBAAoB,GAAG,GAAG,EAAE;YAChC,IAAI,YAAY,CAAC,UAAU,GAAG,CAAC,IAAI,YAAY,CAAC,WAAW,GAAG,CAAC,EAAE,CAAC;gBAChE,kBAAkB,CAAC,CAAC,YAAY,CAAC,UAAU,EAAE,YAAY,CAAC,WAAW,CAAC,CAAC,CAAA;YACzE,CAAC;QACH,CAAC,CAAA;QAED,IAAI,YAAY,CAAC,UAAU,GAAG,CAAC,IAAI,YAAY,CAAC,WAAW,GAAG,CAAC,EAAE,CAAC;YAChE,oBAAoB,EAAE,CAAA;QACxB,CAAC;aAAM,CAAC;YACN,YAAY,CAAC,gBAAgB,CAAC,gBAAgB,EAAE,oBAAoB,CAAC,CAAA;YACrE,YAAY,CAAC,gBAAgB,CAAC,QAAQ,EAAE,oBAAoB,CAAC,CAAA;QAC/D,CAAC;QAED,OAAO,GAAG,EAAE;YACV,YAAY,CAAC,mBAAmB,CAAC,gBAAgB,EAAE,oBAAoB,CAAC,CAAA;YACxE,YAAY,CAAC,mBAAmB,CAAC,QAAQ,EAAE,oBAAoB,CAAC,CAAA;YAChE,YAAY,CAAC,OAAO,EAAE,CAAA;QACxB,CAAC,CAAA;IACH,CAAC,EAAE,CAAC,YAAY,CAAC,CAAC,CAAA;IAElB,wCAAwC;IACxC,iEAAiE;IACjE,mDAAmD;IACnD,QAAQ,CAAC,GAAG,EAAE;QACZ,IAAI,CAAC,OAAO,IAAI,CAAC,SAAS;YAAE,OAAM;QAClC,MAAM,GAAG,GAAG,WAAW,CAAC,GAAG,EAAE,CAAA;QAC7B,IAAI,GAAG,GAAG,aAAa,CAAC,OAAO,GAAG,IAAI,GAAG,SAAS,EAAE,CAAC;YACnD,OAAO,CAAC,MAAM,CAAC,WAAW,GAAG,KAAK,CAAA;QACpC,CAAC;aAAM,CAAC;YACN,aAAa,CAAC,OAAO,GAAG,GAAG,CAAA;QAC7B,CAAC;IACH,CAAC,CAAC,CAAA;IAEF,mDAAmD;IACnD,MAAM,SAAS,GAAG,OAAO,CAAmB,GAAG,EAAE;QAC/C,IAAI,CAAC,eAAe;YAAE,OAAO,UAAU,CAAA;QACvC,OAAO,oBAAoB,CACzB,eAAe,CAAC,CAAC,CAAC,EAClB,eAAe,CAAC,CAAC,CAAC,EAClB,UAAU,CAAC,CAAC,CAAC,EACb,UAAU,CAAC,CAAC,CAAC,CACd,CAAA;IACH,CAAC,EAAE,CAAC,eAAe,EAAE,UAAU,CAAC,CAAC,CAAA;IAEjC,2BAA2B;IAC3B,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,CAAC,YAAY;YAAE,OAAM;QAEzB,MAAM,WAAW,GAAG,GAAG,EAAE;YACvB,YAAY,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE;gBAC7B,UAAU;YACZ,CAAC,CAAC,CAAA;QACJ,CAAC,CAAA;QAED,SAAS;QACT,IAAI,YAAY,CAAC,MAAM,EAAE,CAAC;YACxB,WAAW,EAAE,CAAA;QACf,CAAC;QAED,YAAY,CAAC,gBAAgB,CAAC,OAAO,EAAE,WAAW,CAAC,CAAA;QAEnD,OAAO,GAAG,EAAE;YACV,YAAY,CAAC,mBAAmB,CAAC,OAAO,EAAE,WAAW,CAAC,CAAA;QACxD,CAAC,CAAA;IACH,CAAC,EAAE,CAAC,YAAY,CAAC,CAAC,CAAA;IAElB,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,CAAA;AACzC,CAAC,CAAA"}
|
|
1
|
+
{"version":3,"file":"hooks.js","sourceRoot":"","sources":["../../../src/components/ScreenShareDisplay/hooks.ts"],"names":[],"mappings":"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"}
|
|
@@ -4,5 +4,5 @@ export type { Props as ScreenShareDisplayProps } from './types';
|
|
|
4
4
|
* 映像を3D空間内にスクリーンとして表示するコンポーネント
|
|
5
5
|
* 画面共有やカメラ映像などの表示に使用可能
|
|
6
6
|
*/
|
|
7
|
-
export declare const ScreenShareDisplay: import("react").MemoExoticComponent<({ id, position, rotation, width, targetFps, }: Props) => import("react/jsx-runtime").JSX.Element>;
|
|
7
|
+
export declare const ScreenShareDisplay: import("react").MemoExoticComponent<({ id, position, rotation, width, targetFps, placeholderImageUrl, }: Props) => import("react/jsx-runtime").JSX.Element>;
|
|
8
8
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/ScreenShareDisplay/index.tsx"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,SAAS,CAAA;AAEpC,YAAY,EAAE,KAAK,IAAI,uBAAuB,EAAE,MAAM,SAAS,CAAA;AAO/D;;;GAGG;AACH,eAAO,MAAM,kBAAkB,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/ScreenShareDisplay/index.tsx"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,SAAS,CAAA;AAEpC,YAAY,EAAE,KAAK,IAAI,uBAAuB,EAAE,MAAM,SAAS,CAAA;AAO/D;;;GAGG;AACH,eAAO,MAAM,kBAAkB,2GAO5B,KAAK,6CAwEN,CAAA"}
|
|
@@ -4,7 +4,7 @@ import { memo, useCallback, useMemo } from 'react';
|
|
|
4
4
|
import * as THREE from 'three';
|
|
5
5
|
import { useScreenShareContext } from '../../contexts/ScreenShareContext';
|
|
6
6
|
import { Interactable } from '../Interactable';
|
|
7
|
-
import { useVideoTexture } from './hooks';
|
|
7
|
+
import { usePlaceholderTexture, useVideoTexture } from './hooks';
|
|
8
8
|
// デフォルト値
|
|
9
9
|
const DEFAULT_WIDTH = 4;
|
|
10
10
|
const DEFAULT_POSITION = [0, 0, 0];
|
|
@@ -13,11 +13,13 @@ const DEFAULT_ROTATION = [0, 0, 0];
|
|
|
13
13
|
* 映像を3D空間内にスクリーンとして表示するコンポーネント
|
|
14
14
|
* 画面共有やカメラ映像などの表示に使用可能
|
|
15
15
|
*/
|
|
16
|
-
export const ScreenShareDisplay = memo(({ id, position = DEFAULT_POSITION, rotation = DEFAULT_ROTATION, width = DEFAULT_WIDTH, targetFps, }) => {
|
|
16
|
+
export const ScreenShareDisplay = memo(({ id, position = DEFAULT_POSITION, rotation = DEFAULT_ROTATION, width = DEFAULT_WIDTH, targetFps, placeholderImageUrl, }) => {
|
|
17
17
|
const { videoElement, isSharing, startScreenShare, stopScreenShare, isRoomConnected } = useScreenShareContext();
|
|
18
18
|
const interactionText = isSharing ? '画面共有を停止' : '画面共有を開始';
|
|
19
19
|
const screenSize = useMemo(() => [width, width * (9 / 16)], [width]);
|
|
20
20
|
const { texture, hasVideo, videoSize } = useVideoTexture(videoElement, screenSize, targetFps);
|
|
21
|
+
const { placeholderTexture, placeholderSize } = usePlaceholderTexture(placeholderImageUrl, screenSize);
|
|
22
|
+
const showPlaceholderImage = !hasVideo && placeholderTexture !== null;
|
|
21
23
|
const handleInteract = useCallback(() => {
|
|
22
24
|
if (isSharing) {
|
|
23
25
|
stopScreenShare();
|
|
@@ -26,6 +28,6 @@ export const ScreenShareDisplay = memo(({ id, position = DEFAULT_POSITION, rotat
|
|
|
26
28
|
startScreenShare();
|
|
27
29
|
}
|
|
28
30
|
}, [isSharing, startScreenShare, stopScreenShare]);
|
|
29
|
-
return (_jsxs("group", { position: position, rotation: rotation, children: [_jsxs(Interactable, { id: id, onInteract: handleInteract, interactionText: interactionText, children: [_jsxs("mesh", { visible: !hasVideo, children: [_jsx("planeGeometry", { args: [screenSize[0], screenSize[1]] }), _jsx("meshBasicMaterial", { side: THREE.FrontSide, toneMapped: false, color: "#1a1a2a" })] }), _jsxs("mesh", { visible: hasVideo, children: [_jsx("planeGeometry", { args: [videoSize[0], videoSize[1]] }), _jsx("meshBasicMaterial", { map: texture, side: THREE.FrontSide, toneMapped: false })] })] }), !hasVideo && (_jsx(Text, { position: [0, 0, 0.01], fontSize: width * 0.05, color: "#666666", anchorX: "center", anchorY: "middle", textAlign: "center", "material-side": THREE.FrontSide, children: isRoomConnected ? 'クリックして画面共有' : '音声通話に接続できていません' }))] }));
|
|
31
|
+
return (_jsxs("group", { position: position, rotation: rotation, children: [_jsxs(Interactable, { id: id, onInteract: handleInteract, interactionText: interactionText, children: [_jsxs("mesh", { visible: !hasVideo, children: [_jsx("planeGeometry", { args: [screenSize[0], screenSize[1]] }), _jsx("meshBasicMaterial", { side: THREE.FrontSide, toneMapped: false, color: "#1a1a2a", polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 1 })] }), _jsxs("mesh", { visible: showPlaceholderImage, children: [_jsx("planeGeometry", { args: [placeholderSize[0], placeholderSize[1]] }), _jsx("meshBasicMaterial", { map: placeholderTexture, side: THREE.FrontSide, toneMapped: false })] }), _jsxs("mesh", { visible: hasVideo, children: [_jsx("planeGeometry", { args: [videoSize[0], videoSize[1]] }), _jsx("meshBasicMaterial", { map: texture, side: THREE.FrontSide, toneMapped: false })] })] }), !hasVideo && !showPlaceholderImage && (_jsx(Text, { position: [0, 0, 0.01], fontSize: width * 0.05, color: "#666666", anchorX: "center", anchorY: "middle", textAlign: "center", "material-side": THREE.FrontSide, children: isRoomConnected ? 'クリックして画面共有' : '音声通話に接続できていません' }))] }));
|
|
30
32
|
});
|
|
31
33
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/components/ScreenShareDisplay/index.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,mBAAmB,CAAA;AACxC,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,MAAM,OAAO,CAAA;AAClD,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAC9B,OAAO,EAAE,qBAAqB,EAAE,MAAM,mCAAmC,CAAA;AACzE,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAA;AAC9C,OAAO,EAAE,eAAe,EAAE,MAAM,SAAS,CAAA;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/components/ScreenShareDisplay/index.tsx"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/components/ScreenShareDisplay/types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,KAAK;IACpB,kBAAkB;IAClB,EAAE,EAAE,MAAM,CAAA;IACV,eAAe;IACf,QAAQ,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAA;IACnC,eAAe;IACf,QAAQ,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAA;IACnC,4BAA4B;IAC5B,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,4CAA4C;IAC5C,SAAS,CAAC,EAAE,MAAM,CAAA;
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/components/ScreenShareDisplay/types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,KAAK;IACpB,kBAAkB;IAClB,EAAE,EAAE,MAAM,CAAA;IACV,eAAe;IACf,QAAQ,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAA;IACnC,eAAe;IACf,QAAQ,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAA;IACnC,4BAA4B;IAC5B,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,4CAA4C;IAC5C,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,kDAAkD;IAClD,mBAAmB,CAAC,EAAE,MAAM,CAAA;CAC7B"}
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
import { type ReactNode } from 'react';
|
|
2
|
+
/**
|
|
3
|
+
* 用途ごとに要求する時刻精度のプリセット
|
|
4
|
+
*
|
|
5
|
+
* - `media`: 動画・音楽の再生位置合わせ。数百 ms のズレは体感しにくい
|
|
6
|
+
* - `motion`: 決定論的アニメーション(動く床・観覧車)、アバター補間
|
|
7
|
+
*
|
|
8
|
+
* 早押しやゴール判定のような**公平性が要る用途のプリセットは用意していない**。
|
|
9
|
+
* 経路の往復が非対称なぶんの誤差はクライアント側から検出できず、しかも
|
|
10
|
+
* セッション中ほぼ一定なので繰り返しても平均化されない(=同じ人が毎回勝ち、
|
|
11
|
+
* 同じ人が毎回負ける)。判定はサーバー側で裁定すること。
|
|
12
|
+
*/
|
|
13
|
+
export type ServerClockAccuracy = 'media' | 'motion';
|
|
14
|
+
/** プリセットが要求する `uncertainty` の上限(ms) */
|
|
15
|
+
export declare const SERVER_CLOCK_ACCURACY_THRESHOLD: Record<ServerClockAccuracy, number>;
|
|
16
|
+
/**
|
|
17
|
+
* 共有時計の Context 値
|
|
18
|
+
*
|
|
19
|
+
* **注入側(プラットフォーム)への契約:**
|
|
20
|
+
*
|
|
21
|
+
* `uncertainty` / `synced` / `timeJumpCount` はただの値なので、この Context の
|
|
22
|
+
* reactivity は「注入側が**新しいオブジェクトに差し替えること**」に全面的に依存する。
|
|
23
|
+
* 同じオブジェクトを持ち続けると(getter 付きの可変オブジェクトを1個渡す等)、
|
|
24
|
+
* 一度レンダーした値のまま永久に更新されず、**下のフックの使用例が黙って壊れる**
|
|
25
|
+
* (飛びを観測できないので基準を取り直せない)。
|
|
26
|
+
*
|
|
27
|
+
* 差し替えるタイミング:
|
|
28
|
+
* 1. オフセットを採用したとき(≒45秒ごとの再同期)
|
|
29
|
+
* 2. `synced` が変化したとき
|
|
30
|
+
* 3. 時刻が飛んだとき
|
|
31
|
+
*
|
|
32
|
+
* この頻度なら `uncertainty` の鮮度は最大45秒遅れ = ドリフト換算で +2ms 程度。
|
|
33
|
+
* しきい値(100 / 300ms)に対して無視できる。
|
|
34
|
+
*/
|
|
35
|
+
export interface ServerClockContextValue {
|
|
36
|
+
/**
|
|
37
|
+
* サーバ時刻の推定値(ms)
|
|
38
|
+
*
|
|
39
|
+
* 値ではなく関数。`useFrame` の中から再レンダーなしで呼べる。
|
|
40
|
+
* 一度も同期していなければ `Date.now()` にフォールバックする。
|
|
41
|
+
*/
|
|
42
|
+
now: () => number;
|
|
43
|
+
/**
|
|
44
|
+
* 推定誤差の上界(ms)。一度も同期していなければ Infinity
|
|
45
|
+
*
|
|
46
|
+
* 経過時間による劣化を含む値。往路と復路が非対称だった場合の誤差上界であり、
|
|
47
|
+
* 実際の再現性はこれよりずっと良いことが多い(実測で 2 桁違う)。
|
|
48
|
+
* ただしその差はクライアント側からは検出できないため、これが唯一の保証値になる。
|
|
49
|
+
*/
|
|
50
|
+
uncertainty: number;
|
|
51
|
+
/**
|
|
52
|
+
* いま同期が有効か
|
|
53
|
+
*
|
|
54
|
+
* 切断中は false になるが `now()` は直前の推定を返し続ける(通信が切れただけで
|
|
55
|
+
* 端末の時計は動いているため)。切断が続くと `uncertainty` が膨らんでいく。
|
|
56
|
+
*/
|
|
57
|
+
synced: boolean;
|
|
58
|
+
/**
|
|
59
|
+
* `now()` のタイムラインが飛んだ回数
|
|
60
|
+
*
|
|
61
|
+
* 通常の補正は徐々に寄せる(時刻は巻き戻らない)が、次の場合だけは飛ぶ。
|
|
62
|
+
* 1. 端末のスリープ等で推定を捨てたとき
|
|
63
|
+
* 2. フォールバックから推定へ戻ったとき(初回同期・採り直しの完了)
|
|
64
|
+
* 3. 補正量が大きすぎて徐々に寄せられないとき
|
|
65
|
+
*
|
|
66
|
+
* **時刻から位置を計算しているワールドは、この値の変化を見て基準を取り直すこと。**
|
|
67
|
+
* 取り直さないと、飛んだぶんだけオブジェクトがワープしたまま戻らない。
|
|
68
|
+
*
|
|
69
|
+
* 名前はプラットフォーム側の実装(`ServerClock.timeJumpCount`)と一致させてある。
|
|
70
|
+
* あちらの `discontinuityCount` は「端末時計の不連続の**検出**回数」という別物なので、
|
|
71
|
+
* 注入するときに取り違えないこと。
|
|
72
|
+
*/
|
|
73
|
+
timeJumpCount: number;
|
|
74
|
+
/** 直近に飛んだ量(ms)。負なら時刻が戻った */
|
|
75
|
+
lastTimeJumpMs: number;
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* デフォルト実装(プラットフォームが実装を注入しない場合に使用される)
|
|
79
|
+
*
|
|
80
|
+
* 端末のローカル時計をそのまま返す。他の端末とは 0.1〜数秒ずれている前提なので、
|
|
81
|
+
* `synced` は false・`uncertainty` は Infinity で「信用できない」ことを明示する。
|
|
82
|
+
*/
|
|
83
|
+
export declare const createDefaultServerClockImplementation: () => ServerClockContextValue;
|
|
84
|
+
/**
|
|
85
|
+
* 用途に対して時刻が十分な精度かを判定する
|
|
86
|
+
*
|
|
87
|
+
* false のときの振る舞いはワールドの判断。動画なら同期を諦める(再生継続を優先)、
|
|
88
|
+
* 決定論的アニメーションなら合わせにいかずそのまま動かす、など。
|
|
89
|
+
*/
|
|
90
|
+
export declare const isServerClockAccurateEnough: (clock: Pick<ServerClockContextValue, "synced" | "uncertainty">, accuracy: ServerClockAccuracy) => boolean;
|
|
91
|
+
/**
|
|
92
|
+
* インスタンス共有時計(サーバ時刻)を提供する Context
|
|
93
|
+
* xrift-frontend 側で実装を注入し、ワールド側で利用できる
|
|
94
|
+
*/
|
|
95
|
+
export declare const ServerClockContext: import("react").Context<ServerClockContextValue | null>;
|
|
96
|
+
interface Props {
|
|
97
|
+
value: ServerClockContextValue;
|
|
98
|
+
children: ReactNode;
|
|
99
|
+
}
|
|
100
|
+
/** 共有時計を提供する ContextProvider */
|
|
101
|
+
export declare const ServerClockProvider: ({ value, children }: Props) => import("react/jsx-runtime").JSX.Element;
|
|
102
|
+
/**
|
|
103
|
+
* 共有時計の Context を取得する hook
|
|
104
|
+
* @throws {Error} ServerClockProvider の外で呼び出された場合
|
|
105
|
+
*/
|
|
106
|
+
export declare const useServerClockContext: () => ServerClockContextValue;
|
|
107
|
+
export {};
|
|
108
|
+
//# sourceMappingURL=ServerClockContext.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ServerClockContext.d.ts","sourceRoot":"","sources":["../../src/contexts/ServerClockContext.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAiB,KAAK,SAAS,EAAc,MAAM,OAAO,CAAA;AAEjE;;;;;;;;;;GAUG;AACH,MAAM,MAAM,mBAAmB,GAAG,OAAO,GAAG,QAAQ,CAAA;AAEpD,uCAAuC;AACvC,eAAO,MAAM,+BAA+B,EAAE,MAAM,CAAC,mBAAmB,EAAE,MAAM,CAG/E,CAAA;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,MAAM,WAAW,uBAAuB;IACtC;;;;;OAKG;IACH,GAAG,EAAE,MAAM,MAAM,CAAA;IACjB;;;;;;OAMG;IACH,WAAW,EAAE,MAAM,CAAA;IACnB;;;;;OAKG;IACH,MAAM,EAAE,OAAO,CAAA;IACf;;;;;;;;;;;;;;OAcG;IACH,aAAa,EAAE,MAAM,CAAA;IACrB,4BAA4B;IAC5B,cAAc,EAAE,MAAM,CAAA;CACvB;AAED;;;;;GAKG;AACH,eAAO,MAAM,sCAAsC,QAAO,uBAMxD,CAAA;AAEF;;;;;GAKG;AACH,eAAO,MAAM,2BAA2B,GACtC,OAAO,IAAI,CAAC,uBAAuB,EAAE,QAAQ,GAAG,aAAa,CAAC,EAC9D,UAAU,mBAAmB,KAC5B,OAAyF,CAAA;AAE5F;;;GAGG;AACH,eAAO,MAAM,kBAAkB,yDAAsD,CAAA;AAErF,UAAU,KAAK;IACb,KAAK,EAAE,uBAAuB,CAAA;IAC9B,QAAQ,EAAE,SAAS,CAAA;CACpB;AAED,gCAAgC;AAChC,eAAO,MAAM,mBAAmB,GAAI,qBAAqB,KAAK,4CAE7D,CAAA;AAED;;;GAGG;AACH,eAAO,MAAM,qBAAqB,QAAO,uBAMxC,CAAA"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
import { createContext, useContext } from 'react';
|
|
3
|
+
/** プリセットが要求する `uncertainty` の上限(ms) */
|
|
4
|
+
export const SERVER_CLOCK_ACCURACY_THRESHOLD = {
|
|
5
|
+
media: 300,
|
|
6
|
+
motion: 100,
|
|
7
|
+
};
|
|
8
|
+
/**
|
|
9
|
+
* デフォルト実装(プラットフォームが実装を注入しない場合に使用される)
|
|
10
|
+
*
|
|
11
|
+
* 端末のローカル時計をそのまま返す。他の端末とは 0.1〜数秒ずれている前提なので、
|
|
12
|
+
* `synced` は false・`uncertainty` は Infinity で「信用できない」ことを明示する。
|
|
13
|
+
*/
|
|
14
|
+
export const createDefaultServerClockImplementation = () => ({
|
|
15
|
+
now: () => Date.now(),
|
|
16
|
+
uncertainty: Number.POSITIVE_INFINITY,
|
|
17
|
+
synced: false,
|
|
18
|
+
timeJumpCount: 0,
|
|
19
|
+
lastTimeJumpMs: 0,
|
|
20
|
+
});
|
|
21
|
+
/**
|
|
22
|
+
* 用途に対して時刻が十分な精度かを判定する
|
|
23
|
+
*
|
|
24
|
+
* false のときの振る舞いはワールドの判断。動画なら同期を諦める(再生継続を優先)、
|
|
25
|
+
* 決定論的アニメーションなら合わせにいかずそのまま動かす、など。
|
|
26
|
+
*/
|
|
27
|
+
export const isServerClockAccurateEnough = (clock, accuracy) => clock.synced && clock.uncertainty <= SERVER_CLOCK_ACCURACY_THRESHOLD[accuracy];
|
|
28
|
+
/**
|
|
29
|
+
* インスタンス共有時計(サーバ時刻)を提供する Context
|
|
30
|
+
* xrift-frontend 側で実装を注入し、ワールド側で利用できる
|
|
31
|
+
*/
|
|
32
|
+
export const ServerClockContext = createContext(null);
|
|
33
|
+
/** 共有時計を提供する ContextProvider */
|
|
34
|
+
export const ServerClockProvider = ({ value, children }) => {
|
|
35
|
+
return _jsx(ServerClockContext.Provider, { value: value, children: children });
|
|
36
|
+
};
|
|
37
|
+
/**
|
|
38
|
+
* 共有時計の Context を取得する hook
|
|
39
|
+
* @throws {Error} ServerClockProvider の外で呼び出された場合
|
|
40
|
+
*/
|
|
41
|
+
export const useServerClockContext = () => {
|
|
42
|
+
const context = useContext(ServerClockContext);
|
|
43
|
+
if (!context) {
|
|
44
|
+
throw new Error('useServerClockContext must be used within ServerClockProvider');
|
|
45
|
+
}
|
|
46
|
+
return context;
|
|
47
|
+
};
|
|
48
|
+
//# sourceMappingURL=ServerClockContext.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ServerClockContext.js","sourceRoot":"","sources":["../../src/contexts/ServerClockContext.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,aAAa,EAAkB,UAAU,EAAE,MAAM,OAAO,CAAA;AAejE,uCAAuC;AACvC,MAAM,CAAC,MAAM,+BAA+B,GAAwC;IAClF,KAAK,EAAE,GAAG;IACV,MAAM,EAAE,GAAG;CACZ,CAAA;AAgED;;;;;GAKG;AACH,MAAM,CAAC,MAAM,sCAAsC,GAAG,GAA4B,EAAE,CAAC,CAAC;IACpF,GAAG,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,GAAG,EAAE;IACrB,WAAW,EAAE,MAAM,CAAC,iBAAiB;IACrC,MAAM,EAAE,KAAK;IACb,aAAa,EAAE,CAAC;IAChB,cAAc,EAAE,CAAC;CAClB,CAAC,CAAA;AAEF;;;;;GAKG;AACH,MAAM,CAAC,MAAM,2BAA2B,GAAG,CACzC,KAA8D,EAC9D,QAA6B,EACpB,EAAE,CAAC,KAAK,CAAC,MAAM,IAAI,KAAK,CAAC,WAAW,IAAI,+BAA+B,CAAC,QAAQ,CAAC,CAAA;AAE5F;;;GAGG;AACH,MAAM,CAAC,MAAM,kBAAkB,GAAG,aAAa,CAAiC,IAAI,CAAC,CAAA;AAOrF,gCAAgC;AAChC,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAS,EAAE,EAAE;IAChE,OAAO,KAAC,kBAAkB,CAAC,QAAQ,IAAC,KAAK,EAAE,KAAK,YAAG,QAAQ,GAA+B,CAAA;AAC5F,CAAC,CAAA;AAED;;;GAGG;AACH,MAAM,CAAC,MAAM,qBAAqB,GAAG,GAA4B,EAAE;IACjE,MAAM,OAAO,GAAG,UAAU,CAAC,kBAAkB,CAAC,CAAA;IAC9C,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,MAAM,IAAI,KAAK,CAAC,+DAA+D,CAAC,CAAA;IAClF,CAAC;IACD,OAAO,OAAO,CAAA;AAChB,CAAC,CAAA"}
|
|
@@ -16,6 +16,7 @@ import { type PlacementMode } from './PlacementStateContext';
|
|
|
16
16
|
import { type AudioVolumeContextValue } from './AudioVolumeContext';
|
|
17
17
|
import { type SharedFileContextValue } from './SharedFileContext';
|
|
18
18
|
import { type WorldStorageContextValue } from './WorldStorageContext';
|
|
19
|
+
import { type ServerClockContextValue } from './ServerClockContext';
|
|
19
20
|
export interface XRiftContextValue {
|
|
20
21
|
/**
|
|
21
22
|
* ワールドのベースURL(CDNのディレクトリパス)
|
|
@@ -118,6 +119,11 @@ interface Props {
|
|
|
118
119
|
* 指定しない場合はデフォルト実装(インメモリ・リロードで消える)が使用される
|
|
119
120
|
*/
|
|
120
121
|
worldStorageImplementation?: WorldStorageContextValue;
|
|
122
|
+
/**
|
|
123
|
+
* インスタンス共有時計(サーバ時刻)の実装(オプション)
|
|
124
|
+
* 指定しない場合はデフォルト実装(端末のローカル時計・synced=false)が使用される
|
|
125
|
+
*/
|
|
126
|
+
serverClockImplementation?: ServerClockContextValue;
|
|
121
127
|
/**
|
|
122
128
|
* アイテムの配置状態(オプション)
|
|
123
129
|
* 'preview': プレビュー中、'placed': 設置済み
|
|
@@ -131,7 +137,7 @@ interface Props {
|
|
|
131
137
|
* Module Federationで動的にロードされたワールドコンポーネントに
|
|
132
138
|
* 必要な情報を注入するために使用
|
|
133
139
|
*/
|
|
134
|
-
export declare const XRiftProvider: ({ baseUrl, confirmImplementation, instanceStateImplementation, instanceImplementation, screenShareImplementation, spawnPointImplementation, teleportImplementation, textInputImplementation, usersImplementation, worldImplementation, instanceEventImplementation, audioVolumeImplementation, fileInputImplementation, sharedFileImplementation, grabbableImplementation, worldStorageImplementation, placementMode, children, }: Props) => import("react/jsx-runtime").JSX.Element;
|
|
140
|
+
export declare const XRiftProvider: ({ baseUrl, confirmImplementation, instanceStateImplementation, instanceImplementation, screenShareImplementation, spawnPointImplementation, teleportImplementation, textInputImplementation, usersImplementation, worldImplementation, instanceEventImplementation, audioVolumeImplementation, fileInputImplementation, sharedFileImplementation, grabbableImplementation, worldStorageImplementation, serverClockImplementation, placementMode, children, }: Props) => import("react/jsx-runtime").JSX.Element;
|
|
135
141
|
/**
|
|
136
142
|
* XRift ワールドの情報を取得するhook
|
|
137
143
|
* ワールドプロジェクト側でアセットの相対パスを絶対パスに変換する際に使用
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"XRiftContext.d.ts","sourceRoot":"","sources":["../../src/contexts/XRiftContext.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAAiB,KAAK,SAAS,EAA8C,MAAM,OAAO,CAAA;AACxG,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAA;AACrC,OAAO,EAAyB,KAAK,yBAAyB,EAAE,MAAM,wBAAwB,CAAA;AAC9F,OAAO,EAAuB,KAAK,uBAAuB,EAAE,MAAM,sBAAsB,CAAA;AACxF,OAAO,EAAsB,KAAK,sBAAsB,EAAE,MAAM,qBAAqB,CAAA;AACrF,OAAO,EAGL,KAAK,mBAAmB,EACzB,MAAM,kBAAkB,CAAA;AACzB,OAAO,EAGL,KAAK,oBAAoB,EAC1B,MAAM,mBAAmB,CAAA;AAC1B,OAAO,EAGL,KAAK,iBAAiB,EACvB,MAAM,gBAAgB,CAAA;AACvB,OAAO,EAGL,KAAK,oBAAoB,EAC1B,MAAM,mBAAmB,CAAA;AAC1B,OAAO,EAGL,KAAK,qBAAqB,EAC3B,MAAM,oBAAoB,CAAA;AAC3B,OAAO,EAGL,KAAK,qBAAqB,EAC3B,MAAM,oBAAoB,CAAA;AAC3B,OAAO,EAAiB,KAAK,iBAAiB,EAAE,MAAM,gBAAgB,CAAA;AACtE,OAAO,EAAqB,KAAK,qBAAqB,EAAE,MAAM,oBAAoB,CAAA;AAClF,OAAO,EAGL,KAAK,yBAAyB,EAC/B,MAAM,wBAAwB,CAAA;AAC/B,OAAO,EAA0B,KAAK,aAAa,EAAE,MAAM,yBAAyB,CAAA;AACpF,OAAO,EAGL,KAAK,uBAAuB,EAC7B,MAAM,sBAAsB,CAAA;AAC7B,OAAO,EAGL,KAAK,sBAAsB,EAC5B,MAAM,qBAAqB,CAAA;AAC5B,OAAO,EAGL,KAAK,wBAAwB,EAC9B,MAAM,uBAAuB,CAAA;
|
|
1
|
+
{"version":3,"file":"XRiftContext.d.ts","sourceRoot":"","sources":["../../src/contexts/XRiftContext.tsx"],"names":[],"mappings":"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"}
|
|
@@ -16,6 +16,7 @@ import { PlacementStateProvider } from './PlacementStateContext';
|
|
|
16
16
|
import { AudioVolumeProvider, createDefaultAudioVolumeImplementation, } from './AudioVolumeContext';
|
|
17
17
|
import { SharedFileProvider, createDefaultSharedFileImplementation, } from './SharedFileContext';
|
|
18
18
|
import { WorldStorageProvider, createDefaultWorldStorageImplementation, } from './WorldStorageContext';
|
|
19
|
+
import { ServerClockProvider, createDefaultServerClockImplementation, } from './ServerClockContext';
|
|
19
20
|
// デフォルトの画面共有実装(開発環境用)
|
|
20
21
|
const createDefaultScreenShareImplementation = () => ({
|
|
21
22
|
videoElement: null,
|
|
@@ -39,7 +40,7 @@ const composeProviders = (providers, children) => providers.reduceRight((acc, [P
|
|
|
39
40
|
* Module Federationで動的にロードされたワールドコンポーネントに
|
|
40
41
|
* 必要な情報を注入するために使用
|
|
41
42
|
*/
|
|
42
|
-
export const XRiftProvider = ({ baseUrl, confirmImplementation, instanceStateImplementation, instanceImplementation, screenShareImplementation, spawnPointImplementation, teleportImplementation, textInputImplementation, usersImplementation, worldImplementation, instanceEventImplementation, audioVolumeImplementation, fileInputImplementation, sharedFileImplementation, grabbableImplementation, worldStorageImplementation, placementMode, children, }) => {
|
|
43
|
+
export const XRiftProvider = ({ baseUrl, confirmImplementation, instanceStateImplementation, instanceImplementation, screenShareImplementation, spawnPointImplementation, teleportImplementation, textInputImplementation, usersImplementation, worldImplementation, instanceEventImplementation, audioVolumeImplementation, fileInputImplementation, sharedFileImplementation, grabbableImplementation, worldStorageImplementation, serverClockImplementation, placementMode, children, }) => {
|
|
43
44
|
// インタラクト可能なオブジェクトの管理
|
|
44
45
|
const [interactableObjects] = useState(() => new Set());
|
|
45
46
|
// 画面共有の実装(指定がない場合はデフォルト実装を使用)
|
|
@@ -64,6 +65,8 @@ export const XRiftProvider = ({ baseUrl, confirmImplementation, instanceStateImp
|
|
|
64
65
|
const sharedFileImpl = useMemo(() => sharedFileImplementation ?? createDefaultSharedFileImplementation(), [sharedFileImplementation]);
|
|
65
66
|
// World Storage の実装(指定がない場合はデフォルト実装を使用)
|
|
66
67
|
const worldStorageImpl = useMemo(() => worldStorageImplementation ?? createDefaultWorldStorageImplementation(), [worldStorageImplementation]);
|
|
68
|
+
// 共有時計の実装(指定がない場合はデフォルト実装 = 端末のローカル時計を使用)
|
|
69
|
+
const serverClockImpl = useMemo(() => serverClockImplementation ?? createDefaultServerClockImplementation(), [serverClockImplementation]);
|
|
67
70
|
// オブジェクトの登録
|
|
68
71
|
const registerInteractable = useCallback((object) => {
|
|
69
72
|
interactableObjects.add(object);
|
|
@@ -94,6 +97,7 @@ export const XRiftProvider = ({ baseUrl, confirmImplementation, instanceStateImp
|
|
|
94
97
|
[InstanceProvider, { value: instanceImpl }],
|
|
95
98
|
[AudioVolumeProvider, { value: audioVolumeImpl }],
|
|
96
99
|
[WorldStorageProvider, { value: worldStorageImpl }],
|
|
100
|
+
[ServerClockProvider, { value: serverClockImpl }],
|
|
97
101
|
];
|
|
98
102
|
if (placementMode) {
|
|
99
103
|
providers.push([PlacementStateProvider, { mode: placementMode }]);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"XRiftContext.js","sourceRoot":"","sources":["../../src/contexts/XRiftContext.tsx"],"names":[],"mappings":";AAAA,OAAc,EAAE,aAAa,EAAkB,WAAW,EAAE,UAAU,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAA;AAExG,OAAO,EAAE,qBAAqB,EAAkC,MAAM,wBAAwB,CAAA;AAC9F,OAAO,EAAE,mBAAmB,EAAgC,MAAM,sBAAsB,CAAA;AACxF,OAAO,EAAE,kBAAkB,EAA+B,MAAM,qBAAqB,CAAA;AACrF,OAAO,EACL,eAAe,EACf,kCAAkC,GAEnC,MAAM,kBAAkB,CAAA;AACzB,OAAO,EACL,gBAAgB,EAChB,mCAAmC,GAEpC,MAAM,mBAAmB,CAAA;AAC1B,OAAO,EACL,aAAa,EACb,gCAAgC,GAEjC,MAAM,gBAAgB,CAAA;AACvB,OAAO,EACL,gBAAgB,EAChB,mCAAmC,GAEpC,MAAM,mBAAmB,CAAA;AAC1B,OAAO,EACL,iBAAiB,EACjB,oCAAoC,GAErC,MAAM,oBAAoB,CAAA;AAC3B,OAAO,EACL,iBAAiB,EACjB,oCAAoC,GAErC,MAAM,oBAAoB,CAAA;AAC3B,OAAO,EAAE,aAAa,EAA0B,MAAM,gBAAgB,CAAA;AACtE,OAAO,EAAE,iBAAiB,EAA8B,MAAM,oBAAoB,CAAA;AAClF,OAAO,EACL,qBAAqB,EACrB,wCAAwC,GAEzC,MAAM,wBAAwB,CAAA;AAC/B,OAAO,EAAE,sBAAsB,EAAsB,MAAM,yBAAyB,CAAA;AACpF,OAAO,EACL,mBAAmB,EACnB,sCAAsC,GAEvC,MAAM,sBAAsB,CAAA;AAC7B,OAAO,EACL,kBAAkB,EAClB,qCAAqC,GAEtC,MAAM,qBAAqB,CAAA;AAC5B,OAAO,EACL,oBAAoB,EACpB,uCAAuC,GAExC,MAAM,uBAAuB,CAAA;
|
|
1
|
+
{"version":3,"file":"XRiftContext.js","sourceRoot":"","sources":["../../src/contexts/XRiftContext.tsx"],"names":[],"mappings":";AAAA,OAAc,EAAE,aAAa,EAAkB,WAAW,EAAE,UAAU,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAA;AAExG,OAAO,EAAE,qBAAqB,EAAkC,MAAM,wBAAwB,CAAA;AAC9F,OAAO,EAAE,mBAAmB,EAAgC,MAAM,sBAAsB,CAAA;AACxF,OAAO,EAAE,kBAAkB,EAA+B,MAAM,qBAAqB,CAAA;AACrF,OAAO,EACL,eAAe,EACf,kCAAkC,GAEnC,MAAM,kBAAkB,CAAA;AACzB,OAAO,EACL,gBAAgB,EAChB,mCAAmC,GAEpC,MAAM,mBAAmB,CAAA;AAC1B,OAAO,EACL,aAAa,EACb,gCAAgC,GAEjC,MAAM,gBAAgB,CAAA;AACvB,OAAO,EACL,gBAAgB,EAChB,mCAAmC,GAEpC,MAAM,mBAAmB,CAAA;AAC1B,OAAO,EACL,iBAAiB,EACjB,oCAAoC,GAErC,MAAM,oBAAoB,CAAA;AAC3B,OAAO,EACL,iBAAiB,EACjB,oCAAoC,GAErC,MAAM,oBAAoB,CAAA;AAC3B,OAAO,EAAE,aAAa,EAA0B,MAAM,gBAAgB,CAAA;AACtE,OAAO,EAAE,iBAAiB,EAA8B,MAAM,oBAAoB,CAAA;AAClF,OAAO,EACL,qBAAqB,EACrB,wCAAwC,GAEzC,MAAM,wBAAwB,CAAA;AAC/B,OAAO,EAAE,sBAAsB,EAAsB,MAAM,yBAAyB,CAAA;AACpF,OAAO,EACL,mBAAmB,EACnB,sCAAsC,GAEvC,MAAM,sBAAsB,CAAA;AAC7B,OAAO,EACL,kBAAkB,EAClB,qCAAqC,GAEtC,MAAM,qBAAqB,CAAA;AAC5B,OAAO,EACL,oBAAoB,EACpB,uCAAuC,GAExC,MAAM,uBAAuB,CAAA;AAC9B,OAAO,EACL,mBAAmB,EACnB,sCAAsC,GAEvC,MAAM,sBAAsB,CAAA;AAE7B,sBAAsB;AACtB,MAAM,sCAAsC,GAAG,GAA4B,EAAE,CAAC,CAAC;IAC7E,YAAY,EAAE,IAAI;IAClB,SAAS,EAAE,KAAK;IAChB,gBAAgB,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,uCAAuC,CAAC;IAC5E,eAAe,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,sCAAsC,CAAC;IAC1E,eAAe,EAAE,KAAK;CACvB,CAAC,CAAA;AA2BF;;;GAGG;AACH,MAAM,CAAC,MAAM,YAAY,GAAG,aAAa,CAA2B,IAAI,CAAC,CAAA;AA6FzE;;;GAGG;AACH,MAAM,gBAAgB,GAAG,CACvB,SAAqE,EACrE,QAAmB,EACR,EAAE,CACb,SAAS,CAAC,WAAW,CACnB,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,KAAC,QAAQ,OAAK,KAAK,YAAG,GAAG,GAAY,EACjE,QAAQ,CACT,CAAA;AAEH;;;;GAIG;AACH,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,EAC5B,OAAO,EACP,qBAAqB,EACrB,2BAA2B,EAC3B,sBAAsB,EACtB,yBAAyB,EACzB,wBAAwB,EACxB,sBAAsB,EACtB,uBAAuB,EACvB,mBAAmB,EACnB,mBAAmB,EACnB,2BAA2B,EAC3B,yBAAyB,EACzB,uBAAuB,EACvB,wBAAwB,EACxB,uBAAuB,EACvB,0BAA0B,EAC1B,yBAAyB,EACzB,aAAa,EACb,QAAQ,GACF,EAAE,EAAE;IACV,qBAAqB;IACrB,MAAM,CAAC,mBAAmB,CAAC,GAAG,QAAQ,CAAC,GAAG,EAAE,CAAC,IAAI,GAAG,EAAY,CAAC,CAAA;IAEjE,8BAA8B;IAC9B,MAAM,eAAe,GAAG,OAAO,CAC7B,GAAG,EAAE,CAAC,yBAAyB,IAAI,sCAAsC,EAAE,EAC3E,CAAC,yBAAyB,CAAC,CAC5B,CAAA;IAED,gCAAgC;IAChC,MAAM,aAAa,GAAG,OAAO,CAC3B,GAAG,EAAE,CAAC,uBAAuB,IAAI,oCAAoC,EAAE,EACvE,CAAC,uBAAuB,CAAC,CAC1B,CAAA;IAED,gCAAgC;IAChC,MAAM,WAAW,GAAG,OAAO,CACzB,GAAG,EAAE,CAAC,qBAAqB,IAAI,kCAAkC,EAAE,EACnE,CAAC,qBAAqB,CAAC,CACxB,CAAA;IAED,kCAAkC;IAClC,MAAM,YAAY,GAAG,OAAO,CAC1B,GAAG,EAAE,CAAC,sBAAsB,IAAI,mCAAmC,EAAE,EACrE,CAAC,sBAAsB,CAAC,CACzB,CAAA;IAED,gCAAgC;IAChC,MAAM,SAAS,GAAG,OAAO,CACvB,GAAG,EAAE,CAAC,mBAAmB,IAAI,gCAAgC,EAAE,EAC/D,CAAC,mBAAmB,CAAC,CACtB,CAAA;IAED,+BAA+B;IAC/B,MAAM,YAAY,GAAG,OAAO,CAC1B,GAAG,EAAE,CAAC,sBAAsB,IAAI,mCAAmC,EAAE,EACrE,CAAC,sBAAsB,CAAC,CACzB,CAAA;IAED,oCAAoC;IACpC,MAAM,iBAAiB,GAAG,OAAO,CAC/B,GAAG,EAAE,CAAC,2BAA2B,IAAI,wCAAwC,EAAE,EAC/E,CAAC,2BAA2B,CAAC,CAC9B,CAAA;IAED,mCAAmC;IACnC,MAAM,eAAe,GAAG,OAAO,CAC7B,GAAG,EAAE,CAAC,yBAAyB,IAAI,sCAAsC,EAAE,EAC3E,CAAC,yBAAyB,CAAC,CAC5B,CAAA;IAED,gCAAgC;IAChC,MAAM,aAAa,GAAG,OAAO,CAC3B,GAAG,EAAE,CAAC,uBAAuB,IAAI,oCAAoC,EAAE,EACvE,CAAC,uBAAuB,CAAC,CAC1B,CAAA;IAED,gCAAgC;IAChC,MAAM,cAAc,GAAG,OAAO,CAC5B,GAAG,EAAE,CAAC,wBAAwB,IAAI,qCAAqC,EAAE,EACzE,CAAC,wBAAwB,CAAC,CAC3B,CAAA;IAED,wCAAwC;IACxC,MAAM,gBAAgB,GAAG,OAAO,CAC9B,GAAG,EAAE,CAAC,0BAA0B,IAAI,uCAAuC,EAAE,EAC7E,CAAC,0BAA0B,CAAC,CAC7B,CAAA;IAED,0CAA0C;IAC1C,MAAM,eAAe,GAAG,OAAO,CAC7B,GAAG,EAAE,CAAC,yBAAyB,IAAI,sCAAsC,EAAE,EAC3E,CAAC,yBAAyB,CAAC,CAC5B,CAAA;IAED,YAAY;IACZ,MAAM,oBAAoB,GAAG,WAAW,CAAC,CAAC,MAAgB,EAAE,EAAE;QAC5D,mBAAmB,CAAC,GAAG,CAAC,MAAM,CAAC,CAAA;IACjC,CAAC,EAAE,CAAC,mBAAmB,CAAC,CAAC,CAAA;IAEzB,cAAc;IACd,MAAM,sBAAsB,GAAG,WAAW,CAAC,CAAC,MAAgB,EAAE,EAAE;QAC9D,mBAAmB,CAAC,MAAM,CAAC,MAAM,CAAC,CAAA;IACpC,CAAC,EAAE,CAAC,mBAAmB,CAAC,CAAC,CAAA;IAEzB,MAAM,iBAAiB,GAAG,OAAO,CAAoB,GAAG,EAAE,CAAC,CAAC;QAC1D,OAAO;QACP,mBAAmB;QACnB,oBAAoB;QACpB,sBAAsB;KACvB,CAAC,EAAE,CAAC,OAAO,EAAE,mBAAmB,EAAE,oBAAoB,EAAE,sBAAsB,CAAC,CAAC,CAAA;IAEjF,MAAM,SAAS,GAA+D;QAC5E,CAAC,mBAAmB,EAAE,EAAE,KAAK,EAAE,eAAe,EAAE,CAAC;QACjD,CAAC,iBAAiB,EAAE,EAAE,KAAK,EAAE,aAAa,EAAE,CAAC;QAC7C,CAAC,iBAAiB,EAAE,EAAE,KAAK,EAAE,aAAa,EAAE,CAAC;QAC7C,CAAC,kBAAkB,EAAE,EAAE,KAAK,EAAE,cAAc,EAAE,CAAC;QAC/C,CAAC,qBAAqB,EAAE,EAAE,cAAc,EAAE,2BAA2B,EAAE,CAAC;QACxE,CAAC,kBAAkB,EAAE,EAAE,cAAc,EAAE,wBAAwB,EAAE,CAAC;QAClE,CAAC,aAAa,EAAE,EAAE,cAAc,EAAE,mBAAmB,EAAE,CAAC;QACxD,CAAC,iBAAiB,EAAE,EAAE,cAAc,EAAE,uBAAuB,EAAE,CAAC;QAChE,CAAC,qBAAqB,EAAE,EAAE,KAAK,EAAE,iBAAiB,EAAE,CAAC;QACrD,CAAC,gBAAgB,EAAE,EAAE,KAAK,EAAE,YAAY,EAAE,CAAC;QAC3C,CAAC,eAAe,EAAE,EAAE,KAAK,EAAE,WAAW,EAAE,CAAC;QACzC,CAAC,aAAa,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC;QACrC,CAAC,gBAAgB,EAAE,EAAE,KAAK,EAAE,YAAY,EAAE,CAAC;QAC3C,CAAC,mBAAmB,EAAE,EAAE,KAAK,EAAE,eAAe,EAAE,CAAC;QACjD,CAAC,oBAAoB,EAAE,EAAE,KAAK,EAAE,gBAAgB,EAAE,CAAC;QACnD,CAAC,mBAAmB,EAAE,EAAE,KAAK,EAAE,eAAe,EAAE,CAAC;KAClD,CAAA;IAED,IAAI,aAAa,EAAE,CAAC;QAClB,SAAS,CAAC,IAAI,CAAC,CAAC,sBAAsB,EAAE,EAAE,IAAI,EAAE,aAAa,EAAE,CAAC,CAAC,CAAA;IACnE,CAAC;IAED,OAAO,CACL,KAAC,YAAY,CAAC,QAAQ,IAAC,KAAK,EAAE,iBAAiB,YAC5C,gBAAgB,CAAC,SAAS,EAAE,QAAQ,CAAC,GAChB,CACzB,CAAA;AACH,CAAC,CAAA;AAED;;;;;;;;;GASG;AACH,MAAM,CAAC,MAAM,QAAQ,GAAG,GAAsB,EAAE;IAC9C,MAAM,OAAO,GAAG,UAAU,CAAC,YAAY,CAAC,CAAA;IAExC,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,MAAM,IAAI,KAAK,CAAC,4CAA4C,CAAC,CAAA;IAC/D,CAAC;IAED,OAAO,OAAO,CAAA;AAChB,CAAC,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ServerClockContext.test.d.ts","sourceRoot":"","sources":["../../../src/contexts/__tests__/ServerClockContext.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import { describe, expect, it } from 'vitest';
|
|
2
|
+
import { SERVER_CLOCK_ACCURACY_THRESHOLD, createDefaultServerClockImplementation, isServerClockAccurateEnough, } from '../ServerClockContext';
|
|
3
|
+
describe('createDefaultServerClockImplementation', () => {
|
|
4
|
+
it('端末のローカル時計を返す', () => {
|
|
5
|
+
const clock = createDefaultServerClockImplementation();
|
|
6
|
+
expect(clock.now()).toBeCloseTo(Date.now(), -2);
|
|
7
|
+
});
|
|
8
|
+
it('信用できないことを明示する(未注入の判別)', () => {
|
|
9
|
+
const clock = createDefaultServerClockImplementation();
|
|
10
|
+
// 他の端末とは 0.1〜数秒ずれている前提なので、合わせにいってはいけない
|
|
11
|
+
expect(clock.synced).toBe(false);
|
|
12
|
+
expect(clock.uncertainty).toBe(Number.POSITIVE_INFINITY);
|
|
13
|
+
expect(clock.timeJumpCount).toBe(0);
|
|
14
|
+
});
|
|
15
|
+
});
|
|
16
|
+
describe('isServerClockAccurateEnough', () => {
|
|
17
|
+
it('同期していなければ用途によらず false', () => {
|
|
18
|
+
const clock = { synced: false, uncertainty: 5 };
|
|
19
|
+
expect(isServerClockAccurateEnough(clock, 'media')).toBe(false);
|
|
20
|
+
expect(isServerClockAccurateEnough(clock, 'motion')).toBe(false);
|
|
21
|
+
});
|
|
22
|
+
it('しきい値以下なら true', () => {
|
|
23
|
+
const clock = { synced: true, uncertainty: SERVER_CLOCK_ACCURACY_THRESHOLD.motion };
|
|
24
|
+
expect(isServerClockAccurateEnough(clock, 'motion')).toBe(true);
|
|
25
|
+
expect(isServerClockAccurateEnough(clock, 'media')).toBe(true);
|
|
26
|
+
});
|
|
27
|
+
it('用途ごとに要求精度が違う', () => {
|
|
28
|
+
// 動画なら許容できるが、決定論的アニメーションには粗いケース
|
|
29
|
+
const clock = { synced: true, uncertainty: 200 };
|
|
30
|
+
expect(isServerClockAccurateEnough(clock, 'media')).toBe(true);
|
|
31
|
+
expect(isServerClockAccurateEnough(clock, 'motion')).toBe(false);
|
|
32
|
+
});
|
|
33
|
+
it('しきい値を超えたら false', () => {
|
|
34
|
+
const clock = { synced: true, uncertainty: 1000 };
|
|
35
|
+
expect(isServerClockAccurateEnough(clock, 'media')).toBe(false);
|
|
36
|
+
});
|
|
37
|
+
it('実測(本番デスクトップ, uncertainty ±40ms)はどちらの用途も満たす', () => {
|
|
38
|
+
const clock = { synced: true, uncertainty: 40 };
|
|
39
|
+
expect(isServerClockAccurateEnough(clock, 'media')).toBe(true);
|
|
40
|
+
expect(isServerClockAccurateEnough(clock, 'motion')).toBe(true);
|
|
41
|
+
});
|
|
42
|
+
});
|
|
43
|
+
//# sourceMappingURL=ServerClockContext.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ServerClockContext.test.js","sourceRoot":"","sources":["../../../src/contexts/__tests__/ServerClockContext.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAA;AAC7C,OAAO,EACL,+BAA+B,EAC/B,sCAAsC,EACtC,2BAA2B,GAC5B,MAAM,uBAAuB,CAAA;AAE9B,QAAQ,CAAC,wCAAwC,EAAE,GAAG,EAAE;IACtD,EAAE,CAAC,cAAc,EAAE,GAAG,EAAE;QACtB,MAAM,KAAK,GAAG,sCAAsC,EAAE,CAAA;QAEtD,MAAM,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC,WAAW,CAAC,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,CAAC,CAAA;IACjD,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,uBAAuB,EAAE,GAAG,EAAE;QAC/B,MAAM,KAAK,GAAG,sCAAsC,EAAE,CAAA;QAEtD,uCAAuC;QACvC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;QAChC,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,iBAAiB,CAAC,CAAA;QACxD,MAAM,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;IACrC,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA;AAEF,QAAQ,CAAC,6BAA6B,EAAE,GAAG,EAAE;IAC3C,EAAE,CAAC,uBAAuB,EAAE,GAAG,EAAE;QAC/B,MAAM,KAAK,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,WAAW,EAAE,CAAC,EAAE,CAAA;QAE/C,MAAM,CAAC,2BAA2B,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;QAC/D,MAAM,CAAC,2BAA2B,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;IAClE,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,eAAe,EAAE,GAAG,EAAE;QACvB,MAAM,KAAK,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,WAAW,EAAE,+BAA+B,CAAC,MAAM,EAAE,CAAA;QAEnF,MAAM,CAAC,2BAA2B,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QAC/D,MAAM,CAAC,2BAA2B,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;IAChE,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,cAAc,EAAE,GAAG,EAAE;QACtB,gCAAgC;QAChC,MAAM,KAAK,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,WAAW,EAAE,GAAG,EAAE,CAAA;QAEhD,MAAM,CAAC,2BAA2B,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QAC9D,MAAM,CAAC,2BAA2B,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;IAClE,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,iBAAiB,EAAE,GAAG,EAAE;QACzB,MAAM,KAAK,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,CAAA;QAEjD,MAAM,CAAC,2BAA2B,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;IACjE,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,4CAA4C,EAAE,GAAG,EAAE;QACpD,MAAM,KAAK,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,WAAW,EAAE,EAAE,EAAE,CAAA;QAE/C,MAAM,CAAC,2BAA2B,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QAC9D,MAAM,CAAC,2BAA2B,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;IACjE,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA"}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import { type ServerClockAccuracy, type ServerClockContextValue } from '../contexts/ServerClockContext';
|
|
2
|
+
export interface UseServerClockResult extends ServerClockContextValue {
|
|
3
|
+
/**
|
|
4
|
+
* `require` で指定した用途に対して時刻が十分な精度か。
|
|
5
|
+
* `require` を指定しない場合は `synced` と同じ。
|
|
6
|
+
*/
|
|
7
|
+
trustworthy: boolean;
|
|
8
|
+
}
|
|
9
|
+
/**
|
|
10
|
+
* インスタンス内の全端末で共有できる時計(サーバ時刻)を提供するフック
|
|
11
|
+
*
|
|
12
|
+
* 端末の `Date.now()` は互いに 0.1〜数秒ずれているため、動画の再生位置同期・
|
|
13
|
+
* カウントダウン・同時演出・決定論的アニメーションはこれを使う。
|
|
14
|
+
*
|
|
15
|
+
* 指針:
|
|
16
|
+
* - **`now` は関数**。値ではないので `useFrame` の中から再レンダーなしで呼べる
|
|
17
|
+
* - **`timeJumpCount` の変化を見て基準を取り直す。** 通常は時刻が巻き戻らない
|
|
18
|
+
* よう徐々に補正するが、スリープ復帰などでは飛ぶ。時刻から位置を計算している
|
|
19
|
+
* ワールドは、飛んだときに基準を取り直さないとワープしたままになる
|
|
20
|
+
* - **補正のコストが誤差より大きいなら補正しない。** 動画で言えば、ズレを直すために
|
|
21
|
+
* シークしてバッファが切れるくらいなら、ズレたまま再生を続けるほうが体験は良い
|
|
22
|
+
* - 早押し・ゴール判定のような**公平性が要る用途には使わない**。経路の非対称ぶんの
|
|
23
|
+
* 誤差は検出できず、繰り返しても平均化されない(同じ人が毎回勝つ)
|
|
24
|
+
*
|
|
25
|
+
* @example
|
|
26
|
+
* // 動画の再生位置を合わせる
|
|
27
|
+
* const clock = useServerClock({ require: 'media' })
|
|
28
|
+
*
|
|
29
|
+
* useFrame(() => {
|
|
30
|
+
* if (!clock.trustworthy) return // 精度が出ていないなら諦める
|
|
31
|
+
* const target = (clock.now() - epoch) / 1000 % duration
|
|
32
|
+
* const diff = target - video.currentTime
|
|
33
|
+
* if (Math.abs(diff) < 0.3) {
|
|
34
|
+
* video.playbackRate = 1 // dead band。戻し忘れると振動し続ける
|
|
35
|
+
* return
|
|
36
|
+
* }
|
|
37
|
+
* if (Math.abs(diff) < 5) video.playbackRate = 1 + Math.sign(diff) * 0.05
|
|
38
|
+
* else if (isBuffered(video, target)) video.currentTime = target
|
|
39
|
+
* // バッファ外なら何もしない(同期より再生継続を優先)
|
|
40
|
+
* })
|
|
41
|
+
*
|
|
42
|
+
* @example
|
|
43
|
+
* // 全員で一致する動く床(通信ゼロ。後から入った人も即座に正しい位置になる)
|
|
44
|
+
* const { now, timeJumpCount } = useServerClock()
|
|
45
|
+
* const seen = useRef(timeJumpCount)
|
|
46
|
+
*
|
|
47
|
+
* useFrame(() => {
|
|
48
|
+
* if (seen.current !== timeJumpCount) {
|
|
49
|
+
* seen.current = timeJumpCount
|
|
50
|
+
* resetBaseline() // 時刻が飛んだので基準を取り直す
|
|
51
|
+
* }
|
|
52
|
+
* floor.current.position.y = Math.sin(now() / 1000) * 2
|
|
53
|
+
* })
|
|
54
|
+
*
|
|
55
|
+
* @throws {Error} XRiftProvider の外で呼び出された場合
|
|
56
|
+
*/
|
|
57
|
+
export declare const useServerClock: (options?: {
|
|
58
|
+
require?: ServerClockAccuracy;
|
|
59
|
+
}) => UseServerClockResult;
|
|
60
|
+
//# sourceMappingURL=useServerClock.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useServerClock.d.ts","sourceRoot":"","sources":["../../src/hooks/useServerClock.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,mBAAmB,EACxB,KAAK,uBAAuB,EAE7B,MAAM,gCAAgC,CAAA;AAEvC,MAAM,WAAW,oBAAqB,SAAQ,uBAAuB;IACnE;;;OAGG;IACH,WAAW,EAAE,OAAO,CAAA;CACrB;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+CG;AACH,eAAO,MAAM,cAAc,GAAI,UAAU;IAAE,OAAO,CAAC,EAAE,mBAAmB,CAAA;CAAE,KAAG,oBAO5E,CAAA"}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import { isServerClockAccurateEnough, useServerClockContext, } from '../contexts/ServerClockContext';
|
|
2
|
+
/**
|
|
3
|
+
* インスタンス内の全端末で共有できる時計(サーバ時刻)を提供するフック
|
|
4
|
+
*
|
|
5
|
+
* 端末の `Date.now()` は互いに 0.1〜数秒ずれているため、動画の再生位置同期・
|
|
6
|
+
* カウントダウン・同時演出・決定論的アニメーションはこれを使う。
|
|
7
|
+
*
|
|
8
|
+
* 指針:
|
|
9
|
+
* - **`now` は関数**。値ではないので `useFrame` の中から再レンダーなしで呼べる
|
|
10
|
+
* - **`timeJumpCount` の変化を見て基準を取り直す。** 通常は時刻が巻き戻らない
|
|
11
|
+
* よう徐々に補正するが、スリープ復帰などでは飛ぶ。時刻から位置を計算している
|
|
12
|
+
* ワールドは、飛んだときに基準を取り直さないとワープしたままになる
|
|
13
|
+
* - **補正のコストが誤差より大きいなら補正しない。** 動画で言えば、ズレを直すために
|
|
14
|
+
* シークしてバッファが切れるくらいなら、ズレたまま再生を続けるほうが体験は良い
|
|
15
|
+
* - 早押し・ゴール判定のような**公平性が要る用途には使わない**。経路の非対称ぶんの
|
|
16
|
+
* 誤差は検出できず、繰り返しても平均化されない(同じ人が毎回勝つ)
|
|
17
|
+
*
|
|
18
|
+
* @example
|
|
19
|
+
* // 動画の再生位置を合わせる
|
|
20
|
+
* const clock = useServerClock({ require: 'media' })
|
|
21
|
+
*
|
|
22
|
+
* useFrame(() => {
|
|
23
|
+
* if (!clock.trustworthy) return // 精度が出ていないなら諦める
|
|
24
|
+
* const target = (clock.now() - epoch) / 1000 % duration
|
|
25
|
+
* const diff = target - video.currentTime
|
|
26
|
+
* if (Math.abs(diff) < 0.3) {
|
|
27
|
+
* video.playbackRate = 1 // dead band。戻し忘れると振動し続ける
|
|
28
|
+
* return
|
|
29
|
+
* }
|
|
30
|
+
* if (Math.abs(diff) < 5) video.playbackRate = 1 + Math.sign(diff) * 0.05
|
|
31
|
+
* else if (isBuffered(video, target)) video.currentTime = target
|
|
32
|
+
* // バッファ外なら何もしない(同期より再生継続を優先)
|
|
33
|
+
* })
|
|
34
|
+
*
|
|
35
|
+
* @example
|
|
36
|
+
* // 全員で一致する動く床(通信ゼロ。後から入った人も即座に正しい位置になる)
|
|
37
|
+
* const { now, timeJumpCount } = useServerClock()
|
|
38
|
+
* const seen = useRef(timeJumpCount)
|
|
39
|
+
*
|
|
40
|
+
* useFrame(() => {
|
|
41
|
+
* if (seen.current !== timeJumpCount) {
|
|
42
|
+
* seen.current = timeJumpCount
|
|
43
|
+
* resetBaseline() // 時刻が飛んだので基準を取り直す
|
|
44
|
+
* }
|
|
45
|
+
* floor.current.position.y = Math.sin(now() / 1000) * 2
|
|
46
|
+
* })
|
|
47
|
+
*
|
|
48
|
+
* @throws {Error} XRiftProvider の外で呼び出された場合
|
|
49
|
+
*/
|
|
50
|
+
export const useServerClock = (options) => {
|
|
51
|
+
const clock = useServerClockContext();
|
|
52
|
+
const accuracy = options?.require;
|
|
53
|
+
return {
|
|
54
|
+
...clock,
|
|
55
|
+
trustworthy: accuracy ? isServerClockAccurateEnough(clock, accuracy) : clock.synced,
|
|
56
|
+
};
|
|
57
|
+
};
|
|
58
|
+
//# sourceMappingURL=useServerClock.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useServerClock.js","sourceRoot":"","sources":["../../src/hooks/useServerClock.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,2BAA2B,EAG3B,qBAAqB,GACtB,MAAM,gCAAgC,CAAA;AAUvC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+CG;AACH,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,OAA2C,EAAwB,EAAE;IAClG,MAAM,KAAK,GAAG,qBAAqB,EAAE,CAAA;IACrC,MAAM,QAAQ,GAAG,OAAO,EAAE,OAAO,CAAA;IACjC,OAAO;QACL,GAAG,KAAK;QACR,WAAW,EAAE,QAAQ,CAAC,CAAC,CAAC,2BAA2B,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM;KACpF,CAAA;AACH,CAAC,CAAA"}
|
package/dist/index.d.ts
CHANGED
|
@@ -14,6 +14,7 @@ export { PlacementStateProvider, usePlacementState, type PlacementMode, type Pla
|
|
|
14
14
|
export { ItemProvider, useItem, type ItemContextValue, } from './contexts/ItemContext';
|
|
15
15
|
export { SharedFileContext, SharedFileProvider, useSharedFileContext, createDefaultSharedFileImplementation, type SharedFileContextValue, type SharedFileInfo, type UploadSharedFileOptions, type UpdateSharedFileParams, } from './contexts/SharedFileContext';
|
|
16
16
|
export { WorldStorageContext, WorldStorageProvider, useWorldStorageContext, createDefaultWorldStorageImplementation, WorldStorageError, WORLD_STORAGE_KEY_PATTERN, WORLD_STORAGE_LIMITS, isValidWorldStorageKey, getWorldStorageEntrySize, incrementWorldStorageValue, type WorldStorageContextValue, type WorldStorageErrorCode, type WorldStorageEntry, type SharedWorldStorage, type PlayerWorldStorage, } from './contexts/WorldStorageContext';
|
|
17
|
+
export { ServerClockContext, ServerClockProvider, useServerClockContext, createDefaultServerClockImplementation, isServerClockAccurateEnough, SERVER_CLOCK_ACCURACY_THRESHOLD, type ServerClockContextValue, type ServerClockAccuracy, } from './contexts/ServerClockContext';
|
|
17
18
|
export { GrabbableContext, GrabbableProvider, useGrabbableContext, createDefaultGrabbableImplementation, type GrabbableContextValue, type GrabbableEntry, type GrabbableTransform, type GrabResultTransform, } from './contexts/GrabbableContext';
|
|
18
19
|
export { VoiceVolumeOverrideContext, VoiceVolumeOverrideProvider, useVoiceVolumeOverrideContext, createDefaultVoiceVolumeOverrideImplementation, type VoiceVolumeOverrideContextValue, AudioVolumeContext, AudioVolumeProvider, useAudioVolumeContext, createDefaultAudioVolumeImplementation, type AudioVolumeContextValue, } from './contexts/AudioVolumeContext';
|
|
19
20
|
export { Interactable, type InteractableProps, } from './components/Interactable';
|
|
@@ -44,6 +45,7 @@ export { useWorld } from './hooks/useWorld';
|
|
|
44
45
|
export { useInstanceEvent } from './hooks/useInstanceEvent';
|
|
45
46
|
export { useSharedFile } from './hooks/useSharedFile';
|
|
46
47
|
export { useWorldStorage } from './hooks/useWorldStorage';
|
|
48
|
+
export { useServerClock, type UseServerClockResult } from './hooks/useServerClock';
|
|
47
49
|
export { useVoiceVolumeOverride, useAudioVolume } from './hooks/useAudioVolume';
|
|
48
50
|
export { useDefaultFont, type FontLocale } from './hooks/useDefaultFont';
|
|
49
51
|
export { LAYERS, type LayerName, type LayerNumber } from './constants/layers';
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EACL,YAAY,EACZ,aAAa,EACb,QAAQ,EACR,KAAK,iBAAiB,GACvB,MAAM,yBAAyB,CAAA;AAEhC,OAAO,EACL,oBAAoB,EACpB,uBAAuB,EACvB,KAAK,yBAAyB,GAC/B,MAAM,iCAAiC,CAAA;AAExC,OAAO,EACL,kBAAkB,EAClB,mBAAmB,EACnB,qBAAqB,EACrB,KAAK,uBAAuB,GAC7B,MAAM,+BAA+B,CAAA;AAEtC,OAAO,EACL,iBAAiB,EACjB,kBAAkB,EAClB,oBAAoB,EACpB,KAAK,UAAU,IAAI,cAAc,EACjC,KAAK,sBAAsB,GAC5B,MAAM,8BAA8B,CAAA;AAErC,OAAO,EACL,YAAY,EACZ,aAAa,EACb,QAAQ,EACR,KAAK,IAAI,EACT,KAAK,iBAAiB,GACvB,MAAM,yBAAyB,CAAA;AAEhC,OAAO,EACL,gBAAgB,EAChB,iBAAiB,EACjB,mBAAmB,EACnB,oCAAoC,EACpC,KAAK,qBAAqB,EAC1B,KAAK,gBAAgB,GACtB,MAAM,6BAA6B,CAAA;AAEpC,OAAO,EACL,gBAAgB,EAChB,iBAAiB,EACjB,mBAAmB,EACnB,oCAAoC,EACpC,KAAK,qBAAqB,EAC1B,KAAK,gBAAgB,EACrB,KAAK,cAAc,EACnB,KAAK,kBAAkB,GACxB,MAAM,6BAA6B,CAAA;AAEpC,OAAO,EACL,cAAc,EACd,eAAe,EACf,iBAAiB,EACjB,kCAAkC,EAClC,KAAK,mBAAmB,EACxB,KAAK,cAAc,GACpB,MAAM,2BAA2B,CAAA;AAElC,OAAO,EACL,eAAe,EACf,gBAAgB,EAChB,kBAAkB,EAClB,mCAAmC,EACnC,KAAK,oBAAoB,EACzB,KAAK,YAAY,GAClB,MAAM,4BAA4B,CAAA;AAEnC,OAAO,EACL,YAAY,EACZ,aAAa,EACb,eAAe,EACf,gCAAgC,EAChC,KAAK,iBAAiB,EACtB,KAAK,SAAS,GACf,MAAM,yBAAyB,CAAA;AAEhC,OAAO,EACL,eAAe,EACf,gBAAgB,EAChB,kBAAkB,EAClB,mCAAmC,EACnC,KAAK,oBAAoB,EACzB,KAAK,mBAAmB,GACzB,MAAM,4BAA4B,CAAA;AAEnC,OAAO,EACL,oBAAoB,EACpB,qBAAqB,EACrB,uBAAuB,EACvB,wCAAwC,EACxC,KAAK,yBAAyB,GAC/B,MAAM,iCAAiC,CAAA;AAExC,OAAO,EACL,sBAAsB,EACtB,iBAAiB,EACjB,KAAK,aAAa,EAClB,KAAK,0BAA0B,GAChC,MAAM,kCAAkC,CAAA;AAEzC,OAAO,EACL,YAAY,EACZ,OAAO,EACP,KAAK,gBAAgB,GACtB,MAAM,wBAAwB,CAAA;AAE/B,OAAO,EACL,iBAAiB,EACjB,kBAAkB,EAClB,oBAAoB,EACpB,qCAAqC,EACrC,KAAK,sBAAsB,EAC3B,KAAK,cAAc,EACnB,KAAK,uBAAuB,EAC5B,KAAK,sBAAsB,GAC5B,MAAM,8BAA8B,CAAA;AAErC,OAAO,EACL,mBAAmB,EACnB,oBAAoB,EACpB,sBAAsB,EACtB,uCAAuC,EACvC,iBAAiB,EACjB,yBAAyB,EACzB,oBAAoB,EACpB,sBAAsB,EACtB,wBAAwB,EACxB,0BAA0B,EAC1B,KAAK,wBAAwB,EAC7B,KAAK,qBAAqB,EAC1B,KAAK,iBAAiB,EACtB,KAAK,kBAAkB,EACvB,KAAK,kBAAkB,GACxB,MAAM,gCAAgC,CAAA;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -15,6 +15,7 @@ export { PlacementStateProvider, usePlacementState, } from './contexts/Placement
|
|
|
15
15
|
export { ItemProvider, useItem, } from './contexts/ItemContext';
|
|
16
16
|
export { SharedFileContext, SharedFileProvider, useSharedFileContext, createDefaultSharedFileImplementation, } from './contexts/SharedFileContext';
|
|
17
17
|
export { WorldStorageContext, WorldStorageProvider, useWorldStorageContext, createDefaultWorldStorageImplementation, WorldStorageError, WORLD_STORAGE_KEY_PATTERN, WORLD_STORAGE_LIMITS, isValidWorldStorageKey, getWorldStorageEntrySize, incrementWorldStorageValue, } from './contexts/WorldStorageContext';
|
|
18
|
+
export { ServerClockContext, ServerClockProvider, useServerClockContext, createDefaultServerClockImplementation, isServerClockAccurateEnough, SERVER_CLOCK_ACCURACY_THRESHOLD, } from './contexts/ServerClockContext';
|
|
18
19
|
export { GrabbableContext, GrabbableProvider, useGrabbableContext, createDefaultGrabbableImplementation, } from './contexts/GrabbableContext';
|
|
19
20
|
export { VoiceVolumeOverrideContext, VoiceVolumeOverrideProvider, useVoiceVolumeOverrideContext, createDefaultVoiceVolumeOverrideImplementation,
|
|
20
21
|
// Deprecated aliases
|
|
@@ -48,6 +49,7 @@ export { useWorld } from './hooks/useWorld';
|
|
|
48
49
|
export { useInstanceEvent } from './hooks/useInstanceEvent';
|
|
49
50
|
export { useSharedFile } from './hooks/useSharedFile';
|
|
50
51
|
export { useWorldStorage } from './hooks/useWorldStorage';
|
|
52
|
+
export { useServerClock } from './hooks/useServerClock';
|
|
51
53
|
export { useVoiceVolumeOverride, useAudioVolume } from './hooks/useAudioVolume';
|
|
52
54
|
export { useDefaultFont } from './hooks/useDefaultFont';
|
|
53
55
|
// Constants
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,WAAW;AACX,OAAO,EACL,YAAY,EACZ,aAAa,EACb,QAAQ,GAET,MAAM,yBAAyB,CAAA;AAEhC,OAAO,EACL,oBAAoB,EACpB,uBAAuB,GAExB,MAAM,iCAAiC,CAAA;AAExC,OAAO,EACL,kBAAkB,EAClB,mBAAmB,EACnB,qBAAqB,GAEtB,MAAM,+BAA+B,CAAA;AAEtC,OAAO,EACL,iBAAiB,EACjB,kBAAkB,EAClB,oBAAoB,GAGrB,MAAM,8BAA8B,CAAA;AAErC,OAAO,EACL,YAAY,EACZ,aAAa,EACb,QAAQ,GAGT,MAAM,yBAAyB,CAAA;AAEhC,OAAO,EACL,gBAAgB,EAChB,iBAAiB,EACjB,mBAAmB,EACnB,oCAAoC,GAGrC,MAAM,6BAA6B,CAAA;AAEpC,OAAO,EACL,gBAAgB,EAChB,iBAAiB,EACjB,mBAAmB,EACnB,oCAAoC,GAKrC,MAAM,6BAA6B,CAAA;AAEpC,OAAO,EACL,cAAc,EACd,eAAe,EACf,iBAAiB,EACjB,kCAAkC,GAGnC,MAAM,2BAA2B,CAAA;AAElC,OAAO,EACL,eAAe,EACf,gBAAgB,EAChB,kBAAkB,EAClB,mCAAmC,GAGpC,MAAM,4BAA4B,CAAA;AAEnC,OAAO,EACL,YAAY,EACZ,aAAa,EACb,eAAe,EACf,gCAAgC,GAGjC,MAAM,yBAAyB,CAAA;AAEhC,OAAO,EACL,eAAe,EACf,gBAAgB,EAChB,kBAAkB,EAClB,mCAAmC,GAGpC,MAAM,4BAA4B,CAAA;AAEnC,OAAO,EACL,oBAAoB,EACpB,qBAAqB,EACrB,uBAAuB,EACvB,wCAAwC,GAEzC,MAAM,iCAAiC,CAAA;AAExC,OAAO,EACL,sBAAsB,EACtB,iBAAiB,GAGlB,MAAM,kCAAkC,CAAA;AAEzC,OAAO,EACL,YAAY,EACZ,OAAO,GAER,MAAM,wBAAwB,CAAA;AAE/B,OAAO,EACL,iBAAiB,EACjB,kBAAkB,EAClB,oBAAoB,EACpB,qCAAqC,GAKtC,MAAM,8BAA8B,CAAA;AAErC,OAAO,EACL,mBAAmB,EACnB,oBAAoB,EACpB,sBAAsB,EACtB,uCAAuC,EACvC,iBAAiB,EACjB,yBAAyB,EACzB,oBAAoB,EACpB,sBAAsB,EACtB,wBAAwB,EACxB,0BAA0B,GAM3B,MAAM,gCAAgC,CAAA;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|