Skip to content

Commit fc54fe9

Browse files
authored
Add support for offerSession (#5410)
* Add support for offerSession * simplify offerSession implementation * Address review comments * Address review comments * handle self.usedOfferSession state properly * fix build problem * Address review comment
1 parent fbc1139 commit fc54fe9

File tree

2 files changed

+14
-2
lines changed

2 files changed

+14
-2
lines changed

src/components/scene/xr-mode-ui.js

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -150,6 +150,7 @@ module.exports.Component = registerComponent('xr-mode-ui', {
150150
} else {
151151
if (!utils.device.checkVRSupport()) { this.enterVREl.classList.add('fullscreen'); }
152152
this.enterVREl.classList.remove(HIDDEN_CLASS);
153+
sceneEl.enterVR(false, true);
153154
}
154155
},
155156

@@ -161,6 +162,7 @@ module.exports.Component = registerComponent('xr-mode-ui', {
161162
this.enterAREl.classList.add(HIDDEN_CLASS);
162163
} else {
163164
this.enterAREl.classList.remove(HIDDEN_CLASS);
165+
sceneEl.enterVR(true, true);
164166
}
165167
},
166168

src/core/scene/a-scene.js

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,7 @@ class AScene extends AEntity {
5656
self.systems = {};
5757
self.systemNames = [];
5858
self.time = self.delta = 0;
59+
self.usedOfferSession = false;
5960

6061
self.behaviors = {tick: [], tock: []};
6162
self.hasLoaded = false;
@@ -270,13 +271,15 @@ class AScene extends AEntity {
270271
* @param {bool?} useAR - if true, try immersive-ar mode
271272
* @returns {Promise}
272273
*/
273-
enterVR (useAR) {
274+
enterVR (useAR, useOfferSession) {
274275
var self = this;
275276
var vrDisplay;
276277
var vrManager = self.renderer.xr;
277278
var xrInit;
278279

279280
// Don't enter VR if already in VR.
281+
if (useOfferSession && (!navigator.xr || !navigator.xr.offerSession)) { return Promise.resolve('OfferSession is not supported.'); }
282+
if (self.usedOfferSession && useOfferSession) { return Promise.resolve('OfferSession was already called.'); }
280283
if (this.is('vr-mode')) { return Promise.resolve('Already in VR.'); }
281284

282285
// Has VR.
@@ -294,9 +297,16 @@ class AScene extends AEntity {
294297
var xrMode = useAR ? 'immersive-ar' : 'immersive-vr';
295298
xrInit = this.sceneEl.systems.webxr.sessionConfiguration;
296299
return new Promise(function (resolve, reject) {
297-
navigator.xr.requestSession(xrMode, xrInit).then(
300+
var requestSession = useOfferSession ? navigator.xr.offerSession.bind(navigator.xr) : navigator.xr.requestSession.bind(navigator.xr);
301+
self.usedOfferSession |= useOfferSession;
302+
requestSession(xrMode, xrInit).then(
298303
function requestSuccess (xrSession) {
299304
self.xrSession = xrSession;
305+
306+
if (useOfferSession) {
307+
self.usedOfferSession = false;
308+
}
309+
300310
vrManager.layersEnabled = xrInit.requiredFeatures.indexOf('layers') !== -1;
301311
vrManager.setSession(xrSession).then(function () {
302312
vrManager.setFoveation(rendererSystem.foveationLevel);

0 commit comments

Comments
 (0)