mirror of
https://github.com/overte-org/overte.git
synced 2025-04-26 15:36:21 +02:00
135 lines
4.9 KiB
JavaScript
135 lines
4.9 KiB
JavaScript
//
|
|
// nearTabletHighlight.js
|
|
//
|
|
// Highlight the tablet if a hand is near enough to grab it and it isn't grabbed.
|
|
//
|
|
// Created by David Rowe on 28 Aug 2018.
|
|
// Copyright 2018 High Fidelity, Inc.
|
|
//
|
|
// Distributed under the Apache License, Version 2.0.
|
|
// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html
|
|
//
|
|
|
|
/* global LEFT_HAND, RIGHT_HAND, makeDispatcherModuleParameters, makeRunningValues, enableDispatcherModule,
|
|
* disableDispatcherModule, getEnabledModuleByName */
|
|
|
|
Script.include("/~/system/libraries/controllerDispatcherUtils.js");
|
|
|
|
(function () {
|
|
|
|
"use strict";
|
|
|
|
var TABLET_GRABBABLE_SELECTION_NAME = "tabletGrabbableSelection";
|
|
var TABLET_GRABBABLE_SELECTION_STYLE = {
|
|
outlineUnoccludedColor: { red: 0, green: 180, blue: 239 }, // #00b4ef
|
|
outlineUnoccludedAlpha: 1,
|
|
outlineOccludedColor: { red: 0, green: 0, blue: 0 },
|
|
outlineOccludedAlpha: 0,
|
|
fillUnoccludedColor: { red: 0, green: 0, blue: 0 },
|
|
fillUnoccludedAlpha: 0,
|
|
fillOccludedColor: { red: 0, green: 0, blue: 0 },
|
|
fillOccludedAlpha: 0,
|
|
outlineWidth: 4,
|
|
isOutlineSmooth: false
|
|
};
|
|
|
|
var isTabletNearGrabbable = [false, false];
|
|
var isTabletHighlighted = false;
|
|
|
|
function setTabletNearGrabbable(hand, enabled) {
|
|
if (enabled === isTabletNearGrabbable[hand]) {
|
|
return;
|
|
}
|
|
|
|
isTabletNearGrabbable[hand] = enabled;
|
|
|
|
if (isTabletNearGrabbable[LEFT_HAND] || isTabletNearGrabbable[RIGHT_HAND]) {
|
|
if (!isTabletHighlighted) {
|
|
Selection.addToSelectedItemsList(TABLET_GRABBABLE_SELECTION_NAME, "overlay", HMD.tabletID);
|
|
isTabletHighlighted = true;
|
|
}
|
|
} else {
|
|
if (isTabletHighlighted) {
|
|
Selection.removeFromSelectedItemsList(TABLET_GRABBABLE_SELECTION_NAME, "overlay", HMD.tabletID);
|
|
isTabletHighlighted = false;
|
|
}
|
|
}
|
|
}
|
|
|
|
function NearTabletHighlight(hand) {
|
|
this.hand = hand;
|
|
|
|
this.parameters = makeDispatcherModuleParameters(
|
|
95,
|
|
this.hand === RIGHT_HAND ? ["rightHand"] : ["leftHand"],
|
|
[],
|
|
100
|
|
);
|
|
|
|
this.isEditing = function () {
|
|
var inEditModeModule = getEnabledModuleByName(this.hand === RIGHT_HAND
|
|
? "RightHandInEditMode" : "LeftHandInEditMode");
|
|
if (inEditModeModule && inEditModeModule.isEditing) {
|
|
return true;
|
|
}
|
|
var inVREditModeModule = getEnabledModuleByName(this.hand === RIGHT_HAND
|
|
? "RightHandInVREditMode" : "LeftHandInVREditMode");
|
|
if (inVREditModeModule && inVREditModeModule.isEditing) {
|
|
return true;
|
|
}
|
|
return false;
|
|
};
|
|
|
|
this.isNearTablet = function (controllerData) {
|
|
return HMD.tabletID && controllerData.nearbyOverlayIDs[this.hand].indexOf(HMD.tabletID) !== -1;
|
|
};
|
|
|
|
this.isReady = function (controllerData) {
|
|
if (!this.isEditing() && this.isNearTablet(controllerData)) {
|
|
return makeRunningValues(true, [], []);
|
|
}
|
|
setTabletNearGrabbable(this.hand, false);
|
|
return makeRunningValues(false, [], []);
|
|
};
|
|
|
|
this.run = function (controllerData) {
|
|
if (this.isEditing() || !this.isNearTablet(controllerData)) {
|
|
setTabletNearGrabbable(this.hand, false);
|
|
return makeRunningValues(false, [], []);
|
|
}
|
|
|
|
if (controllerData.triggerClicks[this.hand] || controllerData.secondaryValues[this.hand]) {
|
|
setTabletNearGrabbable(this.hand, false);
|
|
return makeRunningValues(false, [], []);
|
|
}
|
|
|
|
setTabletNearGrabbable(this.hand, true);
|
|
return makeRunningValues(true, [], []);
|
|
};
|
|
}
|
|
|
|
var leftNearTabletHighlight = new NearTabletHighlight(LEFT_HAND);
|
|
var rightNearTabletHighlight = new NearTabletHighlight(RIGHT_HAND);
|
|
enableDispatcherModule("LeftNearTabletHighlight", leftNearTabletHighlight);
|
|
enableDispatcherModule("RightNearTabletHighlight", rightNearTabletHighlight);
|
|
|
|
function onDisplayModeChanged() {
|
|
if (HMD.active) {
|
|
Selection.enableListHighlight(TABLET_GRABBABLE_SELECTION_NAME, TABLET_GRABBABLE_SELECTION_STYLE);
|
|
} else {
|
|
Selection.disableListHighlight(TABLET_GRABBABLE_SELECTION_NAME);
|
|
Selection.clearSelectedItemsList(TABLET_GRABBABLE_SELECTION_NAME);
|
|
}
|
|
}
|
|
HMD.displayModeChanged.connect(onDisplayModeChanged);
|
|
HMD.mountedChanged.connect(onDisplayModeChanged);
|
|
onDisplayModeChanged();
|
|
|
|
function cleanUp() {
|
|
disableDispatcherModule("LeftNearTabletHighlight");
|
|
disableDispatcherModule("RightNearTabletHighlight");
|
|
Selection.disableListHighlight(TABLET_GRABBABLE_SELECTION_NAME);
|
|
}
|
|
Script.scriptEnding.connect(cleanUp);
|
|
|
|
}());
|