diff --git a/scripts/system/html/js/miniTablet.js b/scripts/system/html/js/miniTablet.js
index a966cbb139..e44a454a80 100644
--- a/scripts/system/html/js/miniTablet.js
+++ b/scripts/system/html/js/miniTablet.js
@@ -18,6 +18,7 @@
var // EventBridge
READY_MESSAGE = "ready", // Engine <== Dialog
HOVER_MESSAGE = "hover", // Engine <== Dialog
+ UNHOVER_MESSAGE = "unhover", // Engine <== Dialog
MUTE_MESSAGE = "mute", // Engine <=> Dialog
GOTO_MESSAGE = "goto", // Engine <=> Dialog
EXPAND_MESSAGE = "expand", // Engine <== Dialog
@@ -73,9 +74,24 @@
}
}
+ function onBodyHover() {
+ EventBridge.emitWebEvent(JSON.stringify({
+ type: HOVER_MESSAGE,
+ target: "body"
+ }));
+ }
+
+ function onBodyUnhover() {
+ EventBridge.emitWebEvent(JSON.stringify({
+ type: UNHOVER_MESSAGE,
+ target: "body"
+ }));
+ }
+
function onButtonHover() {
EventBridge.emitWebEvent(JSON.stringify({
- type: HOVER_MESSAGE
+ type: HOVER_MESSAGE,
+ target: "button"
}));
clearUnhover();
}
@@ -128,6 +144,9 @@
connectEventBridge();
+ document.body.addEventListener("mouseenter", onBodyHover, false);
+ document.body.addEventListener("mouseleave", onBodyUnhover, false);
+
muteButton.addEventListener("mouseenter", onButtonHover, false);
gotoButton.addEventListener("mouseenter", onButtonHover, false);
expandButton.addEventListener("mouseenter", onButtonHover, false);
diff --git a/scripts/system/miniTablet.js b/scripts/system/miniTablet.js
index df428c9c52..2482efec8d 100644
--- a/scripts/system/miniTablet.js
+++ b/scripts/system/miniTablet.js
@@ -8,13 +8,14 @@
// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html
//
-/* global getTabletWidthFromSettings */
+/* global getTabletWidthFromSettings, TRIGGER_OFF_VALUE */
(function () {
"use strict";
Script.include("./libraries/utils.js");
+ Script.include("./libraries/controllerDispatcherUtils.js");
var UI,
ui = null,
@@ -147,9 +148,13 @@
miniTargetWidth,
miniTargetLocalRotation,
+ // Laser pointing at.
+ isBodyHovered = false,
+
// EventBridge.
READY_MESSAGE = "ready", // Engine <== Dialog
HOVER_MESSAGE = "hover", // Engine <== Dialog
+ UNHOVER_MESSAGE = "unhover", // Engine <== Dialog
MUTE_MESSAGE = "mute", // Engine <=> Dialog
GOTO_MESSAGE = "goto", // Engine <=> Dialog
EXPAND_MESSAGE = "expand", // Engine <== Dialog
@@ -196,8 +201,19 @@
setGotoIcon();
break;
case HOVER_MESSAGE:
- // Audio feedback.
- playSound(hoverSound, HOVER_VOLUME);
+ if (message.target === "body") {
+ // Laser status.
+ isBodyHovered = true;
+ } else if (message.target === "button") {
+ // Audio feedback.
+ playSound(hoverSound, HOVER_VOLUME);
+ }
+ break;
+ case UNHOVER_MESSAGE:
+ if (message.target === "body") {
+ // Laser status.
+ isBodyHovered = false;
+ }
break;
case MUTE_MESSAGE:
// Toggle mute.
@@ -253,6 +269,10 @@
};
}
+ function isLaserPointingAt() {
+ return isBodyHovered;
+ }
+
function show(hand) {
var initialScale = 0.01; // Start very small.
@@ -420,6 +440,7 @@
getUIPositionAndRotation: getUIPositionAndRotation,
getMiniTabletID: getMiniTabletID,
getMiniTabletProperties: getMiniTabletProperties,
+ isLaserPointingAt: isLaserPointingAt,
updateMutedStatus: updateMutedStatus,
show: show,
size: size,
@@ -509,32 +530,49 @@
function shouldShowMini(hand) {
// Should show mini tablet if it would be oriented toward the camera.
- var pose,
+ var show,
+ pose,
jointIndex,
handPosition,
handOrientation,
uiPositionAndOrientation,
miniPosition,
miniOrientation,
- miniToCameraDirection;
+ miniToCameraDirection,
+ cameraToHand;
+ // Shouldn't show mini tablet if hand isn't being controlled.
pose = Controller.getPoseValue(hand === LEFT_HAND ? Controller.Standard.LeftHand : Controller.Standard.RightHand);
- if (!pose.valid) {
- return false;
+ show = pose.valid;
+
+ // Shouldn't show mini tablet on hand if that hand's trigger is pressed (i.e., laser is searching or grabbing
+ // something) or the other hand's trigger is pressed unless it is pointing at the mini tablet.
+ if (show) {
+ show = Controller.getValue(hand === LEFT_HAND ? Controller.Standard.LT : Controller.Standard.RT) <
+ TRIGGER_OFF_VALUE
+ && (Controller.getValue(hand === LEFT_HAND ? Controller.Standard.RT : Controller.Standard.LT) <
+ TRIGGER_OFF_VALUE || ui.isLaserPointingAt());
+ }
+
+ // Should show mini tablet if it would be oriented toward the camera.
+ if (show) {
+ jointIndex = handJointIndex(hand);
+ handPosition = Vec3.sum(MyAvatar.position,
+ Vec3.multiplyQbyV(MyAvatar.orientation, MyAvatar.getAbsoluteJointTranslationInObjectFrame(jointIndex)));
+ handOrientation =
+ Quat.multiply(MyAvatar.orientation, MyAvatar.getAbsoluteJointRotationInObjectFrame(jointIndex));
+ uiPositionAndOrientation = ui.getUIPositionAndRotation(hand);
+ miniPosition = Vec3.sum(handPosition, Vec3.multiply(MyAvatar.scale,
+ Vec3.multiplyQbyV(handOrientation, uiPositionAndOrientation.position)));
+ miniOrientation = Quat.multiply(handOrientation, uiPositionAndOrientation.rotation);
+ miniToCameraDirection = Vec3.normalize(Vec3.subtract(Camera.position, miniPosition));
+ show = Vec3.dot(miniToCameraDirection, Quat.getForward(miniOrientation)) > MIN_HAND_CAMERA_ANGLE_COS;
+ cameraToHand = -Vec3.dot(miniToCameraDirection, Quat.getForward(Camera.orientation));
}
- jointIndex = handJointIndex(hand);
- handPosition = Vec3.sum(MyAvatar.position,
- Vec3.multiplyQbyV(MyAvatar.orientation, MyAvatar.getAbsoluteJointTranslationInObjectFrame(jointIndex)));
- handOrientation = Quat.multiply(MyAvatar.orientation, MyAvatar.getAbsoluteJointRotationInObjectFrame(jointIndex));
- uiPositionAndOrientation = ui.getUIPositionAndRotation(hand);
- miniPosition = Vec3.sum(handPosition, Vec3.multiply(MyAvatar.scale,
- Vec3.multiplyQbyV(handOrientation, uiPositionAndOrientation.position)));
- miniOrientation = Quat.multiply(handOrientation, uiPositionAndOrientation.rotation);
- miniToCameraDirection = Vec3.normalize(Vec3.subtract(Camera.position, miniPosition));
return {
- show: Vec3.dot(miniToCameraDirection, Quat.getForward(miniOrientation)) > MIN_HAND_CAMERA_ANGLE_COS,
- cameraToHand: -Vec3.dot(miniToCameraDirection, Quat.getForward(Camera.orientation))
+ show: show,
+ cameraToHand: cameraToHand
};
}