more use of beat indexes instead of floating point
It actually looks like almost all of NoteDataUtil can be done naturally in fixed-point: instead of passing around floating point, converting it to fixed point for NoteData indexing, and adding floating-point beat fractions, just pass around fixed point everywhere, and convert beat fractions to fixed-point (which probably happens at compile-time) If TimingData, etc. does the same thing, things will be simpler ...
This commit is contained in:
@@ -908,13 +908,13 @@ void NoteDataUtil::Wide( NoteData &inout, int iStartIndex, int iEndIndex )
|
||||
void NoteDataUtil::Big( NoteData &inout, int iStartIndex, int iEndIndex )
|
||||
{
|
||||
// add 8ths between 4ths
|
||||
InsertIntelligentTaps( inout,1.0f,0.5f,1.0f,false,iStartIndex,iEndIndex );
|
||||
InsertIntelligentTaps( inout,BeatToNoteRow(1.0f), BeatToNoteRow(0.5f), BeatToNoteRow(1.0f), false,iStartIndex,iEndIndex );
|
||||
}
|
||||
|
||||
void NoteDataUtil::Quick( NoteData &inout, int iStartIndex, int iEndIndex )
|
||||
{
|
||||
// add 16ths between 8ths
|
||||
InsertIntelligentTaps( inout,0.5f,0.25f,1.0f,false,iStartIndex,iEndIndex );
|
||||
InsertIntelligentTaps( inout, BeatToNoteRow(0.5f), BeatToNoteRow(0.25f), BeatToNoteRow(1.0f), false,iStartIndex,iEndIndex );
|
||||
}
|
||||
|
||||
// Due to popular request by people annoyed with the "new" implementation of Quick, we now have
|
||||
@@ -928,20 +928,20 @@ void NoteDataUtil::BMRize( NoteData &inout, int iStartIndex, int iEndIndex )
|
||||
void NoteDataUtil::Skippy( NoteData &inout, int iStartIndex, int iEndIndex )
|
||||
{
|
||||
// add 16ths between 4ths
|
||||
InsertIntelligentTaps( inout,1.0f,0.75f,1.0f,true,iStartIndex,iEndIndex );
|
||||
InsertIntelligentTaps( inout, BeatToNoteRow(1.0f), BeatToNoteRow(0.75f),BeatToNoteRow(1.0f), true,iStartIndex,iEndIndex );
|
||||
}
|
||||
|
||||
void NoteDataUtil::InsertIntelligentTaps(
|
||||
NoteData &inout,
|
||||
float fWindowSizeBeats,
|
||||
float fInsertOffsetBeats,
|
||||
float fWindowStrideBeats,
|
||||
int iWindowSizeRows,
|
||||
int iInsertOffsetRows,
|
||||
int iWindowStrideRows,
|
||||
bool bSkippy,
|
||||
int iStartIndex,
|
||||
int iEndIndex )
|
||||
{
|
||||
ASSERT( fInsertOffsetBeats <= fWindowSizeBeats );
|
||||
ASSERT( fWindowSizeBeats <= fWindowStrideBeats );
|
||||
ASSERT( iInsertOffsetRows <= iWindowSizeRows );
|
||||
ASSERT( iWindowSizeRows <= iWindowStrideRows );
|
||||
|
||||
inout.ConvertHoldNotesTo4s();
|
||||
|
||||
@@ -949,18 +949,14 @@ void NoteDataUtil::InsertIntelligentTaps(
|
||||
bool bRequireNoteAtEndOfWindow = true;
|
||||
|
||||
/* Start on a multiple of fBeatInterval. */
|
||||
iStartIndex = Quantize( iStartIndex, BeatToNoteRow(fWindowStrideBeats) );
|
||||
iStartIndex = Quantize( iStartIndex, iWindowStrideRows );
|
||||
|
||||
// Insert a beat in the middle of every fBeatInterval.
|
||||
const int rows_per_window = BeatToNoteRow( fWindowSizeBeats );
|
||||
const int rows_per_stride = BeatToNoteRow( fWindowStrideBeats );
|
||||
const int insert_row_offset = BeatToNoteRow( fInsertOffsetBeats );
|
||||
|
||||
for( int i=iStartIndex; i<iEndIndex; i+=rows_per_stride )
|
||||
for( int i=iStartIndex; i<iEndIndex; i+=iWindowStrideRows )
|
||||
{
|
||||
int iRowEarlier = i;
|
||||
int iRowLater = i + rows_per_window;
|
||||
int iRowToAdd = i + insert_row_offset;
|
||||
int iRowLater = i + iWindowSizeRows;
|
||||
int iRowToAdd = i + iInsertOffsetRows;
|
||||
// following two lines have been changed because the behavior of treating hold-heads
|
||||
// as different from taps doesn't feel right, and because we need to check
|
||||
// against TAP_ADDITION with the BMRize mod.
|
||||
@@ -1057,16 +1053,15 @@ void NoteDataUtil::AddMines( NoteData &inout, int iStartIndex, int iEndIndex )
|
||||
for( int i=0; i<inout.GetNumHoldNotes(); i++ )
|
||||
{
|
||||
HoldNote &hn = inout.GetHoldNote(i);
|
||||
float fHoldEndBeat = hn.GetEndBeat();
|
||||
float fMineBeat = fHoldEndBeat+0.5f;
|
||||
int iMineRow = BeatToNoteRow( fMineBeat );
|
||||
int iHoldEndRow = hn.iEndRow;
|
||||
int iMineRow = iHoldEndRow+BeatToNoteRow(0.5f);
|
||||
|
||||
if( iMineRow < iStartIndex || iMineRow > iEndIndex )
|
||||
continue;
|
||||
|
||||
// Only place a mines if there's not another step nearby
|
||||
int iMineRangeBegin = BeatToNoteRow( fMineBeat-0.5f ) + 1;
|
||||
int iMineRangeEnd = BeatToNoteRow( fMineBeat+0.5f ) - 1;
|
||||
int iMineRangeBegin = iMineRow - BeatToNoteRow( 0.5f ) + 1;
|
||||
int iMineRangeEnd = iMineRow + BeatToNoteRow( 0.5f ) - 1;
|
||||
if( !inout.IsRangeEmpty(hn.iTrack, iMineRangeBegin, iMineRangeEnd) )
|
||||
continue;
|
||||
|
||||
@@ -1179,15 +1174,13 @@ void NoteDataUtil::ConvertTapsToHolds( NoteData &inout, int iSimultaneousHolds,
|
||||
else if( iTapsLeft < 0 )
|
||||
goto dont_add_hold;
|
||||
}
|
||||
float fStartBeat = NoteRowToBeat(r);
|
||||
float fEndBeat = NoteRowToBeat(r2);
|
||||
|
||||
// If the steps end in a tap, convert that tap
|
||||
// to a hold that lasts for at least one beat.
|
||||
if( r2==r+1 )
|
||||
fEndBeat = fStartBeat+1;
|
||||
if( r2 == r+1 )
|
||||
r2 = r+BeatToNoteRow(1);
|
||||
|
||||
inout.AddHoldNote( HoldNote(t,BeatToNoteRow(fStartBeat),BeatToNoteRow(fEndBeat)) );
|
||||
inout.AddHoldNote( HoldNote(t,r,r2) );
|
||||
iTrackAddedThisRow++;
|
||||
}
|
||||
dont_add_hold:
|
||||
@@ -1604,24 +1597,24 @@ void NoteDataUtil::Scale( NoteData &nd, float fScale )
|
||||
|
||||
// added to fix things in the editor - make sure that you're working off data that is
|
||||
// either in 4s or in 2s and 3s.
|
||||
void NoteDataUtil::ScaleRegion( NoteData &nd, float fScale, float fStartBeat, float fEndBeat)
|
||||
void NoteDataUtil::ScaleRegion( NoteData &nd, float fScale, int iStartIndex, int iEndIndex )
|
||||
{
|
||||
ASSERT( fScale > 0 );
|
||||
ASSERT( fStartBeat < fEndBeat );
|
||||
ASSERT( fStartBeat >= 0 );
|
||||
ASSERT( iStartIndex < iEndIndex );
|
||||
ASSERT( iStartIndex >= 0 );
|
||||
|
||||
NoteData temp1, temp2;
|
||||
temp1.Config( nd );
|
||||
temp2.Config( nd );
|
||||
|
||||
const int iFirstRowAtEndOfRegion = min( nd.GetLastRow(), BeatToNoteRowNotRounded(fEndBeat) );
|
||||
const int iScaledFirstRowAfterRegion = (int)((fStartBeat + (fEndBeat - fStartBeat) * fScale) * ROWS_PER_BEAT);
|
||||
const int iFirstRowAtEndOfRegion = min( nd.GetLastRow(), iEndIndex );
|
||||
const int iScaledFirstRowAfterRegion = int(iStartIndex + (iEndIndex - iStartIndex) * fScale);
|
||||
|
||||
if( fStartBeat != 0 )
|
||||
temp1.CopyRange( nd, 0, BeatToNoteRowNotRounded(fStartBeat) );
|
||||
if( iStartIndex != 0 )
|
||||
temp1.CopyRange( nd, 0, iStartIndex );
|
||||
if( nd.GetLastRow() > iFirstRowAtEndOfRegion )
|
||||
temp1.CopyRange( nd, iFirstRowAtEndOfRegion, nd.GetLastRow(), iScaledFirstRowAfterRegion);
|
||||
temp2.CopyRange( nd, BeatToNoteRowNotRounded(fStartBeat), iFirstRowAtEndOfRegion );
|
||||
temp2.CopyRange( nd, iStartIndex, iFirstRowAtEndOfRegion );
|
||||
nd.ClearAll();
|
||||
|
||||
for( int r=0; r<=temp2.GetLastRow(); r++ )
|
||||
@@ -1633,7 +1626,7 @@ void NoteDataUtil::ScaleRegion( NoteData &nd, float fScale, float fStartBeat, fl
|
||||
{
|
||||
temp2.SetTapNote( t, r, TAP_EMPTY );
|
||||
|
||||
int new_row = int(r*fScale + fStartBeat*ROWS_PER_BEAT);
|
||||
int new_row = int(r*fScale + iStartIndex);
|
||||
temp1.SetTapNote( t, new_row, tn );
|
||||
}
|
||||
}
|
||||
@@ -1642,20 +1635,17 @@ void NoteDataUtil::ScaleRegion( NoteData &nd, float fScale, float fStartBeat, fl
|
||||
nd.CopyAll( temp1 );
|
||||
}
|
||||
|
||||
void NoteDataUtil::ShiftRows( NoteData &nd, float fStartBeat, float fBeatsToShift )
|
||||
void NoteDataUtil::ShiftRows( NoteData &nd, int iStartIndex, int iRowsToShift )
|
||||
{
|
||||
NoteData temp;
|
||||
temp.SetNumTracks( nd.GetNumTracks() );
|
||||
int iTakeFromRow=0;
|
||||
int iPasteAtRow;
|
||||
int iTakeFromRow = iStartIndex;
|
||||
int iPasteAtRow = iStartIndex;
|
||||
|
||||
iTakeFromRow = BeatToNoteRow( fStartBeat );
|
||||
iPasteAtRow = BeatToNoteRow( fStartBeat );
|
||||
|
||||
if( fBeatsToShift > 0 ) // add blank rows
|
||||
iPasteAtRow += BeatToNoteRow( fBeatsToShift );
|
||||
if( iRowsToShift > 0 ) // add blank rows
|
||||
iPasteAtRow += iRowsToShift;
|
||||
else // delete rows
|
||||
iTakeFromRow += BeatToNoteRow( -fBeatsToShift );
|
||||
iTakeFromRow -= iRowsToShift;
|
||||
|
||||
temp.CopyRange( nd, iTakeFromRow, nd.GetLastRow() );
|
||||
nd.ClearRange( min(iTakeFromRow,iPasteAtRow), nd.GetLastRow() );
|
||||
|
||||
@@ -49,9 +49,9 @@ namespace NoteDataUtil
|
||||
void Skippy( NoteData &inout, int iStartIndex = 0, int iEndIndex = 999999 );
|
||||
void InsertIntelligentTaps(
|
||||
NoteData &in,
|
||||
float fWindowSizeBeats,
|
||||
float fInsertOffsetBeats,
|
||||
float fWindowStrideBeats,
|
||||
int iWindowSizeRows,
|
||||
int iInsertOffsetRows,
|
||||
int iWindowStrideRows,
|
||||
bool bSkippy,
|
||||
int iStartIndex = 0,
|
||||
int iEndIndex = 999999 );
|
||||
@@ -94,11 +94,11 @@ namespace NoteDataUtil
|
||||
void AddTapAttacks( NoteData &nd, Song* pSong );
|
||||
|
||||
// void Scale( NoteData &nd, float fScale );
|
||||
void ScaleRegion( NoteData &nd, float fScale, float fStartBeat = 0, float fEndBeat = 99999);
|
||||
void ScaleRegion( NoteData &nd, float fScale, int iStartIndex = 0, int iEndIndex = 999999 );
|
||||
inline void Scale( NoteData &nd, float fScale ) { NoteDataUtil::ScaleRegion(nd, fScale); }
|
||||
|
||||
// If fBeatsToShift>0, add blank rows. If fBeatsToShift<0, delete rows
|
||||
void ShiftRows( NoteData &nd, float fStartBeat, float fBeatsToShift );
|
||||
// If iRowsToShift > 0, add blank rows. If iRowsToShift < 0, delete rows
|
||||
void ShiftRows( NoteData &nd, int iStartIndex, int iRowsToShift );
|
||||
|
||||
void RemoveAllTapsOfType( NoteData& ndInOut, TapNote::Type typeToRemove );
|
||||
void RemoveAllTapsExceptForType( NoteData& ndInOut, TapNote::Type typeToKeep );
|
||||
|
||||
@@ -2064,7 +2064,7 @@ void ScreenEdit::HandleAreaMenuChoice( AreaMenuChoice c, int* iAnswers )
|
||||
float fNewClipboardBeats = fOldClipboardBeats * fScale;
|
||||
float fDeltaBeats = fNewClipboardBeats - fOldClipboardBeats;
|
||||
float fNewClipboardEndBeat = m_NoteFieldEdit.m_fBeginMarker + fNewClipboardBeats;
|
||||
NoteDataUtil::ShiftRows( m_NoteDataEdit, m_NoteFieldEdit.m_fBeginMarker, fDeltaBeats );
|
||||
NoteDataUtil::ShiftRows( m_NoteDataEdit, BeatToNoteRow(m_NoteFieldEdit.m_fBeginMarker), BeatToNoteRow(fDeltaBeats) );
|
||||
m_pSong->m_Timing.ScaleRegion( fScale, m_NoteFieldEdit.m_fBeginMarker, m_NoteFieldEdit.m_fEndMarker );
|
||||
|
||||
HandleAreaMenuChoice( paste_at_begin_marker, NULL );
|
||||
@@ -2084,7 +2084,7 @@ void ScreenEdit::HandleAreaMenuChoice( AreaMenuChoice c, int* iAnswers )
|
||||
|
||||
sIter[i]->GetNoteData( ndTemp );
|
||||
ndTemp.ConvertHoldNotesTo2sAnd3s();
|
||||
NoteDataUtil::ScaleRegion( ndTemp, fScale, m_NoteFieldEdit.m_fBeginMarker, m_NoteFieldEdit.m_fEndMarker );
|
||||
NoteDataUtil::ScaleRegion( ndTemp, fScale, BeatToNoteRow(m_NoteFieldEdit.m_fBeginMarker), BeatToNoteRow(m_NoteFieldEdit.m_fEndMarker) );
|
||||
ndTemp.Convert2sAnd3sToHoldNotes();
|
||||
sIter[i]->SetNoteData( ndTemp );
|
||||
}
|
||||
@@ -2187,10 +2187,10 @@ void ScreenEdit::HandleAreaMenuChoice( AreaMenuChoice c, int* iAnswers )
|
||||
}
|
||||
break;
|
||||
case insert_and_shift:
|
||||
NoteDataUtil::ShiftRows( m_NoteDataEdit, GAMESTATE->m_fSongBeat, 1 );
|
||||
NoteDataUtil::ShiftRows( m_NoteDataEdit, BeatToNoteRow(GAMESTATE->m_fSongBeat), BeatToNoteRow(1) );
|
||||
break;
|
||||
case delete_and_shift:
|
||||
NoteDataUtil::ShiftRows( m_NoteDataEdit, GAMESTATE->m_fSongBeat, -1 );
|
||||
NoteDataUtil::ShiftRows( m_NoteDataEdit, BeatToNoteRow(GAMESTATE->m_fSongBeat), BeatToNoteRow(-1) );
|
||||
break;
|
||||
case shift_pauses_forward:
|
||||
m_pSong->m_Timing.ShiftRows( GAMESTATE->m_fSongBeat, 1 );
|
||||
@@ -2209,8 +2209,8 @@ void ScreenEdit::HandleAreaMenuChoice( AreaMenuChoice c, int* iAnswers )
|
||||
// be sure not to clobber the row at the start - a row at the end
|
||||
// can be dropped safely, though
|
||||
NoteDataUtil::ShiftRows( m_NoteDataEdit,
|
||||
m_NoteFieldEdit.m_fBeginMarker + 0.003f,
|
||||
(-m_NoteFieldEdit.m_fEndMarker+m_NoteFieldEdit.m_fBeginMarker)
|
||||
BeatToNoteRow(m_NoteFieldEdit.m_fBeginMarker) + 1,
|
||||
BeatToNoteRow(-m_NoteFieldEdit.m_fEndMarker+m_NoteFieldEdit.m_fBeginMarker)
|
||||
);
|
||||
m_pSong->m_Timing.ShiftRows( m_NoteFieldEdit.m_fBeginMarker + 0.003f,
|
||||
(-m_NoteFieldEdit.m_fEndMarker+m_NoteFieldEdit.m_fBeginMarker)
|
||||
@@ -2264,7 +2264,7 @@ void ScreenEdit::HandleAreaMenuChoice( AreaMenuChoice c, int* iAnswers )
|
||||
fStopLength /= 60;
|
||||
// don't move the step from where it is, just move everything later
|
||||
m_NoteDataEdit.ConvertHoldNotesTo2sAnd3s();
|
||||
NoteDataUtil::ShiftRows( m_NoteDataEdit, GAMESTATE->m_fSongBeat + 0.003f, fStopLength );
|
||||
NoteDataUtil::ShiftRows( m_NoteDataEdit, BeatToNoteRow(GAMESTATE->m_fSongBeat) + 1, BeatToNoteRow(fStopLength) );
|
||||
m_pSong->m_Timing.ShiftRows( GAMESTATE->m_fSongBeat + 0.003f, fStopLength );
|
||||
m_NoteDataEdit.Convert2sAnd3sToHoldNotes();
|
||||
|
||||
|
||||
Reference in New Issue
Block a user