stage 1 of TimingSegment cleanup: consolidate genericizable code in TimingData, use a proper variable name

This commit is contained in:
Mark Cannon
2011-09-10 03:08:59 +00:00
parent 5c7e13af14
commit 0d4e43f9e3
12 changed files with 239 additions and 542 deletions
+9 -9
View File
@@ -267,7 +267,7 @@ void AdjustSync::AutosyncTempo()
GAMESTATE->m_pCurSong->m_SongTiming.m_fBeat0OffsetInSeconds += fIntercept;
const float fScaleBPM = 1.0f/(1.0f - fSlope);
TimingData &timing = GAMESTATE->m_pCurSong->m_SongTiming;
vector<TimingSegment *> &bpms = timing.allTimingSegments[SEGMENT_BPM];
vector<TimingSegment *> &bpms = timing.m_avpTimingSegments[SEGMENT_BPM];
for (unsigned i = 0; i < bpms.size(); i++)
{
BPMSegment *b = static_cast<BPMSegment *>(bpms[i]);
@@ -277,14 +277,14 @@ void AdjustSync::AutosyncTempo()
/* We assume that the stops were measured as a number of beats.
* Therefore, if we change the bpms, we need to make a similar
* change to the stops. */
vector<TimingSegment *> &stops = timing.allTimingSegments[SEGMENT_STOP];
vector<TimingSegment *> &stops = timing.m_avpTimingSegments[SEGMENT_STOP];
for (unsigned i = 0; i < stops.size(); i++)
{
StopSegment *s = static_cast<StopSegment *>(stops[i]);
s->SetPause(s->GetPause() * (1.0f - fSlope));
}
// Do the same for delays.
vector<TimingSegment *> &delays = timing.allTimingSegments[SEGMENT_DELAY];
vector<TimingSegment *> &delays = timing.m_avpTimingSegments[SEGMENT_DELAY];
for (unsigned i = 0; i < delays.size(); i++)
{
DelaySegment *s = static_cast<DelaySegment *>(delays[i]);
@@ -359,8 +359,8 @@ void AdjustSync::GetSyncChangeTextSong( vector<RString> &vsAddTo )
}
}
vector<TimingSegment *> &bpmTest = testing.allTimingSegments[SEGMENT_BPM];
vector<TimingSegment *> &bpmOrig = original.allTimingSegments[SEGMENT_BPM];
vector<TimingSegment *> &bpmTest = testing.m_avpTimingSegments[SEGMENT_BPM];
vector<TimingSegment *> &bpmOrig = original.m_avpTimingSegments[SEGMENT_BPM];
for( unsigned i=0; i< bpmTest.size(); i++ )
{
BPMSegment *bT = static_cast<BPMSegment *>(bpmTest[i]);
@@ -384,8 +384,8 @@ void AdjustSync::GetSyncChangeTextSong( vector<RString> &vsAddTo )
}
}
vector<TimingSegment *> &stopTest = testing.allTimingSegments[SEGMENT_STOP];
vector<TimingSegment *> &stopOrig = original.allTimingSegments[SEGMENT_STOP];
vector<TimingSegment *> &stopTest = testing.m_avpTimingSegments[SEGMENT_STOP];
vector<TimingSegment *> &stopOrig = original.m_avpTimingSegments[SEGMENT_STOP];
for( unsigned i=0; i< stopTest.size(); i++ )
{
StopSegment *sT = static_cast<StopSegment *>(stopTest[i]);
@@ -409,8 +409,8 @@ void AdjustSync::GetSyncChangeTextSong( vector<RString> &vsAddTo )
}
}
vector<TimingSegment *> &delyTest = testing.allTimingSegments[SEGMENT_DELAY];
vector<TimingSegment *> &delyOrig = original.allTimingSegments[SEGMENT_DELAY];
vector<TimingSegment *> &delyTest = testing.m_avpTimingSegments[SEGMENT_DELAY];
vector<TimingSegment *> &delyOrig = original.m_avpTimingSegments[SEGMENT_DELAY];
for( unsigned i=0; i< delyTest.size(); i++ )
{
DelaySegment *sT = static_cast<DelaySegment *>(delyTest[i]);
+2 -2
View File
@@ -421,7 +421,7 @@ void BackgroundImpl::LoadFromRandom( float fFirstBeat, float fEndBeat, const Bac
const TimingData &timing = m_pSong->m_SongTiming;
// change BG every time signature change or 4 measures
const vector<TimingSegment *> &tSigs = timing.allTimingSegments[SEGMENT_TIME_SIG];
const vector<TimingSegment *> &tSigs = timing.m_avpTimingSegments[SEGMENT_TIME_SIG];
for (unsigned i = 0; i < tSigs.size(); i++)
{
@@ -448,7 +448,7 @@ void BackgroundImpl::LoadFromRandom( float fFirstBeat, float fEndBeat, const Bac
}
// change BG every BPM change that is at the beginning of a measure
const vector<TimingSegment *> &bpms = timing.allTimingSegments[SEGMENT_BPM];
const vector<TimingSegment *> &bpms = timing.m_avpTimingSegments[SEGMENT_BPM];
for( unsigned i=0; i<bpms.size(); i++ )
{
bool bAtBeginningOfMeasure = false;
+1 -1
View File
@@ -856,7 +856,7 @@ void NoteField::DrawPrimitives()
}
const TimingData *pTiming = GetDisplayedTiming(m_pPlayerState);
const vector<TimingSegment *> *segs = pTiming->allTimingSegments;
const vector<TimingSegment *> *segs = pTiming->m_avpTimingSegments;
unsigned i = 0;
// Draw beat bars
if( ( GAMESTATE->IsEditing() || SHOW_BEAT_BARS ) && pTiming != NULL )
+2 -2
View File
@@ -41,8 +41,8 @@ static void Deserialize(TimingSegment &seg_, const Json::Value &root)
static void Deserialize(TimingData &td, const Json::Value &root)
{
JsonUtil::DeserializeVectorPointers( td.allTimingSegments[SEGMENT_BPM], Deserialize, root["BpmSegments"] );
JsonUtil::DeserializeVectorPointers( td.allTimingSegments[SEGMENT_STOP], Deserialize, root["StopSegments"] );
JsonUtil::DeserializeVectorPointers( td.m_avpTimingSegments[SEGMENT_BPM], Deserialize, root["BpmSegments"] );
JsonUtil::DeserializeVectorPointers( td.m_avpTimingSegments[SEGMENT_STOP], Deserialize, root["StopSegments"] );
}
static void Deserialize(LyricSegment &o, const Json::Value &root)
+1 -1
View File
@@ -927,7 +927,7 @@ bool SMLoader::LoadFromSimfile( const RString &sPath, Song &out, bool bFromCache
}
// Ensure all warps from negative time changes are in order.
vector<TimingSegment *> &warps = out.m_SongTiming.allTimingSegments[SEGMENT_WARP];
vector<TimingSegment *> &warps = out.m_SongTiming.m_avpTimingSegments[SEGMENT_WARP];
sort(warps.begin(), warps.end());
TidyUpData( out, bFromCache );
return true;
+2 -2
View File
@@ -354,7 +354,7 @@ bool NotesWriterDWI::Write( RString sPath, const Song &out )
f.PutLine( ssprintf("#TITLE:%s;", DwiEscape(out.GetTranslitFullTitle()).c_str()) );
f.PutLine( ssprintf("#ARTIST:%s;", DwiEscape(out.GetTranslitArtist()).c_str()) );
const vector<TimingSegment *> &bpms = out.m_SongTiming.allTimingSegments[SEGMENT_BPM];
const vector<TimingSegment *> &bpms = out.m_SongTiming.m_avpTimingSegments[SEGMENT_BPM];
ASSERT_M(bpms[0]->GetRow() == 0,
ssprintf("The first BPM Segment must be defined at row 0, not %d!", bpms[0]->GetRow()) );
@@ -382,7 +382,7 @@ bool NotesWriterDWI::Write( RString sPath, const Song &out )
}
// TODO: Also check for delays, add them as stops minus one row?
const vector<TimingSegment *> &stops = out.m_SongTiming.allTimingSegments[SEGMENT_STOP];
const vector<TimingSegment *> &stops = out.m_SongTiming.m_avpTimingSegments[SEGMENT_STOP];
if( !stops.empty() )
{
f.Write( "#FREEZE:" );
+2 -2
View File
@@ -24,8 +24,8 @@ static void Serialize(const TimingSegment &seg, Json::Value &root)
static void Serialize(const TimingData &td, Json::Value &root)
{
JsonUtil::SerializeVectorPointers( td.allTimingSegments[SEGMENT_BPM], Serialize, root["BpmSegments"] );
JsonUtil::SerializeVectorPointers( td.allTimingSegments[SEGMENT_STOP], Serialize, root["StopSegments"] );
JsonUtil::SerializeVectorPointers( td.m_avpTimingSegments[SEGMENT_BPM], Serialize, root["BpmSegments"] );
JsonUtil::SerializeVectorPointers( td.m_avpTimingSegments[SEGMENT_STOP], Serialize, root["StopSegments"] );
}
static void Serialize(const LyricSegment &o, Json::Value &root)
+4 -4
View File
@@ -75,7 +75,7 @@ static void WriteGlobalTags( RageFile &f, Song &out )
f.Write( "#BPMS:" );
vector<TimingSegment *> &bpms = timing.allTimingSegments[SEGMENT_BPM];
vector<TimingSegment *> &bpms = timing.m_avpTimingSegments[SEGMENT_BPM];
for( unsigned i=0; i<bpms.size(); i++ )
{
const BPMSegment *bs = static_cast<BPMSegment *>(bpms[i]);
@@ -86,7 +86,7 @@ static void WriteGlobalTags( RageFile &f, Song &out )
}
f.PutLine( ";" );
vector<TimingSegment *> &warps = timing.allTimingSegments[SEGMENT_WARP];
vector<TimingSegment *> &warps = timing.m_avpTimingSegments[SEGMENT_WARP];
unsigned wSize = warps.size();
if( wSize > 0 )
{
@@ -102,8 +102,8 @@ static void WriteGlobalTags( RageFile &f, Song &out )
}
// TODO: make Delays into Stops that start one row before.
vector<TimingSegment *> &stops = timing.allTimingSegments[SEGMENT_STOP];
vector<TimingSegment *> &delays = timing.allTimingSegments[SEGMENT_DELAY];
vector<TimingSegment *> &stops = timing.m_avpTimingSegments[SEGMENT_STOP];
vector<TimingSegment *> &delays = timing.m_avpTimingSegments[SEGMENT_DELAY];
map<float, float> allPauses;
for( unsigned i=0; i<stops.size(); i++ )
+11 -11
View File
@@ -68,7 +68,7 @@ static void GetTimingTags( vector<RString> &lines, TimingData timing, bool bIsSo
unsigned i = 0;
w.Init( "BPMS" );
vector<TimingSegment *> &bpms = timing.allTimingSegments[SEGMENT_BPM];
vector<TimingSegment *> &bpms = timing.m_avpTimingSegments[SEGMENT_BPM];
for (; i < bpms.size(); i++)
{
BPMSegment *bs = static_cast<BPMSegment *>(bpms[i]);
@@ -77,7 +77,7 @@ static void GetTimingTags( vector<RString> &lines, TimingData timing, bool bIsSo
w.Finish();
w.Init( "STOPS" );
vector<TimingSegment *> &stops = timing.allTimingSegments[SEGMENT_STOP];
vector<TimingSegment *> &stops = timing.m_avpTimingSegments[SEGMENT_STOP];
for (i = 0; i < stops.size(); i++)
{
StopSegment *ss = static_cast<StopSegment *>(stops[i]);
@@ -86,7 +86,7 @@ static void GetTimingTags( vector<RString> &lines, TimingData timing, bool bIsSo
w.Finish();
w.Init( "DELAYS" );
vector<TimingSegment *> &delays = timing.allTimingSegments[SEGMENT_DELAY];
vector<TimingSegment *> &delays = timing.m_avpTimingSegments[SEGMENT_DELAY];
for (i = 0; i < delays.size(); i++)
{
DelaySegment *ss = static_cast<DelaySegment *>(delays[i]);
@@ -95,7 +95,7 @@ static void GetTimingTags( vector<RString> &lines, TimingData timing, bool bIsSo
w.Finish();
w.Init( "WARPS" );
vector<TimingSegment *> &warps = timing.allTimingSegments[SEGMENT_WARP];
vector<TimingSegment *> &warps = timing.m_avpTimingSegments[SEGMENT_WARP];
for (i = 0; i < warps.size(); i++)
{
WarpSegment *ws = static_cast<WarpSegment *>(warps[i]);
@@ -103,7 +103,7 @@ static void GetTimingTags( vector<RString> &lines, TimingData timing, bool bIsSo
}
w.Finish();
vector<TimingSegment *> &tSigs = timing.allTimingSegments[SEGMENT_TIME_SIG];
vector<TimingSegment *> &tSigs = timing.m_avpTimingSegments[SEGMENT_TIME_SIG];
ASSERT( !tSigs.empty() );
w.Init( "TIMESIGNATURES" );
for (i = 0; i < tSigs.size(); i++)
@@ -113,7 +113,7 @@ static void GetTimingTags( vector<RString> &lines, TimingData timing, bool bIsSo
}
w.Finish();
vector<TimingSegment *> &ticks = timing.allTimingSegments[SEGMENT_TICKCOUNT];
vector<TimingSegment *> &ticks = timing.m_avpTimingSegments[SEGMENT_TICKCOUNT];
ASSERT( !ticks.empty() );
w.Init( "TICKCOUNTS" );
for (i = 0; i < ticks.size(); i++)
@@ -123,7 +123,7 @@ static void GetTimingTags( vector<RString> &lines, TimingData timing, bool bIsSo
}
w.Finish();
vector<TimingSegment *> &combos = timing.allTimingSegments[SEGMENT_COMBO];
vector<TimingSegment *> &combos = timing.m_avpTimingSegments[SEGMENT_COMBO];
ASSERT( !combos.empty() );
w.Init( "COMBOS" );
for (i = 0; i < combos.size(); i++)
@@ -137,7 +137,7 @@ static void GetTimingTags( vector<RString> &lines, TimingData timing, bool bIsSo
w.Finish();
// Song Timing should only have the initial value.
vector<TimingSegment *> &speeds = timing.allTimingSegments[SEGMENT_SPEED];
vector<TimingSegment *> &speeds = timing.m_avpTimingSegments[SEGMENT_SPEED];
w.Init( "SPEEDS" );
for (i = 0; i < speeds.size(); i++)
{
@@ -147,7 +147,7 @@ static void GetTimingTags( vector<RString> &lines, TimingData timing, bool bIsSo
w.Finish();
w.Init( "SCROLLS" );
vector<TimingSegment *> &scrolls = timing.allTimingSegments[SEGMENT_SCROLL];
vector<TimingSegment *> &scrolls = timing.m_avpTimingSegments[SEGMENT_SCROLL];
for (i = 0; i < scrolls.size(); i++)
{
ScrollSegment *ss = static_cast<ScrollSegment *>(scrolls[i]);
@@ -157,7 +157,7 @@ static void GetTimingTags( vector<RString> &lines, TimingData timing, bool bIsSo
if( !bIsSong )
{
vector<TimingSegment *> &fakes = timing.allTimingSegments[SEGMENT_FAKE];
vector<TimingSegment *> &fakes = timing.m_avpTimingSegments[SEGMENT_FAKE];
w.Init( "FAKES" );
for (i = 0; i < fakes.size(); i++)
{
@@ -168,7 +168,7 @@ static void GetTimingTags( vector<RString> &lines, TimingData timing, bool bIsSo
}
w.Init( "LABELS" );
vector<TimingSegment *> &labels = timing.allTimingSegments[SEGMENT_LABEL];
vector<TimingSegment *> &labels = timing.m_avpTimingSegments[SEGMENT_LABEL];
for (i = 0; i < labels.size(); i++)
{
LabelSegment *ls = static_cast<LabelSegment *>(labels[i]);
+7 -7
View File
@@ -1893,7 +1893,7 @@ void ScreenEdit::InputEdit( const InputEventPlus &input, EditButton EditB )
fDelta *= 40;
}
unsigned i;
vector<TimingSegment *> &stops = GetAppropriateTiming().allTimingSegments[SEGMENT_STOP];
vector<TimingSegment *> &stops = GetAppropriateTiming().m_avpTimingSegments[SEGMENT_STOP];
for( i=0; i<stops.size(); i++ )
{
if( stops[i]->GetRow() == GetRow() )
@@ -4315,10 +4315,10 @@ void ScreenEdit::HandleAreaMenuChoice( AreaMenuChoice c, const vector<int> &iAns
{
/* TODO: Maybe wipe out the already there timing data first?
* We need to identify the max row within the timing data first. */
for (unsigned i = 0; i < this->clipboardTiming.allTimingSegments[tst].size(); i++)
for (unsigned i = 0; i < this->clipboardTiming.m_avpTimingSegments[tst].size(); i++)
{
// TODO: This REALLY needs improving.
TimingSegment * org = this->clipboardTiming.allTimingSegments[tst][i];
TimingSegment * org = this->clipboardTiming.m_avpTimingSegments[tst][i];
TimingSegment * cpy;
switch (tst)
@@ -4665,7 +4665,7 @@ void ScreenEdit::HandleTimingDataInformationChoice( TimingDataInformationChoice
break;
case time_signature:
{
TimeSignatureSegment * ts = GetAppropriateTiming().GetTimeSignatureSegmentAtBeat( GetBeat() );
const TimeSignatureSegment *ts = GetAppropriateTiming().GetTimeSignatureSegmentAtBeat( GetBeat() );
ScreenTextEntry::TextEntry(
SM_BackFromTimeSignatureChange,
ENTER_TIME_SIGNATURE_VALUE,
@@ -4684,7 +4684,7 @@ void ScreenEdit::HandleTimingDataInformationChoice( TimingDataInformationChoice
break;
case combo:
{
ComboSegment *cs = GetAppropriateTiming().GetComboSegmentAtBeat(GetBeat());
const ComboSegment *cs = GetAppropriateTiming().GetComboSegmentAtBeat(GetBeat());
ScreenTextEntry::TextEntry(SM_BackFromComboChange,
ENTER_COMBO_VALUE,
ssprintf( "%d/%d",
@@ -4998,8 +4998,8 @@ void ScreenEdit::CheckNumberOfNotesAndUndo()
{
if( EDIT_MODE.GetValue() != EditMode_Home )
return;
TimeSignatureSegment * curTime = GAMESTATE->m_pCurSong->m_SongTiming.GetTimeSignatureSegmentAtBeat( GAMESTATE->m_pPlayerState[PLAYER_1]->m_Position.m_fSongBeat );
const TimeSignatureSegment * curTime = GAMESTATE->m_pCurSong->m_SongTiming.GetTimeSignatureSegmentAtBeat( GAMESTATE->m_pPlayerState[PLAYER_1]->m_Position.m_fSongBeat );
int rowsPerMeasure = curTime->GetDen() * curTime->GetNum();
for( int row=0; row<=m_NoteDataEdit.GetLastRow(); row+=rowsPerMeasure )
+108 -198
View File
@@ -8,8 +8,7 @@
#include <float.h>
TimingData::TimingData(float fOffset) :
m_fBeat0OffsetInSeconds(fOffset)
TimingData::TimingData(float fOffset) : m_fBeat0OffsetInSeconds(fOffset)
{
}
@@ -21,7 +20,7 @@ bool TimingData::empty() const
{
for (unsigned i = 0; i < NUM_TimingSegmentType; i++)
{
if (this->allTimingSegments[i].size() > 0)
if (m_avpTimingSegments[i].size() > 0)
return false;
}
return true;
@@ -34,13 +33,13 @@ TimingData TimingData::CopyRange(int startRow, int endRow) const
FOREACH_ENUM(TimingSegmentType, tst)
{
unsigned cnt = 0;
for (unsigned j = 0; j < this->allTimingSegments[tst].size(); j++)
for (unsigned j = 0; j < m_avpTimingSegments[tst].size(); j++)
{
int row = this->allTimingSegments[tst][j]->GetRow();
int row = m_avpTimingSegments[tst][j]->GetRow();
if (row >= startRow && row < endRow)
{
// TODO: This REALLY needs improving.
TimingSegment * org = this->allTimingSegments[tst][j];
TimingSegment * org = m_avpTimingSegments[tst][j];
TimingSegment * cpy;
switch (tst)
@@ -117,7 +116,7 @@ void TimingData::GetActualBPM( float &fMinBPMOut, float &fMaxBPMOut, float highe
{
fMinBPMOut = FLT_MAX;
fMaxBPMOut = 0;
const vector<TimingSegment *> &bpms = this->allTimingSegments[SEGMENT_BPM];
const vector<TimingSegment *> &bpms = m_avpTimingSegments[SEGMENT_BPM];
for (unsigned i = 0; i < bpms.size(); i++)
{
BPMSegment *seg = static_cast<BPMSegment *>(bpms[i]);
@@ -135,31 +134,14 @@ struct ts_less : binary_function <TimingSegment *, TimingSegment *, bool> {
void TimingData::AddSegment(TimingSegmentType tst, TimingSegment * seg)
{
vector<TimingSegment *> &segs = this->allTimingSegments[tst];
vector<TimingSegment *> &segs = m_avpTimingSegments[tst];
// Unsure if this uses the proper comparison.
segs.insert(upper_bound(segs.begin(), segs.end(), seg, ts_less()), seg);
}
int TimingData::GetSegmentIndexAtRow(TimingSegmentType tst,
int row) const
float TimingData::GetNextSegmentBeatAtRow(TimingSegmentType tst, int row) const
{
const vector<TimingSegment *> &segs = this->allTimingSegments[tst];
unsigned i = 0;
for (; i < segs.size() - 1; i++)
{
TimingSegment *seg = segs[i+1];
if (seg->GetRow() > row)
{
break;
}
}
return static_cast<int>(i);
}
float TimingData::GetNextSegmentBeatAtRow(TimingSegmentType tst,
int row) const
{
const vector<TimingSegment *> segs = this->allTimingSegments[tst];
const vector<TimingSegment *> segs = m_avpTimingSegments[tst];
for (unsigned i = 0; i < segs.size(); i++ )
{
if( segs[i]->GetRow() <= row )
@@ -171,11 +153,10 @@ float TimingData::GetNextSegmentBeatAtRow(TimingSegmentType tst,
return NoteRowToBeat(row);
}
float TimingData::GetPreviousSegmentBeatAtRow(TimingSegmentType tst,
int row) const
float TimingData::GetPreviousSegmentBeatAtRow(TimingSegmentType tst, int row) const
{
float backup = -1;
const vector<TimingSegment *> segs = this->allTimingSegments[tst];
const vector<TimingSegment *> segs = m_avpTimingSegments[tst];
for (unsigned i = 0; i < segs.size(); i++ )
{
if( segs[i]->GetRow() >= row )
@@ -187,13 +168,28 @@ float TimingData::GetPreviousSegmentBeatAtRow(TimingSegmentType tst,
return (backup > -1) ? backup : NoteRowToBeat(row);
}
unsigned TimingData::GetSegmentIndexAtRow(TimingSegmentType tst, int iRow ) const
{
const vector<TimingSegment*> &vSegments = m_avpTimingSegments[tst];
unsigned i = 0;
// seek to the last segment that goes into effect before iRow.
// OPTIMIZATION OPPORTUNITY: use std::upper_bound instead?
for( ; i < vSegments.size() - 1; ++i )
if( iRow < vSegments[i+1]->GetRow() )
break;
return i;
}
// TODO: Find a way to combine all of these SetAtRows to one.
/* Change an existing BPM segment, merge identical segments together or insert a new one. */
void TimingData::SetBPMAtRow( int iNoteRow, float fBPM )
{
unsigned i;
vector<TimingSegment *> &bpms = this->allTimingSegments[SEGMENT_BPM];
vector<TimingSegment *> &bpms = m_avpTimingSegments[SEGMENT_BPM];
for( i=0; i<bpms.size(); i++ )
if( bpms[i]->GetRow() >= iNoteRow )
break;
@@ -219,7 +215,7 @@ void TimingData::SetBPMAtRow( int iNoteRow, float fBPM )
void TimingData::SetStopAtRow( int iRow, float fSeconds )
{
unsigned i;
vector<TimingSegment *> &stops = this->allTimingSegments[SEGMENT_STOP];
vector<TimingSegment *> &stops = m_avpTimingSegments[SEGMENT_STOP];
for( i=0; i<stops.size(); i++ )
if (stops[i]->GetRow() == iRow)
break;
@@ -247,7 +243,7 @@ void TimingData::SetStopAtRow( int iRow, float fSeconds )
void TimingData::SetDelayAtRow( int iRow, float fSeconds )
{
unsigned i;
vector<TimingSegment *> &stops = this->allTimingSegments[SEGMENT_DELAY];
vector<TimingSegment *> &stops = m_avpTimingSegments[SEGMENT_DELAY];
for( i=0; i<stops.size(); i++ )
if (stops[i]->GetRow() == iRow)
break;
@@ -275,7 +271,7 @@ void TimingData::SetDelayAtRow( int iRow, float fSeconds )
void TimingData::SetTimeSignatureAtRow( int iRow, int iNumerator, int iDenominator )
{
unsigned i;
vector<TimingSegment *> &tSigs = this->allTimingSegments[SEGMENT_TIME_SIG];
vector<TimingSegment *> &tSigs = m_avpTimingSegments[SEGMENT_TIME_SIG];
for( i = 0; i < tSigs.size(); i++ )
{
if( tSigs[i]->GetRow() >= iRow)
@@ -304,24 +300,22 @@ void TimingData::SetTimeSignatureAtRow( int iRow, int iNumerator, int iDenominat
}
}
void TimingData::SetTimeSignatureNumeratorAtRow( int iRow, int iNumerator )
void TimingData::SetTimeSignatureNumeratorAtRow( int iRow, int iNum )
{
this->SetTimeSignatureAtRow(iRow,
iNumerator,
GetTimeSignatureSegmentAtRow(iRow)->GetDen());
unsigned iDenom = GetTimeSignatureSegmentAtRow(iRow)->GetDen();
SetTimeSignatureAtRow(iRow, iNum, iDenom );
}
void TimingData::SetTimeSignatureDenominatorAtRow( int iRow, int iDenominator )
void TimingData::SetTimeSignatureDenominatorAtRow( int iRow, int iDenom )
{
this->SetTimeSignatureAtRow(iRow,
GetTimeSignatureSegmentAtRow(iRow)->GetNum(),
iDenominator);
unsigned iNum = GetTimeSignatureSegmentAtRow(iRow)->GetNum();
SetTimeSignatureAtRow( iRow, iNum, iDenom );
}
void TimingData::SetWarpAtRow( int iRow, float fNew )
{
unsigned i;
vector<TimingSegment *> &warps = this->allTimingSegments[SEGMENT_WARP];
vector<TimingSegment *> &warps = m_avpTimingSegments[SEGMENT_WARP];
for( i=0; i<warps.size(); i++ )
if( warps[i]->GetRow() == iRow )
break;
@@ -348,7 +342,7 @@ void TimingData::SetWarpAtRow( int iRow, float fNew )
void TimingData::SetTickcountAtRow( int iRow, int iTicks )
{
unsigned i = 0;
vector<TimingSegment *> &ticks = this->allTimingSegments[SEGMENT_TICKCOUNT];
vector<TimingSegment *> &ticks = m_avpTimingSegments[SEGMENT_TICKCOUNT];
for( i=0; i<ticks.size(); i++ )
if( ticks[i]->GetRow() >= iRow )
break;
@@ -373,7 +367,7 @@ void TimingData::SetTickcountAtRow( int iRow, int iTicks )
void TimingData::SetComboAtRow( int iRow, int iCombo, int iMiss )
{
unsigned i;
vector<TimingSegment *> &combos = this->allTimingSegments[SEGMENT_COMBO];
vector<TimingSegment *> &combos = m_avpTimingSegments[SEGMENT_COMBO];
for( i=0; i<combos.size(); i++ )
if( combos[i]->GetRow() >= iRow )
break;
@@ -401,22 +395,22 @@ void TimingData::SetComboAtRow( int iRow, int iCombo, int iMiss )
void TimingData::SetHitComboAtRow(int iRow, int iCombo)
{
this->SetComboAtRow(iRow,
SetComboAtRow(iRow,
iCombo,
this->GetComboSegmentAtRow(iRow)->GetMissCombo());
GetComboSegmentAtRow(iRow)->GetMissCombo());
}
void TimingData::SetMissComboAtRow(int iRow, int iMiss)
{
this->SetComboAtRow(iRow,
this->GetComboSegmentAtRow(iRow)->GetCombo(),
SetComboAtRow(iRow,
GetComboSegmentAtRow(iRow)->GetCombo(),
iMiss);
}
void TimingData::SetLabelAtRow( int iRow, const RString sLabel )
{
unsigned i;
vector<TimingSegment *> &labels = this->allTimingSegments[SEGMENT_LABEL];
vector<TimingSegment *> &labels = m_avpTimingSegments[SEGMENT_LABEL];
for( i=0; i<labels.size(); i++ )
if( labels[i]->GetRow() >= iRow )
break;
@@ -441,7 +435,7 @@ void TimingData::SetLabelAtRow( int iRow, const RString sLabel )
void TimingData::SetSpeedAtRow( int iRow, float fPercent, float fWait, unsigned short usMode )
{
unsigned i;
vector<TimingSegment *> &speeds = this->allTimingSegments[SEGMENT_SPEED];
vector<TimingSegment *> &speeds = m_avpTimingSegments[SEGMENT_SPEED];
for( i = 0; i < speeds.size(); i++ )
{
if( speeds[i]->GetRow() >= iRow)
@@ -473,7 +467,7 @@ void TimingData::SetSpeedAtRow( int iRow, float fPercent, float fWait, unsigned
void TimingData::SetScrollAtRow( int iRow, float fPercent )
{
unsigned i;
vector<TimingSegment *> &scrolls = this->allTimingSegments[SEGMENT_SCROLL];
vector<TimingSegment *> &scrolls = m_avpTimingSegments[SEGMENT_SCROLL];
for( i = 0; i < scrolls.size(); i++ )
{
if( scrolls[i]->GetRow() >= iRow)
@@ -503,7 +497,7 @@ void TimingData::SetScrollAtRow( int iRow, float fPercent )
void TimingData::SetFakeAtRow( int iRow, float fNew )
{
unsigned i;
vector<TimingSegment *> &fakes = this->allTimingSegments[SEGMENT_FAKE];
vector<TimingSegment *> &fakes = m_avpTimingSegments[SEGMENT_FAKE];
for( i=0; i<fakes.size(); i++ )
if( fakes[i]->GetRow() == iRow )
break;
@@ -552,7 +546,7 @@ void TimingData::SetSpeedModeAtRow( int iRow, unsigned short usMode )
float TimingData::GetStopAtRow( int iRow ) const
{
const vector<TimingSegment *> &stops = this->allTimingSegments[SEGMENT_STOP];
const vector<TimingSegment *> &stops = m_avpTimingSegments[SEGMENT_STOP];
for( unsigned i=0; i<stops.size(); i++ )
{
const StopSegment *s = static_cast<StopSegment *>(stops[i]);
@@ -567,7 +561,7 @@ float TimingData::GetStopAtRow( int iRow ) const
float TimingData::GetDelayAtRow( int iRow ) const
{
const vector<TimingSegment *> &stops = this->allTimingSegments[SEGMENT_DELAY];
const vector<TimingSegment *> &stops = m_avpTimingSegments[SEGMENT_DELAY];
for( unsigned i=0; i<stops.size(); i++ )
{
const DelaySegment *s = static_cast<DelaySegment *>(stops[i]);
@@ -581,28 +575,28 @@ float TimingData::GetDelayAtRow( int iRow ) const
int TimingData::GetComboAtRow( int iNoteRow ) const
{
const vector<TimingSegment *> &c = this->allTimingSegments[SEGMENT_COMBO];
const int index = this->GetSegmentIndexAtRow(SEGMENT_COMBO, iNoteRow);
const vector<TimingSegment *> &c = m_avpTimingSegments[SEGMENT_COMBO];
const int index = GetSegmentIndexAtRow(SEGMENT_COMBO, iNoteRow);
return static_cast<ComboSegment *>(c[index])->GetCombo();
}
int TimingData::GetMissComboAtRow(int iNoteRow) const
{
const vector<TimingSegment *> &c = this->allTimingSegments[SEGMENT_COMBO];
const int index = this->GetSegmentIndexAtRow(SEGMENT_COMBO, iNoteRow);
const vector<TimingSegment *> &c = m_avpTimingSegments[SEGMENT_COMBO];
const int index = GetSegmentIndexAtRow(SEGMENT_COMBO, iNoteRow);
return static_cast<ComboSegment *>(c[index])->GetMissCombo();
}
RString TimingData::GetLabelAtRow( int iRow ) const
{
const vector<TimingSegment *> &l = this->allTimingSegments[SEGMENT_LABEL];
const int index = this->GetSegmentIndexAtRow(SEGMENT_LABEL, iRow);
const vector<TimingSegment *> &l = m_avpTimingSegments[SEGMENT_LABEL];
const int index = GetSegmentIndexAtRow(SEGMENT_LABEL, iRow);
return static_cast<LabelSegment *>(l[index])->GetLabel();
}
float TimingData::GetWarpAtRow( int iWarpRow ) const
{
const vector<TimingSegment *> &warps = this->allTimingSegments[SEGMENT_WARP];
const vector<TimingSegment *> &warps = m_avpTimingSegments[SEGMENT_WARP];
for( unsigned i=0; i<warps.size(); i++ )
{
if( warps[i]->GetRow() == iWarpRow )
@@ -635,7 +629,7 @@ float TimingData::GetScrollAtRow( int iRow )
float TimingData::GetFakeAtRow( int iFakeRow ) const
{
const vector<TimingSegment *> &fakes = this->allTimingSegments[SEGMENT_FAKE];
const vector<TimingSegment *> &fakes = m_avpTimingSegments[SEGMENT_FAKE];
for( unsigned i=0; i<fakes.size(); i++ )
{
if( fakes[i]->GetRow() == iFakeRow )
@@ -650,7 +644,7 @@ float TimingData::GetFakeAtRow( int iFakeRow ) const
void TimingData::MultiplyBPMInBeatRange( int iStartIndex, int iEndIndex, float fFactor )
{
// Change all other BPM segments in this range.
vector<TimingSegment *> &bpms = this->allTimingSegments[SEGMENT_BPM];
vector<TimingSegment *> &bpms = m_avpTimingSegments[SEGMENT_BPM];
for( unsigned i=0; i<bpms.size(); i++ )
{
BPMSegment *bs = static_cast<BPMSegment *>(bpms[i]);
@@ -692,7 +686,7 @@ void TimingData::MultiplyBPMInBeatRange( int iStartIndex, int iEndIndex, float f
float TimingData::GetBPMAtRow( int iNoteRow ) const
{
unsigned i;
const vector<TimingSegment *> &bpms = this->allTimingSegments[SEGMENT_BPM];
const vector<TimingSegment *> &bpms = m_avpTimingSegments[SEGMENT_BPM];
for( i=0; i<bpms.size()-1; i++ )
if( bpms[i+1]->GetRow() > iNoteRow )
break;
@@ -701,17 +695,17 @@ float TimingData::GetBPMAtRow( int iNoteRow ) const
bool TimingData::IsWarpAtRow( int iNoteRow ) const
{
const vector<TimingSegment *> &warps = this->allTimingSegments[SEGMENT_WARP];
const vector<TimingSegment *> &warps = m_avpTimingSegments[SEGMENT_WARP];
if( warps.empty() )
return false;
int i = GetSegmentIndexAtRow( SEGMENT_WARP, iNoteRow );
const WarpSegment *s = static_cast<WarpSegment *>(warps[i]);
float beatRow = NoteRowToBeat(iNoteRow);
if( s->GetBeat() <= beatRow && beatRow < (s->GetBeat() + s->GetLength() ) )
{
// Allow stops inside warps to allow things like stop, warp, stop, warp, stop, and so on.
if( this->allTimingSegments[SEGMENT_STOP].empty() && this->allTimingSegments[SEGMENT_DELAY].empty() )
if( m_avpTimingSegments[SEGMENT_STOP].empty() && m_avpTimingSegments[SEGMENT_DELAY].empty() )
{
return true;
}
@@ -726,10 +720,10 @@ bool TimingData::IsWarpAtRow( int iNoteRow ) const
bool TimingData::IsFakeAtRow( int iNoteRow ) const
{
const vector<TimingSegment *> &fakes = this->allTimingSegments[SEGMENT_FAKE];
const vector<TimingSegment *> &fakes = m_avpTimingSegments[SEGMENT_FAKE];
if( fakes.empty() )
return false;
int i = GetSegmentIndexAtRow( SEGMENT_FAKE, iNoteRow );
const FakeSegment *s = static_cast<FakeSegment *>(fakes[i]);
float beatRow = NoteRowToBeat(iNoteRow);
@@ -740,44 +734,30 @@ bool TimingData::IsFakeAtRow( int iNoteRow ) const
return false;
}
BPMSegment* TimingData::GetBPMSegmentAtRow( int iNoteRow )
// TODO: make this part of the TimingSegment struct
enum SegmentEffectArea
{
vector<TimingSegment *> &bpms = this->allTimingSegments[SEGMENT_BPM];
if( bpms.empty() )
return new BPMSegment();
EffectArea_Row, // takes effect on a single row
EffectArea_Range, // takes effect until the next segment of its type
NUM_EffectArea,
EffectArea_Invalid,
};
int i = GetSegmentIndexAtRow( SEGMENT_BPM, iNoteRow );
return static_cast<BPMSegment *>(bpms[i]);
}
TimeSignatureSegment* TimingData::GetTimeSignatureSegmentAtRow( int iRow )
TimingSegment* TimingData::GetSegmentAtRow( int iNoteRow, TimingSegmentType tst )
{
unsigned i;
vector<TimingSegment *> &tSigs = this->allTimingSegments[SEGMENT_TIME_SIG];
for( i=0; i<tSigs.size()-1; i++ )
if( tSigs[i+1]->GetRow() > iRow )
vector<TimingSegment*> vSegments = m_avpTimingSegments[tst];
if( vSegments.empty() )
FAIL_M( ssprintf("GetSegmentAtRow: %s is empty (blame vyhd)", TimingSegmentTypeToString(tst).c_str()) );
unsigned index = -1;
// seek to the last segment before this row
for( index = 0; index < vSegments.size() - 1; ++index )
if( iNoteRow < vSegments[index+1]->GetRow() )
break;
return static_cast<TimeSignatureSegment *>(tSigs[i]);
}
SpeedSegment* TimingData::GetSpeedSegmentAtRow( int iRow )
{
unsigned i;
vector<TimingSegment *> &speeds = this->allTimingSegments[SEGMENT_SPEED];
for( i=0; i<speeds.size()-1; i++ )
if( speeds[i+1]->GetRow() > iRow )
break;
return static_cast<SpeedSegment *>(speeds[i]);
}
ScrollSegment* TimingData::GetScrollSegmentAtRow( int iRow )
{
unsigned i;
vector<TimingSegment *> &scrolls = this->allTimingSegments[SEGMENT_SCROLL];
for( i=0; i<scrolls.size()-1; i++ )
if( scrolls[i+1]->GetRow() > iRow )
break;
return static_cast<ScrollSegment *>(scrolls[i]);
return vSegments[index];
}
int TimingData::GetTimeSignatureNumeratorAtRow( int iRow )
@@ -790,86 +770,16 @@ int TimingData::GetTimeSignatureDenominatorAtRow( int iRow )
return GetTimeSignatureSegmentAtRow( iRow )->GetDen();
}
ComboSegment* TimingData::GetComboSegmentAtRow( int iRow )
{
unsigned i;
vector<TimingSegment *> &combos = this->allTimingSegments[SEGMENT_COMBO];
for( i=0; i<combos.size()-1; i++ )
if( combos[i+1]->GetRow() > iRow )
break;
return static_cast<ComboSegment *>(combos[i]);
}
LabelSegment* TimingData::GetLabelSegmentAtRow( int iRow )
{
unsigned i;
vector<TimingSegment *> &labels = this->allTimingSegments[SEGMENT_LABEL];
for( i=0; i<labels.size()-1; i++ )
if( labels[i+1]->GetRow() > iRow )
break;
return static_cast<LabelSegment *>(labels[i]);
}
StopSegment* TimingData::GetStopSegmentAtRow( int iNoteRow )
{
vector<TimingSegment *> &stops = this->allTimingSegments[SEGMENT_STOP];
if( stops.empty() )
return new StopSegment();
int i = GetSegmentIndexAtRow( SEGMENT_STOP, iNoteRow );
return static_cast<StopSegment *>(stops[i]);
}
DelaySegment* TimingData::GetDelaySegmentAtRow( int iNoteRow )
{
vector<TimingSegment *> &stops = this->allTimingSegments[SEGMENT_DELAY];
if( stops.empty() )
return new DelaySegment();
int i = GetSegmentIndexAtRow( SEGMENT_DELAY, iNoteRow );
return static_cast<DelaySegment *>(stops[i]);
}
WarpSegment* TimingData::GetWarpSegmentAtRow( int iRow )
{
vector<TimingSegment *> &warps = this->allTimingSegments[SEGMENT_WARP];
if( warps.empty() )
return new WarpSegment();
int i = GetSegmentIndexAtRow( SEGMENT_WARP, iRow );
return static_cast<WarpSegment *>(warps[i]);
}
FakeSegment* TimingData::GetFakeSegmentAtRow( int iRow )
{
vector<TimingSegment *> &fakes = this->allTimingSegments[SEGMENT_FAKE];
if( fakes.empty() )
return new FakeSegment();
int i = GetSegmentIndexAtRow( SEGMENT_FAKE, iRow );
return static_cast<FakeSegment *>(fakes[i]);
}
TickcountSegment* TimingData::GetTickcountSegmentAtRow( int iRow )
{
vector<TimingSegment *> &ticks = this->allTimingSegments[SEGMENT_TICKCOUNT];
if( ticks.empty() )
return new TickcountSegment();
int i = GetSegmentIndexAtRow( SEGMENT_TICKCOUNT, iRow );
return static_cast<TickcountSegment *>(ticks[i]);
}
int TimingData::GetTickcountAtRow( int iRow ) const
{
const vector<TimingSegment *> &ticks = this->allTimingSegments[SEGMENT_TICKCOUNT];
const vector<TimingSegment *> &ticks = m_avpTimingSegments[SEGMENT_TICKCOUNT];
const int index = GetSegmentIndexAtRow( SEGMENT_TICKCOUNT, iRow );
return static_cast<TickcountSegment *>(ticks[index])->GetTicks();
}
bool TimingData::DoesLabelExist( RString sLabel ) const
{
const vector<TimingSegment *> &labels = this->allTimingSegments[SEGMENT_LABEL];
const vector<TimingSegment *> &labels = m_avpTimingSegments[SEGMENT_LABEL];
for (unsigned i = 0; i < labels.size(); i++)
{
if (static_cast<LabelSegment *>(labels[i])->GetLabel() == sLabel)
@@ -899,7 +809,7 @@ enum
void TimingData::GetBeatAndBPSFromElapsedTimeNoOffset( float fElapsedTime, float &fBeatOut, float &fBPSOut, bool &bFreezeOut, bool &bDelayOut, int &iWarpBeginOut, float &fWarpDestinationOut ) const
{
const vector<TimingSegment *> * segs = this->allTimingSegments;
const vector<TimingSegment *> * segs = m_avpTimingSegments;
vector<TimingSegment *>::const_iterator itBPMS = segs[SEGMENT_BPM].begin();
vector<TimingSegment *>::const_iterator itWS = segs[SEGMENT_WARP].begin();
vector<TimingSegment *>::const_iterator itSS = segs[SEGMENT_STOP].begin();
@@ -1037,7 +947,7 @@ float TimingData::GetElapsedTimeFromBeat( float fBeat ) const
float TimingData::GetElapsedTimeFromBeatNoOffset( float fBeat ) const
{
const vector<TimingSegment *> * segs = this->allTimingSegments;
const vector<TimingSegment *> * segs = m_avpTimingSegments;
vector<TimingSegment *>::const_iterator itBPMS = segs[SEGMENT_BPM].begin();
vector<TimingSegment *>::const_iterator itWS = segs[SEGMENT_WARP].begin();
vector<TimingSegment *>::const_iterator itSS = segs[SEGMENT_STOP].begin();
@@ -1138,7 +1048,7 @@ float TimingData::GetDisplayedBeat( float fBeat ) const
{
float fOutBeat = 0;
unsigned i;
const vector<TimingSegment *> &scrolls = this->allTimingSegments[SEGMENT_SCROLL];
const vector<TimingSegment *> &scrolls = m_avpTimingSegments[SEGMENT_SCROLL];
for( i=0; i<scrolls.size()-1; i++ )
{
if( scrolls[i+1]->GetBeat() > fBeat )
@@ -1160,9 +1070,9 @@ void TimingData::ScaleRegion( float fScale, int iStartIndex, int iEndIndex, bool
for (unsigned i = 0; i < NUM_TimingSegmentType; i++)
{
for (unsigned j = 0; j < this->allTimingSegments[i].size(); j++)
for (unsigned j = 0; j < m_avpTimingSegments[i].size(); j++)
{
this->allTimingSegments[i][j]->Scale(iStartIndex, length, newLength);
m_avpTimingSegments[i][j]->Scale(iStartIndex, length, newLength);
}
}
@@ -1171,7 +1081,7 @@ void TimingData::ScaleRegion( float fScale, int iStartIndex, int iEndIndex, bool
{
int iNewEndIndex = iStartIndex + newLength;
float fEndBPMBeforeScaling = GetBPMAtRow(iNewEndIndex);
vector<TimingSegment *> &bpms = this->allTimingSegments[SEGMENT_BPM];
vector<TimingSegment *> &bpms = m_avpTimingSegments[SEGMENT_BPM];
// adjust BPM changes "between" iStartIndex and iNewEndIndex
for ( unsigned i = 0; i < bpms.size(); i++ )
@@ -1197,7 +1107,7 @@ void TimingData::InsertRows( int iStartRow, int iRowsToAdd )
{
for (unsigned i = 0; i < NUM_TimingSegmentType; i++)
{
vector<TimingSegment *> &segs = this->allTimingSegments[i];
vector<TimingSegment *> &segs = m_avpTimingSegments[i];
for (unsigned j = 0; j < segs.size(); j++)
{
TimingSegment *seg = segs[j];
@@ -1211,7 +1121,7 @@ void TimingData::InsertRows( int iStartRow, int iRowsToAdd )
{
/* If we're shifting up at the beginning, we just shifted up the first
* BPMSegment. That segment must always begin at 0. */
vector<TimingSegment *> &bpms = this->allTimingSegments[SEGMENT_BPM];
vector<TimingSegment *> &bpms = m_avpTimingSegments[SEGMENT_BPM];
ASSERT_M( bpms.size() > 0, "There must be at least one BPM Segment in the chart!" );
bpms[0]->SetRow(0);
}
@@ -1221,13 +1131,13 @@ void TimingData::InsertRows( int iStartRow, int iRowsToAdd )
void TimingData::DeleteRows( int iStartRow, int iRowsToDelete )
{
/* Remember the BPM at the end of the region being deleted. */
float fNewBPM = this->GetBPMAtBeat( NoteRowToBeat(iStartRow+iRowsToDelete) );
float fNewBPM = GetBPMAtBeat( NoteRowToBeat(iStartRow+iRowsToDelete) );
/* We're moving rows up. Delete any BPM changes and stops in the region
* being deleted. */
for (unsigned i = 0; i < NUM_TimingSegmentType; i++)
{
vector<TimingSegment *> &segs = this->allTimingSegments[i];
vector<TimingSegment *> &segs = m_avpTimingSegments[i];
for (unsigned j = 0; j < segs.size(); j++)
{
TimingSegment *seg = segs[j];
@@ -1248,7 +1158,7 @@ void TimingData::DeleteRows( int iStartRow, int iRowsToDelete )
}
}
this->SetBPMAtRow( iStartRow, fNewBPM );
SetBPMAtRow( iStartRow, fNewBPM );
}
float TimingData::GetDisplayedSpeedPercent( float fSongBeat, float fMusicSeconds ) const
@@ -1259,7 +1169,7 @@ float TimingData::GetDisplayedSpeedPercent( float fSongBeat, float fMusicSeconds
* isn't existing. */
if (!this) return 1.0f;
const vector<TimingSegment *> &speeds = this->allTimingSegments[SEGMENT_SPEED];
const vector<TimingSegment *> &speeds = m_avpTimingSegments[SEGMENT_SPEED];
if( speeds.size() == 0 )
return 1.0f;
@@ -1310,7 +1220,7 @@ float TimingData::GetDisplayedSpeedPercent( float fSongBeat, float fMusicSeconds
void TimingData::TidyUpData()
{
// If there are no BPM segments, provide a default.
vector<TimingSegment *> *segs = this->allTimingSegments;
vector<TimingSegment *> *segs = m_avpTimingSegments;
if( segs[SEGMENT_BPM].empty() )
{
LOG->UserLog( "Song file", m_sFile, "has no BPM segments, default provided." );
@@ -1367,39 +1277,39 @@ void TimingData::TidyUpData()
bool TimingData::HasBpmChanges() const
{
return this->allTimingSegments[SEGMENT_BPM].size()>1;
return m_avpTimingSegments[SEGMENT_BPM].size()>1;
}
bool TimingData::HasStops() const
{
return this->allTimingSegments[SEGMENT_STOP].size()>0;
return m_avpTimingSegments[SEGMENT_STOP].size()>0;
}
bool TimingData::HasDelays() const
{
return this->allTimingSegments[SEGMENT_DELAY].size()>0;
return m_avpTimingSegments[SEGMENT_DELAY].size()>0;
}
bool TimingData::HasWarps() const
{
return this->allTimingSegments[SEGMENT_WARP].size()>0;
return m_avpTimingSegments[SEGMENT_WARP].size()>0;
}
bool TimingData::HasFakes() const
{
return this->allTimingSegments[SEGMENT_FAKE].size()>0;
return m_avpTimingSegments[SEGMENT_FAKE].size()>0;
}
bool TimingData::HasSpeedChanges() const
{
const vector<TimingSegment *> &speeds = this->allTimingSegments[SEGMENT_SPEED];
const vector<TimingSegment *> &speeds = m_avpTimingSegments[SEGMENT_SPEED];
return (speeds.size()>1 ||
static_cast<SpeedSegment *>(speeds[0])->GetRatio() != 1);
}
bool TimingData::HasScrollChanges() const
{
const vector<TimingSegment *> &scrolls = this->allTimingSegments[SEGMENT_SCROLL];
const vector<TimingSegment *> &scrolls = m_avpTimingSegments[SEGMENT_SCROLL];
return (scrolls.size()>1 ||
static_cast<ScrollSegment *>(scrolls[0])->GetRatio() != 1);
}
@@ -1407,7 +1317,7 @@ bool TimingData::HasScrollChanges() const
void TimingData::NoteRowToMeasureAndBeat( int iNoteRow, int &iMeasureIndexOut, int &iBeatIndexOut, int &iRowsRemainder ) const
{
iMeasureIndexOut = 0;
const vector<TimingSegment *> &tSigs = this->allTimingSegments[SEGMENT_TIME_SIG];
const vector<TimingSegment *> &tSigs = m_avpTimingSegments[SEGMENT_TIME_SIG];
for (unsigned i = 0; i < tSigs.size(); i++)
{
TimeSignatureSegment *curSig = static_cast<TimeSignatureSegment *>(tSigs[i]);
@@ -1441,7 +1351,7 @@ void TimingData::NoteRowToMeasureAndBeat( int iNoteRow, int &iMeasureIndexOut, i
vector<RString> TimingData::ToVectorString(TimingSegmentType tst, int dec) const
{
const vector<TimingSegment *> segs = this->allTimingSegments[tst];
const vector<TimingSegment *> segs = m_avpTimingSegments[tst];
vector<RString> ret;
for (unsigned i = 0; i < segs.size(); i++)
@@ -1513,7 +1423,7 @@ public:
static int GetBPMs( T* p, lua_State *L )
{
vector<float> vBPMs;
vector<TimingSegment *> &bpms = p->allTimingSegments[SEGMENT_BPM];
vector<TimingSegment *> &bpms = p->m_avpTimingSegments[SEGMENT_BPM];
for (unsigned i = 0; i < bpms.size(); i++)
{
BPMSegment *seg = static_cast<BPMSegment *>(bpms[i]);
+90 -303
View File
@@ -17,43 +17,33 @@ class TimingData
{
public:
void AddSegment(TimingSegmentType tst, TimingSegment * seg);
int GetSegmentIndexAtRow(TimingSegmentType tst,
int row) const;
int GetSegmentIndexAtBeat(TimingSegmentType tst,
float beat) const
unsigned GetSegmentIndexAtRow(TimingSegmentType tst, int row) const;
unsigned GetSegmentIndexAtBeat(TimingSegmentType tst, float beat) const
{
return this->GetSegmentIndexAtRow(tst, BeatToNoteRow(beat));
return GetSegmentIndexAtRow( tst, BeatToNoteRow(beat) );
}
float GetNextSegmentBeatAtRow(TimingSegmentType tst,
int row) const;
float GetNextSegmentBeatAtBeat(TimingSegmentType tst,
float beat) const
float GetNextSegmentBeatAtRow(TimingSegmentType tst, int row) const;
float GetNextSegmentBeatAtBeat(TimingSegmentType tst, float beat) const
{
return this->GetNextSegmentBeatAtRow(tst, BeatToNoteRow(beat));
return GetNextSegmentBeatAtRow( tst, BeatToNoteRow(beat) );
}
float GetPreviousSegmentBeatAtRow(TimingSegmentType tst,
int row) const;
float GetPreviousSegmentBeatAtBeat(TimingSegmentType tst,
float beat) const
float GetPreviousSegmentBeatAtRow(TimingSegmentType tst, int row) const;
float GetPreviousSegmentBeatAtBeat(TimingSegmentType tst, float beat) const
{
return this->GetPreviousSegmentBeatAtRow(tst, BeatToNoteRow(beat));
return GetPreviousSegmentBeatAtRow( tst, BeatToNoteRow(beat) );
}
bool empty() const;
/**
* @brief Sets up initial timing data with a defined offset.
* @param fOffset the offset from the 0th beat. */
TimingData(float fOffset = 0);
~TimingData();
TimingData CopyRange(int startRow, int endRow) const;
/**
* @brief Gets the actual BPM of the song,
@@ -89,19 +79,54 @@ public:
* @param fBPM the BPM.
*/
void SetBPMAtBeat( float fBeat, float fBPM ) { SetBPMAtRow( BeatToNoteRow(fBeat), fBPM ); }
/**
* @brief Retrieve the BPMSegment at the specified row.
* @param iNoteRow the row that has a BPMSegment.
* @return the BPMSegment in question.
* @brief Retrieve the TimingSegment at the specified row.
* @param iNoteRow the row that has a TimingSegment.
* @param tst the TimingSegmentType requested.
* @return the segment in question.
*/
BPMSegment* GetBPMSegmentAtRow( int iNoteRow );
TimingSegment* GetSegmentAtRow( int iNoteRow, TimingSegmentType tst );
/**
* @brief Retrieve the BPMSegment at the specified beat.
* @param fBeat the beat that has a BPMSegment.
* @return the BPMSegment in question.
* @brief Retrieve the TimingSegment at the given beat.
* @param fBeat the beat that has a TimingSegment.
* @param tst the TimingSegmentType requested.
* @return the segment in question.
*/
BPMSegment* GetBPMSegmentAtBeat( float fBeat ) { return GetBPMSegmentAtRow( (int)BeatToNoteRow(fBeat)); }
TimingSegment* GetSegmentAtBeat( float fBeat, TimingSegmentType tst )
{
return GetSegmentAtRow( BeatToNoteRow(fBeat), tst );
}
/* XXX: convenience shortcuts. We should get rid of these later. */
#define GetSegmentWithName(Seg, SegType) \
Seg* Get##Seg##AtRow( int iNoteRow ) \
{ \
TimingSegment *t = GetSegmentAtRow( iNoteRow, SegType ); \
return static_cast<Seg*>( t ); \
} \
Seg* Get##Seg##AtBeat( float fBeat ) \
{ \
TimingSegment *t = GetSegmentAtBeat( fBeat, SegType ); \
return static_cast<Seg*>( t ); \
}
// (TimeSignature,TIME_SIG) -> (TimeSignatureSegment,SEGMENT_TIME_SIG)
#define GetSegment(Seg, SegType ) \
GetSegmentWithName( Seg##Segment, SEGMENT_##SegType )
GetSegment( BPM, BPM );
GetSegment( Stop, STOP );
GetSegment( Delay, DELAY );
GetSegment( Warp, WARP );
GetSegment( Label, LABEL );
GetSegment( Tickcount, TICKCOUNT );
GetSegment( Combo, COMBO );
GetSegment( Speed, SPEED );
GetSegment( Scroll, SCROLL );
GetSegment( Fake, FAKE );
GetSegment( TimeSignature, TIME_SIG );
/**
* @brief Retrieve the stop time at the given row.
* @param iNoteRow the row in question.
@@ -114,7 +139,7 @@ public:
* @return the stop time.
*/
float GetStopAtBeat( float fBeat ) const { return GetStopAtRow( BeatToNoteRow(fBeat) ); }
/**
* @brief Set the row to have the new stop time.
* @param iNoteRow the row to have the new stop time.
@@ -127,20 +152,7 @@ public:
* @param fSeconds the new stop time.
*/
void SetStopAtBeat( float fBeat, float fSeconds ) { SetStopAtRow( BeatToNoteRow(fBeat), fSeconds); }
/**
* @brief Retrieve the StopSegment at the specified row.
* @param iNoteRow the row that has a StopSegment.
* @return the StopSegment in question.
*/
StopSegment* GetStopSegmentAtRow( int iNoteRow );
/**
* @brief Retrieve the StopSegment at the specified beat.
* @param fBeat the beat that has a StopSegment.
* @return the StopSegment in question.
*/
StopSegment* GetStopSegmentAtBeat( float fBeat ) { return GetStopSegmentAtRow( BeatToNoteRow(fBeat)); }
/**
* @brief Retrieve the delay time at the given row.
* @param iNoteRow the row in question.
@@ -153,7 +165,7 @@ public:
* @return the delay time.
*/
float GetDelayAtBeat( float fBeat ) const { return GetDelayAtRow( BeatToNoteRow(fBeat) ); }
/**
* @brief Set the row to have the new delay time.
*
@@ -170,19 +182,7 @@ public:
* @param fSeconds the new delay time.
*/
void SetDelayAtBeat( float fBeat, float fSeconds ) { SetDelayAtRow( BeatToNoteRow(fBeat), fSeconds); }
/**
* @brief Retrieve the DelaySegment at the specified row.
* @param iNoteRow the row that has a DelaySegment.
* @return the DelaySegment in question.
*/
DelaySegment* GetDelaySegmentAtRow( int iNoteRow );
/**
* @brief Retrieve the DelaySegment at the specified beat.
* @param fBeat the beat that has a DelaySegment.
* @return the DelaySegment in question.
*/
DelaySegment* GetDelaySegmentAtBeat( float fBeat ) { return GetDelaySegmentAtRow( BeatToNoteRow(fBeat)); }
/**
* @brief Retrieve the Time Signature's numerator at the given row.
* @param iNoteRow the row in question.
@@ -245,19 +245,7 @@ public:
* @param iDenominator the denominator.
*/
void SetTimeSignatureDenominatorAtBeat( float fBeat, int iDenominator ) { SetTimeSignatureDenominatorAtRow( BeatToNoteRow(fBeat), iDenominator); }
/**
* @brief Retrieve the TimeSignatureSegment at the specified row.
* @param iNoteRow the row that has a TimeSignatureSegment.
* @return the TimeSignatureSegment in question.
*/
TimeSignatureSegment* GetTimeSignatureSegmentAtRow( int iNoteRow );
/**
* @brief Retrieve the TimeSignatureSegment at the specified beat.
* @param fBeat the beat that has a TimeSignatureSegment.
* @return the TimeSignatureSegment in question.
*/
TimeSignatureSegment* GetTimeSignatureSegmentAtBeat( float fBeat ) { return GetTimeSignatureSegmentAtRow( BeatToNoteRow(fBeat) ); }
/**
* @brief Determine the beat to warp to.
* @param iRow The row you start on.
@@ -282,18 +270,7 @@ public:
* @param fNew The destination beat.
*/
void SetWarpAtBeat( float fBeat, float fNew ) { SetWarpAtRow( BeatToNoteRow( fBeat ), fNew ); }
/**
* @brief Retrieve the WarpSegment at the specified row.
* @param iRow the row to focus on.
* @return the WarpSegment in question.
*/
WarpSegment* GetWarpSegmentAtRow( int iRow );
/**
* @brief Retrieve the WarpSegment at the specified beat.
* @param fBeat the beat to focus on.
* @return the WarpSegment in question.
*/
WarpSegment* GetWarpSegmentAtBeat( float fBeat ) { return GetWarpSegmentAtRow( BeatToNoteRow( fBeat ) ); }
/**
* @brief Checks if the row is inside a warp.
* @param iRow the row to focus on.
@@ -331,19 +308,7 @@ public:
* @param iTicks the tickcount.
*/
void SetTickcountAtBeat( float fBeat, int iTicks ) { SetTickcountAtRow( BeatToNoteRow( fBeat ), iTicks ); }
/**
* @brief Retrieve the TickcountSegment at the specified row.
* @param iNoteRow the row that has a TickcountSegment.
* @return the TickcountSegment in question.
*/
TickcountSegment* GetTickcountSegmentAtRow( int iNoteRow );
/**
* @brief Retrieve the TickcountSegment at the specified beat.
* @param fBeat the beat that has a TickcountSegment.
* @return the TickcountSegment in question.
*/
TickcountSegment* GetTickcountSegmentAtBeat( float fBeat ) { return GetTickcountSegmentAtRow( BeatToNoteRow(fBeat) ); }
/**
* @brief Retrieve the Combo at the given row.
* @param iNoteRow the row in question.
@@ -418,19 +383,7 @@ public:
* @param iCombo the Miss Combo.
*/
void SetMissComboAtBeat( float fBeat, int iCombo ) { SetMissComboAtRow( BeatToNoteRow( fBeat ), iCombo ); }
/**
* @brief Retrieve the ComboSegment at the specified row.
* @param iNoteRow the row that has a ComboSegment.
* @return the ComboSegment in question.
*/
ComboSegment* GetComboSegmentAtRow( int iNoteRow );
/**
* @brief Retrieve the ComboSegment at the specified beat.
* @param fBeat the beat that has a ComboSegment.
* @return the ComboSegment in question.
*/
ComboSegment* GetComboSegmentAtBeat( float fBeat ) { return GetComboSegmentAtRow( BeatToNoteRow(fBeat) ); }
/**
* @brief Retrieve the Label at the given row.
* @param iNoteRow the row in question.
@@ -455,25 +408,12 @@ public:
* @param sLabel the Label.
*/
void SetLabelAtBeat( float fBeat, const RString sLabel ) { SetLabelAtRow( BeatToNoteRow( fBeat ), sLabel ); }
/**
* @brief Retrieve the LabelSegment at the specified row.
* @param iNoteRow the row that has a LabelSegment.
* @return the LabelSegment in question.
*/
LabelSegment* GetLabelSegmentAtRow( int iNoteRow );
/**
* @brief Retrieve the LabelSegment at the specified beat.
* @param fBeat the beat that has a LabelSegment.
* @return the LabelSegment in question.
*/
LabelSegment* GetLabelSegmentAtBeat( float fBeat ) { return GetLabelSegmentAtRow( BeatToNoteRow(fBeat) ); }
/**
* @brief Determine if the requisite label already exists.
* @param sLabel the label to check.
* @return true if it exists, false otherwise. */
bool DoesLabelExist( RString sLabel ) const;
/**
* @brief Retrieve the Speed's percent at the given row.
* @param iNoteRow the row in question.
@@ -562,21 +502,9 @@ public:
* @param usMode the mode.
*/
void SetSpeedModeAtBeat( float fBeat, unsigned short usMode ) { SetSpeedModeAtRow( BeatToNoteRow(fBeat), usMode); }
/**
* @brief Retrieve the SpeedSegment at the specified row.
* @param iNoteRow the row that has a SpeedSegment.
* @return the SpeedSegment in question.
*/
SpeedSegment* GetSpeedSegmentAtRow( int iNoteRow );
/**
* @brief Retrieve the SpeedSegment at the specified beat.
* @param fBeat the beat that has a SpeedSegment.
* @return the SpeedSegment in question.
*/
SpeedSegment* GetSpeedSegmentAtBeat( float fBeat ) { return GetSpeedSegmentAtRow( BeatToNoteRow(fBeat) ); }
float GetDisplayedSpeedPercent( float fBeat, float fMusicSeconds ) const;
/**
* @brief Retrieve the scrolling factor at the given row.
* @param iNoteRow the row in question.
@@ -602,20 +530,7 @@ public:
* @param fPercent the scrolling factor.
*/
void SetScrollAtBeat( float fBeat, float fPercent ) { SetScrollAtRow( BeatToNoteRow(fBeat), fPercent ); }
/**
* @brief Retrieve the ScrollSegment at the specified row.
* @param iNoteRow the row that has a ScrollSegment.
* @return the ScrollSegment in question.
*/
ScrollSegment* GetScrollSegmentAtRow( int iNoteRow );
/**
* @brief Retrieve the ScrollSegment at the specified beat.
* @param fBeat the beat that has a ScrollSegment.
* @return the ScrollSegment in question.
*/
ScrollSegment* GetScrollSegmentAtBeat( float fBeat ) { return GetScrollSegmentAtRow( BeatToNoteRow(fBeat) ); }
/**
* @brief Determine when the fakes end.
* @param iRow The row you start on.
@@ -640,18 +555,7 @@ public:
* @param fNew The destination beat.
*/
void SetFakeAtBeat( float fBeat, float fNew ) { SetFakeAtRow( BeatToNoteRow( fBeat ), fNew ); }
/**
* @brief Retrieve the FakeSegment at the specified row.
* @param iRow the row to focus on.
* @return the FakeSegment in question.
*/
FakeSegment* GetFakeSegmentAtRow( int iRow );
/**
* @brief Retrieve the FakeSegment at the specified beat.
* @param fBeat the beat to focus on.
* @return the FakeSegment in question.
*/
FakeSegment* GetFakeSegmentAtBeat( float fBeat ) { return GetFakeSegmentAtRow( BeatToNoteRow( fBeat ) ); }
/**
* @brief Checks if the row is inside a fake.
* @param iRow the row to focus on.
@@ -741,151 +645,35 @@ public:
bool HasScrollChanges() const;
/**
* @brief Compare two sets of timing data to see if they are equal.
*
* TODO: Make doubly sure that we're using the operator== on the proper segments,
* not the generic TimingSegment.
* @param other the other TimingData.
* @return the equality or lack thereof of the two TimingData.
*/
bool operator==( const TimingData &other )
{
unsigned i;
COMPARE(allTimingSegments[SEGMENT_BPM].size());
for (i = 0; i < allTimingSegments[SEGMENT_BPM].size(); i++)
FOREACH_ENUM( TimingSegmentType, tst )
{
BPMSegment * segT =
static_cast<BPMSegment *>(this->allTimingSegments[SEGMENT_BPM][i]);
BPMSegment * segO =
static_cast<BPMSegment *>(other.allTimingSegments[SEGMENT_BPM][i]);
if (segT->GetRow() != segO->GetRow()) return false;
if (segT->GetBPS() != segO->GetBPS()) return false;
const vector<TimingSegment*> &us = m_avpTimingSegments[tst];
const vector<TimingSegment*> &them = other.m_avpTimingSegments[tst];
// optimization: check vector sizes before contents
if( us.size() != them.size() )
return false;
if( !std::equal(us.begin(), us.end(), them.begin()) )
return false;
}
COMPARE(allTimingSegments[SEGMENT_STOP].size());
for (i = 0; i < allTimingSegments[SEGMENT_STOP].size(); i++)
{
StopSegment * segT =
static_cast<StopSegment *>(this->allTimingSegments[SEGMENT_STOP][i]);
StopSegment * segO =
static_cast<StopSegment *>(other.allTimingSegments[SEGMENT_STOP][i]);
if (segT->GetRow() != segO->GetRow()) return false;
if (segT->GetPause() != segO->GetPause()) return false;
}
COMPARE(allTimingSegments[SEGMENT_DELAY].size());
for (i = 0; i < allTimingSegments[SEGMENT_DELAY].size(); i++)
{
DelaySegment * segT =
static_cast<DelaySegment *>(this->allTimingSegments[SEGMENT_DELAY][i]);
DelaySegment * segO =
static_cast<DelaySegment *>(other.allTimingSegments[SEGMENT_DELAY][i]);
if (segT->GetRow() != segO->GetRow()) return false;
if (segT->GetPause() != segO->GetPause()) return false;
}
COMPARE(allTimingSegments[SEGMENT_WARP].size());
for (i = 0; i < allTimingSegments[SEGMENT_WARP].size(); i++)
{
WarpSegment * segT =
static_cast<WarpSegment *>(this->allTimingSegments[SEGMENT_WARP][i]);
WarpSegment * segO =
static_cast<WarpSegment *>(other.allTimingSegments[SEGMENT_WARP][i]);
if (segT->GetRow() != segO->GetRow()) return false;
if (segT->GetLength() != segO->GetLength()) return false;
}
COMPARE(allTimingSegments[SEGMENT_TIME_SIG].size());
for (i = 0; i < allTimingSegments[SEGMENT_TIME_SIG].size(); i++)
{
TimeSignatureSegment * segT =
static_cast<TimeSignatureSegment *>(this->allTimingSegments[SEGMENT_TIME_SIG][i]);
TimeSignatureSegment * segO =
static_cast<TimeSignatureSegment *>(other.allTimingSegments[SEGMENT_TIME_SIG][i]);
if (segT->GetRow() != segO->GetRow()) return false;
if (segT->GetNum() != segO->GetNum()) return false;
if (segT->GetDen() != segO->GetDen()) return false;
}
COMPARE(allTimingSegments[SEGMENT_TICKCOUNT].size());
for (i = 0; i < allTimingSegments[SEGMENT_TICKCOUNT].size(); i++)
{
TickcountSegment * segT =
static_cast<TickcountSegment *>(this->allTimingSegments[SEGMENT_TICKCOUNT][i]);
TickcountSegment * segO =
static_cast<TickcountSegment *>(other.allTimingSegments[SEGMENT_TICKCOUNT][i]);
if (segT->GetRow() != segO->GetRow()) return false;
if (segT->GetTicks() != segO->GetTicks()) return false;
}
COMPARE(allTimingSegments[SEGMENT_COMBO].size());
for (i = 0; i < allTimingSegments[SEGMENT_COMBO].size(); i++)
{
ComboSegment * segT =
static_cast<ComboSegment *>(this->allTimingSegments[SEGMENT_COMBO][i]);
ComboSegment * segO =
static_cast<ComboSegment *>(other.allTimingSegments[SEGMENT_COMBO][i]);
if (segT->GetRow() != segO->GetRow()) return false;
if (segT->GetCombo() != segO->GetCombo()) return false;
if (segT->GetMissCombo() != segO->GetMissCombo()) return false;
}
COMPARE(allTimingSegments[SEGMENT_SPEED].size());
for (i = 0; i < allTimingSegments[SEGMENT_SPEED].size(); i++)
{
SpeedSegment * segT =
static_cast<SpeedSegment *>(this->allTimingSegments[SEGMENT_SPEED][i]);
SpeedSegment * segO =
static_cast<SpeedSegment *>(other.allTimingSegments[SEGMENT_SPEED][i]);
if (segT->GetRow() != segO->GetRow()) return false;
if (segT->GetRatio() != segO->GetRatio()) return false;
if (segT->GetLength() != segO->GetLength()) return false;
if (segT->GetUnit() != segO->GetUnit()) return false;
}
COMPARE(allTimingSegments[SEGMENT_SCROLL].size());
for (i = 0; i < allTimingSegments[SEGMENT_SCROLL].size(); i++)
{
ScrollSegment * segT =
static_cast<ScrollSegment *>(this->allTimingSegments[SEGMENT_SCROLL][i]);
ScrollSegment * segO =
static_cast<ScrollSegment *>(other.allTimingSegments[SEGMENT_SCROLL][i]);
if (segT->GetRow() != segO->GetRow()) return false;
if (segT->GetRatio() != segO->GetRatio()) return false;
}
COMPARE(allTimingSegments[SEGMENT_LABEL].size());
for (i = 0; i < allTimingSegments[SEGMENT_LABEL].size(); i++)
{
LabelSegment * segT =
static_cast<LabelSegment *>(this->allTimingSegments[SEGMENT_LABEL][i]);
LabelSegment * segO =
static_cast<LabelSegment *>(other.allTimingSegments[SEGMENT_LABEL][i]);
if (segT->GetRow() != segO->GetRow()) return false;
if (segT->GetLabel() != segO->GetLabel()) return false;
}
COMPARE(allTimingSegments[SEGMENT_FAKE].size());
for (i = 0; i < allTimingSegments[SEGMENT_FAKE].size(); i++)
{
FakeSegment * segT =
static_cast<FakeSegment *>(this->allTimingSegments[SEGMENT_FAKE][i]);
FakeSegment * segO =
static_cast<FakeSegment *>(other.allTimingSegments[SEGMENT_FAKE][i]);
if (segT->GetRow() != segO->GetRow()) return false;
if (segT->GetLength() != segO->GetLength()) return false;
}
COMPARE( m_fBeat0OffsetInSeconds );
return true;
}
/**
* @brief Compare two sets of timing data to see if they are not equal.
* @param other the other TimingData.
* @return the inequality or lack thereof of the two TimingData.
*/
bool operator!=( const TimingData &other ) { return !operator==(other); }
void ScaleRegion( float fScale = 1, int iStartRow = 0, int iEndRow = MAX_NOTE_ROW, bool bAdjustBPM = false );
void InsertRows( int iStartRow, int iRowsToAdd );
void DeleteRows( int iStartRow, int iRowsToDelete );
@@ -903,17 +691,16 @@ public:
* This is for informational purposes only.
*/
RString m_sFile;
// All of the following vectors must be sorted before gameplay.
vector<TimingSegment *> allTimingSegments[NUM_TimingSegmentType];
// All of the following vectors must be sorted before gameplay.
vector<TimingSegment *> m_avpTimingSegments[NUM_TimingSegmentType];
/**
* @brief The initial offset of a song.
*/
float m_fBeat0OffsetInSeconds;
vector<RString> ToVectorString(TimingSegmentType tst, int dec = 6) const;
vector<RString> ToVectorString(TimingSegmentType tst, int dec = 6) const;
};
#undef COMPARE