]> git.mxchange.org Git - flightgear.git/blobdiff - src/GUI/gui.cxx
Reset: GUI can be shutdown.
[flightgear.git] / src / GUI / gui.cxx
index fbc5e902aa80f385ce71d32edd650ddb44a0356a..f37b3792d6412ec8b0d2b2dd414a951f436f04d3 100644 (file)
@@ -18,7 +18,7 @@
  *
  * You should have received a copy of the GNU General Public License
  * along with this program; if not, write to the Free Software
- * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
  *
  * $Id$
  **************************************************************************/
@@ -30,9 +30,7 @@
 
 #include <simgear/compiler.h>
 
-#ifdef HAVE_WINDOWS_H
-#  include <windows.h>
-#endif
+#include <string>
 
 #include <simgear/structure/exception.hxx>
 #include <simgear/misc/sg_path.hxx>
 
 #include <plib/pu.h>
 
-#include <Include/general.hxx>
 #include <Main/main.hxx>
 #include <Main/globals.hxx>
+#include <Main/locale.hxx>
 #include <Main/fg_props.hxx>
+#include <Viewer/WindowSystemAdapter.hxx>
+#include <Viewer/CameraGroup.hxx>
+#include <GUI/new_gui.hxx>
+#include <GUI/FGFontCache.hxx>
 
 #include "gui.h"
-#include "gui_local.hxx"
-#include "preset_dlg.hxx"
 #include "layout.hxx"
 
+#include <osg/GraphicsContext>
+
+using namespace flightgear;
 
 puFont guiFnt = 0;
-fntTexFont *guiFntHandle = 0;
 
 
 /* -------------------------------------------------------------------------
 init the gui
 _____________________________________________________________________*/
 
+namespace
+{
+class GUIInitOperation : public GraphicsContextOperation
+{
+public:
+    GUIInitOperation() : GraphicsContextOperation(std::string("GUI init"))
+    {
+    }
+    void run(osg::GraphicsContext* gc)
+    {
+        WindowSystemAdapter* wsa = WindowSystemAdapter::getWSA();
+        wsa->puInitialize();
+        puSetDefaultStyle         ( PUSTYLE_SMALL_SHADED ); //PUSTYLE_DEFAULT
+        puSetDefaultColourScheme  (0.8, 0.8, 0.9, 1);
+
+        FGFontCache *fc = globals->get_fontcache();
+        fc->initializeFonts();
+        puFont *GuiFont
+            = fc->get(globals->get_locale()->getDefaultFont("typewriter.txf"),
+                      15);
+        puSetDefaultFonts(*GuiFont, *GuiFont);
+        guiFnt = puGetDefaultLabelFont();
+
+        LayoutWidget::setDefaultFont(GuiFont, 15);
+  
+        if (!fgHasNode("/sim/startup/mouse-pointer")) {
+            // no preference specified for mouse pointer
+        } else if ( !fgGetBool("/sim/startup/mouse-pointer") ) {
+            // don't show pointer
+        } else {
+            // force showing pointer
+            puShowCursor();
+        }
+    }
+};
+
+// Operation for querying OpenGL parameters. This must be done in a
+// valid OpenGL context, potentially in another thread.
 
-void guiInit()
+struct GeneralInitOperation : public GraphicsContextOperation
 {
-    char *mesa_win_state;
-
-    // Initialize PUI
-    puInit();
-    puSetDefaultStyle         ( PUSTYLE_SMALL_SHADED ); //PUSTYLE_DEFAULT
-    puSetDefaultColourScheme  (0.8, 0.8, 0.9, 1);
-
-    // Next check home directory
-    SGPath fntpath;
-    char* envp = ::getenv( "FG_FONTS" );
-    if ( envp != NULL ) {
-        fntpath.set( envp );
-    } else {
-        fntpath.set( globals->get_fg_root() );
-       fntpath.append( "Fonts" );
+    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);
     }
+};
 
-    // Install our fast fonts
-    SGPropertyNode *locale = globals->get_locale();
-    fntpath.append(locale->getStringValue("font", "typewriter.txf"));
-    guiFntHandle = new fntTexFont ;
-    guiFntHandle -> load ( (char *)fntpath.c_str() ) ;
-    puFont GuiFont ( guiFntHandle, 15 ) ;
-    puSetDefaultFonts( GuiFont, GuiFont ) ;
-    guiFnt = puGetDefaultLabelFont();
+osg::ref_ptr<GUIInitOperation> initOp;
 
-    LayoutWidget::setDefaultFont(&GuiFont, 15);
-  
-    if (!fgHasNode("/sim/startup/mouse-pointer")) {
-        // no preference specified for mouse pointer, attempt to autodetect...
-        // Determine if we need to render the cursor, or if the windowing
-        // system will do it.  First test if we are rendering with glide.
-        if ( strstr ( general.get_glRenderer(), "Glide" ) ) {
-            // Test for the MESA_GLX_FX env variable
-            if ( (mesa_win_state = getenv( "MESA_GLX_FX" )) != NULL) {
-                // test if we are fullscreen mesa/glide
-                if ( (mesa_win_state[0] == 'f') ||
-                     (mesa_win_state[0] == 'F') ) {
-                    puShowCursor ();
-                }
-            }
+}
+
+/** Initializes GUI.
+ * Returns true when done, false when still busy (call again). */
+bool guiInit()
+{
+    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());
         }
-//        mouse_active = ~mouse_active;
-    } else if ( !fgGetBool("/sim/startup/mouse-pointer") ) {
-        // don't show pointer
-    } else {
-        // force showing pointer
-        puShowCursor();
-//        mouse_active = ~mouse_active;
+        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;
     }
-       
-    // MOUSE_VIEW mode stuff
-       initMouseQuat();
-
-    // Set up our Dialog Boxes
-    fgPresetInit();
 }