-
Notifications
You must be signed in to change notification settings - Fork 23
Expand file tree
/
Copy pathXRController.tsx
More file actions
77 lines (66 loc) · 2.92 KB
/
Copy pathXRController.tsx
File metadata and controls
77 lines (66 loc) · 2.92 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
import React, { useState, useCallback } from 'react'
import { useXRCore } from '../providers/XRCoreProvider'
import HandInteractionSystem, { GestureRecognitionResult } from '../systems/HandInteractionSystem'
import { useSettingsStore } from '../../../store/settingsStore'
import { createLogger } from '../../../utils/logger'
const logger = createLogger('XRController')
/**
* XRController component manages Quest 3 AR functionality and hand tracking.
* Uses the enhanced XRCoreProvider for robust session management.
*/
const XRController: React.FC = () => {
const { isSessionActive, sessionType, controllers } = useXRCore()
const settings = useSettingsStore(state => state.settings)
const [handsVisible, setHandsVisible] = useState(false)
const [handTrackingEnabled, setHandTrackingEnabled] = useState(settings?.xr?.enableHandTracking !== false)
// Log session state changes (Quest 3 AR focused)
React.useEffect(() => {
if (settings?.system?.debug?.enabled) {
if (isSessionActive && sessionType === 'immersive-ar') {
logger.info('Quest 3 AR session is now active')
} else if (isSessionActive) {
logger.info('XR session active but not Quest 3 AR mode')
} else {
logger.info('XR session is not active')
}
}
}, [isSessionActive, sessionType, settings?.system?.debug?.enabled])
// Log controller information
React.useEffect(() => {
if (isSessionActive && controllers && controllers.length > 0 && settings?.system?.debug?.enabled) {
logger.info(`Quest 3 controllers active: ${controllers.length}`)
controllers.forEach((controller, index) => {
logger.info(`Controller ${index}: Three.js XRTargetRaySpace object`)
})
}
}, [controllers, isSessionActive, settings?.system?.debug?.enabled])
// Handle gesture recognition (Quest 3 optimized)
const handleGestureRecognized = useCallback((gesture: GestureRecognitionResult) => {
if (settings?.system?.debug?.enabled) {
logger.info(`Quest 3 gesture recognized: ${gesture.gesture} (${gesture.confidence.toFixed(2)}) with ${gesture.hand} hand`)
}
}, [settings?.system?.debug?.enabled])
// Handle hand visibility changes
const handleHandsVisible = useCallback((visible: boolean) => {
setHandsVisible(visible)
if (settings?.system?.debug?.enabled) {
logger.info(`Quest 3 hands visible: ${visible}`)
}
}, [settings?.system?.debug?.enabled])
// Only render if XR enabled and preferably in Quest 3 AR mode
if (settings?.xr?.enabled === false) {
return null
}
// Prioritize Quest 3 AR mode
const isQuest3AR = isSessionActive && sessionType === 'immersive-ar'
return (
<group name="quest3-ar-controller-root">
<HandInteractionSystem
enabled={handTrackingEnabled && (isQuest3AR || isSessionActive)}
onGestureRecognized={handleGestureRecognized}
onHandsVisible={handleHandsVisible}
/>
</group>
)
}
export default XRController