From 0da3fb8eeea646fa55bf674837f8423169dbbc58 Mon Sep 17 00:00:00 2001 From: Anthony Thibault Date: Sun, 24 Apr 2016 18:50:14 -0700 Subject: [PATCH] Eye contact improvements * After eyes change targets there is now a minimum 1/3rd second delay before they will again. * Changing gaze from eye to mouth is less likely then switching between eyes. --- interface/src/avatar/MyAvatar.cpp | 46 ++++++++++++++++++++----------- interface/src/avatar/MyAvatar.h | 3 ++ 2 files changed, 33 insertions(+), 16 deletions(-) diff --git a/interface/src/avatar/MyAvatar.cpp b/interface/src/avatar/MyAvatar.cpp index b1107896a9..f61f64412c 100644 --- a/interface/src/avatar/MyAvatar.cpp +++ b/interface/src/avatar/MyAvatar.cpp @@ -317,6 +317,36 @@ void MyAvatar::update(float deltaTime) { } currentEnergy = max(0.0f, min(currentEnergy,1.0f)); emit energyChanged(currentEnergy); + + updateEyeContactTarget(deltaTime); +} + +void MyAvatar::updateEyeContactTarget(float deltaTime) { + + _eyeContactTargetTimer -= deltaTime; + if (_eyeContactTargetTimer < 0.0f) { + + const float CHANCE_OF_CHANGING_TARGET = 0.01f; + if (randFloat() < CHANCE_OF_CHANGING_TARGET) { + + float const FIFTY_FIFTY_CHANCE = 0.5f; + float const EYE_TO_MOUTH_CHANCE = 0.25f; + switch (_eyeContactTarget) { + case LEFT_EYE: + _eyeContactTarget = (randFloat() < EYE_TO_MOUTH_CHANCE) ? MOUTH : RIGHT_EYE; + break; + case RIGHT_EYE: + _eyeContactTarget = (randFloat() < EYE_TO_MOUTH_CHANCE) ? MOUTH : LEFT_EYE; + break; + case MOUTH: + _eyeContactTarget = (randFloat() < FIFTY_FIFTY_CHANCE) ? RIGHT_EYE : LEFT_EYE; + break; + } + + const float EYE_TARGET_DELAY_TIME = 0.33f; + _eyeContactTargetTimer = EYE_TARGET_DELAY_TIME; + } + } } extern QByteArray avatarStateToFrame(const AvatarData* _avatar); @@ -944,22 +974,6 @@ void MyAvatar::clearLookAtTargetAvatar() { } eyeContactTarget MyAvatar::getEyeContactTarget() { - float const CHANCE_OF_CHANGING_TARGET = 0.01f; - if (randFloat() < CHANCE_OF_CHANGING_TARGET) { - float const FIFTY_FIFTY_CHANCE = 0.5f; - switch (_eyeContactTarget) { - case LEFT_EYE: - _eyeContactTarget = (randFloat() < FIFTY_FIFTY_CHANCE) ? MOUTH : RIGHT_EYE; - break; - case RIGHT_EYE: - _eyeContactTarget = (randFloat() < FIFTY_FIFTY_CHANCE) ? LEFT_EYE : MOUTH; - break; - case MOUTH: - _eyeContactTarget = (randFloat() < FIFTY_FIFTY_CHANCE) ? RIGHT_EYE : LEFT_EYE; - break; - } - } - return _eyeContactTarget; } diff --git a/interface/src/avatar/MyAvatar.h b/interface/src/avatar/MyAvatar.h index 35caabe0f7..69bb7ea4c2 100644 --- a/interface/src/avatar/MyAvatar.h +++ b/interface/src/avatar/MyAvatar.h @@ -331,6 +331,8 @@ private: bool cameraInsideHead() const; + void updateEyeContactTarget(float deltaTime); + // These are made private for MyAvatar so that you will use the "use" methods instead virtual void setSkeletonModelURL(const QUrl& skeletonModelURL) override; @@ -371,6 +373,7 @@ private: float _oculusYawOffset; eyeContactTarget _eyeContactTarget; + float _eyeContactTargetTimer { 0.0f }; glm::vec3 _trackedHeadPosition;