add skeleton trait sending to Agent, queuing in AvatarMixer

This commit is contained in:
Stephen Birarda 2018-07-30 17:33:01 -07:00
parent 486557e28a
commit ac835650b7
9 changed files with 29 additions and 12 deletions

View file

@ -21,6 +21,7 @@
#include <QtCore/QTimer>
#include <QUuid>
#include <ClientTraitsHandler.h>
#include <EntityEditPacketSender.h>
#include <EntityTree.h>
#include <ScriptEngine.h>

View file

@ -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<ReceivedMessage> mes
_handleAvatarIdentityPacketElapsedTime += (end - start);
}
void AvatarMixer::handleSetAvatarTraitsMessage(QSharedPointer<ReceivedMessage> message, SharedNodePointer senderNode) {
qDebug() << "Got a traits packet of" << message->getSize() << "bytes from" << senderNode;
}
void AvatarMixer::handleAvatarIdentityRequestPacket(QSharedPointer<ReceivedMessage> message, SharedNodePointer senderNode) {
if (message->getSize() < NUM_BYTES_RFC4122_UUID) {
qCDebug(avatars) << "Malformed AvatarIdentityRequest received from" << message->getSenderSockAddr().toString();

View file

@ -48,7 +48,6 @@ private slots:
void handleAdjustAvatarSorting(QSharedPointer<ReceivedMessage> message, SharedNodePointer senderNode);
void handleAvatarQueryPacket(QSharedPointer<ReceivedMessage> message, SharedNodePointer senderNode);
void handleAvatarIdentityPacket(QSharedPointer<ReceivedMessage> message, SharedNodePointer senderNode);
void handleSetAvatarTraitsMessage(QSharedPointer<ReceivedMessage> message, SharedNodePointer senderNode);
void handleKillAvatarPacket(QSharedPointer<ReceivedMessage> message, SharedNodePointer senderNode);
void handleNodeIgnoreRequestPacket(QSharedPointer<ReceivedMessage> message, SharedNodePointer senderNode);
void handleRadiusIgnoreRequestPacket(QSharedPointer<ReceivedMessage> 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

View file

@ -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);

View file

@ -120,6 +120,8 @@ public:
void queuePacket(QSharedPointer<ReceivedMessage> message, SharedNodePointer node);
int processPackets(); // returns number of packets processed
void processSetTraitsMessage(ReceivedMessage& message);
private:
struct PacketQueue : public std::queue<QSharedPointer<ReceivedMessage>> {
QWeakPointer<Node> node;

View file

@ -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();
}

View file

@ -15,6 +15,7 @@
#include <AnimationCache.h>
#include <AnimSkeleton.h>
#include <AvatarData.h>
#include <ClientTraitsHandler.h>
#include <ScriptEngine.h>
/**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> _animSkeleton;
ClientTraitsHandler _clientTraitsHandler { this };
};
#endif // hifi_ScriptableAvatar_h

View file

@ -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<bool(const QUuid& entityID)>& condition) {

View file

@ -22,8 +22,6 @@ namespace AvatarTraits {
using TraitVersion = uint32_t;
const TraitVersion DEFAULT_TRAIT_VERSION = 0;
using TraitVersions = std::vector<TraitVersion>;
}
#endif // hifi_AvatarTraits_h