From c2da67d47302111514cd9bcf189a84e7c45e139e Mon Sep 17 00:00:00 2001 From: Areloch Date: Tue, 15 Jul 2014 17:44:19 -0500 Subject: [PATCH] Fixes the splash screen so that it displays until the game has actually done initial setup and can display GUI elements. This prevents the ugly blank window just sitting there while the GUI loads. --- Engine/source/console/consoleFunctions.cpp | 7 +++++++ Engine/source/gui/core/guiCanvas.cpp | 18 ++++++++++++++++++ Engine/source/platform/platform.h | 3 +++ Engine/source/windowManager/platformWindow.h | 7 +++++++ .../source/windowManager/platformWindowMgr.h | 3 +++ .../windowManager/win32/win32SplashScreen.cpp | 7 +++++++ .../source/windowManager/win32/win32Window.cpp | 8 ++++++-- .../windowManager/win32/win32WindowMgr.cpp | 9 +++++---- .../windowManager/win32/win32WindowMgr.h | 6 ++++++ Templates/Empty/game/scripts/gui/startupGui.cs | 6 ++++++ Templates/Full/game/scripts/gui/startupGui.cs | 6 ++++++ 11 files changed, 74 insertions(+), 6 deletions(-) diff --git a/Engine/source/console/consoleFunctions.cpp b/Engine/source/console/consoleFunctions.cpp index f5c90194e..2dea93f44 100644 --- a/Engine/source/console/consoleFunctions.cpp +++ b/Engine/source/console/consoleFunctions.cpp @@ -1589,6 +1589,13 @@ DefineEngineFunction( displaySplashWindow, bool, (const char* path), ("art/gui/s return Platform::displaySplashWindow(path); } +DefineEngineFunction( closeSplashWindow, void, (),, + "Close our startup splash window.\n\n" + "@note This is currently only implemented on Windows.\n\n" + "@ingroup Platform" ) +{ + Platform::closeSplashWindow(); +} //----------------------------------------------------------------------------- DefineEngineFunction( getWebDeployment, bool, (),, diff --git a/Engine/source/gui/core/guiCanvas.cpp b/Engine/source/gui/core/guiCanvas.cpp index cbef4673c..f5a84e77e 100644 --- a/Engine/source/gui/core/guiCanvas.cpp +++ b/Engine/source/gui/core/guiCanvas.cpp @@ -2683,3 +2683,21 @@ ConsoleMethod( GuiCanvas, setVideoMode, void, 5, 8, // Store the new mode into a pref. Con::setVariable( "$pref::Video::mode", vm.toString() ); } + +ConsoleMethod( GuiCanvas, showWindow, void, 2, 2, "" ) +{ + if (!object->getPlatformWindow()) + return; + + object->getPlatformWindow()->show(); + WindowManager->setDisplayWindow(true); + object->getPlatformWindow()->setDisplayWindow(true); +} + +ConsoleMethod( GuiCanvas, hideWindow, void, 2, 2, "" ) +{ + if (!object->getPlatformWindow()) + return; + + object->getPlatformWindow()->hide(); +} \ No newline at end of file diff --git a/Engine/source/platform/platform.h b/Engine/source/platform/platform.h index 3b5a57358..d390eef5c 100644 --- a/Engine/source/platform/platform.h +++ b/Engine/source/platform/platform.h @@ -338,6 +338,9 @@ namespace Platform // display Splash Window bool displaySplashWindow( String path ); + // close Splash Window + bool closeSplashWindow(); + void openFolder( const char* path ); // Open file at the OS level, according to registered file-types. diff --git a/Engine/source/windowManager/platformWindow.h b/Engine/source/windowManager/platformWindow.h index 11d28d384..680e8b12b 100644 --- a/Engine/source/windowManager/platformWindow.h +++ b/Engine/source/windowManager/platformWindow.h @@ -89,6 +89,10 @@ protected: /// Offscreen Render bool mOffscreenRender; + /// This is set as part of the canvas being shown, and flags that the windows should render as normal from now on. + // Basically a flag that lets the window manager know that we've handled the splash screen, and to operate as normal. + bool mDisplayWindow; + /// Protected constructor so that the win PlatformWindow() { @@ -104,6 +108,7 @@ protected: mSuppressReset = false; mOffscreenRender = false; + mDisplayWindow = false; } public: @@ -180,6 +185,8 @@ public: /// This is called to poll the window as to it's idle state. virtual bool getOffscreenRender() { return mOffscreenRender; }; + /// Set whether this window is should display as normal + virtual void setDisplayWindow(bool val ) { mDisplayWindow = val; }; /// Set Focused State (Foreground) /// diff --git a/Engine/source/windowManager/platformWindowMgr.h b/Engine/source/windowManager/platformWindowMgr.h index b744af56b..949e581a8 100644 --- a/Engine/source/windowManager/platformWindowMgr.h +++ b/Engine/source/windowManager/platformWindowMgr.h @@ -133,6 +133,9 @@ public: /// This method removes the curtain window. virtual void raiseCurtain()=0; + /// This method indicates to created windows to show as normal. + virtual void setDisplayWindow(bool set)=0; + private: /// Process command line arguments from StandardMainLoop. This is done to /// allow web plugin functionality, where we are passed platform-specific diff --git a/Engine/source/windowManager/win32/win32SplashScreen.cpp b/Engine/source/windowManager/win32/win32SplashScreen.cpp index 83189dac3..29542ef41 100644 --- a/Engine/source/windowManager/win32/win32SplashScreen.cpp +++ b/Engine/source/windowManager/win32/win32SplashScreen.cpp @@ -121,6 +121,13 @@ void CloseSplashWindow(HINSTANCE hinst) } +bool Platform::closeSplashWindow() +{ + CloseSplashWindow(GetModuleHandle(NULL)); + + return true; +} + bool Platform::displaySplashWindow( String path ) { if(path.isEmpty()) diff --git a/Engine/source/windowManager/win32/win32Window.cpp b/Engine/source/windowManager/win32/win32Window.cpp index 0cbb59433..eb72a3153 100644 --- a/Engine/source/windowManager/win32/win32Window.cpp +++ b/Engine/source/windowManager/win32/win32Window.cpp @@ -153,7 +153,9 @@ void Win32Window::setVideoMode( const GFXVideoMode &mode ) { SetWindowLong( getHWND(), GWL_STYLE, WS_POPUP); SetWindowPos( getHWND(), HWND_NOTOPMOST, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE | SWP_FRAMECHANGED); - ShowWindow(getHWND(), SW_SHOWNORMAL); + + if(mDisplayWindow) + ShowWindow(getHWND(), SW_SHOWNORMAL); // Clear the menu bar from the window for full screen HMENU menu = GetMenu(getHWND()); @@ -216,7 +218,9 @@ void Win32Window::setVideoMode( const GFXVideoMode &mode ) // We have to force Win32 to update the window frame and make the window // visible and no longer topmost - this code might be possible to simplify. SetWindowPos( getHWND(), HWND_NOTOPMOST, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE | SWP_FRAMECHANGED); - ShowWindow( getHWND(), SW_SHOWNORMAL); + + if(mDisplayWindow) + ShowWindow( getHWND(), SW_SHOWNORMAL); } mFullscreen = false; diff --git a/Engine/source/windowManager/win32/win32WindowMgr.cpp b/Engine/source/windowManager/win32/win32WindowMgr.cpp index 3777a01f6..266049b6b 100644 --- a/Engine/source/windowManager/win32/win32WindowMgr.cpp +++ b/Engine/source/windowManager/win32/win32WindowMgr.cpp @@ -54,6 +54,8 @@ Win32WindowManager::Win32WindowManager() mOffscreenRender = false; + mDisplayWindow = false; + buildMonitorsList(); } @@ -263,11 +265,10 @@ PlatformWindow *Win32WindowManager::createWindow(GFXDevice *device, const GFXVid // If we're not rendering offscreen, make sure our window is shown and drawn to. - if (!mOffscreenRender) - ShowWindow( w32w->mWindowHandle, SW_SHOWDEFAULT ); + w32w->setDisplayWindow(mDisplayWindow); - // Close any splash screen we created - CloseSplashWindow(winState.appInstance); + if (!mOffscreenRender && mDisplayWindow) + ShowWindow( w32w->mWindowHandle, SW_SHOWDEFAULT ); // Bind the window to the specified device. if(device) diff --git a/Engine/source/windowManager/win32/win32WindowMgr.h b/Engine/source/windowManager/win32/win32WindowMgr.h index be9cdaa42..5282d116b 100644 --- a/Engine/source/windowManager/win32/win32WindowMgr.h +++ b/Engine/source/windowManager/win32/win32WindowMgr.h @@ -56,6 +56,10 @@ class Win32WindowManager : public PlatformWindowManager // is intended for offscreen rendering bool mOffscreenRender; + /// This is set as part of the canvas being shown, and flags that the windows should render as normal from now on. + // Basically a flag that lets the window manager know that we've handled the splash screen, and to operate as normal. + bool mDisplayWindow; + /// Internal structure used when enumerating monitors struct MonitorInfo { HMONITOR monitorHandle; @@ -117,6 +121,8 @@ public: virtual void lowerCurtain(); virtual void raiseCurtain(); + + virtual void setDisplayWindow(bool set) { mDisplayWindow = set; } }; #endif \ No newline at end of file diff --git a/Templates/Empty/game/scripts/gui/startupGui.cs b/Templates/Empty/game/scripts/gui/startupGui.cs index 675daeafa..d0226a9bf 100644 --- a/Templates/Empty/game/scripts/gui/startupGui.cs +++ b/Templates/Empty/game/scripts/gui/startupGui.cs @@ -29,6 +29,12 @@ function loadStartup() // The index of the current splash screen $StartupIdx = 0; + // As we know at this point that the initial load is complete, + // we can hide any splash screen we have, and show the canvas. + // This keeps things looking nice, instead of having a blank window + closeSplashWindow(); + Canvas.showWindow(); + // A list of the splash screens and logos // to cycle through. Note that they have to // be in consecutive numerical order diff --git a/Templates/Full/game/scripts/gui/startupGui.cs b/Templates/Full/game/scripts/gui/startupGui.cs index 675daeafa..d0226a9bf 100644 --- a/Templates/Full/game/scripts/gui/startupGui.cs +++ b/Templates/Full/game/scripts/gui/startupGui.cs @@ -29,6 +29,12 @@ function loadStartup() // The index of the current splash screen $StartupIdx = 0; + // As we know at this point that the initial load is complete, + // we can hide any splash screen we have, and show the canvas. + // This keeps things looking nice, instead of having a blank window + closeSplashWindow(); + Canvas.showWindow(); + // A list of the splash screens and logos // to cycle through. Note that they have to // be in consecutive numerical order