138 lines · 4.9 KB · JavaScript
RawDownload
"use strict"; //  Distributed under the Apache License, Version 2.0.//  See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html /* global Script, makeRunningValues, enableDispatcherModule, disableDispatcherModule,   makeDispatcherModuleParameters, handsAreTracked, Controller, Vec3, Tablet, HMD, MyAvatar*/ Script.include("/~/system/libraries/controllerDispatcherUtils.js");Script.include("/~/system/libraries/controllers.js"); (function() {     var controllerStandard = Controller.Standard;     function TrackedHandTablet() {        this.mappingName = 'hand-track-tablet-' + Math.random();        this.inputMapping = Controller.newMapping(this.mappingName);        this.leftIndexPos = null;        this.leftThumbPos = null;        this.rightIndexPos = null;        this.rightThumbPos = null;        this.touchOnBelowDistance = 0.016;        this.touchOffAboveDistance = 0.045;         this.gestureCompleted = false;        this.previousGestureCompleted = false;         this.parameters = makeDispatcherModuleParameters(            70,            ["rightHand", "leftHand"],            [],            100);         this.checkForGesture = function () {            if (this.leftThumbPos && this.leftIndexPos && this.rightThumbPos && this.rightIndexPos) {                var leftTipDistance = Vec3.distance(this.leftThumbPos, this.leftIndexPos);                var rightTipDistance = Vec3.distance(this.rightThumbPos, this.rightIndexPos);                if (leftTipDistance < this.touchOnBelowDistance && rightTipDistance < this.touchOnBelowDistance) {                    this.gestureCompleted = true;                } else if (leftTipDistance > this.touchOffAboveDistance || rightTipDistance > this.touchOffAboveDistance) {                    this.gestureCompleted = false;                } // else don't change gestureCompleted            } else {                this.gestureCompleted = false;            }             if (this.gestureCompleted && !this.previousGestureCompleted) {                var tablet = Tablet.getTablet("com.highfidelity.interface.tablet.system");                if (HMD.showTablet) {                    HMD.closeTablet(false);                } else if (!HMD.showTablet && !tablet.toolbarMode && !MyAvatar.isAway) {                    tablet.gotoHomeScreen();                    HMD.openTablet(false);                }            }             this.previousGestureCompleted = this.gestureCompleted;        };         this.leftIndexChanged = function (pose) {            if (pose.valid) {                this.leftIndexPos = pose.translation;            } else {                this.leftIndexPos = null;            }            this.checkForGesture();        };         this.leftThumbChanged = function (pose) {            if (pose.valid) {                this.leftThumbPos = pose.translation;            } else {                this.leftThumbPos = null;            }            this.checkForGesture();        };         this.rightIndexChanged = function (pose) {            if (pose.valid) {                this.rightIndexPos = pose.translation;            } else {                this.rightIndexPos = null;            }            this.checkForGesture();        };         this.rightThumbChanged = function (pose) {            if (pose.valid) {                this.rightThumbPos = pose.translation;            } else {                this.rightThumbPos = null;            }            this.checkForGesture();        };         this.isReady = function (controllerData) {            return makeRunningValues(handsAreTracked() && this.gestureCompleted, [], []);        };         this.run = function (controllerData) {            return this.isReady(controllerData);        };         this.setup = function () {            var _this = this;            this.inputMapping.from(controllerStandard.LeftHandIndex4).peek().to(function (pose) {                _this.leftIndexChanged(pose);            });            this.inputMapping.from(controllerStandard.LeftHandThumb4).peek().to(function (pose) {                _this.leftThumbChanged(pose);            });            this.inputMapping.from(controllerStandard.RightHandIndex4).peek().to(function (pose) {                _this.rightIndexChanged(pose);            });            this.inputMapping.from(controllerStandard.RightHandThumb4).peek().to(function (pose) {                _this.rightThumbChanged(pose);            });             Controller.enableMapping(this.mappingName);        };         this.cleanUp = function () {            this.inputMapping.disable();        };    }     var trackedHandWalk = new TrackedHandTablet();    trackedHandWalk.setup();    enableDispatcherModule("TrackedHandTablet", trackedHandWalk);     function cleanup() {        trackedHandWalk.cleanUp();        disableDispatcherModule("TrackedHandTablet");    }    Script.scriptEnding.connect(cleanup);}());