aframe
Version:
A web framework for building virtual reality experiences.
67 lines (55 loc) • 1.77 kB
JavaScript
var registerSystem = require('../core/system').registerSystem;
var utils = require('../utils');
var isWebXRAvailable = utils.device.isWebXRAvailable;
/**
* Tracked controls system.
* Maintain list with available tracked controllers.
*/
module.exports.System = registerSystem('tracked-controls-webvr', {
init: function () {
var self = this;
this.controllers = [];
this.isChrome = navigator.userAgent.indexOf('Chrome') !== -1;
this.updateControllerList();
this.throttledUpdateControllerList = utils.throttle(this.updateControllerList, 500, this);
// Don't use WebVR if WebXR is available?
if (isWebXRAvailable) { return; }
if (!navigator.getVRDisplays) { return; }
this.sceneEl.addEventListener('enter-vr', function () {
navigator.getVRDisplays().then(function (displays) {
if (displays.length) { self.vrDisplay = displays[0]; }
});
});
},
tick: function () {
if (this.isChrome) {
// Retrieve new controller handlers with updated state (pose, buttons...)
this.updateControllerList();
} else {
this.throttledUpdateControllerList();
}
},
/**
* Update controller list.
*/
updateControllerList: function () {
var controllers = this.controllers;
var gamepad;
var gamepads;
var i;
var prevCount;
gamepads = navigator.getGamepads && navigator.getGamepads();
if (!gamepads) { return; }
prevCount = controllers.length;
controllers.length = 0;
for (i = 0; i < gamepads.length; ++i) {
gamepad = gamepads[i];
if (gamepad && gamepad.pose) {
controllers.push(gamepad);
}
}
if (controllers.length !== prevCount) {
this.el.emit('controllersupdated', undefined, false);
}
}
});