From dac8706e2e7791c7cff23a9ca6dad2b686804928 Mon Sep 17 00:00:00 2001 From: ThorstenB <brehmt@gmail.com> Date: Tue, 25 Sep 2012 22:39:13 +0200 Subject: [PATCH] Move GUI init code to gui module. --- src/GUI/gui.cxx | 88 +++++++++++++++++++++++++++++++++++++++-------- src/GUI/gui.h | 3 +- src/Main/main.cxx | 68 +++--------------------------------- 3 files changed, 78 insertions(+), 81 deletions(-) diff --git a/src/GUI/gui.cxx b/src/GUI/gui.cxx index f9a169259..2f9192fe4 100644 --- a/src/GUI/gui.cxx +++ b/src/GUI/gui.cxx @@ -44,6 +44,7 @@ #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> @@ -97,24 +98,81 @@ public: } }; +// Operation for querying OpenGL parameters. This must be done in a +// valid OpenGL context, potentially in another thread. + +struct GeneralInitOperation : public GraphicsContextOperation +{ + 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)); + + simRendering->setStringValue("gl-shading-language-version", (char*) glGetString(GL_SHADING_LANGUAGE_VERSION)); + SG_LOG( SG_GENERAL, SG_INFO, glGetString(GL_SHADING_LANGUAGE_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; + } -void guiStartInit(osg::GraphicsContext* gc) +/** Initializes GUI. + * Returns true when done, false when still busy (call again). */ +bool guiInit() { - if (gc) { - initOp = new GUIInitOperation; - gc->add(initOp.get()); + 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; } } - -bool guiFinishInit() -{ - if (!initOp.valid()) - return true; - if (!initOp->isFinished()) - return false; - initOp = 0; - return true; -} - diff --git a/src/GUI/gui.h b/src/GUI/gui.h index cc523f756..c191c15d9 100644 --- a/src/GUI/gui.h +++ b/src/GUI/gui.h @@ -40,8 +40,7 @@ namespace osg class GraphicsContext; } // gui.cxx -extern void guiStartInit(osg::GraphicsContext*); -extern bool guiFinishInit(); +extern bool guiInit(); extern bool openBrowser(const std::string& address); extern void mkDialog(const char *txt); extern void guiErrorMessage(const char *txt); diff --git a/src/Main/main.cxx b/src/Main/main.cxx index 686585560..689e33aa6 100644 --- a/src/Main/main.cxx +++ b/src/Main/main.cxx @@ -55,8 +55,6 @@ #include <Sound/soundmanager.hxx> #include <Time/TimeManager.hxx> #include <GUI/gui.h> -#include <Viewer/CameraGroup.hxx> -#include <Viewer/WindowSystemAdapter.hxx> #include <Viewer/splash.hxx> #include <Viewer/renderer.hxx> #include <Navaids/NavDataCache.hxx> @@ -105,42 +103,6 @@ static void fgMainLoop( void ) SG_LOG( SG_GENERAL, SG_DEBUG, "" ); } -// Operation for querying OpenGL parameters. This must be done in a -// valid OpenGL context, potentially in another thread. -namespace -{ -struct GeneralInitOperation : public GraphicsContextOperation -{ - 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)); - - simRendering->setStringValue("gl-shading-language-version", (char*) glGetString(GL_SHADING_LANGUAGE_VERSION)); - SG_LOG( SG_GENERAL, SG_INFO, glGetString(GL_SHADING_LANGUAGE_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); - } -}; - -} // This is the top level master main function that is registered as // our idle function @@ -155,34 +117,12 @@ static void fgIdleFunction ( void ) { // splash screen up and running right away. static int idle_state = 0; - static osg::ref_ptr<GeneralInitOperation> genOp; if ( idle_state == 0 ) { - idle_state++; - // 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()); - } else { - wsa->windows[0]->gc->add(genOp.get()); + if (guiInit()) + { + idle_state+=2; + fgSplashProgress("loading-aircraft-list"); } - guiStartInit(gc); - } else if ( idle_state == 1 ) { - if (genOp.valid()) { - if (!genOp->isFinished()) - return; - genOp = 0; - } - if (!guiFinishInit()) - return; - idle_state++; - fgSplashProgress("loading-aircraft-list"); } else if ( idle_state == 2 ) { idle_state++;