diff --git a/examples/utilities/tools/renderEngineDebug.js b/examples/utilities/tools/renderEngineDebug.js index cca97b7184..940eeda02d 100755 --- a/examples/utilities/tools/renderEngineDebug.js +++ b/examples/utilities/tools/renderEngineDebug.js @@ -66,6 +66,12 @@ var overlaysCounter = new CounterWidget(panel, "Overlays", var showDisplayStatusFlag = 1; var showNetworkStatusFlag = 2; +panel.newCheckbox("Debug deferred buffer", + function(value) { Scene.setEngineDisplayDebugDeferredBuffer(value > 0); }, + function() { return Scene.doEngineDisplayDebugDeferredBuffer() > 0; }, + function(value) { return value > 0; } +); + panel.newCheckbox("Display status", function(value) { Scene.setEngineDisplayItemStatus(value ? Scene.doEngineDisplayItemStatus() | showDisplayStatusFlag : diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index cc9a47f793..8fa772e316 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -3621,7 +3621,9 @@ void Application::displaySide(RenderArgs* renderArgs, Camera& theCamera, bool se renderContext._maxDrawnOpaqueItems = sceneInterface->getEngineMaxDrawnOpaqueItems(); renderContext._maxDrawnTransparentItems = sceneInterface->getEngineMaxDrawnTransparentItems(); renderContext._maxDrawnOverlay3DItems = sceneInterface->getEngineMaxDrawnOverlay3DItems(); - + + renderContext._drawDebugDeferredBuffer = sceneInterface->doEngineDisplayDebugDeferredBuffer(); + renderContext._drawItemStatus = sceneInterface->doEngineDisplayItemStatus(); if (Menu::getInstance()->isOptionChecked(MenuOption::PhysicsShowOwned)) { renderContext._drawItemStatus |= render::showNetworkStatusFlag; diff --git a/libraries/render-utils/src/DebugDeferredBuffer.cpp b/libraries/render-utils/src/DebugDeferredBuffer.cpp index e1c31f943e..efb78c888c 100644 --- a/libraries/render-utils/src/DebugDeferredBuffer.cpp +++ b/libraries/render-utils/src/DebugDeferredBuffer.cpp @@ -17,6 +17,7 @@ #include <ViewFrustum.h> #include "GeometryCache.h" +#include "FramebufferCache.h" #include "debug_deferred_buffer_vert.h" #include "debug_deferred_buffer_frag.h" @@ -33,16 +34,8 @@ const gpu::PipelinePointer& DebugDeferredBuffer::getPipeline() { gpu::Shader::BindingSet slotBindings; gpu::Shader::makeProgram(*program, slotBindings); - auto state = std::make_shared<gpu::State>(); - - state->setDepthTest(false, false, gpu::LESS_EQUAL); - - // Blend on transparent - state->setBlendFunction(true, - gpu::State::SRC_ALPHA, gpu::State::BLEND_OP_ADD, gpu::State::INV_SRC_ALPHA); - // Good to go add the brand new pipeline - _pipeline.reset(gpu::Pipeline::create(program, state)); + _pipeline.reset(gpu::Pipeline::create(program, std::make_shared<gpu::State>())); } return _pipeline; } @@ -53,6 +46,9 @@ void DebugDeferredBuffer::run(const SceneContextPointer& sceneContext, const Ren assert(renderContext->args->_viewFrustum); RenderArgs* args = renderContext->args; gpu::doInBatch(args->_context, [&](gpu::Batch& batch) { + auto geometryBuffer = DependencyManager::get<GeometryCache>(); + auto framebufferCache = DependencyManager::get<FramebufferCache>(); + glm::mat4 projMat; Transform viewMat; @@ -64,9 +60,11 @@ void DebugDeferredBuffer::run(const SceneContextPointer& sceneContext, const Ren batch.setPipeline(getPipeline()); + batch.setResourceTexture(0, framebufferCache->getPrimaryNormalTexture()); + glm::vec4 color(0.0f, 0.0f, 1.0f, 1.0f); glm::vec2 bottomLeft(0.0f, -1.0f); glm::vec2 topRight(1.0f, 1.0f); - DependencyManager::get<GeometryCache>()->renderQuad(batch, bottomLeft, topRight, color); + geometryBuffer->renderQuad(batch, bottomLeft, topRight, color); }); } \ No newline at end of file diff --git a/libraries/render-utils/src/RenderDeferredTask.cpp b/libraries/render-utils/src/RenderDeferredTask.cpp index 43ddd5b7ae..0f939682c8 100755 --- a/libraries/render-utils/src/RenderDeferredTask.cpp +++ b/libraries/render-utils/src/RenderDeferredTask.cpp @@ -114,6 +114,8 @@ RenderDeferredTask::RenderDeferredTask() : Task() { _jobs.push_back(Job(new DrawTransparentDeferred::JobModel("TransparentDeferred", _jobs.back().getOutput()))); _jobs.push_back(Job(new DebugDeferredBuffer::JobModel("DebugDeferredBuffer"))); + _jobs.back().setEnabled(false); + _drawDebugDeferredBufferIndex = _jobs.size() - 1; // Grab a texture map representing the different status icons and assign that to the drawStatsuJob auto iconMapPath = PathUtils::resourcesPath() + "icons/statusIconAtlas.svg"; @@ -154,10 +156,13 @@ void RenderDeferredTask::run(const SceneContextPointer& sceneContext, const Rend return; } + // Make sure we turn the deferred buffer debug on/off + setDrawDebugDeferredBuffer(renderContext->_drawDebugDeferredBuffer); + // Make sure we turn the displayItemStatus on/off setDrawItemStatus(renderContext->_drawItemStatus); - //Make sure we display hit effect on screen, as desired from a script + // Make sure we display hit effect on screen, as desired from a script setDrawHitEffect(renderContext->_drawHitEffect); diff --git a/libraries/render-utils/src/RenderDeferredTask.h b/libraries/render-utils/src/RenderDeferredTask.h index e75edd20da..09a2761926 100755 --- a/libraries/render-utils/src/RenderDeferredTask.h +++ b/libraries/render-utils/src/RenderDeferredTask.h @@ -93,16 +93,23 @@ public: ~RenderDeferredTask(); render::Jobs _jobs; - + + int _drawDebugDeferredBufferIndex = -1; int _drawStatusJobIndex = -1; int _drawHitEffectJobIndex = -1; - + + void setDrawDebugDeferredBuffer(int draw) { + if (_drawDebugDeferredBufferIndex >= 0) { + _jobs[_drawDebugDeferredBufferIndex].setEnabled(draw > 0); + } + } + bool doDrawDebugDeferredBuffer() const { if (_drawDebugDeferredBufferIndex >= 0) { return _jobs[_drawDebugDeferredBufferIndex].isEnabled(); } else { return false; } } + void setDrawItemStatus(int draw) { if (_drawStatusJobIndex >= 0) { _jobs[_drawStatusJobIndex].setEnabled(draw > 0); } } - bool doDrawItemStatus() const { if (_drawStatusJobIndex >= 0) { return _jobs[_drawStatusJobIndex].isEnabled(); } else { return false; } } void setDrawHitEffect(bool draw) { if (_drawHitEffectJobIndex >= 0) { _jobs[_drawHitEffectJobIndex].setEnabled(draw); } } diff --git a/libraries/render-utils/src/debug_deferred_buffer.slf b/libraries/render-utils/src/debug_deferred_buffer.slf index c33773aa40..212a51c1ed 100644 --- a/libraries/render-utils/src/debug_deferred_buffer.slf +++ b/libraries/render-utils/src/debug_deferred_buffer.slf @@ -12,10 +12,11 @@ // See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html // -<@include DeferredBufferWrite.slh@> +<@include DeferredBuffer.slh@> +in vec2 uv; out vec4 outFragColor; void main(void) { - outFragColor = vec4(0.0, 0.0, 1.0, 1.0); + outFragColor = texture(normalMap, uv); } \ No newline at end of file diff --git a/libraries/render-utils/src/debug_deferred_buffer.slv b/libraries/render-utils/src/debug_deferred_buffer.slv index b1b7b18f86..85ff2b651d 100644 --- a/libraries/render-utils/src/debug_deferred_buffer.slv +++ b/libraries/render-utils/src/debug_deferred_buffer.slv @@ -14,6 +14,9 @@ <@include gpu/Inputs.slh@> +out vec2 uv; + void main(void) { + uv = (inPosition.xy + 1.0) * 0.5; gl_Position = inPosition; } \ No newline at end of file diff --git a/libraries/render/src/render/Engine.h b/libraries/render/src/render/Engine.h index 7c11246cff..ab56d68291 100644 --- a/libraries/render/src/render/Engine.h +++ b/libraries/render/src/render/Engine.h @@ -53,6 +53,7 @@ public: int _numDrawnOverlay3DItems = 0; int _maxDrawnOverlay3DItems = -1; + int _drawDebugDeferredBuffer = 0; int _drawItemStatus = 0; bool _drawHitEffect = false; diff --git a/libraries/script-engine/src/SceneScriptingInterface.h b/libraries/script-engine/src/SceneScriptingInterface.h index 6be0ce44a8..eac35ad5bb 100644 --- a/libraries/script-engine/src/SceneScriptingInterface.h +++ b/libraries/script-engine/src/SceneScriptingInterface.h @@ -106,7 +106,10 @@ public: Q_INVOKABLE int getEngineMaxDrawnTransparentItems() { return _maxDrawnTransparentItems; } Q_INVOKABLE void setEngineMaxDrawnOverlay3DItems(int count) { _maxDrawnOverlay3DItems = count; } Q_INVOKABLE int getEngineMaxDrawnOverlay3DItems() { return _maxDrawnOverlay3DItems; } - + + Q_INVOKABLE void setEngineDisplayDebugDeferredBuffer(int display) { _drawDebugDeferredBuffer = display; } + Q_INVOKABLE int doEngineDisplayDebugDeferredBuffer() { return _drawDebugDeferredBuffer; } + Q_INVOKABLE void setEngineDisplayItemStatus(int display) { _drawItemStatus = display; } Q_INVOKABLE int doEngineDisplayItemStatus() { return _drawItemStatus; } @@ -142,7 +145,8 @@ protected: int _maxDrawnOpaqueItems = -1; int _maxDrawnTransparentItems = -1; int _maxDrawnOverlay3DItems = -1; - + + int _drawDebugDeferredBuffer = 0; int _drawItemStatus = 0; bool _drawHitEffect = false;