diff --git a/libraries/avatars/src/Player.cpp b/libraries/avatars/src/Player.cpp index d3a7124226..5ffaaf6c7b 100644 --- a/libraries/avatars/src/Player.cpp +++ b/libraries/avatars/src/Player.cpp @@ -247,22 +247,50 @@ void Player::play() { _frameInterpolationFactor); _avatar->setTargetScale(context->scale * scale); - QVector jointRotations(currentFrame.getJointRotations().size()); + const auto& prevJointArray = currentFrame.getJointArray(); + const auto& nextJointArray = currentFrame.getJointArray(); + QVector jointArray(prevJointArray.size()); + QVector jointRotations(prevJointArray.size()); + QVector jointTranslations(prevJointArray.size()); + + for (int i = 0; i < jointArray.size(); i++) { + const auto& prevJoint = prevJointArray[i]; + const auto& nextJoint = nextJointArray[i]; + auto& joint = jointArray[i]; + + // Rotation + joint.rotationSet = prevJoint.rotationSet || nextJoint.rotationSet; + if (joint.rotationSet) { + joint.rotation = safeMix(prevJoint.rotation, nextJoint.rotation, _frameInterpolationFactor); + jointRotations[i] = joint.rotation; + } + + joint.translationSet = prevJoint.translationSet || nextJoint.translationSet; + if (joint.translationSet) { + joint.translation = glm::mix(prevJoint.translation, nextJoint.translation, _frameInterpolationFactor); + jointTranslations[i] = joint.translation; + } + } + // _avatar->setRawJointData(jointArray); + _avatar->setJointRotations(jointRotations); + // _avatar->setJointTranslations(jointTranslations); + +/* QVector jointRotations(currentFrame.getJointRotations().size()); for (int i = 0; i < currentFrame.getJointRotations().size(); ++i) { jointRotations[i] = safeMix(currentFrame.getJointRotations()[i], nextFrame.getJointRotations()[i], _frameInterpolationFactor); } - - QVector jointTranslations(currentFrame.getJointTranslations().size()); + */ + /* QVector jointTranslations(currentFrame.getJointTranslations().size()); for (int i = 0; i < currentFrame.getJointTranslations().size(); ++i) { jointTranslations[i] = glm::mix(currentFrame.getJointTranslations()[i], nextFrame.getJointTranslations()[i], _frameInterpolationFactor); } - - _avatar->setJointRotations(jointRotations); - _avatar->setJointTranslations(jointTranslations); + */ + // _avatar->setJointRotations(jointRotations); + // _avatar->setJointTranslations(jointTranslations); HeadData* head = const_cast(_avatar->getHeadData()); if (head) { @@ -422,3 +450,4 @@ bool Player::computeCurrentFrame() { } return true; } + diff --git a/libraries/avatars/src/Recorder.cpp b/libraries/avatars/src/Recorder.cpp index 68e667604b..6da6596ab9 100644 --- a/libraries/avatars/src/Recorder.cpp +++ b/libraries/avatars/src/Recorder.cpp @@ -102,8 +102,11 @@ void Recorder::record() { frame.setBlendshapeCoefficients(_avatar->getHeadData()->getBlendshapeCoefficients()); // FIXME: here we need to make sure the correct joint data on the AvatarData to get correct play back. // This should be fixed by a fix coming from Howard soon - frame.setJointRotations(_avatar->::AvatarData::getJointRotations()); - frame.setJointTranslations(_avatar->::AvatarData::getJointTranslations()); + auto& jointData = _avatar->getRawJointData(); + + frame.setJointArray(jointData); + // frame.setJointRotations(_avatar->::AvatarData::getJointRotations()); + // frame.setJointTranslations(_avatar->::AvatarData::getJointTranslations()); frame.setTranslation(context.orientationInv * (_avatar->getPosition() - context.position)); frame.setRotation(context.orientationInv * _avatar->getOrientation()); diff --git a/libraries/avatars/src/Recording.cpp b/libraries/avatars/src/Recording.cpp index 4ca56421e5..a7d1cd5e86 100644 --- a/libraries/avatars/src/Recording.cpp +++ b/libraries/avatars/src/Recording.cpp @@ -229,7 +229,28 @@ void writeRecordingToFile(RecordingPointer recording, const QString& filename) { ++maskIndex; } - // Joint Rotations + const auto& jointArray = frame.getJointArray(); + if (i == 0) { + numJoints = jointArray.size(); + stream << numJoints; + // 2 fields per joints + mask.resize(mask.size() + numJoints * 2); + } + for (int j = 0; j < numJoints; j++) { + const auto& joint = jointArray[j]; + if (joint.rotationSet) { + writeQuat(stream, joint.rotation); + mask.setBit(maskIndex); + } + maskIndex++; + if (joint.translationSet) { + writeVec3(stream, joint.translation); + mask.setBit(maskIndex); + } + maskIndex++; + } + + /* // Joint Rotations if (i == 0) { numJoints = frame.getJointRotations().size(); stream << numJoints; @@ -252,7 +273,7 @@ void writeRecordingToFile(RecordingPointer recording, const QString& filename) { mask.setBit(maskIndex); } maskIndex++; - } + } */ // Translation if (i == 0) { @@ -561,10 +582,29 @@ RecordingPointer readRecordingFromFile(RecordingPointer recording, const QString stream >> frame._blendshapeCoefficients[j]; } } - // Joint Rotations + // Joint Array if (i == 0) { stream >> numJoints; } + + frame._jointArray.resize(numJoints); + for (quint32 j = 0; j < numJoints; ++j) { + auto& joint = frame._jointArray[2]; + + if (mask[maskIndex++] && readQuat(stream, joint.rotation)) { + joint.rotationSet = true; + } else { + joint.rotationSet = false; + } + + if (mask[maskIndex++] || readVec3(stream, joint.translation)) { + joint.translationSet = true; + } else { + joint.translationSet = false; + } + } + + /* frame._jointRotations.resize(numJoints); for (quint32 j = 0; j < numJoints; ++j) { if (!mask[maskIndex++] || !readQuat(stream, frame._jointRotations[j])) { @@ -573,13 +613,14 @@ RecordingPointer readRecordingFromFile(RecordingPointer recording, const QString } // Joint Translations - frame._jointTranslations.resize(numJoints); + /*frame._jointTranslations.resize(numJoints); for (quint32 j = 0; j < numJoints; ++j) { if (!mask[maskIndex++] || !readVec3(stream, frame._jointTranslations[j])) { frame._jointTranslations[j] = previousFrame._jointTranslations[j]; } } - + */ + if (!mask[maskIndex++] || !readVec3(stream, frame._translation)) { frame._translation = previousFrame._translation; } diff --git a/libraries/avatars/src/Recording.h b/libraries/avatars/src/Recording.h index 3533af6535..83d3642fdd 100644 --- a/libraries/avatars/src/Recording.h +++ b/libraries/avatars/src/Recording.h @@ -25,6 +25,7 @@ class AttachmentData; class Recording; class RecordingFrame; class Sound; +class JointData; typedef QSharedPointer RecordingPointer; @@ -82,6 +83,7 @@ private: class RecordingFrame { public: QVector getBlendshapeCoefficients() const { return _blendshapeCoefficients; } + QVector getJointArray() const { return _jointArray; } QVector getJointRotations() const { return _jointRotations; } QVector getJointTranslations() const { return _jointTranslations; } glm::vec3 getTranslation() const { return _translation; } @@ -94,6 +96,7 @@ public: protected: void setBlendshapeCoefficients(QVector blendshapeCoefficients); + void setJointArray(const QVector& jointArray) { _jointArray = jointArray; } void setJointRotations(QVector jointRotations) { _jointRotations = jointRotations; } void setJointTranslations(QVector jointTranslations) { _jointTranslations = jointTranslations; } void setTranslation(const glm::vec3& translation) { _translation = translation; } @@ -108,6 +111,8 @@ private: QVector _blendshapeCoefficients; QVector _jointRotations; QVector _jointTranslations; + QVector _jointArray; + glm::vec3 _translation; glm::quat _rotation; float _scale;