From 208c5b00618662cb14cd52628e2fd67ae4ff35d9 Mon Sep 17 00:00:00 2001 From: Glenn Maynard Date: Thu, 10 Aug 2006 06:27:47 +0000 Subject: [PATCH] Make wheel items regular children (no special update/drawing); remove "staggered tween" hack and set the offset in the context so this can be done in commands; fix sections; do OnCommand/OffCommand normally and rename TweenOn/OffScreen to TweenOn/OffScreenForSort; other fixes/cleanups (metric updates to come in a bit) --- stepmania/src/MusicWheel.cpp | 49 +++---- stepmania/src/WheelBase.cpp | 277 ++++++++++++----------------------- stepmania/src/WheelBase.h | 19 +-- 3 files changed, 123 insertions(+), 222 deletions(-) diff --git a/stepmania/src/MusicWheel.cpp b/stepmania/src/MusicWheel.cpp index 5b8413453d..846a16469d 100644 --- a/stepmania/src/MusicWheel.cpp +++ b/stepmania/src/MusicWheel.cpp @@ -75,6 +75,22 @@ WheelItemBase *MusicWheel::MakeItem() void MusicWheel::Load( RString sType ) { + ROULETTE_SWITCH_SECONDS .Load(sType,"RouletteSwitchSeconds"); + ROULETTE_SLOW_DOWN_SWITCHES .Load(sType,"RouletteSlowDownSwitches"); + NUM_SECTION_COLORS .Load(sType,"NumSectionColors"); + SONG_REAL_EXTRA_COLOR .Load(sType,"SongRealExtraColor"); + SORT_MENU_COLOR .Load(sType,"SortMenuColor"); + SHOW_ROULETTE .Load(sType,"ShowRoulette"); + SHOW_RANDOM .Load(sType,"ShowRandom"); + SHOW_PORTAL .Load(sType,"ShowPortal"); + RANDOM_PICKS_LOCKED_SONGS .Load(sType,"RandomPicksLockedSongs"); + MOST_PLAYED_SONGS_TO_SHOW .Load(sType,"MostPlayedSongsToShow"); + MODE_MENU_CHOICE_NAMES .Load(sType,"ModeMenuChoiceNames"); + vector vsModeChoiceNames; + split( MODE_MENU_CHOICE_NAMES, ",", vsModeChoiceNames ); + CHOICE .Load(sType,CHOICE_NAME,vsModeChoiceNames); + SECTION_COLORS .Load(sType,SECTION_COLORS_NAME,NUM_SECTION_COLORS); + WheelBase::Load( sType ); SONGMAN->UpdateRankingCourses(); @@ -153,27 +169,6 @@ void MusicWheel::BeginScreen() RebuildWheelItems(); } -void MusicWheel::LoadFromMetrics( RString sType ) -{ - WheelBase::LoadFromMetrics(sType); - - ROULETTE_SWITCH_SECONDS .Load(sType,"RouletteSwitchSeconds"); - ROULETTE_SLOW_DOWN_SWITCHES .Load(sType,"RouletteSlowDownSwitches"); - NUM_SECTION_COLORS .Load(sType,"NumSectionColors"); - SONG_REAL_EXTRA_COLOR .Load(sType,"SongRealExtraColor"); - SORT_MENU_COLOR .Load(sType,"SortMenuColor"); - SHOW_ROULETTE .Load(sType,"ShowRoulette"); - SHOW_RANDOM .Load(sType,"ShowRandom"); - SHOW_PORTAL .Load(sType,"ShowPortal"); - RANDOM_PICKS_LOCKED_SONGS .Load(sType,"RandomPicksLockedSongs"); - MOST_PLAYED_SONGS_TO_SHOW .Load(sType,"MostPlayedSongsToShow"); - MODE_MENU_CHOICE_NAMES .Load(sType,"ModeMenuChoiceNames"); - vector vsModeChoiceNames; - split( MODE_MENU_CHOICE_NAMES, ",", vsModeChoiceNames ); - CHOICE .Load(sType,CHOICE_NAME,vsModeChoiceNames); - SECTION_COLORS .Load(sType,SECTION_COLORS_NAME,NUM_SECTION_COLORS); -} - MusicWheel::~MusicWheel() { FOREACH_SortOrder( so ) @@ -752,7 +747,7 @@ void MusicWheel::UpdateSwitch() SCREENMAN->PostMessageToTopScreen( SM_SongChanged, 0 ); RebuildWheelItems(); - TweenOnScreen(true); + TweenOnScreenForSort(); m_WheelState = STATE_FLYING_ON_AFTER_NEXT_SORT; SCREENMAN->ZeroNextUpdate(); @@ -862,7 +857,7 @@ bool MusicWheel::ChangeSort( SortOrder new_so ) // return true if change success m_soundChangeSort.Play(); - TweenOffScreen(true); + TweenOffScreenForSort(); /* Save the new preference. */ if( IsSongSort(new_so) ) @@ -904,8 +899,6 @@ bool MusicWheel::Select() // return true if this selection ends the screen return false; } - m_Moving = 0; - if( m_WheelState == STATE_ROULETTE_SPINNING ) { m_WheelState = STATE_ROULETTE_SLOWING_DOWN; @@ -925,6 +918,9 @@ bool MusicWheel::Select() // return true if this selection ends the screen return false; } + if( !WheelBase::Select() ) + return false; + switch( m_CurWheelItemData[m_iSelection]->m_Type ) { case TYPE_ROULETTE: @@ -946,7 +942,7 @@ bool MusicWheel::Select() // return true if this selection ends the screen m_sLastModeMenuItem = GetCurWheelItemData(m_iSelection)->m_Action.m_sName; break; default: - return WheelBase::Select(); + break; } return true; } @@ -993,6 +989,7 @@ void MusicWheel::StartRandom() void MusicWheel::SetOpenGroup( RString group ) { + LOG->Trace( "SetOpenGroup %s", group.c_str() ); m_sExpandedSectionName = group; const WheelItemData *old = NULL; diff --git a/stepmania/src/WheelBase.cpp b/stepmania/src/WheelBase.cpp index 94e227c11c..d58b7808b4 100644 --- a/stepmania/src/WheelBase.cpp +++ b/stepmania/src/WheelBase.cpp @@ -31,8 +31,9 @@ WheelBase::~WheelBase() void WheelBase::Load( RString sType ) { LOG->Trace( "WheelBase::Load('%s')", sType.c_str() ); + ASSERT( this->GetNumChildren() == 0 ); // only load once - m_bEmpty = true; + m_bEmpty = false; m_LastSelection = NULL; m_iSelection = 0; m_fTimeLeftInState = 0; @@ -40,29 +41,8 @@ void WheelBase::Load( RString sType ) m_iSwitchesLeftInSpinDown = 0; m_Moving = 0; - LoadFromMetrics( sType ); - - FOREACH( WheelItemBase*, m_WheelBaseItems, i ) - SAFE_DELETE( *i ); - m_WheelBaseItems.clear(); - WheelItemBase *pTempl = MakeItem(); - for( int i=0; iCopy() ); // XXX: ugly cast - } - SAFE_DELETE( pTempl ); -} - -void WheelBase::BeginScreen() -{ - m_WheelState = STATE_SELECTING; -} - -void WheelBase::LoadFromMetrics( RString sType ) -{ SWITCH_SECONDS .Load(sType,"SwitchSeconds"); LOCKED_INITIAL_VELOCITY .Load(sType,"LockedInitialVelocity"); - SCROLL_BAR_X .Load(sType,"ScrollBarX"); SCROLL_BAR_HEIGHT .Load(sType,"ScrollBarHeight"); ITEM_CURVE_X .Load(sType,"ItemCurveX"); USE_LINEAR_WHEEL .Load(sType,"NoCurving"); @@ -71,21 +51,58 @@ void WheelBase::LoadFromMetrics( RString sType ) CIRCLE_PERCENT .Load(sType,"CirclePercent"); USE_3D .Load(sType,"Use3D"); NUM_WHEEL_ITEMS_TO_DRAW .Load(sType,"NumWheelItems"); - WHEEL_ITEM_ON_DELAY_OFFSET .Load(sType,"WheelItemOnDelayOffset"); - WHEEL_ITEM_OFF_DELAY_OFFSET .Load(sType,"WheelItemOffDelayOffset"); WHEEL_ITEM_LOCKED_COLOR .Load(sType,"WheelItemLockedColor"); m_soundChangeMusic.Load( THEME->GetPathS(sType,"change"), true ); m_soundLocked.Load( THEME->GetPathS(sType,"locked"), true ); + WheelItemBase *pTempl = MakeItem(); + ActorUtil::LoadAllCommands( *pTempl, m_sName ); + for( int i=0; iCopy() ); // XXX: ugly cast + SAFE_DELETE( pTempl ); + + // draw outside->inside + for( int i=0; iAddChild( m_WheelBaseItems[i] ); + for( int i=NUM_WHEEL_ITEMS-1; i>=NUM_WHEEL_ITEMS/2; i-- ) + this->AddChild( m_WheelBaseItems[i] ); + m_sprHighlight.Load( THEME->GetPathG(sType,"highlight") ); m_sprHighlight->SetName( "Highlight" ); this->AddChild( m_sprHighlight ); - ActorUtil::OnCommand( m_sprHighlight, sType ); + ActorUtil::LoadAllCommands( *m_sprHighlight, m_sName ); - m_ScrollBar.SetX( SCROLL_BAR_X ); m_ScrollBar.SetBarHeight( SCROLL_BAR_HEIGHT ); this->AddChild( &m_ScrollBar ); + ActorUtil::LoadAllCommands( m_ScrollBar, m_sName ); + + { + Lua *L = LUA->Get(); + m_sprHighlight->PushContext(L); + lua_pushstring( L, "WheelIndex" ); + lua_pushnumber( L, NUM_WHEEL_ITEMS/2.0f ); + lua_settable( L, -3 ); + lua_pop( L, 1 ); + LUA->Release( L ); + } + + Lua *L = LUA->Get(); + for( int i=0; i < (int) m_WheelBaseItems.size(); i++ ) + { + m_WheelBaseItems[i]->PushContext(L); + lua_pushstring( L, "WheelIndex" ); + lua_pushnumber( L, i ); + lua_settable( L, -3 ); + lua_pop( L, 1 ); + } + LUA->Release( L ); + +} + +void WheelBase::BeginScreen() +{ + m_WheelState = STATE_SELECTING; } void WheelBase::GetItemPosition( float fPosOffsetsFromMiddle, float& fX_out, float& fY_out, float& fZ_out, float& fRotationX_out ) @@ -134,43 +151,6 @@ void WheelBase::SetItemPosition( Actor &item, float fPosOffsetsFromMiddle ) item.SetRotationX( fRotationX ); } -void WheelBase::DrawPrimitives() -{ - // draw outside->inside - for( int i=0; i=NUM_WHEEL_ITEMS/2; i-- ) - DrawItem( i ); - - ActorFrame::DrawPrimitives(); -} - -void WheelBase::DrawItem( int i ) -{ - const float fThisBannerPositionOffsetFromSelection = i - NUM_WHEEL_ITEMS/2 + m_fPositionOffsetFromSelection; - if( fabsf(fThisBannerPositionOffsetFromSelection) > NUM_WHEEL_ITEMS_TO_DRAW/2 ) - return; - - WheelItemBase *display = m_WheelBaseItems[i]; - switch( m_WheelState ) - { - case STATE_SELECTING: - case STATE_LOCKED: - case STATE_ROULETTE_SPINNING: - case STATE_ROULETTE_SLOWING_DOWN: - case STATE_RANDOM_SPINNING: - SetItemPosition( *display, fThisBannerPositionOffsetFromSelection ); - break; - } - - if( m_WheelState == STATE_LOCKED && i != NUM_WHEEL_ITEMS/2 ) - display->m_colorLocked = WHEEL_ITEM_LOCKED_COLOR.GetValue(); - else - display->m_colorLocked = RageColor(0,0,0,0); - - display->Draw(); -} - void WheelBase::UpdateScrollbar() { int iTotalNumItems = m_CurWheelItemData.size(); @@ -207,7 +187,33 @@ void WheelBase::Update( float fDeltaTime ) { ActorFrame::Update( fDeltaTime ); - UpdateItems( fDeltaTime ); + for( int i=0; i NUM_WHEEL_ITEMS_TO_DRAW/2 ) + { + pDisplay->SetHidden( true ); + continue; + } + pDisplay->SetHidden( false ); + + switch( m_WheelState ) + { + case STATE_SELECTING: + case STATE_LOCKED: + case STATE_ROULETTE_SPINNING: + case STATE_ROULETTE_SLOWING_DOWN: + case STATE_RANDOM_SPINNING: + SetItemPosition( *pDisplay, fOffsetFromSelection ); + break; + } + + if( m_WheelState == STATE_LOCKED && i != NUM_WHEEL_ITEMS/2 ) + pDisplay->m_colorLocked = WHEEL_ITEM_LOCKED_COLOR.GetValue(); + else + pDisplay->m_colorLocked = RageColor(0,0,0,0); + } //Moved to CommonUpdateProcedure, seems to work fine //Revert if it happens to break something @@ -303,14 +309,6 @@ void WheelBase::Update( float fDeltaTime ) } } -void WheelBase::UpdateItems( float fDeltaTime ) -{ - for( unsigned i = 0; i < unsigned(NUM_WHEEL_ITEMS); i++) - { - m_WheelBaseItems[i]->Update( fDeltaTime ); - } -} - void WheelBase::UpdateSwitch() { switch( m_WheelState ) @@ -351,30 +349,30 @@ bool WheelBase::Select() // return true if this selection can end the screen m_Moving = 0; - if( !m_bEmpty ) - { - switch( m_CurWheelItemData[m_iSelection]->m_Type ) - { - case TYPE_GENERIC: - m_LastSelection = m_CurWheelItemData[m_iSelection]; - return false; - case TYPE_SECTION: - { - RString sThisItemSectionName = m_CurWheelItemData[m_iSelection]->m_sText; - if( m_sExpandedSectionName == sThisItemSectionName ) // already expanded - SetOpenGroup( "" ); // collapse it - else // already collapsed - SetOpenGroup( sThisItemSectionName ); // expand it + if( m_bEmpty ) + return false; - m_soundExpand.Play(); - } - return false; - default: - ASSERT(0); - return false; + switch( m_CurWheelItemData[m_iSelection]->m_Type ) + { + case TYPE_GENERIC: + m_LastSelection = m_CurWheelItemData[m_iSelection]; + break; + case TYPE_SECTION: + { + RString sThisItemSectionName = m_CurWheelItemData[m_iSelection]->m_sText; + if( m_sExpandedSectionName == sThisItemSectionName ) // already expanded + SetOpenGroup( "" ); // collapse it + else // already collapsed + SetOpenGroup( sThisItemSectionName ); // expand it + + m_soundExpand.Play(); } + break; + default: + break; } - return false; + + return true; } // return true if this selection ends the screen @@ -391,103 +389,20 @@ int WheelBase::IsMoving() const return m_Moving && m_TimeBeforeMovingBegins == 0; } -void WheelBase::TweenOnScreen( bool bChangingSort ) +void WheelBase::TweenOnScreenForSort() { m_WheelState = STATE_TWEENING_ON_SCREEN; - SetItemPosition( *m_sprHighlight, 0 ); - - COMMAND( m_sprHighlight, "StartOn"); - if( bChangingSort ) - { - const float delay = fabsf(NUM_WHEEL_ITEMS/2.0f) * WHEEL_ITEM_ON_DELAY_OFFSET; - m_sprHighlight->BeginTweening( delay ); // sleep - COMMAND( m_sprHighlight, "FinishOnSort"); - } - else - { - COMMAND( m_sprHighlight, "FinishOn"); - } - - m_ScrollBar.SetX( SCROLL_BAR_X ); - m_ScrollBar.AddX( 30 ); - if( bChangingSort ) - m_ScrollBar.BeginTweening( 0.2f ); // sleep - else - m_ScrollBar.BeginTweening( 0.7f ); // sleep - m_ScrollBar.BeginTweening( 0.2f , TWEEN_ACCELERATE ); - m_ScrollBar.AddX( -30 ); - - TweenOnScreenUpdateItems( bChangingSort ); - - if( bChangingSort ) - HurryTweening( 0.25f ); + COMMAND( this, "SortOn" ); m_fTimeLeftInState = GetTweenTimeLeft() + 0.100f; } -void WheelBase::TweenOnScreenUpdateItems( bool bChangingSort ) -{ - for( int i=0; iBeginTweening( delay ); // sleep - COMMAND( display, "FinishOn"); - if( bChangingSort ) - display->HurryTweening( 0.25f ); - } -} - -void WheelBase::TweenOffScreenUpdateItems( bool bChangingSort ) -{ - for( int i=0; iBeginTweening( delay ); // sleep - COMMAND( display, "FinishOff"); - if( bChangingSort ) - display->HurryTweening( 0.25f ); - } -} - -void WheelBase::TweenOffScreen( bool bChangingSort ) +void WheelBase::TweenOffScreenForSort() { m_WheelState = STATE_TWEENING_OFF_SCREEN; - SetItemPosition( *m_sprHighlight, 0 ); - - COMMAND( m_sprHighlight, "StartOff"); - if( bChangingSort ) - { - /* When changing sort, tween the overlay with the item in the center; - * having it separate looks messy when we're moving fast. */ - const float delay = fabsf(NUM_WHEEL_ITEMS/2.0f) * WHEEL_ITEM_ON_DELAY_OFFSET; - m_sprHighlight->BeginTweening( delay ); // sleep - COMMAND( m_sprHighlight, "FinishOffSort"); - } - else - { - COMMAND( m_sprHighlight, "FinishOff"); - } - - m_ScrollBar.BeginTweening( 0 ); - m_ScrollBar.BeginTweening( 0.2f, TWEEN_ACCELERATE ); - m_ScrollBar.SetX( SCROLL_BAR_X+30 ); - - TweenOffScreenUpdateItems( bChangingSort ); - - if( bChangingSort ) - HurryTweening( 0.25f ); + COMMAND( this, "SortOff" ); m_fTimeLeftInState = GetTweenTimeLeft() + 0.100f; } @@ -631,7 +546,7 @@ void WheelBase::RebuildWheelItems( int iDist ) } } -WheelItemBaseData* WheelBase::LastSelected( ) +WheelItemBaseData* WheelBase::LastSelected() { if( m_bEmpty ) return NULL; diff --git a/stepmania/src/WheelBase.h b/stepmania/src/WheelBase.h index ac67f81e0a..ac0dd39fb7 100644 --- a/stepmania/src/WheelBase.h +++ b/stepmania/src/WheelBase.h @@ -23,13 +23,6 @@ public: void BeginScreen(); virtual void Update( float fDeltaTime ); - virtual void DrawPrimitives(); - void DrawItem( int i ); - - void TweenOnScreen(bool changing_sort); - void TweenOffScreen(bool changing_sort); - void TweenOnScreen() { TweenOnScreen(false); } - void TweenOffScreen() { TweenOffScreen(false); } virtual void Move(int n); void ChangeMusicUnlessLocked( int n ); /* +1 or -1 */ @@ -43,7 +36,7 @@ public: void GetItemPosition( float fPosOffsetsFromMiddle, float& fX_out, float& fY_out, float& fZ_out, float& fRotationX_out ); void SetItemPosition( Actor &item, float fPosOffsetsFromMiddle ); - virtual bool Select(); // return true if this selection ends the screen + virtual bool Select(); // return true if this selection can end the screen bool WheelIsLocked() { return (m_WheelState == STATE_LOCKED ? true : false); } void RebuildWheelItems( int dist = INT_MAX ); // INT_MAX = refresh all @@ -54,12 +47,11 @@ public: WheelItemBaseData* LastSelected(); protected: + void TweenOnScreenForSort(); + void TweenOffScreenForSort(); + virtual WheelItemBase *MakeItem() = 0; - virtual void LoadFromMetrics( RString sType ); virtual void UpdateSwitch(); - void UpdateItems(float fDeltaTime); - void TweenOnScreenUpdateItems(bool changing_sort); - void TweenOffScreenUpdateItems(bool changing_sort); virtual bool MoveSpecific(int n); int FirstVisibleIndex(); @@ -108,7 +100,6 @@ protected: ThemeMetric SWITCH_SECONDS; ThemeMetric LOCKED_INITIAL_VELOCITY; - ThemeMetric SCROLL_BAR_X; ThemeMetric SCROLL_BAR_HEIGHT; ThemeMetric ITEM_CURVE_X; ThemeMetric USE_LINEAR_WHEEL; @@ -117,8 +108,6 @@ protected: ThemeMetric CIRCLE_PERCENT; ThemeMetric USE_3D; ThemeMetric NUM_WHEEL_ITEMS_TO_DRAW; - ThemeMetric WHEEL_ITEM_ON_DELAY_OFFSET; - ThemeMetric WHEEL_ITEM_OFF_DELAY_OFFSET; ThemeMetric WHEEL_ITEM_LOCKED_COLOR; };