Skip to content

Commit 273e1ad

Browse files
committed
.
1 parent 436f7ea commit 273e1ad

File tree

4 files changed

+73
-26
lines changed

4 files changed

+73
-26
lines changed

README.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,3 +42,8 @@ yarn dev
4242

4343
- ["Dice"](https://skfb.ly/6RtsC) by tnRaro is licensed under [CC BY 4.0](http://creativecommons.org/licenses/by/4.0/).
4444
- ["Lebombo"](https://hdrihaven.com/hdri/?c=indoor&h=lebombo) by Greg Zaal is licensed under [CC0](https://creativecommons.org/share-your-work/public-domain/cc0/)
45+
46+
# TODO
47+
48+
- framebuffer swapping seems ok-ish
49+
- touch detection is broken

src/App/App.tsx

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -114,7 +114,12 @@ export const App = ({ onReady, onProgress, webXRSession, started }: Props) => {
114114
<ErrorBoundary onError={setError}>
115115
{xr8 && <XR8Controls xr8={xr8} onReady={() => setXr8Ready(true)} />}
116116

117-
{webXRSession && <WebXRControls webXRSession={webXRSession} />}
117+
{webXRSession && (
118+
<WebXRControls
119+
webXRSession={webXRSession}
120+
onPoseFound={() => console.log("pose found")}
121+
/>
122+
)}
118123

119124
<React.Suspense fallback={null}>
120125
<Environment path={"assets/"} files={"lebombo_1k.hdr"} />

src/App/Boot.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -46,8 +46,8 @@ export const Boot = () => {
4646
loadingProgress={
4747
loadingStatus !== "ready" ? loadingStatus.progress : 1
4848
}
49-
onStart={(ar: boolean) => {
50-
if (ar) webXR.init();
49+
onStart={async (ar: boolean) => {
50+
if (ar) await webXR.init();
5151
setStarted(true);
5252
}}
5353
/>

src/WebXRCanvas/WebXRControls.tsx

Lines changed: 60 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)