From e8b11f119899732065c4e5a15a8f48d781815367 Mon Sep 17 00:00:00 2001 From: Sam Gateau Date: Wed, 1 Jul 2015 17:27:41 -0700 Subject: [PATCH] Exposing the display Item Status to js to turn it on/off --- examples/utilities/tools/renderEngineDebug.js | 6 ++++ interface/src/Application.cpp | 2 ++ .../render-utils/src/RenderDeferredTask.cpp | 7 +++++ .../render-utils/src/RenderDeferredTask.h | 5 +++ libraries/render/src/render/DrawStatus.cpp | 7 +---- libraries/render/src/render/DrawTask.h | 31 ++++++++++++++++--- libraries/render/src/render/Engine.h | 2 ++ libraries/render/src/render/Scene.cpp | 9 ++++++ libraries/render/src/render/Scene.h | 15 +++------ .../src/SceneScriptingInterface.h | 6 ++++ 10 files changed, 68 insertions(+), 22 deletions(-) diff --git a/examples/utilities/tools/renderEngineDebug.js b/examples/utilities/tools/renderEngineDebug.js index 8185a24078..d337290927 100755 --- a/examples/utilities/tools/renderEngineDebug.js +++ b/examples/utilities/tools/renderEngineDebug.js @@ -66,6 +66,12 @@ panel.newSlider("Max Drawn Overlay3Ds", -1, 100, function(value) { return (value); } ); +panel.newCheckbox("Display status", + function(value) { Scene.setEngineDisplayItemStatus(value); }, + function() { return Scene.doEngineDisplayItemStatus(); }, + function(value) { return (value); } +); + var tickTackPeriod = 500; function updateCounters() { diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index 2e2722aec2..95b9998778 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -3526,6 +3526,8 @@ void Application::displaySide(RenderArgs* renderArgs, Camera& theCamera, bool se renderContext._maxDrawnTransparentItems = sceneInterface->getEngineMaxDrawnTransparentItems(); renderContext._maxDrawnOverlay3DItems = sceneInterface->getEngineMaxDrawnOverlay3DItems(); + renderContext._drawItemStatus = sceneInterface->doEngineDisplayItemStatus(); + renderArgs->_shouldRender = LODManager::shouldRender; renderContext.args = renderArgs; diff --git a/libraries/render-utils/src/RenderDeferredTask.cpp b/libraries/render-utils/src/RenderDeferredTask.cpp index db2b657126..1012624134 100755 --- a/libraries/render-utils/src/RenderDeferredTask.cpp +++ b/libraries/render-utils/src/RenderDeferredTask.cpp @@ -68,7 +68,11 @@ RenderDeferredTask::RenderDeferredTask() : Task() { _jobs.push_back(Job(new CullItems::JobModel("CullTransparent", _jobs.back().getOutput()))); _jobs.push_back(Job(new DepthSortItems::JobModel("DepthSortTransparent", _jobs.back().getOutput(), DepthSortItems(false)))); _jobs.push_back(Job(new DrawTransparentDeferred::JobModel("TransparentDeferred", _jobs.back().getOutput()))); + _jobs.push_back(Job(new render::DrawStatus::JobModel("DrawStatus", renderedOpaques))); + _jobs.back().setEnabled(false); + _drawStatusJobIndex = _jobs.size() - 1; + _jobs.push_back(Job(new DrawOverlay3D::JobModel("DrawOverlay3D"))); _jobs.push_back(Job(new ResetGLState::JobModel())); } @@ -89,6 +93,9 @@ void RenderDeferredTask::run(const SceneContextPointer& sceneContext, const Rend return; } + // Make sure we turn the displayItemStatus on/off + setDrawItemStatus(renderContext->_drawItemStatus); + renderContext->args->_context->syncCache(); for (auto job : _jobs) { diff --git a/libraries/render-utils/src/RenderDeferredTask.h b/libraries/render-utils/src/RenderDeferredTask.h index 2f65c5ade6..3d11e97634 100755 --- a/libraries/render-utils/src/RenderDeferredTask.h +++ b/libraries/render-utils/src/RenderDeferredTask.h @@ -70,6 +70,11 @@ public: render::Jobs _jobs; + int _drawStatusJobIndex = -1; + + void setDrawItemStatus(bool draw) { if (_drawStatusJobIndex >= 0) { _jobs[_drawStatusJobIndex].setEnabled(draw); } } + bool doDrawItemStatus() const { if (_drawStatusJobIndex >= 0) { return _jobs[_drawStatusJobIndex].isEnabled(); } else { return false; } } + virtual void run(const render::SceneContextPointer& sceneContext, const render::RenderContextPointer& renderContext); }; diff --git a/libraries/render/src/render/DrawStatus.cpp b/libraries/render/src/render/DrawStatus.cpp index f61a4e56c3..4961e744d9 100644 --- a/libraries/render/src/render/DrawStatus.cpp +++ b/libraries/render/src/render/DrawStatus.cpp @@ -116,12 +116,7 @@ void DrawStatus::run(const SceneContextPointer& sceneContext, const RenderContex (*itemAABox).setBox(item.bounds.getCorner(), 0.1f); } auto& itemScene = scene->getItem(item.id); - auto& status = itemScene.getStatus(); - if (status) { - status->getValue((*itemStatus)); - } else { - (*itemStatus) = glm::vec4(-1.0f); - } + (*itemStatus) = itemScene.getStatusValues(); nbItems++; itemAABox++; diff --git a/libraries/render/src/render/DrawTask.h b/libraries/render/src/render/DrawTask.h index 8a4d424005..a0139732f6 100755 --- a/libraries/render/src/render/DrawTask.h +++ b/libraries/render/src/render/DrawTask.h @@ -77,6 +77,9 @@ public: Job(const Job& other) : _concept(other._concept) {} ~Job(); + bool isEnabled() const { return _concept->isEnabled(); } + void setEnabled(bool isEnabled) { _concept->setEnabled(isEnabled); } + const std::string& getName() const { return _concept->getName(); } const Varying getInput() const { return _concept->getInput(); } const Varying getOutput() const { return _concept->getOutput(); } @@ -92,6 +95,7 @@ public: class Concept { std::string _name; + bool _isEnabled = true; public: Concept() : _name() {} Concept(const std::string& name) : _name(name) {} @@ -99,7 +103,10 @@ public: void setName(const std::string& name) { _name = name; } const std::string& getName() const { return _name; } - + + bool isEnabled() const { return _isEnabled; } + void setEnabled(bool isEnabled) { _isEnabled = isEnabled; } + virtual const Varying getInput() const { return Varying(); } virtual const Varying getOutput() const { return Varying(); } virtual void run(const SceneContextPointer& sceneContext, const RenderContextPointer& renderContext) = 0; @@ -119,7 +126,11 @@ public: Model(Data data): _data(data) {} Model(Data data, const std::string& name): Concept(name), _data(data) {} - void run(const SceneContextPointer& sceneContext, const RenderContextPointer& renderContext) { jobRun(_data, sceneContext, renderContext); } + void run(const SceneContextPointer& sceneContext, const RenderContextPointer& renderContext) { + if (isEnabled()) { + jobRun(_data, sceneContext, renderContext); + } + } }; template class ModelI : public Concept { @@ -135,7 +146,11 @@ public: ModelI(const std::string& name, const Varying& input): Concept(name), _input(input) {} ModelI(const std::string& name, Data data): Concept(name), _data(data) {} - void run(const SceneContextPointer& sceneContext, const RenderContextPointer& renderContext) { jobRunI(_data, sceneContext, renderContext, _input.get()); } + void run(const SceneContextPointer& sceneContext, const RenderContextPointer& renderContext) { + if (isEnabled()) { + jobRunI(_data, sceneContext, renderContext, _input.get()); + } + } }; template class ModelO : public Concept { @@ -155,7 +170,9 @@ public: ModelO(const std::string& name, Data data): Concept(name), _data(data), _output(Output()) {} void run(const SceneContextPointer& sceneContext, const RenderContextPointer& renderContext) { - jobRunO(_data, sceneContext, renderContext, _output.edit()); + if (isEnabled()) { + jobRunO(_data, sceneContext, renderContext, _output.edit()); + } } }; @@ -177,7 +194,11 @@ public: void setInput(const Varying& input) { _input = input; } - void run(const SceneContextPointer& sceneContext, const RenderContextPointer& renderContext) { jobRunIO(_data, sceneContext, renderContext, _input.get(), _output.edit()); } + void run(const SceneContextPointer& sceneContext, const RenderContextPointer& renderContext) { + if (isEnabled()) { + jobRunIO(_data, sceneContext, renderContext, _input.get(), _output.edit()); + } + } }; std::shared_ptr _concept; diff --git a/libraries/render/src/render/Engine.h b/libraries/render/src/render/Engine.h index 054f7e5ce4..1c600b13d6 100644 --- a/libraries/render/src/render/Engine.h +++ b/libraries/render/src/render/Engine.h @@ -49,6 +49,8 @@ public: int _numDrawnOverlay3DItems = 0; int _maxDrawnOverlay3DItems = -1; + bool _drawItemStatus = false; + RenderContext() {} }; typedef std::shared_ptr RenderContextPointer; diff --git a/libraries/render/src/render/Scene.cpp b/libraries/render/src/render/Scene.cpp index 1d2e54541b..7de1e6650c 100644 --- a/libraries/render/src/render/Scene.cpp +++ b/libraries/render/src/render/Scene.cpp @@ -53,6 +53,15 @@ void ItemBucketMap::allocateStandardOpaqueTranparentBuckets() { (*this)[ItemFilter::Builder::transparentShape().withLayered()]; } +void Item::Status::getValues(glm::vec4& values) { + for (int i = 0; i < values.length(); i++) { + if (i < _values.size()) { + values[i] = _values[i]() / 256.0f; + } else { + values[i] = -1.0f; + } + } +} void Item::resetPayload(const PayloadPointer& payload) { if (!payload) { diff --git a/libraries/render/src/render/Scene.h b/libraries/render/src/render/Scene.h index 02bb03f285..9b459e0f3e 100644 --- a/libraries/render/src/render/Scene.h +++ b/libraries/render/src/render/Scene.h @@ -202,20 +202,12 @@ public: public: typedef unsigned char Value; typedef std::function Getter; + typedef std::vector Getters; - int _firstFrame; - std::vector _values; + Getters _values; void addGetter(Getter& getter) { _values.push_back(getter); } - void getValue(glm::vec4& value) { - for (unsigned int i = 0; i < value.length(); i++) { - if (i < _values.size()) { - value[i] = _values[i]() / 256.0f; - } else { - value[i] = 0.0f; - } - } - } + void getValues(glm::vec4& values); }; typedef std::shared_ptr StatusPointer; @@ -278,6 +270,7 @@ public: // Access the status const StatusPointer& getStatus() const { return _payload->getStatus(); } + glm::vec4 getStatusValues() const { glm::vec4 values(-1.f); auto& status = getStatus(); if (status) { status->getValues(values); }; return values; } protected: PayloadPointer _payload; diff --git a/libraries/script-engine/src/SceneScriptingInterface.h b/libraries/script-engine/src/SceneScriptingInterface.h index 8359aa58fa..674b452528 100644 --- a/libraries/script-engine/src/SceneScriptingInterface.h +++ b/libraries/script-engine/src/SceneScriptingInterface.h @@ -106,6 +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 setEngineDisplayItemStatus(bool display) { _drawItemStatus = display; } + Q_INVOKABLE bool doEngineDisplayItemStatus() { return _drawItemStatus; } + signals: void shouldRenderAvatarsChanged(bool shouldRenderAvatars); void shouldRenderEntitiesChanged(bool shouldRenderEntities); @@ -136,6 +140,8 @@ protected: int _maxDrawnTransparentItems = -1; int _maxDrawnOverlay3DItems = -1; + bool _drawItemStatus = false; + }; #endif // hifi_SceneScriptingInterface_h