From b45b1cc513ca9ed43a07de1bcfbe4b48d7e0f29c Mon Sep 17 00:00:00 2001 From: Atlante45 Date: Fri, 4 Dec 2015 17:43:00 -0800 Subject: [PATCH] More work on live g-buffer debug --- examples/utilities/tools/renderEngineDebug.js | 20 +++++++--- interface/src/Menu.cpp | 20 ++++++++++ interface/src/Menu.h | 2 + .../src/scripting/MenuScriptingInterface.cpp | 13 +++++++ .../src/scripting/MenuScriptingInterface.h | 4 ++ .../render-utils/src/DebugDeferredBuffer.cpp | 38 +++++++++++++++---- .../render-utils/src/DebugDeferredBuffer.h | 14 ++++++- libraries/render-utils/src/DeferredBuffer.slh | 3 ++ .../src/debug_deferred_buffer.slf | 6 ++- 9 files changed, 103 insertions(+), 17 deletions(-) diff --git a/examples/utilities/tools/renderEngineDebug.js b/examples/utilities/tools/renderEngineDebug.js index 940eeda02d..b300ff2ea8 100755 --- a/examples/utilities/tools/renderEngineDebug.js +++ b/examples/utilities/tools/renderEngineDebug.js @@ -10,6 +10,9 @@ Script.include("cookies.js"); +var MENU = "Developer>Render>Debug Deferred Buffer"; +var ACTIONS = ["Off", "Diffuse", "Normal", "Specular", "Depth", "Lighting"]; + var panel = new Panel(10, 100); function CounterWidget(parentPanel, name, feedGetter, drawGetter, capSetter, capGetter) { @@ -61,17 +64,18 @@ var overlaysCounter = new CounterWidget(panel, "Overlays", function () { return Scene.getEngineMaxDrawnOverlay3DItems(); } ); +function menuItemEvent(menuItem) { + var index = ACTIONS.indexOf(menuItem); + if (index >= 0) { + Scene.setEngineDisplayDebugDeferredBuffer(index); + print(menuItem); + } +} // see libraries/render/src/render/Engine.h 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 : @@ -101,7 +105,11 @@ Controller.mouseMoveEvent.connect(function panelMouseMoveEvent(event) { return p Controller.mousePressEvent.connect( function panelMousePressEvent(event) { return panel.mousePressEvent(event); }); Controller.mouseReleaseEvent.connect(function(event) { return panel.mouseReleaseEvent(event); }); +Menu.menuItemEvent.connect(menuItemEvent); +Menu.addActionGroup(MENU, ACTIONS, ACTIONS[0]); + function scriptEnding() { panel.destroy(); + Menu.removeActionGroup(MENU); } Script.scriptEnding.connect(scriptEnding); diff --git a/interface/src/Menu.cpp b/interface/src/Menu.cpp index 86b3987af1..66c1824176 100644 --- a/interface/src/Menu.cpp +++ b/interface/src/Menu.cpp @@ -985,6 +985,26 @@ bool Menu::menuItemExists(const QString& menu, const QString& menuitem) { return false; }; +void Menu::addActionGroup(const QString& groupName, const QStringList& actionList, const QString& selected) { + auto menu = addMenu(groupName); + + QActionGroup* actionGroup = new QActionGroup(menu); + actionGroup->setExclusive(true); + + auto menuScriptingInterface = MenuScriptingInterface::getInstance(); + for (auto action : actionList) { + auto item = addCheckableActionToQMenuAndActionHash(menu, action, 0, action == selected, + menuScriptingInterface, + SLOT(menuItemTriggered())); + actionGroup->addAction(item); + } + + QMenuBar::repaint(); +} + +void Menu::removeActionGroup(const QString& groupName) { + removeMenu(groupName); +} MenuWrapper::MenuWrapper(QMenu* menu) : _realMenu(menu) { VrMenu::executeOrQueue([=](VrMenu* vrMenu) { diff --git a/interface/src/Menu.h b/interface/src/Menu.h index 3ff0b149f4..49759c8beb 100644 --- a/interface/src/Menu.h +++ b/interface/src/Menu.h @@ -100,6 +100,8 @@ public slots: void addMenuItem(const MenuItemProperties& properties); void removeMenuItem(const QString& menuName, const QString& menuitem); bool menuItemExists(const QString& menuName, const QString& menuitem); + void addActionGroup(const QString& groupName, const QStringList& actionList, const QString& selected = QString()); + void removeActionGroup(const QString& groupName); bool isOptionChecked(const QString& menuOption) const; void setIsOptionChecked(const QString& menuOption, bool isChecked); diff --git a/interface/src/scripting/MenuScriptingInterface.cpp b/interface/src/scripting/MenuScriptingInterface.cpp index ff7784b9ae..087d391daa 100644 --- a/interface/src/scripting/MenuScriptingInterface.cpp +++ b/interface/src/scripting/MenuScriptingInterface.cpp @@ -84,6 +84,19 @@ bool MenuScriptingInterface::menuItemExists(const QString& menu, const QString& return result; } +void MenuScriptingInterface::addActionGroup(const QString& groupName, const QStringList& actionList, + const QString& selected) { + QMetaObject::invokeMethod(Menu::getInstance(), "addActionGroup", + Q_ARG(const QString&, groupName), + Q_ARG(const QStringList&, actionList), + Q_ARG(const QString&, selected)); +} + +void MenuScriptingInterface::removeActionGroup(const QString& groupName) { + QMetaObject::invokeMethod(Menu::getInstance(), "removeActionGroup", + Q_ARG(const QString&, groupName)); +} + bool MenuScriptingInterface::isOptionChecked(const QString& menuOption) { bool result; QMetaObject::invokeMethod(Menu::getInstance(), "isOptionChecked", Qt::BlockingQueuedConnection, diff --git a/interface/src/scripting/MenuScriptingInterface.h b/interface/src/scripting/MenuScriptingInterface.h index 5c01318a38..51399c2fa5 100644 --- a/interface/src/scripting/MenuScriptingInterface.h +++ b/interface/src/scripting/MenuScriptingInterface.h @@ -42,6 +42,10 @@ public slots: void removeMenuItem(const QString& menuName, const QString& menuitem); bool menuItemExists(const QString& menuName, const QString& menuitem); + void addActionGroup(const QString& groupName, const QStringList& actionList, + const QString& selected = QString()); + void removeActionGroup(const QString& groupName); + bool isOptionChecked(const QString& menuOption); void setIsOptionChecked(const QString& menuOption, bool isChecked); diff --git a/libraries/render-utils/src/DebugDeferredBuffer.cpp b/libraries/render-utils/src/DebugDeferredBuffer.cpp index 5510d9c3fc..3b4e3d2bd5 100644 --- a/libraries/render-utils/src/DebugDeferredBuffer.cpp +++ b/libraries/render-utils/src/DebugDeferredBuffer.cpp @@ -24,20 +24,38 @@ using namespace render; -const gpu::PipelinePointer& DebugDeferredBuffer::getPipeline() { - if (!_pipeline) { +static const std::string PLACEHOLDER { "DEBUG_PLACEHOLDER" }; +static const std::array SLOT_NAMES {{ + "diffuseMap", + "normalMap", + "specularMap", + "depthMap", + "lightingMap" +}}; + +std::string getCode(int slot) { + return std::string("return texture(").append(SLOT_NAMES[slot]).append(", uv);"); +} + +const gpu::PipelinePointer& DebugDeferredBuffer::getPipeline(int slot) { + if (!_pipelines[slot]) { + std::string fragmentShader = debug_deferred_buffer_frag; + fragmentShader.replace(fragmentShader.find(PLACEHOLDER), PLACEHOLDER.size(), getCode(slot)); + auto vs = gpu::ShaderPointer(gpu::Shader::createVertex({ debug_deferred_buffer_vert })); - auto ps = gpu::ShaderPointer(gpu::Shader::createPixel({ debug_deferred_buffer_frag })); + auto ps = gpu::ShaderPointer(gpu::Shader::createPixel(fragmentShader)); auto program = gpu::ShaderPointer(gpu::Shader::createProgram(vs, ps)); - gpu::Shader::BindingSet slotBindings; + for (int slot = 0; slot < NUM_SLOTS; ++slot) { + slotBindings.insert(gpu::Shader::Binding(SLOT_NAMES[slot], slot)); + } gpu::Shader::makeProgram(*program, slotBindings); // Good to go add the brand new pipeline - _pipeline = gpu::Pipeline::create(program, std::make_shared()); + _pipelines[slot] = gpu::Pipeline::create(program, std::make_shared()); } - return _pipeline; + return _pipelines[slot]; } @@ -58,9 +76,13 @@ void DebugDeferredBuffer::run(const SceneContextPointer& sceneContext, const Ren batch.setViewTransform(viewMat); batch.setModelTransform(Transform()); - batch.setPipeline(getPipeline()); + batch.setPipeline(getPipeline((DebugDeferredBufferSlot)(renderContext->_drawDebugDeferredBuffer - 1))); - batch.setResourceTexture(0, framebufferCache->getDeferredColorTexture()); + batch.setResourceTexture(Diffuse, framebufferCache->getDeferredColorTexture()); + batch.setResourceTexture(Normal, framebufferCache->getDeferredNormalTexture()); + batch.setResourceTexture(Specular, framebufferCache->getDeferredSpecularTexture()); + 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); diff --git a/libraries/render-utils/src/DebugDeferredBuffer.h b/libraries/render-utils/src/DebugDeferredBuffer.h index 827a3271f0..95865cc12a 100644 --- a/libraries/render-utils/src/DebugDeferredBuffer.h +++ b/libraries/render-utils/src/DebugDeferredBuffer.h @@ -18,12 +18,22 @@ 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(); + const gpu::PipelinePointer& getPipeline(int slot); - gpu::PipelinePointer _pipeline; + std::array _pipelines; }; #endif // hifi_DebugDeferredBuffer_h \ No newline at end of file diff --git a/libraries/render-utils/src/DeferredBuffer.slh b/libraries/render-utils/src/DeferredBuffer.slh index 275966534a..18606f2525 100755 --- a/libraries/render-utils/src/DeferredBuffer.slh +++ b/libraries/render-utils/src/DeferredBuffer.slh @@ -24,6 +24,9 @@ uniform sampler2D specularMap; // the depth texture uniform sampler2D depthMap; +// the lighting texture +uniform sampler2D lightingMap; + struct DeferredTransform { mat4 projection; diff --git a/libraries/render-utils/src/debug_deferred_buffer.slf b/libraries/render-utils/src/debug_deferred_buffer.slf index efb1c25628..55632eb337 100644 --- a/libraries/render-utils/src/debug_deferred_buffer.slf +++ b/libraries/render-utils/src/debug_deferred_buffer.slf @@ -17,6 +17,10 @@ in vec2 uv; out vec4 outFragColor; +vec4 getFragmentColor() { + DEBUG_PLACEHOLDER +} + void main(void) { - outFragColor = texture(diffuseMap, uv); + outFragColor = getFragmentColor(); } \ No newline at end of file