diff --git a/stepmania/src/NoteData.cpp b/stepmania/src/NoteData.cpp index e8e61c908c..f7d2463eac 100644 --- a/stepmania/src/NoteData.cpp +++ b/stepmania/src/NoteData.cpp @@ -127,6 +127,101 @@ void NoteData::CopyAll( const NoteData* pFrom ) m_AttackMap = pFrom->m_AttackMap; } +bool NoteData::IsRowEmpty( int index ) const +{ + /* If this is out of range, we don't have any notes there, so all tracks are empty. */ + if( index < 0 || index >= GetMaxRow() ) + return true; + + for( int t=0; t= GetMaxRow() ) + return 0; + + for( int t=0; t= GetMaxRow() ) + return 0; + + int iNum = 0; + for( int t=0; t= GetMaxRow() ) + return 0; + + int iNum = 0; + for( int t=0; t= GetMaxRow() ) + return -1; + + for( int t=0; t= GetMaxRow() ) + return -1; + + for( int t=0; t=0 && add.fEndBeat>=0 ); @@ -313,15 +408,22 @@ int NoteData::GetNumTapNotes( float fStartBeat, float fEndBeat ) const { int iNumNotes = 0; - if(fEndBeat == -1) fEndBeat = GetMaxBeat(); + if( fEndBeat == -1 ) + fEndBeat = GetMaxBeat(); + int iStartIndex = BeatToNoteRow( fStartBeat ); int iEndIndex = BeatToNoteRow( fEndBeat ); + + /* Clamp to known-good ranges. */ + iStartIndex = clamp( iStartIndex, 0, GetMaxRow()-1 ); + iEndIndex = clamp( iEndIndex, 0, GetMaxRow()-1 ); for( int t=0; t= 3 ) @@ -413,8 +524,12 @@ int NoteData::GetNumN( int MinTaps, float fStartBeat, float fEndBeat ) const if( fEndBeat == -1 ) fEndBeat = GetMaxBeat(); - const int iStartIndex = BeatToNoteRow( fStartBeat ); - const int iEndIndex = BeatToNoteRow( fEndBeat ); + int iStartIndex = BeatToNoteRow( fStartBeat ); + int iEndIndex = BeatToNoteRow( fEndBeat ); + + /* Clamp to known-good ranges. */ + iStartIndex = clamp( iStartIndex, 0, GetMaxRow()-1 ); + iEndIndex = clamp( iEndIndex, 0, GetMaxRow()-1 ); int iNum = 0; for( int i=iStartIndex; i<=iEndIndex; i++ ) @@ -422,9 +537,8 @@ int NoteData::GetNumN( int MinTaps, float fStartBeat, float fEndBeat ) const int iNumNotesThisIndex = 0; for( int t=0; t= MinTaps ) @@ -752,6 +866,12 @@ void NoteData::SetTapNote(int track, int row, TapNote t) m_TapNotes[track][row]=t; } +void NoteData::ReserveRows( int row ) +{ + for(int track = 0; track < m_iNumTracks; ++track) + m_TapNotes[track].reserve( row ); +} + void NoteData::EliminateAllButOneTap(int row) { if(row < 0) return; diff --git a/stepmania/src/NoteData.h b/stepmania/src/NoteData.h index 2edfca6b23..de21237fee 100644 --- a/stepmania/src/NoteData.h +++ b/stepmania/src/NoteData.h @@ -58,6 +58,14 @@ public: if(row < 0 || row >= (int) m_TapNotes[track].size()) return TapNote(TAP_EMPTY); return m_TapNotes[track][row]; } + void ReserveRows( int row ); + + /* GetTapNote is called a lot. This one doesn't do any bounds checking, + * which is much faster. Be sure that 0 <= row < GetMaxRow(). */ + inline TapNote GetTapNoteX(unsigned track, int row) const + { + return m_TapNotes[track][row]; + } void MoveTapNoteTrack(int dest, int src); void SetTapNote(int track, int row, TapNote t); @@ -65,71 +73,15 @@ public: void ClearAll(); void CopyRange( const NoteData* pFrom, int iFromIndexBegin, int iFromIndexEnd, int iToIndexBegin = -1 ); void CopyAll( const NoteData* pFrom ); - - inline bool IsRowEmpty( int index ) const - { - for( int t=0; t