Index: /OpenSceneGraph/trunk/include/osgUtil/Statistics
===================================================================
--- /OpenSceneGraph/trunk/include/osgUtil/Statistics (revision 9377)
+++ /OpenSceneGraph/trunk/include/osgUtil/Statistics (revision 9552)
@@ -116,5 +116,10 @@
     public:
                 
+        PrimitiveCountMap& getPrimitiveCountMap() { return _primitives_count; }
+        const PrimitiveCountMap& getPrimitiveCountMap() const { return _primitives_count; }
+        
+        /// deprecated
         PrimitiveCountMap::iterator GetPrimitivesBegin() { return _primitives_count.begin(); }
+        /// deprecated
         PrimitiveCountMap::iterator GetPrimitivesEnd() { return _primitives_count.end(); }
 
Index: /OpenSceneGraph/trunk/src/osgViewer/Renderer.cpp
===================================================================
--- /OpenSceneGraph/trunk/src/osgViewer/Renderer.cpp (revision 9385)
+++ /OpenSceneGraph/trunk/src/osgViewer/Renderer.cpp (revision 9552)
@@ -18,4 +18,5 @@
 #include <osgUtil/Optimizer>
 #include <osgUtil/GLObjectsVisitor>
+#include <osgUtil/Statistics>
 
 #include <osgViewer/Renderer>
@@ -335,4 +336,31 @@
         }
 
+        if (stats && stats->collectStats("scene"))
+        {
+            osgUtil::Statistics sceneStats;
+            sceneView->getStats(sceneStats);
+            
+            stats->setAttribute(frameNumber, "Visible vertex count", static_cast<double>(sceneStats._vertexCount));
+            stats->setAttribute(frameNumber, "Visible number of drawables", static_cast<double>(sceneStats.numDrawables));
+            stats->setAttribute(frameNumber, "Visible number of lights", static_cast<double>(sceneStats.nlights));
+            stats->setAttribute(frameNumber, "Visible number of render bins", static_cast<double>(sceneStats.nbins));
+            stats->setAttribute(frameNumber, "Visible depth", static_cast<double>(sceneStats.depth));
+            stats->setAttribute(frameNumber, "Visible number of materials", static_cast<double>(sceneStats.nummat));
+            stats->setAttribute(frameNumber, "Visible number of impostors", static_cast<double>(sceneStats.nimpostor));
+
+            osgUtil::Statistics::PrimitiveCountMap& pcm = sceneStats.getPrimitiveCountMap();
+            stats->setAttribute(frameNumber, "Visible number of GL_POINTS", static_cast<double>(pcm[GL_POINTS]));
+            stats->setAttribute(frameNumber, "Visible number of GL_LINES", static_cast<double>(pcm[GL_LINES]));
+            stats->setAttribute(frameNumber, "Visible number of GL_LINE_STRIP", static_cast<double>(pcm[GL_LINE_STRIP]));
+            stats->setAttribute(frameNumber, "Visible number of GL_LINE_LOOP", static_cast<double>(pcm[GL_LINE_LOOP]));
+            stats->setAttribute(frameNumber, "Visible number of GL_TRIANGLES", static_cast<double>(pcm[GL_TRIANGLES]));
+            stats->setAttribute(frameNumber, "Visible number of GL_TRIANGLE_STRIP", static_cast<double>(pcm[GL_TRIANGLE_STRIP]));
+            stats->setAttribute(frameNumber, "Visible number of GL_TRIANGLE_FAN", static_cast<double>(pcm[GL_TRIANGLE_FAN]));
+            stats->setAttribute(frameNumber, "Visible number of GL_QUADS", static_cast<double>(pcm[GL_QUADS]));
+            stats->setAttribute(frameNumber, "Visible number of GL_QUAD_STRIP", static_cast<double>(pcm[GL_QUAD_STRIP]));
+            stats->setAttribute(frameNumber, "Visible number of GL_POLYGON", static_cast<double>(pcm[GL_POLYGON]));
+            
+        }
+
         _drawQueue.add(sceneView);
 
@@ -457,4 +485,5 @@
             stats->setAttribute(frameNumber, "Draw traversal time taken", osg::Timer::instance()->delta_s(beforeDrawTick, afterDrawTick));
         }
+
     }
 
@@ -518,4 +547,18 @@
 
     osg::Timer_t afterCullTick = osg::Timer::instance()->tick();
+
+    if (stats && stats->collectStats("scene"))
+    {
+        osgUtil::Statistics sceneStats;
+        sceneView->getStats(sceneStats);
+
+        stats->setAttribute(frameNumber, "Visible vertex count", static_cast<double>(sceneStats._vertexCount));
+        stats->setAttribute(frameNumber, "Visible number of drawables", static_cast<double>(sceneStats.numDrawables));
+        stats->setAttribute(frameNumber, "Visible number of lights", static_cast<double>(sceneStats.nlights));
+        stats->setAttribute(frameNumber, "Visible number of render bins", static_cast<double>(sceneStats.nbins));
+        stats->setAttribute(frameNumber, "Visible depth", static_cast<double>(sceneStats.depth));
+        stats->setAttribute(frameNumber, "Visible number of materials", static_cast<double>(sceneStats.nummat));
+        stats->setAttribute(frameNumber, "Visible number of impostors", static_cast<double>(sceneStats.nimpostor));
+    }
 
 #if 0
Index: /OpenSceneGraph/trunk/src/osgViewer/StatsHandler.cpp
===================================================================
--- /OpenSceneGraph/trunk/src/osgViewer/StatsHandler.cpp (revision 9385)
+++ /OpenSceneGraph/trunk/src/osgViewer/StatsHandler.cpp (revision 9552)
@@ -98,8 +98,15 @@
                                 ++itr)
                             {
-                                if ((*itr)->getStats()) (*itr)->getStats()->collectStats("rendering",false);
-                                if ((*itr)->getStats()) (*itr)->getStats()->collectStats("gpu",false);
+                                osg::Stats* stats = (*itr)->getStats();
+                                if (stats)
+                                {
+                                    stats->collectStats("rendering",false);
+                                    stats->collectStats("gpu",false);
+                                    stats->collectStats("scene",false);
+                                }
                             }
                             
+                            viewer->getStats()->collectStats("scene",false);
+
                             _camera->setNodeMask(0x0); 
                             _switch->setAllChildrenOff();
@@ -149,4 +156,16 @@
                             _camera->setNodeMask(0xffffffff);
                             _switch->setValue(_cameraSceneChildNum, true);
+
+                            for(osgViewer::ViewerBase::Cameras::iterator itr = cameras.begin();
+                                itr != cameras.end();
+                                ++itr)
+                            {
+                                osg::Stats* stats = (*itr)->getStats();
+                                if (stats)
+                                {
+                                    stats->collectStats("scene",true);
+                                }
+                            }
+
                             break;
                         }
@@ -155,4 +174,7 @@
                             _camera->setNodeMask(0xffffffff);
                             _switch->setValue(_viewerSceneChildNum, true);
+
+                            viewer->getStats()->collectStats("scene",true);
+
                             break;
                         }
@@ -321,15 +343,4 @@
         _cameraNumber(cameraNumber)
     {
-
-        _primitiveModeStreamMap[osg::PrimitiveSet::POINTS] = &stream[0];
-        _primitiveModeStreamMap[osg::PrimitiveSet::LINES] = &stream[1];
-        _primitiveModeStreamMap[osg::PrimitiveSet::LINE_STRIP] = &stream[2];
-        _primitiveModeStreamMap[osg::PrimitiveSet::LINE_LOOP] = &stream[3];
-        _primitiveModeStreamMap[osg::PrimitiveSet::TRIANGLES] = &stream[4];
-        _primitiveModeStreamMap[osg::PrimitiveSet::TRIANGLE_STRIP] = &stream[5];
-        _primitiveModeStreamMap[osg::PrimitiveSet::TRIANGLE_FAN] = &stream[6];
-        _primitiveModeStreamMap[osg::PrimitiveSet::QUADS] = &stream[7];
-        _primitiveModeStreamMap[osg::PrimitiveSet::QUAD_STRIP] = &stream[8];
-        _primitiveModeStreamMap[osg::PrimitiveSet::POLYGON] = &stream[9];
     }
 
@@ -337,4 +348,6 @@
     virtual void drawImplementation(osg::RenderInfo& renderInfo,const osg::Drawable* drawable) const
     {
+        if (!_camera) return;
+
         osgText::Text* text = (osgText::Text*)drawable;
 
@@ -348,15 +361,14 @@
             viewStr.clear();
 
-            osgUtil::Statistics stats;
+            osg::Stats* stats = _camera->getStats();
             osgViewer::Renderer* renderer = dynamic_cast<osgViewer::Renderer*>(_camera->getRenderer());
             
-            if (renderer)
-            {
-                renderer->getSceneView(0)->getStats(stats);
-
+            if (stats && renderer)
+            {
                 viewStr.setf(std::ios::left,std::ios::adjustfield);
                 viewStr.width(14);
 
                 viewStr << std::setw(1) << _cameraNumber  << ": ";
+
                 // Camera name
                 if (_camera->getName().empty())
@@ -364,37 +376,38 @@
                 else
                     viewStr << _camera->getName() << std::endl;
-
-                viewStr << std::setw(7) << stats._vertexCount << std::endl;
-                viewStr << std::setw(7) << stats.numDrawables << std::endl;
-                viewStr << std::setw(7) << stats.nlights << std::endl;
-                viewStr << std::setw(7) << stats.nbins << std::endl;
-                viewStr << std::setw(7) << stats.depth << std::endl;
-                viewStr << std::setw(7) << stats.nummat << std::endl;
-                viewStr << std::setw(7) << stats.nimpostor << std::endl;
-
-                // Initialize primitive streams 
-                PrimitiveModeStreamMap::const_iterator iter;
-                iter = _primitiveModeStreamMap.begin();
-                for(iter = _primitiveModeStreamMap.begin(); iter != _primitiveModeStreamMap.end(); ++iter)
+                    
+                int frameNumber = renderInfo.getState()->getFrameStamp()->getFrameNumber();
+                if (!(renderer->getGraphicsThreadDoesCull()))
                 {
-                    iter->second->str("0");
-                }
-
-                // Write collected primitive values
-                osgUtil::Statistics::PrimitiveCountMap::iterator primitiveItr;
-                for(primitiveItr  = stats.GetPrimitivesBegin(); primitiveItr != stats.GetPrimitivesEnd(); ++primitiveItr)
-                {
-                    PrimitiveModeStreamMap::const_iterator strItr = _primitiveModeStreamMap.find((*primitiveItr).first);
-                    if (strItr != _primitiveModeStreamMap.end())
-                    {
-                        *(strItr->second) <<  (*primitiveItr).second;
-                    }
+                    --frameNumber;
                 }
                 
-                // Concatenate all streams
-                for(iter = _primitiveModeStreamMap.begin(); iter != _primitiveModeStreamMap.end(); ++iter)
-                {
-                    viewStr << iter->second->str() << std::endl;
-                }
+                #define STATS_ATTRIBUTE(str) \
+                    if (stats->getAttribute(frameNumber, str, value)) \
+                        viewStr << std::setw(7) << value << std::endl; \
+                    else \
+                        viewStr << std::setw(7) << "no value" << std::endl; \
+
+                double value = 0.0;
+
+                STATS_ATTRIBUTE("Visible vertex count")
+                STATS_ATTRIBUTE("Visible number of drawables")
+                STATS_ATTRIBUTE("Visible number of lights")
+                STATS_ATTRIBUTE("Visible number of render bins")
+                STATS_ATTRIBUTE("Visible depth")
+                STATS_ATTRIBUTE("Visible number of materials")
+                STATS_ATTRIBUTE("Visible number of impostors")
+
+                STATS_ATTRIBUTE("Visible number of GL_POINTS")
+                STATS_ATTRIBUTE("Visible number of GL_LINES")
+                STATS_ATTRIBUTE("Visible number of GL_LINE_STRIP")
+                STATS_ATTRIBUTE("Visible number of GL_LINE_LOOP")
+                STATS_ATTRIBUTE("Visible number of GL_TRIANGLES")
+                STATS_ATTRIBUTE("Visible number of GL_TRIANGLE_STRIP")
+                STATS_ATTRIBUTE("Visible number of GL_TRIANGLE_FAN")
+                STATS_ATTRIBUTE("Visible number of GL_QUADS")
+                STATS_ATTRIBUTE("Visible number of GL_QUAD_STRIP")
+                STATS_ATTRIBUTE("Visible number of GL_POLYGON")
+
 
                 text->setText(viewStr.str());
@@ -404,10 +417,7 @@
     }
 
-    std::ostringstream stream[10];
-    typedef std::map<GLenum, std::ostringstream*> PrimitiveModeStreamMap;
-    PrimitiveModeStreamMap        _primitiveModeStreamMap;
-    osg::ref_ptr<osg::Camera>    _camera;
-    mutable osg::Timer_t        _tickLastUpdated;
-    int                            _cameraNumber;
+    osg::observer_ptr<osg::Camera>  _camera;
+    mutable osg::Timer_t            _tickLastUpdated;
+    int                             _cameraNumber;
 };
 
@@ -425,4 +435,6 @@
     virtual void drawImplementation(osg::RenderInfo& renderInfo,const osg::Drawable* drawable) const
     {
+        if (!_view) return;
+
         osgText::Text* text = (osgText::Text*)drawable;
 
@@ -433,5 +445,5 @@
         {
             _tickLastUpdated = tick;
-            osg::ref_ptr<osg::Node> sceneRoot = _view ? _view->getScene()->getSceneData() : 0;
+            osg::ref_ptr<osg::Node> sceneRoot = _view.valid() ? _view->getScene()->getSceneData() : 0;
 
             if (sceneRoot.valid())
@@ -494,9 +506,7 @@
     }
 
-    // Using a ref_ptr causes a crash during cleanup
-    //osg::ref_ptr<osgViewer::View>     _view;
-    osgViewer::View*        _view;
-    mutable osg::Timer_t    _tickLastUpdated;
-    int                        _viewNumber;
+    osg::observer_ptr<osgViewer::View>  _view;
+    mutable osg::Timer_t                _tickLastUpdated;
+    int                                 _viewNumber;
 };
 
@@ -1393,6 +1403,6 @@
         viewStr << "Line loops" << std::endl;
         viewStr << "Triangles" << std::endl;
-        viewStr << "Triangle strips" << std::endl;
-        viewStr << "Triangle fans" << std::endl;
+        viewStr << "Tri. strips" << std::endl;
+        viewStr << "Tri. fans" << std::endl;
         viewStr << "Quads" << std::endl;
         viewStr << "Quad strips" << std::endl;
