diff --git a/assignment-client/src/Agent.h b/assignment-client/src/Agent.h index 7d47c8e713..2b5ff51b49 100644 --- a/assignment-client/src/Agent.h +++ b/assignment-client/src/Agent.h @@ -21,6 +21,7 @@ #include #include +#include #include #include #include diff --git a/assignment-client/src/avatars/AvatarMixer.cpp b/assignment-client/src/avatars/AvatarMixer.cpp index a5eba6ad11..56fb15c9f0 100644 --- a/assignment-client/src/avatars/AvatarMixer.cpp +++ b/assignment-client/src/avatars/AvatarMixer.cpp @@ -54,7 +54,7 @@ AvatarMixer::AvatarMixer(ReceivedMessage& message) : packetReceiver.registerListener(PacketType::RadiusIgnoreRequest, this, "handleRadiusIgnoreRequestPacket"); packetReceiver.registerListener(PacketType::RequestsDomainListData, this, "handleRequestsDomainListDataPacket"); packetReceiver.registerListener(PacketType::AvatarIdentityRequest, this, "handleAvatarIdentityRequestPacket"); - packetReceiver.registerListener(PacketType::SetAvatarTraits, this, "handleSetAvatarTraitsMessage"); + packetReceiver.registerListener(PacketType::SetAvatarTraits, this, "queueIncomingPacket"); packetReceiver.registerListenerForTypes({ PacketType::ReplicatedAvatarIdentity, @@ -607,10 +607,6 @@ void AvatarMixer::handleAvatarIdentityPacket(QSharedPointer mes _handleAvatarIdentityPacketElapsedTime += (end - start); } -void AvatarMixer::handleSetAvatarTraitsMessage(QSharedPointer message, SharedNodePointer senderNode) { - qDebug() << "Got a traits packet of" << message->getSize() << "bytes from" << senderNode; -} - void AvatarMixer::handleAvatarIdentityRequestPacket(QSharedPointer message, SharedNodePointer senderNode) { if (message->getSize() < NUM_BYTES_RFC4122_UUID) { qCDebug(avatars) << "Malformed AvatarIdentityRequest received from" << message->getSenderSockAddr().toString(); diff --git a/assignment-client/src/avatars/AvatarMixer.h b/assignment-client/src/avatars/AvatarMixer.h index b0405a0b6d..14f84c9e7b 100644 --- a/assignment-client/src/avatars/AvatarMixer.h +++ b/assignment-client/src/avatars/AvatarMixer.h @@ -48,7 +48,6 @@ private slots: void handleAdjustAvatarSorting(QSharedPointer message, SharedNodePointer senderNode); void handleAvatarQueryPacket(QSharedPointer message, SharedNodePointer senderNode); void handleAvatarIdentityPacket(QSharedPointer message, SharedNodePointer senderNode); - void handleSetAvatarTraitsMessage(QSharedPointer message, SharedNodePointer senderNode); void handleKillAvatarPacket(QSharedPointer message, SharedNodePointer senderNode); void handleNodeIgnoreRequestPacket(QSharedPointer message, SharedNodePointer senderNode); void handleRadiusIgnoreRequestPacket(QSharedPointer packet, SharedNodePointer sendingNode); @@ -127,9 +126,7 @@ private: RateCounter<> _loopRate; // this is the rate that the main thread tight loop runs - AvatarMixerSlavePool _slavePool; - }; #endif // hifi_AvatarMixer_h diff --git a/assignment-client/src/avatars/AvatarMixerClientData.cpp b/assignment-client/src/avatars/AvatarMixerClientData.cpp index 9aa3e88b52..f6718b839a 100644 --- a/assignment-client/src/avatars/AvatarMixerClientData.cpp +++ b/assignment-client/src/avatars/AvatarMixerClientData.cpp @@ -62,6 +62,9 @@ int AvatarMixerClientData::processPackets() { case PacketType::AvatarData: parseData(*packet); break; + case PacketType::SetAvatarTraits: + processSetTraitsMessage(*packet); + break; default: Q_UNREACHABLE(); } @@ -87,6 +90,11 @@ int AvatarMixerClientData::parseData(ReceivedMessage& message) { // compute the offset to the data payload return _avatar->parseDataFromBuffer(message.readWithoutCopy(message.getBytesLeftToRead())); } + +void AvatarMixerClientData::processSetTraitsMessage(ReceivedMessage& message) { + qDebug() << "Pulling a traits message of" << message.getSize(); +} + uint64_t AvatarMixerClientData::getLastBroadcastTime(const QUuid& nodeUUID) const { // return the matching PacketSequenceNumber, or the default if we don't have it auto nodeMatch = _lastBroadcastTimes.find(nodeUUID); diff --git a/assignment-client/src/avatars/AvatarMixerClientData.h b/assignment-client/src/avatars/AvatarMixerClientData.h index e038e81505..2e30b2c8a1 100644 --- a/assignment-client/src/avatars/AvatarMixerClientData.h +++ b/assignment-client/src/avatars/AvatarMixerClientData.h @@ -120,6 +120,8 @@ public: void queuePacket(QSharedPointer message, SharedNodePointer node); int processPackets(); // returns number of packets processed + void processSetTraitsMessage(ReceivedMessage& message); + private: struct PacketQueue : public std::queue> { QWeakPointer node; diff --git a/assignment-client/src/avatars/ScriptableAvatar.cpp b/assignment-client/src/avatars/ScriptableAvatar.cpp index e7210db83a..4e47cf96f1 100644 --- a/assignment-client/src/avatars/ScriptableAvatar.cpp +++ b/assignment-client/src/avatars/ScriptableAvatar.cpp @@ -61,7 +61,10 @@ AnimationDetails ScriptableAvatar::getAnimationDetails() { void ScriptableAvatar::setSkeletonModelURL(const QUrl& skeletonModelURL) { _bind.reset(); _animSkeleton.reset(); + AvatarData::setSkeletonModelURL(skeletonModelURL); + + _clientTraitsHandler.markTraitChanged(AvatarTraits::SkeletonModelURL); } static AnimPose composeAnimPose(const FBXJoint& fbxJoint, const glm::quat rotation, const glm::vec3 translation) { @@ -137,4 +140,6 @@ void ScriptableAvatar::update(float deltatime) { _animation.clear(); } } + + _clientTraitsHandler.sendChangedTraitsToMixer(); } diff --git a/assignment-client/src/avatars/ScriptableAvatar.h b/assignment-client/src/avatars/ScriptableAvatar.h index d34ad2d21e..8e3d779dda 100644 --- a/assignment-client/src/avatars/ScriptableAvatar.h +++ b/assignment-client/src/avatars/ScriptableAvatar.h @@ -15,6 +15,7 @@ #include #include #include +#include #include /**jsdoc @@ -123,7 +124,7 @@ class ScriptableAvatar : public AvatarData, public Dependency { Q_OBJECT public: - + /**jsdoc * @function Avatar.startAnimation * @param {string} url @@ -164,6 +165,8 @@ private: QStringList _maskedJoints; AnimationPointer _bind; // a sleazy way to get the skeleton, given the various library/cmake dependencies std::shared_ptr _animSkeleton; + + ClientTraitsHandler _clientTraitsHandler { this }; }; #endif // hifi_ScriptableAvatar_h diff --git a/interface/src/avatar/MyAvatar.cpp b/interface/src/avatar/MyAvatar.cpp index 3ba2cbfc1e..53ad8c0a0f 100755 --- a/interface/src/avatar/MyAvatar.cpp +++ b/interface/src/avatar/MyAvatar.cpp @@ -1669,7 +1669,10 @@ void MyAvatar::clearJointsData() { void MyAvatar::setSkeletonModelURL(const QUrl& skeletonModelURL) { _skeletonModelChangeCount++; int skeletonModelChangeCount = _skeletonModelChangeCount; + + auto previousSkeletonModelURL = _skeletonModelURL; Avatar::setSkeletonModelURL(skeletonModelURL); + _skeletonModel->setTagMask(render::hifi::TAG_NONE); _skeletonModel->setGroupCulled(true); _skeletonModel->setVisibleInScene(true, qApp->getMain3DScene()); @@ -1700,7 +1703,11 @@ void MyAvatar::setSkeletonModelURL(const QUrl& skeletonModelURL) { emit skeletonChanged(); emit skeletonModelURLChanged(); - _clientTraitsHandler.markTraitChanged(AvatarTraits::SkeletonModelURL); + if (previousSkeletonModelURL != _skeletonModelURL) { + _clientTraitsHandler.markTraitChanged(AvatarTraits::SkeletonModelURL); + } else { + qDebug() << "Not marking skeleton model URL trait changed since the new value matches the previous"; + } } void MyAvatar::removeAvatarEntities(const std::function& condition) { diff --git a/libraries/avatars/src/AvatarTraits.h b/libraries/avatars/src/AvatarTraits.h index ebeaeaea20..c35bfae95c 100644 --- a/libraries/avatars/src/AvatarTraits.h +++ b/libraries/avatars/src/AvatarTraits.h @@ -22,8 +22,6 @@ namespace AvatarTraits { using TraitVersion = uint32_t; const TraitVersion DEFAULT_TRAIT_VERSION = 0; - - using TraitVersions = std::vector; } #endif // hifi_AvatarTraits_h