From 41af3778784b537b27f23d8be3090c756d6c2d2a Mon Sep 17 00:00:00 2001 From: Atlante45 Date: Fri, 4 Dec 2015 18:33:11 -0800 Subject: [PATCH 1/3] More g-buffer debugging options --- examples/utilities/tools/renderEngineDebug.js | 2 +- .../render-utils/src/DebugDeferredBuffer.cpp | 66 ++++++++++++++++--- .../render-utils/src/DebugDeferredBuffer.h | 28 ++++---- 3 files changed, 73 insertions(+), 23 deletions(-) diff --git a/examples/utilities/tools/renderEngineDebug.js b/examples/utilities/tools/renderEngineDebug.js index b300ff2ea8..ab266620ab 100755 --- a/examples/utilities/tools/renderEngineDebug.js +++ b/examples/utilities/tools/renderEngineDebug.js @@ -11,7 +11,7 @@ Script.include("cookies.js"); var MENU = "Developer>Render>Debug Deferred Buffer"; -var ACTIONS = ["Off", "Diffuse", "Normal", "Specular", "Depth", "Lighting"]; +var ACTIONS = ["Off", "Diffuse", "Alpha", "Specular", "Roughness", "Normal", "Depth", "Lighting", "Custom"]; var panel = new Panel(10, 100); diff --git a/libraries/render-utils/src/DebugDeferredBuffer.cpp b/libraries/render-utils/src/DebugDeferredBuffer.cpp index 3b4e3d2bd5..d3879dacf3 100644 --- a/libraries/render-utils/src/DebugDeferredBuffer.cpp +++ b/libraries/render-utils/src/DebugDeferredBuffer.cpp @@ -11,6 +11,8 @@ #include "DebugDeferredBuffer.h" +#include + #include #include #include @@ -24,8 +26,16 @@ using namespace render; -static const std::string PLACEHOLDER { "DEBUG_PLACEHOLDER" }; -static const std::array SLOT_NAMES {{ +enum Slots { + Diffuse = 0, + Normal, + Specular, + Depth, + Lighting, + + NUM_SLOTS +}; +static const std::array SLOT_NAMES {{ "diffuseMap", "normalMap", "specularMap", @@ -33,14 +43,50 @@ static const std::array SLOT_NAMES "lightingMap" }}; -std::string getCode(int slot) { - return std::string("return texture(").append(SLOT_NAMES[slot]).append(", uv);"); +static const std::string PLACEHOLDER { "DEBUG_PLACEHOLDER" }; + +std::string DebugDeferredBuffer::getCode(Modes mode) { + switch (mode) { + case DiffuseMode: { + QString code = "return vec4(texture(%1, uv).xyz, 1.0);"; + return code.arg(SLOT_NAMES[Diffuse].c_str()).toStdString(); + } + case AlphaMode: { + QString code = "return vec4(vec3(texture(%1, uv).a), 1.0);"; + return code.arg(SLOT_NAMES[Diffuse].c_str()).toStdString(); + } + case SpecularMode: { + QString code = "return vec4(texture(%1, uv).xyz, 1.0);"; + return code.arg(SLOT_NAMES[Specular].c_str()).toStdString(); + } + case RoughnessMode: { + QString code = "return vec4(vec3(texture(%1, uv).a), 1.0);"; + return code.arg(SLOT_NAMES[Specular].c_str()).toStdString(); + } + case NormalMode: { + QString code = "return vec4(texture(%1, uv).xyz, 1.0);"; + return code.arg(SLOT_NAMES[Normal].c_str()).toStdString(); + } + case DepthMode: { + QString code = "return vec4(vec3(texture(%1, uv).x), 1.0);"; + return code.arg(SLOT_NAMES[Depth].c_str()).toStdString(); + } + case LightingMode: { + QString code = "return vec4(texture(%1, uv).xyz, 1.0);"; + return code.arg(SLOT_NAMES[Lighting].c_str()).toStdString(); + } + case CustomMode: + return std::string("return vec4(1.0);"); + case NUM_MODES: + Q_UNIMPLEMENTED(); + return std::string("return vec4(1.0);"); + } } -const gpu::PipelinePointer& DebugDeferredBuffer::getPipeline(int slot) { - if (!_pipelines[slot]) { +const gpu::PipelinePointer& DebugDeferredBuffer::getPipeline(Modes mode) { + if (!_pipelines[mode]) { std::string fragmentShader = debug_deferred_buffer_frag; - fragmentShader.replace(fragmentShader.find(PLACEHOLDER), PLACEHOLDER.size(), getCode(slot)); + fragmentShader.replace(fragmentShader.find(PLACEHOLDER), PLACEHOLDER.size(), getCode(mode)); auto vs = gpu::ShaderPointer(gpu::Shader::createVertex({ debug_deferred_buffer_vert })); auto ps = gpu::ShaderPointer(gpu::Shader::createPixel(fragmentShader)); @@ -53,9 +99,9 @@ const gpu::PipelinePointer& DebugDeferredBuffer::getPipeline(int slot) { gpu::Shader::makeProgram(*program, slotBindings); // Good to go add the brand new pipeline - _pipelines[slot] = gpu::Pipeline::create(program, std::make_shared()); + _pipelines[mode] = gpu::Pipeline::create(program, std::make_shared()); } - return _pipelines[slot]; + return _pipelines[mode]; } @@ -76,7 +122,7 @@ void DebugDeferredBuffer::run(const SceneContextPointer& sceneContext, const Ren batch.setViewTransform(viewMat); batch.setModelTransform(Transform()); - batch.setPipeline(getPipeline((DebugDeferredBufferSlot)(renderContext->_drawDebugDeferredBuffer - 1))); + batch.setPipeline(getPipeline(Modes(renderContext->_drawDebugDeferredBuffer - 1))); batch.setResourceTexture(Diffuse, framebufferCache->getDeferredColorTexture()); batch.setResourceTexture(Normal, framebufferCache->getDeferredNormalTexture()); diff --git a/libraries/render-utils/src/DebugDeferredBuffer.h b/libraries/render-utils/src/DebugDeferredBuffer.h index 95865cc12a..8628d9e21e 100644 --- a/libraries/render-utils/src/DebugDeferredBuffer.h +++ b/libraries/render-utils/src/DebugDeferredBuffer.h @@ -18,22 +18,26 @@ class DebugDeferredBuffer { public: using JobModel = render::Job::Model; - enum DebugDeferredBufferSlot : int { - Diffuse = 0, - Normal, - Specular, - Depth, - Lighting, - - NUM_SLOTS - }; - void run(const render::SceneContextPointer& sceneContext, const render::RenderContextPointer& renderContext); private: - const gpu::PipelinePointer& getPipeline(int slot); + enum Modes : int { + DiffuseMode = 0, + AlphaMode, + SpecularMode, + RoughnessMode, + NormalMode, + DepthMode, + LightingMode, + CustomMode, + + NUM_MODES + }; - std::array _pipelines; + const gpu::PipelinePointer& getPipeline(Modes mode); + std::string getCode(Modes mode); + + std::array _pipelines; }; #endif // hifi_DebugDeferredBuffer_h \ No newline at end of file From acb9e2774e65494d151ddd1dd91a84722a150d14 Mon Sep 17 00:00:00 2001 From: Atlante45 Date: Fri, 4 Dec 2015 20:28:38 -0800 Subject: [PATCH 2/3] Basic implementation of debug zone resizing --- examples/utilities/tools/renderEngineDebug.js | 51 +++++++++++++++++-- interface/src/Application.cpp | 3 +- .../render-utils/src/DebugDeferredBuffer.cpp | 14 ++--- .../render-utils/src/RenderDeferredTask.cpp | 2 +- .../render-utils/src/RenderDeferredTask.h | 2 +- .../src/debug_deferred_buffer.slf | 4 +- libraries/render/src/render/Engine.h | 3 +- .../src/SceneScriptingInterface.h | 9 ++-- 8 files changed, 70 insertions(+), 18 deletions(-) diff --git a/examples/utilities/tools/renderEngineDebug.js b/examples/utilities/tools/renderEngineDebug.js index ab266620ab..c37c104498 100755 --- a/examples/utilities/tools/renderEngineDebug.js +++ b/examples/utilities/tools/renderEngineDebug.js @@ -13,6 +13,10 @@ Script.include("cookies.js"); var MENU = "Developer>Render>Debug Deferred Buffer"; var ACTIONS = ["Off", "Diffuse", "Alpha", "Specular", "Roughness", "Normal", "Depth", "Lighting", "Custom"]; +Number.prototype.clamp = function(min, max) { + return Math.min(Math.max(this, min), max); +}; + var panel = new Panel(10, 100); function CounterWidget(parentPanel, name, feedGetter, drawGetter, capSetter, capGetter) { @@ -64,10 +68,23 @@ var overlaysCounter = new CounterWidget(panel, "Overlays", function () { return Scene.getEngineMaxDrawnOverlay3DItems(); } ); +var resizing = false; +Scene.setEngineDeferredDebugSize({ x: 0.0, y: -1.0, z: 1.0, w: 1.0 }); // Reset to default size + +function setEngineDeferredDebugSize(eventX) { + var scaledX = (2.0 * (eventX / Window.innerWidth) - 1.0).clamp(-1.0, 1.0); + Scene.setEngineDeferredDebugSize({ x: scaledX, y: -1.0, z: 1.0, w: 1.0 }); +} +function shouldStartResizing(eventX) { + var x = Math.abs(eventX - Window.innerWidth * (1.0 + Scene.getEngineDeferredDebugSize().x) / 2.0); + var mode = Scene.getEngineDeferredDebugMode(); + return mode !== -1 && x < 20; +} + function menuItemEvent(menuItem) { var index = ACTIONS.indexOf(menuItem); if (index >= 0) { - Scene.setEngineDisplayDebugDeferredBuffer(index); + Scene.setEngineDeferredDebugMode(index - 1); print(menuItem); } } @@ -101,9 +118,33 @@ function updateCounters() { } Script.setInterval(updateCounters, tickTackPeriod); -Controller.mouseMoveEvent.connect(function panelMouseMoveEvent(event) { return panel.mouseMoveEvent(event); }); -Controller.mousePressEvent.connect( function panelMousePressEvent(event) { return panel.mousePressEvent(event); }); -Controller.mouseReleaseEvent.connect(function(event) { return panel.mouseReleaseEvent(event); }); +function mouseMoveEvent(event) { + if (resizing) { + setEngineDeferredDebugSize(event.x); + } else { + panel.mouseMoveEvent(event); + } +} + +function mousePressEvent(event) { + if (shouldStartResizing(event.x)) { + resizing = true; + } else { + panel.mousePressEvent(event); + } +} + +function mouseReleaseEvent(event) { + if (resizing) { + resizing = false; + } else { + panel.mouseReleaseEvent(event); + } +} + +Controller.mouseMoveEvent.connect(mouseMoveEvent); +Controller.mousePressEvent.connect(mousePressEvent); +Controller.mouseReleaseEvent.connect(mouseReleaseEvent); Menu.menuItemEvent.connect(menuItemEvent); Menu.addActionGroup(MENU, ACTIONS, ACTIONS[0]); @@ -111,5 +152,7 @@ Menu.addActionGroup(MENU, ACTIONS, ACTIONS[0]); function scriptEnding() { panel.destroy(); Menu.removeActionGroup(MENU); + Scene.setEngineDeferredDebugMode(-1); + Scene.setEngineDeferredDebugSize({ x: 0.0, y: -1.0, z: 1.0, w: 1.0 }); // Reset to default size } Script.scriptEnding.connect(scriptEnding); diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index d9fea20ad5..78724862de 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -3622,7 +3622,8 @@ void Application::displaySide(RenderArgs* renderArgs, Camera& theCamera, bool se renderContext._maxDrawnTransparentItems = sceneInterface->getEngineMaxDrawnTransparentItems(); renderContext._maxDrawnOverlay3DItems = sceneInterface->getEngineMaxDrawnOverlay3DItems(); - renderContext._drawDebugDeferredBuffer = sceneInterface->doEngineDisplayDebugDeferredBuffer(); + renderContext._deferredDebugMode = sceneInterface->getEngineDeferredDebugMode(); + renderContext._deferredDebugSize = sceneInterface->getEngineDeferredDebugSize(); renderContext._drawItemStatus = sceneInterface->doEngineDisplayItemStatus(); if (Menu::getInstance()->isOptionChecked(MenuOption::PhysicsShowOwned)) { diff --git a/libraries/render-utils/src/DebugDeferredBuffer.cpp b/libraries/render-utils/src/DebugDeferredBuffer.cpp index d3879dacf3..842729144d 100644 --- a/libraries/render-utils/src/DebugDeferredBuffer.cpp +++ b/libraries/render-utils/src/DebugDeferredBuffer.cpp @@ -43,7 +43,8 @@ static const std::array SLOT_NAMES {{ "lightingMap" }}; -static const std::string PLACEHOLDER { "DEBUG_PLACEHOLDER" }; +static const std::string COMPUTE_PLACEHOLDER { "/*COMPUTE_PLACEHOLDER*/" }; // required +static const std::string FUNCTIONS_PLACEHOLDER { "/*FUNCTIONS_PLACEHOLDER*/" }; // optional std::string DebugDeferredBuffer::getCode(Modes mode) { switch (mode) { @@ -86,7 +87,8 @@ std::string DebugDeferredBuffer::getCode(Modes mode) { const gpu::PipelinePointer& DebugDeferredBuffer::getPipeline(Modes mode) { if (!_pipelines[mode]) { std::string fragmentShader = debug_deferred_buffer_frag; - fragmentShader.replace(fragmentShader.find(PLACEHOLDER), PLACEHOLDER.size(), getCode(mode)); + fragmentShader.replace(fragmentShader.find(COMPUTE_PLACEHOLDER), COMPUTE_PLACEHOLDER.size(), + getCode(mode)); auto vs = gpu::ShaderPointer(gpu::Shader::createVertex({ debug_deferred_buffer_vert })); auto ps = gpu::ShaderPointer(gpu::Shader::createPixel(fragmentShader)); @@ -122,7 +124,7 @@ void DebugDeferredBuffer::run(const SceneContextPointer& sceneContext, const Ren batch.setViewTransform(viewMat); batch.setModelTransform(Transform()); - batch.setPipeline(getPipeline(Modes(renderContext->_drawDebugDeferredBuffer - 1))); + batch.setPipeline(getPipeline(Modes(renderContext->_deferredDebugMode))); batch.setResourceTexture(Diffuse, framebufferCache->getDeferredColorTexture()); batch.setResourceTexture(Normal, framebufferCache->getDeferredNormalTexture()); @@ -130,9 +132,9 @@ void DebugDeferredBuffer::run(const SceneContextPointer& sceneContext, const Ren batch.setResourceTexture(Depth, framebufferCache->getPrimaryDepthTexture()); batch.setResourceTexture(Lighting, framebufferCache->getLightingTexture()); - 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); + glm::vec4 color(1.0f, 1.0f, 1.0f, 1.0f); + glm::vec2 bottomLeft(renderContext->_deferredDebugSize.x, renderContext->_deferredDebugSize.y); + glm::vec2 topRight(renderContext->_deferredDebugSize.z, renderContext->_deferredDebugSize.w); 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 1272e1a131..f04394750b 100755 --- a/libraries/render-utils/src/RenderDeferredTask.cpp +++ b/libraries/render-utils/src/RenderDeferredTask.cpp @@ -157,7 +157,7 @@ void RenderDeferredTask::run(const SceneContextPointer& sceneContext, const Rend } // Make sure we turn the deferred buffer debug on/off - setDrawDebugDeferredBuffer(renderContext->_drawDebugDeferredBuffer); + setDrawDebugDeferredBuffer(renderContext->_deferredDebugMode); // Make sure we turn the displayItemStatus on/off setDrawItemStatus(renderContext->_drawItemStatus); diff --git a/libraries/render-utils/src/RenderDeferredTask.h b/libraries/render-utils/src/RenderDeferredTask.h index 09a2761926..f128d186cc 100755 --- a/libraries/render-utils/src/RenderDeferredTask.h +++ b/libraries/render-utils/src/RenderDeferredTask.h @@ -100,7 +100,7 @@ public: void setDrawDebugDeferredBuffer(int draw) { if (_drawDebugDeferredBufferIndex >= 0) { - _jobs[_drawDebugDeferredBufferIndex].setEnabled(draw > 0); + _jobs[_drawDebugDeferredBufferIndex].setEnabled(draw >= 0); } } bool doDrawDebugDeferredBuffer() const { if (_drawDebugDeferredBufferIndex >= 0) { return _jobs[_drawDebugDeferredBufferIndex].isEnabled(); } else { return false; } } diff --git a/libraries/render-utils/src/debug_deferred_buffer.slf b/libraries/render-utils/src/debug_deferred_buffer.slf index 55632eb337..d8ff6e71a9 100644 --- a/libraries/render-utils/src/debug_deferred_buffer.slf +++ b/libraries/render-utils/src/debug_deferred_buffer.slf @@ -17,8 +17,10 @@ in vec2 uv; out vec4 outFragColor; +/*FUNCTIONS_PLACEHOLDER*/ + vec4 getFragmentColor() { - DEBUG_PLACEHOLDER + /*COMPUTE_PLACEHOLDER*/ } void main(void) { diff --git a/libraries/render/src/render/Engine.h b/libraries/render/src/render/Engine.h index ab56d68291..26bd6f2154 100644 --- a/libraries/render/src/render/Engine.h +++ b/libraries/render/src/render/Engine.h @@ -53,7 +53,8 @@ public: int _numDrawnOverlay3DItems = 0; int _maxDrawnOverlay3DItems = -1; - int _drawDebugDeferredBuffer = 0; + int _deferredDebugMode = -1; + glm::vec4 _deferredDebugSize { 0.0f, -1.0f, 1.0f, 1.0f }; int _drawItemStatus = 0; bool _drawHitEffect = false; diff --git a/libraries/script-engine/src/SceneScriptingInterface.h b/libraries/script-engine/src/SceneScriptingInterface.h index 583f416576..78261dfdc7 100644 --- a/libraries/script-engine/src/SceneScriptingInterface.h +++ b/libraries/script-engine/src/SceneScriptingInterface.h @@ -107,8 +107,10 @@ public: 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 setEngineDeferredDebugMode(int mode) { _deferredDebugMode = mode; } + Q_INVOKABLE int getEngineDeferredDebugMode() { return _deferredDebugMode; } + Q_INVOKABLE void setEngineDeferredDebugSize(glm::vec4 size) { _deferredDebugSize = size; } + Q_INVOKABLE glm::vec4 getEngineDeferredDebugSize() { return _deferredDebugSize; } Q_INVOKABLE void setEngineDisplayItemStatus(int display) { _drawItemStatus = display; } Q_INVOKABLE int doEngineDisplayItemStatus() { return _drawItemStatus; } @@ -146,7 +148,8 @@ protected: int _maxDrawnTransparentItems = -1; int _maxDrawnOverlay3DItems = -1; - int _drawDebugDeferredBuffer = 0; + int _deferredDebugMode = -1; + glm::vec4 _deferredDebugSize { 0.0f, -1.0f, 1.0f, 1.0f }; int _drawItemStatus = 0; bool _drawHitEffect = false; From 0603ead972cf4823d8a45bc32b1f0a39ac77bca1 Mon Sep 17 00:00:00 2001 From: Atlante45 Date: Fri, 4 Dec 2015 20:59:21 -0800 Subject: [PATCH 3/3] Have panels collapsed by default --- examples/utilities/tools/renderEngineDebug.js | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/examples/utilities/tools/renderEngineDebug.js b/examples/utilities/tools/renderEngineDebug.js index c37c104498..60686912e8 100755 --- a/examples/utilities/tools/renderEngineDebug.js +++ b/examples/utilities/tools/renderEngineDebug.js @@ -156,3 +156,9 @@ function scriptEnding() { Scene.setEngineDeferredDebugSize({ x: 0.0, y: -1.0, z: 1.0, w: 1.0 }); // Reset to default size } Script.scriptEnding.connect(scriptEnding); + + +// Collapse items +panel.mousePressEvent({ x: panel.x, y: panel.items["Overlays"].y}); +panel.mousePressEvent({ x: panel.x, y: panel.items["Transparents"].y}); +panel.mousePressEvent({ x: panel.x, y: panel.items["Opaques"].y});