Refactor Viewer/CompositeViewer so the both inherit from the a ViewerBase class
This commit is contained in:
@@ -28,7 +28,7 @@ CompositeViewer::CompositeViewer()
|
||||
}
|
||||
|
||||
CompositeViewer::CompositeViewer(const CompositeViewer& cv,const osg::CopyOp& copyop):
|
||||
osg::Object(cv,copyop)
|
||||
ViewerBase()
|
||||
{
|
||||
constructorInit();
|
||||
}
|
||||
@@ -53,12 +53,6 @@ CompositeViewer::CompositeViewer(osg::ArgumentParser& arguments)
|
||||
|
||||
void CompositeViewer::constructorInit()
|
||||
{
|
||||
_firstFrame = true;
|
||||
_done = false;
|
||||
_keyEventSetsDone = osgGA::GUIEventAdapter::KEY_Escape;
|
||||
_quitEventSetsDone = true;
|
||||
_threadingModel = ThreadPerContext;
|
||||
_threadsRunning = false;
|
||||
_endBarrierPosition = AfterSwapBuffers;
|
||||
_numThreadsOnBarrier = 0;
|
||||
_startTick = 0;
|
||||
@@ -70,15 +64,14 @@ void CompositeViewer::constructorInit()
|
||||
_frameStamp->setFrameNumber(0);
|
||||
_frameStamp->setReferenceTime(0);
|
||||
_frameStamp->setSimulationTime(0);
|
||||
|
||||
setEventQueue(new osgGA::EventQueue);
|
||||
|
||||
|
||||
_eventVisitor = new osgGA::EventVisitor;
|
||||
_eventVisitor->setFrameStamp(_frameStamp.get());
|
||||
|
||||
|
||||
_updateVisitor = new osgUtil::UpdateVisitor;
|
||||
_updateVisitor->setFrameStamp(_frameStamp.get());
|
||||
|
||||
|
||||
}
|
||||
|
||||
CompositeViewer::~CompositeViewer()
|
||||
@@ -130,6 +123,8 @@ void CompositeViewer::addView(osgViewer::View* view)
|
||||
|
||||
_views.push_back(view);
|
||||
|
||||
view->_viewerBase = this;
|
||||
|
||||
view->setFrameStamp(_frameStamp.get());
|
||||
view->setStats(new osg::Stats("CompositeViewer"));
|
||||
|
||||
@@ -147,6 +142,8 @@ void CompositeViewer::removeView(osgViewer::View* view)
|
||||
bool threadsWereRuinning = _threadsRunning;
|
||||
if (threadsWereRuinning) stopThreading();
|
||||
|
||||
view->_viewerBase = 0;
|
||||
|
||||
_views.erase(itr);
|
||||
|
||||
if (threadsWereRuinning) startThreading();
|
||||
@@ -305,6 +302,21 @@ unsigned int CompositeViewer::computeNumberOfThreadsIncludingMainRequired()
|
||||
return firstContextAsMainThread ? contexts.size() : contexts.size()+1;
|
||||
}
|
||||
|
||||
void CompositeViewer::setUpThreading()
|
||||
{
|
||||
Contexts contexts;
|
||||
getContexts(contexts);
|
||||
|
||||
if (_threadingModel==SingleThreaded)
|
||||
{
|
||||
if (_threadsRunning) stopThreading();
|
||||
}
|
||||
else
|
||||
{
|
||||
if (!_threadsRunning) startThreading();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
void CompositeViewer::startThreading()
|
||||
{
|
||||
@@ -498,6 +510,29 @@ void CompositeViewer::getContexts(Contexts& contexts, bool onlyValid)
|
||||
}
|
||||
}
|
||||
|
||||
void CompositeViewer::getCameras(Cameras& cameras, bool onlyActive)
|
||||
{
|
||||
cameras.clear();
|
||||
|
||||
for(Views::iterator vitr = _views.begin();
|
||||
vitr != _views.end();
|
||||
++vitr)
|
||||
{
|
||||
View* view = vitr->get();
|
||||
|
||||
if (view->getCamera() &&
|
||||
(!onlyActive || (view->getCamera()->getGraphicsContext() && view->getCamera()->getGraphicsContext()->valid())) ) cameras.push_back(view->getCamera());
|
||||
|
||||
for(View::Slaves::iterator itr = view->_slaves.begin();
|
||||
itr != view->_slaves.end();
|
||||
++itr)
|
||||
{
|
||||
if (itr->_camera.valid() &&
|
||||
(!onlyActive || (itr->_camera->getGraphicsContext() && itr->_camera->getGraphicsContext()->valid())) ) cameras.push_back(itr->_camera.get());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void CompositeViewer::getWindows(Windows& windows, bool onlyValid)
|
||||
{
|
||||
windows.clear();
|
||||
@@ -538,6 +573,69 @@ void CompositeViewer::getScenes(Scenes& scenes, bool onlyValid)
|
||||
}
|
||||
}
|
||||
|
||||
void CompositeViewer::getAllThreads(Threads& threads, bool onlyActive)
|
||||
{
|
||||
OperationThreads operationThreads;
|
||||
getOperationThreads(operationThreads);
|
||||
|
||||
for(OperationThreads::iterator itr = operationThreads.begin();
|
||||
itr != operationThreads.end();
|
||||
++itr)
|
||||
{
|
||||
threads.push_back(*itr);
|
||||
}
|
||||
|
||||
Scenes scenes;
|
||||
getScenes(scenes);
|
||||
|
||||
for(Scenes::iterator sitr = scenes.begin();
|
||||
sitr != scenes.end();
|
||||
++sitr)
|
||||
{
|
||||
Scene* scene = *sitr;
|
||||
if (scene->getDatabasePager() &&
|
||||
(!onlyActive || scene->getDatabasePager()->isRunning()))
|
||||
{
|
||||
threads.push_back(scene->getDatabasePager());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void CompositeViewer::getOperationThreads(OperationThreads& threads, bool onlyActive)
|
||||
{
|
||||
threads.clear();
|
||||
|
||||
Contexts contexts;
|
||||
getContexts(contexts);
|
||||
for(Contexts::iterator gcitr = contexts.begin();
|
||||
gcitr != contexts.end();
|
||||
++gcitr)
|
||||
{
|
||||
osg::GraphicsContext* gc = *gcitr;
|
||||
if (gc->getGraphicsThread() &&
|
||||
(!onlyActive || gc->getGraphicsThread()->isRunning()) )
|
||||
{
|
||||
threads.push_back(gc->getGraphicsThread());
|
||||
}
|
||||
}
|
||||
|
||||
Cameras cameras;
|
||||
getCameras(cameras);
|
||||
for(Cameras::iterator citr = cameras.begin();
|
||||
citr != cameras.end();
|
||||
++citr)
|
||||
{
|
||||
osg::Camera* camera = *citr;
|
||||
if (camera->getCameraThread() &&
|
||||
(!onlyActive || camera->getCameraThread()->isRunning()) )
|
||||
{
|
||||
threads.push_back(camera->getCameraThread());
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
void CompositeViewer::realize()
|
||||
{
|
||||
//osg::notify(osg::INFO)<<"CompositeViewer::realize()"<<std::endl;
|
||||
@@ -1062,25 +1160,6 @@ void CompositeViewer::eventTraversal()
|
||||
}
|
||||
|
||||
|
||||
void CompositeViewer::addUpdateOperation(osg::Operation* operation)
|
||||
{
|
||||
if (!operation) return;
|
||||
|
||||
if (!_updateOperations) _updateOperations = new osg::OperationQueue;
|
||||
|
||||
_updateOperations->add(operation);
|
||||
}
|
||||
|
||||
void CompositeViewer::removeUpdateOperation(osg::Operation* operation)
|
||||
{
|
||||
if (!operation) return;
|
||||
|
||||
if (_updateOperations.valid())
|
||||
{
|
||||
_updateOperations->remove(operation);
|
||||
}
|
||||
}
|
||||
|
||||
void CompositeViewer::updateTraversal()
|
||||
{
|
||||
if (_done) return;
|
||||
@@ -1240,3 +1319,24 @@ void CompositeViewer::renderingTraversals()
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void CompositeViewer::getUsage(osg::ApplicationUsage& usage) const
|
||||
{
|
||||
for(Views::const_iterator vitr = _views.begin();
|
||||
vitr != _views.end();
|
||||
++vitr)
|
||||
{
|
||||
const View* view = vitr->get();
|
||||
if (view->getCameraManipulator())
|
||||
{
|
||||
view->getCameraManipulator()->getUsage(usage);
|
||||
}
|
||||
|
||||
for(View::EventHandlers::const_iterator hitr = view->_eventHandlers.begin();
|
||||
hitr != view->_eventHandlers.end();
|
||||
++hitr)
|
||||
{
|
||||
(*hitr)->getUsage(usage);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -27,7 +27,7 @@ StatsHandler::StatsHandler():
|
||||
_keyEventPrintsOutStats('S'),
|
||||
_statsType(NO_STATS),
|
||||
_initialized(false),
|
||||
_threadingModel(0xffff),
|
||||
_threadingModel(ViewerBase::SingleThreaded),
|
||||
_frameRateChildNum(0),
|
||||
_viewerChildNum(0),
|
||||
_sceneChildNum(0),
|
||||
@@ -45,7 +45,7 @@ bool StatsHandler::handle(const osgGA::GUIEventAdapter& ea, osgGA::GUIActionAdap
|
||||
osgViewer::View* view = dynamic_cast<osgViewer::View*>(&aa);
|
||||
if (!view) return false;
|
||||
|
||||
osgViewer::Viewer* viewer = dynamic_cast<osgViewer::Viewer*>(&aa);
|
||||
osgViewer::ViewerBase* viewer = view->getViewerBase();
|
||||
if (viewer && _threadingModelText.valid() && viewer->getThreadingModel()!=_threadingModel)
|
||||
{
|
||||
_threadingModel = viewer->getThreadingModel();
|
||||
@@ -73,8 +73,8 @@ bool StatsHandler::handle(const osgGA::GUIEventAdapter& ea, osgGA::GUIActionAdap
|
||||
|
||||
if (_statsType==LAST) _statsType = NO_STATS;
|
||||
|
||||
osgViewer::View::Cameras cameras;
|
||||
view->getCameras(cameras);
|
||||
osgViewer::ViewerBase::Cameras cameras;
|
||||
viewer->getCameras(cameras);
|
||||
|
||||
switch(_statsType)
|
||||
{
|
||||
@@ -84,7 +84,7 @@ bool StatsHandler::handle(const osgGA::GUIEventAdapter& ea, osgGA::GUIActionAdap
|
||||
view->getStats()->collectStats("event",false);
|
||||
view->getStats()->collectStats("update",false);
|
||||
|
||||
for(osgViewer::View::Cameras::iterator itr = cameras.begin();
|
||||
for(osgViewer::ViewerBase::Cameras::iterator itr = cameras.begin();
|
||||
itr != cameras.end();
|
||||
++itr)
|
||||
{
|
||||
@@ -114,7 +114,7 @@ bool StatsHandler::handle(const osgGA::GUIEventAdapter& ea, osgGA::GUIActionAdap
|
||||
view->getStats()->collectStats("event",true);
|
||||
view->getStats()->collectStats("update",true);
|
||||
|
||||
for(osgViewer::View::Cameras::iterator itr = cameras.begin();
|
||||
for(osgViewer::ViewerBase::Cameras::iterator itr = cameras.begin();
|
||||
itr != cameras.end();
|
||||
++itr)
|
||||
{
|
||||
@@ -151,9 +151,9 @@ bool StatsHandler::handle(const osgGA::GUIEventAdapter& ea, osgGA::GUIActionAdap
|
||||
StatsList statsList;
|
||||
statsList.push_back(view->getStats());
|
||||
|
||||
osgViewer::View::Contexts contexts;
|
||||
view->getContexts(contexts);
|
||||
for(osgViewer::View::Contexts::iterator gcitr = contexts.begin();
|
||||
osgViewer::ViewerBase::Contexts contexts;
|
||||
viewer->getContexts(contexts);
|
||||
for(osgViewer::ViewerBase::Contexts::iterator gcitr = contexts.begin();
|
||||
gcitr != contexts.end();
|
||||
++gcitr)
|
||||
{
|
||||
@@ -214,11 +214,8 @@ void StatsHandler::reset()
|
||||
|
||||
void StatsHandler::setUpHUDCamera(osgViewer::View* view)
|
||||
{
|
||||
|
||||
|
||||
|
||||
osgViewer::GraphicsWindow* window = dynamic_cast<osgViewer::GraphicsWindow*>(_camera->getGraphicsContext());
|
||||
osgViewer::Viewer* viewer = dynamic_cast<osgViewer::Viewer*>(view);
|
||||
osgViewer::ViewerBase* viewer = view->getViewerBase();
|
||||
osg::GraphicsContext* context;
|
||||
|
||||
if (viewer && !window)
|
||||
|
||||
@@ -123,6 +123,45 @@ protected:
|
||||
osg::observer_ptr<osgViewer::View> _view;
|
||||
};
|
||||
|
||||
|
||||
ViewerBase::ViewerBase():
|
||||
osg::Object(true)
|
||||
{
|
||||
_done = false;
|
||||
_keyEventSetsDone = osgGA::GUIEventAdapter::KEY_Escape;
|
||||
_quitEventSetsDone = true;
|
||||
_threadingModel = AutomaticSelection;
|
||||
_threadsRunning = false;
|
||||
|
||||
}
|
||||
|
||||
ViewerBase::ViewerBase(const ViewerBase& base):
|
||||
osg::Object(true)
|
||||
{
|
||||
}
|
||||
|
||||
void ViewerBase::addUpdateOperation(osg::Operation* operation)
|
||||
{
|
||||
if (!operation) return;
|
||||
|
||||
if (!_updateOperations) _updateOperations = new osg::OperationQueue;
|
||||
|
||||
_updateOperations->add(operation);
|
||||
}
|
||||
|
||||
void ViewerBase::removeUpdateOperation(osg::Operation* operation)
|
||||
{
|
||||
if (!operation) return;
|
||||
|
||||
if (_updateOperations.valid())
|
||||
{
|
||||
_updateOperations->remove(operation);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
View::View():
|
||||
_fusionDistanceMode(osgUtil::SceneView::PROPORTIONAL_TO_SCREEN_DISTANCE),
|
||||
_fusionDistanceValue(1.0f)
|
||||
@@ -1626,84 +1665,3 @@ bool View::computeIntersections(float x,float y, osg::NodePath& nodePath, osgUti
|
||||
}
|
||||
}
|
||||
|
||||
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());
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -38,11 +38,15 @@ static osg::ApplicationUsageProxy Viewer_e3(osg::ApplicationUsage::ENVIRONMENTAL
|
||||
|
||||
Viewer::Viewer()
|
||||
{
|
||||
_viewerBase = this;
|
||||
|
||||
constructorInit();
|
||||
}
|
||||
|
||||
Viewer::Viewer(osg::ArgumentParser& arguments)
|
||||
{
|
||||
_viewerBase = this;
|
||||
|
||||
constructorInit();
|
||||
|
||||
std::string filename;
|
||||
@@ -119,16 +123,12 @@ Viewer::Viewer(osg::ArgumentParser& arguments)
|
||||
Viewer::Viewer(const osgViewer::Viewer& viewer, const osg::CopyOp& copyop):
|
||||
View(viewer,copyop)
|
||||
{
|
||||
_viewerBase = this;
|
||||
}
|
||||
|
||||
void Viewer::constructorInit()
|
||||
{
|
||||
_firstFrame = true;
|
||||
_done = false;
|
||||
_keyEventSetsDone = osgGA::GUIEventAdapter::KEY_Escape;
|
||||
_quitEventSetsDone = true;
|
||||
_threadingModel = AutomaticSelection;
|
||||
_threadsRunning = false;
|
||||
_endBarrierPosition = AfterSwapBuffers;
|
||||
_numWindowsOpenAtLastSetUpThreading = 0;
|
||||
|
||||
@@ -343,7 +343,6 @@ void Viewer::setStartTick(osg::Timer_t tick)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void Viewer::setReferenceTime(double time)
|
||||
{
|
||||
osg::Timer_t tick = osg::Timer::instance()->tick();
|
||||
@@ -1412,25 +1411,6 @@ void Viewer::eventTraversal()
|
||||
|
||||
}
|
||||
|
||||
void Viewer::addUpdateOperation(osg::Operation* operation)
|
||||
{
|
||||
if (!operation) return;
|
||||
|
||||
if (!_updateOperations) _updateOperations = new osg::OperationQueue;
|
||||
|
||||
_updateOperations->add(operation);
|
||||
}
|
||||
|
||||
void Viewer::removeUpdateOperation(osg::Operation* operation)
|
||||
{
|
||||
if (!operation) return;
|
||||
|
||||
if (_updateOperations.valid())
|
||||
{
|
||||
_updateOperations->remove(operation);
|
||||
}
|
||||
}
|
||||
|
||||
void Viewer::updateTraversal()
|
||||
{
|
||||
if (_done) return;
|
||||
@@ -1600,6 +1580,93 @@ void Viewer::renderingTraversals()
|
||||
}
|
||||
}
|
||||
|
||||
void Viewer::getScenes(Scenes& scenes, bool onlyValid)
|
||||
{
|
||||
scenes.push_back(_scene.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 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::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::getUsage(osg::ApplicationUsage& usage) const
|
||||
{
|
||||
if (_cameraManipulator.valid())
|
||||
@@ -1613,5 +1680,6 @@ void Viewer::getUsage(osg::ApplicationUsage& usage) const
|
||||
{
|
||||
(*hitr)->getUsage(usage);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user