mirror of
https://github.com/overte-org/overte.git
synced 2025-04-26 01:36:20 +02:00
194 lines
6.8 KiB
JavaScript
194 lines
6.8 KiB
JavaScript
//
|
|
// controllerDisplayManager.js
|
|
//
|
|
// Created by Anthony J. Thibault on 10/20/16
|
|
// Originally created by Ryan Huffman on 9/21/2016
|
|
//
|
|
// Distributed under the Apache License, Version 2.0.
|
|
// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html
|
|
|
|
/* globals ControllerDisplayManager:true createControllerDisplay deleteControllerDisplay
|
|
VIVE_CONTROLLER_CONFIGURATION_LEFT VIVE_CONTROLLER_CONFIGURATION_RIGHT */
|
|
/* eslint indent: ["error", 4, { "outerIIFEBody": 0 }] */
|
|
|
|
(function () {
|
|
|
|
Script.include("controllerDisplay.js");
|
|
Script.include("viveControllerConfiguration.js");
|
|
Script.include("touchControllerConfiguration.js");
|
|
|
|
var HIDE_CONTROLLERS_ON_EQUIP = false;
|
|
|
|
//
|
|
// Management of controller display
|
|
//
|
|
ControllerDisplayManager = function() {
|
|
var self = this;
|
|
var controllerLeft = null;
|
|
var controllerRight = null;
|
|
var controllerCheckerIntervalID = null;
|
|
|
|
this.setLeftVisible = function(visible) {
|
|
if (controllerLeft) {
|
|
controllerLeft.setVisible(visible);
|
|
}
|
|
};
|
|
|
|
this.setRightVisible = function(visible) {
|
|
if (controllerRight) {
|
|
controllerRight.setVisible(visible);
|
|
}
|
|
};
|
|
|
|
function updateControllers() {
|
|
if (HMD.active && HMD.shouldShowHandControllers()) {
|
|
var leftConfig = null;
|
|
var rightConfig = null;
|
|
|
|
if ("Vive" in Controller.Hardware) {
|
|
leftConfig = VIVE_CONTROLLER_CONFIGURATION_LEFT;
|
|
rightConfig = VIVE_CONTROLLER_CONFIGURATION_RIGHT;
|
|
}
|
|
|
|
if ("OculusTouch" in Controller.Hardware) {
|
|
leftConfig = TOUCH_CONTROLLER_CONFIGURATION_LEFT;
|
|
rightConfig = TOUCH_CONTROLLER_CONFIGURATION_RIGHT;
|
|
}
|
|
|
|
if (leftConfig !== null && rightConfig !== null) {
|
|
if (controllerLeft === null) {
|
|
controllerLeft = createControllerDisplay(leftConfig);
|
|
controllerLeft.setVisible(true);
|
|
}
|
|
if (controllerRight === null) {
|
|
controllerRight = createControllerDisplay(rightConfig);
|
|
controllerRight.setVisible(true);
|
|
}
|
|
// We've found the controllers, we no longer need to look for active controllers
|
|
if (controllerCheckerIntervalID) {
|
|
Script.clearInterval(controllerCheckerIntervalID);
|
|
controllerCheckerIntervalID = null;
|
|
}
|
|
|
|
} else {
|
|
self.deleteControllerDisplays();
|
|
if (!controllerCheckerIntervalID) {
|
|
controllerCheckerIntervalID = Script.setInterval(updateControllers, 1000);
|
|
}
|
|
}
|
|
} else {
|
|
// We aren't in HMD mode, we no longer need to look for active controllers
|
|
if (controllerCheckerIntervalID) {
|
|
Script.clearInterval(controllerCheckerIntervalID);
|
|
controllerCheckerIntervalID = null;
|
|
}
|
|
self.deleteControllerDisplays();
|
|
}
|
|
}
|
|
|
|
function resizeControllers(sensorScaleFactor) {
|
|
if (controllerLeft) {
|
|
controllerLeft.resize(sensorScaleFactor);
|
|
}
|
|
if (controllerRight) {
|
|
controllerRight.resize(sensorScaleFactor);
|
|
}
|
|
};
|
|
|
|
var handleMessages = function(channel, message, sender) {
|
|
var i, data, name, visible;
|
|
if (!controllerLeft && !controllerRight) {
|
|
return;
|
|
}
|
|
|
|
if (sender === MyAvatar.sessionUUID) {
|
|
if (channel === 'Controller-Display') {
|
|
data = JSON.parse(message);
|
|
name = data.name;
|
|
visible = data.visible;
|
|
if (controllerLeft) {
|
|
if (name in controllerLeft.annotations) {
|
|
for (i = 0; i < controllerLeft.annotations[name].length; ++i) {
|
|
Overlays.editOverlay(controllerLeft.annotations[name][i], { visible: visible });
|
|
}
|
|
}
|
|
}
|
|
if (controllerRight) {
|
|
if (name in controllerRight.annotations) {
|
|
for (i = 0; i < controllerRight.annotations[name].length; ++i) {
|
|
Overlays.editOverlay(controllerRight.annotations[name][i], { visible: visible });
|
|
}
|
|
}
|
|
}
|
|
} else if (channel === 'Controller-Display-Parts') {
|
|
data = JSON.parse(message);
|
|
for (name in data) {
|
|
visible = data[name];
|
|
if (controllerLeft) {
|
|
controllerLeft.setPartVisible(name, visible);
|
|
}
|
|
if (controllerRight) {
|
|
controllerRight.setPartVisible(name, visible);
|
|
}
|
|
}
|
|
} else if (channel === 'Controller-Set-Part-Layer') {
|
|
data = JSON.parse(message);
|
|
for (name in data) {
|
|
var layer = data[name];
|
|
if (controllerLeft) {
|
|
controllerLeft.setLayerForPart(name, layer);
|
|
}
|
|
if (controllerRight) {
|
|
controllerRight.setLayerForPart(name, layer);
|
|
}
|
|
}
|
|
} else if (channel === 'Hifi-Object-Manipulation') {
|
|
if (HIDE_CONTROLLERS_ON_EQUIP) {
|
|
data = JSON.parse(message);
|
|
visible = data.action !== 'equip';
|
|
if (data.joint === "LeftHand") {
|
|
self.setLeftVisible(visible);
|
|
} else if (data.joint === "RightHand") {
|
|
self.setRightVisible(visible);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
};
|
|
|
|
Messages.messageReceived.connect(handleMessages);
|
|
|
|
this.deleteControllerDisplays = function() {
|
|
if (controllerLeft) {
|
|
deleteControllerDisplay(controllerLeft);
|
|
controllerLeft = null;
|
|
}
|
|
if (controllerRight) {
|
|
deleteControllerDisplay(controllerRight);
|
|
controllerRight = null;
|
|
}
|
|
};
|
|
|
|
this.destroy = function() {
|
|
Messages.messageReceived.disconnect(handleMessages);
|
|
|
|
HMD.displayModeChanged.disconnect(updateControllers);
|
|
HMD.shouldShowHandControllersChanged.disconnect(updateControllers);
|
|
|
|
self.deleteControllerDisplays();
|
|
};
|
|
|
|
HMD.displayModeChanged.connect(updateControllers);
|
|
HMD.shouldShowHandControllersChanged.connect(updateControllers);
|
|
MyAvatar.sensorToWorldScaleChanged.connect(resizeControllers);
|
|
|
|
updateControllers();
|
|
};
|
|
|
|
var controllerDisplayManager = new ControllerDisplayManager();
|
|
|
|
Script.scriptEnding.connect(function () {
|
|
controllerDisplayManager.destroy();
|
|
});
|
|
|
|
}());
|