From 447891486212d7c766648c08c488367c284ee2ab Mon Sep 17 00:00:00 2001 From: Glenn Maynard Date: Sat, 15 Jan 2005 03:26:38 +0000 Subject: [PATCH] don't reload note skin when entering play mode in the editor --- stepmania/src/NoteField.cpp | 33 ++++++++++++++++++++++++++++++-- stepmania/src/NoteField.h | 2 +- stepmania/src/Player.h | 2 +- stepmania/src/ScreenGameplay.cpp | 4 ++-- 4 files changed, 35 insertions(+), 6 deletions(-) diff --git a/stepmania/src/NoteField.cpp b/stepmania/src/NoteField.cpp index f0bc981d54..18eb309781 100644 --- a/stepmania/src/NoteField.cpp +++ b/stepmania/src/NoteField.cpp @@ -51,6 +51,8 @@ void NoteField::Unload() void NoteField::CacheNoteSkin( CString skin ) { + skin.ToLower(); + if( m_NoteDisplays.find(skin) != m_NoteDisplays.end() ) return; @@ -64,13 +66,38 @@ void NoteField::CacheNoteSkin( CString skin ) m_NoteDisplays[ skin ] = nd; } -void NoteField::CacheAllUsedNoteSkins() +void NoteField::CacheAllUsedNoteSkins( bool bDeleteUnused ) { /* Cache note skins. */ vector skins; GAMESTATE->GetAllUsedNoteSkins( skins ); for( unsigned i=0; i < skins.size(); ++i ) CacheNoteSkin( skins[i] ); + + if( bDeleteUnused ) + { + set setToDelete; + for( map::iterator it = m_NoteDisplays.begin(); + it != m_NoteDisplays.end(); ++it ) + { + setToDelete.insert( it->first ); + } + + for( unsigned i=0; i < skins.size(); ++i ) + { + CString sSkin = skins[i]; + sSkin.ToLower(); + setToDelete.erase( sSkin ); + } + + /* Free note skins that are no longer used. */ + for( set::iterator it = setToDelete.begin(); it != setToDelete.end(); ++it ) + { + NoteDisplayCols *pNoteDisplay = m_NoteDisplays[*it]; + delete pNoteDisplay; + m_NoteDisplays.erase( *it ); + } + } } void NoteField::Load( @@ -98,7 +125,9 @@ void NoteField::Load( this->CopyAll( *pNoteData ); ASSERT( GetNumTracks() == GAMESTATE->GetCurrentStyle()->m_iColsPerPlayer ); - CacheAllUsedNoteSkins(); + /* If we're in gameplay, we havn't applied course modifiers yet, so we don't know what + * note skins we'll need. Don't delete unused skins yet. */ + CacheAllUsedNoteSkins( false ); RefreshBeatToNoteSkin(); } diff --git a/stepmania/src/NoteField.h b/stepmania/src/NoteField.h index fc999ba218..a9e9cc66fb 100644 --- a/stepmania/src/NoteField.h +++ b/stepmania/src/NoteField.h @@ -36,7 +36,7 @@ public: float m_fBeginMarker, m_fEndMarker; // only used with MODE_EDIT void FadeToFail(); - void CacheAllUsedNoteSkins(); + void CacheAllUsedNoteSkins( bool bDeleteUnused ); void CacheNoteSkin( CString skin ); void Step( int iCol, TapNoteScore score ); diff --git a/stepmania/src/Player.h b/stepmania/src/Player.h index 7ffbf378b3..936507d0d6 100644 --- a/stepmania/src/Player.h +++ b/stepmania/src/Player.h @@ -54,7 +54,7 @@ public: static float GetMaxStepDistanceSeconds(); - void CacheAllUsedNoteSkins() { m_pNoteField->CacheAllUsedNoteSkins(); } + void CacheAllUsedNoteSkins( bool bDeleteUnused ) { m_pNoteField->CacheAllUsedNoteSkins(bDeleteUnused); } NoteDataWithScoring m_NoteData; diff --git a/stepmania/src/ScreenGameplay.cpp b/stepmania/src/ScreenGameplay.cpp index 4d383091a1..c62024c486 100644 --- a/stepmania/src/ScreenGameplay.cpp +++ b/stepmania/src/ScreenGameplay.cpp @@ -866,8 +866,8 @@ void ScreenGameplay::SetupSong( PlayerNumber p, int iSongIndex ) GAMESTATE->m_SongOptions.FromString( a.sModifier ); } - /* Now that course options are applied, load any needed note skins. */ - m_Player[p].CacheAllUsedNoteSkins(); + /* Now that course options are applied, load any needed note skins and unload old ones. */ + m_Player[p].CacheAllUsedNoteSkins( true ); /* Update attack bOn flags. */ GAMESTATE->Update(0);