fix wearables not disappearing with avatar

This commit is contained in:
SamGondelman 2019-04-29 11:07:36 -07:00 committed by Kasen IO
parent e0a29d9367
commit 398562321d
4 changed files with 31 additions and 4 deletions

View file

@ -2121,6 +2121,7 @@ void Avatar::updateAttachmentRenderIDs() {
void Avatar::updateDescendantRenderIDs() { void Avatar::updateDescendantRenderIDs() {
_subItemLock.withWriteLock([&] { _subItemLock.withWriteLock([&] {
auto oldDescendantRenderIDs = _descendantRenderIDs;
_descendantRenderIDs.clear(); _descendantRenderIDs.clear();
auto entityTreeRenderer = DependencyManager::get<EntityTreeRenderer>(); auto entityTreeRenderer = DependencyManager::get<EntityTreeRenderer>();
EntityTreePointer entityTree = entityTreeRenderer ? entityTreeRenderer->getTree() : nullptr; EntityTreePointer entityTree = entityTreeRenderer ? entityTreeRenderer->getTree() : nullptr;
@ -2135,13 +2136,29 @@ void Avatar::updateDescendantRenderIDs() {
render::ItemIDs renderableSubItems; render::ItemIDs renderableSubItems;
uint32_t numRenderableSubItems = renderer->metaFetchMetaSubItems(renderableSubItems); uint32_t numRenderableSubItems = renderer->metaFetchMetaSubItems(renderableSubItems);
if (numRenderableSubItems > 0) { 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<render::PayloadProxyInterface>(oldDescendantRenderID, [](render::PayloadProxyInterface& self) {
self.setOverrideSubMetaCulled(false);
});
}
for (auto& descendantRenderIDs : _descendantRenderIDs) {
transaction.updateItem<render::PayloadProxyInterface>(descendantRenderIDs, [](render::PayloadProxyInterface& self) {
self.setOverrideSubMetaCulled(true);
});
}
AbstractViewStateInterface::instance()->getMain3DScene()->enqueueTransaction(transaction);
} }
}); });
} }

View file

@ -781,7 +781,7 @@ protected:
void updateAttachmentRenderIDs(); void updateAttachmentRenderIDs();
render::ItemIDs _attachmentRenderIDs; render::ItemIDs _attachmentRenderIDs;
void updateDescendantRenderIDs(); void updateDescendantRenderIDs();
render::ItemIDs _descendantRenderIDs; render::ItemIDSet _descendantRenderIDs;
uint32_t _lastAncestorChainRenderableVersion { 0 }; uint32_t _lastAncestorChainRenderableVersion { 0 };
}; };

View file

@ -123,7 +123,11 @@ namespace render {
if (!payload) { if (!payload) {
return ItemKey::Builder::opaqueShape().withTypeMeta(); 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) { template <> const ShapeKey shapeGetShapeKey(const PayloadProxyInterface::Pointer& payload) {

View file

@ -614,7 +614,13 @@ public:
virtual ShapeKey getShapeKey() = 0; virtual ShapeKey getShapeKey() = 0;
virtual Item::Bound getBound() = 0; virtual Item::Bound getBound() = 0;
virtual void render(RenderArgs* args) = 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); template <> const ItemKey payloadGetKey(const PayloadProxyInterface::Pointer& payload);