From ad4b8e00011b35dfc133c22d4ac092e52be95c08 Mon Sep 17 00:00:00 2001 From: "Anthony J. Thibault" Date: Fri, 20 Nov 2015 10:22:36 -0800 Subject: [PATCH] Avatar transmission fixes, moved JointData into shared * Moved JointData into shared library * added methods to the rig to copy into and out of JointData * JointData translations must be in meters this is so the fixed point compression wont overflow, also, it's a consistent wire format. --- interface/src/avatar/Avatar.cpp | 7 +------ interface/src/avatar/MyAvatar.cpp | 7 +------ libraries/animation/src/Rig.cpp | 19 +++++++++++++++++++ libraries/animation/src/Rig.h | 3 +++ libraries/avatars/src/AvatarData.h | 10 +--------- libraries/shared/src/JointData.h | 18 ++++++++++++++++++ 6 files changed, 43 insertions(+), 21 deletions(-) create mode 100644 libraries/shared/src/JointData.h diff --git a/interface/src/avatar/Avatar.cpp b/interface/src/avatar/Avatar.cpp index b979334383..4e58163a86 100644 --- a/interface/src/avatar/Avatar.cpp +++ b/interface/src/avatar/Avatar.cpp @@ -202,12 +202,7 @@ void Avatar::simulate(float deltaTime) { if (!_shouldRenderBillboard && inViewFrustum) { { PerformanceTimer perfTimer("skeleton"); - for (int i = 0; i < _jointData.size(); i++) { - const JointData& data = _jointData.at(i); - _skeletonModel.setJointRotation(i, data.rotationSet, data.rotation, 1.0f); - _skeletonModel.setJointTranslation(i, data.translationSet, data.translation, 1.0f); - } - + _skeletonModel.getRig()->copyJointsFromJointData(_jointData); _skeletonModel.simulate(deltaTime, _hasNewJointRotations || _hasNewJointTranslations); simulateAttachments(deltaTime); _hasNewJointRotations = false; diff --git a/interface/src/avatar/MyAvatar.cpp b/interface/src/avatar/MyAvatar.cpp index 75beec0fae..3680d32797 100644 --- a/interface/src/avatar/MyAvatar.cpp +++ b/interface/src/avatar/MyAvatar.cpp @@ -269,12 +269,7 @@ void MyAvatar::simulate(float deltaTime) { PerformanceTimer perfTimer("joints"); // copy out the skeleton joints from the model _jointData.resize(_rig->getJointStateCount()); - - for (int i = 0; i < _jointData.size(); i++) { - JointData& data = _jointData[i]; - data.rotationSet |= _rig->getJointStateRotation(i, data.rotation); - data.translationSet |= _rig->getJointStateTranslation(i, data.translation); - } + _rig->copyJointsIntoJointData(_jointData); } { diff --git a/libraries/animation/src/Rig.cpp b/libraries/animation/src/Rig.cpp index 9c803e1d7f..64c48d8755 100644 --- a/libraries/animation/src/Rig.cpp +++ b/libraries/animation/src/Rig.cpp @@ -1380,3 +1380,22 @@ glm::mat4 Rig::getJointTransform(int jointIndex) const { } } +void Rig::copyJointsIntoJointData(QVector& jointDataVec) const { + for (int i = 0; i < jointDataVec.size(); i++) { + JointData& data = jointDataVec[i]; + data.rotationSet |= getJointStateRotation(i, data.rotation); + // geometry offset is used here so that translations are in meters. + // this is what the avatar mixer expects + data.translationSet |= getJointStateTranslation(i, _geometryOffset * data.translation); + } +} + +void Rig::copyJointsFromJointData(const QVector& jointDataVec) { + AnimPose invGeometryOffset = _geometryOffset.inverse(); + for (int i = 0; i < jointDataVec.size(); i++) { + const JointData& data = jointDataVec.at(i); + setJointRotation(i, data.rotationSet, data.rotation, 1.0f); + // geometry offset is used here to undo the fact that avatar mixer translations are in meters. + setJointTranslation(i, data.translationSet, invGeometryOffset * data.translation, 1.0f); + } +} diff --git a/libraries/animation/src/Rig.h b/libraries/animation/src/Rig.h index 2004a7ace2..61e32d625e 100644 --- a/libraries/animation/src/Rig.h +++ b/libraries/animation/src/Rig.h @@ -18,6 +18,7 @@ #include #include #include +#include #include "JointState.h" // We might want to change this (later) to something that doesn't depend on gpu, fbx and model. -HRS @@ -162,6 +163,8 @@ public: const glm::vec3& getEyesInRootFrame() const { return _eyesInRootFrame; } + void copyJointsIntoJointData(QVector& jointDataVec) const; + void copyJointsFromJointData(const QVector& jointDataVec); protected: void updateAnimationStateHandlers(); diff --git a/libraries/avatars/src/AvatarData.h b/libraries/avatars/src/AvatarData.h index 846c314e4b..27fedbb6d1 100644 --- a/libraries/avatars/src/AvatarData.h +++ b/libraries/avatars/src/AvatarData.h @@ -46,6 +46,7 @@ typedef unsigned long long quint64; #include #include +#include #include #include #include @@ -131,7 +132,6 @@ enum KeyState { class QDataStream; class AttachmentData; -class JointData; class Transform; using TransformPointer = std::shared_ptr; @@ -432,14 +432,6 @@ private: }; Q_DECLARE_METATYPE(AvatarData*) -class JointData { -public: - glm::quat rotation; - bool rotationSet = false; - glm::vec3 translation; - bool translationSet = false; -}; - QJsonValue toJsonValue(const JointData& joint); JointData jointDataFromJsonValue(const QJsonValue& q); diff --git a/libraries/shared/src/JointData.h b/libraries/shared/src/JointData.h new file mode 100644 index 0000000000..a05b5c649a --- /dev/null +++ b/libraries/shared/src/JointData.h @@ -0,0 +1,18 @@ + +#ifndef hifi_JointData_h +#define hifi_JointData_h + +#include +#include + +// Used by the avatar mixer to describe a single joint +// These are relative to their parent and translations are in meters +class JointData { +public: + glm::quat rotation; + bool rotationSet = false; + glm::vec3 translation; // meters + bool translationSet = false; +}; + +#endif