Skip to content

Commit 05a27f9

Browse files
authored
Merge pull request #12 from MozillaReality/bug/aframe-vrdisplay-startup
Cherry pick fix a3ac58e
2 parents 0663d0e + 494eb4e commit 05a27f9

File tree

4 files changed

+34
-28
lines changed

4 files changed

+34
-28
lines changed

src/core/scene/a-scene.js

Lines changed: 20 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@ module.exports.AScene = registerElement('a-scene', {
3939
prototype: Object.create(AEntity.prototype, {
4040
createdCallback: {
4141
value: function () {
42+
this.clock = new THREE.Clock();
4243
this.isIOS = isIOS;
4344
this.isMobile = isMobile;
4445
this.hasWebXR = isWebXRAvailable;
@@ -267,8 +268,8 @@ module.exports.AScene = registerElement('a-scene', {
267268
// Has VR.
268269
if (this.checkHeadsetConnected() || this.isMobile) {
269270
vrDisplay = utils.device.getVRDisplay();
270-
vrManager.setDevice(vrDisplay);
271271
vrManager.enabled = true;
272+
vrManager.setDevice(vrDisplay);
272273

273274
if (this.hasWebXR) {
274275
// XR API.
@@ -288,14 +289,16 @@ module.exports.AScene = registerElement('a-scene', {
288289
enterVRSuccess();
289290
});
290291
} else {
291-
// WebVR API.
292-
if (vrDisplay.isPresenting) {
293-
enterVRSuccess();
294-
return Promise.resolve();
295-
}
292+
var rendererSystem = this.getAttribute('renderer');
293+
var presentationAttributes = {
294+
highRefreshRate: rendererSystem.highRefreshRate,
295+
foveationLevel: rendererSystem.foveationLevel,
296+
multiview: vrManager.multiview
297+
};
298+
296299
return vrDisplay.requestPresent([{
297300
source: this.canvas,
298-
attributes: {highRefreshRate: this.highRefreshRate, multiview: vrManager.multiview}
301+
attributes: presentationAttributes
299302
}]).then(enterVRSuccess, enterVRFailure);
300303
}
301304
return Promise.resolve();
@@ -322,6 +325,8 @@ module.exports.AScene = registerElement('a-scene', {
322325
if (!self.isMobile && !self.checkHeadsetConnected()) {
323326
requestFullscreen(self.canvas);
324327
}
328+
329+
self.renderer.setAnimationLoop(self.render);
325330
self.resize();
326331
}
327332

@@ -709,19 +714,23 @@ module.exports.AScene = registerElement('a-scene', {
709714
}
710715

711716
this.addEventListener('loaded', function () {
717+
var renderer = this.renderer;
718+
var vrManager = this.renderer.vr;
712719
AEntity.prototype.play.call(this); // .play() *before* render.
713720

714721
if (sceneEl.renderStarted) { return; }
715-
716722
sceneEl.resize();
717723

718724
// Kick off render loop.
719725
if (sceneEl.renderer) {
720726
if (window.performance) { window.performance.mark('render-started'); }
721-
sceneEl.clock = new THREE.Clock();
722727
loadingScreen.remove();
723-
sceneEl.renderer.setAnimationLoop(this.render);
724-
sceneEl.render();
728+
if (utils.device.getVRDisplay().isPresenting) {
729+
vrManager.setDevice(utils.device.getVRDisplay());
730+
vrManager.enabled = true;
731+
sceneEl.enterVR();
732+
}
733+
renderer.setAnimationLoop(this.render);
725734
sceneEl.renderStarted = true;
726735
sceneEl.emit('renderstart');
727736
}

src/core/scene/loadingScreen.js

Lines changed: 0 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -9,22 +9,6 @@ var getSceneCanvasSize;
99
var ATTR_NAME = 'loading-screen';
1010
var LOADER_TITLE_CLASS = 'a-loader-title';
1111

12-
// It catches vrdisplayactivate early to ensure we can enter VR mode after the scene loads.
13-
window.addEventListener('vrdisplayactivate', function () {
14-
var vrManager = sceneEl.renderer.vr;
15-
var vrDisplay;
16-
17-
// WebXR takes priority if available.
18-
if (navigator.xr) { return; }
19-
20-
vrDisplay = utils.device.getVRDisplay();
21-
vrManager.setDevice(vrDisplay);
22-
vrManager.enabled = true;
23-
if (!vrDisplay.isPresenting) {
24-
return vrDisplay.requestPresent([{source: sceneEl.canvas}]).then(function () {}, function () {});
25-
}
26-
});
27-
2812
module.exports.setup = function setup (el, getCanvasSize) {
2913
sceneEl = el;
3014
getSceneCanvasSize = getCanvasSize;

src/utils/device.js

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,17 @@ var error = require('debug')('device:error');
22

33
var vrDisplay;
44

5+
// It catches vrdisplayactivate early to ensure we can enter VR mode after the scene loads.
6+
window.addEventListener('vrdisplayactivate', function (evt) {
7+
var canvasEl;
8+
// WebXR takes priority if available.
9+
if (navigator.xr) { return; }
10+
canvasEl = document.createElement('canvas');
11+
vrDisplay = evt.display;
12+
// Request present immediately. a-scene will be allowed to enter VR without user gesture.
13+
vrDisplay.requestPresent([{source: canvasEl}]).then(function () {}, function () {});
14+
});
15+
516
// Support both WebVR and WebXR APIs.
617
if (navigator.xr) {
718
navigator.xr.requestDevice().then(function (device) {

tests/core/scene/a-scene.test.js

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -141,7 +141,9 @@ suite('a-scene (without renderer)', function () {
141141
getDevice: function () {},
142142
setDevice: function () {},
143143
setPoseTarget: function () {}
144-
}
144+
},
145+
getContext: function () { return undefined; },
146+
setAnimationLoop: function () {}
145147
};
146148

147149
// mock camera

0 commit comments

Comments
 (0)