Update entity payload items to correctly hide when not visible

This commit is contained in:
Ryan Huffman 2015-06-04 13:25:40 -07:00
parent 50f44c801a
commit a62b55fcb2
4 changed files with 30 additions and 5 deletions

View file

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

View file

@ -221,6 +221,8 @@ void RenderableModelEntityItem::render(RenderArgs* args) {
_model->addToScene(scene, pendingChanges);
}
scene->enqueuePendingChanges(pendingChanges);
_model->setVisibleInScene(getVisible(), scene);
}

View file

@ -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<render::Scene> 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<render::Scene> scene, render::PendingChanges& pendingChanges) {
if (!_meshGroupsKnown && isLoadedWithTextures()) {
@ -893,7 +912,7 @@ bool Model::addToScene(std::shared_ptr<render::Scene> 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<render::Scene> 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<render::Scene> scene, render::Pendin
attachment->removeFromScene(scene, pendingChanges);
}
foreach (auto item, _renderItems) {
foreach (auto item, _renderItems.keys()) {
pendingChanges.removeItem(item);
}
_renderItems.clear();

View file

@ -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<render::Scene> 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<Transform> _transforms;
@ -528,7 +532,7 @@ private:
QSet<std::shared_ptr<TransparentMeshPart>> _transparentRenderItems;
QSet<std::shared_ptr<OpaqueMeshPart>> _opaqueRenderItems;
QSet<render::ItemID> _renderItems;
QMap<render::ItemID, render::PayloadPointer> _renderItems;
bool _readyWhenAdded = false;