diff --git a/stepmania/src/ScreenManager.cpp b/stepmania/src/ScreenManager.cpp index 187238162d..b2cf7fc402 100644 --- a/stepmania/src/ScreenManager.cpp +++ b/stepmania/src/ScreenManager.cpp @@ -28,7 +28,7 @@ #include "SongManager.h" #include "RageTextureManager.h" #include "ThemeManager.h" -#include "ScreenSystemLayer.h" +#include "Screen.h" #include "BGAnimation.h" #include "Foreach.h" #include "ActorUtil.h" @@ -54,7 +54,6 @@ void ScreenManager::Register( const CString& sClassName, CreateScreenFn pfn ) ScreenManager::ScreenManager() { m_pSharedBGA = new Actor; - m_SystemLayer = NULL; m_MessageSendOnPop = SM_None; @@ -79,7 +78,8 @@ ScreenManager::~ScreenManager() for( unsigned i=0; iGetPathS("Common","screenshot") ); m_soundBack.Load( THEME->GetPathS("Common","back") ); - // reload system layer - SAFE_DELETE( m_SystemLayer ); - m_SystemLayer = new ScreenSystemLayer; - m_SystemLayer->Init(); + // reload overlay screens + for( unsigned i=0; iGetMetric( "Common","OverlayScreens" ); + vector asOverlays; + split( sOverlays, ",", asOverlays ); + for( unsigned i=0; iRefreshCreditsMessages(); } @@ -164,7 +174,8 @@ void ScreenManager::Update( float fDeltaTime ) m_pSharedBGA->Update( fDeltaTime ); - m_SystemLayer->Update( fDeltaTime ); + for( unsigned i=0; iUpdate( fDeltaTime ); /* The music may be started on the first update. If we're reading from a CD, * it might not start immediately. Make sure we start playing the sound before @@ -214,7 +225,8 @@ void ScreenManager::Draw() m_ScreenStack[i]->Draw(); } - m_SystemLayer->Draw(); + for( unsigned i=0; iDraw(); DISPLAY->EndFrame(); @@ -231,6 +243,24 @@ void ScreenManager::Input( const DeviceInput& DeviceI, const InputEventType type m_ScreenStack.back()->Input( DeviceI, type, GameI, MenuI, StyleI ); } +/* Just create a new screen; don't do any associated cleanup. */ +Screen* ScreenManager::MakeNewScreenInternal( const CString &sScreenName ) +{ + RageTimer t; + LOG->Trace( "Loading screen name '%s'", sScreenName.c_str() ); + + CString sClassName = THEME->GetMetric(sScreenName,"Class"); + + map::iterator iter = g_pmapRegistrees->find( sClassName ); + ASSERT_M( iter != g_pmapRegistrees->end(), ssprintf("Screen '%s' has an invalid class '%s'",sScreenName.c_str(),sClassName.c_str()) ) + + CreateScreenFn pfn = iter->second; + Screen* ret = pfn( sScreenName ); + + LOG->Trace( "Loaded '%s' ('%s') in %f", sScreenName.c_str(), sClassName.c_str(), t.GetDeltaTime()); + + return ret; +} Screen* ScreenManager::MakeNewScreen( const CString &sScreenName ) { @@ -245,18 +275,7 @@ Screen* ScreenManager::MakeNewScreen( const CString &sScreenName ) * creating the new screen, to lower peak memory usage slightly. */ SONGMAN->Cleanup(); - RageTimer t; - LOG->Trace( "Loading screen name '%s'", sScreenName.c_str() ); - - CString sClassName = THEME->GetMetric(sScreenName,"Class"); - - map::iterator iter = g_pmapRegistrees->find( sClassName ); - ASSERT_M( iter != g_pmapRegistrees->end(), ssprintf("Screen '%s' has an invalid class '%s'",sScreenName.c_str(),sClassName.c_str()) ) - - CreateScreenFn pfn = iter->second; - Screen* ret = pfn( sScreenName ); - - LOG->Trace( "Loaded '%s' ('%s') in %f", sScreenName.c_str(), sClassName.c_str(), t.GetDeltaTime()); + Screen* ret = MakeNewScreenInternal( sScreenName ); /* Loading probably took a little while. Let's reset stats. This prevents us * from displaying an unnaturally low FPS value, and the next FPS value we diff --git a/stepmania/src/ScreenManager.h b/stepmania/src/ScreenManager.h index c76f7d9167..8dbcca77c1 100644 --- a/stepmania/src/ScreenManager.h +++ b/stepmania/src/ScreenManager.h @@ -65,7 +65,7 @@ public: void PlaySharedBackgroundOffCommand(); private: vector m_ScreenStack; // bottommost to topmost - Screen *m_SystemLayer; + vector m_OverlayScreens; CString m_sLastLoadedBackgroundPath; CString m_sDelayedScreen; @@ -79,6 +79,7 @@ private: bool m_bZeroNextUpdate; Screen* MakeNewScreen( const CString &sName ); + Screen* MakeNewScreenInternal( const CString &sName ); void SetFromNewScreen( Screen *pNewScreen, bool Stack ); void ClearScreenStack(); void EmptyDeleteQueue(); diff --git a/stepmania/src/ScreenSystemLayer.cpp b/stepmania/src/ScreenSystemLayer.cpp index 6900768343..c1caab2993 100644 --- a/stepmania/src/ScreenSystemLayer.cpp +++ b/stepmania/src/ScreenSystemLayer.cpp @@ -28,8 +28,8 @@ #define CREDITS_JOIN_ONLY THEME->GetMetricB("ScreenSystemLayer","CreditsJoinOnly") -//REGISTER_SCREEN_CLASS( ScreenSystemLayer ); -ScreenSystemLayer::ScreenSystemLayer() : Screen("ScreenSystemLayer") +REGISTER_SCREEN_CLASS( ScreenSystemLayer ); +ScreenSystemLayer::ScreenSystemLayer( const CString &sName ) : Screen(sName) { MESSAGEMAN->Subscribe( this, "RefreshCreditText" ); MESSAGEMAN->Subscribe( this, "SystemMessage" ); diff --git a/stepmania/src/ScreenSystemLayer.h b/stepmania/src/ScreenSystemLayer.h index cea6a0ab67..00454097f1 100644 --- a/stepmania/src/ScreenSystemLayer.h +++ b/stepmania/src/ScreenSystemLayer.h @@ -12,7 +12,7 @@ const int NUM_SKIPS_TO_SHOW = 5; class ScreenSystemLayer : public Screen { public: - ScreenSystemLayer(); + ScreenSystemLayer( const CString &sName ); virtual ~ScreenSystemLayer(); virtual void Init(); void HandleMessage( const CString &sCommandName );