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() {
_subItemLock.withWriteLock([&] {
auto oldDescendantRenderIDs = _descendantRenderIDs;
_descendantRenderIDs.clear();
auto entityTreeRenderer = DependencyManager::get<EntityTreeRenderer>();
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<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();
render::ItemIDs _attachmentRenderIDs;
void updateDescendantRenderIDs();
render::ItemIDs _descendantRenderIDs;
render::ItemIDSet _descendantRenderIDs;
uint32_t _lastAncestorChainRenderableVersion { 0 };
};

View file

@ -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) {

View file

@ -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);