diff --git a/include/osgProducer/ViewerEventHandler b/include/osgProducer/ViewerEventHandler index 9c217f9c8..47e8e665f 100644 --- a/include/osgProducer/ViewerEventHandler +++ b/include/osgProducer/ViewerEventHandler @@ -72,6 +72,9 @@ class OSGPRODUCER_EXPORT ViewerEventHandler : public osgGA::GUIEventHandler bool _firstTimeTogglingFullScreen; + class CameraBarrierCallback; + CameraBarrierCallback* _cameraBarrierCallback; + class StatsAndHelpDrawCallback; StatsAndHelpDrawCallback* _statsAndHelpDrawCallback; @@ -79,7 +82,6 @@ class OSGPRODUCER_EXPORT ViewerEventHandler : public osgGA::GUIEventHandler typedef std::vector SnapImageDrawCallbackList; SnapImageDrawCallbackList _snapImageDrawCallbackList; std::string _writeImageFileName; - }; } diff --git a/src/osgProducer/ViewerEventHandler.cpp b/src/osgProducer/ViewerEventHandler.cpp index c4f870625..29a0f104e 100644 --- a/src/osgProducer/ViewerEventHandler.cpp +++ b/src/osgProducer/ViewerEventHandler.cpp @@ -5,6 +5,7 @@ #include #include #include +#include #include @@ -12,6 +13,55 @@ using namespace osgProducer; +class ViewerEventHandler::CameraBarrierCallback : public Producer::Camera::Callback, public OpenThreads::Barrier +{ +public: + CameraBarrierCallback(unsigned int numThreads): + OpenThreads::Barrier(numThreads), + _doBlock(false) {} + + virtual ~CameraBarrierCallback() + { + release(); + } + + void setDoBlock(bool block) + { + OpenThreads::ScopedLock lock(_mutex); + if (_doBlock != block) + { + if (_doBlock) release(); + + _doBlock = block; + + // osg::notify(osg::NOTICE)<<"setDoBlock("< lock(_mutex); + doBlock = _doBlock; + } + + if (doBlock) + { + //osg::notify(osg::NOTICE)<<"Entering block()"<getCameraConfig(); + + _cameraBarrierCallback = 0; + if (cfg->getNumberOfCameras()>1) + { + // use a barrier to make that stats only runs once all the threads have done their drawing. + _cameraBarrierCallback = new CameraBarrierCallback(cfg->getNumberOfCameras()); + for(unsigned int i=0;igetNumberOfCameras();++i) + { + cfg->getCamera(i)->addPostDrawCallback(_cameraBarrierCallback); + } + } + Producer::Camera *cam = cfg->getCamera(0); _statsAndHelpDrawCallback = new StatsAndHelpDrawCallback(this,0); @@ -907,7 +969,12 @@ void ViewerEventHandler::setFrameStatsMode(FrameStatsMode mode) else { _cg->setInstrumentationMode(true); - } + } + + if (_cameraBarrierCallback) + { + _cameraBarrierCallback->setDoBlock(_frameStatsMode>=SCENE_STATS); + } } bool ViewerEventHandler::handle(const osgGA::GUIEventAdapter& ea,osgGA::GUIActionAdapter& aa)