From f1cc4d77e7ec881b18b80131d40f44b13693c0d0 Mon Sep 17 00:00:00 2001 From: Robert Osfield Date: Fri, 29 Sep 2006 18:47:20 +0000 Subject: [PATCH] Added preliminary DatabasePager support. --- src/osgGA/SimpleViewer.cpp | 56 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 56 insertions(+) diff --git a/src/osgGA/SimpleViewer.cpp b/src/osgGA/SimpleViewer.cpp index f61d1e673..f633adb03 100644 --- a/src/osgGA/SimpleViewer.cpp +++ b/src/osgGA/SimpleViewer.cpp @@ -32,6 +32,8 @@ SimpleViewer::SimpleViewer(): _eventQueue->setStartTick(_startTick); _eventVisitor = new osgGA::EventVisitor; + + setDatabasePager(new osgDB::DatabasePager); } SimpleViewer::~SimpleViewer() @@ -51,6 +53,12 @@ void SimpleViewer::setSceneData(osg::Node* node) osg::ref_ptr dummyEvent = _eventQueue->createEvent(); _cameraManipulator->home(*dummyEvent, *this); } + + if (_databasePager.valid()) + { + // register any PagedLOD that need to be tracked in the scene graph + _databasePager->registerPagedLODs(node); + } } osg::Node* SimpleViewer::getSceneData() @@ -92,6 +100,18 @@ void SimpleViewer::addEventHandler(GUIEventHandler* eventHandler) _eventHandlers.push_back(eventHandler); } +void SimpleViewer::setDatabasePager(osgDB::DatabasePager* dp) +{ + _databasePager = dp; + + if (dp && _sceneView.valid()) + { + // need to register the DatabasePager with the SceneView's CullVisitor so it can pass on request + // for files to be loaded. + _sceneView->getCullVisitor()->setDatabaseRequestHandler(_databasePager.get()); + } +} + void SimpleViewer::init() { osg::ref_ptr initEvent = _eventQueue->createEvent(); @@ -214,6 +234,15 @@ void SimpleViewer::frameUpdateTraversal() { _sceneView->setViewMatrix(_cameraManipulator->getInverseMatrix()); } + + if (_databasePager.valid()) + { + // tell the DatabasePager the frame number of that the scene graph is being actively used to render a frame + _databasePager->signalBeginFrame(_frameStamp.get()); + + // syncronize changes required by the DatabasePager thread to the scene graph + _databasePager->updateSceneGraph(_frameStamp->getReferenceTime()); + } _sceneView->update(); } @@ -226,10 +255,37 @@ void SimpleViewer::frameCullTraversal() void SimpleViewer::frameDrawTraversal() { _sceneView->draw(); + + if (_databasePager.valid()) + { + // tell the DatabasePager the frame number of that the scene graph is being actively used to render a frame + _databasePager->signalEndFrame(); + + // clean up and compile gl objects with a specified limit + double availableTime = 0.0025; // 2.5 ms + + // compile any GL objects that are required. + _databasePager->compileGLObjects(*(_sceneView->getState()),availableTime); + + // flush deleted GL objects. + _sceneView->flushDeletedGLObjects(availableTime); + } } void SimpleViewer::cleanup() { + if (_databasePager.valid()) + { + // clear the database pager so its starts a fresh on the next update/cull/draw traversals + _databasePager->clear(); + + // release the GL objects stored in the scene graph. + _sceneView->releaseAllGLObjects(); + + // do a flush to delete all the OpenGL objects that have been deleted or released from the scene graph. + _sceneView->flushAllDeletedGLObjects(); + } + _sceneView->releaseAllGLObjects(); _sceneView->flushAllDeletedGLObjects(); }