From 7a3118543824e53251782e24e14e0438672cca25 Mon Sep 17 00:00:00 2001 From: NissimHadar Date: Thu, 12 Jul 2018 11:31:21 -0700 Subject: [PATCH 1/4] Clear the frame buffer in all cases. --- .../render-utils/src/RenderCommonTask.cpp | 24 +++++++++---------- 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/libraries/render-utils/src/RenderCommonTask.cpp b/libraries/render-utils/src/RenderCommonTask.cpp index 24715f0afb..c2181b7613 100644 --- a/libraries/render-utils/src/RenderCommonTask.cpp +++ b/libraries/render-utils/src/RenderCommonTask.cpp @@ -51,19 +51,19 @@ void DrawOverlay3D::run(const RenderContextPointer& renderContext, const Inputs& config->setNumDrawn((int)inItems.size()); emit config->numDrawnChanged(); + RenderArgs* args = renderContext->args; + + // Clear the framebuffer without stereo + // Needs to be distinct from the other batch because using the clear call + // while stereo is enabled triggers a warning + if (_opaquePass) { + gpu::doInBatch("DrawOverlay3D::run::clear", args->_context, [&](gpu::Batch& batch) { + batch.enableStereo(false); + batch.clearFramebuffer(gpu::Framebuffer::BUFFER_DEPTH, glm::vec4(), 1.f, 0, false); + }); + } + if (!inItems.empty()) { - RenderArgs* args = renderContext->args; - - // Clear the framebuffer without stereo - // Needs to be distinct from the other batch because using the clear call - // while stereo is enabled triggers a warning - if (_opaquePass) { - gpu::doInBatch("DrawOverlay3D::run::clear", args->_context, [&](gpu::Batch& batch){ - batch.enableStereo(false); - batch.clearFramebuffer(gpu::Framebuffer::BUFFER_DEPTH, glm::vec4(), 1.f, 0, false); - }); - } - // Render the items gpu::doInBatch("DrawOverlay3D::main", args->_context, [&](gpu::Batch& batch) { args->_batch = &batch; From 446ef97fc57f3cf8c37b34e4a79d18f0e20ef4de Mon Sep 17 00:00:00 2001 From: NissimHadar Date: Wed, 18 Jul 2018 13:54:03 -0700 Subject: [PATCH 2/4] Only show overlay if textures have loaded --- interface/src/ui/overlays/ModelOverlay.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/interface/src/ui/overlays/ModelOverlay.cpp b/interface/src/ui/overlays/ModelOverlay.cpp index f4289b1bf5..f47172eb55 100644 --- a/interface/src/ui/overlays/ModelOverlay.cpp +++ b/interface/src/ui/overlays/ModelOverlay.cpp @@ -136,6 +136,9 @@ void ModelOverlay::update(float deltatime) { } _model->updateRenderItems(); } + + // Only show overlay if textures have loaded + _model->setVisibleInScene(_texturesLoaded, scene); } bool ModelOverlay::addToScene(Overlay::Pointer overlay, const render::ScenePointer& scene, render::Transaction& transaction) { From a882931c6bf2728c7a557d5b63ebe6166d1915f4 Mon Sep 17 00:00:00 2001 From: NissimHadar Date: Wed, 18 Jul 2018 15:02:02 -0700 Subject: [PATCH 3/4] Only show overlay if textures have loaded --- interface/src/ui/overlays/ModelOverlay.cpp | 26 ++++++++++++---------- interface/src/ui/overlays/ModelOverlay.h | 1 + 2 files changed, 15 insertions(+), 12 deletions(-) diff --git a/interface/src/ui/overlays/ModelOverlay.cpp b/interface/src/ui/overlays/ModelOverlay.cpp index f47172eb55..dbb0b23558 100644 --- a/interface/src/ui/overlays/ModelOverlay.cpp +++ b/interface/src/ui/overlays/ModelOverlay.cpp @@ -27,6 +27,11 @@ ModelOverlay::ModelOverlay() { _model->setLoadingPriority(_loadPriority); _isLoaded = false; + + _scene = qApp->getMain3DScene(); + + // Don't show overlay until textures have loaded + _model->setVisibleInScene(false, _scene); } ModelOverlay::ModelOverlay(const ModelOverlay* modelOverlay) : @@ -85,12 +90,11 @@ void ModelOverlay::update(float deltatime) { // check to see if when we added our model to the scene they were ready, if they were not ready, then // fix them up in the scene - render::ScenePointer scene = qApp->getMain3DScene(); render::Transaction transaction; if (_model->needsFixupInScene()) { emit DependencyManager::get()->modelRemovedFromScene(getID(), NestableType::Overlay, _model); - _model->removeFromScene(scene, transaction); - _model->addToScene(scene, transaction); + _model->removeFromScene(_scene, transaction); + _model->addToScene(_scene, transaction); auto newRenderItemIDs{ _model->fetchRenderItemIDs() }; transaction.updateItem(getRenderItemID(), [newRenderItemIDs](Overlay& data) { @@ -105,40 +109,38 @@ void ModelOverlay::update(float deltatime) { _visibleDirty = false; // don't show overlays in mirrors or spectator-cam unless _isVisibleInSecondaryCamera is true uint8_t modelRenderTagMask = (_isVisibleInSecondaryCamera ? render::hifi::TAG_ALL_VIEWS : render::hifi::TAG_MAIN_VIEW); - _model->setTagMask(modelRenderTagMask, scene); - _model->setVisibleInScene(getVisible(), scene); + _model->setTagMask(modelRenderTagMask, _scene); metaDirty = true; } if (_drawInFrontDirty) { _drawInFrontDirty = false; - _model->setLayeredInFront(getDrawInFront(), scene); + _model->setLayeredInFront(getDrawInFront(), _scene); metaDirty = true; } if (_drawInHUDDirty) { _drawInHUDDirty = false; - _model->setLayeredInHUD(getDrawHUDLayer(), scene); + _model->setLayeredInHUD(getDrawHUDLayer(), _scene); metaDirty = true; } if (_groupCulledDirty) { _groupCulledDirty = false; - _model->setGroupCulled(_isGroupCulled, scene); + _model->setGroupCulled(_isGroupCulled, _scene); metaDirty = true; } if (metaDirty) { transaction.updateItem(getRenderItemID(), [](Overlay& data) {}); } - scene->enqueueTransaction(transaction); + _scene->enqueueTransaction(transaction); if (!_texturesLoaded && _model->getGeometry() && _model->getGeometry()->areTexturesLoaded()) { _texturesLoaded = true; if (!_modelTextures.isEmpty()) { _model->setTextures(_modelTextures); } + + _model->setVisibleInScene(true, _scene); _model->updateRenderItems(); } - - // Only show overlay if textures have loaded - _model->setVisibleInScene(_texturesLoaded, scene); } bool ModelOverlay::addToScene(Overlay::Pointer overlay, const render::ScenePointer& scene, render::Transaction& transaction) { diff --git a/interface/src/ui/overlays/ModelOverlay.h b/interface/src/ui/overlays/ModelOverlay.h index f7a79c5615..9b5a8e2ec1 100644 --- a/interface/src/ui/overlays/ModelOverlay.h +++ b/interface/src/ui/overlays/ModelOverlay.h @@ -128,6 +128,7 @@ private: void processMaterials(); + render::ScenePointer _scene; }; #endif // hifi_ModelOverlay_h From 4c0b7ca24cf5581ccd9e322b267b903ba1dd8fa2 Mon Sep 17 00:00:00 2001 From: NissimHadar Date: Wed, 18 Jul 2018 17:30:46 -0700 Subject: [PATCH 4/4] Updated per Samuel's/Austin's comments. --- interface/src/ui/overlays/ModelOverlay.cpp | 28 ++++++++++++---------- interface/src/ui/overlays/ModelOverlay.h | 1 - 2 files changed, 16 insertions(+), 13 deletions(-) diff --git a/interface/src/ui/overlays/ModelOverlay.cpp b/interface/src/ui/overlays/ModelOverlay.cpp index dbb0b23558..71354002ea 100644 --- a/interface/src/ui/overlays/ModelOverlay.cpp +++ b/interface/src/ui/overlays/ModelOverlay.cpp @@ -28,10 +28,11 @@ ModelOverlay::ModelOverlay() _model->setLoadingPriority(_loadPriority); _isLoaded = false; - _scene = qApp->getMain3DScene(); - // Don't show overlay until textures have loaded - _model->setVisibleInScene(false, _scene); + _visible = false; + + render::ScenePointer scene = qApp->getMain3DScene(); + _model->setVisibleInScene(false, scene); } ModelOverlay::ModelOverlay(const ModelOverlay* modelOverlay) : @@ -90,11 +91,12 @@ void ModelOverlay::update(float deltatime) { // check to see if when we added our model to the scene they were ready, if they were not ready, then // fix them up in the scene + render::ScenePointer scene = qApp->getMain3DScene(); render::Transaction transaction; if (_model->needsFixupInScene()) { emit DependencyManager::get()->modelRemovedFromScene(getID(), NestableType::Overlay, _model); - _model->removeFromScene(_scene, transaction); - _model->addToScene(_scene, transaction); + _model->removeFromScene(scene, transaction); + _model->addToScene(scene, transaction); auto newRenderItemIDs{ _model->fetchRenderItemIDs() }; transaction.updateItem(getRenderItemID(), [newRenderItemIDs](Overlay& data) { @@ -105,32 +107,34 @@ void ModelOverlay::update(float deltatime) { emit DependencyManager::get()->modelAddedToScene(getID(), NestableType::Overlay, _model); } bool metaDirty = false; - if (_visibleDirty) { + if (_visibleDirty && _texturesLoaded) { _visibleDirty = false; // don't show overlays in mirrors or spectator-cam unless _isVisibleInSecondaryCamera is true uint8_t modelRenderTagMask = (_isVisibleInSecondaryCamera ? render::hifi::TAG_ALL_VIEWS : render::hifi::TAG_MAIN_VIEW); - _model->setTagMask(modelRenderTagMask, _scene); + + _model->setTagMask(modelRenderTagMask, scene); + _model->setVisibleInScene(getVisible(), scene); metaDirty = true; } if (_drawInFrontDirty) { _drawInFrontDirty = false; - _model->setLayeredInFront(getDrawInFront(), _scene); + _model->setLayeredInFront(getDrawInFront(), scene); metaDirty = true; } if (_drawInHUDDirty) { _drawInHUDDirty = false; - _model->setLayeredInHUD(getDrawHUDLayer(), _scene); + _model->setLayeredInHUD(getDrawHUDLayer(), scene); metaDirty = true; } if (_groupCulledDirty) { _groupCulledDirty = false; - _model->setGroupCulled(_isGroupCulled, _scene); + _model->setGroupCulled(_isGroupCulled, scene); metaDirty = true; } if (metaDirty) { transaction.updateItem(getRenderItemID(), [](Overlay& data) {}); } - _scene->enqueueTransaction(transaction); + scene->enqueueTransaction(transaction); if (!_texturesLoaded && _model->getGeometry() && _model->getGeometry()->areTexturesLoaded()) { _texturesLoaded = true; @@ -138,7 +142,7 @@ void ModelOverlay::update(float deltatime) { _model->setTextures(_modelTextures); } - _model->setVisibleInScene(true, _scene); + _model->setVisibleInScene(getVisible(), scene); _model->updateRenderItems(); } } diff --git a/interface/src/ui/overlays/ModelOverlay.h b/interface/src/ui/overlays/ModelOverlay.h index 9b5a8e2ec1..f7a79c5615 100644 --- a/interface/src/ui/overlays/ModelOverlay.h +++ b/interface/src/ui/overlays/ModelOverlay.h @@ -128,7 +128,6 @@ private: void processMaterials(); - render::ScenePointer _scene; }; #endif // hifi_ModelOverlay_h