From a96ed6ac61fe4cc2ddce70c9437389b1b1b44982 Mon Sep 17 00:00:00 2001
From: scrawl <scrawl@baseoftrash.de>
Date: Wed, 12 Sep 2012 19:15:29 +0200
Subject: [PATCH] splash screens on startup

---
 apps/openmw/mwgui/loadingscreen.cpp    | 35 +++++++++++++++++++++++++-
 apps/openmw/mwgui/loadingscreen.hpp    |  2 ++
 apps/openmw/mwgui/mode.hpp             |  3 +++
 apps/openmw/mwgui/windowmanagerimp.cpp |  9 +++++++
 4 files changed, 48 insertions(+), 1 deletion(-)

diff --git a/apps/openmw/mwgui/loadingscreen.cpp b/apps/openmw/mwgui/loadingscreen.cpp
index d93cc50c3..c25fad6bc 100644
--- a/apps/openmw/mwgui/loadingscreen.cpp
+++ b/apps/openmw/mwgui/loadingscreen.cpp
@@ -11,6 +11,8 @@
 #include "../mwbase/environment.hpp"
 #include "../mwbase/inputmanager.hpp"
 
+#include "../mwbase/windowmanager.hpp"
+
 namespace MWGui
 {
 
@@ -20,6 +22,7 @@ namespace MWGui
         , WindowBase("openmw_loading_screen.layout", parWindowManager)
         , mLoadingOn(false)
         , mLastRenderTime(0.f)
+        , mFirstLoad(true)
     {
         getWidget(mLoadingText, "LoadingText");
         getWidget(mProgressBar, "ProgressBar");
@@ -139,7 +142,8 @@ namespace MWGui
             }
             else
             {
-                mBackgroundMaterial->getTechnique(0)->getPass(0)->getTextureUnitState(0)->setTextureName(chain->getCompositor ("gbufferFinalizer")->getTextureInstance ("no_mrt_output", 0)->getName());
+                if (!mFirstLoad)
+                    mBackgroundMaterial->getTechnique(0)->getPass(0)->getTextureUnitState(0)->setTextureName(chain->getCompositor ("gbufferFinalizer")->getTextureInstance ("no_mrt_output", 0)->getName());
                 mRectangle->setVisible(true);
 
                 for (unsigned int i = 0; i<chain->getNumCompositors(); ++i)
@@ -171,6 +175,30 @@ namespace MWGui
     {
         setVisible(true);
         mLoadingOn = true;
+
+        if (mFirstLoad)
+        {
+            /// \todo use a directory listing here
+            std::vector<std::string> splash;
+            splash.push_back ("Splash/Splash_Bonelord.tga");
+            splash.push_back ("Splash/Splash_ClannDaddy.tga");
+            splash.push_back ("Splash/Splash_ClannFear.tga");
+            splash.push_back ("Splash/Splash_Daedroth.tga");
+            splash.push_back ("Splash/Splash_Hunger.tga");
+            splash.push_back ("Splash/Splash_KwamaWarrior.tga");
+            splash.push_back ("Splash/Splash_Netch.tga");
+            splash.push_back ("Splash/Splash_NixHound.tga");
+            splash.push_back ("Splash/Splash_Siltstriker.tga");
+            splash.push_back ("Splash/Splash_Skeleton.tga");
+            splash.push_back ("Splash/Splash_SphereCenturion.tga");
+
+            mBackgroundMaterial->getTechnique(0)->getPass(0)->getTextureUnitState(0)->setTextureName(splash[rand() % splash.size()]);
+            mRectangle->setVisible(true);
+
+            mWindowManager.pushGuiMode(GM_LoadingWallpaper);
+        }
+        else
+            mWindowManager.pushGuiMode(GM_Loading);
     }
 
 
@@ -178,5 +206,10 @@ namespace MWGui
     {
         setVisible(false);
         mLoadingOn = false;
+        mFirstLoad = false;
+        mRectangle->setVisible(false);
+
+        mWindowManager.removeGuiMode(GM_Loading);
+        mWindowManager.removeGuiMode(GM_LoadingWallpaper);
     }
 }
diff --git a/apps/openmw/mwgui/loadingscreen.hpp b/apps/openmw/mwgui/loadingscreen.hpp
index abd59db49..5cee37a51 100644
--- a/apps/openmw/mwgui/loadingscreen.hpp
+++ b/apps/openmw/mwgui/loadingscreen.hpp
@@ -19,6 +19,8 @@ namespace MWGui
         void onResChange(int w, int h);
 
     private:
+        bool mFirstLoad;
+
         Ogre::SceneManager* mSceneMgr;
         Ogre::RenderWindow* mWindow;
 
diff --git a/apps/openmw/mwgui/mode.hpp b/apps/openmw/mwgui/mode.hpp
index 4417f7b9c..7e1adcf8b 100644
--- a/apps/openmw/mwgui/mode.hpp
+++ b/apps/openmw/mwgui/mode.hpp
@@ -35,6 +35,9 @@ namespace MWGui
       // interactive MessageBox
       GM_InterMessageBox,
 
+      GM_Loading,
+      GM_LoadingWallpaper,
+
       GM_QuickKeysMenu
     };
 
diff --git a/apps/openmw/mwgui/windowmanagerimp.cpp b/apps/openmw/mwgui/windowmanagerimp.cpp
index b29980b21..a4dd54e78 100644
--- a/apps/openmw/mwgui/windowmanagerimp.cpp
+++ b/apps/openmw/mwgui/windowmanagerimp.cpp
@@ -248,6 +248,8 @@ void WindowManager::updateVisible()
     mSpellWindow->setVisible(false);
     mQuickKeysMenu->setVisible(false);
 
+    mHud->setVisible(true);
+
     // Mouse is visible whenever we're not in game mode
     MyGUI::PointerManager::getInstance().setVisible(isGuiMode());
 
@@ -340,6 +342,13 @@ void WindowManager::updateVisible()
         case GM_Journal:
             mJournal->setVisible(true);
             break;
+        case GM_LoadingWallpaper:
+            mHud->setVisible(false);
+            MyGUI::PointerManager::getInstance().setVisible(false);
+            break;
+        case GM_Loading:
+            MyGUI::PointerManager::getInstance().setVisible(false);
+            break;
         default:
             // Unsupported mode, switch back to game
             break;