From 06ac2b291bb0e7431ab0d9db74a3a9b650e95969 Mon Sep 17 00:00:00 2001 From: SamGondelman Date: Sun, 17 Feb 2019 17:52:10 -0800 Subject: [PATCH] attachments and wearables cull with avatar parent --- interface/src/Application.cpp | 2 - .../src/avatars-renderer/Avatar.cpp | 55 ++++++++++++++++++- .../src/RenderableEntityItem.cpp | 8 --- .../src/RenderableEntityItem.h | 9 +-- .../src/RenderableModelEntityItem.cpp | 12 +--- .../entities/src/EntityScriptingInterface.cpp | 2 +- libraries/shared/src/SpatiallyNestable.cpp | 2 - libraries/shared/src/SpatiallyNestable.h | 3 +- 8 files changed, 60 insertions(+), 33 deletions(-) diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index b65f39ffd7..02b6732f1d 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -622,8 +622,6 @@ public: switch (type) { case NestableType::Entity: return getEntityModelProvider(static_cast(uuid)); - case NestableType::Overlay: - return nullptr; case NestableType::Avatar: return getAvatarModelProvider(uuid); } diff --git a/libraries/avatars-renderer/src/avatars-renderer/Avatar.cpp b/libraries/avatars-renderer/src/avatars-renderer/Avatar.cpp index 1f14e3db84..d114ff09e2 100644 --- a/libraries/avatars-renderer/src/avatars-renderer/Avatar.cpp +++ b/libraries/avatars-renderer/src/avatars-renderer/Avatar.cpp @@ -64,7 +64,36 @@ namespace render { return keyBuilder.build(); } template <> const Item::Bound payloadGetBound(const AvatarSharedPointer& avatar) { - return static_pointer_cast(avatar)->getRenderBounds(); + auto avatarPtr = static_pointer_cast(avatar); + if (avatarPtr) { + auto bound = avatarPtr->getRenderBounds(); + auto& attachmentModels = avatarPtr->getAttachmentModels(); + for (auto& attachmentModel : attachmentModels) { + if (attachmentModel && attachmentModel->isRenderable()) { + bound += attachmentModel->getRenderableMeshBound(); + } + } + // Children + auto entityTreeRenderer = DependencyManager::get(); + EntityTreePointer entityTree = entityTreeRenderer ? entityTreeRenderer->getTree() : nullptr; + if (entityTree) { + entityTree->withReadLock([&] { + avatarPtr->forEachDescendant([&](SpatiallyNestablePointer object) { + if (object && object->getNestableType() == NestableType::Entity) { + EntityItemPointer entity = std::static_pointer_cast(object); + if (entity->isVisible()) { + auto renderer = entityTreeRenderer->renderableForEntityId(object->getID()); + if (renderer) { + bound += renderer->getBound(); + } + } + } + }); + }); + } + return bound; + } + return Item::Bound(); } template <> void payloadRender(const AvatarSharedPointer& avatar, RenderArgs* args) { auto avatarPtr = static_pointer_cast(avatar); @@ -82,6 +111,7 @@ namespace render { subItems.insert(subItems.end(), metaSubItems.begin(), metaSubItems.end()); total += (uint32_t)metaSubItems.size(); } + // Attachments auto& attachmentModels = avatarPtr->getAttachmentModels(); for (auto& attachmentModel : attachmentModels) { if (attachmentModel && attachmentModel->isRenderable()) { @@ -90,6 +120,29 @@ namespace render { total += (uint32_t)metaSubItems.size(); } } + // Children + auto entityTreeRenderer = DependencyManager::get(); + EntityTreePointer entityTree = entityTreeRenderer ? entityTreeRenderer->getTree() : nullptr; + if (entityTree) { + entityTree->withReadLock([&] { + avatarPtr->forEachDescendant([&](SpatiallyNestablePointer object) { + if (object && object->getNestableType() == NestableType::Entity) { + EntityItemPointer entity = std::static_pointer_cast(object); + if (entity->isVisible()) { + auto renderer = entityTreeRenderer->renderableForEntityId(object->getID()); + if (renderer) { + render::ItemIDs renderableSubItems; + uint32_t numRenderableSubItems = renderer->metaFetchMetaSubItems(renderableSubItems); + if (numRenderableSubItems > 0) { + subItems.insert(subItems.end(), renderableSubItems.begin(), renderableSubItems.end()); + total += numRenderableSubItems; + } + } + } + } + }); + }); + } return total; } return 0; diff --git a/libraries/entities-renderer/src/RenderableEntityItem.cpp b/libraries/entities-renderer/src/RenderableEntityItem.cpp index 83f0bdcff3..80e352956b 100644 --- a/libraries/entities-renderer/src/RenderableEntityItem.cpp +++ b/libraries/entities-renderer/src/RenderableEntityItem.cpp @@ -353,14 +353,6 @@ void EntityRenderer::updateInScene(const ScenePointer& scene, Transaction& trans }); } -void EntityRenderer::clearSubRenderItemIDs() { - _subRenderItemIDs.clear(); -} - -void EntityRenderer::setSubRenderItemIDs(const render::ItemIDs& ids) { - _subRenderItemIDs = ids; -} - // // Internal methods // diff --git a/libraries/entities-renderer/src/RenderableEntityItem.h b/libraries/entities-renderer/src/RenderableEntityItem.h index d5e236a76a..e9a6035e3d 100644 --- a/libraries/entities-renderer/src/RenderableEntityItem.h +++ b/libraries/entities-renderer/src/RenderableEntityItem.h @@ -52,9 +52,6 @@ public: virtual bool addToScene(const ScenePointer& scene, Transaction& transaction) final; virtual void removeFromScene(const ScenePointer& scene, Transaction& transaction); - void clearSubRenderItemIDs(); - void setSubRenderItemIDs(const render::ItemIDs& ids); - const uint64_t& getUpdateTime() const { return _updateTime; } virtual void addMaterial(graphics::MaterialLayer material, const std::string& parentMaterialName); @@ -64,6 +61,9 @@ public: static glm::vec4 calculatePulseColor(const glm::vec4& color, const PulsePropertyGroup& pulseProperties, quint64 start); + virtual uint32_t metaFetchMetaSubItems(ItemIDs& subItems) override; + virtual Item::Bound getBound() override; + protected: virtual bool needsRenderUpdateFromEntity() const final { return needsRenderUpdateFromEntity(_entity); } virtual void onAddToScene(const EntityItemPointer& entity); @@ -75,9 +75,7 @@ protected: // Implementing the PayloadProxyInterface methods virtual ItemKey getKey() override; virtual ShapeKey getShapeKey() override; - virtual Item::Bound getBound() override; virtual void render(RenderArgs* args) override final; - virtual uint32_t metaFetchMetaSubItems(ItemIDs& subItems) override; virtual render::hifi::Tag getTagMask() const; virtual render::hifi::Layer getHifiRenderLayer() const; @@ -133,7 +131,6 @@ protected: SharedSoundPointer _collisionSound; QUuid _changeHandlerId; ItemID _renderItemID{ Item::INVALID_ITEM_ID }; - ItemIDs _subRenderItemIDs; uint64_t _fadeStartTime{ usecTimestampNow() }; uint64_t _updateTime{ usecTimestampNow() }; // used when sorting/throttling render updates bool _isFading { EntityTreeRenderer::getEntitiesShouldFadeFunction()() }; diff --git a/libraries/entities-renderer/src/RenderableModelEntityItem.cpp b/libraries/entities-renderer/src/RenderableModelEntityItem.cpp index ae9fdf572a..ef589507a5 100644 --- a/libraries/entities-renderer/src/RenderableModelEntityItem.cpp +++ b/libraries/entities-renderer/src/RenderableModelEntityItem.cpp @@ -1079,7 +1079,7 @@ render::hifi::Tag ModelEntityRenderer::getTagMask() const { uint32_t ModelEntityRenderer::metaFetchMetaSubItems(ItemIDs& subItems) { if (_model) { - auto metaSubItems = _subRenderItemIDs; + auto metaSubItems = _model->fetchRenderItemIDs(); subItems.insert(subItems.end(), metaSubItems.begin(), metaSubItems.end()); return (uint32_t)metaSubItems.size(); } @@ -1322,10 +1322,6 @@ void ModelEntityRenderer::doRenderUpdateSynchronousTyped(const ScenePointer& sce if (model) { model->removeFromScene(scene, transaction); withWriteLock([&] { _model.reset(); }); - transaction.updateItem(getRenderItemID(), [](PayloadProxyInterface& data) { - auto entityRenderer = static_cast(&data); - entityRenderer->clearSubRenderItemIDs(); - }); emit DependencyManager::get()-> modelRemovedFromScene(entity->getEntityItemID(), NestableType::Entity, _model); } @@ -1442,12 +1438,6 @@ void ModelEntityRenderer::doRenderUpdateSynchronousTyped(const ScenePointer& sce render::Item::Status::Getters statusGetters; makeStatusGetters(entity, statusGetters); model->addToScene(scene, transaction, statusGetters); - - auto newRenderItemIDs{ model->fetchRenderItemIDs() }; - transaction.updateItem(getRenderItemID(), [newRenderItemIDs](PayloadProxyInterface& data) { - auto entityRenderer = static_cast(&data); - entityRenderer->setSubRenderItemIDs(newRenderItemIDs); - }); processMaterials(); } } diff --git a/libraries/entities/src/EntityScriptingInterface.cpp b/libraries/entities/src/EntityScriptingInterface.cpp index 150aa6b0cf..22cd26eac6 100644 --- a/libraries/entities/src/EntityScriptingInterface.cpp +++ b/libraries/entities/src/EntityScriptingInterface.cpp @@ -941,7 +941,7 @@ QUuid EntityScriptingInterface::editEntity(const QUuid& id, const EntityItemProp auto nestable = nestableWP.lock(); if (nestable) { NestableType nestableType = nestable->getNestableType(); - if (nestableType == NestableType::Overlay || nestableType == NestableType::Avatar) { + if (nestableType == NestableType::Avatar) { qCWarning(entities) << "attempted edit on non-entity: " << id << nestable->getName(); return QUuid(); // null script value to indicate failure } diff --git a/libraries/shared/src/SpatiallyNestable.cpp b/libraries/shared/src/SpatiallyNestable.cpp index d3ed79faf4..363151203a 100644 --- a/libraries/shared/src/SpatiallyNestable.cpp +++ b/libraries/shared/src/SpatiallyNestable.cpp @@ -1337,8 +1337,6 @@ QString SpatiallyNestable::nestableTypeToString(NestableType nestableType) { return "entity"; case NestableType::Avatar: return "avatar"; - case NestableType::Overlay: - return "overlay"; default: return "unknown"; } diff --git a/libraries/shared/src/SpatiallyNestable.h b/libraries/shared/src/SpatiallyNestable.h index e7a449f73f..9f30f27005 100644 --- a/libraries/shared/src/SpatiallyNestable.h +++ b/libraries/shared/src/SpatiallyNestable.h @@ -30,8 +30,7 @@ static const uint16_t INVALID_JOINT_INDEX = -1; enum class NestableType { Entity, - Avatar, - Overlay + Avatar }; class SpatiallyNestable : public std::enable_shared_from_this {