From b339aa683a1447ffdd341177c19f4e1133f36954 Mon Sep 17 00:00:00 2001 From: Sam Gateau Date: Wed, 3 Jun 2015 11:25:45 -0700 Subject: [PATCH] adding caps for opaque and transparent draw jobs and the ui in js so we can debug the rendered items --- examples/utilities/tools/renderEngineDebug.js | 12 +++++++++ interface/src/Application.cpp | 3 +++ libraries/render/src/render/DrawTask.cpp | 26 ++++++++++++++----- libraries/render/src/render/DrawTask.h | 2 +- libraries/render/src/render/Engine.h | 2 ++ .../src/SceneScriptingInterface.h | 8 ++++++ 6 files changed, 45 insertions(+), 8 deletions(-) diff --git a/examples/utilities/tools/renderEngineDebug.js b/examples/utilities/tools/renderEngineDebug.js index 9b4a60977e..3893b8b90e 100755 --- a/examples/utilities/tools/renderEngineDebug.js +++ b/examples/utilities/tools/renderEngineDebug.js @@ -42,6 +42,12 @@ panel.newSlider("Num Drawn Opaques", 0, 1000, function(value) { return (value); } ); +panel.newSlider("Max Drawn Opaques", -1, 1000, + function(value) { Scene.setEngineMaxDrawnOpaqueItems(value); }, + function() { return Scene.getEngineMaxDrawnOpaqueItems(); }, + function(value) { return (value); } +); + panel.newCheckbox("Enable Cull Transparent", function(value) { Scene.setEngineCullTransparent((value != 0)); }, function() { return Scene.doEngineCullTransparent(); }, @@ -72,6 +78,12 @@ panel.newSlider("Num Drawn Transparents", 0, 1000, function(value) { return (value); } ); +panel.newSlider("Max Drawn Transparents", -1, 1000, + function(value) { Scene.setEngineMaxDrawnTransparentItems(value); }, + function() { return Scene.getEngineMaxDrawnTransparentItems(); }, + function(value) { return (value); } +); + var tickTackPeriod = 500; function updateCounters() { diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index 76feb77076..92fbd856bf 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -3505,6 +3505,9 @@ void Application::displaySide(RenderArgs* renderArgs, Camera& theCamera, bool se renderContext._sortTransparent = sceneInterface->doEngineSortTransparent(); renderContext._renderTransparent = sceneInterface->doEngineRenderTransparent(); + renderContext._maxDrawnOpaqueItems = sceneInterface->getEngineMaxDrawnOpaqueItems(); + renderContext._maxDrawnTransparentItems = sceneInterface->getEngineMaxDrawnTransparentItems(); + renderArgs->_shouldRender = LODManager::shouldRender; renderContext.args = renderArgs; diff --git a/libraries/render/src/render/DrawTask.cpp b/libraries/render/src/render/DrawTask.cpp index dd57a71fcf..71cc86e198 100755 --- a/libraries/render/src/render/DrawTask.cpp +++ b/libraries/render/src/render/DrawTask.cpp @@ -154,14 +154,26 @@ void render::depthSortItems(const SceneContextPointer& sceneContext, const Rende } } -void render::renderItems(const SceneContextPointer& sceneContext, const RenderContextPointer& renderContext, const ItemIDs& inItems) { +void render::renderItems(const SceneContextPointer& sceneContext, const RenderContextPointer& renderContext, const ItemIDs& inItems, int maxDrawnItems) { PerformanceTimer perfTimer("renderItems"); auto& scene = sceneContext->_scene; RenderArgs* args = renderContext->args; // render - for (auto id : inItems) { - auto item = scene->getItem(id); - item.render(args); + if ((maxDrawnItems < 0) || (maxDrawnItems > inItems.size()) { + for (auto id : inItems) { + auto item = scene->getItem(id); + item.render(args); + } + } else { + int numItems = 0; + for (auto id : inItems) { + auto item = scene->getItem(id); + item.render(args); + numItems++; + if (numItems >= maxDrawnItems) { + return; + } + } } } @@ -262,7 +274,7 @@ template <> void render::jobRun(const DrawOpaque& job, const SceneContextPointer batch._glDrawBuffers(bufferCount, buffers); } - renderItems(sceneContext, renderContext, renderedItems); + renderItems(sceneContext, renderContext, renderedItems, renderContext->_maxDrawnOpaqueItems); args->_context->render((*args->_batch)); args->_batch = nullptr; @@ -329,7 +341,7 @@ template <> void render::jobRun(const DrawTransparent& job, const SceneContextPo args->_alphaThreshold = MOSTLY_OPAQUE_THRESHOLD; } - renderItems(sceneContext, renderContext, renderedItems); + renderItems(sceneContext, renderContext, renderedItems, renderContext->_maxDrawnTransparentItems); { GLenum buffers[3]; @@ -340,7 +352,7 @@ template <> void render::jobRun(const DrawTransparent& job, const SceneContextPo } - renderItems(sceneContext, renderContext, renderedItems); + renderItems(sceneContext, renderContext, renderedItems, renderContext->_maxDrawnTransparentItems); args->_context->render((*args->_batch)); args->_batch = nullptr; diff --git a/libraries/render/src/render/DrawTask.h b/libraries/render/src/render/DrawTask.h index 9572a68bf0..9f8efa2869 100755 --- a/libraries/render/src/render/DrawTask.h +++ b/libraries/render/src/render/DrawTask.h @@ -59,7 +59,7 @@ typedef std::vector Jobs; void cullItems(const SceneContextPointer& sceneContext, const RenderContextPointer& renderContext, const ItemIDs& inItems, ItemIDs& outITems); void depthSortItems(const SceneContextPointer& sceneContext, const RenderContextPointer& renderContext, bool frontToBack, const ItemIDs& inItems, ItemIDs& outITems); -void renderItems(const SceneContextPointer& sceneContext, const RenderContextPointer& renderContext, const ItemIDs& inItems); +void renderItems(const SceneContextPointer& sceneContext, const RenderContextPointer& renderContext, const ItemIDs& inItems, int maxDrawnItems = -1); class DrawOpaque { diff --git a/libraries/render/src/render/Engine.h b/libraries/render/src/render/Engine.h index dbd193af29..121d6458e9 100644 --- a/libraries/render/src/render/Engine.h +++ b/libraries/render/src/render/Engine.h @@ -39,9 +39,11 @@ public: int _numFeedOpaqueItems = 0; int _numDrawnOpaqueItems = 0; + int _maxDrawnOpaqueItems = -1; int _numFeedTransparentItems = 0; int _numDrawnTransparentItems = 0; + int _maxDrawnTransparentItems = -1; RenderContext() {} }; diff --git a/libraries/script-engine/src/SceneScriptingInterface.h b/libraries/script-engine/src/SceneScriptingInterface.h index b6dc4110c0..543f55a971 100644 --- a/libraries/script-engine/src/SceneScriptingInterface.h +++ b/libraries/script-engine/src/SceneScriptingInterface.h @@ -96,6 +96,10 @@ public: void setEngineFeedTransparentItems(int count) { _numFeedTransparentItems = count; } Q_INVOKABLE int getEngineNumFeedTransparentItems() { return _numFeedTransparentItems; } + Q_INVOKABLE void setEngineMaxDrawnOpaqueItems(int count) { _maxDrawnOpaqueItems = count; } + Q_INVOKABLE int getEngineMaxDrawnOpaqueItems() { return _maxDrawnOpaqueItems; } + Q_INVOKABLE void setEngineMaxDrawnTransparentItems(int count) { _maxDrawnTransparentItems = count; } + Q_INVOKABLE int getEngineMaxDrawnTransparentItems() { return _maxDrawnTransparentItems; } signals: void shouldRenderAvatarsChanged(bool shouldRenderAvatars); @@ -120,6 +124,10 @@ protected: int _numDrawnOpaqueItems = 0; int _numFeedTransparentItems = 0; int _numDrawnTransparentItems = 0; + + int _maxDrawnOpaqueItems = -1; + int _maxDrawnTransparentItems = -1; + }; #endif // hifi_SceneScriptingInterface_h