From 44eb448cbe0f259f52fc161125e73d7f7f9864a3 Mon Sep 17 00:00:00 2001 From: "Anthony J. Thibault" Date: Fri, 18 Sep 2015 18:05:51 -0700 Subject: [PATCH 1/2] Hooked up isTalking flag to Rig and AnimGraph. --- interface/src/avatar/Head.cpp | 3 ++- interface/src/avatar/Head.h | 2 ++ interface/src/avatar/SkeletonModel.cpp | 2 ++ libraries/animation/src/Rig.cpp | 5 +++++ libraries/animation/src/Rig.h | 1 + 5 files changed, 12 insertions(+), 1 deletion(-) diff --git a/interface/src/avatar/Head.cpp b/interface/src/avatar/Head.cpp index 09ac893e65..a514eb4e8d 100644 --- a/interface/src/avatar/Head.cpp +++ b/interface/src/avatar/Head.cpp @@ -158,10 +158,11 @@ void Head::simulate(float deltaTime, bool isMine, bool billboard) { bool forceBlink = false; const float TALKING_LOUDNESS = 100.0f; const float BLINK_AFTER_TALKING = 0.25f; + _timeWithoutTalking += deltaTime; if ((_averageLoudness - _longTermAverageLoudness) > TALKING_LOUDNESS) { _timeWithoutTalking = 0.0f; - } else if (_timeWithoutTalking < BLINK_AFTER_TALKING && (_timeWithoutTalking += deltaTime) >= BLINK_AFTER_TALKING) { + } else if (_timeWithoutTalking < BLINK_AFTER_TALKING && _timeWithoutTalking >= BLINK_AFTER_TALKING) { forceBlink = true; } diff --git a/interface/src/avatar/Head.h b/interface/src/avatar/Head.h index 691775b029..1fbfceca92 100644 --- a/interface/src/avatar/Head.h +++ b/interface/src/avatar/Head.h @@ -102,6 +102,8 @@ public: void relaxLean(float deltaTime); void addLeanDeltas(float sideways, float forward); + + float getTimeWithoutTalking() const { return _timeWithoutTalking; } private: glm::vec3 calculateAverageEyePosition() const { return _leftEyePosition + (_rightEyePosition - _leftEyePosition ) * 0.5f; } diff --git a/interface/src/avatar/SkeletonModel.cpp b/interface/src/avatar/SkeletonModel.cpp index 3894a0ade9..27e61175eb 100644 --- a/interface/src/avatar/SkeletonModel.cpp +++ b/interface/src/avatar/SkeletonModel.cpp @@ -146,6 +146,8 @@ void SkeletonModel::updateRig(float deltaTime, glm::mat4 parentTransform) { headParams.leftEyeJointIndex = geometry.leftEyeJointIndex; headParams.rightEyeJointIndex = geometry.rightEyeJointIndex; + headParams.isTalking = head->getTimeWithoutTalking() <= 1.5f; + _rig->updateFromHeadParameters(headParams, deltaTime); Rig::HandParameters handParams; diff --git a/libraries/animation/src/Rig.cpp b/libraries/animation/src/Rig.cpp index 025cb5f3d1..1210313bdb 100644 --- a/libraries/animation/src/Rig.cpp +++ b/libraries/animation/src/Rig.cpp @@ -44,6 +44,7 @@ void Rig::HeadParameters::dump() const { qCDebug(animation, " neckJointIndex = %.d", neckJointIndex); qCDebug(animation, " leftEyeJointIndex = %.d", leftEyeJointIndex); qCDebug(animation, " rightEyeJointIndex = %.d", rightEyeJointIndex); + qCDebug(animation, " isTalking = %s", isTalking ? "true" : "false"); } void insertSorted(QList& handles, const AnimationHandlePointer& handle) { @@ -951,6 +952,10 @@ void Rig::updateFromHeadParameters(const HeadParameters& params, float dt) { updateNeckJoint(params.neckJointIndex, params); updateEyeJoints(params.leftEyeJointIndex, params.rightEyeJointIndex, params.modelTranslation, params.modelRotation, params.worldHeadOrientation, params.eyeLookAt, params.eyeSaccade); + + if (_enableAnimGraph) { + _animVars.set("isTalking", params.isTalking); + } } static const glm::vec3 X_AXIS(1.0f, 0.0f, 0.0f); diff --git a/libraries/animation/src/Rig.h b/libraries/animation/src/Rig.h index 9939f383b7..37e1d51a0a 100644 --- a/libraries/animation/src/Rig.h +++ b/libraries/animation/src/Rig.h @@ -72,6 +72,7 @@ public: int neckJointIndex = -1; int leftEyeJointIndex = -1; int rightEyeJointIndex = -1; + bool isTalking = false; void dump() const; }; From eadf212418cd58329e76d318bdd4fdf63511fee9 Mon Sep 17 00:00:00 2001 From: "Anthony J. Thibault" Date: Fri, 18 Sep 2015 18:31:53 -0700 Subject: [PATCH 2/2] Updated avatar.json with talking idle animation. --- interface/src/avatar/MyAvatar.cpp | 5 ++- libraries/animation/src/Rig.cpp | 1 + tests/animation/src/data/avatar.json | 53 ++++++++++++++++++++++++---- 3 files changed, 51 insertions(+), 8 deletions(-) diff --git a/interface/src/avatar/MyAvatar.cpp b/interface/src/avatar/MyAvatar.cpp index 69f7516430..ae483988e3 100644 --- a/interface/src/avatar/MyAvatar.cpp +++ b/interface/src/avatar/MyAvatar.cpp @@ -1299,10 +1299,13 @@ void MyAvatar::initAnimGraph() { // ik-avatar-hands.json // https://gist.githubusercontent.com/hyperlogic/04a02c47eb56d8bfaebb // + // ik-avatar-hands-idle.json + // https://gist.githubusercontent.com/hyperlogic/d951c78532e7a20557ad + // // or run a local web-server // python -m SimpleHTTPServer& //auto graphUrl = QUrl("http://localhost:8000/avatar.json"); - auto graphUrl = QUrl("https://gist.githubusercontent.com/hyperlogic/04a02c47eb56d8bfaebb/raw/72517b231f606b724c5169e02642e401f9af5a54/ik-avatar-hands.json"); + auto graphUrl = QUrl("https://gist.githubusercontent.com/hyperlogic/d951c78532e7a20557ad/raw/8275a99a859bbb9b42530c1c7ebfd024e63ba250/ik-avatar-hands-idle.json"); _rig->initAnimGraph(graphUrl, _skeletonModel.getGeometry()->getFBXGeometry()); } diff --git a/libraries/animation/src/Rig.cpp b/libraries/animation/src/Rig.cpp index 1210313bdb..b0ffd081c2 100644 --- a/libraries/animation/src/Rig.cpp +++ b/libraries/animation/src/Rig.cpp @@ -955,6 +955,7 @@ void Rig::updateFromHeadParameters(const HeadParameters& params, float dt) { if (_enableAnimGraph) { _animVars.set("isTalking", params.isTalking); + _animVars.set("notIsTalking", !params.isTalking); } } diff --git a/tests/animation/src/data/avatar.json b/tests/animation/src/data/avatar.json index d1f6166b3d..9c357ac845 100644 --- a/tests/animation/src/data/avatar.json +++ b/tests/animation/src/data/avatar.json @@ -451,15 +451,54 @@ "children": [ { "id": "idle", - "type": "clip", + "type": "stateMachine", "data": { - "url": "https://hifi-public.s3.amazonaws.com/ozan/anim/standard_anims/idle.fbx", - "startFrame": 0.0, - "endFrame": 90.0, - "timeScale": 1.0, - "loopFlag": true + "currentState": "idleStand", + "states": [ + { + "id": "idleStand", + "interpTarget": 6, + "interpDuration": 6, + "transitions": [ + { "var": "isTalking", "state": "idleTalk" } + ] + }, + { + "id": "idleTalk", + "interpTarget": 6, + "interpDuration": 6, + "transitions": [ + { "var": "notIsTalking", "state": "idleStand" } + ] + } + ] }, - "children": [] + "children": [ + { + "id": "idleStand", + "type": "clip", + "data": { + "url": "https://hifi-public.s3.amazonaws.com/ozan/anim/standard_anims/idle.fbx", + "startFrame": 0.0, + "endFrame": 90.0, + "timeScale": 1.0, + "loopFlag": true + }, + "children": [] + }, + { + "id": "idleTalk", + "type": "clip", + "data": { + "url": "http://hifi-public.s3.amazonaws.com/ozan/anim/talk/talk.fbx", + "startFrame": 0.0, + "endFrame": 801.0, + "timeScale": 1.0, + "loopFlag": true + }, + "children": [] + } + ] }, { "id": "walkFwd",