]> git.mxchange.org Git - flightgear.git/blobdiff - src/GUI/gui.cxx
Reset: GUI can be shutdown.
[flightgear.git] / src / GUI / gui.cxx
index 1ae94dbb093a925eea17b7c2490d07a0232424f3..f37b3792d6412ec8b0d2b2dd414a951f436f04d3 100644 (file)
 
 #include <Main/main.hxx>
 #include <Main/globals.hxx>
+#include <Main/locale.hxx>
 #include <Main/fg_props.hxx>
-#include <Main/WindowSystemAdapter.hxx>
+#include <Viewer/WindowSystemAdapter.hxx>
+#include <Viewer/CameraGroup.hxx>
 #include <GUI/new_gui.hxx>
+#include <GUI/FGFontCache.hxx>
 
 #include "gui.h"
 #include "layout.hxx"
@@ -77,8 +80,7 @@ public:
         FGFontCache *fc = globals->get_fontcache();
         fc->initializeFonts();
         puFont *GuiFont
-            = fc->get(globals->get_locale()->getStringValue("font",
-                                                            "typewriter.txf"),
+            = fc->get(globals->get_locale()->getDefaultFont("typewriter.txf"),
                       15);
         puSetDefaultFonts(*GuiFont, *GuiFont);
         guiFnt = puGetDefaultLabelFont();
@@ -96,24 +98,88 @@ public:
     }
 };
 
-osg::ref_ptr<GUIInitOperation> initOp;
-}
+// Operation for querying OpenGL parameters. This must be done in a
+// valid OpenGL context, potentially in another thread.
 
-void guiStartInit(osg::GraphicsContext* gc)
+struct GeneralInitOperation : public GraphicsContextOperation
 {
-    if (gc) {
-        initOp = new GUIInitOperation;
-        gc->add(initOp.get());
+    GeneralInitOperation()
+        : GraphicsContextOperation(std::string("General init"))
+    {
     }
+    void run(osg::GraphicsContext* gc)
+    {
+        SGPropertyNode* simRendering = fgGetNode("/sim/rendering");
+
+        simRendering->setStringValue("gl-vendor", (char*) glGetString(GL_VENDOR));
+        SG_LOG( SG_GENERAL, SG_INFO, glGetString(GL_VENDOR));
+
+        simRendering->setStringValue("gl-renderer", (char*) glGetString(GL_RENDERER));
+        SG_LOG( SG_GENERAL, SG_INFO, glGetString(GL_RENDERER));
+
+        simRendering->setStringValue("gl-version", (char*) glGetString(GL_VERSION));
+        SG_LOG( SG_GENERAL, SG_INFO, glGetString(GL_VERSION));
+
+        // Old hardware without support for OpenGL 2.0 does not support GLSL and
+        // glGetString returns NULL for GL_SHADING_LANGUAGE_VERSION.
+        //
+        // See http://flightgear.org/forums/viewtopic.php?f=17&t=19670&start=15#p181945
+        const char* glsl_version = (const char*) glGetString(GL_SHADING_LANGUAGE_VERSION);
+        if( !glsl_version )
+          glsl_version = "UNSUPPORTED";
+        simRendering->setStringValue("gl-shading-language-version", glsl_version);
+        SG_LOG( SG_GENERAL, SG_INFO, glsl_version);
+
+        GLint tmp;
+        glGetIntegerv( GL_MAX_TEXTURE_SIZE, &tmp );
+        simRendering->setIntValue("max-texture-size", tmp);
+
+        glGetIntegerv( GL_DEPTH_BITS, &tmp );
+        simRendering->setIntValue("depth-buffer-bits", tmp);
+    }
+};
+
+osg::ref_ptr<GUIInitOperation> initOp;
+
 }
 
-bool guiFinishInit()
+/** Initializes GUI.
+ * Returns true when done, false when still busy (call again). */
+bool guiInit()
 {
-    if (!initOp.valid())
+    static osg::ref_ptr<GeneralInitOperation> genOp;
+
+    if (!genOp.valid())
+    {
+        // Pick some window on which to do queries.
+        // XXX Perhaps all this graphics initialization code should be
+        // moved to renderer.cxx?
+        genOp = new GeneralInitOperation;
+        osg::Camera* guiCamera = getGUICamera(CameraGroup::getDefault());
+        WindowSystemAdapter* wsa = WindowSystemAdapter::getWSA();
+        osg::GraphicsContext* gc = 0;
+        if (guiCamera)
+            gc = guiCamera->getGraphicsContext();
+        if (gc) {
+            gc->add(genOp.get());
+            initOp = new GUIInitOperation;
+            gc->add(initOp.get());
+        } else {
+            wsa->windows[0]->gc->add(genOp.get());
+        }
+        return false; // not ready yet
+    }
+    else
+    {
+        if (!genOp->isFinished())
+            return false;
+        if (!initOp.valid())
+            return true;
+        if (!initOp->isFinished())
+            return false;
+        genOp = 0;
+        initOp = 0;
+        // we're done
         return true;
-    if (!initOp->isFinished())
-        return false;
-    initOp = 0;
-    return true;
+    }
 }
-