@@ -64,25 +64,70 @@ export const WebXRControls = ({
6464 events,
6565 } = useThree ( ) ;
6666
67+ const viewRef = React . useRef < XRView > ( ) ;
68+
69+ useFrame ( ( ) => {
70+ const view = viewRef . current ;
71+
72+ if ( view ) {
73+ const glLayer = webXRSession . renderState . baseLayer ! ;
74+
75+ const gl = renderer . getContext ( ) ;
76+
77+ const viewport = glLayer . getViewport ( view ) ! ;
78+
79+ renderer . setViewport (
80+ viewport . x ,
81+ viewport . y ,
82+ viewport . width ,
83+ viewport . height
84+ ) ;
85+
86+ // TODO create this outside the loop
87+ const newRenderTarget = new THREE . WebGLRenderTarget (
88+ glLayer . framebufferWidth ,
89+ glLayer . framebufferHeight ,
90+ {
91+ format : THREE . RGBAFormat ,
92+ type : THREE . UnsignedByteType ,
93+ colorSpace : renderer . outputColorSpace ,
94+ stencilBuffer : gl . getContextAttributes ( ) ?. stencil ,
95+ }
96+ ) ;
97+
98+ // console.log("render");
99+
100+ renderer . setRenderTargetFramebuffer ( newRenderTarget , glLayer . framebuffer ) ;
101+ renderer . setRenderTarget ( newRenderTarget ) ;
102+
103+ renderer . render ( scene , camera ) ;
104+ }
105+ } , 1 ) ;
106+
67107 React . useLayoutEffect ( ( ) => {
68108 const gl = renderer . getContext ( ) ;
69109
70- gl . makeXRCompatible ( ) . then ( ( ) => {
71- webXRSession . updateRenderState ( {
72- baseLayer : new XRWebGLLayer ( webXRSession , gl ) ,
73- } ) ;
74- } ) ;
110+ gl . makeXRCompatible ( )
111+ . then ( ( ) => {
112+ webXRSession . updateRenderState ( {
113+ baseLayer : new XRWebGLLayer ( webXRSession , gl ) ,
114+ } ) ;
115+ } )
116+ . catch ( setError ) ;
75117
76118 let localReference : XRReferenceSpace ;
77119
78- webXRSession . requestReferenceSpace ( "local-floor" ) . then ( ( r ) => {
79- localReference = r ;
120+ webXRSession
121+ . requestReferenceSpace ( "local-floor" )
122+ . then ( ( r ) => {
123+ localReference = r ;
80124
81- localReference . addEventListener ( "reset" , ( { transform } ) => {
82- if ( transform )
83- localReference = localReference . getOffsetReferenceSpace ( transform ) ;
84- } ) ;
85- } ) ;
125+ localReference . addEventListener ( "reset" , ( { transform } ) => {
126+ if ( transform )
127+ localReference = localReference . getOffsetReferenceSpace ( transform ) ;
128+ } ) ;
129+ } )
130+ . catch ( setError ) ;
86131
87132 let cancel : number ;
88133 let lastTime : number ;
@@ -96,11 +141,11 @@ export const WebXRControls = ({
96141 const dt = t - ( lastTime ?? t ) ;
97142 lastTime = t ;
98143
99- const glLayer = webXRSession . renderState . baseLayer ! ;
100144 const pose = localReference && frame . getViewerPose ( localReference ) ;
101145
102146 if ( pose ) {
103147 const view = pose . views [ 0 ] ;
148+ viewRef . current = view ;
104149
105150 const l = 4 ;
106151 camera . position . set (
@@ -132,6 +177,7 @@ export const WebXRControls = ({
132177 . copy ( camera . position )
133178 . addScaledVector ( v , t ) ;
134179
180+ console . log ( "found" ) ;
135181 onPoseFound ?.( ) ;
136182 }
137183 }
@@ -143,18 +189,9 @@ export const WebXRControls = ({
143189 // camera.projectionMatrix.copy(projectionMatrix);
144190 // camera.projectionMatrixInverse.copy(camera.projectionMatrix).invert();
145191
146- const viewport = glLayer . getViewport ( view ) ! ;
147- renderer . setViewport (
148- viewport . x ,
149- viewport . y ,
150- viewport . width ,
151- viewport . height
152- ) ;
192+ advance ( dt ) ;
153193 }
154194
155- gl . bindFramebuffer ( gl . FRAMEBUFFER , glLayer . framebuffer ) ;
156- advance ( dt ) ;
157-
158195 cancel = webXRSession . requestAnimationFrame ( onXRFrame ) ;
159196 } ;
160197
0 commit comments