]> git.mxchange.org Git - flightgear.git/blobdiff - src/Viewer/fg_os_osgviewer.cxx
VoiceSynthesizer: add some test/debug properties
[flightgear.git] / src / Viewer / fg_os_osgviewer.cxx
index 01c646cd826c643fdb124069a8af48217ccec84c..7ba9932180ae44d6d6a0f73b639110d319d4c3c9 100644 (file)
@@ -101,8 +101,7 @@ using namespace std;
 using namespace flightgear;
 using namespace osg;
 
-static osg::ref_ptr<osgViewer::Viewer> viewer;
-static osg::ref_ptr<osg::Camera> mainCamera;
+osg::ref_ptr<osgViewer::Viewer> viewer;
 
 static void setStereoMode( const char * mode )
 {
@@ -251,12 +250,9 @@ void fgOSOpenWindow(bool stencil)
 {
     osg::setNotifyHandler(new NotifyLogger);
     
-    SGPropertyNode* osgLevel = fgGetNode("/sim/rendering/osg-notify-level", true);
-    osgLevel->addChangeListener(new NotifyLevelListener, true);
-    
     viewer = new osgViewer::Viewer;
     viewer->setDatabasePager(FGScenery::getPagerSingleton());
-    CameraGroup* cameraGroup = 0;
+
     std::string mode;
     mode = fgGetString("/sim/rendering/multithreading-mode", "SingleThreaded");
     if (mode == "AutomaticSelection")
@@ -270,49 +266,8 @@ void fgOSOpenWindow(bool stencil)
     else
       viewer->setThreadingModel(osgViewer::Viewer::SingleThreaded);
     WindowBuilder::initWindowBuilder(stencil);
-    WindowBuilder *windowBuilder = WindowBuilder::getWindowBuilder();
-
-    // Look for windows, camera groups, and the old syntax of
-    // top-level cameras
-    SGPropertyNode* renderingNode = fgGetNode("/sim/rendering");
-    SGPropertyNode* cgroupNode = renderingNode->getNode("camera-group", true);
-    bool oldSyntax = !cgroupNode->hasChild("camera");
-    if (oldSyntax) {
-        for (int i = 0; i < renderingNode->nChildren(); ++i) {
-            SGPropertyNode* propNode = renderingNode->getChild(i);
-            const char* propName = propNode->getName();
-            if (!strcmp(propName, "window") || !strcmp(propName, "camera")) {
-                SGPropertyNode* copiedNode
-                    = cgroupNode->getNode(propName, propNode->getIndex(), true);
-                copyProperties(propNode, copiedNode);
-            }
-        }
-        vector<SGPropertyNode_ptr> cameras = cgroupNode->getChildren("camera");
-        SGPropertyNode* masterCamera = 0;
-        BOOST_FOREACH(SGPropertyNode_ptr& camera, cameras) {
-            if (camera->getDoubleValue("shear-x", 0.0) == 0.0
-                && camera->getDoubleValue("shear-y", 0.0) == 0.0) {
-                masterCamera = camera.ptr();
-                break;
-            }
-        }
-        if (!masterCamera) {
-            masterCamera = cgroupNode->getChild("camera", cameras.size(), true);
-            setValue(masterCamera->getNode("window/name", true),
-                     windowBuilder->getDefaultWindowName());
-        }
-        SGPropertyNode* nameNode = masterCamera->getNode("window/name");
-        if (nameNode)
-            setValue(cgroupNode->getNode("gui/window/name", true),
-                     nameNode->getStringValue());
-    }
-    cameraGroup = CameraGroup::buildCameraGroup(viewer.get(), cgroupNode);
-    Camera* guiCamera = getGUICamera(cameraGroup);
-    if (guiCamera) {
-        Viewport* guiViewport = guiCamera->getViewport();
-        fgSetInt("/sim/startup/xsize", guiViewport->width());
-        fgSetInt("/sim/startup/ysize", guiViewport->height());
-    }
+    CameraGroup::buildDefaultGroup(viewer.get());
+    
     FGEventHandler* manipulator = globals->get_renderer()->getEventHandler();
     WindowSystemAdapter* wsa = WindowSystemAdapter::getWSA();
     if (wsa->windows.size() != 1) {
@@ -325,8 +280,22 @@ void fgOSOpenWindow(bool stencil)
     // The viewer won't start without some root.
     viewer->setSceneData(new osg::Group);
     globals->get_renderer()->setViewer(viewer.get());
-    CameraGroup::setDefault(cameraGroup);
+}
 
+void fgOSResetProperties()
+{
+    SGPropertyNode* osgLevel = fgGetNode("/sim/rendering/osg-notify-level", true);
+    NotifyLevelListener* l = new NotifyLevelListener;
+    globals->addListenerToCleanup(l);
+    osgLevel->addChangeListener(l, true);
+    
+    osg::Camera* guiCamera = getGUICamera(CameraGroup::getDefault());
+    if (guiCamera) {
+        Viewport* guiViewport = guiCamera->getViewport();
+        fgSetInt("/sim/startup/xsize", guiViewport->width());
+        fgSetInt("/sim/startup/ysize", guiViewport->height());
+    }
+    
     DisplaySettings * displaySettings = DisplaySettings::instance();
     fgTie("/sim/rendering/osg-displaysettings/eye-separation", displaySettings, &DisplaySettings::getEyeSeparation, &DisplaySettings::setEyeSeparation );
     fgTie("/sim/rendering/osg-displaysettings/screen-distance", displaySettings, &DisplaySettings::getScreenDistance, &DisplaySettings::setScreenDistance );
@@ -346,17 +315,20 @@ void fgOSExit(int code)
     viewer->setDone(true);
     viewer->getDatabasePager()->cancel();
     status = code;
+    
+    // otherwise we crash if OSG does logging during static destruction, eg
+    // GraphicsWindowX11, since OSG statics may have been created before the
+    // sglog static, despite our best efforts in boostrap.cxx
+    osg::setNotifyHandler(new osg::StandardNotifyHandler);
 }
 
 int fgOSMainLoop()
 {
-    ref_ptr<FGEventHandler> manipulator
-        = globals->get_renderer()->getEventHandler();
     viewer->setReleaseContextAtEndOfFrameHint(false);
     if (!viewer->isRealized())
         viewer->realize();
     while (!viewer->done()) {
-        fgIdleHandler idleFunc = manipulator->getIdleHandler();
+        fgIdleHandler idleFunc = globals->get_renderer()->getEventHandler()->getIdleHandler();
         if (idleFunc)
             (*idleFunc)();
         globals->get_renderer()->update();
@@ -389,7 +361,6 @@ void fgOSInit(int* argc, char** argv)
 void fgOSCloseWindow()
 {
     FGScenery::resetPagerSingleton();
-    mainCamera = NULL;
     flightgear::CameraGroup::setDefault(NULL);
     WindowSystemAdapter::setWSA(NULL);
     viewer = NULL;