From f56df35f8640aeae600fba046019fc56d2df5161 Mon Sep 17 00:00:00 2001 From: Glenn Maynard Date: Tue, 25 Oct 2005 03:56:28 +0000 Subject: [PATCH] fix FindFirstDisplayedBeat, FindLastDisplayedBeat in boomerang --- stepmania/src/NoteField.cpp | 33 +++++++++++++++++++++++++++++---- 1 file changed, 29 insertions(+), 4 deletions(-) diff --git a/stepmania/src/NoteField.cpp b/stepmania/src/NoteField.cpp index 735d98de24..93cb43fb68 100644 --- a/stepmania/src/NoteField.cpp +++ b/stepmania/src/NoteField.cpp @@ -400,10 +400,25 @@ float FindFirstDisplayedBeat( const PlayerState* pPlayerState, int iFirstPixelTo { float fFirstBeatToDraw = GAMESTATE->m_fSongBeat-4; // Adjust to balance off performance and showing enough notes. + /* In Boomerang, we'll usually have two sections of notes: before and after + * the peak. We always start drawing before the peak, and end after it, or + * we may falsely detect the off-screen portion as the end (or beginning) + * of the stream. */ + bool bBoomerang; + { + const float* fAccels = pPlayerState->m_CurrentPlayerOptions.m_fAccels; + bBoomerang = (fAccels[PlayerOptions::ACCEL_BOOMERANG] != 0); + } + while( fFirstBeatToDraw < GAMESTATE->m_fSongBeat ) { - float fYOffset = ArrowEffects::GetYOffset( pPlayerState, 0, fFirstBeatToDraw, true ); - if( fYOffset < iFirstPixelToDraw ) // off screen + bool bIsPastPeakYOffset; + float fPeakYOffset; + float fYOffset = ArrowEffects::GetYOffset( pPlayerState, 0, fFirstBeatToDraw, fPeakYOffset, bIsPastPeakYOffset, true ); + + if( bBoomerang && bIsPastPeakYOffset ) + break; // stop probing + else if( fYOffset < iFirstPixelToDraw ) // off screen fFirstBeatToDraw += 0.1f; // move toward fSongBeat else // on screen break; // stop probing @@ -424,11 +439,21 @@ float FindLastDisplayedBeat( const PlayerState* pPlayerState, int iLastPixelToDr const int NUM_ITERATIONS = 20; + bool bBoomerang; + { + const float* fAccels = pPlayerState->m_CurrentPlayerOptions.m_fAccels; + bBoomerang = (fAccels[PlayerOptions::ACCEL_BOOMERANG] != 0); + } + for( int i=0; i iLastPixelToDraw ) // off screen + if( bBoomerang && !bIsPastPeakYOffset ) + fLastBeatToDraw += fSearchDistance; + else if( fYOffset > iLastPixelToDraw ) // off screen fLastBeatToDraw -= fSearchDistance; else // on screen fLastBeatToDraw += fSearchDistance;