From e365d93ed909be8595e4b9d28847c8ef4aa1dc4f Mon Sep 17 00:00:00 2001 From: Seth Alves Date: Mon, 18 Jan 2016 16:50:26 -0800 Subject: [PATCH] don't save entites with invalid parentIDs (or with IDs that indicates an avatar) to the persist file --- libraries/entities/src/EntityTree.cpp | 5 +++-- libraries/entities/src/EntityTree.h | 3 ++- libraries/entities/src/RecurseOctreeToMapOperator.cpp | 10 ++++++++-- libraries/entities/src/RecurseOctreeToMapOperator.h | 4 +++- libraries/octree/src/Octree.cpp | 2 +- libraries/octree/src/Octree.h | 3 ++- libraries/shared/src/SpatiallyNestable.h | 2 ++ 7 files changed, 21 insertions(+), 8 deletions(-) diff --git a/libraries/entities/src/EntityTree.cpp b/libraries/entities/src/EntityTree.cpp index 1017f54f67..7acf2b6103 100644 --- a/libraries/entities/src/EntityTree.cpp +++ b/libraries/entities/src/EntityTree.cpp @@ -1291,12 +1291,13 @@ void EntityTree::remapIDs() { recurseTreeWithOperator(&theOperator); } -bool EntityTree::writeToMap(QVariantMap& entityDescription, OctreeElementPointer element, bool skipDefaultValues) { +bool EntityTree::writeToMap(QVariantMap& entityDescription, OctreeElementPointer element, bool skipDefaultValues, + bool skipThoseWithBadParents) { if (! entityDescription.contains("Entities")) { entityDescription["Entities"] = QVariantList(); } QScriptEngine scriptEngine; - RecurseOctreeToMapOperator theOperator(entityDescription, element, &scriptEngine, skipDefaultValues); + RecurseOctreeToMapOperator theOperator(entityDescription, element, &scriptEngine, skipDefaultValues, skipThoseWithBadParents); recurseTreeWithOperator(&theOperator); return true; } diff --git a/libraries/entities/src/EntityTree.h b/libraries/entities/src/EntityTree.h index 0f77c4af9a..ba3d7a012e 100644 --- a/libraries/entities/src/EntityTree.h +++ b/libraries/entities/src/EntityTree.h @@ -199,7 +199,8 @@ public: void remapIDs(); - virtual bool writeToMap(QVariantMap& entityDescription, OctreeElementPointer element, bool skipDefaultValues) override; + virtual bool writeToMap(QVariantMap& entityDescription, OctreeElementPointer element, bool skipDefaultValues, + bool skipThoseWithBadParents) override; virtual bool readFromMap(QVariantMap& entityDescription) override; float getContentsLargestDimension(); diff --git a/libraries/entities/src/RecurseOctreeToMapOperator.cpp b/libraries/entities/src/RecurseOctreeToMapOperator.cpp index 81465bfaf5..e930d5ef5f 100644 --- a/libraries/entities/src/RecurseOctreeToMapOperator.cpp +++ b/libraries/entities/src/RecurseOctreeToMapOperator.cpp @@ -16,12 +16,14 @@ RecurseOctreeToMapOperator::RecurseOctreeToMapOperator(QVariantMap& map, OctreeElementPointer top, QScriptEngine* engine, - bool skipDefaultValues) : + bool skipDefaultValues, + bool skipThoseWithBadParents) : RecurseOctreeOperator(), _map(map), _top(top), _engine(engine), - _skipDefaultValues(skipDefaultValues) + _skipDefaultValues(skipDefaultValues), + _skipThoseWithBadParents(skipThoseWithBadParents) { // if some element "top" was given, only save information for that element and its children. if (_top) { @@ -47,6 +49,10 @@ bool RecurseOctreeToMapOperator::postRecursion(OctreeElementPointer element) { QVariantList entitiesQList = qvariant_cast(_map["Entities"]); entityTreeElement->forEachEntity([&](EntityItemPointer entityItem) { + if (_skipThoseWithBadParents && !entityItem->isParentIDValid()) { + return; // we weren't able to resolve a parent from _parentID, so don't save this entity. + } + EntityItemProperties properties = entityItem->getProperties(); QScriptValue qScriptValues; if (_skipDefaultValues) { diff --git a/libraries/entities/src/RecurseOctreeToMapOperator.h b/libraries/entities/src/RecurseOctreeToMapOperator.h index 35c7f1b6a9..c64cf91b61 100644 --- a/libraries/entities/src/RecurseOctreeToMapOperator.h +++ b/libraries/entities/src/RecurseOctreeToMapOperator.h @@ -13,7 +13,8 @@ class RecurseOctreeToMapOperator : public RecurseOctreeOperator { public: - RecurseOctreeToMapOperator(QVariantMap& map, OctreeElementPointer top, QScriptEngine* engine, bool skipDefaultValues); + RecurseOctreeToMapOperator(QVariantMap& map, OctreeElementPointer top, QScriptEngine* engine, bool skipDefaultValues, + bool skipThoseWithBadParents); bool preRecursion(OctreeElementPointer element); bool postRecursion(OctreeElementPointer element); private: @@ -22,4 +23,5 @@ public: QScriptEngine* _engine; bool _withinTop; bool _skipDefaultValues; + bool _skipThoseWithBadParents; }; diff --git a/libraries/octree/src/Octree.cpp b/libraries/octree/src/Octree.cpp index bdad5682a9..a685c2580c 100644 --- a/libraries/octree/src/Octree.cpp +++ b/libraries/octree/src/Octree.cpp @@ -1919,7 +1919,7 @@ void Octree::writeToJSONFile(const char* fileName, OctreeElementPointer element, entityDescription["Version"] = (int) expectedVersion; // store the entity data - bool entityDescriptionSuccess = writeToMap(entityDescription, top, true); + bool entityDescriptionSuccess = writeToMap(entityDescription, top, true, true); if (!entityDescriptionSuccess) { qCritical("Failed to convert Entities to QVariantMap while saving to json."); return; diff --git a/libraries/octree/src/Octree.h b/libraries/octree/src/Octree.h index 789d0f5600..0939ae37f6 100644 --- a/libraries/octree/src/Octree.h +++ b/libraries/octree/src/Octree.h @@ -304,7 +304,8 @@ public: void writeToFile(const char* filename, OctreeElementPointer element = NULL, QString persistAsFileType = "svo"); void writeToJSONFile(const char* filename, OctreeElementPointer element = NULL, bool doGzip = false); void writeToSVOFile(const char* filename, OctreeElementPointer element = NULL); - virtual bool writeToMap(QVariantMap& entityDescription, OctreeElementPointer element, bool skipDefaultValues) = 0; + virtual bool writeToMap(QVariantMap& entityDescription, OctreeElementPointer element, bool skipDefaultValues, + bool skipThoseWithBadParents) = 0; // Octree importers bool readFromFile(const char* filename); diff --git a/libraries/shared/src/SpatiallyNestable.h b/libraries/shared/src/SpatiallyNestable.h index dc38671091..75783fa6d5 100644 --- a/libraries/shared/src/SpatiallyNestable.h +++ b/libraries/shared/src/SpatiallyNestable.h @@ -118,6 +118,8 @@ public: void die() { _isDead = true; } bool isDead() const { return _isDead; } + bool isParentIDValid() const { bool success = false; getParentPointer(success); return success; } + protected: const NestableType _nestableType; // EntityItem or an AvatarData QUuid _id;