From d9843f67f1efdc7d1afaca4356fa28d6b6192789 Mon Sep 17 00:00:00 2001 From: Glenn Maynard Date: Sat, 11 Dec 2004 12:11:36 +0000 Subject: [PATCH] arrow visibility fix --- stepmania/src/ArrowEffects.cpp | 23 +++++++++++++++++------ stepmania/src/ArrowEffects.h | 2 +- stepmania/src/NoteField.cpp | 4 ++-- 3 files changed, 20 insertions(+), 9 deletions(-) diff --git a/stepmania/src/ArrowEffects.cpp b/stepmania/src/ArrowEffects.cpp index 2888c60301..bfed387a01 100644 --- a/stepmania/src/ArrowEffects.cpp +++ b/stepmania/src/ArrowEffects.cpp @@ -20,7 +20,10 @@ static float GetNoteFieldHeight( PlayerNumber pn ) return SCREEN_HEIGHT + fabsf(GAMESTATE->m_CurrentPlayerOptions[pn].m_fPerspectiveTilt)*200; } -float ArrowGetYOffset( PlayerNumber pn, int iCol, float fNoteBeat ) +/* For visibility testing: if iAbsolute is -1, then all random modifiers must return + * the minimal possible offset; if +1, they must return the maximum possible offset. + * When actually rendering, iAbsolute is 0. */ +float ArrowGetYOffset( PlayerNumber pn, int iCol, float fNoteBeat, int iAbsolute ) { float fYOffset = 0; @@ -83,14 +86,22 @@ float ArrowGetYOffset( PlayerNumber pn, int iCol, float fNoteBeat ) fYOffset += fAccels[PlayerOptions::ACCEL_BOOMERANG] * (fYOffset * SCALE( fYOffset, 0.f, SCREEN_HEIGHT, 1.5f, 0.5f )- fYOffset); float fScrollSpeed = GAMESTATE->m_CurrentPlayerOptions[pn].m_fScrollSpeed; - if ( GAMESTATE->m_CurrentPlayerOptions[pn].m_fRandomSpeed > 1.0f ) + if( GAMESTATE->m_CurrentPlayerOptions[pn].m_fRandomSpeed > 1.0f ) { int seed = GAMESTATE->m_iRoundSeed + ( BeatToNoteRow( fNoteBeat ) << 8 ) + (iCol * 100); - float soRandom = RandomFloat( seed ); + float fRandom; + switch( iAbsolute ) + { + case 0: fRandom = RandomFloat( seed ); break; + case -1: fRandom = 1.0f; break; /* highest scroll speed = lowest visibility */ + case +1: fRandom = 0.0f; break; + default: FAIL_M( ssprintf("%i",iAbsolute) ); + }; + fScrollSpeed *= - SCALE( soRandom, - 0.0f, 1.0f, - 1.0f, GAMESTATE->m_CurrentPlayerOptions[pn].m_fRandomSpeed ); // min. scale shold be defined as a constatnt somewhere + SCALE( fRandom, + 0.0f, 1.0f, + 1.0f, GAMESTATE->m_CurrentPlayerOptions[pn].m_fRandomSpeed ); // min. scale shold be defined as a constatnt somewhere } diff --git a/stepmania/src/ArrowEffects.h b/stepmania/src/ArrowEffects.h index 9afa836063..a8db8c8098 100644 --- a/stepmania/src/ArrowEffects.h +++ b/stepmania/src/ArrowEffects.h @@ -11,7 +11,7 @@ // fYOffset is a vertical position in pixels relative to the center. // (positive if has not yet been stepped on, negative if has already passed). // The ArrowEffect and ScrollSpeed is applied in this stage. -float ArrowGetYOffset( PlayerNumber pn, int iCol, float fNoteBeat ); +float ArrowGetYOffset( PlayerNumber pn, int iCol, float fNoteBeat, int iAbsolute = 0 ); /* Actual display position, with reverse and post-reverse-effects factored in * (fYOffset -> YPos). */ diff --git a/stepmania/src/NoteField.cpp b/stepmania/src/NoteField.cpp index ccfe7ad4d5..83baee4d0f 100644 --- a/stepmania/src/NoteField.cpp +++ b/stepmania/src/NoteField.cpp @@ -354,7 +354,7 @@ float FindFirstDisplayedBeat( PlayerNumber pn, int iFirstPixelToDraw ) while( fFirstBeatToDraw < GAMESTATE->m_fSongBeat ) { - float fYOffset = ArrowGetYOffset(pn, 0, fFirstBeatToDraw); + float fYOffset = ArrowGetYOffset( pn, 0, fFirstBeatToDraw, -1 ); if( fYOffset < iFirstPixelToDraw ) // off screen fFirstBeatToDraw += 0.1f; // move toward fSongBeat else // on screen @@ -378,7 +378,7 @@ float FindLastDisplayedBeat( PlayerNumber pn, int iLastPixelToDraw ) for( int i=0; i iLastPixelToDraw ) // off screen fLastBeatToDraw -= fSearchDistance;