From 4daa0c65378c25ff8bb3bfbcd55cb5fdae8e4126 Mon Sep 17 00:00:00 2001 From: Zach Fox Date: Fri, 13 Jul 2018 12:47:45 -0700 Subject: [PATCH] CR feedback --- interface/resources/qml/hifi/Pal.qml | 6 +++--- interface/src/avatar/AvatarManager.cpp | 14 +++++++++++--- interface/src/avatar/AvatarManager.h | 11 ++++++++++- scripts/system/pal.js | 10 +++++----- 4 files changed, 29 insertions(+), 12 deletions(-) diff --git a/interface/resources/qml/hifi/Pal.qml b/interface/resources/qml/hifi/Pal.qml index 06ad57139d..c66ed1fe18 100644 --- a/interface/resources/qml/hifi/Pal.qml +++ b/interface/resources/qml/hifi/Pal.qml @@ -1120,7 +1120,7 @@ Rectangle { var data = message.params; var index = -1; iAmAdmin = Users.canKick; - index = findNearbySessionIndex(MyAvatar.sessionUUID, data); + index = findNearbySessionIndex("", data); if (index !== -1) { myData = data[index]; data.splice(index, 1); @@ -1197,8 +1197,8 @@ Rectangle { for (var userId in message.params) { var audioLevel = message.params[userId][0]; var avgAudioLevel = message.params[userId][1]; - // If the userId is 0, we're updating "myData". - if (userId == 0) { + // If the userId is "", we're updating "myData". + if (userId === "") { myData.audioLevel = audioLevel; myCard.audioLevel = audioLevel; // Defensive programming myData.avgAudioLevel = avgAudioLevel; diff --git a/interface/src/avatar/AvatarManager.cpp b/interface/src/avatar/AvatarManager.cpp index a7ee5f4869..bb9a78d546 100644 --- a/interface/src/avatar/AvatarManager.cpp +++ b/interface/src/avatar/AvatarManager.cpp @@ -670,7 +670,7 @@ void AvatarManager::setAvatarSortCoefficient(const QString& name, const QScriptV } } -QString AvatarManager::getPalData(const QList specificAvatarIdentifiers) { + QVariantMap AvatarManager::getPalData(const QList specificAvatarIdentifiers) { QJsonArray palData; auto avatarMap = getHashCopy(); @@ -680,6 +680,13 @@ QString AvatarManager::getPalData(const QList specificAvatarIdentifiers QString currentSessionUUID = avatar->getSessionUUID().toString(); if (specificAvatarIdentifiers.isEmpty() || specificAvatarIdentifiers.contains(currentSessionUUID)) { QJsonObject thisAvatarPalData; + + auto myAvatar = DependencyManager::get()->getMyAvatar(); + + if (currentSessionUUID == myAvatar->getSessionUUID().toString()) { + currentSessionUUID = ""; + } + thisAvatarPalData.insert("sessionUUID", currentSessionUUID); thisAvatarPalData.insert("sessionDisplayName", avatar->getSessionDisplayName()); thisAvatarPalData.insert("audioLoudness", avatar->getAudioLoudness()); @@ -704,6 +711,7 @@ QString AvatarManager::getPalData(const QList specificAvatarIdentifiers } ++itr; } - QJsonDocument doc(palData); - return doc.toJson(QJsonDocument::Compact); + QJsonObject doc; + doc.insert("data", palData); + return doc.toVariantMap(); } diff --git a/interface/src/avatar/AvatarManager.h b/interface/src/avatar/AvatarManager.h index 507767866b..c6f71b498d 100644 --- a/interface/src/avatar/AvatarManager.h +++ b/interface/src/avatar/AvatarManager.h @@ -157,7 +157,16 @@ public: */ Q_INVOKABLE void setAvatarSortCoefficient(const QString& name, const QScriptValue& value); - Q_INVOKABLE QString getPalData(const QList specificAvatarIdentifiers = QList()); + /**jsdoc + * Used in the PAL for getting PAL-related data about avatars nearby. Using this method is faster + * than iterating over each avatar and obtaining data about them in JavaScript, as that method + * locks and unlocks each avatar's data structure potentially hundreds of times per update tick. + * @function AvatarManager.getPalData + * @param {string list} specificAvatarIdentifiers - A list of specific Avatar Identifiers about which + * you want to get PAL data + * @returns {string} + */ + Q_INVOKABLE QVariantMap getPalData(const QList specificAvatarIdentifiers = QList()); float getMyAvatarSendRate() const { return _myAvatarSendRate.rate(); } int getIdentityRequestsSent() const { return _identityRequestsSent; } diff --git a/scripts/system/pal.js b/scripts/system/pal.js index b811f5e95a..d8dae80b85 100644 --- a/scripts/system/pal.js +++ b/scripts/system/pal.js @@ -448,7 +448,7 @@ function populateNearbyUserList(selectData, oldAudioData) { horizontalAngleNormal = filter && Quat.getUp(orientation); avatarsOfInterest = {}; - var avatarData = JSON.parse(AvatarList.getPalData()); + var avatarData = AvatarList.getPalData().data; avatarData.forEach(function (currentAvatarData) { var id = currentAvatarData.sessionUUID; @@ -487,7 +487,7 @@ function populateNearbyUserList(selectData, oldAudioData) { }; // Everyone needs to see admin status. Username and fingerprint returns default constructor output if the requesting user isn't an admin. Users.requestUsernameFromID(id); - if (id !== MyAvatar.sessionUUID) { + if (id !== "") { addAvatarNode(id); // No overlay for ourselves avatarsOfInterest[id] = true; } else { @@ -548,7 +548,7 @@ function updateAudioLevel(overlay, avatarData) { var param = {}; var level = [audioLevel, avgAudioLevel]; - var userId = avatarData.sessionUUID === MyAvatar.sessionUUID ? 0 : avatarData.sessionUUID; + var userId = avatarData.sessionUUID; param[userId] = level; sendToQml({ method: 'updateAudioLevel', params: param }); } @@ -557,12 +557,12 @@ var pingPong = true; function updateOverlays() { var eye = Camera.position; - var avatarData = JSON.parse(AvatarList.getPalData()); + var avatarData = AvatarList.getPalData().data; avatarData.forEach(function (currentAvatarData) { updateAudioLevel(overlay, currentAvatarData); - if (currentAvatarData.sessionUUID === MyAvatar.sessionUUID || !avatarsOfInterest[currentAvatarData.sessionUUID]) { + if (currentAvatarData.sessionUUID === "" || !avatarsOfInterest[currentAvatarData.sessionUUID]) { return; // don't update ourself, or avatars we're not interested in } var overlay = ExtendedOverlay.get(currentAvatarData.sessionUUID);