@@ -14,20 +14,22 @@ import {
14
14
import { Group , Object3D } from 'three'
15
15
import { xrSpaceContext } from './contexts.js'
16
16
import { useXR } from './xr.js'
17
+ import { useXRControllerButtonEvent } from './controller.js'
18
+ import { useXRInputSourceStateContext } from './input.js'
17
19
18
20
/**
19
21
* component that puts its children at the provided space (or reference space type)
20
22
*/
21
23
export const XRSpace = forwardRef <
22
24
Object3D ,
23
25
{
24
- space : XRSpace | XRReferenceSpaceType
26
+ space : XRSpace | XRSpaceType
25
27
children ?: ReactNode
26
28
}
27
29
> ( ( { space, children } , ref ) => {
28
30
const internalRef = useRef < Group | null > ( null )
29
31
// eslint-disable-next-line react-hooks/rules-of-hooks
30
- const resolvedSpace = typeof space === 'string' ? useXRSpace ( space ) : space
32
+ const resolvedSpace = useXRSpace ( space as any )
31
33
useImperativeHandle ( ref , ( ) => internalRef . current ! , [ ] )
32
34
useApplyXRSpaceMatrix ( internalRef , resolvedSpace )
33
35
const setRef = useCallback ( ( group : Group | null ) => {
@@ -44,14 +46,57 @@ export const XRSpace = forwardRef<
44
46
)
45
47
} )
46
48
49
+ export type XRSpaceType = XRReferenceSpaceType | XRInputSourceSpaceType | XRHandJointSpaceType
50
+
51
+ export type XRInputSourceSpaceType = 'grip-space' | 'target-ray-space'
52
+
53
+ export type XRHandJointSpaceType = XRHandJoint
54
+
47
55
/**
48
56
* hook for retrieving getting xr space from the context
49
57
*/
50
58
export function useXRSpace ( ) : XRSpace
51
59
60
+ export function useXRSpace ( type : XRInputSourceSpaceType | XRHandJointSpaceType ) : XRSpace | undefined
61
+
52
62
export function useXRSpace ( type : XRReferenceSpaceType ) : XRReferenceSpace | undefined
53
63
54
- export function useXRSpace ( type ?: XRReferenceSpaceType ) : XRSpace | XRReferenceSpace | undefined {
64
+ export function useXRSpace ( type ?: XRSpaceType ) : XRSpace | XRReferenceSpace | undefined {
65
+ switch ( type ) {
66
+ case 'grip-space' :
67
+ // eslint-disable-next-line react-hooks/rules-of-hooks
68
+ return useXRInputSourceStateContext ( ) . inputSource . gripSpace
69
+ case 'target-ray-space' :
70
+ // eslint-disable-next-line react-hooks/rules-of-hooks
71
+ return useXRInputSourceStateContext ( ) . inputSource . targetRaySpace
72
+ case 'wrist' :
73
+ case 'thumb-metacarpal' :
74
+ case 'thumb-phalanx-proximal' :
75
+ case 'thumb-phalanx-distal' :
76
+ case 'thumb-tip' :
77
+ case 'index-finger-metacarpal' :
78
+ case 'index-finger-phalanx-proximal' :
79
+ case 'index-finger-phalanx-intermediate' :
80
+ case 'index-finger-phalanx-distal' :
81
+ case 'index-finger-tip' :
82
+ case 'middle-finger-metacarpal' :
83
+ case 'middle-finger-phalanx-proximal' :
84
+ case 'middle-finger-phalanx-intermediate' :
85
+ case 'middle-finger-phalanx-distal' :
86
+ case 'middle-finger-tip' :
87
+ case 'ring-finger-metacarpal' :
88
+ case 'ring-finger-phalanx-proximal' :
89
+ case 'ring-finger-phalanx-intermediate' :
90
+ case 'ring-finger-phalanx-distal' :
91
+ case 'ring-finger-tip' :
92
+ case 'pinky-finger-metacarpal' :
93
+ case 'pinky-finger-phalanx-proximal' :
94
+ case 'pinky-finger-phalanx-intermediate' :
95
+ case 'pinky-finger-phalanx-distal' :
96
+ case 'pinky-finger-tip' :
97
+ // eslint-disable-next-line react-hooks/rules-of-hooks
98
+ return useXRInputSourceStateContext ( 'hand' ) . inputSource . hand . get ( type )
99
+ }
55
100
if ( type == null ) {
56
101
// eslint-disable-next-line react-hooks/rules-of-hooks
57
102
const context = useContext ( xrSpaceContext )
0 commit comments