From b925b2d7caddc28f4fa0a360d2030cbf51c21670 Mon Sep 17 00:00:00 2001 From: Glenn Maynard Date: Sat, 16 Jul 2005 02:51:17 +0000 Subject: [PATCH] instead of loading actors inside OptionRow, load a single copy of each one we need, and then make copies as needed. This avoids lots of extra loading (which can be slow, even with refcounted data; lots of path lookups, etc). (Trying to get this to the point where we can construct new OptionRows for a menu without making a whole new menu.) This approach means we don't lose the potential to have different sTypes of OptionRow in a single menu. (The annoying bit is that any actor we copy has to handle copying, which is tricky for ActorFrame and doesn't work yet for AutoActor. Working on it ...) --- stepmania/src/OptionRow.cpp | 123 ++++++++++++++++++-------------- stepmania/src/OptionRow.h | 28 +++++--- stepmania/src/ScreenOptions.cpp | 16 ++--- stepmania/src/ScreenOptions.h | 2 + 4 files changed, 98 insertions(+), 71 deletions(-) diff --git a/stepmania/src/OptionRow.cpp b/stepmania/src/OptionRow.cpp index 038e1dfbb6..73c8e4de8b 100644 --- a/stepmania/src/OptionRow.cpp +++ b/stepmania/src/OptionRow.cpp @@ -58,17 +58,16 @@ CString OptionRow::OptionTitle( CString s ) const CString ITEMS_LONG_ROW_X_NAME( size_t p ) { return ssprintf("ItemsLongRowP%dX",int(p+1)); } CString ICONS_X_NAME( size_t p ) { return ssprintf("IconsP%dX",int(p+1)); } -OptionRow::OptionRow() +OptionRow::OptionRow( const OptionRowType *pSource ) { + m_pActors = pSource; m_pHand = NULL; - Clear(); + m_sprBullet = NULL; + m_textTitle = NULL; + ZERO( m_OptionIcons ); - FOREACH_PlayerNumber( p ) - m_Frame.AddChild( &m_OptionIcons[p] ); - m_Frame.AddChild( &m_sprBullet ); - m_Frame.AddChild( &m_textTitle ); - m_Frame.AddChild( &m_ItemFrame ); + Clear(); this->AddChild( &m_Frame ); } @@ -85,7 +84,7 @@ void OptionRow::Clear() FOREACH_PlayerNumber( p ) m_vbSelected[p].clear(); - m_ItemFrame.DeleteAllChildren(); + m_Frame.DeleteAllChildren(); m_textItems.clear(); FOREACH_PlayerNumber( p ) m_Underline[p].clear(); @@ -107,9 +106,17 @@ void OptionRow::DetachHandler() m_pHand = NULL; } +void OptionRowType::Load( const CString &sType ) +{ + m_textItemParent.LoadFromFont( THEME->GetPathF(sType,"item") ); + m_UnderlineParent.Load( sType, OptionsCursor::underline ); + m_textTitle.LoadFromFont( THEME->GetPathF(sType,"title") ); + m_sprBullet.Load( THEME->GetPathG(sType,"bullet") ); + m_OptionIcon.Load( sType ); +} + void OptionRow::LoadMetrics( const CString &sType ) { - m_sType = sType; ARROWS_X .Load(sType,"ArrowsX"); LABELS_X .Load(sType,"LabelsX"); LABELS_ON_COMMAND .Load(sType,"LabelsOnCommand"); @@ -133,17 +140,6 @@ void OptionRow::LoadMetrics( const CString &sType ) THEME_ITEMS .Load(sType,"ThemeItems"); THEME_TITLES .Load(sType,"ThemeTitles"); SHOW_BPM_IN_SPEED_TITLE .Load(sType,"ShowBpmInSpeedTitle"); - - FOREACH_PlayerNumber( p ) - { - m_OptionIcons[p].Load( m_sType ); - m_OptionIcons[p].RunCommands( ICONS_ON_COMMAND ); - } - - m_textItemParent.LoadFromFont( THEME->GetPathF(m_sType,"item") ); - m_UnderlineParent.Load( m_sType, OptionsCursor::underline ); - m_textTitle.LoadFromFont( THEME->GetPathF(m_sType,"title") ); - m_sprBullet.Load( THEME->GetPathG(m_sType,"bullet") ); } void OptionRow::LoadNormal( const OptionRowDefinition &def, OptionRowHandler *pHand, bool bFirstItemGoesDown ) @@ -233,14 +229,38 @@ void OptionRow::InitText() { /* If we have elements already, we're being updated from a new set of options. * Delete the old ones. */ - m_ItemFrame.DeleteAllChildren(); + m_Frame.DeleteAllChildren(); m_textItems.clear(); FOREACH_PlayerNumber( p ) m_Underline[p].clear(); + m_textTitle = new BitmapText( m_pActors->m_textTitle ); + m_Frame.AddChild( m_textTitle ); + + m_sprBullet = new Sprite( m_pActors->m_sprBullet ); + m_sprBullet->SetDrawOrder(-1); // under title + m_Frame.AddChild( m_sprBullet ); + + switch( m_RowType ) + { + case ROW_NORMAL: + FOREACH_PlayerNumber( p ) + { + m_OptionIcons[p] = new OptionIcon( m_pActors->m_OptionIcon ); + m_OptionIcons[p]->SetDrawOrder(-1); // under title + m_OptionIcons[p]->RunCommands( ICONS_ON_COMMAND ); + + m_Frame.AddChild( m_OptionIcons[p] ); + SetOptionIcon( p, "" ); + } + break; + case ROW_EXIT: + break; + } + // If the items will go off the edge of the screen, then re-init with the "long row" style. { - BitmapText bt( m_textItemParent ); + BitmapText bt( m_pActors->m_textItemParent ); bt.RunCommands( ITEMS_ON_COMMAND ); float fX = ITEMS_START_X; @@ -273,7 +293,7 @@ void OptionRow::InitText() // init text FOREACH_HumanPlayer( p ) { - BitmapText *bt = new BitmapText( m_textItemParent ); + BitmapText *bt = new BitmapText( m_pActors->m_textItemParent ); m_textItems.push_back( bt ); bt->RunCommands( ITEMS_ON_COMMAND ); @@ -293,7 +313,7 @@ void OptionRow::InitText() // init underlines FOREACH_HumanPlayer( p ) { - OptionsCursor *ul = new OptionsCursor( m_UnderlineParent ); + OptionsCursor *ul = new OptionsCursor( m_pActors->m_UnderlineParent ); m_Underline[p].push_back( ul ); ul->Set( p ); @@ -312,7 +332,7 @@ void OptionRow::InitText() for( unsigned c=0; cm_textItemParent ); m_textItems.push_back( bt ); CString sText = m_RowDef.m_vsChoices[c]; PrepareItemText( sText ); @@ -328,7 +348,7 @@ void OptionRow::InitText() // init underlines FOREACH_HumanPlayer( p ) { - OptionsCursor *ul = new OptionsCursor( m_UnderlineParent ); + OptionsCursor *ul = new OptionsCursor( m_pActors->m_UnderlineParent ); m_Underline[p].push_back( ul ); ul->Set( p ); ul->SetX( fX ); @@ -345,22 +365,24 @@ void OptionRow::InitText() } for( unsigned c=0; cSetText( GetRowTitle() ); + m_textTitle->SetX( LABELS_X ); + m_textTitle->RunCommands( LABELS_ON_COMMAND ); + + m_sprBullet->SetX( ARROWS_X ); break; case OptionRow::ROW_EXIT: - m_textTitle.SetHidden( true ); - m_sprBullet.SetHidden( true ); + m_textTitle->SetHidden( true ); + m_sprBullet->SetHidden( true ); break; } } @@ -409,10 +431,6 @@ void OptionRow::AfterImportOptions() } } - // init row icons - FOREACH_HumanPlayer( p ) - SetOptionIcon( p, "" ); - // // HACK: Set focus to one item in the row, which is "go down" // @@ -437,9 +455,6 @@ void OptionRow::LoadExit() vbSelected.resize( m_RowDef.m_vsChoices.size(), false ); vbSelected[0] = true; } - - FOREACH_PlayerNumber( p ) - m_OptionIcons[p].SetHidden( true ); } void OptionRow::PositionUnderlines( PlayerNumber pn ) @@ -484,7 +499,7 @@ void OptionRow::PositionIcons() FOREACH_HumanPlayer( p ) // foreach player { - OptionIcon &icon = m_OptionIcons[p]; + OptionIcon &icon = *m_OptionIcons[p]; icon.SetX( ICONS_X.GetValue(p) ); @@ -544,9 +559,9 @@ void OptionRow::UpdateEnabledDisabled() } if( bThisRowHasFocusByAny ) - m_textTitle.RunCommands( LABEL_GAIN_FOCUS_COMMAND ); + m_textTitle->RunCommands( LABEL_GAIN_FOCUS_COMMAND ); else - m_textTitle.RunCommands( LABEL_LOSE_FOCUS_COMMAND ); + m_textTitle->RunCommands( LABEL_LOSE_FOCUS_COMMAND ); /* Don't tween selection colors at all. */ RageColor color; @@ -557,8 +572,8 @@ void OptionRow::UpdateEnabledDisabled() if( m_bHidden ) color.a = 0; - m_sprBullet.SetGlobalDiffuseColor( color ); - m_textTitle.SetGlobalDiffuseColor( color ); + m_sprBullet->SetGlobalDiffuseColor( color ); + m_textTitle->SetGlobalDiffuseColor( color ); for( unsigned j=0; jSetEffectNone(); } - if( m_sprBullet.DestTweenState().diffuse[0] != color ) + if( m_sprBullet->DestTweenState().diffuse[0] != color ) { - m_sprBullet.StopTweening(); - m_textTitle.StopTweening(); - m_sprBullet.BeginTweening( TWEEN_SECONDS ); - m_textTitle.BeginTweening( TWEEN_SECONDS ); - m_sprBullet.SetDiffuseAlpha( color.a ); - m_textTitle.SetDiffuseAlpha( color.a ); + m_sprBullet->StopTweening(); + m_textTitle->StopTweening(); + m_sprBullet->BeginTweening( TWEEN_SECONDS ); + m_textTitle->BeginTweening( TWEEN_SECONDS ); + m_sprBullet->SetDiffuseAlpha( color.a ); + m_textTitle->SetDiffuseAlpha( color.a ); } } void OptionRow::SetOptionIcon( PlayerNumber pn, const CString &sText ) { - m_OptionIcons[pn].Set( pn, sText, false ); + m_OptionIcons[pn]->Set( pn, sText, false ); } BitmapText &OptionRow::GetTextItemForRow( PlayerNumber pn, int iChoiceOnRow ) diff --git a/stepmania/src/OptionRow.h b/stepmania/src/OptionRow.h index bbc69e1a40..2c22ead976 100644 --- a/stepmania/src/OptionRow.h +++ b/stepmania/src/OptionRow.h @@ -82,10 +82,23 @@ struct OptionRowDefinition } }; +class OptionRowType +{ +public: + void Load( const CString &sType ); + + BitmapText m_textItemParent; + OptionsCursor m_UnderlineParent; + Sprite m_sprBullet; + BitmapText m_textTitle; + OptionIcon m_OptionIcon; +}; + class OptionRow : public ActorFrame { public: - OptionRow(); + const OptionRowType *m_pActors; + OptionRow( const OptionRowType *pType ); ~OptionRow(); void Clear(); @@ -167,19 +180,18 @@ public: protected: CString GetRowTitle() const; - CString m_sType; OptionRowDefinition m_RowDef; RowType m_RowType; OptionRowHandler* m_pHand; + ActorFrame m_Frame; - ActorFrame m_ItemFrame; - BitmapText m_textItemParent; + vector m_textItems; // size depends on m_bRowIsLong and which players are joined - OptionsCursor m_UnderlineParent; vector m_Underline[NUM_PLAYERS]; // size depends on m_bRowIsLong and which players are joined - Sprite m_sprBullet; - BitmapText m_textTitle; - OptionIcon m_OptionIcons[NUM_PLAYERS]; + Sprite *m_sprBullet; + BitmapText *m_textTitle; + OptionIcon *m_OptionIcons[NUM_PLAYERS]; + bool m_bFirstItemGoesDown; bool m_bRowHasFocus[NUM_PLAYERS]; diff --git a/stepmania/src/ScreenOptions.cpp b/stepmania/src/ScreenOptions.cpp index dcbf72242d..0ddecc57c2 100644 --- a/stepmania/src/ScreenOptions.cpp +++ b/stepmania/src/ScreenOptions.cpp @@ -206,10 +206,15 @@ void ScreenOptions::InitMenu( const vector &vDefs, const ve ASSERT( vDefs.size() == vHands.size() ); + m_OptionRowType.Load( m_sName ); + for( unsigned r=0; r &vDefs, const ve row.AfterImportOptions(); } - for( unsigned r=0; r &vpns ) = 0;