From 7692e858a10e4189f8ee68520fe52bfbb7893ba3 Mon Sep 17 00:00:00 2001 From: Andrew Meadows Date: Wed, 13 Nov 2019 15:30:16 -0800 Subject: [PATCH] use EntityItemID rather than QUuid --- interface/src/avatar/MyAvatar.cpp | 54 ++++++++++++------------------- interface/src/avatar/MyAvatar.h | 14 ++++---- 2 files changed, 27 insertions(+), 41 deletions(-) diff --git a/interface/src/avatar/MyAvatar.cpp b/interface/src/avatar/MyAvatar.cpp index 667c315121..503a404000 100644 --- a/interface/src/avatar/MyAvatar.cpp +++ b/interface/src/avatar/MyAvatar.cpp @@ -1587,24 +1587,20 @@ void MyAvatar::handleChangedAvatarEntityData() { // AvatarData::_packedAvatarEntityData via deeper logic. // move the lists to minimize lock time - std::vector cachedBlobsToDelete; - std::vector cachedBlobsToUpdate; - std::vector idsToDelete; - idsToDelete.reserve(_entitiesToDelete.size()); - std::vector entitiesToAdd; - std::vector entitiesToUpdate; + std::vector cachedBlobsToDelete; + std::vector cachedBlobsToUpdate; + std::vector entitiesToDelete; + std::vector entitiesToAdd; + std::vector entitiesToUpdate; _avatarEntitiesLock.withWriteLock([&] { - cachedBlobsToDelete = std::move(_cachedAvatarEntityBlobsToDelete); - cachedBlobsToUpdate = std::move(_cachedAvatarEntityBlobsToAddOrUpdate); - foreach (auto id, _entitiesToDelete) { - idsToDelete.push_back(id); - } - _entitiesToDelete.clear(); - entitiesToAdd = std::move(_entitiesToAdd); - entitiesToUpdate = std::move(_entitiesToUpdate); + cachedBlobsToDelete.swap(_cachedAvatarEntityBlobsToDelete); + cachedBlobsToUpdate.swap(_cachedAvatarEntityBlobsToAddOrUpdate); + entitiesToDelete.swap(_entitiesToDelete); + entitiesToAdd.swap(_entitiesToAdd); + entitiesToUpdate.swap(_entitiesToUpdate); }); - auto removeAllInstancesHelper = [] (const QUuid& id, std::vector& v) { + auto removeAllInstancesHelper = [] (const EntityItemID& id, std::vector& v) { uint32_t i = 0; while (i < v.size()) { if (id == v[i]) { @@ -1617,7 +1613,7 @@ void MyAvatar::handleChangedAvatarEntityData() { }; // remove delete-add and delete-update overlap - for (const auto& id : idsToDelete) { + for (const auto& id : entitiesToDelete) { removeAllInstancesHelper(id, cachedBlobsToUpdate); removeAllInstancesHelper(id, entitiesToAdd); removeAllInstancesHelper(id, entitiesToUpdate); @@ -1631,9 +1627,7 @@ void MyAvatar::handleChangedAvatarEntityData() { } // DELETE real entities - entityTree->withWriteLock([&] { - entityTree->deleteEntitiesByID(idsToDelete); - }); + entityTree->deleteEntitiesByID(entitiesToDelete); // ADD real entities EntityEditPacketSender* packetSender = qApp->getEntityEditPacketSender(); @@ -1704,7 +1698,7 @@ void MyAvatar::handleChangedAvatarEntityData() { _needToSaveAvatarEntitySettings = true; } // also remove from list of stale blobs to avoid failed entity lookup later - std::set::iterator blobItr = _staleCachedAvatarEntityBlobs.find(id); + std::set::iterator blobItr = _staleCachedAvatarEntityBlobs.find(id); if (blobItr != _staleCachedAvatarEntityBlobs.end()) { _staleCachedAvatarEntityBlobs.erase(blobItr); } @@ -1746,7 +1740,7 @@ void MyAvatar::handleChangedAvatarEntityData() { // we have a client traits handler // flag removed entities as deleted so that changes are sent next frame _avatarEntitiesLock.withWriteLock([&] { - for (const auto& id : idsToDelete) { + for (const auto& id : entitiesToDelete) { if (_packedAvatarEntityData.find(id) != _packedAvatarEntityData.end()) { _clientTraitsHandler->markInstancedTraitDeleted(AvatarTraits::AvatarEntity, id); } @@ -1772,9 +1766,9 @@ bool MyAvatar::updateStaleAvatarEntityBlobs() const { return false; } - std::set staleBlobs = std::move(_staleCachedAvatarEntityBlobs); + std::set staleIDs = std::move(_staleCachedAvatarEntityBlobs); int32_t numFound = 0; - for (const auto& id : staleBlobs) { + for (const auto& id : staleIDs) { bool found = false; EntityItemProperties properties; entityTree->withReadLock([&] { @@ -1859,7 +1853,7 @@ void MyAvatar::setAvatarEntityData(const AvatarEntityMap& avatarEntityData) { ++constItr; } // find and erase deleted IDs from _cachedAvatarEntityBlobs - std::vector deletedIDs; + std::vector deletedIDs; AvatarEntityMap::iterator itr = _cachedAvatarEntityBlobs.begin(); while (itr != _cachedAvatarEntityBlobs.end()) { QUuid id = itr.key(); @@ -2491,16 +2485,8 @@ void MyAvatar::clearWornAvatarEntities() { _avatarEntitiesLock.withReadLock([&] { avatarEntityIDs = _packedAvatarEntityData.keys(); }); - auto treeRenderer = DependencyManager::get(); - EntityTreePointer entityTree = treeRenderer ? treeRenderer->getTree() : nullptr; - if (entityTree) { - for (auto entityID : avatarEntityIDs) { - auto entity = entityTree->findEntityByID(entityID); - if (entity && isWearableEntity(entity)) { - treeRenderer->deleteEntity(entityID); - clearAvatarEntity(entityID); - } - } + for (auto entityID : avatarEntityIDs) { + removeWornAvatarEntity(entityID); } } diff --git a/interface/src/avatar/MyAvatar.h b/interface/src/avatar/MyAvatar.h index 5a59e6129a..cac9f54be5 100644 --- a/interface/src/avatar/MyAvatar.h +++ b/interface/src/avatar/MyAvatar.h @@ -2970,19 +2970,19 @@ private: // correctly stored in _cachedAvatarEntityBlobs. These come from loadAvatarEntityDataFromSettings() and // setAvatarEntityData(). These changes need to be extracted from _cachedAvatarEntityBlobs and applied to // real EntityItems. - std::vector _entitiesToDelete; - std::vector _entitiesToAdd; - std::vector _entitiesToUpdate; + std::vector _entitiesToDelete; + std::vector _entitiesToAdd; + std::vector _entitiesToUpdate; // // The _cachedAvatarEntityBlobsToDelete/Add/Update lists are for changes whose "authoritative sources" are // already reflected in real EntityItems. These changes need to be propagated to _cachedAvatarEntityBlobs // and eventually to settings. - std::vector _cachedAvatarEntityBlobsToDelete; - std::vector _cachedAvatarEntityBlobsToAddOrUpdate; - std::vector _cachedAvatarEntityBlobUpdatesToSkip; + std::vector _cachedAvatarEntityBlobsToDelete; + std::vector _cachedAvatarEntityBlobsToAddOrUpdate; + std::vector _cachedAvatarEntityBlobUpdatesToSkip; // // Also these lists for tracking delayed changes to blobs and Settings - mutable std::set _staleCachedAvatarEntityBlobs; + mutable std::set _staleCachedAvatarEntityBlobs; // // keep a ScriptEngine around so we don't have to instantiate on the fly (these are very slow to create/delete) mutable std::mutex _scriptEngineLock;