195 lines · 7.0 KB · JavaScript
RawDownload
////  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, Script, HMD, Controller,   MyAvatar, Overlays, TOUCH_CONTROLLER_CONFIGURATION_LEFT, TOUCH_CONTROLLER_CONFIGURATION_RIGHT, Messages *//* 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();}); }());