mirror of
https://github.com/HifiExperiments/overte.git
synced 2025-08-09 02:27:48 +02:00
Collect stats on translucent/opaque mesh parts
This commit is contained in:
parent
8e21d9c14b
commit
93b44e6846
4 changed files with 64 additions and 11 deletions
|
@ -475,8 +475,22 @@ void Stats::display(
|
||||||
|
|
||||||
if (_expanded) {
|
if (_expanded) {
|
||||||
octreeStats.str("");
|
octreeStats.str("");
|
||||||
octreeStats << " Mesh Parts Rendered Opaque: " << _renderDetails._opaqueMeshPartsRendered
|
octreeStats << " Mesh Parts Rendered Opaque: " << _renderDetails._opaque._rendered
|
||||||
<< " / Translucent:" << _renderDetails._translucentMeshPartsRendered;
|
<< " / 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;
|
verticalOffset += STATS_PELS_PER_LINE;
|
||||||
drawText(horizontalOffset, verticalOffset, scale, rotation, font, (char*)octreeStats.str().c_str(), color);
|
drawText(horizontalOffset, verticalOffset, scale, rotation, font, (char*)octreeStats.str().c_str(), color);
|
||||||
}
|
}
|
||||||
|
|
|
@ -2216,12 +2216,6 @@ void Model::renderPart(RenderArgs* args, int meshIndex, int partIndex, bool tran
|
||||||
const int INDICES_PER_QUAD = 4;
|
const int INDICES_PER_QUAD = 4;
|
||||||
args->_details._trianglesRendered += part.triangleIndices.size() / INDICES_PER_TRIANGLE;
|
args->_details._trianglesRendered += part.triangleIndices.size() / INDICES_PER_TRIANGLE;
|
||||||
args->_details._quadsRendered += part.quadIndices.size() / INDICES_PER_QUAD;
|
args->_details._quadsRendered += part.quadIndices.size() / INDICES_PER_QUAD;
|
||||||
|
|
||||||
if (translucent) {
|
|
||||||
args->_details._translucentMeshPartsRendered++;
|
|
||||||
} else {
|
|
||||||
args->_details._opaqueMeshPartsRendered++;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -63,7 +63,10 @@ void render::cullItems(const SceneContextPointer& sceneContext, const RenderCont
|
||||||
|
|
||||||
auto& scene = sceneContext->_scene;
|
auto& scene = sceneContext->_scene;
|
||||||
RenderArgs* args = renderContext->args;
|
RenderArgs* args = renderContext->args;
|
||||||
|
auto renderDetails = renderContext->args->_details._item;
|
||||||
|
|
||||||
|
renderDetails->_considered += inItems.size();
|
||||||
|
|
||||||
// Culling / LOD
|
// Culling / LOD
|
||||||
for (auto id : inItems) {
|
for (auto id : inItems) {
|
||||||
auto item = scene->getItem(id);
|
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;
|
bool bigEnoughToRender = (args->_shouldRender) ? args->_shouldRender(args, bound) : true;
|
||||||
if (bigEnoughToRender) {
|
if (bigEnoughToRender) {
|
||||||
outItems.push_back(id); // One more Item to render
|
outItems.push_back(id); // One more Item to render
|
||||||
|
} else {
|
||||||
|
renderDetails->_tooSmall++;
|
||||||
}
|
}
|
||||||
|
} else {
|
||||||
|
renderDetails->_outOfView++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
renderDetails->_rendered += outItems.size();
|
||||||
}
|
}
|
||||||
|
|
||||||
struct ItemBound {
|
struct ItemBound {
|
||||||
|
@ -220,6 +228,7 @@ template <> void render::jobRun(const DrawOpaque& job, const SceneContextPointer
|
||||||
// render opaques
|
// render opaques
|
||||||
auto& scene = sceneContext->_scene;
|
auto& scene = sceneContext->_scene;
|
||||||
auto& items = scene->getMasterBucket().at(ItemFilter::Builder::opaqueShape());
|
auto& items = scene->getMasterBucket().at(ItemFilter::Builder::opaqueShape());
|
||||||
|
auto& renderDetails = renderContext->args->_details;
|
||||||
|
|
||||||
ItemIDs inItems;
|
ItemIDs inItems;
|
||||||
inItems.reserve(items.size());
|
inItems.reserve(items.size());
|
||||||
|
@ -232,7 +241,9 @@ template <> void render::jobRun(const DrawOpaque& job, const SceneContextPointer
|
||||||
|
|
||||||
ItemIDs culledItems;
|
ItemIDs culledItems;
|
||||||
if (renderContext->_cullOpaque) {
|
if (renderContext->_cullOpaque) {
|
||||||
|
renderDetails.pointTo(RenderDetails::OPAQUE);
|
||||||
cullItems(sceneContext, renderContext, renderedItems, culledItems);
|
cullItems(sceneContext, renderContext, renderedItems, culledItems);
|
||||||
|
renderDetails.pointTo(RenderDetails::OTHER);
|
||||||
renderedItems = culledItems;
|
renderedItems = culledItems;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -283,6 +294,7 @@ template <> void render::jobRun(const DrawTransparent& job, const SceneContextPo
|
||||||
// render transparents
|
// render transparents
|
||||||
auto& scene = sceneContext->_scene;
|
auto& scene = sceneContext->_scene;
|
||||||
auto& items = scene->getMasterBucket().at(ItemFilter::Builder::transparentShape());
|
auto& items = scene->getMasterBucket().at(ItemFilter::Builder::transparentShape());
|
||||||
|
auto& renderDetails = renderContext->args->_details;
|
||||||
|
|
||||||
ItemIDs inItems;
|
ItemIDs inItems;
|
||||||
inItems.reserve(items.size());
|
inItems.reserve(items.size());
|
||||||
|
@ -295,7 +307,9 @@ template <> void render::jobRun(const DrawTransparent& job, const SceneContextPo
|
||||||
|
|
||||||
ItemIDs culledItems;
|
ItemIDs culledItems;
|
||||||
if (renderContext->_cullTransparent) {
|
if (renderContext->_cullTransparent) {
|
||||||
|
renderDetails.pointTo(RenderDetails::TRANSLUCENT);
|
||||||
cullItems(sceneContext, renderContext, inItems, culledItems);
|
cullItems(sceneContext, renderContext, inItems, culledItems);
|
||||||
|
renderDetails.pointTo(RenderDetails::OTHER);
|
||||||
renderedItems = culledItems;
|
renderedItems = culledItems;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -22,13 +22,44 @@ class Batch;
|
||||||
class Context;
|
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 _materialSwitches = 0;
|
||||||
int _trianglesRendered = 0;
|
int _trianglesRendered = 0;
|
||||||
int _quadsRendered = 0;
|
int _quadsRendered = 0;
|
||||||
|
|
||||||
int _translucentMeshPartsRendered = 0;
|
Items _opaque;
|
||||||
int _opaqueMeshPartsRendered = 0;
|
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 {
|
class RenderArgs {
|
||||||
|
|
Loading…
Reference in a new issue