From 4cc0aaf10213ade7d799b5b0fdf94eb446ad6255 Mon Sep 17 00:00:00 2001 From: David Kelly Date: Wed, 10 May 2017 18:31:57 -0700 Subject: [PATCH 1/6] Fix for multiple settings dialogs --- scripts/system/snapshot.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/system/snapshot.js b/scripts/system/snapshot.js index 77278caadd..2a2e816d45 100644 --- a/scripts/system/snapshot.js +++ b/scripts/system/snapshot.js @@ -111,7 +111,7 @@ function onMessage(message) { case 'openSettings': if ((HMD.active && Settings.getValue("hmdTabletBecomesToolbar", false)) || (!HMD.active && Settings.getValue("desktopTabletBecomesToolbar", true))) { - Desktop.show("hifi/dialogs/GeneralPreferencesDialog.qml", "General Preferences"); + Desktop.show("hifi/dialogs/GeneralPreferencesDialog.qml", "GeneralPreferencesDialog"); } else { tablet.loadQMLOnTop("TabletGeneralPreferences.qml"); } From 3b06b03e0129bd2b60012bc087d3e0295e0faaf1 Mon Sep 17 00:00:00 2001 From: David Rowe Date: Thu, 11 May 2017 16:46:36 +1200 Subject: [PATCH 2/6] Rename blendshapes variables in preparation for repurposing --- libraries/avatars/src/AvatarData.cpp | 2 +- libraries/avatars/src/HeadData.cpp | 29 ++++++++++++++-------------- libraries/avatars/src/HeadData.h | 4 ++-- 3 files changed, 18 insertions(+), 17 deletions(-) diff --git a/libraries/avatars/src/AvatarData.cpp b/libraries/avatars/src/AvatarData.cpp index cb819c6b20..57d085a02c 100644 --- a/libraries/avatars/src/AvatarData.cpp +++ b/libraries/avatars/src/AvatarData.cpp @@ -965,7 +965,7 @@ int AvatarData::parseDataFromBuffer(const QByteArray& buffer) { const int coefficientsSize = sizeof(float) * numCoefficients; PACKET_READ_CHECK(FaceTrackerCoefficients, coefficientsSize); _headData->_blendshapeCoefficients.resize(numCoefficients); // make sure there's room for the copy! - _headData->_baseBlendshapeCoefficients.resize(numCoefficients); + _headData->_transientBlendshapeCoefficients.resize(numCoefficients); memcpy(_headData->_blendshapeCoefficients.data(), sourceBuffer, coefficientsSize); sourceBuffer += coefficientsSize; int numBytesRead = sourceBuffer - startSection; diff --git a/libraries/avatars/src/HeadData.cpp b/libraries/avatars/src/HeadData.cpp index b55be7c156..d88b98b77e 100644 --- a/libraries/avatars/src/HeadData.cpp +++ b/libraries/avatars/src/HeadData.cpp @@ -34,8 +34,9 @@ HeadData::HeadData(AvatarData* owningAvatar) : _rightEyeBlink(0.0f), _averageLoudness(0.0f), _browAudioLift(0.0f), - _baseBlendshapeCoefficients(QVector(0, 0.0f)), - _currBlendShapeCoefficients(QVector(0, 0.0f)), + _blendshapeCoefficients(QVector(0, 0.0f)), + _transientBlendshapeCoefficients(QVector(0, 0.0f)), + _currentBlendshapeCoefficients(QVector(0, 0.0f)), _owningAvatar(owningAvatar) { @@ -85,22 +86,22 @@ static const QMap& getBlendshapesLookupMap() { } const QVector& HeadData::getSummedBlendshapeCoefficients() { - int maxSize = std::max(_baseBlendshapeCoefficients.size(), _blendshapeCoefficients.size()); - if (_currBlendShapeCoefficients.size() != maxSize) { - _currBlendShapeCoefficients.resize(maxSize); + int maxSize = std::max(_blendshapeCoefficients.size(), _transientBlendshapeCoefficients.size()); + if (_currentBlendshapeCoefficients.size() != maxSize) { + _currentBlendshapeCoefficients.resize(maxSize); } for (int i = 0; i < maxSize; i++) { - if (i >= _baseBlendshapeCoefficients.size()) { - _currBlendShapeCoefficients[i] = _blendshapeCoefficients[i]; - } else if (i >= _blendshapeCoefficients.size()) { - _currBlendShapeCoefficients[i] = _baseBlendshapeCoefficients[i]; + if (i >= _blendshapeCoefficients.size()) { + _currentBlendshapeCoefficients[i] = _transientBlendshapeCoefficients[i]; + } else if (i >= _transientBlendshapeCoefficients.size()) { + _currentBlendshapeCoefficients[i] = _blendshapeCoefficients[i]; } else { - _currBlendShapeCoefficients[i] = _baseBlendshapeCoefficients[i] + _blendshapeCoefficients[i]; + _currentBlendshapeCoefficients[i] = _blendshapeCoefficients[i] + _transientBlendshapeCoefficients[i]; } } - return _currBlendShapeCoefficients; + return _currentBlendshapeCoefficients; } void HeadData::setBlendshape(QString name, float val) { @@ -112,10 +113,10 @@ void HeadData::setBlendshape(QString name, float val) { if (_blendshapeCoefficients.size() <= it.value()) { _blendshapeCoefficients.resize(it.value() + 1); } - if (_baseBlendshapeCoefficients.size() <= it.value()) { - _baseBlendshapeCoefficients.resize(it.value() + 1); + if (_transientBlendshapeCoefficients.size() <= it.value()) { + _transientBlendshapeCoefficients.resize(it.value() + 1); } - _baseBlendshapeCoefficients[it.value()] = val; + _blendshapeCoefficients[it.value()] = val; } } diff --git a/libraries/avatars/src/HeadData.h b/libraries/avatars/src/HeadData.h index dbed0a6a65..758128f6ca 100644 --- a/libraries/avatars/src/HeadData.h +++ b/libraries/avatars/src/HeadData.h @@ -93,8 +93,8 @@ protected: float _browAudioLift; QVector _blendshapeCoefficients; - QVector _baseBlendshapeCoefficients; - QVector _currBlendShapeCoefficients; + QVector _transientBlendshapeCoefficients; + QVector _currentBlendshapeCoefficients; AvatarData* _owningAvatar; private: From 1b855f2c6b86d41b3a87af2b3ff9b74a7ef43ba1 Mon Sep 17 00:00:00 2001 From: David Rowe Date: Thu, 11 May 2017 18:15:38 +1200 Subject: [PATCH 3/6] Voice modulation and facetrackers write to transient blendshapes --- interface/src/avatar/MyHead.cpp | 12 ++++++------ .../avatars-renderer/src/avatars-renderer/Head.cpp | 12 ++++++------ 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/interface/src/avatar/MyHead.cpp b/interface/src/avatar/MyHead.cpp index c41fff3bb5..34a75c5461 100644 --- a/interface/src/avatar/MyHead.cpp +++ b/interface/src/avatar/MyHead.cpp @@ -48,7 +48,7 @@ void MyHead::simulate(float deltaTime) { FaceTracker* faceTracker = qApp->getActiveFaceTracker(); _isFaceTrackerConnected = faceTracker != NULL && !faceTracker->isMuted(); if (_isFaceTrackerConnected) { - _blendshapeCoefficients = faceTracker->getBlendshapeCoefficients(); + _transientBlendshapeCoefficients = faceTracker->getBlendshapeCoefficients(); if (typeid(*faceTracker) == typeid(DdeFaceTracker)) { @@ -60,11 +60,11 @@ void MyHead::simulate(float deltaTime) { const int FUNNEL_BLENDSHAPE = 40; const int SMILE_LEFT_BLENDSHAPE = 28; const int SMILE_RIGHT_BLENDSHAPE = 29; - _blendshapeCoefficients[JAW_OPEN_BLENDSHAPE] += _audioJawOpen; - _blendshapeCoefficients[SMILE_LEFT_BLENDSHAPE] += _mouth4; - _blendshapeCoefficients[SMILE_RIGHT_BLENDSHAPE] += _mouth4; - _blendshapeCoefficients[MMMM_BLENDSHAPE] += _mouth2; - _blendshapeCoefficients[FUNNEL_BLENDSHAPE] += _mouth3; + _transientBlendshapeCoefficients[JAW_OPEN_BLENDSHAPE] += _audioJawOpen; + _transientBlendshapeCoefficients[SMILE_LEFT_BLENDSHAPE] += _mouth4; + _transientBlendshapeCoefficients[SMILE_RIGHT_BLENDSHAPE] += _mouth4; + _transientBlendshapeCoefficients[MMMM_BLENDSHAPE] += _mouth2; + _transientBlendshapeCoefficients[FUNNEL_BLENDSHAPE] += _mouth3; } applyEyelidOffset(getFinalOrientationInWorldFrame()); } diff --git a/libraries/avatars-renderer/src/avatars-renderer/Head.cpp b/libraries/avatars-renderer/src/avatars-renderer/Head.cpp index 1c54ea269a..d7f7a402cf 100644 --- a/libraries/avatars-renderer/src/avatars-renderer/Head.cpp +++ b/libraries/avatars-renderer/src/avatars-renderer/Head.cpp @@ -151,7 +151,7 @@ void Head::simulate(float deltaTime) { _mouth2, _mouth3, _mouth4, - _blendshapeCoefficients); + _transientBlendshapeCoefficients); applyEyelidOffset(getOrientation()); @@ -227,15 +227,15 @@ void Head::applyEyelidOffset(glm::quat headOrientation) { for (int i = 0; i < 2; i++) { const int LEFT_EYE = 8; - float eyeCoefficient = _blendshapeCoefficients[i] - _blendshapeCoefficients[LEFT_EYE + i]; // Raw value + float eyeCoefficient = _transientBlendshapeCoefficients[i] - _transientBlendshapeCoefficients[LEFT_EYE + i]; eyeCoefficient = glm::clamp(eyelidOffset + eyeCoefficient * (1.0f - eyelidOffset), -1.0f, 1.0f); if (eyeCoefficient > 0.0f) { - _blendshapeCoefficients[i] = eyeCoefficient; - _blendshapeCoefficients[LEFT_EYE + i] = 0.0f; + _transientBlendshapeCoefficients[i] = eyeCoefficient; + _transientBlendshapeCoefficients[LEFT_EYE + i] = 0.0f; } else { - _blendshapeCoefficients[i] = 0.0f; - _blendshapeCoefficients[LEFT_EYE + i] = -eyeCoefficient; + _transientBlendshapeCoefficients[i] = 0.0f; + _transientBlendshapeCoefficients[LEFT_EYE + i] = -eyeCoefficient; } } } From 21f9594f81faf25a65c163ba1214ffa239f820c6 Mon Sep 17 00:00:00 2001 From: David Rowe Date: Thu, 11 May 2017 18:17:12 +1200 Subject: [PATCH 4/6] Sum of blendshapes is used for recording --- libraries/avatars/src/HeadData.cpp | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/libraries/avatars/src/HeadData.cpp b/libraries/avatars/src/HeadData.cpp index d88b98b77e..78e87d7757 100644 --- a/libraries/avatars/src/HeadData.cpp +++ b/libraries/avatars/src/HeadData.cpp @@ -132,14 +132,16 @@ QJsonObject HeadData::toJson() const { QJsonObject blendshapesJson; for (auto name : blendshapeLookupMap.keys()) { auto index = blendshapeLookupMap[name]; - if (index >= _blendshapeCoefficients.size()) { - continue; + float value = 0.0f; + if (index < _blendshapeCoefficients.size()) { + value += _blendshapeCoefficients[index]; } - auto value = _blendshapeCoefficients[index]; - if (value == 0.0f) { - continue; + if (index < _transientBlendshapeCoefficients.size()) { + value += _transientBlendshapeCoefficients[index]; + } + if (value != 0.0f) { + blendshapesJson[name] = value; } - blendshapesJson[name] = value; } if (!blendshapesJson.isEmpty()) { headJson[JSON_AVATAR_HEAD_BLENDSHAPE_COEFFICIENTS] = blendshapesJson; @@ -164,8 +166,8 @@ void HeadData::fromJson(const QJsonObject& json) { QJsonArray blendshapeCoefficientsJson = jsonValue.toArray(); for (const auto& blendshapeCoefficient : blendshapeCoefficientsJson) { blendshapeCoefficients.push_back((float)blendshapeCoefficient.toDouble()); - setBlendshapeCoefficients(blendshapeCoefficients); } + setBlendshapeCoefficients(blendshapeCoefficients); } else if (jsonValue.isObject()) { QJsonObject blendshapeCoefficientsJson = jsonValue.toObject(); for (const QString& name : blendshapeCoefficientsJson.keys()) { From 98b943269bb49116feded6f3efe313b1f70a460e Mon Sep 17 00:00:00 2001 From: David Rowe Date: Thu, 11 May 2017 18:17:35 +1200 Subject: [PATCH 5/6] Sum of blendshapes is used sent through avatar mixer --- libraries/avatars/src/AvatarData.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/libraries/avatars/src/AvatarData.cpp b/libraries/avatars/src/AvatarData.cpp index 57d085a02c..51b69711dc 100644 --- a/libraries/avatars/src/AvatarData.cpp +++ b/libraries/avatars/src/AvatarData.cpp @@ -445,17 +445,17 @@ QByteArray AvatarData::toByteArray(AvatarDataDetail dataDetail, quint64 lastSent if (hasFaceTrackerInfo) { auto startSection = destinationBuffer; auto faceTrackerInfo = reinterpret_cast(destinationBuffer); + auto blendshapeCoefficients = _headData->getSummedBlendshapeCoefficients(); faceTrackerInfo->leftEyeBlink = _headData->_leftEyeBlink; faceTrackerInfo->rightEyeBlink = _headData->_rightEyeBlink; faceTrackerInfo->averageLoudness = _headData->_averageLoudness; faceTrackerInfo->browAudioLift = _headData->_browAudioLift; - faceTrackerInfo->numBlendshapeCoefficients = _headData->_blendshapeCoefficients.size(); + faceTrackerInfo->numBlendshapeCoefficients = blendshapeCoefficients.size(); destinationBuffer += sizeof(AvatarDataPacket::FaceTrackerInfo); - // followed by a variable number of float coefficients - memcpy(destinationBuffer, _headData->_blendshapeCoefficients.data(), _headData->_blendshapeCoefficients.size() * sizeof(float)); - destinationBuffer += _headData->_blendshapeCoefficients.size() * sizeof(float); + memcpy(destinationBuffer, blendshapeCoefficients.data(), blendshapeCoefficients.size() * sizeof(float)); + destinationBuffer += blendshapeCoefficients.size() * sizeof(float); int numBytes = destinationBuffer - startSection; if (outboundDataRateOut) { From e426d70437bc214263ae0e53992da125398dc668 Mon Sep 17 00:00:00 2001 From: David Rowe Date: Thu, 11 May 2017 18:37:23 +1200 Subject: [PATCH 6/6] Improve variable name --- libraries/avatars/src/HeadData.cpp | 14 +++++++------- libraries/avatars/src/HeadData.h | 2 +- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/libraries/avatars/src/HeadData.cpp b/libraries/avatars/src/HeadData.cpp index 78e87d7757..2e4eec73a8 100644 --- a/libraries/avatars/src/HeadData.cpp +++ b/libraries/avatars/src/HeadData.cpp @@ -36,7 +36,7 @@ HeadData::HeadData(AvatarData* owningAvatar) : _browAudioLift(0.0f), _blendshapeCoefficients(QVector(0, 0.0f)), _transientBlendshapeCoefficients(QVector(0, 0.0f)), - _currentBlendshapeCoefficients(QVector(0, 0.0f)), + _summedBlendshapeCoefficients(QVector(0, 0.0f)), _owningAvatar(owningAvatar) { @@ -87,21 +87,21 @@ static const QMap& getBlendshapesLookupMap() { const QVector& HeadData::getSummedBlendshapeCoefficients() { int maxSize = std::max(_blendshapeCoefficients.size(), _transientBlendshapeCoefficients.size()); - if (_currentBlendshapeCoefficients.size() != maxSize) { - _currentBlendshapeCoefficients.resize(maxSize); + if (_summedBlendshapeCoefficients.size() != maxSize) { + _summedBlendshapeCoefficients.resize(maxSize); } for (int i = 0; i < maxSize; i++) { if (i >= _blendshapeCoefficients.size()) { - _currentBlendshapeCoefficients[i] = _transientBlendshapeCoefficients[i]; + _summedBlendshapeCoefficients[i] = _transientBlendshapeCoefficients[i]; } else if (i >= _transientBlendshapeCoefficients.size()) { - _currentBlendshapeCoefficients[i] = _blendshapeCoefficients[i]; + _summedBlendshapeCoefficients[i] = _blendshapeCoefficients[i]; } else { - _currentBlendshapeCoefficients[i] = _blendshapeCoefficients[i] + _transientBlendshapeCoefficients[i]; + _summedBlendshapeCoefficients[i] = _blendshapeCoefficients[i] + _transientBlendshapeCoefficients[i]; } } - return _currentBlendshapeCoefficients; + return _summedBlendshapeCoefficients; } void HeadData::setBlendshape(QString name, float val) { diff --git a/libraries/avatars/src/HeadData.h b/libraries/avatars/src/HeadData.h index 758128f6ca..9b28616b3f 100644 --- a/libraries/avatars/src/HeadData.h +++ b/libraries/avatars/src/HeadData.h @@ -94,7 +94,7 @@ protected: QVector _blendshapeCoefficients; QVector _transientBlendshapeCoefficients; - QVector _currentBlendshapeCoefficients; + QVector _summedBlendshapeCoefficients; AvatarData* _owningAvatar; private: