diff --git a/stepmania/src/ArrowEffects.cpp b/stepmania/src/ArrowEffects.cpp index 20430e2f91..b7d6a419b6 100644 --- a/stepmania/src/ArrowEffects.cpp +++ b/stepmania/src/ArrowEffects.cpp @@ -11,6 +11,7 @@ #include "PlayerState.h" #include "GameState.h" #include "Style.h" +#include "ThemeMetric.h" #include const float ARROW_SPACING = ARROW_SIZE;// + 2; @@ -596,6 +597,38 @@ float ArrowEffects::GetZoom( const PlayerState* pPlayerState ) return fZoom; } +static ThemeMetric FRAME_WIDTH_EFFECTS_PIXELS_PER_SECOND( "ArrowEffects", "FrameWidthEffectsPixelsPerSecond" ); +static ThemeMetric FRAME_WIDTH_EFFECTS_MIN_MULTIPLIER( "ArrowEffects", "FrameWidthEffectsMinMultiplier" ); +static ThemeMetric FRAME_WIDTH_EFFECTS_MAX_MULTIPLIER( "ArrowEffects", "FrameWidthEffectsMaxMultiplier" ); +static ThemeMetric FRAME_WIDTH_LOCK_EFFECTS_TO_OVERLAPPING( "ArrowEffects", "FrameWidthLockEffectsToOverlapping" ); +static ThemeMetric FRAME_WIDTH_LOCK_EFFECTS_TWEEN_PIXELS( "ArrowEffects", "FrameWidthLockEffectsTweenPixels" ); + +float ArrowEffects::GetFrameWidthScale( const PlayerState* pPlayerState, float fYOffset, float fOverlappedTime ) +{ + float fFrameWidthMultiplier = 1.0f; + + float fPixelsPerSecond = FRAME_WIDTH_EFFECTS_PIXELS_PER_SECOND; + float fSecond = fYOffset / fPixelsPerSecond; + float fWidthEffect = pPlayerState->m_EffectHistory.GetSample( fSecond ); + if( fWidthEffect != 0 && FRAME_WIDTH_LOCK_EFFECTS_TO_OVERLAPPING ) + { + /* Don't display effect data that happened before this hold overlapped the top. */ + float fFromEndOfOverlapped = fOverlappedTime - fSecond; + float fTrailingPixels = FRAME_WIDTH_LOCK_EFFECTS_TWEEN_PIXELS; + float fTrailingSeconds = fTrailingPixels / fPixelsPerSecond; + float fScaleEffect = SCALE( fFromEndOfOverlapped, 0.0f, fTrailingSeconds, 0.0f, 1.0f ); + CLAMP( fScaleEffect, 0.0f, 1.0f ); + fWidthEffect *= fScaleEffect; + } + + if( fWidthEffect > 0 ) + fFrameWidthMultiplier *= SCALE( fWidthEffect, 0.0f, 1.0f, 1.0f, FRAME_WIDTH_EFFECTS_MAX_MULTIPLIER ); + else if( fWidthEffect < 0 ) + fFrameWidthMultiplier *= SCALE( fWidthEffect, 0.0f, -1.0f, 1.0f, FRAME_WIDTH_EFFECTS_MIN_MULTIPLIER ); + + return fFrameWidthMultiplier; +} + /* * (c) 2001-2004 Chris Danford * All rights reserved. diff --git a/stepmania/src/ArrowEffects.h b/stepmania/src/ArrowEffects.h index 9f54f84b24..eb09e7cb73 100644 --- a/stepmania/src/ArrowEffects.h +++ b/stepmania/src/ArrowEffects.h @@ -61,6 +61,8 @@ public: // This is the zoom of the individual tracks, not of the whole Player. static float GetZoom( const PlayerState* pPlayerState ); + + static float GetFrameWidthScale( const PlayerState* pPlayerState, float fYOffset, float fOverlappedTime ); }; #endif diff --git a/stepmania/src/NoteDisplay.cpp b/stepmania/src/NoteDisplay.cpp index cbb0d3122a..ab1129d514 100644 --- a/stepmania/src/NoteDisplay.cpp +++ b/stepmania/src/NoteDisplay.cpp @@ -373,6 +373,7 @@ struct StripBuffer void NoteDisplay::DrawHoldPart( vector &vpSpr, int iCol, int fYStep, float fPercentFadeToFail, float fColorScale, bool bGlow, float fDrawDistanceAfterTargetsPixels, float fDrawDistanceBeforeTargetsPixels, float fFadeInPercentOfDrawFar, + float fOverlappedTime, float fYTop, float fYBottom, float fYStartPos, float fYEndPos, bool bWrapping, bool bAnchorToTop, bool bFlipTextureVertically ) @@ -442,10 +443,13 @@ void NoteDisplay::DrawHoldPart( vector &vpSpr, int iCol, int fYStep, fl const float fYOffset = ArrowEffects::GetYOffsetFromYPos( m_pPlayerState, iCol, fY, m_fYReverseOffsetPixels ); const float fZ = ArrowEffects::GetZPos( m_pPlayerState, iCol, fYOffset ); + const float fFrameWidthScale = ArrowEffects::GetFrameWidthScale( m_pPlayerState, fYOffset, fOverlappedTime ); + const float fScaledFrameWidth = fFrameWidth * fFrameWidthScale; + const float fX = ArrowEffects::GetXPos( m_pPlayerState, iCol, fYOffset ); - const float fXLeft = fX - fFrameWidth/2; + const float fXLeft = fX - fScaledFrameWidth/2; const float fXCenter = fX; - const float fXRight = fX + fFrameWidth/2; + const float fXRight = fX + fScaledFrameWidth/2; const float fDistFromTop = fY - fYTop; float fTexCoordTop = SCALE( fDistFromTop, 0, fFrameHeight, rect.top, rect.bottom ); fTexCoordTop += fAddToTexCoord; @@ -555,6 +559,7 @@ void NoteDisplay::DrawHoldBody( const TapNote& tn, int iCol, float fBeat, bool b vpSprTop, iCol, fYStep, fPercentFadeToFail, fColorScale, bGlow, fDrawDistanceAfterTargetsPixels, fDrawDistanceBeforeTargetsPixels, fFadeInPercentOfDrawFar, + tn.HoldResult.fOverlappedTime, fYHead-fFrameHeightTop, fYHead, fYStartPos, min(fYEndPos, fYTail), false, bTopAnchor, bFlipHoldBody ); @@ -564,6 +569,7 @@ void NoteDisplay::DrawHoldBody( const TapNote& tn, int iCol, float fBeat, bool b vpSprBody, iCol, fYStep, fPercentFadeToFail, fColorScale, bGlow, fDrawDistanceAfterTargetsPixels, fDrawDistanceBeforeTargetsPixels, fFadeInPercentOfDrawFar, + tn.HoldResult.fOverlappedTime, fYHead, fYTail, fYStartPos, fYEndPos, true, bTopAnchor, bFlipHoldBody ); @@ -573,6 +579,7 @@ void NoteDisplay::DrawHoldBody( const TapNote& tn, int iCol, float fBeat, bool b vpSprBottom, iCol, fYStep, fPercentFadeToFail, fColorScale, bGlow, fDrawDistanceAfterTargetsPixels, fDrawDistanceBeforeTargetsPixels, fFadeInPercentOfDrawFar, + tn.HoldResult.fOverlappedTime, fYTail, fYTail+fFrameHeightBottom, max(fYStartPos, fYHead), fYEndPos, false, bTopAnchor, bFlipHoldBody ); diff --git a/stepmania/src/NoteDisplay.h b/stepmania/src/NoteDisplay.h index dbfffdde81..acf65c0d3d 100644 --- a/stepmania/src/NoteDisplay.h +++ b/stepmania/src/NoteDisplay.h @@ -97,7 +97,7 @@ private: float fColorScale, bool bGlow, float fDrawDistanceAfterTargetsPixels, float fDrawDistanceBeforeTargetsPixels, float fFadeInPercentOfDrawFar ); void DrawHoldPart( vector &vpSpr, int iCol, int fYStep, float fPercentFadeToFail, float fColorScale, bool bGlow, - float fDrawDistanceAfterTargetsPixels, float fDrawDistanceBeforeTargetsPixels, float fFadeInPercentOfDrawFar, + float fDrawDistanceAfterTargetsPixels, float fDrawDistanceBeforeTargetsPixels, float fFadeInPercentOfDrawFar, float fOverlappedTime, float fYTop, float fYBottom, float fYStartPos, float fYEndPos, bool bWrapping, bool bAnchorToTop, bool bFlipTextureVertically ); const PlayerState *m_pPlayerState; // to look up PlayerOptions