Skip to content

Commit e34d97f

Browse files
committed
fix #406: listen to originReferenceSpace
1 parent b4888d7 commit e34d97f

File tree

3 files changed

+29
-17
lines changed

3 files changed

+29
-17
lines changed

packages/react/xr/src/layer.tsx

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ import {
3636
useState,
3737
} from 'react'
3838
import { useXRSessionFeatureEnabled } from './hooks.js'
39-
import { useXRStore } from './xr.js'
39+
import { useXR, useXRStore } from './xr.js'
4040
import {
4141
BufferGeometry,
4242
Mesh,
@@ -198,15 +198,18 @@ export const XRLayerImplementation = forwardRef<
198198
const renderOrderRef = useRef(renderOrder)
199199
renderOrderRef.current = renderOrder
200200

201+
const originReferenceSpace = useXR((s) => s.originReferenceSpace)
202+
201203
//create layer
202204
useEffect(() => {
203-
if (internalRef.current == null) {
205+
if (internalRef.current == null || originReferenceSpace == null) {
204206
return
205207
}
206208
const resolvedSrc = src ?? (renderTargetRef.current = createXRLayerRenderTarget(pixelWidth, pixelHeight, dpr))
207209
const layer = createXRLayer(
208210
resolvedSrc,
209211
store.getState(),
212+
originReferenceSpace,
210213
renderer.xr,
211214
internalRef.current,
212215
{
@@ -237,6 +240,7 @@ export const XRLayerImplementation = forwardRef<
237240
layer.destroy()
238241
}
239242
}, [
243+
originReferenceSpace,
240244
colorFormat,
241245
depthFormat,
242246
invertStereo,

packages/xr/src/layer.ts

Lines changed: 10 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -56,27 +56,26 @@ const DefaultUpperVerticalAngle = (30 / 180) * Math.PI
5656
export function createXRLayer(
5757
src: XRLayerSrc,
5858
state: XRState<any>,
59+
originReferenceSpace: XRReferenceSpace,
5960
xrManager: WebXRManager,
6061
relativeTo: Object3D,
6162
options: XRLayerOptions,
6263
properties: XRLayerProperties,
6364
) {
6465
return src instanceof HTMLVideoElement
65-
? createXRVideoLayer(src, state, relativeTo, options, properties)
66-
: createXRNormalLayer(src, state, xrManager, relativeTo, options, properties)
66+
? createXRVideoLayer(src, state, originReferenceSpace, relativeTo, options, properties)
67+
: createXRNormalLayer(src, state.origin, originReferenceSpace, xrManager, relativeTo, options, properties)
6768
}
6869

6970
function createXRVideoLayer(
7071
src: HTMLVideoElement,
7172
state: XRState<any>,
73+
originReferenceSpace: XRReferenceSpace,
7274
relativeTo: Object3D,
7375
{ invertStereo, layout, shape = 'quad' }: XRLayerOptions,
7476
properties: XRLayerProperties = {},
7577
) {
76-
const space = getSpaceFromAncestors(relativeTo, state.origin, state.originReferenceSpace, matrixHelper)
77-
if (space == null) {
78-
return undefined
79-
}
78+
const space = getSpaceFromAncestors(relativeTo, state.origin, originReferenceSpace, matrixHelper)
8079
const transform = matrixToRigidTransform(matrixHelper, scaleHelper)
8180
const init: XRMediaCylinderLayerInit &
8281
XRMediaEquirectLayerInit &
@@ -90,24 +89,22 @@ function createXRVideoLayer(
9089
const fnName = `create${capitalize(shape)}Layer` as const
9190
const layer = state.mediaBinding?.[fnName](src, init)
9291
if (layer == null) {
93-
return
92+
return undefined
9493
}
9594
updateXRLayerProperties(layer, properties)
9695
return layer
9796
}
9897

9998
function createXRNormalLayer(
10099
src: Exclude<TexImageSource, VideoFrame | HTMLVideoElement> | WebGLRenderTarget,
101-
state: XRState<any>,
100+
origin: Object3D | undefined,
101+
originReferenceSpace: XRReferenceSpace,
102102
xrManager: WebXRManager,
103103
relativeTo: Object3D,
104104
{ shape = 'quad', ...options }: XRLayerOptions,
105105
properties: XRLayerProperties = {},
106106
) {
107-
const space = getSpaceFromAncestors(relativeTo, state.origin, state.originReferenceSpace, matrixHelper)
108-
if (space == null) {
109-
return undefined
110-
}
107+
const space = getSpaceFromAncestors(relativeTo, origin, originReferenceSpace, matrixHelper)
111108
const transform = matrixToRigidTransform(matrixHelper, scaleHelper)
112109
const init: XRCylinderLayerInit & XREquirectLayerInit & XRQuadLayerInit & { transform: XRRigidTransform } = {
113110
...options,
@@ -122,7 +119,7 @@ function createXRNormalLayer(
122119
const fnName = `create${capitalize(shape)}Layer` as const
123120
const layer = xrManager.getBinding()?.[fnName](init)
124121
if (layer == null) {
125-
return
122+
return undefined
126123
}
127124
updateXRLayerProperties(layer, properties)
128125
return layer

packages/xr/src/vanilla/layer.ts

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,10 @@ export class XRLayer extends Mesh<BufferGeometry, MeshBasicMaterial> {
4343
if (aborted) {
4444
return
4545
}
46-
const update = ({ session }: XRState<any>, prevState?: XRState<any>) => {
46+
const update = ({ session, originReferenceSpace }: XRState<any>, prevState?: XRState<any>) => {
47+
if (originReferenceSpace == null) {
48+
return
49+
}
4750
if (prevState != null && session === prevState.session) {
4851
return
4952
}
@@ -62,7 +65,15 @@ export class XRLayer extends Mesh<BufferGeometry, MeshBasicMaterial> {
6265
}
6366

6467
this.material.map = null
65-
const layer = createXRLayer(options.src, store.getState(), renderer.xr, this, options, properties)
68+
const layer = createXRLayer(
69+
options.src,
70+
store.getState(),
71+
originReferenceSpace,
72+
renderer.xr,
73+
this,
74+
options,
75+
properties,
76+
)
6677
if (layer == null) {
6778
this.cleanup = () => {}
6879
return

0 commit comments

Comments
 (0)