diff --git a/src/Main/fg_init.cxx b/src/Main/fg_init.cxx index e9d6bd787..d21f6e085 100644 --- a/src/Main/fg_init.cxx +++ b/src/Main/fg_init.cxx @@ -1288,7 +1288,13 @@ void fgStartNewReset() FGRenderer* render = globals->get_renderer(); // needed or we crash in multi-threaded OSG mode render->getViewerBase()->stopThreading(); - + + osg::ref_ptr<osgViewer::CompositeViewer> composite_viewer = render->getCompositeViewer(); + osg::ref_ptr<osgViewer::View> composite_viewer_view; + if (composite_viewer) { + composite_viewer_view = render->getView(); + } + // order is important here since tile-manager shutdown needs to // access the scenery object subsystemManger->remove(FGScenery::staticSubsystemClassId()); @@ -1375,21 +1381,39 @@ void fgStartNewReset() fgInitAircraftPaths(true); fgInitAircraft(true); - render = new FGRenderer; + render = new FGRenderer(composite_viewer); render->setEventHandler(eventHandler); eventHandler->reset(); globals->set_renderer(render); render->init(); - render->setView(viewer.get()); + + if (composite_viewer) { + render->setView(composite_viewer_view); + } + else { + render->setView(viewer.get()); + } sgUserDataInit( globals->get_props() ); - viewer->getDatabasePager()->setUpThreads(20, 1); - - // must do this before preinit for Rembrandthe - flightgear::CameraGroup::buildDefaultGroup(viewer.get()); - render->preinit(); - viewer->startThreading(); + if (composite_viewer) { + composite_viewer_view->getDatabasePager()->setUpThreads(20, 1); + flightgear::CameraGroup::buildDefaultGroup(composite_viewer_view); + composite_viewer_view->setFrameStamp(composite_viewer->getFrameStamp()); + composite_viewer_view->setDatabasePager(FGScenery::getPagerSingleton()); + composite_viewer_view->getDatabasePager()->setUnrefImageDataAfterApplyPolicy(true, false); + osg::GraphicsContext::createNewContextID(); + render->setView(composite_viewer_view); + render->preinit(); + composite_viewer->startThreading(); + } + else { + viewer->getDatabasePager()->setUpThreads(20, 1); + // must do this before preinit for Rembrandthe + flightgear::CameraGroup::buildDefaultGroup(viewer.get()); + render->preinit(); + viewer->startThreading(); + } fgOSResetProperties(); diff --git a/src/Viewer/renderer.cxx b/src/Viewer/renderer.cxx index e89d31e4a..8a20dedaa 100644 --- a/src/Viewer/renderer.cxx +++ b/src/Viewer/renderer.cxx @@ -351,6 +351,17 @@ FGRenderer::FGRenderer() : _updateVisitor = new SGUpdateVisitor; } +FGRenderer::FGRenderer(osg::ref_ptr<osgViewer::CompositeViewer> composite_viewer) : + composite_viewer(composite_viewer), + _sky(NULL), + MaximumTextureSize(0) +{ + _root = new osg::Group; + _root->setName("fakeRoot"); + _updateVisitor = new SGUpdateVisitor; +} + + FGRenderer::~FGRenderer() { SGPropertyChangeListenerVec::iterator i = _listeners.begin(); @@ -462,7 +473,12 @@ FGRenderer::init( void ) } composite_viewer_enabled = 1; SG_LOG(SG_VIEW, SG_ALERT, "Creating osgViewer::CompositeViewer"); - composite_viewer = new osgViewer::CompositeViewer; + if (composite_viewer) { + // reinit. + } + else { + composite_viewer = new osgViewer::CompositeViewer; + } // https://stackoverflow.com/questions/15207076/openscenegraph-and-multiple-viewers composite_viewer->setReleaseContextAtEndOfFrameHint(false); @@ -1016,6 +1032,11 @@ osgViewer::ViewerBase* FGRenderer::getViewerBase() } } +osg::ref_ptr<osgViewer::CompositeViewer> FGRenderer::getCompositeViewer() +{ + return composite_viewer; +} + osgViewer::View* FGRenderer::getView() { /* Would like to assert that FGRenderer::init() has always been called diff --git a/src/Viewer/renderer.hxx b/src/Viewer/renderer.hxx index a938351a3..50054bf9c 100644 --- a/src/Viewer/renderer.hxx +++ b/src/Viewer/renderer.hxx @@ -50,6 +50,7 @@ class FGRenderer { public: FGRenderer(); + FGRenderer(osg::ref_ptr<osgViewer::CompositeViewer> composite_viewer); ~FGRenderer(); void preinit(); @@ -67,6 +68,9 @@ public: /* Returns either composite_viewer or viewer. */ osgViewer::ViewerBase* getViewerBase(); + + /** For handling reset. */ + osg::ref_ptr<osgViewer::CompositeViewer> getCompositeViewer(); /** Get and set the OSG Viewer object, if any. */