From 33661c13d6fc871b9ded4087fbc125f2e8155ec2 Mon Sep 17 00:00:00 2001 From: Chris Danford Date: Sat, 5 Feb 2005 22:11:15 +0000 Subject: [PATCH] zero the next update after creating or deleting a screen so we don't skip --- stepmania/src/ScreenManager.cpp | 25 ++++++++++++++++++++++--- stepmania/src/ScreenManager.h | 4 ++++ 2 files changed, 26 insertions(+), 3 deletions(-) diff --git a/stepmania/src/ScreenManager.cpp b/stepmania/src/ScreenManager.cpp index 677853f40e..096eac719e 100644 --- a/stepmania/src/ScreenManager.cpp +++ b/stepmania/src/ScreenManager.cpp @@ -57,6 +57,8 @@ ScreenManager::ScreenManager() m_MessageSendOnPop = SM_None; + m_bZeroNextUpdate = false; + /* By the time this is constructed, THEME has already been set up and set to * the current theme. Call ThemeChanged(), to handle the starting theme * and set up m_SystemLayer. */ @@ -104,6 +106,8 @@ void ScreenManager::EmptyDeleteQueue() if(!m_vScreensToDelete.size()) return; + m_bZeroNextUpdate = true; + for( unsigned i=0; iIsFirstUpdate() ) + if( pScreen && m_bZeroNextUpdate ) + { + LOG->Trace( "Zeroing this update. Was %f", fDeltaTime ); fDeltaTime = 0; + m_bZeroNextUpdate = false; + } if( pScreen ) pScreen->Update( fDeltaTime ); m_pSharedBGA->Update( fDeltaTime ); - m_SystemLayer->Update( fDeltaTime ); + m_SystemLayer->Update( fDeltaTime ); + EmptyDeleteQueue(); if(m_sDelayedScreen.size() != 0) @@ -218,6 +227,8 @@ void ScreenManager::Input( const DeviceInput& DeviceI, const InputEventType type Screen* ScreenManager::MakeNewScreen( const CString &sScreenName ) { + m_bZeroNextUpdate = true; + /* By default, RageSounds handles the song timer. When we change screens, reset this; * screens turn this off in SM_GainFocus if they handle timers themselves (edit). * XXX: screens should turn this on in SM_LoseFocus if they handle timers themselves, too */ @@ -251,6 +262,8 @@ Screen* ScreenManager::MakeNewScreen( const CString &sScreenName ) void ScreenManager::PrepareScreen( const CString &sScreenName ) { + m_bZeroNextUpdate = true; + // Delete previously prepared versions of the screen. FOREACH( Screen*, m_vPreparedScreens, s ) { @@ -266,6 +279,8 @@ void ScreenManager::PrepareScreen( const CString &sScreenName ) void ScreenManager::DeletePreparedScreens() { + m_bZeroNextUpdate = true; + FOREACH( Screen*, m_vPreparedScreens, s ) SAFE_DELETE( *s ); m_vPreparedScreens.clear(); @@ -314,6 +329,8 @@ void ScreenManager::SetNewScreen( const CString &sScreenName ) void ScreenManager::LoadDelayedScreen() { + m_bZeroNextUpdate = true; + retry: CString sScreenName = m_sDelayedScreen; m_sDelayedScreen = ""; @@ -407,7 +424,9 @@ retry: } void ScreenManager::AddNewScreenToTop( const CString &sScreenName, ScreenMessage messageSendOnPop ) -{ +{ + m_bZeroNextUpdate = true; + /* Send this before making the new screen, since it might set things that will be re-set * in the new screen's ctor. */ if( m_ScreenStack.size() ) diff --git a/stepmania/src/ScreenManager.h b/stepmania/src/ScreenManager.h index c6080bd163..0acc86d5ca 100644 --- a/stepmania/src/ScreenManager.h +++ b/stepmania/src/ScreenManager.h @@ -71,6 +71,10 @@ private: ScreenMessage m_MessageSendOnPop; vector m_vPreparedScreens; vector m_vScreensToDelete; + + // Set this to true anywhere we create of delete objects. These + // operations take a long time, and will cause a skip on the next update. + bool m_bZeroNextUpdate; Screen* MakeNewScreen( const CString &sName ); void SetFromNewScreen( Screen *pNewScreen, bool Stack );