Merge pull request #8654 from ZappoMan/betterAway

fix away HMD unmouted logic
This commit is contained in:
Brad Hefta-Gaub 2016-10-11 20:35:08 -07:00 committed by GitHub
commit 8ac31a041d
2 changed files with 73 additions and 35 deletions

View file

@ -635,7 +635,11 @@ void OpenVrDisplayPlugin::postPreview() {
_nextSimPoseData = nextSim;
});
_nextRenderPoseData = nextRender;
// FIXME - this looks wrong!
_hmdActivityLevel = vr::k_EDeviceActivityLevel_UserInteraction; // _system->GetTrackedDeviceActivityLevel(vr::k_unTrackedDeviceIndex_Hmd);
#else
_hmdActivityLevel = _system->GetTrackedDeviceActivityLevel(vr::k_unTrackedDeviceIndex_Hmd);
#endif
}

View file

@ -16,6 +16,7 @@
(function() { // BEGIN LOCAL_SCOPE
var BASIC_TIMER_INTERVAL = 50; // 50ms = 20hz
var OVERLAY_WIDTH = 1920;
var OVERLAY_HEIGHT = 1080;
var OVERLAY_DATA = {
@ -49,6 +50,21 @@ var AWAY_INTRO = {
endFrame: 83.0
};
// MAIN CONTROL
var isEnabled = true;
var wasMuted; // unknonwn?
var isAway = false; // we start in the un-away state
var wasOverlaysVisible = Menu.isOptionChecked("Overlays");
var eventMappingName = "io.highfidelity.away"; // goActive on hand controller button events, too.
var eventMapping = Controller.newMapping(eventMappingName);
var avatarPosition = MyAvatar.position;
var wasHmdMounted = HMD.mounted;
// some intervals we may create/delete
var avatarMovedInterval;
// prefetch the kneel animation and hold a ref so it's always resident in memory when we need it.
var _animation = AnimationCache.prefetch(AWAY_INTRO.url);
@ -125,41 +141,28 @@ function maybeMoveOverlay() {
var halfWayBetweenOldAndLookAt = Vec3.multiply(lookAtChange, EASE_BY_RATIO);
var newOverlayPosition = Vec3.sum(lastOverlayPosition, halfWayBetweenOldAndLookAt);
lastOverlayPosition = newOverlayPosition;
var actualOverlayPositon = moveCloserToCamera(lastOverlayPosition);
Overlays.editOverlay(overlayHMD, { visible: true, position: actualOverlayPositon });
// make sure desktop version is hidden
Overlays.editOverlay(overlay, { visible: false });
// also remember avatar position
avatarPosition = MyAvatar.position;
}
}
}
function ifAvatarMovedGoActive() {
if (Vec3.distance(MyAvatar.position, avatarPosition) > AVATAR_MOVE_FOR_ACTIVE_DISTANCE) {
var newAvatarPosition = MyAvatar.position;
if (Vec3.distance(newAvatarPosition, avatarPosition) > AVATAR_MOVE_FOR_ACTIVE_DISTANCE) {
goActive();
}
avatarPosition = newAvatarPosition;
}
// MAIN CONTROL
var isEnabled = true;
var wasMuted, isAway;
var wasOverlaysVisible = Menu.isOptionChecked("Overlays");
var eventMappingName = "io.highfidelity.away"; // goActive on hand controller button events, too.
var eventMapping = Controller.newMapping(eventMappingName);
var avatarPosition = MyAvatar.position;
// backward compatible version of getting HMD.mounted, so it works in old clients
function safeGetHMDMounted() {
if (HMD.mounted === undefined) {
return true;
}
return HMD.mounted;
}
var wasHmdMounted = safeGetHMDMounted();
function goAway() {
function goAway(fromStartup) {
if (!isEnabled || isAway) {
return;
}
@ -167,7 +170,6 @@ function goAway() {
UserActivityLogger.toggledAway(true);
isAway = true;
print('going "away"');
wasMuted = AudioDevice.getMuted();
if (!wasMuted) {
AudioDevice.toggleMute();
@ -189,10 +191,21 @@ function goAway() {
// For HMD, the hmd preview will show the system mouse because of allowMouseCapture,
// but we want to turn off our Reticle so that we don't get two in preview and a stuck one in headset.
Reticle.visible = !HMD.active;
wasHmdMounted = safeGetHMDMounted(); // always remember the correct state
wasHmdMounted = HMD.mounted; // always remember the correct state
avatarPosition = MyAvatar.position;
Script.update.connect(ifAvatarMovedGoActive);
// If we're entering away mode from some other state than startup, then we create our move timer immediately.
// However if we're just stating up, we need to delay this process so that we don't think the initial teleport
// is actually a move.
if (fromStartup === undefined || fromStartup === false) {
avatarMovedInterval = Script.setInterval(ifAvatarMovedGoActive, BASIC_TIMER_INTERVAL);
} else {
var WAIT_FOR_MOVE_ON_STARTUP = 3000; // 3 seconds
Script.setTimeout(function() {
avatarMovedInterval = Script.setInterval(ifAvatarMovedGoActive, BASIC_TIMER_INTERVAL);
}, WAIT_FOR_MOVE_ON_STARTUP);
}
}
function goActive() {
@ -203,7 +216,6 @@ function goActive() {
UserActivityLogger.toggledAway(false);
isAway = false;
print('going "active"');
if (!wasMuted) {
AudioDevice.toggleMute();
}
@ -230,9 +242,9 @@ function goActive() {
if (HMD.active) {
Reticle.position = HMD.getHUDLookAtPosition2D();
}
wasHmdMounted = safeGetHMDMounted(); // always remember the correct state
wasHmdMounted = HMD.mounted; // always remember the correct state
Script.update.disconnect(ifAvatarMovedGoActive);
Script.clearInterval(avatarMovedInterval);
}
function maybeGoActive(event) {
@ -250,10 +262,12 @@ var wasHmdActive = HMD.active;
var wasMouseCaptured = Reticle.mouseCaptured;
function maybeGoAway() {
// If our active state change (went to or from HMD mode), and we are now in the HMD, go into away
if (HMD.active !== wasHmdActive) {
wasHmdActive = !wasHmdActive;
if (wasHmdActive) {
goAway();
return;
}
}
@ -264,19 +278,30 @@ function maybeGoAway() {
wasMouseCaptured = !wasMouseCaptured;
if (!wasMouseCaptured) {
goAway();
return;
}
}
// If you've removed your HMD from your head, and we can detect it, we will also go away...
var hmdMounted = safeGetHMDMounted();
if (HMD.active && !hmdMounted && wasHmdMounted) {
wasHmdMounted = hmdMounted;
goAway();
if (HMD.mounted != wasHmdMounted) {
wasHmdMounted = HMD.mounted;
print("HMD mounted changed...");
// We're putting the HMD on... switch to those devices
if (HMD.mounted) {
print("NOW mounted...");
} else {
print("HMD NOW un-mounted...");
if (HMD.active) {
goAway();
return;
}
}
}
}
function setEnabled(value) {
print("setting away enabled: ", value);
if (!value) {
goActive();
}
@ -293,9 +318,12 @@ var handleMessage = function(channel, message, sender) {
Messages.subscribe(CHANNEL_AWAY_ENABLE);
Messages.messageReceived.connect(handleMessage);
Script.update.connect(maybeMoveOverlay);
var maybeIntervalTimer = Script.setInterval(function(){
maybeMoveOverlay();
maybeGoAway();
}, BASIC_TIMER_INTERVAL);
Script.update.connect(maybeGoAway);
Controller.mousePressEvent.connect(goActive);
Controller.keyPressEvent.connect(maybeGoActive);
// Note peek() so as to not interfere with other mappings.
@ -316,11 +344,17 @@ eventMapping.from(Controller.Standard.Start).peek().to(goActive);
Controller.enableMapping(eventMappingName);
Script.scriptEnding.connect(function () {
Script.update.disconnect(maybeGoAway);
Script.clearInterval(maybeIntervalTimer);
goActive();
Controller.disableMapping(eventMappingName);
Controller.mousePressEvent.disconnect(goActive);
Controller.keyPressEvent.disconnect(maybeGoActive);
});
if (HMD.active && !HMD.mounted) {
print("Starting script, while HMD is active and not mounted...");
goAway(true);
}
}()); // END LOCAL_SCOPE