Skip to content

Commit 432aff6

Browse files
committed
support <XRSpace space="grib-space" /> and more
1 parent d682279 commit 432aff6

File tree

2 files changed

+51
-5
lines changed

2 files changed

+51
-5
lines changed

packages/react/xr/src/hand.tsx

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -37,18 +37,19 @@ export const XRHandModel = forwardRef<Object3D, XRHandModelOptions>((options, re
3737
})
3838

3939
/**
40+
* @deprecated use `<XRSpace space="wrist">` instead of `<XRHandJoint joint="wrist">`
4041
* component for placing content in the hand anchored at a specific joint such as the index finger tip
4142
*
4243
* properties
4344
* - `joint` is the name of the joint (e.g. `"wrist"`)
4445
*
4546
* the component allows children to be placed inside for e.g. visualizing a tooltip over the index finger tip
47+
*
4648
*/
4749
export const XRHandJoint = forwardRef<Object3D, { joint: XRHandJoint; children?: ReactNode }>(
4850
({ joint, children }, ref) => {
49-
const state = useXRInputSourceStateContext('hand')
5051
return (
51-
<XRSpace ref={ref} space={state.inputSource.hand.get(joint)!}>
52+
<XRSpace ref={ref} space={joint}>
5253
{children}
5354
</XRSpace>
5455
)

packages/react/xr/src/space.tsx

Lines changed: 48 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -14,20 +14,22 @@ import {
1414
import { Group, Object3D } from 'three'
1515
import { xrSpaceContext } from './contexts.js'
1616
import { 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
*/
2123
export 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
*/
5058
export function useXRSpace(): XRSpace
5159

60+
export function useXRSpace(type: XRInputSourceSpaceType | XRHandJointSpaceType): XRSpace | undefined
61+
5262
export 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

Comments
 (0)