From Stephan Huber, add basic support for CompositeViewer in StatsHandler

This commit is contained in:
Robert Osfield
2007-09-29 11:41:57 +00:00
parent 41ce67600e
commit 4ef1864432
8 changed files with 226 additions and 130 deletions

View File

@@ -34,6 +34,7 @@
#include <osgGA/TrackballManipulator>
#include <osgGA/FlightManipulator>
#include <osgGA/StateSetManipulator>
#include <osgViewer/ViewerEventHandlers>
#include <osgViewer/CompositeViewer>
@@ -139,12 +140,18 @@ int main( int argc, char **argv )
osgViewer::CompositeViewer viewer;
if (arguments.read("-1"))
{
{
osgViewer::View* view = new osgViewer::View;
view->setSceneData(osgDB::readNodeFile("fountain.osg"));
osg::ref_ptr<osgViewer::StatsHandler> statsHandler = new osgViewer::StatsHandler;
view->addEventHandler( statsHandler.get() );
view->setUpViewAcrossAllScreens();
view->setCameraManipulator(new osgGA::TrackballManipulator);
viewer.addView(view);
@@ -179,6 +186,10 @@ int main( int argc, char **argv )
view->setSceneData(scene.get());
view->setCameraManipulator(new osgGA::TrackballManipulator);
osg::ref_ptr<osgViewer::StatsHandler> statsHandler = new osgViewer::StatsHandler;
view->addEventHandler( statsHandler.get() );
// add the handler for doing the picking
view->addEventHandler(new PickHandler());
}
@@ -237,6 +248,9 @@ int main( int argc, char **argv )
statesetManipulator->setStateSet(view->getCamera()->getOrCreateStateSet());
view->addEventHandler( statesetManipulator.get() );
osg::ref_ptr<osgViewer::StatsHandler> statsHandler = new osgViewer::StatsHandler;
view->addEventHandler( statsHandler.get() );
}
// view two

View File

@@ -175,6 +175,12 @@ class OSGVIEWER_EXPORT View : public osg::View, public osgGA::GUIActionAdapter
virtual void requestRedraw();
virtual void requestContinuousUpdate(bool needed=true);
virtual void requestWarpPointer(float x,float y);
typedef std::vector<osg::Camera*> Cameras;
void getCameras(Cameras& cameras, bool onlyActive=true);
typedef std::vector<osg::GraphicsContext*> Contexts;
void getContexts(Contexts& contexts, bool onlyValid=true);
public:

View File

@@ -180,14 +180,8 @@ class OSGVIEWER_EXPORT Viewer : public osgViewer::View
osg::Camera* getCameraWithFocus() { return _cameraWithFocus.get(); }
const osg::Camera* getCameraWithFocus() const { return _cameraWithFocus.get(); }
typedef std::vector<osg::GraphicsContext*> Contexts;
void getContexts(Contexts& contexts, bool onlyValid=true);
typedef std::vector<osgViewer::GraphicsWindow*> Windows;
void getWindows(Windows& windows, bool onlyValid=true);
typedef std::vector<osg::Camera*> Cameras;
void getCameras(Cameras& cameras, bool onlyActive=true);
typedef std::vector<OpenThreads::Thread*> Threads;
void getAllThreads(Threads& threads, bool onlyActive=true);

View File

@@ -101,7 +101,7 @@ class OSGVIEWER_EXPORT StatsHandler : public osgGA::GUIEventHandler
protected:
void setUpHUDCamera(osgViewer::Viewer* viewer);
void setUpHUDCamera(osgViewer::View* view);
osg::Geometry* createGeometry(const osg::Vec3& pos, float height, const osg::Vec4& colour, unsigned int numBlocks);
@@ -111,7 +111,7 @@ class OSGVIEWER_EXPORT StatsHandler : public osgGA::GUIEventHandler
osg::Node* createCameraStats(const std::string& font, osg::Vec3& pos, float startBlocks, bool aquireGPUStats, float characterSize, osg::Stats* viewerStats, osg::Camera* camera);
void setUpScene(osgViewer::Viewer* viewer);
void setUpScene(osgViewer::View* view);
void updateThreadingModelText();
@@ -125,7 +125,7 @@ class OSGVIEWER_EXPORT StatsHandler : public osgGA::GUIEventHandler
osg::ref_ptr<osg::Switch> _switch;
osgViewer::Viewer::ThreadingModel _threadingModel;
unsigned int _threadingModel;
osg::ref_ptr<osgText::Text> _threadingModelText;
unsigned int _frameRateChildNum;

View File

@@ -131,6 +131,7 @@ void CompositeViewer::addView(osgViewer::View* view)
_views.push_back(view);
view->setFrameStamp(_frameStamp.get());
view->setStats(new osg::Stats("CompositeViewer"));
if (threadsWereRuinning) startThreading();
}
@@ -661,6 +662,10 @@ void CompositeViewer::frame(double simulationTime)
void CompositeViewer::advance(double simulationTime)
{
if (_done) return;
double prevousReferenceTime = _frameStamp->getReferenceTime();
int previousFrameNumber = _frameStamp->getFrameNumber();
_frameStamp->setFrameNumber(_frameStamp->getFrameNumber()+1);
@@ -674,6 +679,24 @@ void CompositeViewer::advance(double simulationTime)
{
_frameStamp->setSimulationTime(simulationTime);
}
for(Views::iterator vitr = _views.begin();
vitr != _views.end();
++vitr)
{
if ((*vitr)->getStats() && (*vitr)->getStats()->collectStats("frame_rate"))
{
// update previous frame stats
double deltaFrameTime = _frameStamp->getReferenceTime() - prevousReferenceTime;
(*vitr)->getStats()->setAttribute(previousFrameNumber, "Frame duration", deltaFrameTime);
(*vitr)->getStats()->setAttribute(previousFrameNumber, "Frame rate", 1.0/deltaFrameTime);
// update current frames stats
(*vitr)->getStats()->setAttribute(_frameStamp->getFrameNumber(), "Reference time", _frameStamp->getReferenceTime());
}
}
}
void CompositeViewer::setCameraWithFocus(osg::Camera* camera)
@@ -703,6 +726,8 @@ void CompositeViewer::eventTraversal()
if (_done) return;
if (_views.empty()) return;
double beginEventTraversal = osg::Timer::instance()->delta_s(_startTick, osg::Timer::instance()->tick());
// osg::notify(osg::NOTICE)<<"CompositeViewer::frameEventTraversal()."<<std::endl;
@@ -1016,6 +1041,24 @@ void CompositeViewer::eventTraversal()
}
}
// stats:
for(Views::iterator vitr = _views.begin();
vitr != _views.end();
++vitr)
{
if ((*vitr)->getStats() && (*vitr)->getStats()->collectStats("event"))
{
double endEventTraversal = osg::Timer::instance()->delta_s(_startTick, osg::Timer::instance()->tick());
// update current frames stats
(*vitr)->getStats()->setAttribute(_frameStamp->getFrameNumber(), "Event traversal begin time", beginEventTraversal);
(*vitr)->getStats()->setAttribute(_frameStamp->getFrameNumber(), "Event traversal end time", endEventTraversal);
(*vitr)->getStats()->setAttribute(_frameStamp->getFrameNumber(), "Event traversal time taken", endEventTraversal-beginEventTraversal);
}
}
}
@@ -1041,6 +1084,8 @@ void CompositeViewer::removeUpdateOperation(osg::Operation* operation)
void CompositeViewer::updateTraversal()
{
if (_done) return;
double beginUpdateTraversal = osg::Timer::instance()->delta_s(_startTick, osg::Timer::instance()->tick());
Scenes scenes;
getScenes(scenes);
@@ -1101,7 +1146,21 @@ void CompositeViewer::updateTraversal()
view->getCamera()->setViewMatrix( view->getCameraManipulator()->getInverseMatrix());
}
view->updateSlaves();
// stats
if (view->getStats() && view->getStats()->collectStats("update"))
{
double endUpdateTraversal = osg::Timer::instance()->delta_s(_startTick, osg::Timer::instance()->tick());
// update current frames stats
view->getStats()->setAttribute(_frameStamp->getFrameNumber(), "Update traversal begin time", beginUpdateTraversal);
view->getStats()->setAttribute(_frameStamp->getFrameNumber(), "Update traversal end time", endUpdateTraversal);
view->getStats()->setAttribute(_frameStamp->getFrameNumber(), "Update traversal time taken", endUpdateTraversal-beginUpdateTraversal);
}
}
}

View File

@@ -27,7 +27,7 @@ StatsHandler::StatsHandler():
_keyEventPrintsOutStats('S'),
_statsType(NO_STATS),
_initialized(false),
_threadingModel(osgViewer::Viewer::SingleThreaded),
_threadingModel(0xffff),
_frameRateChildNum(0),
_viewerChildNum(0),
_sceneChildNum(0),
@@ -41,15 +41,18 @@ StatsHandler::StatsHandler():
bool StatsHandler::handle(const osgGA::GUIEventAdapter& ea, osgGA::GUIActionAdapter& aa)
{
osgViewer::Viewer* viewer = dynamic_cast<osgViewer::Viewer*>(&aa);
if (!viewer) return false;
if (_threadingModelText.valid() && viewer->getThreadingModel()!=_threadingModel)
osgViewer::View* view = dynamic_cast<osgViewer::View*>(&aa);
if (!view) return false;
osgViewer::Viewer* viewer = dynamic_cast<osgViewer::Viewer*>(&aa);
if (viewer && _threadingModelText.valid() && viewer->getThreadingModel()!=_threadingModel)
{
_threadingModel = viewer->getThreadingModel();
updateThreadingModelText();
}
if (ea.getHandled()) return false;
switch(ea.getEventType())
@@ -58,30 +61,30 @@ bool StatsHandler::handle(const osgGA::GUIEventAdapter& ea, osgGA::GUIActionAdap
{
if (ea.getKey()==_keyEventTogglesOnScreenStats)
{
if (viewer->getStats())
if (view->getStats())
{
if (!_initialized)
{
setUpHUDCamera(viewer);
setUpScene(viewer);
setUpHUDCamera(view);
setUpScene(view);
}
++_statsType;
if (_statsType==LAST) _statsType = NO_STATS;
osgViewer::Viewer::Cameras cameras;
viewer->getCameras(cameras);
osgViewer::View::Cameras cameras;
view->getCameras(cameras);
switch(_statsType)
{
case(NO_STATS):
{
viewer->getStats()->collectStats("frame_rate",false);
viewer->getStats()->collectStats("event",false);
viewer->getStats()->collectStats("update",false);
view->getStats()->collectStats("frame_rate",false);
view->getStats()->collectStats("event",false);
view->getStats()->collectStats("update",false);
for(osgViewer::Viewer::Cameras::iterator itr = cameras.begin();
for(osgViewer::View::Cameras::iterator itr = cameras.begin();
itr != cameras.end();
++itr)
{
@@ -95,7 +98,7 @@ bool StatsHandler::handle(const osgGA::GUIEventAdapter& ea, osgGA::GUIActionAdap
}
case(FRAME_RATE):
{
viewer->getStats()->collectStats("frame_rate",true);
view->getStats()->collectStats("frame_rate",true);
_camera->setNodeMask(0xffffffff);
_switch->setValue(_frameRateChildNum, true);
@@ -103,15 +106,15 @@ bool StatsHandler::handle(const osgGA::GUIEventAdapter& ea, osgGA::GUIActionAdap
}
case(VIEWER_STATS):
{
if (viewer->getDatabasePager() && viewer->getDatabasePager()->isRunning())
if (view->getDatabasePager() && view->getDatabasePager()->isRunning())
{
viewer->getDatabasePager()->resetStats();
view->getDatabasePager()->resetStats();
}
viewer->getStats()->collectStats("event",true);
viewer->getStats()->collectStats("update",true);
view->getStats()->collectStats("event",true);
view->getStats()->collectStats("update",true);
for(osgViewer::Viewer::Cameras::iterator itr = cameras.begin();
for(osgViewer::View::Cameras::iterator itr = cameras.begin();
itr != cameras.end();
++itr)
{
@@ -141,16 +144,16 @@ bool StatsHandler::handle(const osgGA::GUIEventAdapter& ea, osgGA::GUIActionAdap
}
if (ea.getKey()==_keyEventPrintsOutStats)
{
if (viewer->getStats())
if (view->getStats())
{
osg::notify(osg::NOTICE)<<std::endl<<"Stats report:"<<std::endl;
typedef std::vector<osg::Stats*> StatsList;
StatsList statsList;
statsList.push_back(viewer->getStats());
statsList.push_back(view->getStats());
osgViewer::Viewer::Contexts contexts;
viewer->getContexts(contexts);
for(osgViewer::Viewer::Contexts::iterator gcitr = contexts.begin();
osgViewer::View::Contexts contexts;
view->getContexts(contexts);
for(osgViewer::View::Contexts::iterator gcitr = contexts.begin();
gcitr != contexts.end();
++gcitr)
{
@@ -166,7 +169,7 @@ bool StatsHandler::handle(const osgGA::GUIEventAdapter& ea, osgGA::GUIActionAdap
}
}
for(int i = viewer->getStats()->getEarliestFrameNumber(); i<= viewer->getStats()->getLatestFrameNumber()-1; ++i)
for(int i = view->getStats()->getEarliestFrameNumber(); i<= view->getStats()->getLatestFrameNumber()-1; ++i)
{
for(StatsList::iterator itr = statsList.begin();
itr != statsList.end();
@@ -198,6 +201,8 @@ void StatsHandler::updateThreadingModelText()
case(osgViewer::Viewer::DrawThreadPerContext): _threadingModelText->setText("ThreadingModel: DrawThreadPerContext"); break;
case(osgViewer::Viewer::CullThreadPerCameraDrawThreadPerContext): _threadingModelText->setText("ThreadingModel: CullThreadPerCameraDrawThreadPerContext"); break;
case(osgViewer::Viewer::AutomaticSelection): _threadingModelText->setText("ThreadingModel: AutomaticSelection"); break;
default:
_threadingModelText->setText("ThreadingModel: unknown"); break;
}
}
@@ -207,11 +212,16 @@ void StatsHandler::reset()
_camera->setGraphicsContext(0);
}
void StatsHandler::setUpHUDCamera(osgViewer::Viewer* viewer)
void StatsHandler::setUpHUDCamera(osgViewer::View* view)
{
osgViewer::GraphicsWindow* window = dynamic_cast<osgViewer::GraphicsWindow*>(_camera->getGraphicsContext());
if (!window)
osgViewer::Viewer* viewer = dynamic_cast<osgViewer::Viewer*>(view);
osg::GraphicsContext* context;
if (viewer && !window)
{
osgViewer::Viewer::Windows windows;
viewer->getWindows(windows);
@@ -220,10 +230,16 @@ void StatsHandler::setUpHUDCamera(osgViewer::Viewer* viewer)
window = windows.front();
_camera->setGraphicsContext(window);
context = window;
}
else if (!viewer)
{
context = view->getCamera()->getGraphicsContext();
}
_camera->setGraphicsContext(context);
_camera->setViewport(0, 0, window->getTraits()->width, window->getTraits()->height);
_camera->setViewport(0, 0, context->getTraits()->width, context->getTraits()->height);
_camera->setRenderOrder(osg::Camera::POST_RENDER, 10);
_camera->setProjectionMatrix(osg::Matrix::ortho2D(0,1280,0,1024));
@@ -533,7 +549,7 @@ osg::Geometry* StatsHandler::createTick(const osg::Vec3& pos, float height, cons
return geometry;
}
void StatsHandler::setUpScene(osgViewer::Viewer* viewer)
void StatsHandler::setUpScene(osgViewer::View* view)
{
_switch = new osg::Switch;
@@ -551,15 +567,15 @@ void StatsHandler::setUpScene(osgViewer::Viewer* viewer)
// collect all the relevant camers
typedef std::vector<osg::Camera*> Cameras;
Cameras cameras;
if (viewer->getCamera()->getStats() && viewer->getCamera()->getGraphicsContext())
if (view->getCamera()->getStats() && view->getCamera()->getGraphicsContext())
{
cameras.push_back(viewer->getCamera());
cameras.push_back(view->getCamera());
}
for(unsigned int si=0; si<viewer->getNumSlaves(); ++si)
for(unsigned int si=0; si<view->getNumSlaves(); ++si)
{
if (viewer->getSlave(si)._camera->getStats() && viewer->getSlave(si)._camera->getGraphicsContext())
if (view->getSlave(si)._camera->getStats() && view->getSlave(si)._camera->getGraphicsContext())
{
cameras.push_back(viewer->getSlave(si)._camera.get());
cameras.push_back(view->getSlave(si)._camera.get());
}
}
@@ -621,7 +637,7 @@ void StatsHandler::setUpScene(osgViewer::Viewer* viewer)
frameRateValue->setPosition(pos);
frameRateValue->setText("0.0");
frameRateValue->setDrawCallback(new TextDrawCallback(viewer->getStats(),"Frame rate",-1, true, 1.0));
frameRateValue->setDrawCallback(new TextDrawCallback(view->getStats(),"Frame rate",-1, true, 1.0));
pos.y() -= characterSize*1.5f;
@@ -680,11 +696,11 @@ void StatsHandler::setUpScene(osgViewer::Viewer* viewer)
eventValue->setPosition(pos);
eventValue->setText("0.0");
eventValue->setDrawCallback(new TextDrawCallback(viewer->getStats(),"Event traversal time taken",-1, false, 1000.0));
eventValue->setDrawCallback(new TextDrawCallback(view->getStats(),"Event traversal time taken",-1, false, 1000.0));
pos.x() = startBlocks;
osg::Geometry* geometry = createGeometry(pos, characterSize *0.8, colorUpdateAlpha, _numBlocks);
geometry->setDrawCallback(new BlockDrawCallback(this, startBlocks, viewer->getStats(), viewer->getStats(), "Event traversal begin time", "Event traversal end time", -1, _numBlocks));
geometry->setDrawCallback(new BlockDrawCallback(this, startBlocks, view->getStats(), view->getStats(), "Event traversal begin time", "Event traversal end time", -1, _numBlocks));
geode->addDrawable(geometry);
pos.y() -= characterSize*1.5f;
@@ -713,11 +729,11 @@ void StatsHandler::setUpScene(osgViewer::Viewer* viewer)
updateValue->setPosition(pos);
updateValue->setText("0.0");
updateValue->setDrawCallback(new TextDrawCallback(viewer->getStats(),"Update traversal time taken",-1, false, 1000.0));
updateValue->setDrawCallback(new TextDrawCallback(view->getStats(),"Update traversal time taken",-1, false, 1000.0));
pos.x() = startBlocks;
osg::Geometry* geometry = createGeometry(pos, characterSize *0.8, colorUpdateAlpha, _numBlocks);
geometry->setDrawCallback(new BlockDrawCallback(this, startBlocks, viewer->getStats(), viewer->getStats(), "Update traversal begin time", "Update traversal end time", -1, _numBlocks));
geometry->setDrawCallback(new BlockDrawCallback(this, startBlocks, view->getStats(), view->getStats(), "Update traversal begin time", "Update traversal end time", -1, _numBlocks));
geode->addDrawable(geometry);
pos.y() -= characterSize*1.5f;
@@ -731,7 +747,7 @@ void StatsHandler::setUpScene(osgViewer::Viewer* viewer)
citr != cameras.end();
++citr)
{
group->addChild(createCameraStats(font, pos, startBlocks, aquireGPUStats, characterSize, viewer->getStats(), *citr));
group->addChild(createCameraStats(font, pos, startBlocks, aquireGPUStats, characterSize, view->getStats(), *citr));
}
@@ -750,12 +766,12 @@ void StatsHandler::setUpScene(osgViewer::Viewer* viewer)
geode->addDrawable(ticks);
osg::Geometry* frameMarkers = createFrameMarkers(pos, height, colourTicks, _numBlocks + 1);
frameMarkers->setDrawCallback(new FrameMarkerDrawCallback(this, startBlocks, viewer->getStats(), 0, _numBlocks + 1));
frameMarkers->setDrawCallback(new FrameMarkerDrawCallback(this, startBlocks, view->getStats(), 0, _numBlocks + 1));
geode->addDrawable(frameMarkers);
}
osgDB::DatabasePager* dp = viewer->getDatabasePager();
osgDB::DatabasePager* dp = view->getDatabasePager();
if (dp && dp->isRunning())
{
pos.y() -= characterSize*1.5f;

View File

@@ -1625,3 +1625,85 @@ bool View::computeIntersections(float x,float y, osg::NodePath& nodePath, osgUti
return false;
}
}
void View::getCameras(Cameras& cameras, bool onlyActive)
{
cameras.clear();
if (_camera.valid() &&
(!onlyActive || (_camera->getGraphicsContext() && _camera->getGraphicsContext()->valid())) ) cameras.push_back(_camera.get());
for(Slaves::iterator itr = _slaves.begin();
itr != _slaves.end();
++itr)
{
if (itr->_camera.valid() &&
(!onlyActive || (itr->_camera->getGraphicsContext() && itr->_camera->getGraphicsContext()->valid())) ) cameras.push_back(itr->_camera.get());
}
}
struct LessGraphicsContext
{
bool operator () (const osg::GraphicsContext* lhs, const osg::GraphicsContext* rhs) const
{
int screenLeft = lhs->getTraits()? lhs->getTraits()->screenNum : 0;
int screenRight = rhs->getTraits()? rhs->getTraits()->screenNum : 0;
if (screenLeft < screenRight) return true;
if (screenLeft > screenRight) return false;
screenLeft = lhs->getTraits()? lhs->getTraits()->x : 0;
screenRight = rhs->getTraits()? rhs->getTraits()->x : 0;
if (screenLeft < screenRight) return true;
if (screenLeft > screenRight) return false;
screenLeft = lhs->getTraits()? lhs->getTraits()->y : 0;
screenRight = rhs->getTraits()? rhs->getTraits()->y : 0;
if (screenLeft < screenRight) return true;
if (screenLeft > screenRight) return false;
return lhs < rhs;
}
};
void View::getContexts(Contexts& contexts, bool onlyValid)
{
typedef std::set<osg::GraphicsContext*> ContextSet;
ContextSet contextSet;
if (_camera.valid() &&
_camera->getGraphicsContext() &&
(_camera->getGraphicsContext()->valid() || !onlyValid))
{
contextSet.insert(_camera->getGraphicsContext());
}
for(unsigned int i=0; i<getNumSlaves(); ++i)
{
Slave& slave = getSlave(i);
if (slave._camera.valid() &&
slave._camera->getGraphicsContext() &&
(slave._camera->getGraphicsContext()->valid() || !onlyValid))
{
contextSet.insert(slave._camera->getGraphicsContext());
}
}
contexts.clear();
contexts.reserve(contextSet.size());
for(ContextSet::iterator itr = contextSet.begin();
itr != contextSet.end();
++itr)
{
contexts.push_back(const_cast<osg::GraphicsContext*>(*itr));
}
if (contexts.size()>=2)
{
std::sort(contexts.begin(), contexts.end(), LessGraphicsContext());
}
}

View File

@@ -824,67 +824,8 @@ void Viewer::checkWindowStatus()
}
struct LessGraphicsContext
{
bool operator () (const osg::GraphicsContext* lhs, const osg::GraphicsContext* rhs) const
{
int screenLeft = lhs->getTraits()? lhs->getTraits()->screenNum : 0;
int screenRight = rhs->getTraits()? rhs->getTraits()->screenNum : 0;
if (screenLeft < screenRight) return true;
if (screenLeft > screenRight) return false;
screenLeft = lhs->getTraits()? lhs->getTraits()->x : 0;
screenRight = rhs->getTraits()? rhs->getTraits()->x : 0;
if (screenLeft < screenRight) return true;
if (screenLeft > screenRight) return false;
screenLeft = lhs->getTraits()? lhs->getTraits()->y : 0;
screenRight = rhs->getTraits()? rhs->getTraits()->y : 0;
if (screenLeft < screenRight) return true;
if (screenLeft > screenRight) return false;
return lhs < rhs;
}
};
void Viewer::getContexts(Contexts& contexts, bool onlyValid)
{
typedef std::set<osg::GraphicsContext*> ContextSet;
ContextSet contextSet;
if (_camera.valid() &&
_camera->getGraphicsContext() &&
(_camera->getGraphicsContext()->valid() || !onlyValid))
{
contextSet.insert(_camera->getGraphicsContext());
}
for(unsigned int i=0; i<getNumSlaves(); ++i)
{
Slave& slave = getSlave(i);
if (slave._camera.valid() &&
slave._camera->getGraphicsContext() &&
(slave._camera->getGraphicsContext()->valid() || !onlyValid))
{
contextSet.insert(slave._camera->getGraphicsContext());
}
}
contexts.clear();
contexts.reserve(contextSet.size());
for(ContextSet::iterator itr = contextSet.begin();
itr != contextSet.end();
++itr)
{
contexts.push_back(const_cast<osg::GraphicsContext*>(*itr));
}
if (contexts.size()>=2)
{
std::sort(contexts.begin(), contexts.end(), LessGraphicsContext());
}
}
void Viewer::getWindows(Windows& windows, bool onlyValid)
{
@@ -902,22 +843,6 @@ void Viewer::getWindows(Windows& windows, bool onlyValid)
}
}
void Viewer::getCameras(Cameras& cameras, bool onlyActive)
{
cameras.clear();
if (_camera.valid() &&
(!onlyActive || (_camera->getGraphicsContext() && _camera->getGraphicsContext()->valid())) ) cameras.push_back(_camera.get());
for(Slaves::iterator itr = _slaves.begin();
itr != _slaves.end();
++itr)
{
if (itr->_camera.valid() &&
(!onlyActive || (itr->_camera->getGraphicsContext() && itr->_camera->getGraphicsContext()->valid())) ) cameras.push_back(itr->_camera.get());
}
}
void Viewer::getAllThreads(Threads& threads, bool onlyActive)
{