diff --git a/interface/src/ui/Stats.cpp b/interface/src/ui/Stats.cpp index 069a8d6fd2..32df75c46d 100644 --- a/interface/src/ui/Stats.cpp +++ b/interface/src/ui/Stats.cpp @@ -475,8 +475,22 @@ void Stats::display( if (_expanded) { octreeStats.str(""); - octreeStats << " Mesh Parts Rendered Opaque: " << _renderDetails._opaqueMeshPartsRendered - << " / Translucent:" << _renderDetails._translucentMeshPartsRendered; + octreeStats << " Mesh Parts Rendered Opaque: " << _renderDetails._opaque._rendered + << " / Translucent:" << _renderDetails._translucent._rendered; + verticalOffset += STATS_PELS_PER_LINE; + drawText(horizontalOffset, verticalOffset, scale, rotation, font, (char*)octreeStats.str().c_str(), color); + + octreeStats.str(""); + octreeStats << " Opaque considered: " << _renderDetails._opaque._considered + << " / Out of view:" << _renderDetails._opaque._outOfView + << " / Too small:" << _renderDetails._opaque._tooSmall; + verticalOffset += STATS_PELS_PER_LINE; + drawText(horizontalOffset, verticalOffset, scale, rotation, font, (char*)octreeStats.str().c_str(), color); + + octreeStats.str(""); + octreeStats << " Translucent considered: " << _renderDetails._translucent._considered + << " / Out of view:" << _renderDetails._translucent._outOfView + << " / Too small:" << _renderDetails._translucent._tooSmall; verticalOffset += STATS_PELS_PER_LINE; drawText(horizontalOffset, verticalOffset, scale, rotation, font, (char*)octreeStats.str().c_str(), color); } diff --git a/libraries/render-utils/src/Model.cpp b/libraries/render-utils/src/Model.cpp index ae9991a3e4..fdb398c830 100644 --- a/libraries/render-utils/src/Model.cpp +++ b/libraries/render-utils/src/Model.cpp @@ -2216,12 +2216,6 @@ void Model::renderPart(RenderArgs* args, int meshIndex, int partIndex, bool tran const int INDICES_PER_QUAD = 4; args->_details._trianglesRendered += part.triangleIndices.size() / INDICES_PER_TRIANGLE; args->_details._quadsRendered += part.quadIndices.size() / INDICES_PER_QUAD; - - if (translucent) { - args->_details._translucentMeshPartsRendered++; - } else { - args->_details._opaqueMeshPartsRendered++; - } } } diff --git a/libraries/render/src/render/DrawTask.cpp b/libraries/render/src/render/DrawTask.cpp index f396fb45ab..8011b3a715 100755 --- a/libraries/render/src/render/DrawTask.cpp +++ b/libraries/render/src/render/DrawTask.cpp @@ -63,7 +63,10 @@ void render::cullItems(const SceneContextPointer& sceneContext, const RenderCont auto& scene = sceneContext->_scene; RenderArgs* args = renderContext->args; + auto renderDetails = renderContext->args->_details._item; + renderDetails->_considered += inItems.size(); + // Culling / LOD for (auto id : inItems) { auto item = scene->getItem(id); @@ -81,9 +84,14 @@ void render::cullItems(const SceneContextPointer& sceneContext, const RenderCont bool bigEnoughToRender = (args->_shouldRender) ? args->_shouldRender(args, bound) : true; if (bigEnoughToRender) { outItems.push_back(id); // One more Item to render + } else { + renderDetails->_tooSmall++; } + } else { + renderDetails->_outOfView++; } } + renderDetails->_rendered += outItems.size(); } struct ItemBound { @@ -220,6 +228,7 @@ template <> void render::jobRun(const DrawOpaque& job, const SceneContextPointer // render opaques auto& scene = sceneContext->_scene; auto& items = scene->getMasterBucket().at(ItemFilter::Builder::opaqueShape()); + auto& renderDetails = renderContext->args->_details; ItemIDs inItems; inItems.reserve(items.size()); @@ -232,7 +241,9 @@ template <> void render::jobRun(const DrawOpaque& job, const SceneContextPointer ItemIDs culledItems; if (renderContext->_cullOpaque) { + renderDetails.pointTo(RenderDetails::OPAQUE); cullItems(sceneContext, renderContext, renderedItems, culledItems); + renderDetails.pointTo(RenderDetails::OTHER); renderedItems = culledItems; } @@ -283,6 +294,7 @@ template <> void render::jobRun(const DrawTransparent& job, const SceneContextPo // render transparents auto& scene = sceneContext->_scene; auto& items = scene->getMasterBucket().at(ItemFilter::Builder::transparentShape()); + auto& renderDetails = renderContext->args->_details; ItemIDs inItems; inItems.reserve(items.size()); @@ -295,7 +307,9 @@ template <> void render::jobRun(const DrawTransparent& job, const SceneContextPo ItemIDs culledItems; if (renderContext->_cullTransparent) { + renderDetails.pointTo(RenderDetails::TRANSLUCENT); cullItems(sceneContext, renderContext, inItems, culledItems); + renderDetails.pointTo(RenderDetails::OTHER); renderedItems = culledItems; } diff --git a/libraries/shared/src/RenderArgs.h b/libraries/shared/src/RenderArgs.h index b2a0d75cd6..cdfdfb9c5f 100644 --- a/libraries/shared/src/RenderArgs.h +++ b/libraries/shared/src/RenderArgs.h @@ -22,13 +22,44 @@ class Batch; class Context; } -struct RenderDetails { +class RenderDetails { +public: + enum Type { + OPAQUE, + TRANSLUCENT, + OTHER + }; + + struct Items { + int _considered = 0; + int _rendered = 0; + int _outOfView = 0; + int _tooSmall = 0; + }; + int _materialSwitches = 0; int _trianglesRendered = 0; int _quadsRendered = 0; - int _translucentMeshPartsRendered = 0; - int _opaqueMeshPartsRendered = 0; + Items _opaque; + Items _translucent; + Items _other; + + Items* _item = &_other; + + void pointTo(Type type) { + switch (type) { + case OPAQUE: + _item = &_opaque; + break; + case TRANSLUCENT: + _item = &_translucent; + break; + case OTHER: + _item = &_other; + break; + } + } }; class RenderArgs {