diff --git a/libraries/entities/src/EntityItem.cpp b/libraries/entities/src/EntityItem.cpp index 107af837fe..643145942a 100644 --- a/libraries/entities/src/EntityItem.cpp +++ b/libraries/entities/src/EntityItem.cpp @@ -1570,13 +1570,17 @@ void EntityItem::updatePosition(const glm::vec3& value) { } void EntityItem::updateParentID(const QUuid& value) { - if (getParentID() != value) { + QUuid oldParentID = getParentID(); + if (oldParentID != value) { + EntityTreePointer tree = getTree(); + if (!oldParentID.isNull()) { + tree->removeFromChildrenOfAvatars(getThisPointer()); + } setParentID(value); // children are forced to be kinematic // may need to not collide with own avatar markDirtyFlags(Simulation::DIRTY_MOTION_TYPE | Simulation::DIRTY_COLLISION_GROUP); - EntityTreePointer tree = getTree(); if (tree) { tree->addToNeedsParentFixupList(getThisPointer()); } diff --git a/libraries/entities/src/EntityTree.cpp b/libraries/entities/src/EntityTree.cpp index c8675bdcba..bcb73f352c 100644 --- a/libraries/entities/src/EntityTree.cpp +++ b/libraries/entities/src/EntityTree.cpp @@ -1326,6 +1326,13 @@ void EntityTree::deleteDescendantsOfAvatar(QUuid avatarID) { } } +void EntityTree::removeFromChildrenOfAvatars(EntityItemPointer entity) { + QUuid avatarID = entity->getParentID(); + if (_childrenOfAvatars.contains(avatarID)) { + _childrenOfAvatars[avatarID].remove(entity->getID()); + } +} + void EntityTree::addToNeedsParentFixupList(EntityItemPointer entity) { QWriteLocker locker(&_needsParentFixupLock); _needsParentFixup.append(entity); diff --git a/libraries/entities/src/EntityTree.h b/libraries/entities/src/EntityTree.h index c0183d7ec2..cb16f2fac1 100644 --- a/libraries/entities/src/EntityTree.h +++ b/libraries/entities/src/EntityTree.h @@ -254,6 +254,7 @@ public: void knowAvatarID(QUuid avatarID) { _avatarIDs += avatarID; } void forgetAvatarID(QUuid avatarID) { _avatarIDs -= avatarID; } void deleteDescendantsOfAvatar(QUuid avatarID); + void removeFromChildrenOfAvatars(EntityItemPointer entity); void addToNeedsParentFixupList(EntityItemPointer entity);