From 249f72758e9c23038cd175ecc9243a8de734f9c5 Mon Sep 17 00:00:00 2001 From: David Rowe Date: Fri, 15 Jun 2018 16:36:16 +1200 Subject: [PATCH 1/4] Fix entity detaching from head joint not becoming visible --- interface/src/avatar/MyAvatar.cpp | 35 ++++++++++++++++++++++++++----- interface/src/avatar/MyAvatar.h | 3 ++- 2 files changed, 32 insertions(+), 6 deletions(-) diff --git a/interface/src/avatar/MyAvatar.cpp b/interface/src/avatar/MyAvatar.cpp index d57905ee33..7be93dcecc 100755 --- a/interface/src/avatar/MyAvatar.cpp +++ b/interface/src/avatar/MyAvatar.cpp @@ -531,10 +531,10 @@ void MyAvatar::forgetChild(SpatiallyNestablePointer newChild) const { SpatiallyNestable::forgetChild(newChild); } -void MyAvatar::updateChildCauterization(SpatiallyNestablePointer object) { +void MyAvatar::updateChildCauterization(SpatiallyNestablePointer object, bool cauterize) { if (object->getNestableType() == NestableType::Entity) { EntityItemPointer entity = std::static_pointer_cast(object); - entity->setCauterized(!_prevShouldDrawHead); + entity->setCauterized(cauterize); } } @@ -544,16 +544,41 @@ void MyAvatar::simulate(float deltaTime) { animateScaleChanges(deltaTime); if (_cauterizationNeedsUpdate) { - const std::unordered_set& headBoneSet = _skeletonModel->getCauterizeBoneSet(); + + // Redisplay cauterized entities that are no longer children of the avatar. + auto cauterizedChild = _cauterizedChildrenOfHead.begin(); + if (cauterizedChild != _cauterizedChildrenOfHead.end()) { + auto children = getChildren(); + while (cauterizedChild != _cauterizedChildrenOfHead.end()) { + if (!children.contains(*cauterizedChild)) { + updateChildCauterization(*cauterizedChild, false); + _cauterizedChildrenOfHead.erase(*cauterizedChild); + } + ++cauterizedChild; + } + } + + // Update cauterization of entities that are children of the avatar. + auto headBoneSet = _skeletonModel->getCauterizeBoneSet(); forEachChild([&](SpatiallyNestablePointer object) { bool isChildOfHead = headBoneSet.find(object->getParentJointIndex()) != headBoneSet.end(); if (isChildOfHead) { - updateChildCauterization(object); + // Cauterize or display children of head per head drawing state. + updateChildCauterization(object, !_prevShouldDrawHead); object->forEachDescendant([&](SpatiallyNestablePointer descendant) { - updateChildCauterization(descendant); + updateChildCauterization(descendant, !_prevShouldDrawHead); }); + _cauterizedChildrenOfHead.insert(object); + } else if (_cauterizedChildrenOfHead.find(object) != _cauterizedChildrenOfHead.end()) { + // Redisplay cauterized children that are not longer children of the head. + updateChildCauterization(object, false); + object->forEachDescendant([&](SpatiallyNestablePointer descendant) { + updateChildCauterization(descendant, false); + }); + _cauterizedChildrenOfHead.erase(object); } }); + _cauterizationNeedsUpdate = false; } diff --git a/interface/src/avatar/MyAvatar.h b/interface/src/avatar/MyAvatar.h index 1a6feb142a..3f9f82cc59 100644 --- a/interface/src/avatar/MyAvatar.h +++ b/interface/src/avatar/MyAvatar.h @@ -1566,6 +1566,7 @@ private: glm::quat _goToOrientation; std::unordered_set _headBoneSet; + std::unordered_set _cauterizedChildrenOfHead; bool _prevShouldDrawHead; bool _rigEnabled { true }; @@ -1621,7 +1622,7 @@ private: // height of user in sensor space, when standing erect. ThreadSafeValueCache _userHeight { DEFAULT_AVATAR_HEIGHT }; - void updateChildCauterization(SpatiallyNestablePointer object); + void updateChildCauterization(SpatiallyNestablePointer object, bool cauterize); // max unscaled forward movement speed ThreadSafeValueCache _walkSpeed { DEFAULT_AVATAR_MAX_WALKING_SPEED }; From 4dd6ba1d183e5d8e6209fe0bd5ad968e21dc7a54 Mon Sep 17 00:00:00 2001 From: David Rowe Date: Sat, 16 Jun 2018 16:29:45 +1200 Subject: [PATCH 2/4] Fix Mac crash --- interface/src/avatar/MyAvatar.cpp | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/interface/src/avatar/MyAvatar.cpp b/interface/src/avatar/MyAvatar.cpp index 7be93dcecc..69ad24551c 100755 --- a/interface/src/avatar/MyAvatar.cpp +++ b/interface/src/avatar/MyAvatar.cpp @@ -552,9 +552,10 @@ void MyAvatar::simulate(float deltaTime) { while (cauterizedChild != _cauterizedChildrenOfHead.end()) { if (!children.contains(*cauterizedChild)) { updateChildCauterization(*cauterizedChild, false); - _cauterizedChildrenOfHead.erase(*cauterizedChild); + cauterizedChild = _cauterizedChildrenOfHead.erase(cauterizedChild); + } else { + ++cauterizedChild; } - ++cauterizedChild; } } From be4b92930182135150556f87fdaa4a06c13e63a1 Mon Sep 17 00:00:00 2001 From: David Rowe Date: Sat, 16 Jun 2018 16:31:06 +1200 Subject: [PATCH 3/4] Fix cauterization when reparent entity to a different joint --- interface/src/avatar/MyAvatar.cpp | 4 ++++ interface/src/avatar/MyAvatar.h | 1 + libraries/shared/src/SpatiallyNestable.cpp | 4 ++++ libraries/shared/src/SpatiallyNestable.h | 1 + 4 files changed, 10 insertions(+) diff --git a/interface/src/avatar/MyAvatar.cpp b/interface/src/avatar/MyAvatar.cpp index 69ad24551c..1ea55b9cdc 100755 --- a/interface/src/avatar/MyAvatar.cpp +++ b/interface/src/avatar/MyAvatar.cpp @@ -531,6 +531,10 @@ void MyAvatar::forgetChild(SpatiallyNestablePointer newChild) const { SpatiallyNestable::forgetChild(newChild); } +void MyAvatar::recalculateChildCauterization() const { + _cauterizationNeedsUpdate = true; +} + void MyAvatar::updateChildCauterization(SpatiallyNestablePointer object, bool cauterize) { if (object->getNestableType() == NestableType::Entity) { EntityItemPointer entity = std::static_pointer_cast(object); diff --git a/interface/src/avatar/MyAvatar.h b/interface/src/avatar/MyAvatar.h index 3f9f82cc59..7cb1cfb4b4 100644 --- a/interface/src/avatar/MyAvatar.h +++ b/interface/src/avatar/MyAvatar.h @@ -1374,6 +1374,7 @@ private slots: protected: virtual void beParentOfChild(SpatiallyNestablePointer newChild) const override; virtual void forgetChild(SpatiallyNestablePointer newChild) const override; + virtual void recalculateChildCauterization() const override; private: diff --git a/libraries/shared/src/SpatiallyNestable.cpp b/libraries/shared/src/SpatiallyNestable.cpp index 324cee3417..ccb275ffc9 100644 --- a/libraries/shared/src/SpatiallyNestable.cpp +++ b/libraries/shared/src/SpatiallyNestable.cpp @@ -165,6 +165,10 @@ void SpatiallyNestable::forgetChild(SpatiallyNestablePointer newChild) const { void SpatiallyNestable::setParentJointIndex(quint16 parentJointIndex) { _parentJointIndex = parentJointIndex; + auto parent = _parent.lock(); + if (parent) { + parent->recalculateChildCauterization(); + } } glm::vec3 SpatiallyNestable::worldToLocal(const glm::vec3& position, diff --git a/libraries/shared/src/SpatiallyNestable.h b/libraries/shared/src/SpatiallyNestable.h index 5d4793ba4e..361f0aaf17 100644 --- a/libraries/shared/src/SpatiallyNestable.h +++ b/libraries/shared/src/SpatiallyNestable.h @@ -218,6 +218,7 @@ protected: virtual void beParentOfChild(SpatiallyNestablePointer newChild) const; virtual void forgetChild(SpatiallyNestablePointer newChild) const; + virtual void recalculateChildCauterization() const { } mutable ReadWriteLockable _childrenLock; mutable QHash _children; From af3861def8239a950d2fd0157a5cffc435827355 Mon Sep 17 00:00:00 2001 From: David Rowe Date: Mon, 25 Jun 2018 16:33:05 +1200 Subject: [PATCH 4/4] Code review --- interface/src/avatar/MyAvatar.cpp | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/interface/src/avatar/MyAvatar.cpp b/interface/src/avatar/MyAvatar.cpp index 9162c1ca0c..76714170fb 100755 --- a/interface/src/avatar/MyAvatar.cpp +++ b/interface/src/avatar/MyAvatar.cpp @@ -549,6 +549,7 @@ void MyAvatar::simulate(float deltaTime) { animateScaleChanges(deltaTime); if (_cauterizationNeedsUpdate) { + _cauterizationNeedsUpdate = false; // Redisplay cauterized entities that are no longer children of the avatar. auto cauterizedChild = _cauterizedChildrenOfHead.begin(); @@ -584,8 +585,6 @@ void MyAvatar::simulate(float deltaTime) { _cauterizedChildrenOfHead.erase(object); } }); - - _cauterizationNeedsUpdate = false; } {