@xrift/world-components 0.41.2 → 0.42.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.
Files changed (63) hide show
  1. package/dist/components/DevEnvironment/components/ControlsHelp.d.ts.map +1 -1
  2. package/dist/components/DevEnvironment/components/ControlsHelp.js +1 -1
  3. package/dist/components/DevEnvironment/components/ControlsHelp.js.map +1 -1
  4. package/dist/components/DevEnvironment/components/GrabSystem/__tests__/store.test.d.ts +2 -0
  5. package/dist/components/DevEnvironment/components/GrabSystem/__tests__/store.test.d.ts.map +1 -0
  6. package/dist/components/DevEnvironment/components/GrabSystem/__tests__/store.test.js +114 -0
  7. package/dist/components/DevEnvironment/components/GrabSystem/__tests__/store.test.js.map +1 -0
  8. package/dist/components/DevEnvironment/components/GrabSystem/__tests__/utils.test.d.ts +2 -0
  9. package/dist/components/DevEnvironment/components/GrabSystem/__tests__/utils.test.d.ts.map +1 -0
  10. package/dist/components/DevEnvironment/components/GrabSystem/__tests__/utils.test.js +103 -0
  11. package/dist/components/DevEnvironment/components/GrabSystem/__tests__/utils.test.js.map +1 -0
  12. package/dist/components/DevEnvironment/components/GrabSystem/constants.d.ts +15 -0
  13. package/dist/components/DevEnvironment/components/GrabSystem/constants.d.ts.map +1 -0
  14. package/dist/components/DevEnvironment/components/GrabSystem/constants.js +15 -0
  15. package/dist/components/DevEnvironment/components/GrabSystem/constants.js.map +1 -0
  16. package/dist/components/DevEnvironment/components/GrabSystem/ghostAppearance.d.ts +9 -0
  17. package/dist/components/DevEnvironment/components/GrabSystem/ghostAppearance.d.ts.map +1 -0
  18. package/dist/components/DevEnvironment/components/GrabSystem/ghostAppearance.js +45 -0
  19. package/dist/components/DevEnvironment/components/GrabSystem/ghostAppearance.js.map +1 -0
  20. package/dist/components/DevEnvironment/components/GrabSystem/index.d.ts +12 -0
  21. package/dist/components/DevEnvironment/components/GrabSystem/index.d.ts.map +1 -0
  22. package/dist/components/DevEnvironment/components/GrabSystem/index.js +147 -0
  23. package/dist/components/DevEnvironment/components/GrabSystem/index.js.map +1 -0
  24. package/dist/components/DevEnvironment/components/GrabSystem/store.d.ts +43 -0
  25. package/dist/components/DevEnvironment/components/GrabSystem/store.d.ts.map +1 -0
  26. package/dist/components/DevEnvironment/components/GrabSystem/store.js +89 -0
  27. package/dist/components/DevEnvironment/components/GrabSystem/store.js.map +1 -0
  28. package/dist/components/DevEnvironment/components/GrabSystem/utils.d.ts +29 -0
  29. package/dist/components/DevEnvironment/components/GrabSystem/utils.d.ts.map +1 -0
  30. package/dist/components/DevEnvironment/components/GrabSystem/utils.js +54 -0
  31. package/dist/components/DevEnvironment/components/GrabSystem/utils.js.map +1 -0
  32. package/dist/components/DevEnvironment/index.d.ts.map +1 -1
  33. package/dist/components/DevEnvironment/index.js +6 -1
  34. package/dist/components/DevEnvironment/index.js.map +1 -1
  35. package/dist/components/Grabbable/constants.d.ts +7 -0
  36. package/dist/components/Grabbable/constants.d.ts.map +1 -0
  37. package/dist/components/Grabbable/constants.js +7 -0
  38. package/dist/components/Grabbable/constants.js.map +1 -0
  39. package/dist/components/Grabbable/index.d.ts +17 -0
  40. package/dist/components/Grabbable/index.d.ts.map +1 -0
  41. package/dist/components/Grabbable/index.js +58 -0
  42. package/dist/components/Grabbable/index.js.map +1 -0
  43. package/dist/components/Grabbable/types.d.ts +27 -0
  44. package/dist/components/Grabbable/types.d.ts.map +1 -0
  45. package/dist/components/Grabbable/types.js +2 -0
  46. package/dist/components/Grabbable/types.js.map +1 -0
  47. package/dist/constants/layers.d.ts +6 -0
  48. package/dist/constants/layers.d.ts.map +1 -1
  49. package/dist/constants/layers.js +7 -0
  50. package/dist/constants/layers.js.map +1 -1
  51. package/dist/contexts/GrabbableContext.d.ts +78 -0
  52. package/dist/contexts/GrabbableContext.d.ts.map +1 -0
  53. package/dist/contexts/GrabbableContext.js +38 -0
  54. package/dist/contexts/GrabbableContext.js.map +1 -0
  55. package/dist/contexts/XRiftContext.d.ts +7 -1
  56. package/dist/contexts/XRiftContext.d.ts.map +1 -1
  57. package/dist/contexts/XRiftContext.js +3 -1
  58. package/dist/contexts/XRiftContext.js.map +1 -1
  59. package/dist/index.d.ts +3 -0
  60. package/dist/index.d.ts.map +1 -1
  61. package/dist/index.js +3 -0
  62. package/dist/index.js.map +1 -1
  63. package/package.json +1 -1
@@ -0,0 +1,89 @@
1
+ import { clampHoldDistance, distanceBetween } from './utils';
2
+ const IDLE_PARTIAL = { phase: 'idle', grabbedId: null, hoveredId: null };
3
+ export function createDevGrabStore() {
4
+ const registry = new Map();
5
+ const listeners = new Set();
6
+ let state = {
7
+ phase: 'idle',
8
+ hoveredId: null,
9
+ grabbedId: null,
10
+ holdDistance: 0,
11
+ heldPosition: { x: 0, y: 0, z: 0 },
12
+ heldRotation: { x: 0, y: 0, z: 0 },
13
+ heldScale: 1,
14
+ };
15
+ const setState = (partial) => {
16
+ state = { ...state, ...partial };
17
+ for (const listener of listeners)
18
+ listener();
19
+ };
20
+ return {
21
+ getState: () => state,
22
+ subscribe: (listener) => {
23
+ listeners.add(listener);
24
+ return () => listeners.delete(listener);
25
+ },
26
+ getEntry: (id) => registry.get(id),
27
+ setHovered: (id) => {
28
+ if (state.hoveredId === id)
29
+ return;
30
+ setState({ hoveredId: id });
31
+ },
32
+ grab: (id, cameraPosition) => {
33
+ if (state.phase !== 'idle')
34
+ return;
35
+ const entry = registry.get(id);
36
+ if (!entry)
37
+ return;
38
+ const transform = entry.getTransform();
39
+ setState({
40
+ phase: 'holding',
41
+ grabbedId: id,
42
+ hoveredId: null,
43
+ holdDistance: clampHoldDistance(distanceBetween(cameraPosition, transform.position)),
44
+ heldPosition: transform.position,
45
+ heldRotation: transform.rotation,
46
+ heldScale: transform.scale,
47
+ });
48
+ },
49
+ adjustHoldDistance: (delta) => {
50
+ if (state.phase !== 'holding')
51
+ return;
52
+ setState({ holdDistance: clampHoldDistance(state.holdDistance + delta) });
53
+ },
54
+ updateHeldPosition: (position) => {
55
+ state = { ...state, heldPosition: position };
56
+ },
57
+ release: () => {
58
+ if (state.phase !== 'holding' || !state.grabbedId)
59
+ return;
60
+ const entry = registry.get(state.grabbedId);
61
+ entry?.onMove({ position: state.heldPosition, rotation: state.heldRotation });
62
+ setState(IDLE_PARTIAL);
63
+ },
64
+ cancel: () => {
65
+ if (state.phase !== 'holding')
66
+ return;
67
+ setState(IDLE_PARTIAL);
68
+ },
69
+ contextValue: {
70
+ registerGrabbable: (id, entry) => {
71
+ registry.set(id, entry);
72
+ },
73
+ unregisterGrabbable: (id) => {
74
+ registry.delete(id);
75
+ // 掴み中・ホバー中の対象がアンマウントされたら状態を戻す
76
+ if (state.grabbedId === id)
77
+ setState(IDLE_PARTIAL);
78
+ else if (state.hoveredId === id)
79
+ setState({ hoveredId: null });
80
+ },
81
+ getGrabbedId: () => state.grabbedId,
82
+ subscribeGrabbedId: (listener) => {
83
+ listeners.add(listener);
84
+ return () => listeners.delete(listener);
85
+ },
86
+ },
87
+ };
88
+ }
89
+ //# sourceMappingURL=store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"store.js","sourceRoot":"","sources":["../../../../../src/components/DevEnvironment/components/GrabSystem/store.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,29 @@
1
+ import type { Object3D } from 'three';
2
+ import type { Position3D } from '../../../../types/movement';
3
+ /** クォータニオン(three に依存しない形) */
4
+ export interface QuaternionLike {
5
+ x: number;
6
+ y: number;
7
+ z: number;
8
+ w: number;
9
+ }
10
+ /** 掴み距離を [MIN, MAX] に収める */
11
+ export declare function clampHoldDistance(distance: number): number;
12
+ /** 2点間の距離 */
13
+ export declare function distanceBetween(a: Position3D, b: Position3D): number;
14
+ /**
15
+ * 視点(カメラ姿勢)から前方 distance[m] の位置を求める。
16
+ * cameraQuaternion を差し替えるだけで VR コントローラーの pose にも流用できる純粋関数。
17
+ * 前方ベクトル (0, 0, -1) をクォータニオンで回転して distance 倍する。
18
+ */
19
+ export declare function computeHeldPosition(cameraPosition: Position3D, cameraQuaternion: QuaternionLike, distance: number): Position3D;
20
+ /** ヒットした Object3D から親を辿り、grabbable ID を見つける。無ければ null */
21
+ export declare function findGrabbableId(object: Object3D | null): string | null;
22
+ /**
23
+ * レイキャスト結果(手前から順)を走査し、最初に見つかった grabbable ID を返す。
24
+ * どれも掴める対象でなければ null。
25
+ */
26
+ export declare function findFirstGrabbableId(intersects: readonly {
27
+ object: Object3D;
28
+ }[]): string | null;
29
+ //# sourceMappingURL=utils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../../../../src/components/DevEnvironment/components/GrabSystem/utils.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAA;AACrC,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,4BAA4B,CAAA;AAI5D,6BAA6B;AAC7B,MAAM,WAAW,cAAc;IAC7B,CAAC,EAAE,MAAM,CAAA;IACT,CAAC,EAAE,MAAM,CAAA;IACT,CAAC,EAAE,MAAM,CAAA;IACT,CAAC,EAAE,MAAM,CAAA;CACV;AAED,4BAA4B;AAC5B,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAE1D;AAED,aAAa;AACb,wBAAgB,eAAe,CAAC,CAAC,EAAE,UAAU,EAAE,CAAC,EAAE,UAAU,GAAG,MAAM,CAEpE;AAED;;;;GAIG;AACH,wBAAgB,mBAAmB,CACjC,cAAc,EAAE,UAAU,EAC1B,gBAAgB,EAAE,cAAc,EAChC,QAAQ,EAAE,MAAM,GACf,UAAU,CAeZ;AAED,yDAAyD;AACzD,wBAAgB,eAAe,CAAC,MAAM,EAAE,QAAQ,GAAG,IAAI,GAAG,MAAM,GAAG,IAAI,CAQtE;AAED;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,UAAU,EAAE,SAAS;IAAE,MAAM,EAAE,QAAQ,CAAA;CAAE,EAAE,GAAG,MAAM,GAAG,IAAI,CAM/F"}
@@ -0,0 +1,54 @@
1
+ import { GRABBABLE_USER_DATA_KEY } from '../../../Grabbable/constants';
2
+ import { MAX_ANCESTOR_DEPTH, MAX_HOLD_DISTANCE, MIN_HOLD_DISTANCE } from './constants';
3
+ /** 掴み距離を [MIN, MAX] に収める */
4
+ export function clampHoldDistance(distance) {
5
+ return Math.min(MAX_HOLD_DISTANCE, Math.max(MIN_HOLD_DISTANCE, distance));
6
+ }
7
+ /** 2点間の距離 */
8
+ export function distanceBetween(a, b) {
9
+ return Math.hypot(a.x - b.x, a.y - b.y, a.z - b.z);
10
+ }
11
+ /**
12
+ * 視点(カメラ姿勢)から前方 distance[m] の位置を求める。
13
+ * cameraQuaternion を差し替えるだけで VR コントローラーの pose にも流用できる純粋関数。
14
+ * 前方ベクトル (0, 0, -1) をクォータニオンで回転して distance 倍する。
15
+ */
16
+ export function computeHeldPosition(cameraPosition, cameraQuaternion, distance) {
17
+ const q = cameraQuaternion;
18
+ // v = (0, 0, -1) を q で回転: v' = v + w*t + q×t, t = 2*(q×v)
19
+ const tx = 2 * -q.y;
20
+ const ty = 2 * q.x;
21
+ const tz = 0;
22
+ const dx = q.w * tx + (q.y * tz - q.z * ty);
23
+ const dy = q.w * ty + (q.z * tx - q.x * tz);
24
+ const dz = -1 + q.w * tz + (q.x * ty - q.y * tx);
25
+ return {
26
+ x: cameraPosition.x + dx * distance,
27
+ y: cameraPosition.y + dy * distance,
28
+ z: cameraPosition.z + dz * distance,
29
+ };
30
+ }
31
+ /** ヒットした Object3D から親を辿り、grabbable ID を見つける。無ければ null */
32
+ export function findGrabbableId(object) {
33
+ let current = object;
34
+ for (let i = 0; i < MAX_ANCESTOR_DEPTH && current; i++) {
35
+ const id = current.userData[GRABBABLE_USER_DATA_KEY];
36
+ if (typeof id === 'string')
37
+ return id;
38
+ current = current.parent;
39
+ }
40
+ return null;
41
+ }
42
+ /**
43
+ * レイキャスト結果(手前から順)を走査し、最初に見つかった grabbable ID を返す。
44
+ * どれも掴める対象でなければ null。
45
+ */
46
+ export function findFirstGrabbableId(intersects) {
47
+ for (const intersect of intersects) {
48
+ const id = findGrabbableId(intersect.object);
49
+ if (id)
50
+ return id;
51
+ }
52
+ return null;
53
+ }
54
+ //# sourceMappingURL=utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.js","sourceRoot":"","sources":["../../../../../src/components/DevEnvironment/components/GrabSystem/utils.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,uBAAuB,EAAE,MAAM,8BAA8B,CAAA;AACtE,OAAO,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAA;AAUtF,4BAA4B;AAC5B,MAAM,UAAU,iBAAiB,CAAC,QAAgB;IAChD,OAAO,IAAI,CAAC,GAAG,CAAC,iBAAiB,EAAE,IAAI,CAAC,GAAG,CAAC,iBAAiB,EAAE,QAAQ,CAAC,CAAC,CAAA;AAC3E,CAAC;AAED,aAAa;AACb,MAAM,UAAU,eAAe,CAAC,CAAa,EAAE,CAAa;IAC1D,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAA;AACpD,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,mBAAmB,CACjC,cAA0B,EAC1B,gBAAgC,EAChC,QAAgB;IAEhB,MAAM,CAAC,GAAG,gBAAgB,CAAA;IAC1B,0DAA0D;IAC1D,MAAM,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAA;IACnB,MAAM,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAA;IAClB,MAAM,EAAE,GAAG,CAAC,CAAA;IACZ,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,CAAA;IAC3C,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,CAAA;IAC3C,MAAM,EAAE,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,CAAA;IAEhD,OAAO;QACL,CAAC,EAAE,cAAc,CAAC,CAAC,GAAG,EAAE,GAAG,QAAQ;QACnC,CAAC,EAAE,cAAc,CAAC,CAAC,GAAG,EAAE,GAAG,QAAQ;QACnC,CAAC,EAAE,cAAc,CAAC,CAAC,GAAG,EAAE,GAAG,QAAQ;KACpC,CAAA;AACH,CAAC;AAED,yDAAyD;AACzD,MAAM,UAAU,eAAe,CAAC,MAAuB;IACrD,IAAI,OAAO,GAAoB,MAAM,CAAA;IACrC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,kBAAkB,IAAI,OAAO,EAAE,CAAC,EAAE,EAAE,CAAC;QACvD,MAAM,EAAE,GAAI,OAAO,CAAC,QAAoC,CAAC,uBAAuB,CAAC,CAAA;QACjF,IAAI,OAAO,EAAE,KAAK,QAAQ;YAAE,OAAO,EAAE,CAAA;QACrC,OAAO,GAAG,OAAO,CAAC,MAAM,CAAA;IAC1B,CAAC;IACD,OAAO,IAAI,CAAA;AACb,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,oBAAoB,CAAC,UAA2C;IAC9E,KAAK,MAAM,SAAS,IAAI,UAAU,EAAE,CAAC;QACnC,MAAM,EAAE,GAAG,eAAe,CAAC,SAAS,CAAC,MAAM,CAAC,CAAA;QAC5C,IAAI,EAAE;YAAE,OAAO,EAAE,CAAA;IACnB,CAAC;IACD,OAAO,IAAI,CAAA;AACb,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/DevEnvironment/index.tsx"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,SAAS,CAAA;AAmCpC,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,2CAqFP"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/DevEnvironment/index.tsx"],"names":[],"mappings":"AAUA,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,2CA0FP"}
@@ -3,12 +3,15 @@ import { useCallback, useMemo, useRef, useState, useSyncExternalStore } from 're
3
3
  import { Canvas } from '@react-three/fiber';
4
4
  import { PointerLockControls } from '@react-three/drei';
5
5
  import { Physics } from '@react-three/rapier';
6
+ import { GrabbableProvider } from '../../contexts/GrabbableContext';
6
7
  import { SpawnPointProvider } from '../../contexts/SpawnPointContext';
7
8
  import { UsersProvider } from '../../contexts/UsersContext';
8
9
  import { PCFShadowMap } from 'three';
9
10
  import { toThreeOutputBufferType } from './utils';
10
11
  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';
11
12
  import { PhysicsPlayer } from './components/PhysicsPlayer';
13
+ import { GrabSystem } from './components/GrabSystem';
14
+ import { createDevGrabStore } from './components/GrabSystem/store';
12
15
  import { CenterRaycaster } from './components/CenterRaycaster';
13
16
  import { Crosshair } from './components/Crosshair';
14
17
  import { PointerLockStatus } from './components/PointerLockStatus';
@@ -40,6 +43,8 @@ function getPointerLockSnapshot() {
40
43
  }
41
44
  export function DevEnvironment({ children, camera, moveSpeed = MOVE_SPEED, shadows = true, spawnPosition = DEFAULT_SPAWN_POSITION, respawnThreshold = RESPAWN_Y_THRESHOLD, physicsConfig, outputBufferType: outputBufferTypeStr, }) {
42
45
  const [isHit, setIsHit] = useState(false);
46
+ // ローカル掴みストア(<Grabbable> の登録先 & 開発プレビュー用 GrabSystem の状態)
47
+ const [grabStore] = useState(createDevGrabStore);
43
48
  const isPointerLocked = useSyncExternalStore(subscribePointerLock, getPointerLockSnapshot, () => false);
44
49
  const handleHitChange = useCallback((hit) => setIsHit(hit), []);
45
50
  // ローカルユーザーの位置情報を保持する ref。PhysicsPlayer が毎フレーム書き込み、
@@ -76,6 +81,6 @@ export function DevEnvironment({ children, camera, moveSpeed = MOVE_SPEED, shado
76
81
  fov: cameraFov,
77
82
  near: cameraNear,
78
83
  far: cameraFar,
79
- }, gl: glProps, children: [_jsx(PointerLockControls, {}), _jsx(CenterRaycaster, { onHitChange: handleHitChange }), _jsx(Physics, { gravity: [0, -gravity, 0], timeStep: "vary", children: _jsx(SpawnPointProvider, { children: _jsxs(UsersProvider, { implementation: usersImplementation, children: [_jsx(PhysicsPlayer, { moveSpeed: moveSpeed, spawnPosition: spawnPosition, respawnThreshold: respawnThreshold, allowInfiniteJump: allowInfiniteJump, movementRef: localMovementRef }), children] }) }) })] }), _jsx(Crosshair, { active: isHit }), _jsx(PointerLockStatus, { isLocked: isPointerLocked }), _jsx(ControlsHelp, {})] }));
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, {})] }));
80
85
  }
81
86
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/components/DevEnvironment/index.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/components/DevEnvironment/index.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * <Grabbable> のルート group に付与する userData キー。値は grabbable ID。
3
+ * GrabSystem のレイキャストがヒットしたメッシュから親を辿って掴める対象と判別する。
4
+ * プラットフォーム側(xrift-frontend)の GrabSystem と共有する契約のため変更しないこと。
5
+ */
6
+ export declare const GRABBABLE_USER_DATA_KEY = "__xriftGrabbableId";
7
+ //# sourceMappingURL=constants.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../../../src/components/Grabbable/constants.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,eAAO,MAAM,uBAAuB,uBAAuB,CAAA"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * <Grabbable> のルート group に付与する userData キー。値は grabbable ID。
3
+ * GrabSystem のレイキャストがヒットしたメッシュから親を辿って掴める対象と判別する。
4
+ * プラットフォーム側(xrift-frontend)の GrabSystem と共有する契約のため変更しないこと。
5
+ */
6
+ export const GRABBABLE_USER_DATA_KEY = '__xriftGrabbableId';
7
+ //# sourceMappingURL=constants.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"constants.js","sourceRoot":"","sources":["../../../src/components/Grabbable/constants.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,MAAM,CAAC,MAAM,uBAAuB,GAAG,oBAAoB,CAAA"}
@@ -0,0 +1,17 @@
1
+ import { type FC } from 'react';
2
+ import type { Props } from './types';
3
+ /**
4
+ * 子オブジェクトを「掴める」と宣言するラッパー(<Interactable> と同じ明示オプトイン)
5
+ *
6
+ * - 配下メッシュを GRABBABLE レイヤーに載せ、ルート group に grabbable ID を付ける
7
+ * → GrabSystem のレイキャストが掴める対象と判別できる
8
+ * - transform をルート group に適用する(子はローカル座標で書く)
9
+ * - 掴んでいる間は実体を隠す(GrabSystem がゴーストを代わりに表示する)
10
+ * - 離した(確定)ときは onMove で新しい姿勢が返るので、ワールド側で state に反映する
11
+ *
12
+ * 掴む土台(レイキャスト・追従・確定)はプラットフォーム側の GrabSystem が担う。
13
+ * DevEnvironment 内では同梱のローカル GrabSystem で動作する。
14
+ */
15
+ export declare const Grabbable: FC<Props>;
16
+ export type { Props as GrabbableProps } from './types';
17
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/Grabbable/index.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAoD,KAAK,EAAE,EAAE,MAAM,OAAO,CAAA;AAKjF,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,SAAS,CAAA;AAEpC;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,SAAS,EAAE,EAAE,CAAC,KAAK,CAqE/B,CAAA;AAED,YAAY,EAAE,KAAK,IAAI,cAAc,EAAE,MAAM,SAAS,CAAA"}
@@ -0,0 +1,58 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { useEffect, useMemo, useRef, useSyncExternalStore } from 'react';
3
+ import { LAYERS } from '../../constants/layers';
4
+ import { useGrabbableContext } from '../../contexts/GrabbableContext';
5
+ import { GRABBABLE_USER_DATA_KEY } from './constants';
6
+ /**
7
+ * 子オブジェクトを「掴める」と宣言するラッパー(<Interactable> と同じ明示オプトイン)
8
+ *
9
+ * - 配下メッシュを GRABBABLE レイヤーに載せ、ルート group に grabbable ID を付ける
10
+ * → GrabSystem のレイキャストが掴める対象と判別できる
11
+ * - transform をルート group に適用する(子はローカル座標で書く)
12
+ * - 掴んでいる間は実体を隠す(GrabSystem がゴーストを代わりに表示する)
13
+ * - 離した(確定)ときは onMove で新しい姿勢が返るので、ワールド側で state に反映する
14
+ *
15
+ * 掴む土台(レイキャスト・追従・確定)はプラットフォーム側の GrabSystem が担う。
16
+ * DevEnvironment 内では同梱のローカル GrabSystem で動作する。
17
+ */
18
+ export const Grabbable = ({ id, transform, onMove, renderGhost, enabled = true, children, }) => {
19
+ const { registerGrabbable, unregisterGrabbable, getGrabbedId, subscribeGrabbedId } = useGrabbableContext();
20
+ // 掴み中は実体を隠す(ゴーストが代わりに表示される)
21
+ const isGrabbed = useSyncExternalStore(subscribeGrabbedId, () => getGrabbedId() === id, () => false);
22
+ // 毎レンダーで参照が変わっても登録し直さないよう、最新値は ref で保持
23
+ const transformRef = useRef(transform);
24
+ const onMoveRef = useRef(onMove);
25
+ const renderGhostRef = useRef(renderGhost);
26
+ const childrenRef = useRef(children);
27
+ transformRef.current = transform;
28
+ onMoveRef.current = onMove;
29
+ renderGhostRef.current = renderGhost;
30
+ childrenRef.current = children;
31
+ const groupRef = useRef(null);
32
+ const userData = useMemo(() => ({ [GRABBABLE_USER_DATA_KEY]: id }), [id]);
33
+ useEffect(() => {
34
+ if (!enabled)
35
+ return;
36
+ const group = groupRef.current;
37
+ if (!group)
38
+ return;
39
+ // 配下メッシュを GRABBABLE レイヤーに載せてレイキャスト対象にする
40
+ group.traverse((obj) => obj.layers.enable(LAYERS.GRABBABLE));
41
+ registerGrabbable(id, {
42
+ // ゴースト未指定時は children をそのまま流用する
43
+ renderGhost: () => renderGhostRef.current?.() ?? childrenRef.current,
44
+ onMove: (t) => onMoveRef.current(t),
45
+ getTransform: () => {
46
+ const t = transformRef.current;
47
+ return { position: t.position, rotation: t.rotation, scale: t.scale ?? 1 };
48
+ },
49
+ });
50
+ return () => {
51
+ unregisterGrabbable(id);
52
+ group.traverse((obj) => obj.layers.disable(LAYERS.GRABBABLE));
53
+ };
54
+ }, [id, enabled, registerGrabbable, unregisterGrabbable]);
55
+ const { position, rotation, scale = 1 } = transform;
56
+ return (_jsx("group", { ref: groupRef, position: [position.x, position.y, position.z], rotation: [rotation.x, rotation.y, rotation.z], scale: scale, userData: userData, visible: !isGrabbed, children: children }));
57
+ };
58
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/components/Grabbable/index.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,EAAE,oBAAoB,EAAW,MAAM,OAAO,CAAA;AAEjF,OAAO,EAAE,MAAM,EAAE,MAAM,wBAAwB,CAAA;AAC/C,OAAO,EAAE,mBAAmB,EAAE,MAAM,iCAAiC,CAAA;AACrE,OAAO,EAAE,uBAAuB,EAAE,MAAM,aAAa,CAAA;AAGrD;;;;;;;;;;;GAWG;AACH,MAAM,CAAC,MAAM,SAAS,GAAc,CAAC,EACnC,EAAE,EACF,SAAS,EACT,MAAM,EACN,WAAW,EACX,OAAO,GAAG,IAAI,EACd,QAAQ,GACT,EAAE,EAAE;IACH,MAAM,EAAE,iBAAiB,EAAE,mBAAmB,EAAE,YAAY,EAAE,kBAAkB,EAAE,GAChF,mBAAmB,EAAE,CAAA;IAEvB,4BAA4B;IAC5B,MAAM,SAAS,GAAG,oBAAoB,CACpC,kBAAkB,EAClB,GAAG,EAAE,CAAC,YAAY,EAAE,KAAK,EAAE,EAC3B,GAAG,EAAE,CAAC,KAAK,CACZ,CAAA;IAED,uCAAuC;IACvC,MAAM,YAAY,GAAG,MAAM,CAAC,SAAS,CAAC,CAAA;IACtC,MAAM,SAAS,GAAG,MAAM,CAAC,MAAM,CAAC,CAAA;IAChC,MAAM,cAAc,GAAG,MAAM,CAAC,WAAW,CAAC,CAAA;IAC1C,MAAM,WAAW,GAAG,MAAM,CAAC,QAAQ,CAAC,CAAA;IACpC,YAAY,CAAC,OAAO,GAAG,SAAS,CAAA;IAChC,SAAS,CAAC,OAAO,GAAG,MAAM,CAAA;IAC1B,cAAc,CAAC,OAAO,GAAG,WAAW,CAAA;IACpC,WAAW,CAAC,OAAO,GAAG,QAAQ,CAAA;IAE9B,MAAM,QAAQ,GAAG,MAAM,CAAQ,IAAI,CAAC,CAAA;IACpC,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,CAAC,uBAAuB,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAA;IAEzE,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,CAAC,OAAO;YAAE,OAAM;QACpB,MAAM,KAAK,GAAG,QAAQ,CAAC,OAAO,CAAA;QAC9B,IAAI,CAAC,KAAK;YAAE,OAAM;QAElB,wCAAwC;QACxC,KAAK,CAAC,QAAQ,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAA;QAE5D,iBAAiB,CAAC,EAAE,EAAE;YACpB,+BAA+B;YAC/B,WAAW,EAAE,GAAG,EAAE,CAAC,cAAc,CAAC,OAAO,EAAE,EAAE,IAAI,WAAW,CAAC,OAAO;YACpE,MAAM,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC;YACnC,YAAY,EAAE,GAAG,EAAE;gBACjB,MAAM,CAAC,GAAG,YAAY,CAAC,OAAO,CAAA;gBAC9B,OAAO,EAAE,QAAQ,EAAE,CAAC,CAAC,QAAQ,EAAE,QAAQ,EAAE,CAAC,CAAC,QAAQ,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,IAAI,CAAC,EAAE,CAAA;YAC5E,CAAC;SACF,CAAC,CAAA;QAEF,OAAO,GAAG,EAAE;YACV,mBAAmB,CAAC,EAAE,CAAC,CAAA;YACvB,KAAK,CAAC,QAAQ,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAA;QAC/D,CAAC,CAAA;IACH,CAAC,EAAE,CAAC,EAAE,EAAE,OAAO,EAAE,iBAAiB,EAAE,mBAAmB,CAAC,CAAC,CAAA;IAEzD,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,KAAK,GAAG,CAAC,EAAE,GAAG,SAAS,CAAA;IAEnD,OAAO,CACL,gBACE,GAAG,EAAE,QAAQ,EACb,QAAQ,EAAE,CAAC,QAAQ,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC,CAAC,EAC9C,QAAQ,EAAE,CAAC,QAAQ,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC,CAAC,EAC9C,KAAK,EAAE,KAAK,EACZ,QAAQ,EAAE,QAAQ,EAClB,OAAO,EAAE,CAAC,SAAS,YAElB,QAAQ,GACH,CACT,CAAA;AACH,CAAC,CAAA"}
@@ -0,0 +1,27 @@
1
+ import type { ReactNode } from 'react';
2
+ import type { GrabbableTransform, GrabResultTransform } from '../../contexts/GrabbableContext';
3
+ export interface Props {
4
+ /** 掴める対象の一意なID */
5
+ id: string;
6
+ /**
7
+ * 対象の現在姿勢。Grabbable がルート group に適用するため、
8
+ * 子はローカル座標(原点基準)で書く
9
+ */
10
+ transform: GrabbableTransform;
11
+ /**
12
+ * 離した(確定)ときに新しい姿勢を受け取る
13
+ * ワールド側で state に反映して transform prop を更新する
14
+ */
15
+ onMove: (transform: GrabResultTransform) => void;
16
+ /**
17
+ * 掴んでいる間に表示するゴースト(半透明・物理なし)をローカル座標で返す
18
+ * 省略時は children をそのまま流用する
19
+ * 子に物理(RigidBody 等)を含む場合は物理なし版を必ず指定すること
20
+ */
21
+ renderGhost?: () => ReactNode;
22
+ /** 掴めるかどうか(false で一時的に掴めなくする) */
23
+ enabled?: boolean;
24
+ /** 子要素(3Dオブジェクト・ローカル座標で書く) */
25
+ children: ReactNode;
26
+ }
27
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/components/Grabbable/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAA;AACtC,OAAO,KAAK,EAAE,kBAAkB,EAAE,mBAAmB,EAAE,MAAM,iCAAiC,CAAA;AAE9F,MAAM,WAAW,KAAK;IACpB,kBAAkB;IAClB,EAAE,EAAE,MAAM,CAAA;IACV;;;OAGG;IACH,SAAS,EAAE,kBAAkB,CAAA;IAC7B;;;OAGG;IACH,MAAM,EAAE,CAAC,SAAS,EAAE,mBAAmB,KAAK,IAAI,CAAA;IAChD;;;;OAIG;IACH,WAAW,CAAC,EAAE,MAAM,SAAS,CAAA;IAC7B,iCAAiC;IACjC,OAAO,CAAC,EAAE,OAAO,CAAA;IACjB,8BAA8B;IAC9B,QAAQ,EAAE,SAAS,CAAA;CACpB"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/components/Grabbable/types.ts"],"names":[],"mappings":""}
@@ -30,6 +30,12 @@ export declare const LAYERS: {
30
30
  * - ボタン、ドア、アイテムなどのインタラクト可能な要素に設定
31
31
  */
32
32
  readonly INTERACTABLE: 11;
33
+ /**
34
+ * 掴める(Grabbable)オブジェクト
35
+ * - GrabSystem のレイキャスト対象
36
+ * - <Grabbable> で囲まれた対象のメッシュに付与し、掴める対象を明示する
37
+ */
38
+ readonly GRABBABLE: 14;
33
39
  };
34
40
  export type LayerName = keyof typeof LAYERS;
35
41
  export type LayerNumber = (typeof LAYERS)[LayerName];
@@ -1 +1 @@
1
- {"version":3,"file":"layers.d.ts","sourceRoot":"","sources":["../../src/constants/layers.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,eAAO,MAAM,MAAM;IACjB,qCAAqC;;IAGrC;;;;OAIG;;IAGH;;;;OAIG;;IAGH;;;;OAIG;;CAEK,CAAA;AAEV,MAAM,MAAM,SAAS,GAAG,MAAM,OAAO,MAAM,CAAA;AAC3C,MAAM,MAAM,WAAW,GAAG,CAAC,OAAO,MAAM,CAAC,CAAC,SAAS,CAAC,CAAA"}
1
+ {"version":3,"file":"layers.d.ts","sourceRoot":"","sources":["../../src/constants/layers.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,eAAO,MAAM,MAAM;IACjB,qCAAqC;;IAGrC;;;;OAIG;;IAGH;;;;OAIG;;IAGH;;;;OAIG;;IAKH;;;;OAIG;;CAEK,CAAA;AAEV,MAAM,MAAM,SAAS,GAAG,MAAM,OAAO,MAAM,CAAA;AAC3C,MAAM,MAAM,WAAW,GAAG,CAAC,OAAO,MAAM,CAAC,CAAC,SAAS,CAAC,CAAA"}
@@ -30,5 +30,12 @@ export const LAYERS = {
30
30
  * - ボタン、ドア、アイテムなどのインタラクト可能な要素に設定
31
31
  */
32
32
  INTERACTABLE: 11,
33
+ // 12(WORLD_SURFACE)・13(UI_OVERLAY)はプラットフォーム側(xrift-frontend)で予約済み
34
+ /**
35
+ * 掴める(Grabbable)オブジェクト
36
+ * - GrabSystem のレイキャスト対象
37
+ * - <Grabbable> で囲まれた対象のメッシュに付与し、掴める対象を明示する
38
+ */
39
+ GRABBABLE: 14,
33
40
  };
34
41
  //# sourceMappingURL=layers.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"layers.js","sourceRoot":"","sources":["../../src/constants/layers.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,MAAM,CAAC,MAAM,MAAM,GAAG;IACpB,qCAAqC;IACrC,OAAO,EAAE,CAAC;IAEV;;;;OAIG;IACH,iBAAiB,EAAE,CAAC;IAEpB;;;;OAIG;IACH,iBAAiB,EAAE,EAAE;IAErB;;;;OAIG;IACH,YAAY,EAAE,EAAE;CACR,CAAA"}
1
+ {"version":3,"file":"layers.js","sourceRoot":"","sources":["../../src/constants/layers.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,MAAM,CAAC,MAAM,MAAM,GAAG;IACpB,qCAAqC;IACrC,OAAO,EAAE,CAAC;IAEV;;;;OAIG;IACH,iBAAiB,EAAE,CAAC;IAEpB;;;;OAIG;IACH,iBAAiB,EAAE,EAAE;IAErB;;;;OAIG;IACH,YAAY,EAAE,EAAE;IAEhB,kEAAkE;IAElE;;;;OAIG;IACH,SAAS,EAAE,EAAE;CACL,CAAA"}
@@ -0,0 +1,78 @@
1
+ import { type ReactNode } from 'react';
2
+ import type { Position3D, Rotation3D } from '../types/movement';
3
+ /**
4
+ * 掴む対象の姿勢
5
+ * <Grabbable> の transform prop として渡す
6
+ */
7
+ export interface GrabbableTransform {
8
+ /** 位置(ワールド座標) */
9
+ position: Position3D;
10
+ /** 回転(オイラー角・ラジアン) */
11
+ rotation: Rotation3D;
12
+ /** 均一スケール(省略時は 1) */
13
+ scale?: number;
14
+ }
15
+ /**
16
+ * 離した(確定)ときに onMove へ返される姿勢
17
+ */
18
+ export interface GrabResultTransform {
19
+ position: Position3D;
20
+ rotation: Rotation3D;
21
+ }
22
+ /**
23
+ * <Grabbable> がプラットフォームに登録する情報
24
+ * プラットフォーム側の GrabSystem はこれを使って
25
+ * 掴んでいる間のゴースト描画・初期姿勢の取得・確定を行う
26
+ */
27
+ export interface GrabbableEntry {
28
+ /** 掴んでいる間に表示するゴースト(半透明・物理なし)をローカル座標で返す */
29
+ renderGhost: () => ReactNode;
30
+ /** 離した(確定)ときに新しい姿勢を受け取る。ワールド側が適用する */
31
+ onMove: (transform: GrabResultTransform) => void;
32
+ /** 対象の現在姿勢を返す(最新値。掴み始めに参照される) */
33
+ getTransform: () => Required<GrabbableTransform>;
34
+ }
35
+ /**
36
+ * 掴める対象の登録・掴み状態を管理するためのインターフェース
37
+ * プラットフォーム側(xrift-frontend)が実装を注入する
38
+ */
39
+ export interface GrabbableContextValue {
40
+ /** 掴める対象を登録する */
41
+ registerGrabbable: (id: string, entry: GrabbableEntry) => void;
42
+ /** 掴める対象の登録を解除する */
43
+ unregisterGrabbable: (id: string) => void;
44
+ /** 現在掴まれている grabbable ID を返す(なければ null) */
45
+ getGrabbedId: () => string | null;
46
+ /** 掴まれている ID の変化を購読する(useSyncExternalStore 互換) */
47
+ subscribeGrabbedId: (listener: () => void) => () => void;
48
+ }
49
+ /**
50
+ * デフォルト実装: 登録は受け付けるが掴む機能は動作しない
51
+ * (掴む土台はプラットフォーム側 / DevEnvironment が提供する)
52
+ */
53
+ export declare const createDefaultGrabbableImplementation: () => GrabbableContextValue;
54
+ /**
55
+ * 掴める対象を管理するContext
56
+ * <Grabbable> で宣言された対象をプラットフォーム側の GrabSystem が取得できる
57
+ */
58
+ export declare const GrabbableContext: import("react").Context<GrabbableContextValue>;
59
+ interface Props {
60
+ /**
61
+ * プラットフォーム側が提供する実装
62
+ * 未指定の場合はデフォルト実装(登録のみ・掴めない)が使用される
63
+ */
64
+ implementation?: GrabbableContextValue;
65
+ children: ReactNode;
66
+ }
67
+ /**
68
+ * 掴める対象を提供するContextProvider
69
+ * プラットフォーム側(xrift-frontend)が掴める対象を取得するために使用
70
+ */
71
+ export declare const GrabbableProvider: ({ implementation, children }: Props) => import("react/jsx-runtime").JSX.Element;
72
+ /**
73
+ * 掴める対象の登録・掴み状態を取得するhook
74
+ * 主に <Grabbable> コンポーネント内部で使用する
75
+ */
76
+ export declare const useGrabbableContext: () => GrabbableContextValue;
77
+ export {};
78
+ //# sourceMappingURL=GrabbableContext.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"GrabbableContext.d.ts","sourceRoot":"","sources":["../../src/contexts/GrabbableContext.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAiB,KAAK,SAAS,EAAuB,MAAM,OAAO,CAAA;AAC1E,OAAO,KAAK,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAA;AAE/D;;;GAGG;AACH,MAAM,WAAW,kBAAkB;IACjC,iBAAiB;IACjB,QAAQ,EAAE,UAAU,CAAA;IACpB,qBAAqB;IACrB,QAAQ,EAAE,UAAU,CAAA;IACpB,qBAAqB;IACrB,KAAK,CAAC,EAAE,MAAM,CAAA;CACf;AAED;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC,QAAQ,EAAE,UAAU,CAAA;IACpB,QAAQ,EAAE,UAAU,CAAA;CACrB;AAED;;;;GAIG;AACH,MAAM,WAAW,cAAc;IAC7B,0CAA0C;IAC1C,WAAW,EAAE,MAAM,SAAS,CAAA;IAC5B,sCAAsC;IACtC,MAAM,EAAE,CAAC,SAAS,EAAE,mBAAmB,KAAK,IAAI,CAAA;IAChD,iCAAiC;IACjC,YAAY,EAAE,MAAM,QAAQ,CAAC,kBAAkB,CAAC,CAAA;CACjD;AAED;;;GAGG;AACH,MAAM,WAAW,qBAAqB;IACpC,iBAAiB;IACjB,iBAAiB,EAAE,CAAC,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,cAAc,KAAK,IAAI,CAAA;IAC9D,oBAAoB;IACpB,mBAAmB,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,CAAA;IACzC,2CAA2C;IAC3C,YAAY,EAAE,MAAM,MAAM,GAAG,IAAI,CAAA;IACjC,kDAAkD;IAClD,kBAAkB,EAAE,CAAC,QAAQ,EAAE,MAAM,IAAI,KAAK,MAAM,IAAI,CAAA;CACzD;AAED;;;GAGG;AACH,eAAO,MAAM,oCAAoC,QAAO,qBAavD,CAAA;AAED;;;GAGG;AACH,eAAO,MAAM,gBAAgB,gDAE5B,CAAA;AAED,UAAU,KAAK;IACb;;;OAGG;IACH,cAAc,CAAC,EAAE,qBAAqB,CAAA;IACtC,QAAQ,EAAE,SAAS,CAAA;CACpB;AAED;;;GAGG;AACH,eAAO,MAAM,iBAAiB,GAAI,8BAA8B,KAAK,4CAOpE,CAAA;AAED;;;GAGG;AACH,eAAO,MAAM,mBAAmB,QAAO,qBAAqD,CAAA"}
@@ -0,0 +1,38 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { createContext, useContext, useMemo } from 'react';
3
+ /**
4
+ * デフォルト実装: 登録は受け付けるが掴む機能は動作しない
5
+ * (掴む土台はプラットフォーム側 / DevEnvironment が提供する)
6
+ */
7
+ export const createDefaultGrabbableImplementation = () => {
8
+ const registry = new Map();
9
+ return {
10
+ registerGrabbable: (id, entry) => {
11
+ registry.set(id, entry);
12
+ },
13
+ unregisterGrabbable: (id) => {
14
+ registry.delete(id);
15
+ },
16
+ getGrabbedId: () => null,
17
+ subscribeGrabbedId: () => () => { },
18
+ };
19
+ };
20
+ /**
21
+ * 掴める対象を管理するContext
22
+ * <Grabbable> で宣言された対象をプラットフォーム側の GrabSystem が取得できる
23
+ */
24
+ export const GrabbableContext = createContext(createDefaultGrabbableImplementation());
25
+ /**
26
+ * 掴める対象を提供するContextProvider
27
+ * プラットフォーム側(xrift-frontend)が掴める対象を取得するために使用
28
+ */
29
+ export const GrabbableProvider = ({ implementation, children }) => {
30
+ const value = useMemo(() => implementation ?? createDefaultGrabbableImplementation(), [implementation]);
31
+ return _jsx(GrabbableContext.Provider, { value: value, children: children });
32
+ };
33
+ /**
34
+ * 掴める対象の登録・掴み状態を取得するhook
35
+ * 主に <Grabbable> コンポーネント内部で使用する
36
+ */
37
+ export const useGrabbableContext = () => useContext(GrabbableContext);
38
+ //# sourceMappingURL=GrabbableContext.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"GrabbableContext.js","sourceRoot":"","sources":["../../src/contexts/GrabbableContext.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,aAAa,EAAkB,UAAU,EAAE,OAAO,EAAE,MAAM,OAAO,CAAA;AAqD1E;;;GAGG;AACH,MAAM,CAAC,MAAM,oCAAoC,GAAG,GAA0B,EAAE;IAC9E,MAAM,QAAQ,GAAG,IAAI,GAAG,EAA0B,CAAA;IAElD,OAAO;QACL,iBAAiB,EAAE,CAAC,EAAE,EAAE,KAAK,EAAE,EAAE;YAC/B,QAAQ,CAAC,GAAG,CAAC,EAAE,EAAE,KAAK,CAAC,CAAA;QACzB,CAAC;QACD,mBAAmB,EAAE,CAAC,EAAE,EAAE,EAAE;YAC1B,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC,CAAA;QACrB,CAAC;QACD,YAAY,EAAE,GAAG,EAAE,CAAC,IAAI;QACxB,kBAAkB,EAAE,GAAG,EAAE,CAAC,GAAG,EAAE,GAAE,CAAC;KACnC,CAAA;AACH,CAAC,CAAA;AAED;;;GAGG;AACH,MAAM,CAAC,MAAM,gBAAgB,GAAG,aAAa,CAC3C,oCAAoC,EAAE,CACvC,CAAA;AAWD;;;GAGG;AACH,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,EAAE,cAAc,EAAE,QAAQ,EAAS,EAAE,EAAE;IACvE,MAAM,KAAK,GAAG,OAAO,CACnB,GAAG,EAAE,CAAC,cAAc,IAAI,oCAAoC,EAAE,EAC9D,CAAC,cAAc,CAAC,CACjB,CAAA;IAED,OAAO,KAAC,gBAAgB,CAAC,QAAQ,IAAC,KAAK,EAAE,KAAK,YAAG,QAAQ,GAA6B,CAAA;AACxF,CAAC,CAAA;AAED;;;GAGG;AACH,MAAM,CAAC,MAAM,mBAAmB,GAAG,GAA0B,EAAE,CAAC,UAAU,CAAC,gBAAgB,CAAC,CAAA"}
@@ -10,6 +10,7 @@ import { type TeleportContextValue } from './TeleportContext';
10
10
  import { type TextInputContextValue } from './TextInputContext';
11
11
  import { type FileInputContextValue } from './FileInputContext';
12
12
  import { type UsersContextValue } from './UsersContext';
13
+ import { type GrabbableContextValue } from './GrabbableContext';
13
14
  import { type InstanceEventContextValue } from './InstanceEventContext';
14
15
  import { type PlacementMode } from './PlacementStateContext';
15
16
  import { type AudioVolumeContextValue } from './AudioVolumeContext';
@@ -106,6 +107,11 @@ interface Props {
106
107
  * 指定しない場合はデフォルト実装(console.log)が使用される
107
108
  */
108
109
  sharedFileImplementation?: SharedFileContextValue;
110
+ /**
111
+ * 掴める対象管理の実装(オプション)
112
+ * 指定しない場合はデフォルト実装(登録のみ・掴めない)が使用される
113
+ */
114
+ grabbableImplementation?: GrabbableContextValue;
109
115
  /**
110
116
  * アイテムの配置状態(オプション)
111
117
  * 'preview': プレビュー中、'placed': 設置済み
@@ -119,7 +125,7 @@ interface Props {
119
125
  * Module Federationで動的にロードされたワールドコンポーネントに
120
126
  * 必要な情報を注入するために使用
121
127
  */
122
- export declare const XRiftProvider: ({ baseUrl, confirmImplementation, instanceStateImplementation, instanceImplementation, screenShareImplementation, spawnPointImplementation, teleportImplementation, textInputImplementation, usersImplementation, worldImplementation, instanceEventImplementation, audioVolumeImplementation, fileInputImplementation, sharedFileImplementation, placementMode, children, }: Props) => import("react/jsx-runtime").JSX.Element;
128
+ export declare const XRiftProvider: ({ baseUrl, confirmImplementation, instanceStateImplementation, instanceImplementation, screenShareImplementation, spawnPointImplementation, teleportImplementation, textInputImplementation, usersImplementation, worldImplementation, instanceEventImplementation, audioVolumeImplementation, fileInputImplementation, sharedFileImplementation, grabbableImplementation, placementMode, children, }: Props) => import("react/jsx-runtime").JSX.Element;
123
129
  /**
124
130
  * XRift ワールドの情報を取得するhook
125
131
  * ワールドプロジェクト側でアセットの相対パスを絶対パスに変換する際に使用
@@ -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,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;AAW5B,MAAM,WAAW,iBAAiB;IAChC;;;OAGG;IACH,OAAO,EAAE,MAAM,CAAA;IACf;;;OAGG;IACH,mBAAmB,EAAE,GAAG,CAAC,QAAQ,CAAC,CAAA;IAClC;;OAEG;IACH,oBAAoB,EAAE,CAAC,MAAM,EAAE,QAAQ,KAAK,IAAI,CAAA;IAChD;;OAEG;IACH,sBAAsB,EAAE,CAAC,MAAM,EAAE,QAAQ,KAAK,IAAI,CAAA;CAKnD;AAED;;;GAGG;AACH,eAAO,MAAM,YAAY,yCAAgD,CAAA;AAEzE,UAAU,KAAK;IACb,OAAO,EAAE,MAAM,CAAA;IACf;;;OAGG;IACH,2BAA2B,CAAC,EAAE,yBAAyB,CAAA;IACvD;;;OAGG;IACH,yBAAyB,CAAC,EAAE,uBAAuB,CAAA;IACnD;;;OAGG;IACH,wBAAwB,CAAC,EAAE,sBAAsB,CAAA;IACjD;;;OAGG;IACH,qBAAqB,CAAC,EAAE,mBAAmB,CAAA;IAC3C;;;OAGG;IACH,sBAAsB,CAAC,EAAE,oBAAoB,CAAA;IAC7C;;;OAGG;IACH,sBAAsB,CAAC,EAAE,oBAAoB,CAAA;IAC7C;;;OAGG;IACH,uBAAuB,CAAC,EAAE,qBAAqB,CAAA;IAC/C;;;OAGG;IACH,mBAAmB,CAAC,EAAE,iBAAiB,CAAA;IACvC;;;OAGG;IACH,mBAAmB,CAAC,EAAE,iBAAiB,CAAA;IACvC;;;OAGG;IACH,2BAA2B,CAAC,EAAE,yBAAyB,CAAA;IACvD;;;OAGG;IACH,yBAAyB,CAAC,EAAE,uBAAuB,CAAA;IACnD;;;OAGG;IACH,uBAAuB,CAAC,EAAE,qBAAqB,CAAA;IAC/C;;;OAGG;IACH,wBAAwB,CAAC,EAAE,sBAAsB,CAAA;IACjD;;;;OAIG;IACH,aAAa,CAAC,EAAE,aAAa,CAAA;IAC7B,QAAQ,EAAE,SAAS,CAAA;CACpB;AAeD;;;;GAIG;AACH,eAAO,MAAM,aAAa,GAAI,8WAiB3B,KAAK,4CA0GP,CAAA;AAED;;;;;;;;;GASG;AACH,eAAO,MAAM,QAAQ,QAAO,iBAQ3B,CAAA"}
1
+ {"version":3,"file":"XRiftContext.d.ts","sourceRoot":"","sources":["../../src/contexts/XRiftContext.tsx"],"names":[],"mappings":"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"}