From ff7c11d48c800a25450b5b73d6dc5c9be209f84a Mon Sep 17 00:00:00 2001 From: Dante Ruiz Date: Wed, 16 Nov 2016 20:14:02 +0000 Subject: [PATCH 1/3] Fixed avatar parent delete issue --- libraries/entities/src/EntityTree.cpp | 13 +++++++++++++ libraries/entities/src/EntityTree.h | 2 ++ 2 files changed, 15 insertions(+) diff --git a/libraries/entities/src/EntityTree.cpp b/libraries/entities/src/EntityTree.cpp index a03e4b8f08..24496f5637 100644 --- a/libraries/entities/src/EntityTree.cpp +++ b/libraries/entities/src/EntityTree.cpp @@ -438,6 +438,7 @@ void EntityTree::deleteEntity(const EntityItemID& entityID, bool force, bool ign return; } + checkEntity(entityID); emit deletingEntity(entityID); // NOTE: callers must lock the tree before using this method @@ -447,6 +448,17 @@ void EntityTree::deleteEntity(const EntityItemID& entityID, bool force, bool ign _isDirty = true; } +void EntityTree::checkEntity(const EntityItemID entityID) { + + EntityItemPointer entity = findEntityByEntityItemID(entityID); + + entity->forEachChild([&](SpatiallyNestablePointer child) { + if (child->getNestableType() == NestableType::Avatar) { + child->setParentID(nullptr); + } + }); +} + void EntityTree::deleteEntities(QSet entityIDs, bool force, bool ignoreWarnings) { // NOTE: callers must lock the tree before using this method DeleteEntityOperator theOperator(getThisPointer()); @@ -476,6 +488,7 @@ void EntityTree::deleteEntities(QSet entityIDs, bool force, bool i } // tell our delete operator about this entityID + checkEntity(entityID); theOperator.addEntityIDToDeleteList(entityID); emit deletingEntity(entityID); } diff --git a/libraries/entities/src/EntityTree.h b/libraries/entities/src/EntityTree.h index 441b686e3b..c6df9a77bf 100644 --- a/libraries/entities/src/EntityTree.h +++ b/libraries/entities/src/EntityTree.h @@ -121,6 +121,8 @@ public: // use this method if you have a pointer to the entity (avoid an extra entity lookup) bool updateEntity(EntityItemPointer entity, const EntityItemProperties& properties, const SharedNodePointer& senderNode = SharedNodePointer(nullptr)); + // check if the avatar is a child of this entity, If so set the avatar parentID to null + void checkEntity(const EntityItemID entityID); void deleteEntity(const EntityItemID& entityID, bool force = false, bool ignoreWarnings = true); void deleteEntities(QSet entityIDs, bool force = false, bool ignoreWarnings = true); From 9c4ae9df5ad7d2e2ef2fd08dc2a016aa18bb49c4 Mon Sep 17 00:00:00 2001 From: Dante Ruiz Date: Wed, 16 Nov 2016 22:09:22 +0000 Subject: [PATCH 2/3] function name change --- libraries/entities/src/EntityTree.cpp | 6 +++--- libraries/entities/src/EntityTree.h | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/libraries/entities/src/EntityTree.cpp b/libraries/entities/src/EntityTree.cpp index 24496f5637..182061b0d6 100644 --- a/libraries/entities/src/EntityTree.cpp +++ b/libraries/entities/src/EntityTree.cpp @@ -438,7 +438,7 @@ void EntityTree::deleteEntity(const EntityItemID& entityID, bool force, bool ign return; } - checkEntity(entityID); + IsAvatarParentOfEntity(entityID); emit deletingEntity(entityID); // NOTE: callers must lock the tree before using this method @@ -448,7 +448,7 @@ void EntityTree::deleteEntity(const EntityItemID& entityID, bool force, bool ign _isDirty = true; } -void EntityTree::checkEntity(const EntityItemID entityID) { +void EntityTree::IsAvatarParentOfEntity(const EntityItemID entityID) { EntityItemPointer entity = findEntityByEntityItemID(entityID); @@ -488,7 +488,7 @@ void EntityTree::deleteEntities(QSet entityIDs, bool force, bool i } // tell our delete operator about this entityID - checkEntity(entityID); + IsAvatarParentOfEntity(entityID); theOperator.addEntityIDToDeleteList(entityID); emit deletingEntity(entityID); } diff --git a/libraries/entities/src/EntityTree.h b/libraries/entities/src/EntityTree.h index c6df9a77bf..f63dac16be 100644 --- a/libraries/entities/src/EntityTree.h +++ b/libraries/entities/src/EntityTree.h @@ -122,7 +122,7 @@ public: bool updateEntity(EntityItemPointer entity, const EntityItemProperties& properties, const SharedNodePointer& senderNode = SharedNodePointer(nullptr)); // check if the avatar is a child of this entity, If so set the avatar parentID to null - void checkEntity(const EntityItemID entityID); + void IsAvatarParentOfEntity(const EntityItemID entityID); void deleteEntity(const EntityItemID& entityID, bool force = false, bool ignoreWarnings = true); void deleteEntities(QSet entityIDs, bool force = false, bool ignoreWarnings = true); From 66ff81f45066e2b890845ec3e8e0ee58fd38e5dc Mon Sep 17 00:00:00 2001 From: Dante Ruiz Date: Wed, 16 Nov 2016 22:32:15 +0000 Subject: [PATCH 3/3] Another function name change --- libraries/entities/src/EntityTree.cpp | 8 ++++---- libraries/entities/src/EntityTree.h | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/libraries/entities/src/EntityTree.cpp b/libraries/entities/src/EntityTree.cpp index 182061b0d6..e69adbce88 100644 --- a/libraries/entities/src/EntityTree.cpp +++ b/libraries/entities/src/EntityTree.cpp @@ -438,7 +438,7 @@ void EntityTree::deleteEntity(const EntityItemID& entityID, bool force, bool ign return; } - IsAvatarParentOfEntity(entityID); + unhookChildAvatar(entityID); emit deletingEntity(entityID); // NOTE: callers must lock the tree before using this method @@ -448,11 +448,11 @@ void EntityTree::deleteEntity(const EntityItemID& entityID, bool force, bool ign _isDirty = true; } -void EntityTree::IsAvatarParentOfEntity(const EntityItemID entityID) { +void EntityTree::unhookChildAvatar(const EntityItemID entityID) { EntityItemPointer entity = findEntityByEntityItemID(entityID); - entity->forEachChild([&](SpatiallyNestablePointer child) { + entity->forEachDescendant([&](SpatiallyNestablePointer child) { if (child->getNestableType() == NestableType::Avatar) { child->setParentID(nullptr); } @@ -488,7 +488,7 @@ void EntityTree::deleteEntities(QSet entityIDs, bool force, bool i } // tell our delete operator about this entityID - IsAvatarParentOfEntity(entityID); + unhookChildAvatar(entityID); theOperator.addEntityIDToDeleteList(entityID); emit deletingEntity(entityID); } diff --git a/libraries/entities/src/EntityTree.h b/libraries/entities/src/EntityTree.h index f63dac16be..98598b879b 100644 --- a/libraries/entities/src/EntityTree.h +++ b/libraries/entities/src/EntityTree.h @@ -122,7 +122,7 @@ public: bool updateEntity(EntityItemPointer entity, const EntityItemProperties& properties, const SharedNodePointer& senderNode = SharedNodePointer(nullptr)); // check if the avatar is a child of this entity, If so set the avatar parentID to null - void IsAvatarParentOfEntity(const EntityItemID entityID); + void unhookChildAvatar(const EntityItemID entityID); void deleteEntity(const EntityItemID& entityID, bool force = false, bool ignoreWarnings = true); void deleteEntities(QSet entityIDs, bool force = false, bool ignoreWarnings = true);