Merge pull request #8095 from SamGondelman/skeletonFix

Fix skeleton switching bug
This commit is contained in:
Brad Hefta-Gaub 2016-06-20 15:52:40 -07:00 committed by GitHub
commit d5c6296db5
2 changed files with 10 additions and 10 deletions

View file

@ -163,7 +163,6 @@ void Rig::destroyAnimGraph() {
} }
void Rig::initJointStates(const FBXGeometry& geometry, const glm::mat4& modelOffset) { void Rig::initJointStates(const FBXGeometry& geometry, const glm::mat4& modelOffset) {
_geometryOffset = AnimPose(geometry.offset); _geometryOffset = AnimPose(geometry.offset);
_invGeometryOffset = _geometryOffset.inverse(); _invGeometryOffset = _geometryOffset.inverse();
setModelOffset(modelOffset); setModelOffset(modelOffset);
@ -1224,8 +1223,7 @@ void Rig::copyJointsIntoJointData(QVector<JointData>& jointDataVec) const {
} }
void Rig::copyJointsFromJointData(const QVector<JointData>& jointDataVec) { void Rig::copyJointsFromJointData(const QVector<JointData>& jointDataVec) {
if (_animSkeleton && jointDataVec.size() == (int)_internalPoseSet._overrideFlags.size()) {
if (_animSkeleton) {
// transform all the default poses into rig space. // transform all the default poses into rig space.
const AnimPose geometryToRigPose(_geometryToRigTransform); const AnimPose geometryToRigPose(_geometryToRigTransform);

View file

@ -269,7 +269,7 @@ QByteArray AvatarData::toByteArray(bool cullSmallChanges, bool sendAll) {
_lastSentJointData.resize(_jointData.size()); _lastSentJointData.resize(_jointData.size());
for (int i=0; i < _jointData.size(); i++) { for (int i=0; i < _jointData.size(); i++) {
const JointData& data = _jointData.at(i); const JointData& data = _jointData[i];
if (sendAll || _lastSentJointData[i].rotation != data.rotation) { if (sendAll || _lastSentJointData[i].rotation != data.rotation) {
if (sendAll || if (sendAll ||
!cullSmallChanges || !cullSmallChanges ||
@ -294,7 +294,7 @@ QByteArray AvatarData::toByteArray(bool cullSmallChanges, bool sendAll) {
validityBit = 0; validityBit = 0;
validity = *validityPosition++; validity = *validityPosition++;
for (int i = 0; i < _jointData.size(); i ++) { for (int i = 0; i < _jointData.size(); i ++) {
const JointData& data = _jointData[ i ]; const JointData& data = _jointData[i];
if (validity & (1 << validityBit)) { if (validity & (1 << validityBit)) {
destinationBuffer += packOrientationQuatToSixBytes(destinationBuffer, data.rotation); destinationBuffer += packOrientationQuatToSixBytes(destinationBuffer, data.rotation);
} }
@ -317,7 +317,7 @@ QByteArray AvatarData::toByteArray(bool cullSmallChanges, bool sendAll) {
float maxTranslationDimension = 0.0; float maxTranslationDimension = 0.0;
for (int i=0; i < _jointData.size(); i++) { for (int i=0; i < _jointData.size(); i++) {
const JointData& data = _jointData.at(i); const JointData& data = _jointData[i];
if (sendAll || _lastSentJointData[i].translation != data.translation) { if (sendAll || _lastSentJointData[i].translation != data.translation) {
if (sendAll || if (sendAll ||
!cullSmallChanges || !cullSmallChanges ||
@ -348,7 +348,7 @@ QByteArray AvatarData::toByteArray(bool cullSmallChanges, bool sendAll) {
validityBit = 0; validityBit = 0;
validity = *validityPosition++; validity = *validityPosition++;
for (int i = 0; i < _jointData.size(); i ++) { for (int i = 0; i < _jointData.size(); i ++) {
const JointData& data = _jointData[ i ]; const JointData& data = _jointData[i];
if (validity & (1 << validityBit)) { if (validity & (1 << validityBit)) {
destinationBuffer += destinationBuffer +=
packFloatVec3ToSignedTwoByteFixed(destinationBuffer, data.translation, TRANSLATION_COMPRESSION_RADIX); packFloatVec3ToSignedTwoByteFixed(destinationBuffer, data.translation, TRANSLATION_COMPRESSION_RADIX);
@ -425,7 +425,6 @@ bool AvatarData::shouldLogError(const quint64& now) {
// read data in packet starting at byte offset and return number of bytes parsed // read data in packet starting at byte offset and return number of bytes parsed
int AvatarData::parseDataFromBuffer(const QByteArray& buffer) { int AvatarData::parseDataFromBuffer(const QByteArray& buffer) {
// lazily allocate memory for HeadData in case we're not an Avatar instance // lazily allocate memory for HeadData in case we're not an Avatar instance
if (!_headData) { if (!_headData) {
_headData = new HeadData(this); _headData = new HeadData(this);
@ -669,7 +668,9 @@ void AvatarData::setJointData(int index, const glm::quat& rotation, const glm::v
} }
JointData& data = _jointData[index]; JointData& data = _jointData[index];
data.rotation = rotation; data.rotation = rotation;
data.rotationSet = true;
data.translation = translation; data.translation = translation;
data.translationSet = true;
} }
void AvatarData::clearJointData(int index) { void AvatarData::clearJointData(int index) {
@ -774,6 +775,7 @@ void AvatarData::setJointRotation(int index, const glm::quat& rotation) {
} }
JointData& data = _jointData[index]; JointData& data = _jointData[index];
data.rotation = rotation; data.rotation = rotation;
data.rotationSet = true;
} }
void AvatarData::setJointTranslation(int index, const glm::vec3& translation) { void AvatarData::setJointTranslation(int index, const glm::vec3& translation) {
@ -789,6 +791,7 @@ void AvatarData::setJointTranslation(int index, const glm::vec3& translation) {
} }
JointData& data = _jointData[index]; JointData& data = _jointData[index];
data.translation = translation; data.translation = translation;
data.translationSet = true;
} }
void AvatarData::clearJointData(const QString& name) { void AvatarData::clearJointData(const QString& name) {
@ -858,7 +861,6 @@ void AvatarData::setJointTranslations(QVector<glm::vec3> jointTranslations) {
"setJointTranslations", Qt::BlockingQueuedConnection, "setJointTranslations", Qt::BlockingQueuedConnection,
Q_ARG(QVector<glm::vec3>, jointTranslations)); Q_ARG(QVector<glm::vec3>, jointTranslations));
} }
if (_jointData.size() < jointTranslations.size()) { if (_jointData.size() < jointTranslations.size()) {
_jointData.resize(jointTranslations.size()); _jointData.resize(jointTranslations.size());
} }
@ -1100,6 +1102,7 @@ void AvatarData::sendIdentityPacket() {
void AvatarData::updateJointMappings() { void AvatarData::updateJointMappings() {
_jointIndices.clear(); _jointIndices.clear();
_jointNames.clear(); _jointNames.clear();
_jointData.clear();
if (_skeletonModelURL.fileName().toLower().endsWith(".fst")) { if (_skeletonModelURL.fileName().toLower().endsWith(".fst")) {
QNetworkAccessManager& networkAccessManager = NetworkAccessManager::getInstance(); QNetworkAccessManager& networkAccessManager = NetworkAccessManager::getInstance();
@ -1457,7 +1460,6 @@ void AvatarData::fromJson(const QJsonObject& json) {
auto joint = jointDataFromJsonValue(jointJson); auto joint = jointDataFromJsonValue(jointJson);
jointArray.push_back(joint); jointArray.push_back(joint);
setJointData(i, joint.rotation, joint.translation); setJointData(i, joint.rotation, joint.translation);
_jointData[i].rotationSet = true; // Have to do that to broadcast the avatar new pose
i++; i++;
} }
setRawJointData(jointArray); setRawJointData(jointArray);