From 5ecd3afdd705b0722602476bda18bd553a67926e Mon Sep 17 00:00:00 2001 From: Chris Danford Date: Wed, 19 Feb 2003 07:59:00 +0000 Subject: [PATCH] improved editor playback performance by not drawing unncessary Actors fixed crash in Big transform fixed ugly area highlight alignment --- stepmania/src/Actor.cpp | 21 ++++++++----- stepmania/src/Actor.h | 1 + stepmania/src/ArrowEffects.cpp | 8 ++--- stepmania/src/NoteData.cpp | 8 ++--- stepmania/src/NoteField.cpp | 32 ++++++++++---------- stepmania/src/NoteField.h | 2 +- stepmania/src/RageTypes.h | 8 ++--- stepmania/src/ScreenEdit.cpp | 54 +++++++++++++++++++--------------- stepmania/src/StyleDef.cpp | 10 +++++++ stepmania/src/StyleDef.h | 2 ++ 10 files changed, 84 insertions(+), 62 deletions(-) diff --git a/stepmania/src/Actor.cpp b/stepmania/src/Actor.cpp index 3a935ee28d..c3660d8a7e 100644 --- a/stepmania/src/Actor.cpp +++ b/stepmania/src/Actor.cpp @@ -360,22 +360,27 @@ void Actor::ScaleTo( const RectI &rect, StretchType st ) SetZoom( fNewZoom ); } +void Actor::StretchTo( const RectI &r ) +{ + RectF r2( (float)r.left, (float)r.top, (float)r.right, (float)r.bottom ); + StretchTo( r2 ); +} -void Actor::StretchTo( const RectI &rect ) +void Actor::StretchTo( const RectF &r ) { // width and height of rectangle - int rect_width = rect.GetWidth(); - int rect_height = rect.GetHeight(); + float width = r.GetWidth(); + float height = r.GetHeight(); // center of the rectangle - float rect_cx = rect.left + rect_width/2.0f; - float rect_cy = rect.top + rect_height/2.0f; + float cx = r.left + width/2.0f; + float cy = r.top + height/2.0f; // zoom fActor needed to scale the Actor to fill the rectangle - float fNewZoomX = rect_width / m_size.x; - float fNewZoomY = rect_height / m_size.y; + float fNewZoomX = width / m_size.x; + float fNewZoomY = height / m_size.y; - SetXY( (float)rect_cx, (float)rect_cy ); + SetXY( cx, cy ); SetZoomX( fNewZoomX ); SetZoomY( fNewZoomY ); } diff --git a/stepmania/src/Actor.h b/stepmania/src/Actor.h index ec399b68b6..50afdcf5e9 100644 --- a/stepmania/src/Actor.h +++ b/stepmania/src/Actor.h @@ -139,6 +139,7 @@ public: void ScaleTo( const RectI &rect, StretchType st ); void StretchTo( const RectI &rect ); + void StretchTo( const RectF &rect ); diff --git a/stepmania/src/ArrowEffects.cpp b/stepmania/src/ArrowEffects.cpp index e1dc29c421..470fb7b22b 100644 --- a/stepmania/src/ArrowEffects.cpp +++ b/stepmania/src/ArrowEffects.cpp @@ -81,12 +81,8 @@ float ArrowGetXPos( PlayerNumber pn, int iColNum, float fYPos ) if( GAMESTATE->m_PlayerOptions[pn].m_bEffects[PlayerOptions::EFFECT_TORNADO] ) { const StyleDef* pStyleDef = GAMESTATE->GetCurrentStyleDef(); - float fMaxX = -100000, fMinX = +100000; - for( int i=0; im_iColsPerPlayer; i++ ) - { - fMaxX = max( fMaxX, pStyleDef->m_ColumnInfo[pn][i].fXOffset ); - fMinX = min( fMinX, pStyleDef->m_ColumnInfo[pn][i].fXOffset ); - } + float fMinX, fMaxX; + pStyleDef->GetMinAndMaxColX( pn, fMinX, fMaxX ); float fPositionBetween = SCALE( fPixelOffsetFromCenter, fMinX, fMaxX, -1, 1 ); float fRads = acosf( fPositionBetween ); diff --git a/stepmania/src/NoteData.cpp b/stepmania/src/NoteData.cpp index 18e696f341..c2e63ca1c9 100644 --- a/stepmania/src/NoteData.cpp +++ b/stepmania/src/NoteData.cpp @@ -1023,14 +1023,14 @@ void NoteDataUtil::Big( NoteData &in ) // add a note determinitsitcally int iBeat = (int)roundf( NoteRowToBeat(i) ); int iTrackOfNote = in.GetFirstNonEmptyTrack(i); - int iTrackToAdd = iTrackOfNote + (iBeat%4)-2; - CLAMP( iTrackToAdd, 0, in.GetNumTracks() ); + int iTrackToAdd = iTrackOfNote + (iBeat%5)-2; // won't be more than 2 tracks away from the existing note + CLAMP( iTrackToAdd, 0, in.GetNumTracks()-1 ); if( iTrackToAdd == iTrackOfNote ) iTrackToAdd++; - CLAMP( iTrackToAdd, 0, in.GetNumTracks() ); + CLAMP( iTrackToAdd, 0, in.GetNumTracks()-1 ); if( iTrackToAdd == iTrackOfNote ) iTrackToAdd--; - CLAMP( iTrackToAdd, 0, in.GetNumTracks() ); + CLAMP( iTrackToAdd, 0, in.GetNumTracks()-1 ); if( in.GetTapNote(iTrackToAdd, i) != TAP_EMPTY ) { diff --git a/stepmania/src/NoteField.cpp b/stepmania/src/NoteField.cpp index 5dde2d26d7..d287b9617d 100644 --- a/stepmania/src/NoteField.cpp +++ b/stepmania/src/NoteField.cpp @@ -75,9 +75,13 @@ void NoteField::Update( float fDeltaTime ) m_fPercentFadeToFail = min( m_fPercentFadeToFail + fDeltaTime/1.5f, 1 ); // take 1.5 seconds to totally fade } -int NoteField::GetWidth() +float NoteField::GetWidth() { - return (GetNumTracks()+1) * ARROW_SIZE; + const StyleDef* pStyleDef = GAMESTATE->GetCurrentStyleDef(); + float fMinX, fMaxX; + pStyleDef->GetMinAndMaxColX( m_PlayerNumber, fMinX, fMaxX ); + + return fMaxX - fMinX + ARROW_SIZE; } void NoteField::DrawBeatBar( const float fBeat ) @@ -105,16 +109,16 @@ void NoteField::DrawBeatBar( const float fBeat ) } CLAMP( fBrightness, 0, 1 ); - int iWidth = GetWidth(); - for( int i=-iWidth/2; i<+iWidth/2; ) + float fWidth = GetWidth(); + for( float f=-fWidth/2; f<+fWidth/2; ) { - m_rectMeasureBar.StretchTo( RectI(i,0,i+iSegWidth,0) ); + m_rectMeasureBar.StretchTo( RectF(f,0,f+iSegWidth,0) ); m_rectMeasureBar.SetY( fYPos ); m_rectMeasureBar.SetZoomY( bIsMeasure ? 6.f : 3.f ); m_rectMeasureBar.SetDiffuse( RageColor(1,1,1,0.5f*fBrightness) ); m_rectMeasureBar.Draw(); - i += iSegWidth + iSpaceWidth; + f += iSegWidth + iSpaceWidth; } if( bIsMeasure ) @@ -122,19 +126,18 @@ void NoteField::DrawBeatBar( const float fBeat ) m_textMeasureNumber.SetDiffuse( RageColor(1,1,1,1) ); m_textMeasureNumber.SetGlow( RageColor(1,1,1,0) ); m_textMeasureNumber.SetText( ssprintf("%d", iMeasureNoDisplay) ); - m_textMeasureNumber.SetXY( -iWidth/2.f + 10, fYPos ); + m_textMeasureNumber.SetXY( -fWidth/2.f + 10, fYPos ); m_textMeasureNumber.Draw(); } } void NoteField::DrawMarkerBar( const float fBeat ) { - const float fYOffset = ArrowGetYOffset( m_PlayerNumber, fBeat ); + const float fYOffset = ArrowGetYOffset( m_PlayerNumber, fBeat ); const float fYPos = ArrowGetYPos( m_PlayerNumber, fYOffset ); - m_rectMarkerBar.SetXY( 0, fYPos ); - m_rectMarkerBar.SetZoomX( (float)(GetNumTracks()+1) * ARROW_SIZE ); - m_rectMarkerBar.SetZoomY( (float)ARROW_SIZE ); + + m_rectMarkerBar.StretchTo( RectF(-GetWidth()/2, fYPos-ARROW_SIZE/2, GetWidth()/2, fYPos+ARROW_SIZE/2) ); m_rectMarkerBar.Draw(); } @@ -149,8 +152,7 @@ void NoteField::DrawAreaHighlight( const float fStartBeat, const float fEndBeat fYStartPos = max( fYStartPos, -1000 ); fYEndPos = min( fYEndPos, +5000 ); - m_rectAreaHighlight.StretchTo( RectI(0, (int)fYStartPos-ARROW_SIZE/2, 1, (int)fYEndPos+ARROW_SIZE/2) ); - m_rectAreaHighlight.SetZoomX( (float)(GetNumTracks()+1) * ARROW_SIZE ); + m_rectAreaHighlight.StretchTo( RectF(-GetWidth()/2, fYStartPos-ARROW_SIZE/2, GetWidth()/2, fYEndPos+ARROW_SIZE/2) ); m_rectAreaHighlight.SetDiffuse( RageColor(1,0,0,0.3f) ); m_rectAreaHighlight.Draw(); } @@ -159,7 +161,7 @@ void NoteField::DrawAreaHighlight( const float fStartBeat, const float fEndBeat void NoteField::DrawBPMText( const float fBeat, const float fBPM ) { - const float fYOffset = ArrowGetYOffset( m_PlayerNumber, fBeat ); + const float fYOffset = ArrowGetYOffset( m_PlayerNumber, fBeat ); const float fYPos = ArrowGetYPos( m_PlayerNumber, fYOffset ); m_textMeasureNumber.SetDiffuse( RageColor(1,0,0,1) ); @@ -203,7 +205,7 @@ void NoteField::DrawPrimitives() // change this probing to binary search // probe for first note on the screen - float fFirstBeatToDraw = fSongBeat-2; // Adjust to balance of performance and showing enough notes. + float fFirstBeatToDraw = fSongBeat-4; // Adjust to balance of performance and showing enough notes. while( fFirstBeatToDrawm_fSongBeat; // save song beat - GAMESTATE->m_fSongBeat = m_fTrailingBeat; // put trailing beat in effect - m_NoteFieldEdit.Draw(); - GAMESTATE->m_fSongBeat = fSongBeat; // restore real song beat - - m_sprHelp.Draw(); - m_textHelp.Draw(); - m_sprInfo.Draw(); - m_textInfo.Draw(); - m_Fade.Draw(); - - - m_rectRecordBack.Draw(); - - if( m_EditMode == MODE_RECORDING ) + switch( m_EditMode ) { + case MODE_EDITING: + { + m_BGAnimation.Draw(); + m_SnapDisplay.Draw(); + m_GrayArrowRowEdit.Draw(); + + // HACK: Make NoteFieldEdit draw using the trailing beat + float fSongBeat = GAMESTATE->m_fSongBeat; // save song beat + GAMESTATE->m_fSongBeat = m_fTrailingBeat; // put trailing beat in effect + m_NoteFieldEdit.Draw(); + GAMESTATE->m_fSongBeat = fSongBeat; // restore real song beat + + m_sprHelp.Draw(); + m_textHelp.Draw(); + m_sprInfo.Draw(); + m_textInfo.Draw(); + m_Fade.Draw(); + } + break; + case MODE_RECORDING: + m_BGAnimation.Draw(); m_GrayArrowRowRecord.Draw(); m_NoteFieldRecord.Draw(); - } - - if( m_EditMode == MODE_PLAYING ) - { + break; + case MODE_PLAYING: + m_BGAnimation.Draw(); m_Player.Draw(); + break; + default: + ASSERT(0); } Screen::DrawPrimitives(); diff --git a/stepmania/src/StyleDef.cpp b/stepmania/src/StyleDef.cpp index af5fd3bd39..71130bc675 100644 --- a/stepmania/src/StyleDef.cpp +++ b/stepmania/src/StyleDef.cpp @@ -89,3 +89,13 @@ bool StyleDef::MatchesNotesType( NotesType type ) const return false; } +void StyleDef::GetMinAndMaxColX( PlayerNumber pn, float& fMixXOut, float& fMaxXOut ) const +{ + fMixXOut = +100000; + fMaxXOut = -100000; + for( int i=0; i