From f6850473bb6fc52c2255700b10448d634f365f17 Mon Sep 17 00:00:00 2001 From: Chris Danford Date: Thu, 5 May 2005 00:22:36 +0000 Subject: [PATCH] fix ScoreWheel scrolling --- stepmania/src/ActorScroller.cpp | 75 ++++---------------- stepmania/src/ActorScroller.h | 14 +--- stepmania/src/ScreenCredits.cpp | 43 +++++++---- stepmania/src/ScreenNameEntryTraditional.cpp | 23 +++--- stepmania/src/ScreenSelectMaster.cpp | 8 +-- 5 files changed, 62 insertions(+), 101 deletions(-) diff --git a/stepmania/src/ActorScroller.cpp b/stepmania/src/ActorScroller.cpp index afe9e6fdd8..545639c366 100644 --- a/stepmania/src/ActorScroller.cpp +++ b/stepmania/src/ActorScroller.cpp @@ -44,43 +44,6 @@ ActorScroller::ActorScroller() m_quadMask.SetHidden( true ); } -void ActorScroller::Load( - float fSecondsPerItem, - float fNumItemsToDraw, - const RageVector3 &vRotationDegrees, - const RageVector3 &vTranslateTerm0, - const RageVector3 &vTranslateTerm1, - const RageVector3 &vTranslateTerm2, - bool bUseMask - ) -{ - m_fSecondsPerItem = fSecondsPerItem; - m_fNumItemsToDraw = fNumItemsToDraw; - - - // Note: Rotation is applied before translation. - // rot = m_vRotationDegrees*itemOffset^1 - // trans = m_vTranslateTerm0*itemOffset^0 + - // m_vTranslateTerm1*itemOffset^1 + - // m_vTranslateTerm2*itemOffset^2 - ostringstream s; - s << - "function(self,offset,itemIndex,numItems) " << - "self:x(" << vTranslateTerm0.x << " + " << vTranslateTerm1.x << "*offset + " << vTranslateTerm2.x << "*offset*offset); " << - "self:y(" << vTranslateTerm0.y << " + " << vTranslateTerm1.y << "*offset + " << vTranslateTerm2.y << "*offset*offset); " << - "self:z(" << vTranslateTerm0.z << " + " << vTranslateTerm1.z << "*offset + " << vTranslateTerm2.z << "*offset*offset); " << - "self:rotationx(" << vRotationDegrees.x << "*offset); " << - "self:rotationy(" << vRotationDegrees.y << "*offset); " << - "self:rotationz(" << vRotationDegrees.z << "*offset); " << - "end"; - m_exprTransform.SetFromExpression( s.str() ); - - m_fQuantizePixels = 0; - m_bUseMask = bUseMask; - - m_bLoaded = true; -} - void ActorScroller::Load2( float fNumItemsToDraw, float fItemWidth, @@ -99,7 +62,7 @@ void ActorScroller::Load2( m_fMaskWidth = fItemWidth; m_fMaskHeight = fItemHeight; - m_exprTransform.SetFromExpression( + m_exprTransformFunction.SetFromExpression( ssprintf("function(self,offset,itemIndex,numItems) return self:y(%f*offset) end",fItemHeight) ); @@ -129,14 +92,16 @@ void ActorScroller::Load3( float fSecondsPerItem, float fNumItemsToDraw, bool bFastCatchup, - const CString &sExprTransform + const CString &sTransformFunction, + bool bUseMask ) { m_fSecondsPerItem = fSecondsPerItem; m_fNumItemsToDraw = fNumItemsToDraw; m_bFastCatchup = bFastCatchup; - m_exprTransform.SetFromExpression( sExprTransform ); + m_exprTransformFunction.SetFromExpression( sTransformFunction ); m_fQuantizePixels = 0; + m_bUseMask = bUseMask; m_bLoaded = true; } @@ -164,41 +129,27 @@ void ActorScroller::LoadFromNode( const CString &sDir, const XNode *pNode ) float fSecondsPerItem = 1; float fNumItemsToDraw = 0; - RageVector3 vRotationDegrees = RageVector3(0,0,0); - RageVector3 vTranslateTerm0 = RageVector3(0,0,0); - RageVector3 vTranslateTerm1 = RageVector3(0,0,0); - RageVector3 vTranslateTerm2 = RageVector3(0,0,0); float fItemPaddingStart = 0; float fItemPaddingEnd = 0; + CString sTransformFunction; GET_VALUE( "SecondsPerItem", fSecondsPerItem ); GET_VALUE( "NumItemsToDraw", fNumItemsToDraw ); - GET_VALUE( "RotationDegreesX", vRotationDegrees.x ); - GET_VALUE( "RotationDegreesY", vRotationDegrees.y ); - GET_VALUE( "RotationDegreesZ", vRotationDegrees.z ); - GET_VALUE( "TranslateTerm0X", vTranslateTerm0.x ); - GET_VALUE( "TranslateTerm0Y", vTranslateTerm0.y ); - GET_VALUE( "TranslateTerm0Z", vTranslateTerm0.z ); - GET_VALUE( "TranslateTerm1X", vTranslateTerm1.x ); - GET_VALUE( "TranslateTerm1Y", vTranslateTerm1.y ); - GET_VALUE( "TranslateTerm1Z", vTranslateTerm1.z ); - GET_VALUE( "TranslateTerm2X", vTranslateTerm2.x ); - GET_VALUE( "TranslateTerm2Y", vTranslateTerm2.y ); - GET_VALUE( "TranslateTerm2Z", vTranslateTerm2.z ); GET_VALUE( "ItemPaddingStart", fItemPaddingStart ); GET_VALUE( "ItemPaddingEnd", fItemPaddingEnd ); + GET_VALUE( "TransformFunction", sTransformFunction ); #undef GET_VALUE - Load( + Load3( fSecondsPerItem, fNumItemsToDraw, - vRotationDegrees, - vTranslateTerm0, - vTranslateTerm1, - vTranslateTerm2 ); + false, + sTransformFunction, + false ); SetCurrentAndDestinationItem( -fItemPaddingStart ); SetDestinationItem( m_SubActors.size()-1+fItemPaddingEnd ); + pNode->GetAttrValue( "UseMask", m_bUseMask ); pNode->GetAttrValue( "QuantizePixels", m_fQuantizePixels ); } @@ -256,7 +207,7 @@ void ActorScroller::Update( float fDeltaTime ) void ActorScroller::PositionItem( Actor *pActor, float fPositionOffsetFromCenter, int iItemIndex, int iNumItems ) { - m_exprTransform.PushSelf( LUA->L ); + m_exprTransformFunction.PushSelf( LUA->L ); ASSERT( !lua_isnil(LUA->L, -1) ); pActor->PushSelf( LUA->L ); LuaHelpers::Push( fPositionOffsetFromCenter, LUA->L ); diff --git a/stepmania/src/ActorScroller.h b/stepmania/src/ActorScroller.h index 255c21da50..d2e4418bcd 100644 --- a/stepmania/src/ActorScroller.h +++ b/stepmania/src/ActorScroller.h @@ -27,15 +27,6 @@ class ActorScroller : public ActorFrame public: ActorScroller(); - void Load( - float fScrollSecondsPerItem, - float fNumItemsToDraw, - const RageVector3 &vRotationDegrees, - const RageVector3 &vTranslateTerm0, - const RageVector3 &vTranslateTerm1, - const RageVector3 &vTranslateTerm2, - bool bUseMask = false ); - void Load2( float fNumItemsToDraw, float fItemWidth, @@ -48,7 +39,8 @@ public: float fSecondsPerItem, float fNumItemsToDraw, bool bFastCatchup, - const CString &sExprTransform ); + const CString &sTransformFunction, + bool bUseMask ); virtual void Update( float fDelta ); virtual void DrawPrimitives(); // DOES draw @@ -87,7 +79,7 @@ protected: float m_fMaskHeight; Quad m_quadMask; - LuaExpression m_exprTransform; // params: self,offset,itemIndex,numItems + LuaExpression m_exprTransformFunction; // params: self,offset,itemIndex,numItems }; class ActorScrollerAutoDeleteChildren : public ActorScroller diff --git a/stepmania/src/ScreenCredits.cpp b/stepmania/src/ScreenCredits.cpp index 75ec620c28..b3ee37ed2f 100644 --- a/stepmania/src/ScreenCredits.cpp +++ b/stepmania/src/ScreenCredits.cpp @@ -164,25 +164,31 @@ ScreenCredits::ScreenCredits( CString sName ) : ScreenAttract( sName ) SongUtil::SortSongPointerArrayByTitle( arraySongs ); // FIXME: Redo this screen with a BGA + CString sBackgroundsTransformFunction = ssprintf( + "function(self,offset,itemIndex,numItems) " + " self:x(%f*offset); " + " self:y(%f*offset); " + "end", + (float)BACKGROUNDS_SPACING_X, + (float)BACKGROUNDS_SPACING_Y ); + m_ScrollerBackgrounds.SetName( "Backgrounds" ); - m_ScrollerBackgrounds.Load( + m_ScrollerBackgrounds.Load3( BACKGROUNDS_SCROLL_SECONDS_PER_ITEM, 4, - RageVector3(0, 0, 0), - RageVector3(0, 0, 0), - RageVector3(BACKGROUNDS_SPACING_X, BACKGROUNDS_SPACING_Y, 0), - RageVector3(0, 0, 0) ); + false, + sBackgroundsTransformFunction, + false ); SET_XY( m_ScrollerBackgrounds ); this->AddChild( &m_ScrollerBackgrounds ); m_ScrollerFrames.SetName( "Backgrounds" ); - m_ScrollerFrames.Load( + m_ScrollerFrames.Load3( BACKGROUNDS_SCROLL_SECONDS_PER_ITEM, 4, - RageVector3(0, 0, 0), - RageVector3(0, 0, 0), - RageVector3(BACKGROUNDS_SPACING_X, BACKGROUNDS_SPACING_Y, 0), - RageVector3(0, 0, 0) ); + false, + sBackgroundsTransformFunction, + false ); SET_XY( m_ScrollerFrames ); this->AddChild( &m_ScrollerFrames ); @@ -218,14 +224,21 @@ ScreenCredits::ScreenCredits( CString sName ) : ScreenAttract( sName ) fTime = max( fTime, BACKGROUNDS_SCROLL_SECONDS_PER_ITEM*(fLast-fFirst) ); } + CString sTextsTransformFunction = ssprintf( + "function(self,offset,itemIndex,numItems) " + " self:x(%f*offset); " + " self:y(%f*offset); " + "end", + (float)TEXTS_SPACING_X, + (float)TEXTS_SPACING_Y ); + m_ScrollerTexts.SetName( "Texts" ); - m_ScrollerTexts.Load( + m_ScrollerTexts.Load3( TEXTS_SCROLL_SECONDS_PER_ITEM, 40, - RageVector3(0, 0, 0), - RageVector3(0, 0, 0), - RageVector3(TEXTS_SPACING_X, TEXTS_SPACING_Y, 0), - RageVector3(0, 0, 0) ); + false, + sTextsTransformFunction, + false ); SET_XY( m_ScrollerTexts ); this->AddChild( &m_ScrollerTexts ); diff --git a/stepmania/src/ScreenNameEntryTraditional.cpp b/stepmania/src/ScreenNameEntryTraditional.cpp index 4bce457e57..9d3ffd8f39 100644 --- a/stepmania/src/ScreenNameEntryTraditional.cpp +++ b/stepmania/src/ScreenNameEntryTraditional.cpp @@ -109,15 +109,20 @@ void HighScoreWheel::Load( const HighScoreList& hsl, int iIndexToFocus ) if( m_iIndexToFocus >= 0 && m_iIndexToFocus < int(hsl.vHighScores.size()) ) m_Items[m_iIndexToFocus].ShowFocus(); - ActorScroller::Load( - 0.2f, // fSecondsPerItem - 9, // fNumItemsToDraw - RageVector3(18,0,0), // vRotationDegrees - RageVector3(0,0,90), // vTranslateTerm0 - RageVector3(0,0,0), // vTranslateTerm1 - RageVector3(0,0,0), // vTranslateTerm2 - true - ); + CString sTransformFunction = + "function(self,offset,itemIndex,numItems) " + " local degrees=18*offset; " + " local radians=degrees*math.pi/180; " + " self:rotationx(degrees); " + " self:y(math.sin(radians)*90); " + " self:z(math.cos(radians)*90); " + "end"; + ActorScroller::Load3( + 0.2f, + 100, + false, + sTransformFunction, + false ); Scroll(); } diff --git a/stepmania/src/ScreenSelectMaster.cpp b/stepmania/src/ScreenSelectMaster.cpp index dcf060d167..3a00f58a74 100644 --- a/stepmania/src/ScreenSelectMaster.cpp +++ b/stepmania/src/ScreenSelectMaster.cpp @@ -104,8 +104,8 @@ void ScreenSelectMaster::Init() SCROLLER_SECONDS_PER_ITEM, SCROLLER_NUM_ITEMS_TO_DRAW, SCROLLER_FAST_CATCHUP, - SCROLLER_TRANSFORM - ); + SCROLLER_TRANSFORM, + false ); m_Scroller[0].SetName( "Scroller" ); this->AddChild( &m_Scroller[0] ); @@ -126,8 +126,8 @@ void ScreenSelectMaster::Init() SCROLLER_SECONDS_PER_ITEM, SCROLLER_NUM_ITEMS_TO_DRAW, SCROLLER_FAST_CATCHUP, - SCROLLER_TRANSFORM - ); + SCROLLER_TRANSFORM, + false ); m_Scroller[p].SetName( ssprintf("ScrollerP%d",p+1) ); this->AddChild( &m_Scroller[p] );