@@ -14,20 +14,22 @@ import {
1414import { Group , Object3D } from 'three'
1515import { xrSpaceContext } from './contexts.js'
1616import { useXR } from './xr.js'
17+ import { useXRControllerButtonEvent } from './controller.js'
18+ import { useXRInputSourceStateContext } from './input.js'
1719
1820/**
1921 * component that puts its children at the provided space (or reference space type)
2022 */
2123export const XRSpace = forwardRef <
2224 Object3D ,
2325 {
24- space : XRSpace | XRReferenceSpaceType
26+ space : XRSpace | XRSpaceType
2527 children ?: ReactNode
2628 }
2729> ( ( { space, children } , ref ) => {
2830 const internalRef = useRef < Group | null > ( null )
2931 // 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 )
3133 useImperativeHandle ( ref , ( ) => internalRef . current ! , [ ] )
3234 useApplyXRSpaceMatrix ( internalRef , resolvedSpace )
3335 const setRef = useCallback ( ( group : Group | null ) => {
@@ -44,14 +46,57 @@ export const XRSpace = forwardRef<
4446 )
4547} )
4648
49+ export type XRSpaceType = XRReferenceSpaceType | XRInputSourceSpaceType | XRHandJointSpaceType
50+
51+ export type XRInputSourceSpaceType = 'grip-space' | 'target-ray-space'
52+
53+ export type XRHandJointSpaceType = XRHandJoint
54+
4755/**
4856 * hook for retrieving getting xr space from the context
4957 */
5058export function useXRSpace ( ) : XRSpace
5159
60+ export function useXRSpace ( type : XRInputSourceSpaceType | XRHandJointSpaceType ) : XRSpace | undefined
61+
5262export function useXRSpace ( type : XRReferenceSpaceType ) : XRReferenceSpace | undefined
5363
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+ }
55100 if ( type == null ) {
56101 // eslint-disable-next-line react-hooks/rules-of-hooks
57102 const context = useContext ( xrSpaceContext )
0 commit comments