Preliminary work on support for a texture object pool that is designed to help manage resources down the GPU more tightly.
This commit is contained in:
@@ -1,13 +1,13 @@
|
||||
/* -*-c++-*- OpenSceneGraph - Copyright (C) 1998-2006 Robert Osfield
|
||||
/* -*-c++-*- OpenSceneGraph - Copyright (C) 1998-2006 Robert Osfield
|
||||
*
|
||||
* This library is open source and may be redistributed and/or modified under
|
||||
* the terms of the OpenSceneGraph Public License (OSGPL) version 0.0 or
|
||||
* This library is open source and may be redistributed and/or modified under
|
||||
* the terms of the OpenSceneGraph Public License (OSGPL) version 0.0 or
|
||||
* (at your option) any later version. The full license is in LICENSE file
|
||||
* included with this distribution, and on the openscenegraph.org website.
|
||||
*
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* OpenSceneGraph Public License for more details.
|
||||
*/
|
||||
|
||||
@@ -84,10 +84,10 @@ void CompositeViewer::constructorInit()
|
||||
_frameStamp->setFrameNumber(0);
|
||||
_frameStamp->setReferenceTime(0);
|
||||
_frameStamp->setSimulationTime(0);
|
||||
|
||||
|
||||
_eventVisitor = new osgGA::EventVisitor;
|
||||
_eventVisitor->setFrameStamp(_frameStamp.get());
|
||||
|
||||
|
||||
_updateVisitor = new osgUtil::UpdateVisitor;
|
||||
_updateVisitor->setFrameStamp(_frameStamp.get());
|
||||
|
||||
@@ -99,10 +99,10 @@ CompositeViewer::~CompositeViewer()
|
||||
osg::notify(osg::INFO)<<"CompositeViewer::~CompositeViewer()"<<std::endl;
|
||||
|
||||
stopThreading();
|
||||
|
||||
|
||||
Scenes scenes;
|
||||
getScenes(scenes);
|
||||
|
||||
|
||||
for(Scenes::iterator sitr = scenes.begin();
|
||||
sitr != scenes.end();
|
||||
++sitr)
|
||||
@@ -148,28 +148,28 @@ void CompositeViewer::addView(osgViewer::View* view)
|
||||
if (!view) return;
|
||||
|
||||
bool alreadyRealized = isRealized();
|
||||
|
||||
|
||||
bool threadsWereRunning = _threadsRunning;
|
||||
if (threadsWereRunning) stopThreading();
|
||||
|
||||
_views.push_back(view);
|
||||
|
||||
|
||||
view->_viewerBase = this;
|
||||
|
||||
|
||||
if (view->getSceneData())
|
||||
{
|
||||
{
|
||||
// make sure that existing scene graph objects are allocated with thread safe ref/unref
|
||||
if (getThreadingModel()!=ViewerBase::SingleThreaded)
|
||||
if (getThreadingModel()!=ViewerBase::SingleThreaded)
|
||||
{
|
||||
view->getSceneData()->setThreadSafeRefUnref(true);
|
||||
}
|
||||
|
||||
|
||||
// update the scene graph so that it has enough GL object buffer memory for the graphics contexts that will be using it.
|
||||
view->getSceneData()->resizeGLObjectBuffers(osg::DisplaySettings::instance()->getMaxNumberOfGraphicsContexts());
|
||||
}
|
||||
|
||||
view->setFrameStamp(_frameStamp.get());
|
||||
|
||||
|
||||
if (alreadyRealized)
|
||||
{
|
||||
Contexts contexts;
|
||||
@@ -196,7 +196,7 @@ void CompositeViewer::addView(osgViewer::View* view)
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
if (threadsWereRunning) startThreading();
|
||||
}
|
||||
|
||||
@@ -236,7 +236,7 @@ bool CompositeViewer::isRealized() const
|
||||
{
|
||||
if ((*citr)->isRealized()) ++numRealizedWindows;
|
||||
}
|
||||
|
||||
|
||||
return numRealizedWindows > 0;
|
||||
}
|
||||
|
||||
@@ -280,7 +280,7 @@ int CompositeViewer::run()
|
||||
view->setCameraManipulator(new osgGA::TrackballManipulator());
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
setReleaseContextAtEndOfFrameHint(false);
|
||||
|
||||
return ViewerBase::run();
|
||||
@@ -289,14 +289,14 @@ int CompositeViewer::run()
|
||||
void CompositeViewer::setStartTick(osg::Timer_t tick)
|
||||
{
|
||||
_startTick = tick;
|
||||
|
||||
|
||||
for(RefViews::iterator vitr = _views.begin();
|
||||
vitr != _views.end();
|
||||
++vitr)
|
||||
{
|
||||
(*vitr)->setStartTick(tick);
|
||||
}
|
||||
|
||||
|
||||
Contexts contexts;
|
||||
getContexts(contexts,false);
|
||||
|
||||
@@ -380,14 +380,14 @@ void CompositeViewer::getContexts(Contexts& contexts, bool onlyValid)
|
||||
void CompositeViewer::getCameras(Cameras& cameras, bool onlyActive)
|
||||
{
|
||||
cameras.clear();
|
||||
|
||||
|
||||
for(RefViews::iterator vitr = _views.begin();
|
||||
vitr != _views.end();
|
||||
++vitr)
|
||||
{
|
||||
View* view = vitr->get();
|
||||
|
||||
if (view->getCamera() &&
|
||||
if (view->getCamera() &&
|
||||
(!onlyActive || (view->getCamera()->getGraphicsContext() && view->getCamera()->getGraphicsContext()->valid())) ) cameras.push_back(view->getCamera());
|
||||
|
||||
for(View::Slaves::iterator itr = view->_slaves.begin();
|
||||
@@ -399,7 +399,7 @@ void CompositeViewer::getCameras(Cameras& cameras, bool onlyActive)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void CompositeViewer::getScenes(Scenes& scenes, bool onlyValid)
|
||||
{
|
||||
scenes.clear();
|
||||
@@ -441,7 +441,7 @@ void CompositeViewer::getAllThreads(Threads& threads, bool onlyActive)
|
||||
|
||||
OperationThreads operationThreads;
|
||||
getOperationThreads(operationThreads);
|
||||
|
||||
|
||||
for(OperationThreads::iterator itr = operationThreads.begin();
|
||||
itr != operationThreads.end();
|
||||
++itr)
|
||||
@@ -451,7 +451,7 @@ void CompositeViewer::getAllThreads(Threads& threads, bool onlyActive)
|
||||
|
||||
Scenes scenes;
|
||||
getScenes(scenes);
|
||||
|
||||
|
||||
for(Scenes::iterator sitr = scenes.begin();
|
||||
sitr != scenes.end();
|
||||
++sitr)
|
||||
@@ -476,7 +476,7 @@ void CompositeViewer::getAllThreads(Threads& threads, bool onlyActive)
|
||||
void CompositeViewer::getOperationThreads(OperationThreads& threads, bool onlyActive)
|
||||
{
|
||||
threads.clear();
|
||||
|
||||
|
||||
Contexts contexts;
|
||||
getContexts(contexts);
|
||||
for(Contexts::iterator gcitr = contexts.begin();
|
||||
@@ -484,13 +484,13 @@ void CompositeViewer::getOperationThreads(OperationThreads& threads, bool onlyAc
|
||||
++gcitr)
|
||||
{
|
||||
osg::GraphicsContext* gc = *gcitr;
|
||||
if (gc->getGraphicsThread() &&
|
||||
if (gc->getGraphicsThread() &&
|
||||
(!onlyActive || gc->getGraphicsThread()->isRunning()) )
|
||||
{
|
||||
threads.push_back(gc->getGraphicsThread());
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Cameras cameras;
|
||||
getCameras(cameras);
|
||||
for(Cameras::iterator citr = cameras.begin();
|
||||
@@ -498,19 +498,19 @@ void CompositeViewer::getOperationThreads(OperationThreads& threads, bool onlyAc
|
||||
++citr)
|
||||
{
|
||||
osg::Camera* camera = *citr;
|
||||
if (camera->getCameraThread() &&
|
||||
if (camera->getCameraThread() &&
|
||||
(!onlyActive || camera->getCameraThread()->isRunning()) )
|
||||
{
|
||||
threads.push_back(camera->getCameraThread());
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
void CompositeViewer::realize()
|
||||
{
|
||||
//osg::notify(osg::INFO)<<"CompositeViewer::realize()"<<std::endl;
|
||||
|
||||
|
||||
setCameraWithFocus(0);
|
||||
|
||||
if (_views.empty())
|
||||
@@ -522,14 +522,14 @@ void CompositeViewer::realize()
|
||||
|
||||
Contexts contexts;
|
||||
getContexts(contexts);
|
||||
|
||||
|
||||
if (contexts.empty())
|
||||
{
|
||||
osg::notify(osg::INFO)<<"CompositeViewer::realize() - No valid contexts found, setting up view across all screens."<<std::endl;
|
||||
|
||||
// no windows are already set up so set up a default view
|
||||
|
||||
// no windows are already set up so set up a default view
|
||||
_views[0]->setUpViewAcrossAllScreens();
|
||||
|
||||
|
||||
getContexts(contexts);
|
||||
}
|
||||
|
||||
@@ -539,24 +539,34 @@ void CompositeViewer::realize()
|
||||
_done = true;
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
unsigned int maxTexturePoolSize = osg::DisplaySettings::instance()->getMaxTexturePoolSize();
|
||||
unsigned int maxVBOPoolSize = osg::DisplaySettings::instance()->getMaxVBOPoolSize();
|
||||
unsigned int maxFBOPoolSize = osg::DisplaySettings::instance()->getMaxFBOPoolSize();
|
||||
|
||||
for(Contexts::iterator citr = contexts.begin();
|
||||
citr != contexts.end();
|
||||
++citr)
|
||||
{
|
||||
osg::GraphicsContext* gc = *citr;
|
||||
|
||||
// set the pool sizes, 0 the default will result in no GL object pools.
|
||||
gc->getState()->setMaxTexturePoolSize(maxTexturePoolSize);
|
||||
gc->getState()->setMaxVBOPoolSize(maxVBOPoolSize);
|
||||
gc->getState()->setMaxFBOPoolSize(maxFBOPoolSize);
|
||||
|
||||
gc->realize();
|
||||
|
||||
if (_realizeOperation.valid() && gc->valid())
|
||||
|
||||
if (_realizeOperation.valid() && gc->valid())
|
||||
{
|
||||
gc->makeCurrent();
|
||||
|
||||
|
||||
(*_realizeOperation)(gc);
|
||||
|
||||
|
||||
gc->releaseContext();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// attach contexts to _incrementalCompileOperation if attached.
|
||||
if (_incrementalCompileOperation) _incrementalCompileOperation->assignContexts(contexts);
|
||||
|
||||
@@ -571,12 +581,12 @@ void CompositeViewer::realize()
|
||||
osgViewer::GraphicsWindow* gw = dynamic_cast<osgViewer::GraphicsWindow*>(*citr);
|
||||
if (gw)
|
||||
{
|
||||
gw->grabFocusIfPointerInWindow();
|
||||
gw->grabFocusIfPointerInWindow();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
startThreading();
|
||||
|
||||
// initialize the global timer to be relative to the current time.
|
||||
@@ -599,7 +609,7 @@ void CompositeViewer::realize()
|
||||
gc->createGraphicsThread();
|
||||
gc->getGraphicsThread()->setProcessorAffinity(processNum % numProcessors);
|
||||
gc->getGraphicsThread()->startThread();
|
||||
|
||||
|
||||
++processNum;
|
||||
}
|
||||
}
|
||||
@@ -610,7 +620,7 @@ void CompositeViewer::realize()
|
||||
void CompositeViewer::advance(double simulationTime)
|
||||
{
|
||||
if (_done) return;
|
||||
|
||||
|
||||
double prevousReferenceTime = _frameStamp->getReferenceTime();
|
||||
int previousFrameNumber = _frameStamp->getFrameNumber();
|
||||
|
||||
@@ -627,7 +637,7 @@ void CompositeViewer::advance(double simulationTime)
|
||||
{
|
||||
_frameStamp->setSimulationTime(simulationTime);
|
||||
}
|
||||
|
||||
|
||||
if (getViewerStats() && getViewerStats()->collectStats("frame_rate"))
|
||||
{
|
||||
// update previous frame stats
|
||||
@@ -652,7 +662,7 @@ void CompositeViewer::setCameraWithFocus(osg::Camera* camera)
|
||||
++vitr)
|
||||
{
|
||||
View* view = vitr->get();
|
||||
if (view->containsCamera(camera))
|
||||
if (view->containsCamera(camera))
|
||||
{
|
||||
_viewWithFocus = view;
|
||||
return;
|
||||
@@ -666,18 +676,18 @@ void CompositeViewer::setCameraWithFocus(osg::Camera* camera)
|
||||
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;
|
||||
|
||||
|
||||
// need to copy events from the GraphicsWindow's into local EventQueue;
|
||||
|
||||
|
||||
typedef std::map<osgViewer::View*, osgGA::EventQueue::Events> ViewEventsMap;
|
||||
ViewEventsMap viewEventsMap;
|
||||
|
||||
|
||||
Contexts contexts;
|
||||
getContexts(contexts);
|
||||
|
||||
@@ -685,11 +695,11 @@ void CompositeViewer::eventTraversal()
|
||||
getScenes(scenes);
|
||||
|
||||
osgViewer::View* masterView = getViewWithFocus() ? getViewWithFocus() : _views[0].get();
|
||||
|
||||
|
||||
osg::Camera* masterCamera = masterView->getCamera();
|
||||
osgGA::GUIEventAdapter* eventState = masterView->getEventQueue()->getCurrentEventState();
|
||||
osgGA::GUIEventAdapter* eventState = masterView->getEventQueue()->getCurrentEventState();
|
||||
osg::Matrix masterCameraVPW = masterCamera->getViewMatrix() * masterCamera->getProjectionMatrix();
|
||||
if (masterCamera->getViewport())
|
||||
if (masterCamera->getViewport())
|
||||
{
|
||||
osg::Viewport* viewport = masterCamera->getViewport();
|
||||
masterCameraVPW *= viewport->computeWindowMatrix();
|
||||
@@ -703,27 +713,27 @@ void CompositeViewer::eventTraversal()
|
||||
if (gw)
|
||||
{
|
||||
gw->checkEvents();
|
||||
|
||||
|
||||
osgGA::EventQueue::Events gw_events;
|
||||
gw->getEventQueue()->takeEvents(gw_events);
|
||||
|
||||
|
||||
osgGA::EventQueue::Events::iterator itr;
|
||||
for(itr = gw_events.begin();
|
||||
itr != gw_events.end();
|
||||
++itr)
|
||||
{
|
||||
osgGA::GUIEventAdapter* event = itr->get();
|
||||
|
||||
|
||||
//osg::notify(osg::NOTICE)<<"event->getGraphicsContext()="<<event->getGraphicsContext()<<std::endl;
|
||||
|
||||
|
||||
bool pointerEvent = false;
|
||||
|
||||
float x = event->getX();
|
||||
float y = event->getY();
|
||||
|
||||
|
||||
bool invert_y = event->getMouseYOrientation()==osgGA::GUIEventAdapter::Y_INCREASING_DOWNWARDS;
|
||||
if (invert_y && gw->getTraits()) y = gw->getTraits()->height - y;
|
||||
|
||||
|
||||
switch(event->getEventType())
|
||||
{
|
||||
case(osgGA::GUIEventAdapter::RESIZE):
|
||||
@@ -735,7 +745,7 @@ void CompositeViewer::eventTraversal()
|
||||
case(osgGA::GUIEventAdapter::MOVE):
|
||||
{
|
||||
pointerEvent = true;
|
||||
|
||||
|
||||
if (event->getEventType()!=osgGA::GUIEventAdapter::DRAG || !getCameraWithFocus())
|
||||
{
|
||||
osg::GraphicsContext::Cameras& cameras = gw->getCameras();
|
||||
@@ -744,12 +754,12 @@ void CompositeViewer::eventTraversal()
|
||||
++citr)
|
||||
{
|
||||
osg::Camera* camera = *citr;
|
||||
if (camera->getView() &&
|
||||
if (camera->getView() &&
|
||||
camera->getAllowEventFocus() &&
|
||||
camera->getRenderTargetImplementation()==osg::Camera::FRAME_BUFFER)
|
||||
{
|
||||
osg::Viewport* viewport = camera ? camera->getViewport() : 0;
|
||||
if (viewport &&
|
||||
if (viewport &&
|
||||
x >= viewport->x() && y >= viewport->y() &&
|
||||
x <= (viewport->x()+viewport->width()) && y <= (viewport->y()+viewport->height()) )
|
||||
{
|
||||
@@ -759,9 +769,9 @@ void CompositeViewer::eventTraversal()
|
||||
if (camera->getView()->getCamera() == camera)
|
||||
{
|
||||
eventState->setGraphicsContext(gw);
|
||||
eventState->setInputRange( viewport->x(), viewport->y(),
|
||||
viewport->x()+viewport->width(),
|
||||
viewport->y()+viewport->height());
|
||||
eventState->setInputRange( viewport->x(), viewport->y(),
|
||||
viewport->x()+viewport->width(),
|
||||
viewport->y()+viewport->height());
|
||||
|
||||
}
|
||||
else
|
||||
@@ -774,10 +784,10 @@ void CompositeViewer::eventTraversal()
|
||||
// need to reset the masterView
|
||||
masterView = getViewWithFocus();
|
||||
masterCamera = masterView->getCamera();
|
||||
eventState = masterView->getEventQueue()->getCurrentEventState();
|
||||
eventState = masterView->getEventQueue()->getCurrentEventState();
|
||||
masterCameraVPW = masterCamera->getViewMatrix() * masterCamera->getProjectionMatrix();
|
||||
|
||||
if (masterCamera->getViewport())
|
||||
if (masterCamera->getViewport())
|
||||
{
|
||||
osg::Viewport* viewport = masterCamera->getViewport();
|
||||
masterCameraVPW *= viewport->computeWindowMatrix();
|
||||
@@ -788,9 +798,9 @@ void CompositeViewer::eventTraversal()
|
||||
if (camera->getView()->getCamera() == camera)
|
||||
{
|
||||
eventState->setGraphicsContext(gw);
|
||||
eventState->setInputRange( viewport->x(), viewport->y(),
|
||||
viewport->x()+viewport->width(),
|
||||
viewport->y()+viewport->height());
|
||||
eventState->setInputRange( viewport->x(), viewport->y(),
|
||||
viewport->x()+viewport->width(),
|
||||
viewport->y()+viewport->height());
|
||||
|
||||
}
|
||||
else
|
||||
@@ -801,13 +811,13 @@ void CompositeViewer::eventTraversal()
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
break;
|
||||
}
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
|
||||
if (pointerEvent)
|
||||
{
|
||||
if (getCameraWithFocus())
|
||||
@@ -821,7 +831,7 @@ void CompositeViewer::eventTraversal()
|
||||
osg::Vec3d new_coord = osg::Vec3d(x,y,0.0) * matrix;
|
||||
|
||||
x = new_coord.x();
|
||||
y = new_coord.y();
|
||||
y = new_coord.y();
|
||||
|
||||
event->setInputRange(eventState->getXmin(), eventState->getYmin(), eventState->getXmax(), eventState->getYmax());
|
||||
event->setX(x);
|
||||
@@ -829,7 +839,7 @@ void CompositeViewer::eventTraversal()
|
||||
event->setMouseYOrientation(osgGA::GUIEventAdapter::Y_INCREASING_UPWARDS);
|
||||
|
||||
}
|
||||
// pass along the new pointer events details to the eventState of the viewer
|
||||
// pass along the new pointer events details to the eventState of the viewer
|
||||
eventState->setX(x);
|
||||
eventState->setY(y);
|
||||
eventState->setButtonMask(event->getButtonMask());
|
||||
@@ -857,7 +867,7 @@ void CompositeViewer::eventTraversal()
|
||||
{
|
||||
bool wasThreading = areThreadsRunning();
|
||||
if (wasThreading) stopThreading();
|
||||
|
||||
|
||||
gw->close();
|
||||
|
||||
if (wasThreading) startThreading();
|
||||
@@ -873,7 +883,7 @@ void CompositeViewer::eventTraversal()
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
// osg::notify(osg::NOTICE)<<"mouseEventState Xmin = "<<eventState->getXmin()<<" Ymin="<<eventState->getYmin()<<" xMax="<<eventState->getXmax()<<" Ymax="<<eventState->getYmax()<<std::endl;
|
||||
|
||||
@@ -886,10 +896,10 @@ void CompositeViewer::eventTraversal()
|
||||
view->getEventQueue()->frame( getFrameStamp()->getReferenceTime() );
|
||||
view->getEventQueue()->takeEvents(viewEventsMap[view]);
|
||||
}
|
||||
|
||||
|
||||
|
||||
// osg::notify(osg::NOTICE)<<"Events "<<events.size()<<std::endl;
|
||||
|
||||
|
||||
if ((_keyEventSetsDone!=0) || _quitEventSetsDone)
|
||||
{
|
||||
for(ViewEventsMap::iterator veitr = viewEventsMap.begin();
|
||||
@@ -917,7 +927,7 @@ void CompositeViewer::eventTraversal()
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
if (_done) return;
|
||||
|
||||
if (_eventVisitor.valid())
|
||||
@@ -931,9 +941,9 @@ void CompositeViewer::eventTraversal()
|
||||
{
|
||||
View* view = veitr->first;
|
||||
_eventVisitor->setActionAdapter(view);
|
||||
|
||||
|
||||
if (view->getSceneData())
|
||||
{
|
||||
{
|
||||
for(osgGA::EventQueue::Events::iterator itr = veitr->second.begin();
|
||||
itr != veitr->second.end();
|
||||
++itr)
|
||||
@@ -963,7 +973,7 @@ void CompositeViewer::eventTraversal()
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
for(ViewEventsMap::iterator veitr = viewEventsMap.begin();
|
||||
@@ -971,7 +981,7 @@ void CompositeViewer::eventTraversal()
|
||||
++veitr)
|
||||
{
|
||||
View* view = veitr->first;
|
||||
|
||||
|
||||
for(osgGA::EventQueue::Events::iterator itr = veitr->second.begin();
|
||||
itr != veitr->second.end();
|
||||
++itr)
|
||||
@@ -992,7 +1002,7 @@ void CompositeViewer::eventTraversal()
|
||||
++veitr)
|
||||
{
|
||||
View* view = veitr->first;
|
||||
|
||||
|
||||
for(osgGA::EventQueue::Events::iterator itr = veitr->second.begin();
|
||||
itr != veitr->second.end();
|
||||
++itr)
|
||||
@@ -1006,7 +1016,7 @@ void CompositeViewer::eventTraversal()
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
if (getViewerStats() && getViewerStats()->collectStats("event"))
|
||||
{
|
||||
@@ -1023,7 +1033,7 @@ void CompositeViewer::eventTraversal()
|
||||
void CompositeViewer::updateTraversal()
|
||||
{
|
||||
if (_done) return;
|
||||
|
||||
|
||||
double beginUpdateTraversal = osg::Timer::instance()->delta_s(_startTick, osg::Timer::instance()->tick());
|
||||
|
||||
_updateVisitor->reset();
|
||||
@@ -1084,17 +1094,17 @@ void CompositeViewer::updateTraversal()
|
||||
}
|
||||
|
||||
|
||||
if (view->getCameraManipulator())
|
||||
if (view->getCameraManipulator())
|
||||
{
|
||||
view->setFusionDistance( view->getCameraManipulator()->getFusionDistanceMode(),
|
||||
view->getCameraManipulator()->getFusionDistanceValue() );
|
||||
|
||||
view->getCameraManipulator()->getFusionDistanceValue() );
|
||||
|
||||
view->getCamera()->setViewMatrix( view->getCameraManipulator()->getInverseMatrix());
|
||||
}
|
||||
view->updateSlaves();
|
||||
|
||||
}
|
||||
|
||||
|
||||
if (getViewerStats() && getViewerStats()->collectStats("update"))
|
||||
{
|
||||
double endUpdateTraversal = osg::Timer::instance()->delta_s(_startTick, osg::Timer::instance()->tick());
|
||||
|
||||
@@ -1,13 +1,13 @@
|
||||
/* -*-c++-*- OpenSceneGraph - Copyright (C) 1998-2006 Robert Osfield
|
||||
/* -*-c++-*- OpenSceneGraph - Copyright (C) 1998-2006 Robert Osfield
|
||||
*
|
||||
* This library is open source and may be redistributed and/or modified under
|
||||
* the terms of the OpenSceneGraph Public License (OSGPL) version 0.0 or
|
||||
* This library is open source and may be redistributed and/or modified under
|
||||
* the terms of the OpenSceneGraph Public License (OSGPL) version 0.0 or
|
||||
* (at your option) any later version. The full license is in LICENSE file
|
||||
* included with this distribution, and on the openscenegraph.org website.
|
||||
*
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* OpenSceneGraph Public License for more details.
|
||||
*/
|
||||
|
||||
@@ -100,7 +100,7 @@ void OpenGLQuerySupport::beginQuery(int frameNumber)
|
||||
{
|
||||
GLuint query = createQueryObject();
|
||||
_extensions->glBeginQuery(GL_TIME_ELAPSED, query);
|
||||
_queryFrameNumberList.push_back(QueryFrameNumberPair(query, frameNumber));
|
||||
_queryFrameNumberList.push_back(QueryFrameNumberPair(query, frameNumber));
|
||||
}
|
||||
|
||||
void OpenGLQuerySupport::endQuery()
|
||||
@@ -143,7 +143,7 @@ osgUtil::SceneView* Renderer::ThreadSafeQueue::takeFront()
|
||||
_queue.pop_front();
|
||||
|
||||
if (_queue.empty()) _block.set(false);
|
||||
|
||||
|
||||
return front;
|
||||
}
|
||||
|
||||
@@ -199,7 +199,7 @@ Renderer::Renderer(osg::Camera* camera):
|
||||
|
||||
_sceneView[0]->setGlobalStateSet(stateset);
|
||||
_sceneView[1]->setGlobalStateSet(stateset);
|
||||
|
||||
|
||||
_sceneView[0]->setDefaults(sceneViewOptions);
|
||||
_sceneView[1]->setDefaults(sceneViewOptions);
|
||||
|
||||
@@ -213,7 +213,7 @@ Renderer::Renderer(osg::Camera* camera):
|
||||
// prevent the draw traversal from reading from it before the cull traversal has been completed.
|
||||
_availableQueue.add(_sceneView[0].get());
|
||||
_availableQueue.add(_sceneView[1].get());
|
||||
|
||||
|
||||
DEBUG_MESSAGE<<"_availableQueue.size()="<<_availableQueue._queue.size()<<std::endl;
|
||||
|
||||
_flushOperation = new osg::FlushDeletedGLObjectsOperation(0.1);
|
||||
@@ -240,10 +240,10 @@ void Renderer::updateSceneView(osgUtil::SceneView* sceneView)
|
||||
{
|
||||
sceneView->setGlobalStateSet(stateset);
|
||||
}
|
||||
|
||||
|
||||
osg::GraphicsContext* context = _camera->getGraphicsContext();
|
||||
osg::State* state = context ? context->getState() : 0;
|
||||
if (sceneView->getState()!=state)
|
||||
if (sceneView->getState()!=state)
|
||||
{
|
||||
sceneView->setState(state);
|
||||
}
|
||||
@@ -255,11 +255,11 @@ void Renderer::updateSceneView(osgUtil::SceneView* sceneView)
|
||||
|
||||
osgDB::ImagePager* imagePager = view ? view->getImagePager() : 0;
|
||||
sceneView->getCullVisitor()->setImageRequestHandler(imagePager);
|
||||
|
||||
|
||||
sceneView->setFrameStamp(view ? view->getFrameStamp() : state->getFrameStamp());
|
||||
|
||||
|
||||
if (databasePager) databasePager->setCompileGLObjectsForContextID(state->getContextID(), true);
|
||||
|
||||
|
||||
osg::DisplaySettings* ds = _camera->getDisplaySettings() ? _camera->getDisplaySettings() :
|
||||
((view &&view->getDisplaySettings()) ? view->getDisplaySettings() : osg::DisplaySettings::instance());
|
||||
|
||||
@@ -273,11 +273,11 @@ void Renderer::compile()
|
||||
DEBUG_MESSAGE<<"Renderer::compile()"<<std::endl;
|
||||
|
||||
_compileOnNextDraw = false;
|
||||
|
||||
|
||||
osgUtil::SceneView* sceneView = _sceneView[0].get();
|
||||
if (!sceneView || _done) return;
|
||||
|
||||
if (sceneView->getSceneData())
|
||||
if (sceneView->getSceneData())
|
||||
{
|
||||
osgUtil::GLObjectsVisitor glov;
|
||||
glov.setState(sceneView->getState());
|
||||
@@ -329,7 +329,7 @@ void Renderer::cull()
|
||||
if (stats && stats->collectStats("rendering"))
|
||||
{
|
||||
DEBUG_MESSAGE<<"Collecting rendering stats"<<std::endl;
|
||||
|
||||
|
||||
stats->setAttribute(frameNumber, "Cull traversal begin time", osg::Timer::instance()->delta_s(_startTick, beforeCullTick));
|
||||
stats->setAttribute(frameNumber, "Cull traversal end time", osg::Timer::instance()->delta_s(_startTick, afterCullTick));
|
||||
stats->setAttribute(frameNumber, "Cull traversal time taken", osg::Timer::instance()->delta_s(beforeCullTick, afterCullTick));
|
||||
@@ -339,7 +339,7 @@ void Renderer::cull()
|
||||
{
|
||||
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));
|
||||
@@ -359,7 +359,7 @@ void Renderer::cull()
|
||||
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);
|
||||
@@ -393,7 +393,7 @@ void Renderer::draw()
|
||||
{
|
||||
compile();
|
||||
}
|
||||
|
||||
|
||||
osgViewer::View* view = dynamic_cast<osgViewer::View*>(_camera->getView());
|
||||
osgDB::DatabasePager* databasePager = view ? view->getDatabasePager() : 0;
|
||||
|
||||
@@ -432,24 +432,24 @@ void Renderer::draw()
|
||||
|
||||
bool acquireGPUStats = stats && _timerQuerySupported && stats->collectStats("gpu");
|
||||
|
||||
if (acquireGPUStats)
|
||||
if (acquireGPUStats)
|
||||
{
|
||||
checkQuery(stats);
|
||||
}
|
||||
|
||||
// do draw traversal
|
||||
if (acquireGPUStats)
|
||||
if (acquireGPUStats)
|
||||
{
|
||||
checkQuery(stats);
|
||||
beginQuery(frameNumber);
|
||||
}
|
||||
|
||||
osg::Timer_t beforeDrawTick;
|
||||
|
||||
|
||||
|
||||
|
||||
bool serializeDraw = sceneView->getDisplaySettings()->getSerializeDrawDispatch();
|
||||
|
||||
if (serializeDraw)
|
||||
if (serializeDraw)
|
||||
{
|
||||
OpenThreads::ScopedLock<OpenThreads::Mutex> lock(s_drawSerializerMutex);
|
||||
beforeDrawTick = osg::Timer::instance()->tick();
|
||||
@@ -469,7 +469,7 @@ void Renderer::draw()
|
||||
|
||||
// now flush delete OpenGL objects and compile any objects as required by the DatabasePager
|
||||
flushAndCompile(dispatchTime, sceneView, databasePager, compileThread);
|
||||
|
||||
|
||||
if (acquireGPUStats)
|
||||
{
|
||||
endQuery();
|
||||
@@ -477,7 +477,7 @@ void Renderer::draw()
|
||||
}
|
||||
|
||||
//glFlush();
|
||||
|
||||
|
||||
osg::Timer_t afterDrawTick = osg::Timer::instance()->tick();
|
||||
|
||||
// osg::notify(osg::NOTICE)<<"Time wait for draw = "<<osg::Timer::instance()->delta_m(startDrawTick, beforeDrawTick)<<std::endl;
|
||||
@@ -508,7 +508,7 @@ void Renderer::cull_draw()
|
||||
osg::notify(osg::INFO)<<"Render::release() causing cull_draw to exit"<<std::endl;
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
updateSceneView(sceneView);
|
||||
|
||||
if (_compileOnNextDraw)
|
||||
@@ -540,7 +540,7 @@ void Renderer::cull_draw()
|
||||
|
||||
bool acquireGPUStats = stats && _timerQuerySupported && stats->collectStats("gpu");
|
||||
|
||||
if (acquireGPUStats)
|
||||
if (acquireGPUStats)
|
||||
{
|
||||
checkQuery(stats);
|
||||
}
|
||||
@@ -576,7 +576,7 @@ void Renderer::cull_draw()
|
||||
|
||||
|
||||
// do draw traversal
|
||||
if (acquireGPUStats)
|
||||
if (acquireGPUStats)
|
||||
{
|
||||
checkQuery(stats);
|
||||
beginQuery(frameNumber);
|
||||
@@ -586,10 +586,10 @@ void Renderer::cull_draw()
|
||||
|
||||
bool serializeDraw = sceneView->getDisplaySettings()->getSerializeDrawDispatch();
|
||||
|
||||
if (serializeDraw)
|
||||
if (serializeDraw)
|
||||
{
|
||||
OpenThreads::ScopedLock<OpenThreads::Mutex> lock(s_drawSerializerMutex);
|
||||
|
||||
|
||||
beforeDrawTick = osg::Timer::instance()->tick();
|
||||
sceneView->draw();
|
||||
}
|
||||
@@ -633,7 +633,7 @@ void Renderer::cull_draw()
|
||||
|
||||
void Renderer::flushAndCompile(double currentElapsedFrameTime, osgUtil::SceneView* sceneView, osgDB::DatabasePager* databasePager, osg::GraphicsThread* compileThread)
|
||||
{
|
||||
|
||||
|
||||
double targetFrameRate = _targetFrameRate;
|
||||
double minimumTimeAvailableForGLCompileAndDeletePerFrame = _minimumTimeAvailableForGLCompileAndDeletePerFrame;
|
||||
|
||||
@@ -642,7 +642,7 @@ void Renderer::flushAndCompile(double currentElapsedFrameTime, osgUtil::SceneVie
|
||||
targetFrameRate = std::min(targetFrameRate, databasePager->getTargetFrameRate());
|
||||
minimumTimeAvailableForGLCompileAndDeletePerFrame = std::min(minimumTimeAvailableForGLCompileAndDeletePerFrame, databasePager->getMinimumTimeAvailableForGLCompileAndDeletePerFrame());
|
||||
}
|
||||
|
||||
|
||||
double targetFrameTime = 1.0/targetFrameRate;
|
||||
|
||||
double availableTime = std::max((targetFrameTime - currentElapsedFrameTime)*_conservativeTimeRatio,
|
||||
@@ -666,7 +666,7 @@ void Renderer::flushAndCompile(double currentElapsedFrameTime, osgUtil::SceneVie
|
||||
sceneView->flushDeletedGLObjects(flushTime);
|
||||
}
|
||||
|
||||
// if any time left over from flush add this to compile time.
|
||||
// if any time left over from flush add this to compile time.
|
||||
if (flushTime>0.0) compileTime += flushTime;
|
||||
|
||||
#if 0
|
||||
|
||||
@@ -1,13 +1,13 @@
|
||||
/* -*-c++-*- OpenSceneGraph - Copyright (C) 1998-2006 Robert Osfield
|
||||
/* -*-c++-*- OpenSceneGraph - Copyright (C) 1998-2006 Robert Osfield
|
||||
*
|
||||
* This library is open source and may be redistributed and/or modified under
|
||||
* the terms of the OpenSceneGraph Public License (OSGPL) version 0.0 or
|
||||
* This library is open source and may be redistributed and/or modified under
|
||||
* the terms of the OpenSceneGraph Public License (OSGPL) version 0.0 or
|
||||
* (at your option) any later version. The full license is in LICENSE file
|
||||
* included with this distribution, and on the openscenegraph.org website.
|
||||
*
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* OpenSceneGraph Public License for more details.
|
||||
*/
|
||||
|
||||
@@ -65,7 +65,7 @@ Viewer::Viewer(osg::ArgumentParser& arguments)
|
||||
//arguments.getApplicationUsage()->addCommandLineOption("--radius","");
|
||||
//arguments.getApplicationUsage()->addCommandLineOption("--collar","");
|
||||
//arguments.getApplicationUsage()->addCommandLineOption("--im","");
|
||||
|
||||
|
||||
std::string filename;
|
||||
bool readConfig = false;
|
||||
while (arguments.read("-c",filename))
|
||||
@@ -139,9 +139,9 @@ Viewer::Viewer(osg::ArgumentParser& arguments)
|
||||
while (arguments.read("--wow-vz",wow_vz)) {}
|
||||
while (arguments.read("--wow-M",wow_M)) {}
|
||||
while (arguments.read("--wow-C",wow_C)) {}
|
||||
|
||||
|
||||
if (screenNum<0) screenNum = 0;
|
||||
|
||||
|
||||
setUpViewForWoWVxDisplay( screenNum, wow_content, wow_factor, wow_offset, wow_Zd, wow_vz, wow_M, wow_C );
|
||||
}
|
||||
else if ((ss3d=arguments.read("--3d-sd")) || arguments.read("--panoramic-sd"))
|
||||
@@ -174,7 +174,7 @@ Viewer::Viewer(osg::ArgumentParser& arguments)
|
||||
{
|
||||
if (screenNum>=0) setUpViewInWindow(x, y, width, height, screenNum);
|
||||
else setUpViewInWindow(x,y,width,height);
|
||||
|
||||
|
||||
}
|
||||
else if (screenNum>=0)
|
||||
{
|
||||
@@ -194,7 +194,7 @@ void Viewer::constructorInit()
|
||||
_eventVisitor = new osgGA::EventVisitor;
|
||||
_eventVisitor->setActionAdapter(this);
|
||||
_eventVisitor->setFrameStamp(_frameStamp.get());
|
||||
|
||||
|
||||
_updateVisitor = new osgUtil::UpdateVisitor;
|
||||
_updateVisitor->setFrameStamp(_frameStamp.get());
|
||||
|
||||
@@ -213,7 +213,7 @@ Viewer::~Viewer()
|
||||
|
||||
|
||||
stopThreading();
|
||||
|
||||
|
||||
if (_scene.valid() && _scene->getDatabasePager())
|
||||
{
|
||||
_scene->getDatabasePager()->cancel();
|
||||
@@ -230,9 +230,9 @@ Viewer::~Viewer()
|
||||
{
|
||||
(*citr)->close();
|
||||
}
|
||||
|
||||
|
||||
//osg::notify(osg::NOTICE)<<"finish Viewer::~Viewer()"<<std::endl;
|
||||
|
||||
|
||||
getAllThreads(threads);
|
||||
|
||||
osg::notify(osg::INFO)<<"Viewer::~Viewer() end destrcutor getThreads = "<<threads.size()<<std::endl;
|
||||
@@ -242,7 +242,7 @@ Viewer::~Viewer()
|
||||
void Viewer::take(View& rhs)
|
||||
{
|
||||
osgViewer::View::take(rhs);
|
||||
|
||||
|
||||
#if 1
|
||||
osgViewer::Viewer* rhs_viewer = dynamic_cast<osgViewer::Viewer*>(&rhs);
|
||||
if (rhs_viewer)
|
||||
@@ -277,27 +277,27 @@ void Viewer::take(View& rhs)
|
||||
rhs_viewer->_realizeOperation = 0;
|
||||
rhs_viewer->_currentContext = 0;
|
||||
}
|
||||
#endif
|
||||
#endif
|
||||
}
|
||||
|
||||
bool Viewer::readConfiguration(const std::string& filename)
|
||||
{
|
||||
osg::notify(osg::INFO)<<"Viewer::readConfiguration("<<filename<<")"<<std::endl;
|
||||
|
||||
|
||||
osg::ref_ptr<osg::Object> object = osgDB::readObjectFile(filename);
|
||||
if (!object)
|
||||
if (!object)
|
||||
{
|
||||
//osg::notify(osg::NOTICE)<<"Error: Unable to load configuration file \""<<filename<<"\""<<std::endl;
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
CompositeViewer* compositeViewer = dynamic_cast<CompositeViewer*>(object.get());
|
||||
if (compositeViewer)
|
||||
{
|
||||
osg::notify(osg::NOTICE)<<"Error: Config file \""<<filename<<"\" containing CompositeViewer cannot be loaded by Viewer."<<std::endl;
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
View* view = dynamic_cast<osgViewer::View*>(object.get());
|
||||
if (view)
|
||||
{
|
||||
@@ -306,7 +306,7 @@ bool Viewer::readConfiguration(const std::string& filename)
|
||||
return true;
|
||||
}
|
||||
else
|
||||
{
|
||||
{
|
||||
osg::notify(osg::NOTICE)<<"Error: Config file \""<<filename<<"\" does not contain a valid Viewer configuration."<<std::endl;
|
||||
return false;
|
||||
}
|
||||
@@ -326,7 +326,7 @@ bool Viewer::isRealized() const
|
||||
{
|
||||
if ((*citr)->isRealized()) ++numRealizedWindows;
|
||||
}
|
||||
|
||||
|
||||
return numRealizedWindows > 0;
|
||||
}
|
||||
|
||||
@@ -419,18 +419,18 @@ GraphicsWindowEmbedded* Viewer::setUpViewerAsEmbeddedInWindow(int x, int y, int
|
||||
void Viewer::realize()
|
||||
{
|
||||
//osg::notify(osg::INFO)<<"Viewer::realize()"<<std::endl;
|
||||
|
||||
|
||||
setCameraWithFocus(0);
|
||||
|
||||
Contexts contexts;
|
||||
getContexts(contexts);
|
||||
|
||||
|
||||
if (contexts.empty())
|
||||
{
|
||||
osg::notify(osg::INFO)<<"Viewer::realize() - No valid contexts found, setting up view across all screens."<<std::endl;
|
||||
|
||||
// no windows are already set up so set up a default view
|
||||
|
||||
|
||||
// no windows are already set up so set up a default view
|
||||
|
||||
const char* ptr = 0;
|
||||
if ((ptr = getenv("OSG_CONFIG_FILE")) != 0)
|
||||
{
|
||||
@@ -466,7 +466,7 @@ void Viewer::realize()
|
||||
setUpViewAcrossAllScreens();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
getContexts(contexts);
|
||||
}
|
||||
|
||||
@@ -476,20 +476,38 @@ void Viewer::realize()
|
||||
_done = true;
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
unsigned int maxTexturePoolSize = osg::DisplaySettings::instance()->getMaxTexturePoolSize();
|
||||
if (_camera->getDisplaySettings()) maxTexturePoolSize = std::max(maxTexturePoolSize, _camera->getDisplaySettings()->getMaxTexturePoolSize());
|
||||
if (_displaySettings.valid()) maxTexturePoolSize = std::max(maxTexturePoolSize, _displaySettings->getMaxTexturePoolSize());
|
||||
|
||||
unsigned int maxVBOPoolSize = osg::DisplaySettings::instance()->getMaxVBOPoolSize();
|
||||
if (_displaySettings.valid()) maxVBOPoolSize = std::max(maxVBOPoolSize, _displaySettings->getMaxVBOPoolSize());
|
||||
if (_camera->getDisplaySettings()) maxVBOPoolSize = std::max(maxVBOPoolSize, _camera->getDisplaySettings()->getMaxVBOPoolSize());
|
||||
|
||||
unsigned int maxFBOPoolSize = osg::DisplaySettings::instance()->getMaxFBOPoolSize();
|
||||
if (_displaySettings.valid()) maxFBOPoolSize = std::max(maxFBOPoolSize, _displaySettings->getMaxFBOPoolSize());
|
||||
if (_camera->getDisplaySettings()) maxFBOPoolSize = std::max(maxFBOPoolSize, _camera->getDisplaySettings()->getMaxFBOPoolSize());
|
||||
|
||||
for(Contexts::iterator citr = contexts.begin();
|
||||
citr != contexts.end();
|
||||
++citr)
|
||||
{
|
||||
osg::GraphicsContext* gc = *citr;
|
||||
|
||||
// set the pool sizes, 0 the default will result in no GL object pools.
|
||||
gc->getState()->setMaxTexturePoolSize(maxTexturePoolSize);
|
||||
gc->getState()->setMaxVBOPoolSize(maxVBOPoolSize);
|
||||
gc->getState()->setMaxFBOPoolSize(maxFBOPoolSize);
|
||||
|
||||
gc->realize();
|
||||
|
||||
|
||||
if (_realizeOperation.valid() && gc->valid())
|
||||
{
|
||||
gc->makeCurrent();
|
||||
|
||||
|
||||
(*_realizeOperation)(gc);
|
||||
|
||||
|
||||
gc->releaseContext();
|
||||
}
|
||||
}
|
||||
@@ -507,11 +525,11 @@ void Viewer::realize()
|
||||
osgViewer::GraphicsWindow* gw = dynamic_cast<osgViewer::GraphicsWindow*>(*citr);
|
||||
if (gw)
|
||||
{
|
||||
gw->grabFocusIfPointerInWindow();
|
||||
gw->grabFocusIfPointerInWindow();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// initialize the global timer to be relative to the current time.
|
||||
osg::Timer::instance()->setStartTick();
|
||||
|
||||
@@ -519,7 +537,7 @@ void Viewer::realize()
|
||||
setStartTick(osg::Timer::instance()->getStartTick());
|
||||
|
||||
setUpThreading();
|
||||
|
||||
|
||||
if (osg::DisplaySettings::instance()->getCompileContextsHint())
|
||||
{
|
||||
int numProcessors = OpenThreads::GetNumberOfProcessors();
|
||||
@@ -534,12 +552,12 @@ void Viewer::realize()
|
||||
gc->createGraphicsThread();
|
||||
gc->getGraphicsThread()->setProcessorAffinity(processNum % numProcessors);
|
||||
gc->getGraphicsThread()->startThread();
|
||||
|
||||
|
||||
++processNum;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
@@ -563,7 +581,7 @@ void Viewer::advance(double simulationTime)
|
||||
{
|
||||
_frameStamp->setSimulationTime(simulationTime);
|
||||
}
|
||||
|
||||
|
||||
if (getViewerStats() && getViewerStats()->collectStats("frame_rate"))
|
||||
{
|
||||
// update previous frame stats
|
||||
@@ -590,16 +608,16 @@ void Viewer::eventTraversal()
|
||||
double beginEventTraversal = osg::Timer::instance()->delta_s(_startTick, osg::Timer::instance()->tick());
|
||||
|
||||
// osg::notify(osg::NOTICE)<<"Viewer::frameEventTraversal()."<<std::endl;
|
||||
|
||||
|
||||
// need to copy events from the GraphicsWindow's into local EventQueue;
|
||||
osgGA::EventQueue::Events events;
|
||||
|
||||
Contexts contexts;
|
||||
getContexts(contexts);
|
||||
|
||||
osgGA::GUIEventAdapter* eventState = getEventQueue()->getCurrentEventState();
|
||||
osgGA::GUIEventAdapter* eventState = getEventQueue()->getCurrentEventState();
|
||||
osg::Matrix masterCameraVPW = getCamera()->getViewMatrix() * getCamera()->getProjectionMatrix();
|
||||
if (getCamera()->getViewport())
|
||||
if (getCamera()->getViewport())
|
||||
{
|
||||
osg::Viewport* viewport = getCamera()->getViewport();
|
||||
masterCameraVPW *= viewport->computeWindowMatrix();
|
||||
@@ -619,25 +637,25 @@ void Viewer::eventTraversal()
|
||||
if (gw)
|
||||
{
|
||||
gw->checkEvents();
|
||||
|
||||
|
||||
osgGA::EventQueue::Events gw_events;
|
||||
gw->getEventQueue()->takeEvents(gw_events);
|
||||
|
||||
|
||||
osgGA::EventQueue::Events::iterator itr;
|
||||
for(itr = gw_events.begin();
|
||||
itr != gw_events.end();
|
||||
++itr)
|
||||
{
|
||||
osgGA::GUIEventAdapter* event = itr->get();
|
||||
|
||||
|
||||
bool pointerEvent = false;
|
||||
|
||||
float x = event->getX();
|
||||
float y = event->getY();
|
||||
|
||||
|
||||
bool invert_y = event->getMouseYOrientation()==osgGA::GUIEventAdapter::Y_INCREASING_DOWNWARDS;
|
||||
if (invert_y && gw->getTraits()) y = gw->getTraits()->height - y;
|
||||
|
||||
|
||||
switch(event->getEventType())
|
||||
{
|
||||
case(osgGA::GUIEventAdapter::PUSH):
|
||||
@@ -646,7 +664,7 @@ void Viewer::eventTraversal()
|
||||
case(osgGA::GUIEventAdapter::MOVE):
|
||||
{
|
||||
pointerEvent = true;
|
||||
|
||||
|
||||
if (event->getEventType()!=osgGA::GUIEventAdapter::DRAG || !getCameraWithFocus())
|
||||
{
|
||||
osg::GraphicsContext::Cameras& cameras = gw->getCameras();
|
||||
@@ -655,12 +673,12 @@ void Viewer::eventTraversal()
|
||||
++citr)
|
||||
{
|
||||
osg::Camera* camera = *citr;
|
||||
if (camera->getView()==this &&
|
||||
if (camera->getView()==this &&
|
||||
camera->getAllowEventFocus() &&
|
||||
camera->getRenderTargetImplementation()==osg::Camera::FRAME_BUFFER)
|
||||
{
|
||||
osg::Viewport* viewport = camera ? camera->getViewport() : 0;
|
||||
if (viewport &&
|
||||
if (viewport &&
|
||||
x >= viewport->x() && y >= viewport->y() &&
|
||||
x <= (viewport->x()+viewport->width()) && y <= (viewport->y()+viewport->height()) )
|
||||
{
|
||||
@@ -670,13 +688,13 @@ void Viewer::eventTraversal()
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
break;
|
||||
}
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
|
||||
if (pointerEvent)
|
||||
{
|
||||
if (getCameraWithFocus())
|
||||
@@ -690,7 +708,7 @@ void Viewer::eventTraversal()
|
||||
osg::Vec3d new_coord = osg::Vec3d(x,y,0.0) * matrix;
|
||||
|
||||
x = new_coord.x();
|
||||
y = new_coord.y();
|
||||
y = new_coord.y();
|
||||
|
||||
// osg::notify(osg::NOTICE)<<"pointer event new_coord.x()="<<new_coord.x()<<" new_coord.y()="<<new_coord.y()<<std::endl;
|
||||
|
||||
@@ -711,8 +729,8 @@ void Viewer::eventTraversal()
|
||||
event->setY(y);
|
||||
event->setMouseYOrientation(osgGA::GUIEventAdapter::Y_INCREASING_UPWARDS);
|
||||
}
|
||||
|
||||
// pass along the new pointer events details to the eventState of the viewer
|
||||
|
||||
// pass along the new pointer events details to the eventState of the viewer
|
||||
eventState->setX(x);
|
||||
eventState->setY(y);
|
||||
eventState->setButtonMask(event->getButtonMask());
|
||||
@@ -742,12 +760,12 @@ void Viewer::eventTraversal()
|
||||
{
|
||||
bool wasThreading = areThreadsRunning();
|
||||
if (wasThreading) stopThreading();
|
||||
|
||||
|
||||
gw->close();
|
||||
_currentContext = NULL;
|
||||
|
||||
_currentContext = NULL;
|
||||
|
||||
if (wasThreading) startThreading();
|
||||
|
||||
|
||||
break;
|
||||
}
|
||||
default:
|
||||
@@ -759,7 +777,7 @@ void Viewer::eventTraversal()
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
// osg::notify(osg::NOTICE)<<"mouseEventState Xmin = "<<eventState->getXmin()<<" Ymin="<<eventState->getYmin()<<" xMax="<<eventState->getXmax()<<" Ymax="<<eventState->getYmax()<<std::endl;
|
||||
|
||||
@@ -815,7 +833,7 @@ void Viewer::eventTraversal()
|
||||
#endif
|
||||
|
||||
// osg::notify(osg::NOTICE)<<"Events "<<events.size()<<std::endl;
|
||||
|
||||
|
||||
if ((_keyEventSetsDone!=0) || _quitEventSetsDone)
|
||||
{
|
||||
for(osgGA::EventQueue::Events::iterator itr = events.begin();
|
||||
@@ -828,17 +846,17 @@ void Viewer::eventTraversal()
|
||||
case(osgGA::GUIEventAdapter::KEYUP):
|
||||
if (_keyEventSetsDone && event->getKey()==_keyEventSetsDone) _done = true;
|
||||
break;
|
||||
|
||||
|
||||
case(osgGA::GUIEventAdapter::QUIT_APPLICATION):
|
||||
if (_quitEventSetsDone) _done = true;
|
||||
break;
|
||||
|
||||
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
if (_done) return;
|
||||
|
||||
if (_eventVisitor.valid() && getSceneData())
|
||||
@@ -888,7 +906,7 @@ void Viewer::eventTraversal()
|
||||
{
|
||||
(*hitr)->handleWithCheckAgainstIgnoreHandledEventsMask( *event, *this, 0, 0);
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
for(osgGA::EventQueue::Events::iterator itr = events.begin();
|
||||
@@ -901,7 +919,7 @@ void Viewer::eventTraversal()
|
||||
_cameraManipulator->handleWithCheckAgainstIgnoreHandledEventsMask( *event, *this);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
if (getViewerStats() && getViewerStats()->collectStats("event"))
|
||||
{
|
||||
double endEventTraversal = osg::Timer::instance()->delta_s(_startTick, osg::Timer::instance()->tick());
|
||||
@@ -1003,14 +1021,14 @@ void Viewer::getAllThreads(Threads& threads, bool onlyActive)
|
||||
|
||||
OperationThreads operationThreads;
|
||||
getOperationThreads(operationThreads);
|
||||
|
||||
|
||||
for(OperationThreads::iterator itr = operationThreads.begin();
|
||||
itr != operationThreads.end();
|
||||
++itr)
|
||||
{
|
||||
threads.push_back(*itr);
|
||||
}
|
||||
|
||||
|
||||
|
||||
if (_scene.valid())
|
||||
{
|
||||
@@ -1033,7 +1051,7 @@ void Viewer::getAllThreads(Threads& threads, bool onlyActive)
|
||||
void Viewer::getOperationThreads(OperationThreads& threads, bool onlyActive)
|
||||
{
|
||||
threads.clear();
|
||||
|
||||
|
||||
Contexts contexts;
|
||||
getContexts(contexts);
|
||||
for(Contexts::iterator gcitr = contexts.begin();
|
||||
@@ -1041,13 +1059,13 @@ void Viewer::getOperationThreads(OperationThreads& threads, bool onlyActive)
|
||||
++gcitr)
|
||||
{
|
||||
osg::GraphicsContext* gc = *gcitr;
|
||||
if (gc->getGraphicsThread() &&
|
||||
if (gc->getGraphicsThread() &&
|
||||
(!onlyActive || gc->getGraphicsThread()->isRunning()) )
|
||||
{
|
||||
threads.push_back(gc->getGraphicsThread());
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Cameras cameras;
|
||||
getCameras(cameras);
|
||||
for(Cameras::iterator citr = cameras.begin();
|
||||
@@ -1055,13 +1073,13 @@ void Viewer::getOperationThreads(OperationThreads& threads, bool onlyActive)
|
||||
++citr)
|
||||
{
|
||||
osg::Camera* camera = *citr;
|
||||
if (camera->getCameraThread() &&
|
||||
if (camera->getCameraThread() &&
|
||||
(!onlyActive || camera->getCameraThread()->isRunning()) )
|
||||
{
|
||||
threads.push_back(camera->getCameraThread());
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
void Viewer::getContexts(Contexts& contexts, bool onlyValid)
|
||||
@@ -1071,14 +1089,14 @@ void Viewer::getContexts(Contexts& contexts, bool onlyValid)
|
||||
|
||||
contexts.clear();
|
||||
|
||||
if (_camera.valid() &&
|
||||
_camera->getGraphicsContext() &&
|
||||
if (_camera.valid() &&
|
||||
_camera->getGraphicsContext() &&
|
||||
(_camera->getGraphicsContext()->valid() || !onlyValid))
|
||||
{
|
||||
contextSet.insert(_camera->getGraphicsContext());
|
||||
contexts.push_back(_camera->getGraphicsContext());
|
||||
}
|
||||
|
||||
|
||||
for(unsigned int i=0; i<getNumSlaves(); ++i)
|
||||
{
|
||||
Slave& slave = getSlave(i);
|
||||
@@ -1097,8 +1115,8 @@ void Viewer::getContexts(Contexts& contexts, bool onlyValid)
|
||||
void Viewer::getCameras(Cameras& cameras, bool onlyActive)
|
||||
{
|
||||
cameras.clear();
|
||||
|
||||
if (_camera.valid() &&
|
||||
|
||||
if (_camera.valid() &&
|
||||
(!onlyActive || (_camera->getGraphicsContext() && _camera->getGraphicsContext()->valid())) ) cameras.push_back(_camera.get());
|
||||
|
||||
for(Slaves::iterator itr = _slaves.begin();
|
||||
|
||||
Reference in New Issue
Block a user