From 091efaee60ccf3dbefb715d5d7b4ec0f82047455 Mon Sep 17 00:00:00 2001 From: David Rowe Date: Tue, 9 Mar 2021 11:15:26 +1300 Subject: [PATCH] Don't rez own avatar entities if don't have permission --- interface/src/avatar/MyAvatar.cpp | 27 +++++++++++++++++++++++++++ interface/src/avatar/MyAvatar.h | 2 ++ libraries/networking/src/NodeList.cpp | 4 ---- 3 files changed, 29 insertions(+), 4 deletions(-) diff --git a/interface/src/avatar/MyAvatar.cpp b/interface/src/avatar/MyAvatar.cpp index 0f66f3bb41..3227543e8e 100644 --- a/interface/src/avatar/MyAvatar.cpp +++ b/interface/src/avatar/MyAvatar.cpp @@ -278,6 +278,9 @@ MyAvatar::MyAvatar(QThread* thread) : // when we leave a domain we lift whatever restrictions that domain may have placed on our scale connect(&domainHandler, &DomainHandler::disconnectedFromDomain, this, &MyAvatar::leaveDomain); + auto nodeList = DependencyManager::get(); + connect(nodeList.data(), &NodeList::canRezAvatarEntitiesChanged, this, &MyAvatar::handleCanRezAvatarEntitiesChanged); + _bodySensorMatrix = deriveBodyFromHMDSensor(); using namespace recording; @@ -1533,6 +1536,11 @@ void MyAvatar::storeAvatarEntityDataPayload(const QUuid& entityID, const QByteAr void MyAvatar::clearAvatarEntity(const QUuid& entityID, bool requiresRemovalFromTree) { // NOTE: the requiresRemovalFromTree argument is unused + if (!DependencyManager::get()->getThisNodeCanRezAvatarEntities()) { + // Don't delete potentially non-rezzed avatar entities, otherwise they're removed from settings. + return; + } + AvatarData::clearAvatarEntity(entityID); _avatarEntitiesLock.withWriteLock([&] { _cachedAvatarEntityBlobsToDelete.push_back(entityID); @@ -1564,6 +1572,25 @@ void MyAvatar::sanitizeAvatarEntityProperties(EntityItemProperties& properties) properties.markAllChanged(); } +void MyAvatar::addAvatarEntitiesToTree() { + AvatarEntityMap::const_iterator constItr = _cachedAvatarEntityBlobs.begin(); + while (constItr != _cachedAvatarEntityBlobs.end()) { + QUuid id = constItr.key(); + _entitiesToAdd.push_back(id); // worked once: hat shown. then unshown when permissions removed but then entity was deleted somewhere along the line! + ++constItr; + } +} + +void MyAvatar::handleCanRezAvatarEntitiesChanged(bool canRezAvatarEntities) { + if (canRezAvatarEntities) { + // Start displaying avatar entities. + addAvatarEntitiesToTree(); + } else { + // Stop displaying avatar entities. + removeAvatarEntitiesFromTree(); + } +} + void MyAvatar::handleChangedAvatarEntityData() { // NOTE: this is a per-frame update if (getID().isNull() || diff --git a/interface/src/avatar/MyAvatar.h b/interface/src/avatar/MyAvatar.h index 3d278cf983..ee98e2e7a0 100644 --- a/interface/src/avatar/MyAvatar.h +++ b/interface/src/avatar/MyAvatar.h @@ -2656,6 +2656,7 @@ private slots: protected: void handleChangedAvatarEntityData(); + void handleCanRezAvatarEntitiesChanged(bool canRezAvatarEntities); virtual void beParentOfChild(SpatiallyNestablePointer newChild) const override; virtual void forgetChild(SpatiallyNestablePointer newChild) const override; virtual void recalculateChildCauterization() const override; @@ -2710,6 +2711,7 @@ private: void attachmentDataToEntityProperties(const AttachmentData& data, EntityItemProperties& properties); AttachmentData entityPropertiesToAttachmentData(const EntityItemProperties& properties) const; bool findAvatarEntity(const QString& modelURL, const QString& jointName, QUuid& entityID); + void addAvatarEntitiesToTree(); bool cameraInsideHead(const glm::vec3& cameraPosition) const; diff --git a/libraries/networking/src/NodeList.cpp b/libraries/networking/src/NodeList.cpp index 9a073e1e78..1d7d6c257e 100644 --- a/libraries/networking/src/NodeList.cpp +++ b/libraries/networking/src/NodeList.cpp @@ -1385,10 +1385,6 @@ void NodeList::startThread() { void NodeList::adjustCanRezAvatarEntitiesPermissions(const QJsonObject& domainSettingsObject, NodePermissions& permissions, bool notify) { - if (domainSettingsObject.isEmpty()) { - // We don't have the information necessary to adjust permissions, yet. - return; - } const double CANREZAVATARENTITIES_INTRODUCED_VERSION = 2.5; auto version = domainSettingsObject.value("version");