From 69bd4ccea262e09f2c08fae70a7bc199554cf851 Mon Sep 17 00:00:00 2001 From: "Anthony J. Thibault" Date: Mon, 24 Oct 2016 18:16:05 -0700 Subject: [PATCH] Show hand controllers when out-of-body for more then 3/4 of a second Without the timer, the hands can flicker in and out of visibility when lightly brushing against collision. --- interface/src/avatar/MyAvatar.cpp | 28 ++++++++++++++++++++++++++ interface/src/avatar/MyAvatar.h | 6 +++++- interface/src/avatar/SkeletonModel.cpp | 4 ++-- 3 files changed, 35 insertions(+), 3 deletions(-) diff --git a/interface/src/avatar/MyAvatar.cpp b/interface/src/avatar/MyAvatar.cpp index 01e19fc6e9..dabffb4307 100755 --- a/interface/src/avatar/MyAvatar.cpp +++ b/interface/src/avatar/MyAvatar.cpp @@ -88,6 +88,8 @@ const float MyAvatar::ZOOM_DEFAULT = 1.5f; extern glm::vec3 TRUNCATE_IK_CAPSULE_POSITION; extern float TRUNCATE_IK_CAPSULE_LENGTH; extern float TRUNCATE_IK_CAPSULE_RADIUS; +extern float MIN_OUT_OF_BODY_DISTANCE; +extern float MAX_OUT_OF_BODY_DISTANCE; MyAvatar::MyAvatar(RigPointer rig) : Avatar(rig), @@ -365,6 +367,27 @@ void MyAvatar::update(float deltaTime) { simulate(deltaTime); + // Request to show the hand controllers if we're out-of-body for more then HAND_CONTROLLER_SHOW_TIME. + // Similarlly request to hide the controllers when we return to our bodies. + const float HAND_CONTROLLER_SHOW_TIME = 0.75f; + auto hmdInterface = DependencyManager::get(); + if (isOutOfBody() != _handControllerShow) { + _handControllerShowTimer += deltaTime; + if (_handControllerShowTimer > HAND_CONTROLLER_SHOW_TIME) { + if (isOutOfBody()) { + hmdInterface->requestShowHandControllers(); + _handControllerShow = true; + _handControllerShowTimer = 0.0f; + } else { + hmdInterface->requestHideHandControllers(); + _handControllerShow = false; + _handControllerShowTimer = 0.0f; + } + } + } else { + _handControllerShowTimer = 0.0f; + } + currentEnergy += energyChargeRate; currentEnergy -= getAccelerationEnergy(); currentEnergy -= getAudioEnergy(); @@ -2210,6 +2233,10 @@ glm::quat MyAvatar::getOrientationForAudio() { return quat(); } +bool MyAvatar::isOutOfBody() const { + return _follow._isOutOfBody; +} + void MyAvatar::setAudioListenerMode(AudioListenerMode audioListenerMode) { if (_audioListenerMode != audioListenerMode) { _audioListenerMode = audioListenerMode; @@ -2361,6 +2388,7 @@ void MyAvatar::FollowHelper::postPhysicsUpdate(MyAvatar& myAvatar) { glm::vec3 capsuleStart = myAvatar.getPosition() + Vectors::UNIT_Y * (TRUNCATE_IK_CAPSULE_LENGTH / 2.0f); glm::vec3 capsuleEnd = myAvatar.getPosition() - Vectors::UNIT_Y * (TRUNCATE_IK_CAPSULE_LENGTH / 2.0f); _isOutOfBody = !pointIsInsideCapsule(worldHMDPosition, capsuleStart, capsuleEnd, TRUNCATE_IK_CAPSULE_RADIUS); + _outOfBodyDistance = distanceFromCapsule(worldHMDPosition, capsuleStart, capsuleEnd, TRUNCATE_IK_CAPSULE_RADIUS); } float MyAvatar::getAccelerationEnergy() { diff --git a/interface/src/avatar/MyAvatar.h b/interface/src/avatar/MyAvatar.h index 340e877dd4..4ca7f65519 100644 --- a/interface/src/avatar/MyAvatar.h +++ b/interface/src/avatar/MyAvatar.h @@ -333,7 +333,7 @@ public slots: glm::vec3 getPositionForAudio(); glm::quat getOrientationForAudio(); - bool isOutOfBody() const { return _follow._isOutOfBody; } + bool isOutOfBody() const; signals: void audioListenerModeChanged(); @@ -467,6 +467,7 @@ private: }; uint8_t _activeBits { 0 }; bool _isOutOfBody { false }; + float _outOfBodyDistance { 0.0f }; void deactivate(); void deactivate(FollowType type); @@ -541,6 +542,9 @@ private: }; DebugDrawVertex _debugLineLoop[DEBUG_LINE_LOOP_SIZE]; size_t _debugLineLoopIndex { 0 }; + + bool _handControllerShow { false }; + float _handControllerShowTimer { 0.0f }; }; QScriptValue audioListenModeToScriptValue(QScriptEngine* engine, const AudioListenerMode& audioListenerMode); diff --git a/interface/src/avatar/SkeletonModel.cpp b/interface/src/avatar/SkeletonModel.cpp index 02ffb903a1..b1e0f31062 100644 --- a/interface/src/avatar/SkeletonModel.cpp +++ b/interface/src/avatar/SkeletonModel.cpp @@ -26,6 +26,8 @@ glm::vec3 TRUNCATE_IK_CAPSULE_POSITION(0.0f, 0.0f, 0.0f); float TRUNCATE_IK_CAPSULE_LENGTH = 1000.0f; float TRUNCATE_IK_CAPSULE_RADIUS = 0.25f; +float MIN_OUT_OF_BODY_DISTANCE = TRUNCATE_IK_CAPSULE_RADIUS - 0.1f; +float MAX_OUT_OF_BODY_DISTANCE = TRUNCATE_IK_CAPSULE_RADIUS + 0.1f; SkeletonModel::SkeletonModel(Avatar* owningAvatar, QObject* parent, RigPointer rig) : Model(rig, parent), @@ -165,8 +167,6 @@ void SkeletonModel::updateRig(float deltaTime, glm::mat4 parentTransform) { Rig::HandParameters handParams; // compute interp factor between in body and out of body hand positions. - const float MIN_OUT_OF_BODY_DISTANCE = TRUNCATE_IK_CAPSULE_RADIUS - 0.1f; - const float MAX_OUT_OF_BODY_DISTANCE = TRUNCATE_IK_CAPSULE_RADIUS + 0.1f; glm::vec3 capsuleStart = Vectors::UNIT_Y * (TRUNCATE_IK_CAPSULE_LENGTH / 2.0f); glm::vec3 capsuleEnd = -Vectors::UNIT_Y * (TRUNCATE_IK_CAPSULE_LENGTH / 2.0f); float outOfBodyAlpha = distanceFromCapsule(hmdPositionInRigSpace, capsuleStart, capsuleEnd, TRUNCATE_IK_CAPSULE_RADIUS);