From 25825077757165465c84be9a00d1e65eec018118 Mon Sep 17 00:00:00 2001 From: chrisplatorres Date: Tue, 11 Jun 2019 23:39:37 -0500 Subject: [PATCH 1/4] remove function emit per layer for exitpresent and vrdisplayactivate --- index.html | 21 --------------------- 1 file changed, 21 deletions(-) diff --git a/index.html b/index.html index 257717d..1fae8f5 100644 --- a/index.html +++ b/index.html @@ -3305,25 +3305,6 @@ } // bootstrap - -const _emitLayersVrDisplayActivate = () => { - for (let i = 0; i < layers.length; i++) { - const layer = layers[i]; - - if (layer.tagName === 'IFRAME' && layer.d === 3) { - layer.contentWindow.runAsync('vrdisplayactivate'); - } - } -}; -const _emitLayersExitPresent = () => { - for (let i = 0; i < layers.length; i++) { - const layer = layers[i]; - - if (layer.tagName === 'IFRAME' && layer.d === 3) { - layer.contentWindow.runAsync('exitPresent'); - } - } -}; const _startFakeVrDisplay = async (width, height) => { fakeXrDisplay = new FakeXRDisplay(); if (isFinite(width)) { @@ -3346,7 +3327,6 @@ renderer.vr.setSession(null); renderer.vr.setAnimationLoop(null); - _emitLayersExitPresent(); session.removeEventListener('end', _end); }; @@ -3362,7 +3342,6 @@ }); renderer.vr.setAnimationLoop(animate); - _emitLayersVrDisplayActivate(); accept(); }); From 943879177be31a26cf3b65d6c1906ab6a77396bd Mon Sep 17 00:00:00 2001 From: chrisplatorres Date: Tue, 11 Jun 2019 23:41:42 -0500 Subject: [PATCH 2/4] remove missed _emitLayersExitPresent --- index.html | 1 - 1 file changed, 1 deletion(-) diff --git a/index.html b/index.html index 1fae8f5..c93b1d8 100644 --- a/index.html +++ b/index.html @@ -3356,7 +3356,6 @@ fakeXrDisplay.display = display; const _vrdisplaypresentchange = () => { - _emitLayersExitPresent(); display.removeEventListener('vrdisplaypresentchange', _vrdisplaypresentchange); }; From 365578c4623939e0adb0826d53d199a87b246c39 Mon Sep 17 00:00:00 2001 From: chrisplatorres Date: Wed, 12 Jun 2019 03:06:21 -0500 Subject: [PATCH 3/4] re-add emit layers and add startVrDisplay --- index.html | 122 ++++++++++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 117 insertions(+), 5 deletions(-) diff --git a/index.html b/index.html index c93b1d8..d968230 100644 --- a/index.html +++ b/index.html @@ -1063,6 +1063,12 @@ _bindEventTarget('xr'); } else if (target === 'xr') { console.log('xr click'); + _endFakeVrDisplay() + // .then(() => _startVrDisplay()) + .then(() => _startVrDisplay()) + .catch(err => { + console.warn(err.stack); + }); } else if (target === 'transform') { console.log('transform click'); } @@ -1280,13 +1286,13 @@ const maxX = viewport.x + viewport.z; const maxY = viewport.y + viewport.w; const shouldOrbit = x >= minX && x < maxX && y >= minY && y < maxY && !menuOpen; - if (shouldOrbit && !orbitControls) { + if (shouldOrbit && !orbitControls && fakeXrDisplay) { _addOrbitControls(); } else if (!shouldOrbit && orbitControls) { _removeOrbitControls(); } - if (orbitControls) { + if (orbitControls && fakeXrDisplay) { const localCamera = camera; localCamera.matrixWorldInverse.fromArray(fakeXrDisplay.viewMatrix); localCamera.matrixWorld.getInverse(localCamera.matrixWorldInverse); @@ -3291,7 +3297,14 @@ gl.uniform1i(gl.uiTexLocation, 0); gl.activeTexture(gl.TEXTURE1); - gl.bindTexture(gl.TEXTURE_2D, fakeXrDisplay.texture); + if(fakeXrDisplay){ + gl.bindTexture(gl.TEXTURE_2D, fakeXrDisplay.texture); + } else if (display) { + // xxx + gl.bindTexture(gl.TEXTURE_2D, display.texture); + } else { + gl.bindTexture(gl.TEXTURE_2D, 0); + } gl.uniform1i(gl.viewportTexLocation, 1); gl.uniform4f(gl.viewportLocation, viewport.x, viewport.y, viewport.z, viewport.w); @@ -3304,7 +3317,103 @@ animateComposeContext(time, frame); } -// bootstrap +// bootstrap Xr +const _startVrDisplay = async () => { + if (navigator.xr) { + const session = await navigator.xr.requestSession({ + exclusive: true, + }); + + const _end = () => { + renderer.vr.enabled = false; + renderer.vr.setSession(null); + renderer.vr.setAnimationLoop(null); + + session.removeEventListener('end', _end); + }; + session.addEventListener('end', _end); + + await new Promise((accept, reject) => { + session.requestAnimationFrame((timestamp, frame) => { + session.layers = layers; + + renderer.vr.setSession(session, { + frameOfReferenceType: 'stage', + }); + + const {views} = frame.getViewerPose(); + const viewport = session.baseLayer.getViewport(views[0]); + const width = viewport.width; + const height = viewport.height; + // console.log("session.isPresenting = " + session.isPresenting()); + // renderer.setSize(width * 2, height); + + renderer.setAnimationLoop(null); + + renderer.vr.enabled = true; + renderer.vr.setSession(session, { + frameOfReferenceType: 'stage', + }); + renderer.vr.setAnimationLoop(animate); + + console.log('entered xr'); + + accept(); + }); + }); + } else { // WebVR + console.log('request device'); + const displays = await navigator.getVRDisplays(); + display = displays[0]; + + if (display) { + console.log('request present vr'); + await display.requestPresent([{ + source: renderer.domElement, + }]); + + const {renderWidth: width, renderHeight: height} = display.getEyeParameters('left'); + renderer.setSize(width * 2, height); + + renderer.setAnimationLoop(null); + renderer.vr.enabled = true; + renderer.vr.setAnimationLoop(animate); + + console.log('entered vr'); + } else { + console.log('no vr displays'); + renderer.setAnimationLoop(animate); + } + } +}; +const _endVrDisplay = async () => { + if (display.session) { + await display.session.end(); + } else if (display) { + await display.exitPresent(); + } + + display = null; + // renderer.domElement.framebuffer = null; // XXX destroy this framebuffer +}; + +// bootstrap fakeXr +const _emitLayersVrDisplayActivate = () => { + for (let i = 0; i < layers.length; i++) { + const layer = layers[i]; + if (layer.tagName === 'IFRAME' && layer.d === 3) { + // layer.contentWindow.runAsync('vrdisplayactivate'); + } + } +}; +const _emitLayersExitPresent = () => { + for (let i = 0; i < layers.length; i++) { + const layer = layers[i]; + if (layer.tagName === 'IFRAME' && layer.d === 3) { + // layer.contentWindow.runAsync('exitPresent'); + } +} +}; const _startFakeVrDisplay = async (width, height) => { fakeXrDisplay = new FakeXRDisplay(); if (isFinite(width)) { @@ -3327,6 +3436,7 @@ renderer.vr.setSession(null); renderer.vr.setAnimationLoop(null); + _emitLayersExitPresent(); session.removeEventListener('end', _end); }; @@ -3342,13 +3452,14 @@ }); renderer.vr.setAnimationLoop(animate); + _emitLayersVrDisplayActivate(); accept(); }); }); } else { const displays = await navigator.getVRDisplays(); - const display = displays[0]; + const fakeDisplay = displays[0]; await display.requestPresent([{ source: renderer.domElement, }]); @@ -3356,6 +3467,7 @@ fakeXrDisplay.display = display; const _vrdisplaypresentchange = () => { + _emitLayersExitPresent(); display.removeEventListener('vrdisplaypresentchange', _vrdisplaypresentchange); }; From ea5a07fea0343bcafd84745471949a2cd9b3e26c Mon Sep 17 00:00:00 2001 From: chrisplatorres Date: Wed, 12 Jun 2019 03:59:44 -0500 Subject: [PATCH 4/4] set global display to xr session and check for toggle on xr button click --- index.html | 29 +++++++++++++++++++---------- 1 file changed, 19 insertions(+), 10 deletions(-) diff --git a/index.html b/index.html index d968230..ffe8e4a 100644 --- a/index.html +++ b/index.html @@ -1063,12 +1063,20 @@ _bindEventTarget('xr'); } else if (target === 'xr') { console.log('xr click'); - _endFakeVrDisplay() - // .then(() => _startVrDisplay()) - .then(() => _startVrDisplay()) - .catch(err => { - console.warn(err.stack); - }); + if(fakeXrDisplay){ + _endFakeVrDisplay() + .then(() => _startVrDisplay()) + .catch(err => { + console.warn(err.stack); + }); + } else if(display){ + _endVrDisplay() + .then(() => _startFakeVrDisplay()) + .catch(err => { + console.warn(err.stack); + }); + } + } else if (target === 'transform') { console.log('transform click'); } @@ -3324,6 +3332,8 @@ exclusive: true, }); + display = session; + const _end = () => { renderer.vr.enabled = false; renderer.vr.setSession(null); @@ -3387,10 +3397,9 @@ } }; const _endVrDisplay = async () => { - if (display.session) { - await display.session.end(); - } else if (display) { - await display.exitPresent(); + if (display) { + await display.end(); + // await display.exitPresent(); } display = null;