Changeset 9563 for OpenSceneGraph/trunk/src/osgViewer/StatsHandler.cpp
- Timestamp:
- 01/28/09 10:24:06 (4 years ago)
- Files:
-
- 1 modified
Legend:
- Unmodified
- Added
- Removed
-
OpenSceneGraph/trunk/src/osgViewer/StatsHandler.cpp
r9554 r9563 1 /* -*-c++-*- OpenSceneGraph - Copyright (C) 1998-2006 Robert Osfield 1 /* -*-c++-*- OpenSceneGraph - Copyright (C) 1998-2006 Robert Osfield 2 2 * 3 * This library is open source and may be redistributed and/or modified under 4 * the terms of the OpenSceneGraph Public License (OSGPL) version 0.0 or 3 * This library is open source and may be redistributed and/or modified under 4 * the terms of the OpenSceneGraph Public License (OSGPL) version 0.0 or 5 5 * (at your option) any later version. The full license is in LICENSE file 6 6 * included with this distribution, and on the openscenegraph.org website. 7 * 7 * 8 8 * This library is distributed in the hope that it will be useful, 9 9 * but WITHOUT ANY WARRANTY; without even the implied warranty of 10 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 10 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 11 11 * OpenSceneGraph Public License for more details. 12 12 */ … … 50 50 bool StatsHandler::handle(const osgGA::GUIEventAdapter& ea, osgGA::GUIActionAdapter& aa) 51 51 { 52 52 53 53 osgViewer::View* myview = dynamic_cast<osgViewer::View*>(&aa); 54 54 if (!myview) return false; 55 55 56 56 osgViewer::ViewerBase* viewer = myview->getViewerBase(); 57 57 if (viewer && _threadingModelText.valid() && viewer->getThreadingModel()!=_threadingModel) … … 60 60 updateThreadingModelText(); 61 61 } 62 63 62 63 64 64 if (ea.getHandled()) return false; 65 65 … … 81 81 82 82 if (_statsType==LAST) _statsType = NO_STATS; 83 83 84 84 osgViewer::ViewerBase::Cameras cameras; 85 85 viewer->getCameras(cameras); … … 105 105 } 106 106 } 107 107 108 108 viewer->getViewerStats()->collectStats("scene",false); 109 109 110 _camera->setNodeMask(0x0); 110 _camera->setNodeMask(0x0); 111 111 _switch->setAllChildrenOff(); 112 112 break; … … 115 115 { 116 116 viewer->getViewerStats()->collectStats("frame_rate",true); 117 117 118 118 _camera->setNodeMask(0xffffffff); 119 119 _switch->setValue(_frameRateChildNum, true); … … 135 135 } 136 136 } 137 137 138 138 viewer->getViewerStats()->collectStats("event",true); 139 139 viewer->getViewerStats()->collectStats("update",true); … … 146 146 if ((*itr)->getStats()) (*itr)->getStats()->collectStats("gpu",true); 147 147 } 148 148 149 149 _camera->setNodeMask(0xffffffff); 150 150 _switch->setValue(_viewerChildNum, true); … … 245 245 case(osgViewer::Viewer::CullThreadPerCameraDrawThreadPerContext): _threadingModelText->setText("ThreadingModel: CullThreadPerCameraDrawThreadPerContext"); break; 246 246 case(osgViewer::Viewer::AutomaticSelection): _threadingModelText->setText("ThreadingModel: AutomaticSelection"); break; 247 default: 247 default: 248 248 _threadingModelText->setText("ThreadingModel: unknown"); break; 249 249 } … … 260 260 { 261 261 osgViewer::GraphicsWindow* window = dynamic_cast<osgViewer::GraphicsWindow*>(_camera->getGraphicsContext()); 262 262 263 263 if (!window) 264 { 264 { 265 265 osgViewer::Viewer::Windows windows; 266 266 viewer->getWindows(windows); … … 284 284 285 285 _camera->setRenderer(new Renderer(_camera.get())); 286 286 287 287 _initialized = true; 288 288 } … … 339 339 CameraSceneStatsTextDrawCallback(osg::Camera* camera, int cameraNumber): 340 340 _camera(camera), 341 _tickLastUpdated(0), 341 _tickLastUpdated(0), 342 342 _cameraNumber(cameraNumber) 343 343 { … … 362 362 osg::Stats* stats = _camera->getStats(); 363 363 osgViewer::Renderer* renderer = dynamic_cast<osgViewer::Renderer*>(_camera->getRenderer()); 364 364 365 365 if (stats && renderer) 366 366 { 367 viewStr.setf(std::ios::left, std::ios::adjustfield);367 viewStr.setf(std::ios::left, std::ios::adjustfield); 368 368 viewStr.width(14); 369 369 … … 409 409 STATS_ATTRIBUTE("Visible number of GL_POLYGON") 410 410 411 412 411 text->setText(viewStr.str()); 413 412 } … … 466 465 --frameNumber; 467 466 } 468 467 469 468 #define STATS_ATTRIBUTE_PAIR(str1, str2) \ 470 469 if (stats->getAttribute(frameNumber, str1, value)) \ … … 493 492 text->setText(viewStr.str()); 494 493 } 495 else 494 else 496 495 { 497 496 osg::notify(osg::WARN)<<std::endl<<"No valid view to collect scene stats from"<<std::endl; 498 497 499 498 text->setText(""); 500 499 } … … 511 510 { 512 511 BlockDrawCallback(StatsHandler* statsHandler, float xPos, osg::Stats* viewerStats, osg::Stats* stats, const std::string& beginName, const std::string& endName, int frameDelta, int numFrames): 513 _statsHandler(statsHandler), 512 _statsHandler(statsHandler), 514 513 _xPos(xPos), 515 514 _viewerStats(viewerStats), … … 526 525 osg::Vec3Array* vertices = (osg::Vec3Array*)geom->getVertexArray(); 527 526 528 int frameNumber = renderInfo.getState()->getFrameStamp()->getFrameNumber(); 527 int frameNumber = renderInfo.getState()->getFrameStamp()->getFrameNumber(); 529 528 530 529 int startFrame = frameNumber + _frameDelta - _numFrames + 1; … … 539 538 double beginValue, endValue; 540 539 for(int i = startFrame; i <= endFrame; ++i) 541 { 540 { 542 541 if (_stats->getAttribute( i, _beginName, beginValue) && 543 542 _stats->getAttribute( i, _endName, endValue) ) … … 566 565 { 567 566 osg::StateSet *ss = new osg::StateSet; 568 567 569 568 osg::Geometry* geometry = new osg::Geometry; 570 569 571 570 geometry->setUseDisplayList(false); 572 571 geometry->setStateSet(ss); … … 574 573 osg::Vec3Array* vertices = new osg::Vec3Array; 575 574 geometry->setVertexArray(vertices); 576 575 577 576 vertices->push_back(osg::Vec3(pos.x(), pos.y(), 0)); 578 577 vertices->push_back(osg::Vec3(pos.x(), pos.y()-height,0)); 579 578 vertices->push_back(osg::Vec3(pos.x()+width, pos.y()-height,0)); 580 579 vertices->push_back(osg::Vec3(pos.x()+width, pos.y(),0)); 581 580 582 581 osg::Vec4Array* colors = new osg::Vec4Array; 583 582 colors->push_back(color); 584 583 geometry->setColorArray(colors); 585 584 geometry->setColorBinding(osg::Geometry::BIND_OVERALL); 586 585 587 586 osg::DrawElementsUInt *base = new osg::DrawElementsUInt(osg::PrimitiveSet::QUADS,0); 588 587 base->push_back(0); … … 622 621 struct Graph : public osg::Geometry 623 622 { 624 Graph(float width, float height, osg::Stats* viewerStats, osg::Stats* stats, 623 Graph(float width, float height, osg::Stats* viewerStats, osg::Stats* stats, 625 624 const osg::Vec4& color, float max, const std::string& nameBegin, const std::string& nameEnd = "") 626 625 { … … 640 639 struct GraphUpdateCallback : public osg::Drawable::DrawCallback 641 640 { 642 GraphUpdateCallback(float width, float height, osg::Stats* viewerStats, osg::Stats* stats, 641 GraphUpdateCallback(float width, float height, osg::Stats* viewerStats, osg::Stats* stats, 643 642 float max, const std::string& nameBegin, const std::string& nameEnd = "") 644 643 : _width((unsigned int)width), _height((unsigned int)height), _curX(0), … … 689 688 vertices->erase(vertices->begin(), vertices->begin() + excedent); 690 689 691 // Make the graph scroll when there is enough data. 692 // Note: We check the frame number so that even if we have 693 // many graphs, the transform is translated only once per 690 // Make the graph scroll when there is enough data. 691 // Note: We check the frame number so that even if we have 692 // many graphs, the transform is translated only once per 694 693 // frame. 695 694 static const float increment = -1.0; 696 695 if (GraphUpdateCallback::_frameNumber != frameNumber) 697 696 { 698 // We know the exact layout of this part of the scene 697 // We know the exact layout of this part of the scene 699 698 // graph, so this is OK... 700 osg::MatrixTransform* transform = 699 osg::MatrixTransform* transform = 701 700 geometry->getParent(0)->getParent(0)->asTransform()->asMatrixTransform(); 702 701 if (transform) … … 767 766 geometry->addPrimitiveSet(new osg::DrawArrays(GL_QUADS, 0, numBlocks*4)); 768 767 769 return geometry; 768 return geometry; 770 769 } 771 770 … … 774 773 { 775 774 FrameMarkerDrawCallback(StatsHandler* statsHandler, float xPos, osg::Stats* viewerStats, int frameDelta, int numFrames): 776 _statsHandler(statsHandler), 775 _statsHandler(statsHandler), 777 776 _xPos(xPos), 778 777 _viewerStats(viewerStats), … … 786 785 osg::Vec3Array* vertices = (osg::Vec3Array*)geom->getVertexArray(); 787 786 788 int frameNumber = renderInfo.getState()->getFrameStamp()->getFrameNumber(); 787 int frameNumber = renderInfo.getState()->getFrameStamp()->getFrameNumber(); 789 788 790 789 int startFrame = frameNumber + _frameDelta - _numFrames + 1; … … 799 798 double currentReferenceTime; 800 799 for(int i = startFrame; i <= endFrame; ++i) 801 { 800 { 802 801 if (_viewerStats->getAttribute( i, "Reference time", currentReferenceTime)) 803 802 { … … 821 820 { 822 821 823 PagerCallback( osgDB::DatabasePager* dp, 824 osgText::Text* minValue, 825 osgText::Text* maxValue, 826 osgText::Text* averageValue, 827 osgText::Text* filerequestlist, 828 osgText::Text* compilelist, 822 PagerCallback( osgDB::DatabasePager* dp, 823 osgText::Text* minValue, 824 osgText::Text* maxValue, 825 osgText::Text* averageValue, 826 osgText::Text* filerequestlist, 827 osgText::Text* compilelist, 829 828 double multiplier): 830 829 _dp(dp), … … 839 838 840 839 virtual void operator()(osg::Node* node, osg::NodeVisitor* nv) 841 { 840 { 842 841 if (_dp.valid()) 843 { 842 { 844 843 double value = _dp->getAverageTimeToMergeTiles(); 845 844 if (value>= 0.0 && value <= 1000) 846 { 845 { 847 846 sprintf(_tmpText,"%4.0f",value * _multiplier); 848 847 _averageValue->setText(_tmpText); … … 852 851 _averageValue->setText(""); 853 852 } 854 853 855 854 value = _dp->getMinimumTimeToMergeTile(); 856 855 if (value>= 0.0 && value <= 1000) 857 { 856 { 858 857 sprintf(_tmpText,"%4.0f",value * _multiplier); 859 858 _minValue->setText(_tmpText); … … 866 865 value = _dp->getMaximumTimeToMergeTile(); 867 866 if (value>= 0.0 && value <= 1000) 868 { 867 { 869 868 sprintf(_tmpText,"%4.0f",value * _multiplier); 870 869 _maxValue->setText(_tmpText); … … 886 885 887 886 osg::observer_ptr<osgDB::DatabasePager> _dp; 888 887 889 888 osg::ref_ptr<osgText::Text> _minValue; 890 889 osg::ref_ptr<osgText::Text> _maxValue; … … 921 920 geometry->addPrimitiveSet(new osg::DrawArrays(GL_LINES, 0, numBlocks*2)); 922 921 923 return geometry; 922 return geometry; 924 923 } 925 924 … … 948 947 geometry->addPrimitiveSet(new osg::DrawArrays(GL_LINES, 0, numTicks*2)); 949 948 950 return geometry; 949 return geometry; 951 950 } 952 951 … … 975 974 ++itr) 976 975 { 977 if ((*itr)->getStats()) 976 if ((*itr)->getStats()) 978 977 { 979 978 cameras.push_back(*itr); … … 1051 1050 1052 1051 pos.y() -= characterSize*1.5f; 1053 1052 1054 1053 } 1055 1054 … … 1070 1069 group->addChild(geode); 1071 1070 1072 1071 1073 1072 { 1074 1073 pos.x() = leftPos; … … 1086 1085 pos.y() -= characterSize*1.5f; 1087 1086 } 1088 1087 1089 1088 float topOfViewerStats = pos.y() + characterSize; 1090 1089 … … 1204 1203 statsGraph->addStatGraph(viewer->getViewerStats(), viewer->getViewerStats(), colorEvent, 0.016, "Event traversal time taken"); 1205 1204 statsGraph->addStatGraph(viewer->getViewerStats(), viewer->getViewerStats(), colorUpdate, 0.016, "Update traversal time taken"); 1206 1205 1207 1206 for(ViewerBase::Cameras::iterator citr = cameras.begin(); 1208 1207 citr != cameras.end(); … … 1340 1339 1341 1340 pos.x() = compileLabel->getBound().xMax(); 1342 1341 1343 1342 osg::ref_ptr<osgText::Text> compileList = new osgText::Text; 1344 1343 geode->addDrawable( compileList.get() ); … … 1404 1403 viewStr << "Quads" << std::endl; 1405 1404 viewStr << "Quad strips" << std::endl; 1406 viewStr << "Polygons" << std::endl; 1405 viewStr << "Polygons" << std::endl; 1407 1406 viewStr.setf(std::ios::right,std::ios::adjustfield); 1408 1407 camStaticText->setText(viewStr.str()); … … 1422 1421 // Camera scene stats 1423 1422 osg::ref_ptr<osgText::Text> camStatsText = new osgText::Text; 1424 geode->addDrawable( camStatsText.get() ); 1425 1423 geode->addDrawable( camStatsText.get() ); 1424 1426 1425 camStatsText->setColor(dynamicTextColor); 1427 1426 camStatsText->setFont(font); … … 1454 1453 // View scene stats static text 1455 1454 osg::ref_ptr<osgText::Text> camStaticText = new osgText::Text; 1456 geode->addDrawable( camStaticText.get() ); 1455 geode->addDrawable( camStaticText.get() ); 1457 1456 camStaticText->setColor(staticTextColor); 1458 1457 camStaticText->setFont(font); … … 1497 1496 osgText::Text* text = new osgText::Text; 1498 1497 geode->addDrawable( text ); 1499 1498 1500 1499 text->setColor(dynamicTextColor); 1501 1500 text->setFont(font);
