From f3ae2280302f5e6da31202f9f01d44babd262927 Mon Sep 17 00:00:00 2001 From: barnold1953 Date: Tue, 22 Jul 2014 13:46:29 -0700 Subject: [PATCH] Moved some FaceShift stuff to FacialAnimationData. Made use of FacialAnimationData --- interface/src/avatar/Head.cpp | 11 +++++------ interface/src/devices/Faceshift.cpp | 12 ------------ interface/src/devices/Faceshift.h | 3 --- libraries/animation/src/FacialAnimationData.cpp | 16 ++++++++++++++++ libraries/animation/src/FacialAnimationData.h | 8 +++++++- libraries/avatars/src/AvatarData.cpp | 16 ++++++++++------ libraries/avatars/src/AvatarData.h | 5 +++++ libraries/avatars/src/HeadData.cpp | 6 ++++++ libraries/avatars/src/HeadData.h | 10 ++++++++-- 9 files changed, 57 insertions(+), 30 deletions(-) diff --git a/interface/src/avatar/Head.cpp b/interface/src/avatar/Head.cpp index ee242d179a..814377b3d2 100644 --- a/interface/src/avatar/Head.cpp +++ b/interface/src/avatar/Head.cpp @@ -66,7 +66,7 @@ void Head::simulate(float deltaTime, bool isMine, bool billboard) { if (isMine) { FaceTracker* faceTracker = Application::getInstance()->getActiveFaceTracker(); if ((_isFaceshiftConnected = faceTracker)) { - _blendshapeCoefficients = faceTracker->getBlendshapeCoefficients(); + _facialAnimationData->setBlendshapeCoefficients(faceTracker->getBlendshapeCoefficients()); _isFaceshiftConnected = true; } } @@ -141,11 +141,10 @@ void Head::simulate(float deltaTime, bool isMine, bool billboard) { // use data to update fake Faceshift blendshape coefficients const float JAW_OPEN_SCALE = 10.f; - Application::getInstance()->getFaceshift()->updateFakeCoefficients(_leftEyeBlink, - _rightEyeBlink, - _browAudioLift, - glm::clamp(log(_averageLoudness) / JAW_OPEN_SCALE, 0.0f, 1.0f), - _blendshapeCoefficients); + _facialAnimationData->updateFakeCoefficients(_leftEyeBlink, + _rightEyeBlink, + _browAudioLift, + glm::clamp(log(_averageLoudness) / JAW_OPEN_SCALE, 0.0f, 1.0f)); } if (!isMine) { diff --git a/interface/src/devices/Faceshift.cpp b/interface/src/devices/Faceshift.cpp index 4105b17652..40ee12af86 100644 --- a/interface/src/devices/Faceshift.cpp +++ b/interface/src/devices/Faceshift.cpp @@ -93,18 +93,6 @@ void Faceshift::reset() { _longTermAverageInitialized = false; } -void Faceshift::updateFakeCoefficients(float leftBlink, float rightBlink, float browUp, - float jawOpen, QVector& coefficients) const { - coefficients.resize(max((int)coefficients.size(), _facialAnimationData._jawOpenIndex + 1)); - qFill(coefficients.begin(), coefficients.end(), 0.0f); - coefficients[_facialAnimationData._leftBlinkIndex] = leftBlink; - coefficients[_facialAnimationData._rightBlinkIndex] = rightBlink; - coefficients[_facialAnimationData._browUpCenterIndex] = browUp; - coefficients[_facialAnimationData._browUpLeftIndex] = browUp; - coefficients[_facialAnimationData._browUpRightIndex] = browUp; - coefficients[_facialAnimationData._jawOpenIndex] = jawOpen; -} - void Faceshift::setTCPEnabled(bool enabled) { if ((_tcpEnabled = enabled)) { connectSocket(); diff --git a/interface/src/devices/Faceshift.h b/interface/src/devices/Faceshift.h index 87fd1076ee..2b720c843d 100644 --- a/interface/src/devices/Faceshift.h +++ b/interface/src/devices/Faceshift.h @@ -61,9 +61,6 @@ public: void update(); void reset(); - void updateFakeCoefficients(float leftBlink, float rightBlink, float browUp, - float jawOpen, QVector& coefficients) const; - signals: void connectionStateChanged(); diff --git a/libraries/animation/src/FacialAnimationData.cpp b/libraries/animation/src/FacialAnimationData.cpp index 0f45675083..974cdec66f 100644 --- a/libraries/animation/src/FacialAnimationData.cpp +++ b/libraries/animation/src/FacialAnimationData.cpp @@ -11,6 +11,10 @@ #include "FacialAnimationData.h" +#ifndef max +inline int max(int a, int b) { return a > b ? a : b; } +#endif + FacialAnimationData::FacialAnimationData() :_leftBlinkIndex(0), // see http://support.faceshift.com/support/articles/35129-export-of-blendshapes _rightBlinkIndex(1), _leftEyeOpenIndex(8), @@ -27,4 +31,16 @@ _jawOpenIndex(21) { float FacialAnimationData::getBlendshapeCoefficient(int index) const { return (index >= 0 && index < (int)_blendshapeCoefficients.size()) ? _blendshapeCoefficients[index] : 0.0f; +} + +void FacialAnimationData::updateFakeCoefficients(float leftBlink, float rightBlink, float browUp, + float jawOpen) { + _blendshapeCoefficients.resize(max((int)_blendshapeCoefficients.size(), _jawOpenIndex + 1)); + qFill(_blendshapeCoefficients.begin(), _blendshapeCoefficients.end(), 0.0f); + _blendshapeCoefficients[_leftBlinkIndex] = leftBlink; + _blendshapeCoefficients[_rightBlinkIndex] = rightBlink; + _blendshapeCoefficients[_browUpCenterIndex] = browUp; + _blendshapeCoefficients[_browUpLeftIndex] = browUp; + _blendshapeCoefficients[_browUpRightIndex] = browUp; + _blendshapeCoefficients[_jawOpenIndex] = jawOpen; } \ No newline at end of file diff --git a/libraries/animation/src/FacialAnimationData.h b/libraries/animation/src/FacialAnimationData.h index c8d740c1c9..514fd5a55f 100644 --- a/libraries/animation/src/FacialAnimationData.h +++ b/libraries/animation/src/FacialAnimationData.h @@ -21,6 +21,8 @@ class FacialAnimationData : public QObject { public: friend class Faceshift; + friend class HeadData; + friend class AvatarData; FacialAnimationData(); @@ -39,6 +41,11 @@ public: float getMouthSmileLeft() const { return getBlendshapeCoefficient(_mouthSmileLeftIndex); } float getMouthSmileRight() const { return getBlendshapeCoefficient(_mouthSmileRightIndex); } + void updateFakeCoefficients(float leftBlink, float rightBlink, float browUp, float jawOpen); + + void setBlendshapeCoefficients(const QVector& coefficients) { _blendshapeCoefficients = coefficients; } + const QVector& getBlendshapeCoefficients() const { return _blendshapeCoefficients; } + private: float getBlendshapeCoefficient(int index) const; @@ -58,7 +65,6 @@ private: int _jawOpenIndex; - //Only used by agents, since FaceTracker has its own _blendshapeCoefficients; QVector _blendshapeCoefficients; }; diff --git a/libraries/avatars/src/AvatarData.cpp b/libraries/avatars/src/AvatarData.cpp index 6cfa4ba488..fc5b762a0f 100644 --- a/libraries/avatars/src/AvatarData.cpp +++ b/libraries/avatars/src/AvatarData.cpp @@ -29,6 +29,8 @@ #include "AvatarData.h" +#include "../animation/src/FacialAnimationData.h" + quint64 DEFAULT_FILTERED_LOG_EXPIRY = 2 * USECS_PER_SECOND; using namespace std; @@ -151,10 +153,12 @@ QByteArray AvatarData::toByteArray() { memcpy(destinationBuffer, &_headData->_browAudioLift, sizeof(float)); destinationBuffer += sizeof(float); - *destinationBuffer++ = _headData->_blendshapeCoefficients.size(); - memcpy(destinationBuffer, _headData->_blendshapeCoefficients.data(), - _headData->_blendshapeCoefficients.size() * sizeof(float)); - destinationBuffer += _headData->_blendshapeCoefficients.size() * sizeof(float); + const QVector& blendshapeCoefficients = _headData->_facialAnimationData->getBlendshapeCoefficients(); + + *destinationBuffer++ = blendshapeCoefficients.size(); + memcpy(destinationBuffer, blendshapeCoefficients.data(), + blendshapeCoefficients.size() * sizeof(float)); + destinationBuffer += blendshapeCoefficients.size() * sizeof(float); } // pupil dilation @@ -429,8 +433,8 @@ int AvatarData::parseDataAtOffset(const QByteArray& packet, int offset) { return maxAvailableSize; } - _headData->_blendshapeCoefficients.resize(numCoefficients); - memcpy(_headData->_blendshapeCoefficients.data(), sourceBuffer, blendDataSize); + _headData->_facialAnimationData->_blendshapeCoefficients.resize(numCoefficients); + memcpy(_headData->_facialAnimationData->_blendshapeCoefficients.data(), sourceBuffer, blendDataSize); sourceBuffer += numCoefficients * sizeof(float); //bitItemsDataSize = 4 * sizeof(float) + 1 + blendDataSize; diff --git a/libraries/avatars/src/AvatarData.h b/libraries/avatars/src/AvatarData.h index 1b8f6e6007..b1b48e3941 100755 --- a/libraries/avatars/src/AvatarData.h +++ b/libraries/avatars/src/AvatarData.h @@ -206,6 +206,11 @@ public: Q_INVOKABLE virtual QStringList getJointNames() const { return _jointNames; } + // Facial Animation + Q_INVOKABLE void setLeftEyebrow(float f) { + _headData->setLeftEyebrow(f); + } + // key state void setKeyState(KeyState s) { _keyState = s; } KeyState keyState() const { return _keyState; } diff --git a/libraries/avatars/src/HeadData.cpp b/libraries/avatars/src/HeadData.cpp index c691a2c28a..1f2bb73834 100644 --- a/libraries/avatars/src/HeadData.cpp +++ b/libraries/avatars/src/HeadData.cpp @@ -16,6 +16,8 @@ #include "AvatarData.h" #include "HeadData.h" +#include "../animation/src/FacialAnimationData.h" + HeadData::HeadData(AvatarData* owningAvatar) : _baseYaw(0.0f), _basePitch(0.0f), @@ -29,6 +31,7 @@ HeadData::HeadData(AvatarData* owningAvatar) : _rightEyeBlink(0.0f), _averageLoudness(0.0f), _browAudioLift(0.0f), + _facialAnimationData(new FacialAnimationData), _owningAvatar(owningAvatar) { @@ -64,3 +67,6 @@ void HeadData::addRoll(float roll) { setBaseRoll(_baseRoll + roll); } +const QVector& HeadData::getBlendshapeCoefficients() const { + return _facialAnimationData->_blendshapeCoefficients; +} \ No newline at end of file diff --git a/libraries/avatars/src/HeadData.h b/libraries/avatars/src/HeadData.h index 9e2920ae85..9920776b2a 100644 --- a/libraries/avatars/src/HeadData.h +++ b/libraries/avatars/src/HeadData.h @@ -28,6 +28,7 @@ const float MIN_HEAD_ROLL = -50.f; const float MAX_HEAD_ROLL = 50.f; class AvatarData; +class FacialAnimationData; class HeadData { public: @@ -54,11 +55,16 @@ public: float getAudioAverageLoudness() const { return _audioAverageLoudness; } void setAudioAverageLoudness(float audioAverageLoudness) { _audioAverageLoudness = audioAverageLoudness; } - const QVector& getBlendshapeCoefficients() const { return _blendshapeCoefficients; } + const QVector& getBlendshapeCoefficients() const; float getPupilDilation() const { return _pupilDilation; } void setPupilDilation(float pupilDilation) { _pupilDilation = pupilDilation; } + // Facial animation + void setLeftEyebrow(float f) { + + } + // degrees void addYaw(float yaw); void addPitch(float pitch); @@ -85,7 +91,7 @@ protected: float _averageLoudness; float _browAudioLift; float _audioAverageLoudness; - QVector _blendshapeCoefficients; + FacialAnimationData* _facialAnimationData; float _pupilDilation; AvatarData* _owningAvatar;