From 0985a0657297c5c73f5681e3c16e8a2b36df9578 Mon Sep 17 00:00:00 2001 From: Robert Osfield Date: Thu, 4 Jan 2007 21:49:02 +0000 Subject: [PATCH] Moved the set of GraphicsContext RenderingOperations into Viewer. --- include/osgViewer/View | 3 -- include/osgViewer/Viewer | 2 + src/osgViewer/View.cpp | 77 +--------------------------------- src/osgViewer/Viewer.cpp | 89 ++++++++++++++++++++++++++++++++++++++++ 4 files changed, 92 insertions(+), 79 deletions(-) diff --git a/include/osgViewer/View b/include/osgViewer/View index 22c7e4964..0b909ad81 100644 --- a/include/osgViewer/View +++ b/include/osgViewer/View @@ -55,12 +55,9 @@ class OSGVIEWER_EXPORT View : public osg::View, public osgGA::GUIActionAdapter virtual void requestWarpPointer(float x,float y); public: - - void setUpRenderingSupport(); void assignSceneDataToCameras(); - protected: virtual ~View(); diff --git a/include/osgViewer/Viewer b/include/osgViewer/Viewer index c1db754cf..ea4927a20 100644 --- a/include/osgViewer/Viewer +++ b/include/osgViewer/Viewer @@ -94,6 +94,8 @@ class OSGVIEWER_EXPORT Viewer : public osgViewer::View void startThreading(); void checkWindowStatus(); + void setUpRenderingSupport(); + bool _firstFrame; bool _done; diff --git a/src/osgViewer/View.cpp b/src/osgViewer/View.cpp index 6ccdabe4a..a0a31d6b7 100644 --- a/src/osgViewer/View.cpp +++ b/src/osgViewer/View.cpp @@ -69,7 +69,6 @@ void View::setUpViewAcrossAllScreens() return; } - double fovy, aspectRatio, zNear, zFar; _camera->getProjectionMatrixAsPerspective(fovy, aspectRatio, zNear, zFar); @@ -215,84 +214,10 @@ void View::setUpViewAcrossAllScreens() } } } - - setUpRenderingSupport(); + assignSceneDataToCameras(); } -// Draw operation, that does a draw on the scene graph. -struct RenderingOperation : public osg::GraphicsOperation -{ - RenderingOperation(osgUtil::SceneView* sceneView, osgDB::DatabasePager* databasePager): - osg::GraphicsOperation("Render",true), - _sceneView(sceneView), - _databasePager(databasePager) - { - _sceneView->getCullVisitor()->setDatabaseRequestHandler(_databasePager.get()); - } - - virtual void operator () (osg::GraphicsContext*) - { - if (!_sceneView) return; - - - // osg::notify(osg::NOTICE)<<"RenderingOperation"<cull(); - _sceneView->draw(); - - if (_databasePager.valid()) - { - double availableTime = 0.004; // 4 ms - _databasePager->compileGLObjects(*(_sceneView->getState()), availableTime); - _sceneView->flushDeletedGLObjects(availableTime); - } - } - - osg::observer_ptr _sceneView; - osg::observer_ptr _databasePager; -}; - -void View::setUpRenderingSupport() -{ - osg::FrameStamp* frameStamp = _scene->getFrameStamp(); - - // what should we do with the old sceneViews? - _cameraSceneViewMap.clear(); - - if (_camera.valid() && _camera->getGraphicsContext()) - { - osgUtil::SceneView* sceneView = new osgUtil::SceneView; - _cameraSceneViewMap[_camera] = sceneView; - - sceneView->setDefaults(); - sceneView->setCamera(_camera.get()); - sceneView->setState(_camera->getGraphicsContext()->getState()); - sceneView->setSceneData(getSceneData()); - sceneView->setFrameStamp(frameStamp); - - _camera->getGraphicsContext()->add(new RenderingOperation(sceneView, _scene->getDatabasePager())); - } - - for(unsigned i=0; igetGraphicsContext()) - { - osgUtil::SceneView* sceneView = new osgUtil::SceneView; - _cameraSceneViewMap[slave._camera] = sceneView; - - sceneView->setDefaults(); - sceneView->setCamera(slave._camera.get()); - sceneView->setState(slave._camera->getGraphicsContext()->getState()); - sceneView->setSceneData(getSceneData()); - sceneView->setFrameStamp(frameStamp); - - slave._camera->getGraphicsContext()->add(new RenderingOperation(sceneView, _scene->getDatabasePager())); - } - } -} - void View::assignSceneDataToCameras() { osg::Node* sceneData = _scene.valid() ? _scene->getSceneData() : 0; diff --git a/src/osgViewer/Viewer.cpp b/src/osgViewer/Viewer.cpp index 46e085802..a2bb8f587 100644 --- a/src/osgViewer/Viewer.cpp +++ b/src/osgViewer/Viewer.cpp @@ -322,6 +322,93 @@ void Viewer::getWindows(Windows& windows, bool onlyValid) } } +// Draw operation, that does a draw on the scene graph. +struct RenderingOperation : public osg::GraphicsOperation +{ + RenderingOperation(osgUtil::SceneView* sceneView, osgDB::DatabasePager* databasePager): + osg::GraphicsOperation("Render",true), + _sceneView(sceneView), + _databasePager(databasePager) + { + _sceneView->getCullVisitor()->setDatabaseRequestHandler(_databasePager.get()); + } + + virtual void operator () (osg::GraphicsContext*) + { + if (!_sceneView) return; + + + // osg::notify(osg::NOTICE)<<"RenderingOperation"<cull(); + _sceneView->draw(); + + if (_databasePager.valid()) + { + double availableTime = 0.004; // 4 ms + _databasePager->compileGLObjects(*(_sceneView->getState()), availableTime); + _sceneView->flushDeletedGLObjects(availableTime); + } + } + + osg::observer_ptr _sceneView; + osg::observer_ptr _databasePager; +}; + +void Viewer::setUpRenderingSupport() +{ + if (!_scene) return; + + osg::FrameStamp* frameStamp = _scene->getFrameStamp(); + + // what should we do with the old sceneViews? + _cameraSceneViewMap.clear(); + + Contexts contexts; + getContexts(contexts); + + // clear out all the previously assigned operations + for(Contexts::iterator citr = contexts.begin(); + citr != contexts.end(); + ++citr) + { + (*citr)->removeAllOperations(); + } + + if (_camera.valid() && _camera->getGraphicsContext()) + { + osgUtil::SceneView* sceneView = new osgUtil::SceneView; + _cameraSceneViewMap[_camera] = sceneView; + + sceneView->setDefaults(); + sceneView->setCamera(_camera.get()); + sceneView->setState(_camera->getGraphicsContext()->getState()); + sceneView->setSceneData(getSceneData()); + sceneView->setFrameStamp(frameStamp); + + _camera->getGraphicsContext()->add(new RenderingOperation(sceneView, _scene->getDatabasePager())); + } + + for(unsigned i=0; igetGraphicsContext()) + { + osgUtil::SceneView* sceneView = new osgUtil::SceneView; + _cameraSceneViewMap[slave._camera] = sceneView; + + sceneView->setDefaults(); + sceneView->setCamera(slave._camera.get()); + sceneView->setState(slave._camera->getGraphicsContext()->getState()); + sceneView->setSceneData(getSceneData()); + sceneView->setFrameStamp(frameStamp); + + slave._camera->getGraphicsContext()->add(new RenderingOperation(sceneView, _scene->getDatabasePager())); + } + } +} + + void Viewer::realize() { //osg::notify(osg::INFO)<<"Viewer::realize()"<