trying and failing to fix models

This commit is contained in:
SamGondelman 2019-04-30 10:31:09 -07:00 committed by Kasen IO
parent 398562321d
commit 1736252f0d
19 changed files with 126 additions and 55 deletions

View file

@ -2121,7 +2121,8 @@ void Avatar::updateAttachmentRenderIDs() {
void Avatar::updateDescendantRenderIDs() { void Avatar::updateDescendantRenderIDs() {
_subItemLock.withWriteLock([&] { _subItemLock.withWriteLock([&] {
auto oldDescendantRenderIDs = _descendantRenderIDs; auto oldRenderingDescendantEntityIDs = _renderingDescendantEntityIDs;
_renderingDescendantEntityIDs.clear();
_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;
@ -2131,34 +2132,30 @@ void Avatar::updateDescendantRenderIDs() {
if (object && object->getNestableType() == NestableType::Entity) { if (object && object->getNestableType() == NestableType::Entity) {
EntityItemPointer entity = std::static_pointer_cast<EntityItem>(object); EntityItemPointer entity = std::static_pointer_cast<EntityItem>(object);
if (entity->isVisible()) { if (entity->isVisible()) {
auto renderer = entityTreeRenderer->renderableForEntityId(object->getID()); auto id = object->getID();
_renderingDescendantEntityIDs.insert(id);
oldRenderingDescendantEntityIDs.erase(id);
entity->setCullWithParent(true);
auto renderer = entityTreeRenderer->renderableForEntityId(id);
if (renderer) { if (renderer) {
render::ItemIDs renderableSubItems; render::ItemIDs renderableSubItems;
uint32_t numRenderableSubItems = renderer->metaFetchMetaSubItems(renderableSubItems); uint32_t numRenderableSubItems = renderer->metaFetchMetaSubItems(renderableSubItems);
if (numRenderableSubItems > 0) { if (numRenderableSubItems > 0) {
for (auto& renderID : renderableSubItems) { _descendantRenderIDs.insert(_descendantRenderIDs.end(), renderableSubItems.begin(), renderableSubItems.end());
_descendantRenderIDs.insert(renderID);
oldDescendantRenderIDs.erase(renderID);
} }
} }
} }
} }
}
});
}); });
render::Transaction transaction; for (auto& oldRenderingDescendantEntityID : oldRenderingDescendantEntityIDs) {
for (auto& oldDescendantRenderID : oldDescendantRenderIDs) { auto entity = entityTree->findEntityByEntityItemID(oldRenderingDescendantEntityID);
transaction.updateItem<render::PayloadProxyInterface>(oldDescendantRenderID, [](render::PayloadProxyInterface& self) { if (entity) {
self.setOverrideSubMetaCulled(false); entity->setCullWithParent(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,8 @@ protected:
void updateAttachmentRenderIDs(); void updateAttachmentRenderIDs();
render::ItemIDs _attachmentRenderIDs; render::ItemIDs _attachmentRenderIDs;
void updateDescendantRenderIDs(); void updateDescendantRenderIDs();
render::ItemIDSet _descendantRenderIDs; render::ItemIDs _descendantRenderIDs;
std::unordered_set<EntityItemID> _renderingDescendantEntityIDs;
uint32_t _lastAncestorChainRenderableVersion { 0 }; uint32_t _lastAncestorChainRenderableVersion { 0 };
}; };

View file

@ -168,19 +168,20 @@ render::hifi::Layer EntityRenderer::getHifiRenderLayer() const {
} }
ItemKey EntityRenderer::getKey() { ItemKey EntityRenderer::getKey() {
ItemKey::Builder builder = ItemKey::Builder().withTypeShape().withTypeMeta().withTagBits(getTagMask()).withLayer(getHifiRenderLayer()); auto builder = ItemKey::Builder().withTypeShape().withTypeMeta().withTagBits(getTagMask()).withLayer(getHifiRenderLayer());
if (isTransparent()) { if (isTransparent()) {
builder.withTransparent(); builder.withTransparent();
} else if (_canCastShadow) { }
if (_canCastShadow) {
builder.withShadowCaster(); builder.withShadowCaster();
} }
if (!_visible) { if (_cullWithParent) {
builder.withInvisible(); builder.withSubMetaCulled();
} }
return builder; return builder.build();
} }
uint32_t EntityRenderer::metaFetchMetaSubItems(ItemIDs& subItems) const { uint32_t EntityRenderer::metaFetchMetaSubItems(ItemIDs& subItems) const {
@ -419,6 +420,7 @@ void EntityRenderer::doRenderUpdateSynchronous(const ScenePointer& scene, Transa
setRenderLayer(entity->getRenderLayer()); setRenderLayer(entity->getRenderLayer());
setPrimitiveMode(entity->getPrimitiveMode()); setPrimitiveMode(entity->getPrimitiveMode());
_canCastShadow = entity->getCanCastShadow(); _canCastShadow = entity->getCanCastShadow();
setCullWithParent(entity->getCullWithParent());
_cauterized = entity->getCauterized(); _cauterized = entity->getCauterized();
entity->setNeedsRenderUpdate(false); entity->setNeedsRenderUpdate(false);
}); });

View file

@ -108,6 +108,16 @@ protected:
virtual void setIsVisibleInSecondaryCamera(bool value) { _isVisibleInSecondaryCamera = value; } virtual void setIsVisibleInSecondaryCamera(bool value) { _isVisibleInSecondaryCamera = value; }
virtual void setRenderLayer(RenderLayer value) { _renderLayer = value; } virtual void setRenderLayer(RenderLayer value) { _renderLayer = value; }
virtual void setPrimitiveMode(PrimitiveMode value) { _primitiveMode = value; } virtual void setPrimitiveMode(PrimitiveMode value) { _primitiveMode = value; }
virtual void setCullWithParent(bool value) { _cullWithParent = value; }
template <typename F, typename T>
T withReadLockResult(const std::function<T()>& f) {
T result;
withReadLock([&] {
result = f();
});
return result;
}
signals: signals:
void requestRenderUpdate(); void requestRenderUpdate();
@ -130,6 +140,7 @@ protected:
bool _visible { false }; bool _visible { false };
bool _isVisibleInSecondaryCamera { false }; bool _isVisibleInSecondaryCamera { false };
bool _canCastShadow { false }; bool _canCastShadow { false };
bool _cullWithParent { false };
RenderLayer _renderLayer { RenderLayer::WORLD }; RenderLayer _renderLayer { RenderLayer::WORLD };
PrimitiveMode _primitiveMode { PrimitiveMode::SOLID }; PrimitiveMode _primitiveMode { PrimitiveMode::SOLID };
bool _cauterized { false }; bool _cauterized { false };

View file

@ -210,8 +210,7 @@ void MaterialEntityRenderer::doRenderUpdateAsynchronousTyped(const TypedEntityPo
} }
ItemKey MaterialEntityRenderer::getKey() { ItemKey MaterialEntityRenderer::getKey() {
ItemKey::Builder builder; auto builder = ItemKey::Builder().withTypeShape().withTagBits(getTagMask()).withLayer(getHifiRenderLayer());
builder.withTypeShape().withTagBits(getTagMask()).withLayer(getHifiRenderLayer());
if (!_visible) { if (!_visible) {
builder.withInvisible(); builder.withInvisible();

View file

@ -1057,8 +1057,10 @@ ModelEntityRenderer::ModelEntityRenderer(const EntityItemPointer& entity) : Pare
void ModelEntityRenderer::setKey(bool didVisualGeometryRequestSucceed) { void ModelEntityRenderer::setKey(bool didVisualGeometryRequestSucceed) {
auto builder = ItemKey::Builder().withTypeMeta().withTagBits(getTagMask()).withLayer(getHifiRenderLayer()); auto builder = ItemKey::Builder().withTypeMeta().withTagBits(getTagMask()).withLayer(getHifiRenderLayer());
if (_model && _model->isGroupCulled()) { if (!_cullWithParent && _model && _model->isGroupCulled()) {
builder.withMetaCullGroup(); builder.withMetaCullGroup();
} else if (_cullWithParent) {
builder.withoutSubMetaCulled();
} }
if (didVisualGeometryRequestSucceed) { if (didVisualGeometryRequestSucceed) {
@ -1497,6 +1499,14 @@ void ModelEntityRenderer::setPrimitiveMode(PrimitiveMode value) {
} }
} }
void ModelEntityRenderer::setCullWithParent(bool value) {
Parent::setCullWithParent(value);
setKey(_didLastVisualGeometryRequestSucceed);
if (_model) {
_model->setCullWithParent(_cullWithParent);
}
}
// NOTE: this only renders the "meta" portion of the Model, namely it renders debugging items // NOTE: this only renders the "meta" portion of the Model, namely it renders debugging items
void ModelEntityRenderer::doRender(RenderArgs* args) { void ModelEntityRenderer::doRender(RenderArgs* args) {
DETAILED_PROFILE_RANGE(render_detail, "MetaModelRender"); DETAILED_PROFILE_RANGE(render_detail, "MetaModelRender");

View file

@ -164,6 +164,7 @@ protected:
void setIsVisibleInSecondaryCamera(bool value) override; void setIsVisibleInSecondaryCamera(bool value) override;
void setRenderLayer(RenderLayer value) override; void setRenderLayer(RenderLayer value) override;
void setPrimitiveMode(PrimitiveMode value) override; void setPrimitiveMode(PrimitiveMode value) override;
void setCullWithParent(bool value) override;
private: private:
void animate(const TypedEntityPointer& entity); void animate(const TypedEntityPointer& entity);

View file

@ -151,11 +151,17 @@ void ParticleEffectEntityRenderer::doRenderUpdateAsynchronousTyped(const TypedEn
ItemKey ParticleEffectEntityRenderer::getKey() { ItemKey ParticleEffectEntityRenderer::getKey() {
// FIXME: implement isTransparent() for particles and an opaque pipeline // FIXME: implement isTransparent() for particles and an opaque pipeline
if (_visible) { auto builder = ItemKey::Builder::transparentShape().withTagBits(getTagMask()).withLayer(getHifiRenderLayer());
return ItemKey::Builder::transparentShape().withTagBits(getTagMask()).withLayer(getHifiRenderLayer());
} else { if (!_visible) {
return ItemKey::Builder().withInvisible().withTagBits(getTagMask()).withLayer(getHifiRenderLayer()).build(); builder.withInvisible();
} }
if (_cullWithParent) {
builder.withSubMetaCulled();
}
return builder.build();
} }
ShapeKey ParticleEffectEntityRenderer::getShapeKey() { ShapeKey ParticleEffectEntityRenderer::getShapeKey() {

View file

@ -97,9 +97,14 @@ void PolyLineEntityRenderer::buildPipelines() {
} }
ItemKey PolyLineEntityRenderer::getKey() { ItemKey PolyLineEntityRenderer::getKey() {
return isTransparent() ? // FIXME: implement isTransparent() for polylines and an opaque pipeline
ItemKey::Builder::transparentShape().withTypeMeta().withTagBits(getTagMask()).withLayer(getHifiRenderLayer()) : auto builder = ItemKey::Builder::transparentShape().withTypeMeta().withTagBits(getTagMask()).withLayer(getHifiRenderLayer());
ItemKey::Builder::opaqueShape().withTypeMeta().withTagBits(getTagMask()).withLayer(getHifiRenderLayer());
if (_cullWithParent) {
builder.withSubMetaCulled();
}
return builder.build();
} }
ShapeKey PolyLineEntityRenderer::getShapeKey() { ShapeKey PolyLineEntityRenderer::getShapeKey() {

View file

@ -1783,6 +1783,16 @@ PolyVoxEntityRenderer::PolyVoxEntityRenderer(const EntityItemPointer& entity) :
_params = std::make_shared<gpu::Buffer>(sizeof(glm::vec4), nullptr); _params = std::make_shared<gpu::Buffer>(sizeof(glm::vec4), nullptr);
} }
ItemKey PolyVoxEntityRenderer::getKey() {
auto builder = ItemKey::Builder::opaqueShape().withTagBits(getTagMask()).withLayer(getHifiRenderLayer());
if (_cullWithParent) {
builder.withSubMetaCulled();
}
return builder.build();
}
ShapeKey PolyVoxEntityRenderer::getShapeKey() { ShapeKey PolyVoxEntityRenderer::getShapeKey() {
auto builder = ShapeKey::Builder().withCustom(CUSTOM_PIPELINE_NUMBER); auto builder = ShapeKey::Builder().withCustom(CUSTOM_PIPELINE_NUMBER);
if (_primitiveMode == PrimitiveMode::LINES) { if (_primitiveMode == PrimitiveMode::LINES) {

View file

@ -209,7 +209,7 @@ public:
} }
protected: protected:
virtual ItemKey getKey() override { return ItemKey::Builder::opaqueShape().withTagBits(getTagMask()).withLayer(getHifiRenderLayer()); } virtual ItemKey getKey() override;
virtual ShapeKey getShapeKey() override; virtual ShapeKey getShapeKey() override;
virtual bool needsRenderUpdateFromTypedEntity(const TypedEntityPointer& entity) const override; virtual bool needsRenderUpdateFromTypedEntity(const TypedEntityPointer& entity) const override;
virtual void doRenderUpdateSynchronousTyped(const ScenePointer& scene, Transaction& transaction, const TypedEntityPointer& entity) override; virtual void doRenderUpdateSynchronousTyped(const ScenePointer& scene, Transaction& transaction, const TypedEntityPointer& entity) override;

View file

@ -3025,6 +3025,17 @@ void EntityItem::setCanCastShadow(bool value) {
}); });
} }
bool EntityItem::getCullWithParent() const {
return _cullWithParent;
}
void EntityItem::setCullWithParent(bool value) {
if (_cullWithParent != value) {
_cullWithParent = value;
emit requestRenderUpdate();
}
}
bool EntityItem::isChildOfMyAvatar() const { bool EntityItem::isChildOfMyAvatar() const {
QUuid ancestorID = findAncestorOfType(NestableType::Avatar); QUuid ancestorID = findAncestorOfType(NestableType::Avatar);
return !ancestorID.isNull() && (ancestorID == Physics::getSessionUUID() || ancestorID == AVATAR_SELF_ID); return !ancestorID.isNull() && (ancestorID == Physics::getSessionUUID() || ancestorID == AVATAR_SELF_ID);

View file

@ -305,6 +305,9 @@ public:
bool getCanCastShadow() const; bool getCanCastShadow() const;
void setCanCastShadow(bool value); void setCanCastShadow(bool value);
bool getCullWithParent() const;
void setCullWithParent(bool value);
void setCauterized(bool value); void setCauterized(bool value);
bool getCauterized() const; bool getCauterized() const;
@ -762,7 +765,7 @@ protected:
QHash<QUuid, EntityDynamicPointer> _grabActions; QHash<QUuid, EntityDynamicPointer> _grabActions;
mutable bool _needsRenderUpdate { false }; bool _cullWithParent { false };
private: private:
static std::function<glm::quat(const glm::vec3&, const glm::quat&, BillboardMode, const glm::vec3&)> _getBillboardRotationOperator; static std::function<glm::quat(const glm::vec3&, const glm::quat&, BillboardMode, const glm::vec3&)> _getBillboardRotationOperator;

View file

@ -102,6 +102,10 @@ void MeshPartPayload::updateKey(const render::ItemKey& key) {
builder.withTransparent(); builder.withTransparent();
} }
if (_cullWithParent) {
builder.withSubMetaCulled();
}
_itemKey = builder.build(); _itemKey = builder.build();
} }
@ -383,6 +387,10 @@ void ModelMeshPartPayload::updateKey(const render::ItemKey& key) {
builder.withTransparent(); builder.withTransparent();
} }
if (_cullWithParent) {
builder.withSubMetaCulled();
}
_itemKey = builder.build(); _itemKey = builder.build();
} }

View file

@ -43,7 +43,7 @@ public:
// Render Item interface // Render Item interface
virtual render::ItemKey getKey() const; virtual render::ItemKey getKey() const;
virtual render::Item::Bound getBound() const; virtual render::Item::Bound getBound() const;
virtual render::ShapeKey getShapeKey() const; // shape interface virtual render::ShapeKey getShapeKey() const;
virtual void render(RenderArgs* args); virtual void render(RenderArgs* args);
// ModelMeshPartPayload functions to perform render // ModelMeshPartPayload functions to perform render
@ -73,11 +73,11 @@ public:
void addMaterial(graphics::MaterialLayer material); void addMaterial(graphics::MaterialLayer material);
void removeMaterial(graphics::MaterialPointer material); void removeMaterial(graphics::MaterialPointer material);
static bool enableMaterialProceduralShaders; void setCullWithParent(bool value) { _cullWithParent = value; }
protected: protected:
render::ItemKey _itemKey{ render::ItemKey::Builder::opaqueShape().build() }; render::ItemKey _itemKey{ render::ItemKey::Builder::opaqueShape().build() };
uint64_t _created; bool _cullWithParent { false };
}; };
namespace render { namespace render {
@ -106,7 +106,7 @@ public:
void updateTransformForSkinnedMesh(const Transform& renderTransform, const Transform& boundTransform); void updateTransformForSkinnedMesh(const Transform& renderTransform, const Transform& boundTransform);
// Render Item interface // Render Item interface
render::ShapeKey getShapeKey() const override; // shape interface render::ShapeKey getShapeKey() const override;
void render(RenderArgs* args) override; void render(RenderArgs* args) override;
void setShapeKey(bool invalidateShapeKey, PrimitiveMode primitiveMode, bool useDualQuaternionSkinning); void setShapeKey(bool invalidateShapeKey, PrimitiveMode primitiveMode, bool useDualQuaternionSkinning);

View file

@ -154,7 +154,7 @@ void Model::setOffset(const glm::vec3& offset) {
} }
void Model::calculateTextureInfo() { void Model::calculateTextureInfo() {
if (!_hasCalculatedTextureInfo && isLoaded() && getGeometry()->areTexturesLoaded() && !_modelMeshRenderItemsMap.isEmpty()) { if (!_hasCalculatedTextureInfo && isLoaded() && getGeometry()->areTexturesLoaded() && !_modelMeshRenderItems.isEmpty()) {
size_t textureSize = 0; size_t textureSize = 0;
int textureCount = 0; int textureCount = 0;
bool allTexturesLoaded = true; bool allTexturesLoaded = true;
@ -960,6 +960,20 @@ void Model::setCauterized(bool cauterized, const render::ScenePointer& scene) {
} }
} }
void Model::setCullWithParent(bool cullWithParent) {
if (_cullWithParent != cullWithParent) {
_cullWithParent = cullWithParent;
render::Transaction transaction;
foreach(auto item, _modelMeshRenderItemsMap.keys()) {
transaction.updateItem<ModelMeshPartPayload>(item, [cullWithParent](ModelMeshPartPayload& data) {
data.setCullWithParent(cullWithParent);
});
}
AbstractViewStateInterface::instance()->getMain3DScene()->enqueueTransaction(transaction);
}
}
const render::ItemKey Model::getRenderItemKeyGlobalFlags() const { const render::ItemKey Model::getRenderItemKeyGlobalFlags() const {
return _renderItemKeyGlobalFlags; return _renderItemKeyGlobalFlags;
} }

View file

@ -129,6 +129,8 @@ public:
bool isCauterized() const { return _cauterized; } bool isCauterized() const { return _cauterized; }
void setCauterized(bool value, const render::ScenePointer& scene); void setCauterized(bool value, const render::ScenePointer& scene);
void setCullWithParent(bool value);
// Access the current RenderItemKey Global Flags used by the model and applied to the render items representing the parts of the model. // Access the current RenderItemKey Global Flags used by the model and applied to the render items representing the parts of the model.
const render::ItemKey getRenderItemKeyGlobalFlags() const; const render::ItemKey getRenderItemKeyGlobalFlags() const;
@ -503,6 +505,7 @@ protected:
// //
render::ItemKey _renderItemKeyGlobalFlags; render::ItemKey _renderItemKeyGlobalFlags;
bool _cauterized { false }; bool _cauterized { false };
bool _cullWithParent { false };
bool shouldInvalidatePayloadShapeKey(int meshIndex); bool shouldInvalidatePayloadShapeKey(int meshIndex);

View file

@ -123,12 +123,8 @@ namespace render {
if (!payload) { if (!payload) {
return ItemKey::Builder::opaqueShape().withTypeMeta(); return ItemKey::Builder::opaqueShape().withTypeMeta();
} }
if (payload->overrideSubMetaCulled()) {
return ItemKey::Builder(payload->getKey()).withSubMetaCulled();
} else {
return payload->getKey(); return payload->getKey();
} }
}
template <> const ShapeKey shapeGetShapeKey(const PayloadProxyInterface::Pointer& payload) { template <> const ShapeKey shapeGetShapeKey(const PayloadProxyInterface::Pointer& payload) {
if (!payload) { if (!payload) {

View file

@ -615,12 +615,6 @@ public:
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) = 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);