From 546519e7ec4b0937280f25e5153238105e52c0b7 Mon Sep 17 00:00:00 2001 From: Glenn Maynard Date: Fri, 25 Oct 2002 23:32:50 +0000 Subject: [PATCH] Make m_TapNotes a vector. (Hmm. Not ideal, but better.) Still not completely abstracted (NotesLoaderBMS). --- stepmania/src/NoteData.cpp | 32 ++++++++++++++++++++------------ stepmania/src/NoteData.h | 18 ++++++++++-------- stepmania/src/NotesLoaderBMS.cpp | 14 ++++---------- 3 files changed, 34 insertions(+), 30 deletions(-) diff --git a/stepmania/src/NoteData.cpp b/stepmania/src/NoteData.cpp index 2876e61580..46a95f195f 100644 --- a/stepmania/src/NoteData.cpp +++ b/stepmania/src/NoteData.cpp @@ -24,13 +24,11 @@ NoteData::NoteData() { - memset(m_TapNotes, 0, sizeof(m_TapNotes)); Init(); } NoteData::NoteData(const NoteData &cpy) { - memset(m_TapNotes, 0, sizeof(m_TapNotes)); *this = cpy; } @@ -38,7 +36,7 @@ NoteData &NoteData::operator= (const NoteData &cpy) { Init(); for(int t = 0; t < MAX_NOTE_TRACKS; ++t) - memmove( m_TapNotes[t], cpy.m_TapNotes[t], sizeof(TapNote) * MAX_TAP_NOTE_ROWS ); + m_TapNotes[t] = cpy.m_TapNotes[t]; memmove(m_HoldNotes, cpy.m_HoldNotes, sizeof(m_HoldNotes)); m_iNumTracks = cpy.m_iNumTracks; @@ -48,19 +46,12 @@ NoteData &NoteData::operator= (const NoteData &cpy) void NoteData::Init() { - for(int t = 0; t < MAX_NOTE_TRACKS; ++t) { - if(!m_TapNotes[t]) - m_TapNotes[t] = new TapNote[MAX_TAP_NOTE_ROWS]; - memset( m_TapNotes[t], TAP_EMPTY, sizeof(TapNote) * MAX_TAP_NOTE_ROWS ); - } m_iNumTracks = 0; m_iNumHoldNotes = 0; } NoteData::~NoteData() { - for(int t = 0; t < MAX_NOTE_TRACKS; ++t) - delete[] m_TapNotes[t]; } void NoteData::LoadFromSMNoteDataString( CString sSMNoteData ) @@ -168,6 +159,7 @@ CString NoteData::GetSMNoteDataString() void NoteData::ClearRange( int iNoteIndexBegin, int iNoteIndexEnd ) { this->ConvertHoldNotesTo4s(); + /* XXX: if iNoteIndexEnd == m_TapNotes[0].size(), just erase() */ for( int c=0; cm_iNumTracks ); if( iOriginalTrack == -1 ) continue; - memcpy( m_TapNotes[t], pOriginal->m_TapNotes[iOriginalTrack], MAX_TAP_NOTE_ROWS*sizeof(TapNote) ); + m_TapNotes[t] = pOriginal->m_TapNotes[iOriginalTrack]; } pOriginal->Convert4sToHoldNotes(); @@ -1022,4 +1014,20 @@ NoteType NoteData::GetSmallestNoteTypeForMeasure( int iMeasureIndex ) return NOTE_TYPE_INVALID; // well-formed notes created in the editor should never get here else return nt; -} \ No newline at end of file +} + +void NoteData::PadTapNotes(int rows) +{ + int needed = rows - m_TapNotes[0].size(); + if(needed < 0) return; + vector pad(needed+1, TAP_EMPTY); + for(int track = 0; track < MAX_NOTE_TRACKS; ++track) + m_TapNotes[track].insert(m_TapNotes[track].end(), pad.begin(), pad.end()); +} + +void NoteData::SetTapNote(int track, int row, TapNote t) +{ + if(row < 0) return; + PadTapNotes(row); + m_TapNotes[track][row]=t; +} diff --git a/stepmania/src/NoteData.h b/stepmania/src/NoteData.h index 541c17cb21..d391d87d38 100644 --- a/stepmania/src/NoteData.h +++ b/stepmania/src/NoteData.h @@ -32,21 +32,23 @@ public: NoteData &operator=(const NoteData &cpy); int m_iNumTracks; - TapNote *m_TapNotes[MAX_NOTE_TRACKS]; + + /* Keep this aligned, so that they all have the same size. */ + vector m_TapNotes[MAX_NOTE_TRACKS]; HoldNote m_HoldNotes[MAX_HOLD_NOTES]; int m_iNumHoldNotes; - TapNote GetTapNote(int track, int row) const + /* Return the note at the given track and row. Row may be out of + * range; pretend the song goes on with TAP_EMPTYs indefinitely. */ + inline TapNote GetTapNote(unsigned track, unsigned row) const { - if(row < 0 || row >= MAX_TAP_NOTE_ROWS) return TapNote('0'); + if(row < 0 || row >= m_TapNotes[track].size()) return TapNote(TAP_EMPTY); return m_TapNotes[track][row]; } - void SetTapNote(int track, int row, TapNote t ) - { - if(row < 0 || row >= MAX_TAP_NOTE_ROWS) return; - m_TapNotes[track][row]=t; - } + /* Pad m_TapNotes so it includes the row "rows". */ + void PadTapNotes(int rows); + void SetTapNote(int track, int row, TapNote t); void LoadFromSMNoteDataString( CString sSMNoteData ); CString GetSMNoteDataString(); diff --git a/stepmania/src/NotesLoaderBMS.cpp b/stepmania/src/NotesLoaderBMS.cpp index de4e4e2d88..9968ca80ad 100644 --- a/stepmania/src/NotesLoaderBMS.cpp +++ b/stepmania/src/NotesLoaderBMS.cpp @@ -187,16 +187,10 @@ bool BMSLoader::LoadFromBMSFile( const CString &sPath, Notes &out ) out.m_NotesType == NOTES_TYPE_DANCE_DOUBLE || out.m_NotesType == NOTES_TYPE_DANCE_COUPLE) // if there are 4 panels, then the Up+Right track really contains the notes for Up { - memcpy( - pNoteData->m_TapNotes[DANCE_NOTE_PAD1_UP], - pNoteData->m_TapNotes[DANCE_NOTE_PAD1_UPRIGHT], - MAX_TAP_NOTE_ROWS*sizeof(pNoteData->m_TapNotes[0][0]) - ); - memset( - pNoteData->m_TapNotes[DANCE_NOTE_PAD2_UPRIGHT], - '0', - MAX_TAP_NOTE_ROWS*sizeof(pNoteData->m_TapNotes[0][0]) - ); + pNoteData->m_TapNotes[DANCE_NOTE_PAD1_UP] = + pNoteData->m_TapNotes[DANCE_NOTE_PAD1_UPRIGHT]; + for(unsigned i = 0; i < pNoteData->m_TapNotes[DANCE_NOTE_PAD1_UPRIGHT].size(); ++i) + pNoteData->SetTapNote(DANCE_NOTE_PAD1_UPRIGHT, i, TAP_EMPTY); } // we're done reading in all of the BMS values