From 5ee1acc1eaca2cf38f61b309cb7e26e7168378d4 Mon Sep 17 00:00:00 2001 From: Seth Alves Date: Mon, 18 Jan 2016 12:45:12 -0800 Subject: [PATCH 1/4] expose avatar getParentID and setParentID to javascript --- interface/src/avatar/Avatar.h | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/interface/src/avatar/Avatar.h b/interface/src/avatar/Avatar.h index ddd1c612f1..d8cb73d25c 100644 --- a/interface/src/avatar/Avatar.h +++ b/interface/src/avatar/Avatar.h @@ -167,6 +167,10 @@ public: using SpatiallyNestable::setOrientation; virtual void setOrientation(const glm::quat& orientation) override; + // these just call through to the SpatiallyNestable versions, but they are here to expose these to javascript. + Q_INVOKABLE virtual QUuid getParentID() const { return SpatiallyNestable::getParentID(); } + Q_INVOKABLE virtual void setParentID(const QUuid& parentID) { SpatiallyNestable::setParentID(parentID); } + public slots: // FIXME - these should be migrated to use Pose data instead From 41c46423bade92a12c1b2c96e45aad44fd8a90d7 Mon Sep 17 00:00:00 2001 From: Seth Alves Date: Mon, 18 Jan 2016 13:09:09 -0800 Subject: [PATCH 2/4] add support for avatar set/get parent Joint Index, as well --- interface/src/avatar/Avatar.cpp | 24 ++++++++++++++++++++++++ interface/src/avatar/Avatar.h | 6 ++++-- 2 files changed, 28 insertions(+), 2 deletions(-) diff --git a/interface/src/avatar/Avatar.cpp b/interface/src/avatar/Avatar.cpp index 7cde674e52..7f0201d714 100644 --- a/interface/src/avatar/Avatar.cpp +++ b/interface/src/avatar/Avatar.cpp @@ -1209,3 +1209,27 @@ void Avatar::updatePalms() { _leftPalmPositionCache.set(leftPalmPosition); _rightPalmPositionCache.set(rightPalmPosition); } + +void Avatar::setParentID(const QUuid& parentID) { + bool success; + Transform beforeChangeTransform = getTransform(success); + SpatiallyNestable::setParentID(parentID); + if (success) { + setTransform(beforeChangeTransform, success); + if (!success) { + qDebug() << "Avatar::setParentID failed to reset avatar's location."; + } + } +} + +void Avatar::setParentJointIndex(quint16 parentJointIndex) { + bool success; + Transform beforeChangeTransform = getTransform(success); + SpatiallyNestable::setParentJointIndex(parentJointIndex); + if (success) { + setTransform(beforeChangeTransform, success); + if (!success) { + qDebug() << "Avatar::setParentJointIndex failed to reset avatar's location."; + } + } +} diff --git a/interface/src/avatar/Avatar.h b/interface/src/avatar/Avatar.h index d8cb73d25c..b3f27c474b 100644 --- a/interface/src/avatar/Avatar.h +++ b/interface/src/avatar/Avatar.h @@ -167,9 +167,11 @@ public: using SpatiallyNestable::setOrientation; virtual void setOrientation(const glm::quat& orientation) override; - // these just call through to the SpatiallyNestable versions, but they are here to expose these to javascript. + // these call through to the SpatiallyNestable versions, but they are here to expose these to javascript. Q_INVOKABLE virtual QUuid getParentID() const { return SpatiallyNestable::getParentID(); } - Q_INVOKABLE virtual void setParentID(const QUuid& parentID) { SpatiallyNestable::setParentID(parentID); } + Q_INVOKABLE virtual void setParentID(const QUuid& parentID); + Q_INVOKABLE virtual quint16 getParentJointIndex() const { return SpatiallyNestable::getParentJointIndex(); } + Q_INVOKABLE virtual void setParentJointIndex(quint16 parentJointIndex); public slots: From 135f25bde79c895e5304007dced67895a9589bd3 Mon Sep 17 00:00:00 2001 From: Seth Alves Date: Mon, 18 Jan 2016 15:35:54 -0800 Subject: [PATCH 3/4] changes so that avatar-mixer wont attempt to resolve a parentID --- libraries/avatars/src/AvatarData.cpp | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/libraries/avatars/src/AvatarData.cpp b/libraries/avatars/src/AvatarData.cpp index af8e1c1cda..bed46ed820 100644 --- a/libraries/avatars/src/AvatarData.cpp +++ b/libraries/avatars/src/AvatarData.cpp @@ -216,15 +216,13 @@ QByteArray AvatarData::toByteArray(bool cullSmallChanges, bool sendAll) { setAtBit(bitItems, IS_EYE_TRACKER_CONNECTED); } // referential state - bool success; - SpatiallyNestablePointer parent = getParentPointer(success); - if (parent && success) { + if (!getParentID().isNull()) { setAtBit(bitItems, HAS_REFERENTIAL); } *destinationBuffer++ = bitItems; - if (parent) { - QByteArray referentialAsBytes = parent->getID().toRfc4122(); + if (!getParentID().isNull()) { + QByteArray referentialAsBytes = getParentID().toRfc4122(); memcpy(destinationBuffer, referentialAsBytes.data(), referentialAsBytes.size()); destinationBuffer += referentialAsBytes.size(); memcpy(destinationBuffer, &_parentJointIndex, sizeof(_parentJointIndex)); @@ -492,10 +490,12 @@ int AvatarData::parseDataFromBuffer(const QByteArray& buffer) { // avatar's SkeletonModel might fall into the CPU expensive part of Model::updateClusterMatrices() when otherwise it // would not have required it. However, we know we can update many simultaneously animating avatars, and most // avatars will be moving constantly anyway, so I don't think we need to worry. - if (getBodyYaw() != yaw || getBodyPitch() != pitch || getBodyRoll() != roll) { + glm::quat currentOrientation = getLocalOrientation(); + glm::vec3 newEulerAngles(pitch, yaw, roll); + glm::quat newOrientation = glm::quat(glm::radians(newEulerAngles)); + if (currentOrientation != newOrientation) { _hasNewJointRotations = true; - glm::vec3 eulerAngles(pitch, yaw, roll); - setLocalOrientation(glm::quat(glm::radians(eulerAngles))); + setLocalOrientation(newOrientation); } // scale From 90847dc49c201be9df57ad9d40f9ccea45ac6e2c Mon Sep 17 00:00:00 2001 From: Seth Alves Date: Tue, 19 Jan 2016 15:00:33 -0800 Subject: [PATCH 4/4] oops --- libraries/avatars/src/AvatarData.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libraries/avatars/src/AvatarData.cpp b/libraries/avatars/src/AvatarData.cpp index c1a5ff7a27..5fd69128eb 100644 --- a/libraries/avatars/src/AvatarData.cpp +++ b/libraries/avatars/src/AvatarData.cpp @@ -222,7 +222,7 @@ QByteArray AvatarData::toByteArray(bool cullSmallChanges, bool sendAll) { } *destinationBuffer++ = bitItems; - if (parentID.isNull()) { + if (!parentID.isNull()) { QByteArray referentialAsBytes = parentID.toRfc4122(); memcpy(destinationBuffer, referentialAsBytes.data(), referentialAsBytes.size()); destinationBuffer += referentialAsBytes.size();