Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
31 changes: 20 additions & 11 deletions src/core/scene/a-scene.js
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,7 @@ module.exports.AScene = registerElement('a-scene', {
prototype: Object.create(AEntity.prototype, {
createdCallback: {
value: function () {
this.clock = new THREE.Clock();
this.isIOS = isIOS;
this.isMobile = isMobile;
this.hasWebXR = isWebXRAvailable;
Expand Down Expand Up @@ -267,8 +268,8 @@ module.exports.AScene = registerElement('a-scene', {
// Has VR.
if (this.checkHeadsetConnected() || this.isMobile) {
vrDisplay = utils.device.getVRDisplay();
vrManager.setDevice(vrDisplay);
vrManager.enabled = true;
vrManager.setDevice(vrDisplay);

if (this.hasWebXR) {
// XR API.
Expand All @@ -288,14 +289,16 @@ module.exports.AScene = registerElement('a-scene', {
enterVRSuccess();
});
} else {
// WebVR API.
if (vrDisplay.isPresenting) {
enterVRSuccess();
return Promise.resolve();
}
var rendererSystem = this.getAttribute('renderer');
var presentationAttributes = {
highRefreshRate: rendererSystem.highRefreshRate,
foveationLevel: rendererSystem.foveationLevel,
multiview: vrManager.multiview
Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

this required manual merging

};

return vrDisplay.requestPresent([{
source: this.canvas,
attributes: {highRefreshRate: this.highRefreshRate, multiview: vrManager.multiview}
attributes: presentationAttributes
}]).then(enterVRSuccess, enterVRFailure);
}
return Promise.resolve();
Expand All @@ -322,6 +325,8 @@ module.exports.AScene = registerElement('a-scene', {
if (!self.isMobile && !self.checkHeadsetConnected()) {
requestFullscreen(self.canvas);
}

self.renderer.setAnimationLoop(self.render);
self.resize();
}

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

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

if (sceneEl.renderStarted) { return; }

sceneEl.resize();

// Kick off render loop.
if (sceneEl.renderer) {
if (window.performance) { window.performance.mark('render-started'); }
sceneEl.clock = new THREE.Clock();
loadingScreen.remove();
sceneEl.renderer.setAnimationLoop(this.render);
sceneEl.render();
if (utils.device.getVRDisplay().isPresenting) {
vrManager.setDevice(utils.device.getVRDisplay());
vrManager.enabled = true;
sceneEl.enterVR();
}
renderer.setAnimationLoop(this.render);
sceneEl.renderStarted = true;
sceneEl.emit('renderstart');
}
Expand Down
16 changes: 0 additions & 16 deletions src/core/scene/loadingScreen.js
Original file line number Diff line number Diff line change
Expand Up @@ -9,22 +9,6 @@ var getSceneCanvasSize;
var ATTR_NAME = 'loading-screen';
var LOADER_TITLE_CLASS = 'a-loader-title';

// It catches vrdisplayactivate early to ensure we can enter VR mode after the scene loads.
window.addEventListener('vrdisplayactivate', function () {
var vrManager = sceneEl.renderer.vr;
var vrDisplay;

// WebXR takes priority if available.
if (navigator.xr) { return; }

vrDisplay = utils.device.getVRDisplay();
vrManager.setDevice(vrDisplay);
vrManager.enabled = true;
if (!vrDisplay.isPresenting) {
return vrDisplay.requestPresent([{source: sceneEl.canvas}]).then(function () {}, function () {});
}
});

module.exports.setup = function setup (el, getCanvasSize) {
sceneEl = el;
getSceneCanvasSize = getCanvasSize;
Expand Down
11 changes: 11 additions & 0 deletions src/utils/device.js
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,17 @@ var error = require('debug')('device:error');

var vrDisplay;

// It catches vrdisplayactivate early to ensure we can enter VR mode after the scene loads.
window.addEventListener('vrdisplayactivate', function (evt) {
var canvasEl;
// WebXR takes priority if available.
if (navigator.xr) { return; }
canvasEl = document.createElement('canvas');
vrDisplay = evt.display;
// Request present immediately. a-scene will be allowed to enter VR without user gesture.
vrDisplay.requestPresent([{source: canvasEl}]).then(function () {}, function () {});
});

// Support both WebVR and WebXR APIs.
if (navigator.xr) {
navigator.xr.requestDevice().then(function (device) {
Expand Down
4 changes: 3 additions & 1 deletion tests/core/scene/a-scene.test.js
Original file line number Diff line number Diff line change
Expand Up @@ -141,7 +141,9 @@ suite('a-scene (without renderer)', function () {
getDevice: function () {},
setDevice: function () {},
setPoseTarget: function () {}
}
},
getContext: function () { return undefined; },
setAnimationLoop: function () {}
};

// mock camera
Expand Down