diff --git a/libraries/avatars-renderer/src/avatars-renderer/Avatar.cpp b/libraries/avatars-renderer/src/avatars-renderer/Avatar.cpp index 8ceafbf5a1..ce559a7729 100644 --- a/libraries/avatars-renderer/src/avatars-renderer/Avatar.cpp +++ b/libraries/avatars-renderer/src/avatars-renderer/Avatar.cpp @@ -2121,6 +2121,7 @@ void Avatar::updateAttachmentRenderIDs() { void Avatar::updateDescendantRenderIDs() { _subItemLock.withWriteLock([&] { + auto oldDescendantRenderIDs = _descendantRenderIDs; _descendantRenderIDs.clear(); auto entityTreeRenderer = DependencyManager::get(); EntityTreePointer entityTree = entityTreeRenderer ? entityTreeRenderer->getTree() : nullptr; @@ -2135,13 +2136,29 @@ void Avatar::updateDescendantRenderIDs() { render::ItemIDs renderableSubItems; uint32_t numRenderableSubItems = renderer->metaFetchMetaSubItems(renderableSubItems); if (numRenderableSubItems > 0) { - _descendantRenderIDs.insert(_descendantRenderIDs.end(), renderableSubItems.begin(), renderableSubItems.end()); + for (auto& renderID : renderableSubItems) { + _descendantRenderIDs.insert(renderID); + oldDescendantRenderIDs.erase(renderID); + } } } } } }); }); + + render::Transaction transaction; + for (auto& oldDescendantRenderID : oldDescendantRenderIDs) { + transaction.updateItem(oldDescendantRenderID, [](render::PayloadProxyInterface& self) { + self.setOverrideSubMetaCulled(false); + }); + } + for (auto& descendantRenderIDs : _descendantRenderIDs) { + transaction.updateItem(descendantRenderIDs, [](render::PayloadProxyInterface& self) { + self.setOverrideSubMetaCulled(true); + }); + } + AbstractViewStateInterface::instance()->getMain3DScene()->enqueueTransaction(transaction); } }); } diff --git a/libraries/avatars-renderer/src/avatars-renderer/Avatar.h b/libraries/avatars-renderer/src/avatars-renderer/Avatar.h index 031b2f1309..235a04f109 100644 --- a/libraries/avatars-renderer/src/avatars-renderer/Avatar.h +++ b/libraries/avatars-renderer/src/avatars-renderer/Avatar.h @@ -781,7 +781,7 @@ protected: void updateAttachmentRenderIDs(); render::ItemIDs _attachmentRenderIDs; void updateDescendantRenderIDs(); - render::ItemIDs _descendantRenderIDs; + render::ItemIDSet _descendantRenderIDs; uint32_t _lastAncestorChainRenderableVersion { 0 }; }; diff --git a/libraries/render/src/render/Item.cpp b/libraries/render/src/render/Item.cpp index 532964777f..d5dde7f86b 100644 --- a/libraries/render/src/render/Item.cpp +++ b/libraries/render/src/render/Item.cpp @@ -123,7 +123,11 @@ namespace render { if (!payload) { return ItemKey::Builder::opaqueShape().withTypeMeta(); } - return payload->getKey(); + if (payload->overrideSubMetaCulled()) { + return ItemKey::Builder(payload->getKey()).withSubMetaCulled(); + } else { + return payload->getKey(); + } } template <> const ShapeKey shapeGetShapeKey(const PayloadProxyInterface::Pointer& payload) { diff --git a/libraries/render/src/render/Item.h b/libraries/render/src/render/Item.h index 6b66e844c0..e28a88f6dd 100644 --- a/libraries/render/src/render/Item.h +++ b/libraries/render/src/render/Item.h @@ -614,7 +614,13 @@ public: virtual ShapeKey getShapeKey() = 0; virtual Item::Bound getBound() = 0; virtual void render(RenderArgs* args) = 0; - virtual uint32_t metaFetchMetaSubItems(ItemIDs& subItems) const = 0; + virtual uint32_t metaFetchMetaSubItems(ItemIDs& subItems) = 0; + + bool overrideSubMetaCulled() const { return _overrideSubMetaCulled; } + void setOverrideSubMetaCulled(bool overrideSubMetaCulled) { _overrideSubMetaCulled = overrideSubMetaCulled; } + +protected: + bool _overrideSubMetaCulled { false }; }; template <> const ItemKey payloadGetKey(const PayloadProxyInterface::Pointer& payload);