Moved some FaceShift stuff to FacialAnimationData. Made use of

FacialAnimationData
This commit is contained in:
barnold1953 2014-07-22 13:46:29 -07:00
parent fc9fb11e4f
commit f3ae228030
9 changed files with 57 additions and 30 deletions

View file

@ -66,7 +66,7 @@ void Head::simulate(float deltaTime, bool isMine, bool billboard) {
if (isMine) { if (isMine) {
FaceTracker* faceTracker = Application::getInstance()->getActiveFaceTracker(); FaceTracker* faceTracker = Application::getInstance()->getActiveFaceTracker();
if ((_isFaceshiftConnected = faceTracker)) { if ((_isFaceshiftConnected = faceTracker)) {
_blendshapeCoefficients = faceTracker->getBlendshapeCoefficients(); _facialAnimationData->setBlendshapeCoefficients(faceTracker->getBlendshapeCoefficients());
_isFaceshiftConnected = true; _isFaceshiftConnected = true;
} }
} }
@ -141,11 +141,10 @@ void Head::simulate(float deltaTime, bool isMine, bool billboard) {
// use data to update fake Faceshift blendshape coefficients // use data to update fake Faceshift blendshape coefficients
const float JAW_OPEN_SCALE = 10.f; const float JAW_OPEN_SCALE = 10.f;
Application::getInstance()->getFaceshift()->updateFakeCoefficients(_leftEyeBlink, _facialAnimationData->updateFakeCoefficients(_leftEyeBlink,
_rightEyeBlink, _rightEyeBlink,
_browAudioLift, _browAudioLift,
glm::clamp(log(_averageLoudness) / JAW_OPEN_SCALE, 0.0f, 1.0f), glm::clamp(log(_averageLoudness) / JAW_OPEN_SCALE, 0.0f, 1.0f));
_blendshapeCoefficients);
} }
if (!isMine) { if (!isMine) {

View file

@ -93,18 +93,6 @@ void Faceshift::reset() {
_longTermAverageInitialized = false; _longTermAverageInitialized = false;
} }
void Faceshift::updateFakeCoefficients(float leftBlink, float rightBlink, float browUp,
float jawOpen, QVector<float>& 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) { void Faceshift::setTCPEnabled(bool enabled) {
if ((_tcpEnabled = enabled)) { if ((_tcpEnabled = enabled)) {
connectSocket(); connectSocket();

View file

@ -61,9 +61,6 @@ public:
void update(); void update();
void reset(); void reset();
void updateFakeCoefficients(float leftBlink, float rightBlink, float browUp,
float jawOpen, QVector<float>& coefficients) const;
signals: signals:
void connectionStateChanged(); void connectionStateChanged();

View file

@ -11,6 +11,10 @@
#include "FacialAnimationData.h" #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 FacialAnimationData::FacialAnimationData() :_leftBlinkIndex(0), // see http://support.faceshift.com/support/articles/35129-export-of-blendshapes
_rightBlinkIndex(1), _rightBlinkIndex(1),
_leftEyeOpenIndex(8), _leftEyeOpenIndex(8),
@ -27,4 +31,16 @@ _jawOpenIndex(21) {
float FacialAnimationData::getBlendshapeCoefficient(int index) const { float FacialAnimationData::getBlendshapeCoefficient(int index) const {
return (index >= 0 && index < (int)_blendshapeCoefficients.size()) ? _blendshapeCoefficients[index] : 0.0f; 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;
} }

View file

@ -21,6 +21,8 @@ class FacialAnimationData : public QObject {
public: public:
friend class Faceshift; friend class Faceshift;
friend class HeadData;
friend class AvatarData;
FacialAnimationData(); FacialAnimationData();
@ -39,6 +41,11 @@ public:
float getMouthSmileLeft() const { return getBlendshapeCoefficient(_mouthSmileLeftIndex); } float getMouthSmileLeft() const { return getBlendshapeCoefficient(_mouthSmileLeftIndex); }
float getMouthSmileRight() const { return getBlendshapeCoefficient(_mouthSmileRightIndex); } float getMouthSmileRight() const { return getBlendshapeCoefficient(_mouthSmileRightIndex); }
void updateFakeCoefficients(float leftBlink, float rightBlink, float browUp, float jawOpen);
void setBlendshapeCoefficients(const QVector<float>& coefficients) { _blendshapeCoefficients = coefficients; }
const QVector<float>& getBlendshapeCoefficients() const { return _blendshapeCoefficients; }
private: private:
float getBlendshapeCoefficient(int index) const; float getBlendshapeCoefficient(int index) const;
@ -58,7 +65,6 @@ private:
int _jawOpenIndex; int _jawOpenIndex;
//Only used by agents, since FaceTracker has its own _blendshapeCoefficients;
QVector<float> _blendshapeCoefficients; QVector<float> _blendshapeCoefficients;
}; };

View file

@ -29,6 +29,8 @@
#include "AvatarData.h" #include "AvatarData.h"
#include "../animation/src/FacialAnimationData.h"
quint64 DEFAULT_FILTERED_LOG_EXPIRY = 2 * USECS_PER_SECOND; quint64 DEFAULT_FILTERED_LOG_EXPIRY = 2 * USECS_PER_SECOND;
using namespace std; using namespace std;
@ -151,10 +153,12 @@ QByteArray AvatarData::toByteArray() {
memcpy(destinationBuffer, &_headData->_browAudioLift, sizeof(float)); memcpy(destinationBuffer, &_headData->_browAudioLift, sizeof(float));
destinationBuffer += sizeof(float); destinationBuffer += sizeof(float);
*destinationBuffer++ = _headData->_blendshapeCoefficients.size(); const QVector<float>& blendshapeCoefficients = _headData->_facialAnimationData->getBlendshapeCoefficients();
memcpy(destinationBuffer, _headData->_blendshapeCoefficients.data(),
_headData->_blendshapeCoefficients.size() * sizeof(float)); *destinationBuffer++ = blendshapeCoefficients.size();
destinationBuffer += _headData->_blendshapeCoefficients.size() * sizeof(float); memcpy(destinationBuffer, blendshapeCoefficients.data(),
blendshapeCoefficients.size() * sizeof(float));
destinationBuffer += blendshapeCoefficients.size() * sizeof(float);
} }
// pupil dilation // pupil dilation
@ -429,8 +433,8 @@ int AvatarData::parseDataAtOffset(const QByteArray& packet, int offset) {
return maxAvailableSize; return maxAvailableSize;
} }
_headData->_blendshapeCoefficients.resize(numCoefficients); _headData->_facialAnimationData->_blendshapeCoefficients.resize(numCoefficients);
memcpy(_headData->_blendshapeCoefficients.data(), sourceBuffer, blendDataSize); memcpy(_headData->_facialAnimationData->_blendshapeCoefficients.data(), sourceBuffer, blendDataSize);
sourceBuffer += numCoefficients * sizeof(float); sourceBuffer += numCoefficients * sizeof(float);
//bitItemsDataSize = 4 * sizeof(float) + 1 + blendDataSize; //bitItemsDataSize = 4 * sizeof(float) + 1 + blendDataSize;

View file

@ -206,6 +206,11 @@ public:
Q_INVOKABLE virtual QStringList getJointNames() const { return _jointNames; } Q_INVOKABLE virtual QStringList getJointNames() const { return _jointNames; }
// Facial Animation
Q_INVOKABLE void setLeftEyebrow(float f) {
_headData->setLeftEyebrow(f);
}
// key state // key state
void setKeyState(KeyState s) { _keyState = s; } void setKeyState(KeyState s) { _keyState = s; }
KeyState keyState() const { return _keyState; } KeyState keyState() const { return _keyState; }

View file

@ -16,6 +16,8 @@
#include "AvatarData.h" #include "AvatarData.h"
#include "HeadData.h" #include "HeadData.h"
#include "../animation/src/FacialAnimationData.h"
HeadData::HeadData(AvatarData* owningAvatar) : HeadData::HeadData(AvatarData* owningAvatar) :
_baseYaw(0.0f), _baseYaw(0.0f),
_basePitch(0.0f), _basePitch(0.0f),
@ -29,6 +31,7 @@ HeadData::HeadData(AvatarData* owningAvatar) :
_rightEyeBlink(0.0f), _rightEyeBlink(0.0f),
_averageLoudness(0.0f), _averageLoudness(0.0f),
_browAudioLift(0.0f), _browAudioLift(0.0f),
_facialAnimationData(new FacialAnimationData),
_owningAvatar(owningAvatar) _owningAvatar(owningAvatar)
{ {
@ -64,3 +67,6 @@ void HeadData::addRoll(float roll) {
setBaseRoll(_baseRoll + roll); setBaseRoll(_baseRoll + roll);
} }
const QVector<float>& HeadData::getBlendshapeCoefficients() const {
return _facialAnimationData->_blendshapeCoefficients;
}

View file

@ -28,6 +28,7 @@ const float MIN_HEAD_ROLL = -50.f;
const float MAX_HEAD_ROLL = 50.f; const float MAX_HEAD_ROLL = 50.f;
class AvatarData; class AvatarData;
class FacialAnimationData;
class HeadData { class HeadData {
public: public:
@ -54,11 +55,16 @@ public:
float getAudioAverageLoudness() const { return _audioAverageLoudness; } float getAudioAverageLoudness() const { return _audioAverageLoudness; }
void setAudioAverageLoudness(float audioAverageLoudness) { _audioAverageLoudness = audioAverageLoudness; } void setAudioAverageLoudness(float audioAverageLoudness) { _audioAverageLoudness = audioAverageLoudness; }
const QVector<float>& getBlendshapeCoefficients() const { return _blendshapeCoefficients; } const QVector<float>& getBlendshapeCoefficients() const;
float getPupilDilation() const { return _pupilDilation; } float getPupilDilation() const { return _pupilDilation; }
void setPupilDilation(float pupilDilation) { _pupilDilation = pupilDilation; } void setPupilDilation(float pupilDilation) { _pupilDilation = pupilDilation; }
// Facial animation
void setLeftEyebrow(float f) {
}
// degrees // degrees
void addYaw(float yaw); void addYaw(float yaw);
void addPitch(float pitch); void addPitch(float pitch);
@ -85,7 +91,7 @@ protected:
float _averageLoudness; float _averageLoudness;
float _browAudioLift; float _browAudioLift;
float _audioAverageLoudness; float _audioAverageLoudness;
QVector<float> _blendshapeCoefficients; FacialAnimationData* _facialAnimationData;
float _pupilDilation; float _pupilDilation;
AvatarData* _owningAvatar; AvatarData* _owningAvatar;