Skip to content

Commit

Permalink
Change back to the original binary search function for finding pixels…
Browse files Browse the repository at this point in the history
…, but retain other changes. Results in nearly the same performance.
  • Loading branch information
xwidghet committed Nov 19, 2016
1 parent 5ec9ed6 commit 7efa383
Showing 1 changed file with 34 additions and 59 deletions.
93 changes: 34 additions & 59 deletions src/NoteField.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -627,84 +627,59 @@ void FindDisplayedBeats(const PlayerState* pPlayerState, float &firstBeat, float
{
float fFirstBeatToDraw = pPlayerState->GetDisplayedPosition().m_fSongBeatVisible;
float fLastBeatToDraw = fFirstBeatToDraw;
float fSpeedMultiplier = pPlayerState->GetDisplayedTiming().GetDisplayedSpeedPercent(pPlayerState->GetDisplayedPosition().m_fSongBeatVisible, pPlayerState->GetDisplayedPosition().m_fMusicSecondsVisible);

bool bBoomerang;
{
const float* fAccels = pPlayerState->m_PlayerOptions.GetCurrent().m_fAccels;
bBoomerang = (fAccels[PlayerOptions::ACCEL_BOOMERANG] != 0);
}


// TODO: Account for M Mods...
static float lastKnownBPS = 0;
static float lastKnownRate = 0;
static float lastKnownXSpeed = 0;
static float lastKnownCSpeed = 0;
static float pixelsPerBeat = 0;

float currentBPS = pPlayerState->GetDisplayedPosition().m_fCurBPS;
float currentRate = GAMESTATE->m_SongOptions.GetCurrent().m_fMusicRate;
float currentXSpace = pPlayerState->m_PlayerOptions.GetCurrent().m_fScrollSpeed;
float currentCSpace = pPlayerState->m_PlayerOptions.GetCurrent().m_fScrollBPM;

// If anything changed which modifys the distance between arrows, update the pixels per beat.
if (lastKnownBPS != currentBPS || lastKnownRate != currentRate
|| lastKnownCSpeed != currentCSpace || lastKnownXSpeed != currentXSpace)
// Search for the draw distance pixels
float fSearchDistance = 10;
const int NUM_ITERATIONS = 20;

for (int i = 0; i<NUM_ITERATIONS; i++)
{
bool bIsPastPeakYOffset;
float fPeakYOffset;
float fYOffset = ArrowEffects::GetYOffset(pPlayerState, 0, fLastBeatToDraw, fPeakYOffset, bIsPastPeakYOffset, true);

lastKnownBPS = currentBPS;
lastKnownRate = currentRate;
lastKnownXSpeed = currentXSpace;
lastKnownCSpeed = currentCSpace;

float lastBeatElapsedTime = pPlayerState->GetDisplayedTiming().ElapsedTimesAtAllRows.at(pPlayerState->GetDisplayedTiming().ElapsedTimesAtAllRows.size() - 1);

TimingData::GetBeatArgs lastBeatArgs;
lastBeatArgs.elapsed_time = lastBeatElapsedTime;
pPlayerState->GetDisplayedTiming().GetBeatAndBPSFromElapsedTime(lastBeatArgs);
if (bBoomerang && !bIsPastPeakYOffset)
fLastBeatToDraw += fSearchDistance;
else if (fYOffset > iDrawDistanceBeforeTargetsPixels) // off screen
fLastBeatToDraw -= fSearchDistance;
else // on screen
fLastBeatToDraw += fSearchDistance;

float endOffset = ArrowEffects::GetYOffset(pPlayerState, 0, lastBeatArgs.beat, fPeakYOffset, bIsPastPeakYOffset, true);

pixelsPerBeat = ((lastBeatArgs.beat / endOffset) * (lastKnownBPS / lastBeatArgs.bps_out)) * lastKnownRate;
fSearchDistance /= 2;
}

firstBeat = fFirstBeatToDraw + iDrawDistanceAfterTargetsPixels * pixelsPerBeat;

if ( !bBoomerang )
{
lastBeat = fLastBeatToDraw + iDrawDistanceBeforeTargetsPixels * pixelsPerBeat;
}
else
fSearchDistance = 10;
for (int i = 0; i<NUM_ITERATIONS; i++)
{
// Probe for last note to draw. Worst case is 0.25x + boost.
// Adjust search distance so that notes don't pop onto the screen.
float fSearchDistance = 10;
float fSpeedMultiplier = pPlayerState->GetDisplayedTiming().GetDisplayedSpeedPercent(pPlayerState->GetDisplayedPosition().m_fSongBeatVisible, pPlayerState->GetDisplayedPosition().m_fMusicSecondsVisible);
const int NUM_ITERATIONS = 20;
bool bIsPastPeakYOffset;
float fPeakYOffset;
float fYOffset = ArrowEffects::GetYOffset(pPlayerState, 0, fFirstBeatToDraw, fPeakYOffset, bIsPastPeakYOffset, true);

for (int i = 0; i<NUM_ITERATIONS; i++)
{
bool bIsPastPeakYOffset;
float fPeakYOffset;
float fYOffset = ArrowEffects::GetYOffset(pPlayerState, 0, fLastBeatToDraw, fPeakYOffset, bIsPastPeakYOffset, true);

if (bBoomerang && !bIsPastPeakYOffset)
fLastBeatToDraw += fSearchDistance;
else if (fYOffset > iDrawDistanceBeforeTargetsPixels) // off screen
fLastBeatToDraw -= fSearchDistance;
else // on screen
fLastBeatToDraw += fSearchDistance;

fSearchDistance /= 2;
}
if (bBoomerang && !bIsPastPeakYOffset)
fFirstBeatToDraw -= fSearchDistance;
else if (fYOffset < iDrawDistanceAfterTargetsPixels) // off screen
fFirstBeatToDraw += fSearchDistance;
else // on screen
fFirstBeatToDraw -= fSearchDistance;

if( fSpeedMultiplier < 0.75f )
fLastBeatToDraw = min(fLastBeatToDraw, pPlayerState->GetDisplayedPosition().m_fSongBeat + 16);
fSearchDistance /= 2;
}

lastBeat = fLastBeatToDraw;
if (fSpeedMultiplier < 0.75f)
{
fFirstBeatToDraw = min(fFirstBeatToDraw, pPlayerState->GetDisplayedPosition().m_fSongBeat + 16);
fLastBeatToDraw = min(fLastBeatToDraw, pPlayerState->GetDisplayedPosition().m_fSongBeat + 16);
}

firstBeat = fFirstBeatToDraw;
lastBeat = fLastBeatToDraw;
}

void NoteField::CalcPixelsBeforeAndAfterTargets()
Expand Down

0 comments on commit 7efa383

Please sign in to comment.