13 #ifndef hifi_AvatarHashMap_h
14 #define hifi_AvatarHashMap_h
16 #include <QtCore/QHash>
17 #include <QtCore/QSharedPointer>
18 #include <QtCore/QUuid>
24 #include <glm/glm.hpp>
26 #include <DependencyManager.h>
30 #include "ScriptAvatarData.h"
32 #include "AvatarData.h"
33 #include "AssociatedTraitValues.h"
35 const int CLIENT_TO_AVATAR_MIXER_BROADCAST_FRAMES_PER_SECOND = 50;
36 const quint64 MIN_TIME_BETWEEN_MY_AVATAR_DATA_SENDS = USECS_PER_SECOND / CLIENT_TO_AVATAR_MIXER_BROADCAST_FRAMES_PER_SECOND;
50 class AvatarReplicas {
53 void addReplica(
const QUuid& parentID, AvatarSharedPointer replica);
54 std::vector<QUuid> getReplicaIDs(
const QUuid& parentID);
55 void parseDataFromBuffer(
const QUuid& parentID,
const QByteArray& buffer);
56 void processAvatarIdentity(
const QUuid& parentID,
const QByteArray& identityData,
bool& identityChanged,
bool& displayNameChanged);
57 void removeReplicas(
const QUuid& parentID);
58 std::vector<AvatarSharedPointer> takeReplicas(
const QUuid& parentID);
59 void processTrait(
const QUuid& parentID, AvatarTraits::TraitType traitType, QByteArray traitBinaryData);
60 void processDeletedTraitInstance(
const QUuid& parentID, AvatarTraits::TraitType traitType, AvatarTraits::TraitInstanceID instanceID);
61 void processTraitInstance(
const QUuid& parentID, AvatarTraits::TraitType traitType,
62 AvatarTraits::TraitInstanceID instanceID, QByteArray traitBinaryData);
63 void setReplicaCount(
int count) { _replicaCount = count; }
64 int getReplicaCount() {
return _replicaCount; }
67 std::map<QUuid, std::vector<AvatarSharedPointer>> _replicasMap;
68 int _replicaCount { 0 };
72 class AvatarHashMap :
public QObject,
public Dependency {
77 AvatarHash getHashCopy() { QReadLocker lock(&_hashLock);
return _avatarHash; }
78 const AvatarHash getHashCopy()
const { QReadLocker lock(&_hashLock);
return _avatarHash; }
79 int size() { QReadLocker lock(&_hashLock);
return _avatarHash.size(); }
93 Q_INVOKABLE QVector<QUuid> getAvatarIdentifiers();
108 Q_INVOKABLE QVector<QUuid> getAvatarsInRange(
const glm::vec3& position,
float rangeMeters)
const;
117 Q_INVOKABLE
virtual ScriptAvatarData* getAvatar(QUuid avatarID) {
return new ScriptAvatarData(getAvatarBySessionID(avatarID)); }
119 virtual AvatarSharedPointer getAvatarBySessionID(
const QUuid& sessionID)
const {
return findAvatar(sessionID); }
120 int numberOfAvatarsInRange(
const glm::vec3& position,
float rangeMeters);
122 void setReplicaCount(
int count);
123 int getReplicaCount() {
return _replicas.getReplicaCount(); };
125 virtual void clearOtherAvatars();
141 void avatarAddedEvent(
const QUuid& sessionUUID);
155 void avatarRemovedEvent(
const QUuid& sessionUUID);
170 void avatarSessionChangedEvent(
const QUuid& sessionUUID,
const QUuid& oldUUID);
182 bool isAvatarInRange(
const glm::vec3 & position,
const float range);
192 void sessionUUIDChanged(
const QUuid& sessionUUID,
const QUuid& oldUUID);
200 void processAvatarDataPacket(QSharedPointer<ReceivedMessage> message, SharedNodePointer sendingNode);
208 void processAvatarIdentityPacket(QSharedPointer<ReceivedMessage> message, SharedNodePointer sendingNode);
216 void processBulkAvatarTraits(QSharedPointer<ReceivedMessage> message, SharedNodePointer sendingNode);
224 void processKillAvatar(QSharedPointer<ReceivedMessage> message, SharedNodePointer sendingNode);
229 virtual AvatarSharedPointer parseAvatarData(QSharedPointer<ReceivedMessage> message, SharedNodePointer sendingNode);
230 virtual AvatarSharedPointer newSharedAvatar(
const QUuid& sessionUUID);
231 virtual AvatarSharedPointer addAvatar(
const QUuid& sessionUUID,
const QWeakPointer<Node>& mixerWeakPointer);
232 AvatarSharedPointer newOrExistingAvatar(
const QUuid& sessionUUID,
const QWeakPointer<Node>& mixerWeakPointer,
234 virtual AvatarSharedPointer findAvatar(
const QUuid& sessionUUID)
const;
235 virtual void removeAvatar(
const QUuid& sessionUUID, KillAvatarReason removalReason = KillAvatarReason::NoReason);
237 virtual void handleRemovedAvatar(
const AvatarSharedPointer& removedAvatar, KillAvatarReason removalReason = KillAvatarReason::NoReason);
239 mutable QReadWriteLock _hashLock;
240 AvatarHash _avatarHash;
242 std::unordered_map<QUuid, AvatarTraits::TraitVersions> _processedTraitVersions;
243 AvatarReplicas _replicas;
246 QUuid _lastOwnerSessionUUID;