From a62b55fcb238e920886fb9801361778a7b75f762 Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Thu, 4 Jun 2015 13:25:40 -0700 Subject: [PATCH] Update entity payload items to correctly hide when not visible --- .../src/RenderableEntityItem.cpp | 2 +- .../src/RenderableModelEntityItem.cpp | 2 ++ libraries/render-utils/src/Model.cpp | 25 ++++++++++++++++--- libraries/render-utils/src/Model.h | 6 ++++- 4 files changed, 30 insertions(+), 5 deletions(-) diff --git a/libraries/entities-renderer/src/RenderableEntityItem.cpp b/libraries/entities-renderer/src/RenderableEntityItem.cpp index e5e0f2ff85..56e385e689 100644 --- a/libraries/entities-renderer/src/RenderableEntityItem.cpp +++ b/libraries/entities-renderer/src/RenderableEntityItem.cpp @@ -31,7 +31,7 @@ namespace render { template <> void payloadRender(const RenderableEntityItemProxy::Pointer& payload, RenderArgs* args) { if (args) { args->_elementsTouched++; - if (payload && payload->entity) { + if (payload && payload->entity && payload->entity->getVisible()) { payload->entity->render(args); } } diff --git a/libraries/entities-renderer/src/RenderableModelEntityItem.cpp b/libraries/entities-renderer/src/RenderableModelEntityItem.cpp index 29da23702c..81ddb912cc 100644 --- a/libraries/entities-renderer/src/RenderableModelEntityItem.cpp +++ b/libraries/entities-renderer/src/RenderableModelEntityItem.cpp @@ -221,6 +221,8 @@ void RenderableModelEntityItem::render(RenderArgs* args) { _model->addToScene(scene, pendingChanges); } scene->enqueuePendingChanges(pendingChanges); + + _model->setVisibleInScene(getVisible(), scene); } diff --git a/libraries/render-utils/src/Model.cpp b/libraries/render-utils/src/Model.cpp index ab597051cc..8f724d9ad5 100644 --- a/libraries/render-utils/src/Model.cpp +++ b/libraries/render-utils/src/Model.cpp @@ -78,6 +78,7 @@ Model::Model(QObject* parent) : _showTrueJointTransforms(true), _lodDistance(0.0f), _pupilDilation(0.0f), + _isVisible(true), _url("http://invalid.com"), _blendNumber(0), _appliedBlendNumber(0), @@ -823,6 +824,9 @@ public: namespace render { template <> const ItemKey payloadGetKey(const TransparentMeshPart::Pointer& payload) { + if (!payload->model->isVisible()) { + return ItemKey::Builder().withInvisible().build(); + } return ItemKey::Builder::transparentShape(); } @@ -853,6 +857,9 @@ public: namespace render { template <> const ItemKey payloadGetKey(const OpaqueMeshPart::Pointer& payload) { + if (!payload->model->isVisible()) { + return ItemKey::Builder().withInvisible().build(); + } return ItemKey::Builder::opaqueShape(); } @@ -872,6 +879,18 @@ namespace render { } } +void Model::setVisibleInScene(bool newValue, std::shared_ptr scene) { + if (_isVisible != newValue) { + _isVisible = newValue; + + render::PendingChanges pendingChanges; + foreach (auto item, _renderItems.keys()) { + pendingChanges.resetItem(item, _renderItems[item]); + } + scene->enqueuePendingChanges(pendingChanges); + } +} + bool Model::addToScene(std::shared_ptr scene, render::PendingChanges& pendingChanges) { if (!_meshGroupsKnown && isLoadedWithTextures()) { @@ -893,7 +912,7 @@ bool Model::addToScene(std::shared_ptr scene, render::PendingChan auto renderData = TransparentMeshPart::Pointer(renderItem); auto renderPayload = render::PayloadPointer(new TransparentMeshPart::Payload(renderData)); pendingChanges.resetItem(item, renderPayload); - _renderItems << item; + _renderItems.insert(item, renderPayload); somethingAdded = true; } foreach (auto renderItem, _opaqueRenderItems) { @@ -901,7 +920,7 @@ bool Model::addToScene(std::shared_ptr scene, render::PendingChan auto renderData = OpaqueMeshPart::Pointer(renderItem); auto renderPayload = render::PayloadPointer(new OpaqueMeshPart::Payload(renderData)); pendingChanges.resetItem(item, renderPayload); - _renderItems << item; + _renderItems.insert(item, renderPayload); somethingAdded = true; } @@ -916,7 +935,7 @@ void Model::removeFromScene(std::shared_ptr scene, render::Pendin attachment->removeFromScene(scene, pendingChanges); } - foreach (auto item, _renderItems) { + foreach (auto item, _renderItems.keys()) { pendingChanges.removeItem(item); } _renderItems.clear(); diff --git a/libraries/render-utils/src/Model.h b/libraries/render-utils/src/Model.h index 3795dc8731..57c20469ca 100644 --- a/libraries/render-utils/src/Model.h +++ b/libraries/render-utils/src/Model.h @@ -107,6 +107,9 @@ public: bool isActive() const { return _geometry && _geometry->isLoaded(); } bool isRenderable() const { return !_meshStates.isEmpty() || (isActive() && _geometry->getMeshes().isEmpty()); } + + void setVisibleInScene(bool newValue, std::shared_ptr scene); + bool isVisible() const { return _isVisible; } bool isLoadedWithTextures() const { return _geometry && _geometry->isLoadedWithTextures(); } @@ -334,6 +337,7 @@ private: QUrl _url; QUrl _collisionUrl; + bool _isVisible; gpu::Buffers _blendedVertexBuffers; std::vector _transforms; @@ -528,7 +532,7 @@ private: QSet> _transparentRenderItems; QSet> _opaqueRenderItems; - QSet _renderItems; + QMap _renderItems; bool _readyWhenAdded = false;