From 3730cbe36c829fa46a2bd83d340e5e2f21bf5d4c Mon Sep 17 00:00:00 2001 From: David Back Date: Thu, 17 May 2018 10:28:48 -0700 Subject: [PATCH] reconstruct cloneIDs lists on start, read/write locks on clone ID functions, fix removing last cloneable --- libraries/entities/src/EntityItem.cpp | 36 ++++++++++++++++++++------- libraries/entities/src/EntityItem.h | 3 ++- libraries/entities/src/EntityTree.cpp | 18 +++++++++++++- 3 files changed, 46 insertions(+), 11 deletions(-) diff --git a/libraries/entities/src/EntityItem.cpp b/libraries/entities/src/EntityItem.cpp index 1e95e999b1..e6aa572330 100644 --- a/libraries/entities/src/EntityItem.cpp +++ b/libraries/entities/src/EntityItem.cpp @@ -3096,18 +3096,36 @@ void EntityItem::setCloneOriginID(const QUuid& value) { } bool EntityItem::addCloneID(const QUuid& cloneID) { - if (!_cloneIDs.contains(cloneID)) { - _cloneIDs.append(cloneID); - return true; - } + withWriteLock([&] { + if (!_cloneIDs.contains(cloneID)) { + _cloneIDs.append(cloneID); + return true; + } + }); return false; } bool EntityItem::removeCloneID(const QUuid& cloneID) { - int index = _cloneIDs.indexOf(cloneID); - if (index > 0) { - _cloneIDs.removeAt(index); - return true; - } + withWriteLock([&] { + int index = _cloneIDs.indexOf(cloneID); + if (index >= 0) { + _cloneIDs.removeAt(index); + return true; + } + }); return false; } + +const QList EntityItem::getCloneIDs() const { + QList result; + withReadLock([&] { + result = _cloneIDs; + }); + return result; +} + +void EntityItem::setCloneIDs(const QList& cloneIDs) { + withWriteLock([&] { + _cloneIDs = cloneIDs; + }); +} diff --git a/libraries/entities/src/EntityItem.h b/libraries/entities/src/EntityItem.h index f314cd1418..cc8cefb17b 100644 --- a/libraries/entities/src/EntityItem.h +++ b/libraries/entities/src/EntityItem.h @@ -509,7 +509,8 @@ public: bool addCloneID(const QUuid& cloneID); bool removeCloneID(const QUuid& cloneID); - const QList& getCloneIDs() const { return _cloneIDs; } + const QList getCloneIDs() const; + void setCloneIDs(const QList& cloneIDs); signals: void requestRenderUpdate(); diff --git a/libraries/entities/src/EntityTree.cpp b/libraries/entities/src/EntityTree.cpp index b2daed4e72..c87f6d771a 100644 --- a/libraries/entities/src/EntityTree.cpp +++ b/libraries/entities/src/EntityTree.cpp @@ -631,7 +631,7 @@ void EntityTree::cleanupCloneIDs(const EntityItemID& entityID) { EntityItemPointer entity = findEntityByEntityItemID(entityID); if (entity) { // remove clone ID from it's clone origin's clone ID list if clone origin exists - const QUuid cloneOriginID = entity->getCloneOriginID(); + const QUuid& cloneOriginID = entity->getCloneOriginID(); if (!cloneOriginID.isNull()) { EntityItemPointer cloneOrigin = findEntityByID(cloneOriginID); if (cloneOrigin) { @@ -2385,6 +2385,8 @@ bool EntityTree::readFromMap(QVariantMap& map) { return false; } + QMap> cloneIDs; + bool success = true; foreach (QVariant entityVariant, entitiesQList) { // QVariantMap --> QScriptValue --> EntityItemProperties --> Entity @@ -2477,6 +2479,20 @@ bool EntityTree::readFromMap(QVariantMap& map) { qCDebug(entities) << "adding Entity failed:" << entityItemID << properties.getType(); success = false; } + + const QUuid& cloneOriginID = entity->getCloneOriginID(); + if (!cloneOriginID.isNull()) { + cloneIDs[cloneOriginID].push_back(entity->getEntityItemID()); + } + } + + for (auto iter = cloneIDs.begin(); iter != cloneIDs.end(); ++iter) { + const QUuid& entityID = iter.key(); + const QList& cloneIDs = iter.value(); + EntityItemPointer entity = findEntityByID(entityID); + if (entity) { + entity->setCloneIDs(cloneIDs); + } } return success;