From 2b45fd1510591fbec0dcf27f1d0d904d9b76f725 Mon Sep 17 00:00:00 2001 From: Robert Osfield Date: Wed, 28 Jan 2009 09:31:43 +0000 Subject: [PATCH] From Paul Melis, "Here is an updated osgViewer::StatsHandler. It has the following changes: - The text and dark background rectangles are now correctly placed, and slightly resized here and there. - All counters (vertices, etc) now use a fixed formatting with 0 digits precision, to prevent the text from being shown in scientific notation when the number get large (e.g. 6.34344e+6). I tested with a scene containing roughly 4 million vertices, to make sure its stats would display correctly. I also made slight changes to osgcompositeviewer (attached) to aid in testing the stats display, specifically displaying of camera and view names." --- .../osgcompositeviewer/osgcompositeviewer.cpp | 8 ++ src/osgViewer/StatsHandler.cpp | 91 ++++++++++--------- 2 files changed, 57 insertions(+), 42 deletions(-) diff --git a/examples/osgcompositeviewer/osgcompositeviewer.cpp b/examples/osgcompositeviewer/osgcompositeviewer.cpp index 0eeb0f20f..4ef2dbf03 100644 --- a/examples/osgcompositeviewer/osgcompositeviewer.cpp +++ b/examples/osgcompositeviewer/osgcompositeviewer.cpp @@ -163,6 +163,7 @@ int main( int argc, char **argv ) // view one { osgViewer::View* view = new osgViewer::View; + view->setName("View one"); viewer.addView(view); view->setUpViewOnSingleScreen(0); @@ -179,6 +180,7 @@ int main( int argc, char **argv ) // view two { osgViewer::View* view = new osgViewer::View; + view->setName("View two"); viewer.addView(view); view->setUpViewOnSingleScreen(1); @@ -234,9 +236,11 @@ int main( int argc, char **argv ) // view one { osgViewer::View* view = new osgViewer::View; + view->setName("View one"); viewer.addView(view); view->setSceneData(scene.get()); + view->getCamera()->setName("Cam one"); view->getCamera()->setViewport(new osg::Viewport(0,0, traits->width/2, traits->height/2)); view->getCamera()->setGraphicsContext(gc.get()); view->setCameraManipulator(new osgGA::TrackballManipulator); @@ -257,9 +261,11 @@ int main( int argc, char **argv ) // view two { osgViewer::View* view = new osgViewer::View; + view->setName("View two"); viewer.addView(view); view->setSceneData(scene.get()); + view->getCamera()->setName("Cam two"); view->getCamera()->setViewport(new osg::Viewport(traits->width/2,0, traits->width/2, traits->height/2)); view->getCamera()->setGraphicsContext(gc.get()); view->setCameraManipulator(new osgGA::TrackballManipulator); @@ -272,10 +278,12 @@ int main( int argc, char **argv ) // view three { osgViewer::View* view = new osgViewer::View; + view->setName("View three"); viewer.addView(view); view->setSceneData(osgDB::readNodeFile("cessnafire.osg")); + view->getCamera()->setName("Cam three"); view->getCamera()->setProjectionMatrixAsPerspective(30.0, double(traits->width) / double(traits->height/2), 1.0, 1000.0); view->getCamera()->setViewport(new osg::Viewport(0, traits->height/2, traits->width, traits->height/2)); view->getCamera()->setGraphicsContext(gc.get()); diff --git a/src/osgViewer/StatsHandler.cpp b/src/osgViewer/StatsHandler.cpp index 40a439c9f..600cee228 100644 --- a/src/osgViewer/StatsHandler.cpp +++ b/src/osgViewer/StatsHandler.cpp @@ -366,26 +366,29 @@ struct CameraSceneStatsTextDrawCallback : public virtual osg::Drawable::DrawCall { viewStr.setf(std::ios::left, std::ios::adjustfield); viewStr.width(14); + // Used fixed formatting, as scientific will switch to "...e+.." notation for + // large numbers of vertices/drawables/etc. + viewStr.setf(std::ios::fixed); + viewStr.precision(0); - viewStr << std::setw(1) << _cameraNumber << ": "; + viewStr << std::setw(1) << "#" << _cameraNumber << std::endl; // Camera name - if (_camera->getName().empty()) - viewStr << std::endl; - else - viewStr << _camera->getName() << std::endl; - + if (!_camera->getName().empty()) + viewStr << _camera->getName(); + viewStr << std::endl; + int frameNumber = renderInfo.getState()->getFrameStamp()->getFrameNumber(); if (!(renderer->getGraphicsThreadDoesCull())) { --frameNumber; } - + #define STATS_ATTRIBUTE(str) \ if (stats->getAttribute(frameNumber, str, value)) \ - viewStr << std::setw(7) << value << std::endl; \ + viewStr << std::setw(8) << value << std::endl; \ else \ - viewStr << std::setw(7) << "." << std::endl; \ + viewStr << std::setw(8) << "." << std::endl; \ double value = 0.0; @@ -447,16 +450,16 @@ struct ViewSceneStatsTextDrawCallback : public virtual osg::Drawable::DrawCallba { std::ostringstream viewStr; viewStr.clear(); - viewStr.setf(std::ios::left,std::ios::adjustfield); + viewStr.setf(std::ios::left, std::ios::adjustfield); viewStr.width(20); - - viewStr << std::setw(1) << _viewNumber << ": "; - // View name - if (_view->getName().empty()) - viewStr << std::endl; - else - viewStr << _view->getName() << std::endl; + viewStr.setf(std::ios::fixed); + viewStr.precision(0); + viewStr << std::setw(1) << "#" << _viewNumber; + + // View name + if (!_view->getName().empty()) + viewStr << ": " << _view->getName(); viewStr << std::endl; int frameNumber = renderInfo.getState()->getFrameStamp()->getFrameNumber(); @@ -477,6 +480,9 @@ struct ViewSceneStatsTextDrawCallback : public virtual osg::Drawable::DrawCallba double value = 0.0; + // header + viewStr << std::setw(10) << "Unique" << std::setw(10) << "Instanced" << std::endl; + STATS_ATTRIBUTE_PAIR("Number of unique StateSet","Number of instanced Stateset") STATS_ATTRIBUTE_PAIR("Number of unique Group","Number of instanced Group") STATS_ATTRIBUTE_PAIR("Number of unique Transform","Number of instanced Transform") @@ -1087,8 +1093,8 @@ void StatsHandler::setUpScene(osgViewer::ViewerBase* viewer) float topOfViewerStats = pos.y() + characterSize; - geode->addDrawable(createBackgroundRectangle( pos + osg::Vec3(-backgroundMargin, characterSize + backgroundMargin, 0), - _camera->getViewport()->width() - 2 * backgroundMargin, + geode->addDrawable(createBackgroundRectangle( pos + osg::Vec3(-backgroundMargin, characterSize + backgroundMargin, 0), + _camera->getViewport()->width() - 2 * backgroundMargin, (3 + 4.5 * cameras.size()) * characterSize + 2 * backgroundMargin, backgroundColor) ); @@ -1234,8 +1240,8 @@ void StatsHandler::setUpScene(osgViewer::ViewerBase* viewer) { pos.y() -= (characterSize + backgroundSpacing); - geode->addDrawable(createBackgroundRectangle( pos + osg::Vec3(-backgroundMargin, characterSize + backgroundMargin, 0), - _camera->getViewport()->width() - 2 * backgroundMargin, + geode->addDrawable(createBackgroundRectangle( pos + osg::Vec3(-backgroundMargin, characterSize + backgroundMargin, 0), + _camera->getViewport()->width() - 2 * backgroundMargin, characterSize + 2 * backgroundMargin, backgroundColor)); @@ -1368,14 +1374,14 @@ void StatsHandler::setUpScene(osgViewer::ViewerBase* viewer) osg::Geode* geode = new osg::Geode(); geode->setCullingActive(false); group->addChild(geode); - geode->addDrawable(createBackgroundRectangle( pos + osg::Vec3(-backgroundMargin, characterSize + backgroundMargin, 0), - 7 * characterSize + 2 * backgroundMargin, - 18 * characterSize + 2 * backgroundMargin, + geode->addDrawable(createBackgroundRectangle(pos + osg::Vec3(-backgroundMargin, characterSize + backgroundMargin, 0), + 7 * characterSize + 2 * backgroundMargin, + 19 * characterSize + 2 * backgroundMargin, backgroundColor)); // Camera scene & primitive stats static text osg::ref_ptr camStaticText = new osgText::Text; - geode->addDrawable( camStaticText.get() ); + geode->addDrawable( camStaticText.get() ); camStaticText->setColor(staticTextColor); camStaticText->setFont(font); camStaticText->setCharacterSize(characterSize); @@ -1383,9 +1389,10 @@ void StatsHandler::setUpScene(osgViewer::ViewerBase* viewer) std::ostringstream viewStr; viewStr.clear(); - viewStr.setf(std::ios::left,std::ios::adjustfield); + viewStr.setf(std::ios::left, std::ios::adjustfield); viewStr.width(14); viewStr << "Camera" << std::endl; + viewStr << "" << std::endl; // placeholder for Camera name viewStr << "Vertices" << std::endl; viewStr << "Drawables" << std::endl; viewStr << "Lights" << std::endl; @@ -1407,15 +1414,15 @@ void StatsHandler::setUpScene(osgViewer::ViewerBase* viewer) camStaticText->setText(viewStr.str()); // Move camera block to the right - pos.x() += 7 * characterSize + 2 * backgroundMargin + backgroundSpacing; + pos.x() += 7 * characterSize + 2 * backgroundMargin + backgroundSpacing; - // add camera scene stats + // Add camera scene stats, one block per camera int cameraCounter = 0; for(ViewerBase::Cameras::iterator citr = cameras.begin(); citr != cameras.end(); ++citr) { - geode->addDrawable(createBackgroundRectangle( pos + osg::Vec3(-backgroundMargin, characterSize + backgroundMargin, 0), - 5 * characterSize + 2 * backgroundMargin, - 18 * characterSize + 2 * backgroundMargin, + geode->addDrawable(createBackgroundRectangle(pos + osg::Vec3(-backgroundMargin, characterSize + backgroundMargin, 0), + 5 * characterSize + 2 * backgroundMargin, + 19 * characterSize + 2 * backgroundMargin, backgroundColor)); // Camera scene stats @@ -1430,7 +1437,7 @@ void StatsHandler::setUpScene(osgViewer::ViewerBase* viewer) camStatsText->setDrawCallback(new CameraSceneStatsTextDrawCallback(*citr, cameraCounter)); // Move camera block to the right - pos.x() += 5 * characterSize + 2 * backgroundMargin + backgroundSpacing; + pos.x() += 5 * characterSize + 2 * backgroundMargin + backgroundSpacing; cameraCounter++; } } @@ -1445,8 +1452,8 @@ void StatsHandler::setUpScene(osgViewer::ViewerBase* viewer) geode->setCullingActive(false); group->addChild(geode); - geode->addDrawable(createBackgroundRectangle( pos + osg::Vec3(-backgroundMargin, characterSize + backgroundMargin, 0), - 5 * characterSize + 2 * backgroundMargin, + geode->addDrawable(createBackgroundRectangle(pos + osg::Vec3(-backgroundMargin, characterSize + backgroundMargin, 0), + 6 * characterSize + 2 * backgroundMargin, 12 * characterSize + 2 * backgroundMargin, backgroundColor)); @@ -1460,10 +1467,10 @@ void StatsHandler::setUpScene(osgViewer::ViewerBase* viewer) std::ostringstream viewStr; viewStr.clear(); - viewStr.setf(std::ios::left,std::ios::adjustfield); + viewStr.setf(std::ios::left, std::ios::adjustfield); viewStr.width(14); viewStr << "View" << std::endl; - viewStr << std::endl; + viewStr << " " << std::endl; viewStr << "Stateset" << std::endl; viewStr << "Group" << std::endl; viewStr << "Transform" << std::endl; @@ -1474,11 +1481,11 @@ void StatsHandler::setUpScene(osgViewer::ViewerBase* viewer) viewStr << "Geometry" << std::endl; viewStr << "Vertices" << std::endl; viewStr << "Primitives" << std::endl; - viewStr.setf(std::ios::right,std::ios::adjustfield); + viewStr.setf(std::ios::right, std::ios::adjustfield); camStaticText->setText(viewStr.str()); - // Move camera block to the right - pos.x() += 5 * characterSize + 2 * backgroundMargin + backgroundSpacing; + // Move viewer block to the right + pos.x() += 6 * characterSize + 2 * backgroundMargin + backgroundSpacing; std::vector views; viewer->getViews(views); @@ -1487,8 +1494,8 @@ void StatsHandler::setUpScene(osgViewer::ViewerBase* viewer) int viewCounter = 0; for (it = views.begin(); it != views.end(); ++it) { - geode->addDrawable(createBackgroundRectangle( pos + osg::Vec3(-backgroundMargin, characterSize + backgroundMargin, 0), - 6 * characterSize + 2 * backgroundMargin, + geode->addDrawable(createBackgroundRectangle(pos + osg::Vec3(-backgroundMargin, characterSize + backgroundMargin, 0), + 11 * characterSize + 2 * backgroundMargin, 12 * characterSize + 2 * backgroundMargin, backgroundColor)); @@ -1502,7 +1509,7 @@ void StatsHandler::setUpScene(osgViewer::ViewerBase* viewer) text->setPosition(pos); text->setDrawCallback(new ViewSceneStatsTextDrawCallback(*it, viewCounter)); - pos.x() += 6 * characterSize + 2 * backgroundMargin + backgroundSpacing; + pos.x() += 11 * characterSize + 2 * backgroundMargin + backgroundSpacing; viewCounter++; } }