Update AvatarHashMap to use packet callbacks

This commit is contained in:
Ryan Huffman 2015-07-09 09:24:28 -07:00
parent bb132e354b
commit 32b232c87a
2 changed files with 25 additions and 9 deletions

View file

@ -19,7 +19,6 @@
AvatarHashMap::AvatarHashMap() {
connect(DependencyManager::get<NodeList>().data(), &NodeList::uuidChanged, this, &AvatarHashMap::sessionUUIDChanged);
auto& packetReceiver = DependencyManager::get<NodeList>()->getPacketReceiver();
packetReceiver.registerPacketListener(PacketType::BulkAvatarData, this, "processAvatarDataPacket");
packetReceiver.registerPacketListener(PacketType::KillAvatar, this, "processKillAvatar");
@ -58,6 +57,10 @@ void AvatarHashMap::processAvatarDataPacket(std::unique_ptr<NLPacket> packet, Hi
int bytesRead = 0;
SharedNodePointer avatarMixer = DependencyManager::get<NodeList>()->nodeWithUUID(packet->getSourceID());
if (avatarMixer) {
avatarMixer->setLastHeardMicrostamp(usecTimestampNow());
}
// enumerate over all of the avatars in this packet
// only add them if mixerWeakPointer points to something (meaning that mixer is still around)
while (bytesRead < data.size() && avatarMixer.data()) {
@ -86,6 +89,11 @@ void AvatarHashMap::processAvatarIdentityPacket(std::unique_ptr<NLPacket> packet
QUuid sessionUUID;
SharedNodePointer avatarMixer = DependencyManager::get<NodeList>()->nodeWithUUID(packet->getSourceID());
if (avatarMixer) {
avatarMixer->setLastHeardMicrostamp(usecTimestampNow());
}
while (!identityStream.atEnd()) {
QUrl faceMeshURL, skeletonURL;
@ -96,7 +104,6 @@ void AvatarHashMap::processAvatarIdentityPacket(std::unique_ptr<NLPacket> packet
// mesh URL for a UUID, find avatar in our list
AvatarSharedPointer avatar = _avatarHash.value(sessionUUID);
if (!avatar) {
SharedNodePointer avatarMixer = DependencyManager::get<NodeList>()->nodeWithUUID(packet->getSourceID());
avatar = addAvatar(sessionUUID, avatarMixer);
}
if (avatar->getFaceModelURL() != faceMeshURL) {
@ -121,9 +128,13 @@ void AvatarHashMap::processAvatarBillboardPacket(std::unique_ptr<NLPacket> packe
const auto data = QByteArray::fromRawData(packet->getPayload(), packet->size);
QUuid sessionUUID = QUuid::fromRfc4122(QByteArray::fromRawData(data, NUM_BYTES_RFC4122_UUID));
SharedNodePointer avatarMixer = DependencyManager::get<NodeList>()->nodeWithUUID(packet->getSourceID());
if (avatarMixer) {
avatarMixer->setLastHeardMicrostamp(usecTimestampNow());
}
AvatarSharedPointer avatar = _avatarHash.value(sessionUUID);
if (!avatar) {
SharedNodePointer avatarMixer = DependencyManager::get<NodeList>()->nodeWithUUID(packet->getSourceID());
avatar = addAvatar(sessionUUID, avatarMixer);
}
@ -134,6 +145,11 @@ void AvatarHashMap::processAvatarBillboardPacket(std::unique_ptr<NLPacket> packe
}
void AvatarHashMap::processKillAvatar(std::unique_ptr<NLPacket> packet, HifiSockAddr senderSockAddr) {
SharedNodePointer avatarMixer = DependencyManager::get<NodeList>()->nodeWithUUID(packet->getSourceID());
if (avatarMixer) {
avatarMixer->setLastHeardMicrostamp(usecTimestampNow());
}
// read the node id
QUuid sessionUUID = QUuid::fromRfc4122(QByteArray(packet->getPayload(), NUM_BYTES_RFC4122_UUID));
removeAvatar(sessionUUID);

View file

@ -27,29 +27,29 @@
class AvatarHashMap : public QObject, public Dependency {
Q_OBJECT
SINGLETON_DEPENDENCY
public:
const AvatarHash& getAvatarHash() { return _avatarHash; }
int size() { return _avatarHash.size(); }
public slots:
void processAvatarMixerDatagram(const QByteArray& datagram, const QWeakPointer<Node>& mixerWeakPointer);
bool isAvatarInRange(const glm::vec3 & position, const float range);
private slots:
void sessionUUIDChanged(const QUuid& sessionUUID, const QUuid& oldUUID);
void processAvatarDataPacket(std::unique_ptr<NLPacket> packet, HifiSockAddr senderSockAddr);
void processAvatarIdentityPacket(std::unique_ptr<NLPacket> packet, HifiSockAddr senderSockAddr);
void processAvatarBillboardPacket(std::unique_ptr<NLPacket> packet, HifiSockAddr senderSockAddr);
void processKillAvatar(std::unique_ptr<NLPacket> packet, HifiSockAddr senderSockAddr);
protected:
AvatarHashMap();
virtual AvatarSharedPointer newSharedAvatar();
virtual AvatarSharedPointer addAvatar(const QUuid& sessionUUID, const QWeakPointer<Node>& mixerWeakPointer);
virtual void removeAvatar(const QUuid& sessionUUID);
AvatarHash _avatarHash;
private: