From 28fb22568c7f2e239b968bdcc803a2dc92816866 Mon Sep 17 00:00:00 2001 From: Robert Osfield Date: Thu, 21 Dec 2006 17:23:07 +0000 Subject: [PATCH] Added basic support for DatabasePager into osgViewer::Viewer --- src/osgViewer/View.cpp | 20 +++++++++++++++----- src/osgViewer/Viewer.cpp | 22 ++++++++++++++++++---- 2 files changed, 33 insertions(+), 9 deletions(-) diff --git a/src/osgViewer/View.cpp b/src/osgViewer/View.cpp index 8766ad103..2045757c5 100644 --- a/src/osgViewer/View.cpp +++ b/src/osgViewer/View.cpp @@ -170,8 +170,9 @@ void View::setUpViewAcrossAllScreens() // Draw operation, that does a draw on the scene graph. struct RenderingOperation : public osg::GraphicsContext::Operation { - RenderingOperation(osgViewer::View* view, osg::Camera* camera, osg::FrameStamp* frameStamp): - osg::GraphicsContext::Operation("Render",true) + RenderingOperation(osgViewer::View* view, osg::Camera* camera, osgDB::DatabasePager* databasePager, osg::FrameStamp* frameStamp): + osg::GraphicsContext::Operation("Render",true), + _databasePager(databasePager) { _sceneView = new osgUtil::SceneView; _sceneView->setDefaults(); @@ -180,15 +181,24 @@ struct RenderingOperation : public osg::GraphicsContext::Operation _sceneView->setSceneData(view->getSceneData()); _sceneView->setFrameStamp(frameStamp); + _sceneView->getCullVisitor()->setDatabaseRequestHandler(_databasePager.get()); } virtual void operator () (osg::GraphicsContext*) { _sceneView->cull(); _sceneView->draw(); + + if (_databasePager.valid()) + { + double availableTime = 0.004; // 4 ms + _databasePager->compileGLObjects(*(_sceneView->getState()), availableTime); + _sceneView->flushDeletedGLObjects(availableTime); + } } - osg::ref_ptr _sceneView; + osg::ref_ptr _sceneView; + osg::ref_ptr _databasePager; }; void View::setUpRenderingSupport() @@ -197,7 +207,7 @@ void View::setUpRenderingSupport() if (_camera.valid() && _camera->getGraphicsContext()) { - _camera->getGraphicsContext()->add(new RenderingOperation(this, _camera.get(), frameStamp)); + _camera->getGraphicsContext()->add(new RenderingOperation(this, _camera.get(), _scene->getDatabasePager(), frameStamp)); } for(unsigned i=0; igetGraphicsContext()) { - slave._camera->getGraphicsContext()->add(new RenderingOperation(this, slave._camera.get(), frameStamp)); + slave._camera->getGraphicsContext()->add(new RenderingOperation(this, slave._camera.get(), _scene->getDatabasePager(), frameStamp)); } } } diff --git a/src/osgViewer/Viewer.cpp b/src/osgViewer/Viewer.cpp index af2428d16..23011b9e9 100644 --- a/src/osgViewer/Viewer.cpp +++ b/src/osgViewer/Viewer.cpp @@ -266,10 +266,17 @@ void Viewer::frameUpdateTraversal() void Viewer::frameRenderingTraversals() { - if (_done) return; + if (_done) return; - typedef std::set GraphicsContexts; - GraphicsContexts contexts; + osgDB::DatabasePager* dp = _scene->getDatabasePager(); + if (dp) + { + dp->signalBeginFrame(_scene->getFrameStamp()); + } + + + typedef std::set GraphicsContexts; + GraphicsContexts contexts; if (_camera.valid() && _camera->getGraphicsContext()) { @@ -292,6 +299,7 @@ void Viewer::frameRenderingTraversals() } } } + for(GraphicsContexts::iterator itr = contexts.begin(); itr != contexts.end(); @@ -301,13 +309,19 @@ void Viewer::frameRenderingTraversals() const_cast(*itr)->makeCurrent(); const_cast(*itr)->runOperations(); } - + + for(GraphicsContexts::iterator itr = contexts.begin(); itr != contexts.end(); ++itr) { const_cast(*itr)->swapBuffers(); } + + if (dp) + { + dp->signalEndFrame(); + } } void Viewer::releaseAllGLObjects()