diff --git a/include/osgUtil/RenderBin b/include/osgUtil/RenderBin index 8fd458ed1..c2e260bbd 100644 --- a/include/osgUtil/RenderBin +++ b/include/osgUtil/RenderBin @@ -134,9 +134,7 @@ class OSGUTIL_EXPORT RenderBin : public osg::Object const DrawCallback* getDrawCallback() const { return _drawCallback.get(); } /** Extract stats for current draw list. */ - bool getStats(Statistics* primStats); - void getPrims(Statistics* primStats); - bool getPrims(Statistics* primStats, int nbin); + bool getStats(Statistics& primStats) const; void copyLeavesFromStateGraphListToRenderLeafList(); diff --git a/include/osgUtil/RenderStage b/include/osgUtil/RenderStage index 46a8b48b9..de2b8765f 100644 --- a/include/osgUtil/RenderStage +++ b/include/osgUtil/RenderStage @@ -195,10 +195,11 @@ class OSGUTIL_EXPORT RenderStage : public RenderBin void addToDependencyList(RenderStage* rs) { addPreRenderStage(rs); } void addPreRenderStage(RenderStage* rs); + void addPostRenderStage(RenderStage* rs); /** Extract stats for current draw list. */ - bool getStats(Statistics* primStats); + bool getStats(Statistics& stats) const; protected: diff --git a/include/osgUtil/SceneView b/include/osgUtil/SceneView index 471116f52..ef20b7d12 100644 --- a/include/osgUtil/SceneView +++ b/include/osgUtil/SceneView @@ -456,7 +456,7 @@ class OSGUTIL_EXPORT SceneView : public osg::Referenced, public osg::CullSetting virtual void flushDeletedGLObjects(double& availableTime); /** Extract stats for current draw list. */ - bool getStats(Statistics* primStats); + bool getStats(Statistics& primStats); protected: diff --git a/include/osgUtil/Statistics b/include/osgUtil/Statistics index da77441e6..3d3025c22 100644 --- a/include/osgUtil/Statistics +++ b/include/osgUtil/Statistics @@ -62,8 +62,13 @@ class Statistics : public osg::PrimitiveFunctor void reset() { - numDrawables=0, nummat=0; depth=0; stattype=STAT_NONE; - nlights=0; nbins=0; nimpostor=0; + numDrawables=0; + nummat=0; + depth=0; + stattype=STAT_NONE; + nlights=0; + nbins=0; + nimpostor=0; _vertexCount=0; _primitiveCount.clear(); @@ -131,6 +136,8 @@ class Statistics : public osg::PrimitiveFunctor { _primitives_count[_currentPrimitiveFunctorMode] += _calculate_primitives_number_by_mode(_currentPrimitiveFunctorMode, _number_of_vertexes); + + _vertexCount += _number_of_vertexes; } void addDrawable() { numDrawables++;} diff --git a/src/osgProducer/ViewerEventHandler.cpp b/src/osgProducer/ViewerEventHandler.cpp index 10cec73e2..ca49b3540 100644 --- a/src/osgProducer/ViewerEventHandler.cpp +++ b/src/osgProducer/ViewerEventHandler.cpp @@ -619,7 +619,7 @@ void ViewerEventHandler::StatsAndHelpDrawCallback::displayStats() shitr != _veh->getOsgCameraGroup()->getSceneHandlerList().end(); ++shitr) { - (*shitr)->getSceneView()->getStats(&stats); + (*shitr)->getSceneView()->getStats(stats); } unsigned int primitives = 0; diff --git a/src/osgUtil/RenderBin.cpp b/src/osgUtil/RenderBin.cpp index 75dcc6ca5..e327a3bf2 100644 --- a/src/osgUtil/RenderBin.cpp +++ b/src/osgUtil/RenderBin.cpp @@ -399,95 +399,66 @@ void RenderBin::drawImplementation(osg::State& state,RenderLeaf*& previous) } // stats -bool RenderBin::getStats(Statistics* primStats) +bool RenderBin::getStats(Statistics& stats) const { + stats.addBins(1); + // different by return type - collects the stats in this renderrBin - bool somestats=false; + bool statsCollected = false; // draw fine grained ordering. - for(RenderLeafList::iterator dw_itr = _renderLeafList.begin(); + for(RenderLeafList::const_iterator dw_itr = _renderLeafList.begin(); dw_itr != _renderLeafList.end(); ++dw_itr) { - RenderLeaf* rl = *dw_itr; - Drawable* dw= rl->_drawable; - primStats->addDrawable(); // number of geosets + const RenderLeaf* rl = *dw_itr; + const Drawable* dw= rl->_drawable; + stats.addDrawable(); // number of geosets if (rl->_modelview.get()) { - primStats->addMatrix(); // number of matrices + stats.addMatrix(); // number of matrices } if (dw) { // then tot up the primtive types and no vertices. - dw->accept(*primStats); // use sub-class to find the stats for each drawable + dw->accept(stats); // use sub-class to find the stats for each drawable } - somestats = true; - + statsCollected = true; } - for(StateGraphList::iterator oitr=_stateGraphList.begin(); + for(StateGraphList::const_iterator oitr=_stateGraphList.begin(); oitr!=_stateGraphList.end(); ++oitr) { - for(StateGraph::LeafList::iterator dw_itr = (*oitr)->_leaves.begin(); + for(StateGraph::LeafList::const_iterator dw_itr = (*oitr)->_leaves.begin(); dw_itr != (*oitr)->_leaves.end(); ++dw_itr) { - RenderLeaf* rl = dw_itr->get(); - Drawable* dw= rl->_drawable; - primStats->addDrawable(); // number of geosets - if (rl->_modelview.get()) primStats->addMatrix(); // number of matrices + const RenderLeaf* rl = dw_itr->get(); + const Drawable* dw= rl->_drawable; + stats.addDrawable(); // number of geosets + if (rl->_modelview.get()) stats.addMatrix(); // number of matrices if (dw) { // then tot up the primtive types and no vertices. - dw->accept(*primStats); // use sub-class to find the stats for each drawable + dw->accept(stats); // use sub-class to find the stats for each drawable } } - somestats=true; + statsCollected = true; } - return somestats; -} -void RenderBin::getPrims(Statistics* primStats) -{ - static int ndepth; - ndepth++; - for(RenderBinList::iterator itr = _bins.begin(); + // now collects stats for any subbins. + for(RenderBinList::const_iterator itr = _bins.begin(); itr!=_bins.end(); ++itr) { - primStats->addBins(1); - itr->second->getPrims(primStats); + if (itr->second->getStats(stats)) + { + statsCollected = true; + } } - getStats(primStats); - ndepth--; -} - -bool RenderBin::getPrims(Statistics* primStats, int nbin) -{ // collect stats for array of bins, maximum nbin - // (which will be modified on next call if array of primStats is too small); - // return 1 for OK; - static int ndepth; - bool ok=false; - ndepth++; - int nb=primStats[0].getBins(); - if (nbsecond->getPrims(primStats, nbin)) ok = true; - } - ok=true; - ndepth--; - return ok; + return statsCollected; } diff --git a/src/osgUtil/RenderStage.cpp b/src/osgUtil/RenderStage.cpp index 4668ea4b1..a5333a5c1 100644 --- a/src/osgUtil/RenderStage.cpp +++ b/src/osgUtil/RenderStage.cpp @@ -886,13 +886,33 @@ void RenderStage::drawPostRenderStages(osg::State& state,RenderLeaf*& previous) } // Statistics features -bool RenderStage::getStats(Statistics* primStats) +bool RenderStage::getStats(Statistics& stats) const { - if (_renderStageLighting.valid()) + bool statsCollected = false; + + for(RenderStageList::const_iterator pre_itr = _preRenderList.begin(); + pre_itr != _preRenderList.end(); + ++pre_itr) { - // need to re-implement by checking for lights in the scene - // by downcasting the positioned attribute list. RO. May 2002. - //primStats->addLight(_renderStageLighting->_lightList.size()); + if ((*pre_itr)->getStats(stats)) + { + statsCollected = true; + } } - return RenderBin::getStats(primStats); + + for(RenderStageList::const_iterator post_itr = _postRenderList.begin(); + post_itr != _postRenderList.end(); + ++post_itr) + { + if ((*post_itr)->getStats(stats)) + { + statsCollected = true; + } + } + + if (RenderBin::getStats(stats)) + { + statsCollected = true; + } + return statsCollected; } diff --git a/src/osgUtil/SceneView.cpp b/src/osgUtil/SceneView.cpp index 16c164048..cbd75dc76 100644 --- a/src/osgUtil/SceneView.cpp +++ b/src/osgUtil/SceneView.cpp @@ -1371,7 +1371,7 @@ void SceneView::getViewMatrixAsLookAt(Vec3& eye,Vec3& center,Vec3& up,float look getViewMatrix().getLookAt(eye,center,up,lookDistance); } -bool SceneView::getStats(Statistics* primStats) +bool SceneView::getStats(Statistics& stats) { if (_displaySettings.valid() && _displaySettings->getStereo()) { @@ -1384,18 +1384,18 @@ bool SceneView::getStats(Statistics* primStats) case(osg::DisplaySettings::VERTICAL_INTERLACE): case(osg::DisplaySettings::HORIZONTAL_INTERLACE): { - bool resultLeft = _renderStageLeft->getStats(primStats); - bool resultRight = _renderStageRight->getStats(primStats); + bool resultLeft = _renderStageLeft->getStats(stats); + bool resultRight = _renderStageRight->getStats(stats); return resultLeft && resultRight; } case(osg::DisplaySettings::RIGHT_EYE): case(osg::DisplaySettings::LEFT_EYE): default: - return _renderStage->getStats(primStats); + return _renderStage->getStats(stats); } } else { - return _renderStage->getStats(primStats); + return _renderStage->getStats(stats); } }