From f04098518b9947825a1f4537257545d4181866a3 Mon Sep 17 00:00:00 2001 From: Chris Danford Date: Sat, 22 Mar 2008 02:53:35 +0000 Subject: [PATCH] add TransformItemDirect for places (StreamDisplay) that don't want to cache the transforms and also want to do non-TweenState things to an item (GetWidth,SetState) --- stepmania/src/ActorScroller.cpp | 8 +++--- stepmania/src/LuaExpressionTransform.cpp | 31 +++++++++++++----------- stepmania/src/LuaExpressionTransform.h | 7 +++--- stepmania/src/ScreenOptions.cpp | 2 +- stepmania/src/ScreenOptions.h | 2 +- stepmania/src/StreamDisplay.cpp | 3 ++- stepmania/src/StreamDisplay.h | 2 +- stepmania/src/WheelBase.cpp | 2 +- stepmania/src/WheelBase.h | 2 +- 9 files changed, 32 insertions(+), 27 deletions(-) diff --git a/stepmania/src/ActorScroller.cpp b/stepmania/src/ActorScroller.cpp index e707634944..9734358d6b 100644 --- a/stepmania/src/ActorScroller.cpp +++ b/stepmania/src/ActorScroller.cpp @@ -57,7 +57,7 @@ void ActorScroller::SetTransformFromReference( const LuaReference &ref ) m_exprTransformFunction.SetFromReference( ref ); // Probe to find which of the parameters are used. -#define GP(a,b) m_exprTransformFunction.GetPosition( a, b, 2 ) +#define GP(a,b) m_exprTransformFunction.GetTransformCached( a, b, 2 ) m_bFunctionDependsOnPositionOffset = (GP(0,0) != GP(1,0)) && (GP(0,1) != GP(1,1)); m_bFunctionDependsOnItemIndex = (GP(0,0) != GP(0,1)) && (GP(1,0) != GP(1,1)); m_exprTransformFunction.ClearCache(); @@ -234,10 +234,10 @@ void ActorScroller::PositionItemsAndDrawPrimitives( bool bDrawPrimitives ) float fPositionFullyOffScreenTop = -(fNumItemsToDraw)/2.f; float fPositionFullyOffScreenBottom = (fNumItemsToDraw)/2.f; - m_exprTransformFunction.TransformItem( &m_quadMask, fPositionFullyOffScreenTop, -1, m_iNumItems ); + m_exprTransformFunction.TransformItemCached( m_quadMask, fPositionFullyOffScreenTop, -1, m_iNumItems ); if( bDrawPrimitives ) m_quadMask.Draw(); - m_exprTransformFunction.TransformItem( &m_quadMask, fPositionFullyOffScreenBottom, m_iNumItems, m_iNumItems ); + m_exprTransformFunction.TransformItemCached( m_quadMask, fPositionFullyOffScreenBottom, m_iNumItems, m_iNumItems ); if( bDrawPrimitives ) m_quadMask.Draw(); } @@ -281,7 +281,7 @@ void ActorScroller::PositionItemsAndDrawPrimitives( bool bDrawPrimitives ) if( !m_bFunctionDependsOnItemIndex ) iItem = 0; - m_exprTransformFunction.TransformItem( m_SubActors[iIndex], fPosition, iItem, m_iNumItems ); + m_exprTransformFunction.TransformItemCached( *m_SubActors[iIndex], fPosition, iItem, m_iNumItems ); if( bDrawPrimitives ) { if( bDelayedDraw ) diff --git a/stepmania/src/LuaExpressionTransform.cpp b/stepmania/src/LuaExpressionTransform.cpp index 93009e6288..f8da8d936e 100644 --- a/stepmania/src/LuaExpressionTransform.cpp +++ b/stepmania/src/LuaExpressionTransform.cpp @@ -17,16 +17,8 @@ void LuaExpressionTransform::SetFromReference( const LuaReference &ref ) m_exprTransformFunction = ref; } -const Actor::TweenState &LuaExpressionTransform::GetPosition( float fPositionOffsetFromCenter, int iItemIndex, int iNumItems ) const +void LuaExpressionTransform::TransformItemDirect( Actor &a, float fPositionOffsetFromCenter, int iItemIndex, int iNumItems ) const { - PositionOffsetAndItemIndex key = { fPositionOffsetFromCenter, iItemIndex }; - - map::const_iterator iter = m_mapPositionToTweenStateCache.find( key ); - if( iter != m_mapPositionToTweenStateCache.end() ) - return iter->second; - - Actor a; - Lua *L = LUA->Get(); m_exprTransformFunction.PushSelf( L ); ASSERT( !lua_isnil(L, -1) ); @@ -36,11 +28,22 @@ const Actor::TweenState &LuaExpressionTransform::GetPosition( float fPositionOff LuaHelpers::Push( L, iNumItems ); lua_call( L, 4, 0 ); // 4 args, 0 results LUA->Release(L); +} +const Actor::TweenState &LuaExpressionTransform::GetTransformCached( float fPositionOffsetFromCenter, int iItemIndex, int iNumItems ) const +{ + PositionOffsetAndItemIndex key = { fPositionOffsetFromCenter, iItemIndex }; + + map::const_iterator iter = m_mapPositionToTweenStateCache.find( key ); + if( iter != m_mapPositionToTweenStateCache.end() ) + return iter->second; + + Actor a; + TransformItemDirect( a, fPositionOffsetFromCenter, iItemIndex, iNumItems ); return m_mapPositionToTweenStateCache[key] = a.DestTweenState(); } -void LuaExpressionTransform::TransformItem( Actor *pActor, float fPositionOffsetFromCenter, int iItemIndex, int iNumItems ) +void LuaExpressionTransform::TransformItemCached( Actor &a, float fPositionOffsetFromCenter, int iItemIndex, int iNumItems ) { float fInterval = 1.0f / m_iNumSubdivisions; float fFloor = QuantizeDown( fPositionOffsetFromCenter, fInterval ); @@ -48,15 +51,15 @@ void LuaExpressionTransform::TransformItem( Actor *pActor, float fPositionOffset if( fFloor == fCeil ) { - pActor->DestTweenState() = GetPosition( fCeil, iItemIndex, iNumItems ); + a.DestTweenState() = GetTransformCached( fCeil, iItemIndex, iNumItems ); } else { - const Actor::TweenState &tsFloor = GetPosition( fFloor, iItemIndex, iNumItems ); - const Actor::TweenState &tsCeil = GetPosition( fCeil, iItemIndex, iNumItems ); + const Actor::TweenState &tsFloor = GetTransformCached( fFloor, iItemIndex, iNumItems ); + const Actor::TweenState &tsCeil = GetTransformCached( fCeil, iItemIndex, iNumItems ); float fPercentTowardCeil = SCALE( fPositionOffsetFromCenter, fFloor, fCeil, 0.0f, 1.0f ); - Actor::TweenState::MakeWeightedAverage( pActor->DestTweenState(), tsFloor, tsCeil, fPercentTowardCeil ); + Actor::TweenState::MakeWeightedAverage( a.DestTweenState(), tsFloor, tsCeil, fPercentTowardCeil ); } } diff --git a/stepmania/src/LuaExpressionTransform.h b/stepmania/src/LuaExpressionTransform.h index cb143e0eeb..18cdf00c77 100644 --- a/stepmania/src/LuaExpressionTransform.h +++ b/stepmania/src/LuaExpressionTransform.h @@ -1,4 +1,4 @@ -/* LuaExpressionTransform - . */ +/* LuaExpressionTransform - Handle transforming a list of items. Cache item transforms based on fPositionOffsetFromCenter and iItemIndex for speed. */ #ifndef LuaExpressionTransform_H #define LuaExpressionTransform_H @@ -16,8 +16,9 @@ public: void SetFromReference( const LuaReference &ref ); void SetNumSubdivisions( int iNumSubdivisions ) { ASSERT( iNumSubdivisions > 0 ); m_iNumSubdivisions = iNumSubdivisions; } - void TransformItem( Actor *pActor, float fPositionOffsetFromCenter, int iItemIndex, int iNumItems ); - const Actor::TweenState &GetPosition( float fPositionOffsetFromCenter, int iItemIndex, int iNumItems ) const; + void TransformItemCached( Actor &a, float fPositionOffsetFromCenter, int iItemIndex, int iNumItems ); + void TransformItemDirect( Actor &a, float fPositionOffsetFromCenter, int iItemIndex, int iNumItems ) const; + const Actor::TweenState &GetTransformCached( float fPositionOffsetFromCenter, int iItemIndex, int iNumItems ) const; void ClearCache() { m_mapPositionToTweenStateCache.clear(); } protected: diff --git a/stepmania/src/ScreenOptions.cpp b/stepmania/src/ScreenOptions.cpp index a82ca0cdbc..72f42f8b0a 100644 --- a/stepmania/src/ScreenOptions.cpp +++ b/stepmania/src/ScreenOptions.cpp @@ -651,7 +651,7 @@ void ScreenOptions::PositionRows( bool bTween ) else if( i >= first_end && i < second_start ) fPos = ((int)NUM_ROWS_SHOWN)/2-0.5f; else if( i >= second_end ) fPos = ((int)NUM_ROWS_SHOWN)-0.5f; - Actor::TweenState tsDestination = m_exprRowPositionTransformFunction.GetPosition( fPos, i, min( (int)Rows.size(), (int)NUM_ROWS_SHOWN ) ); + Actor::TweenState tsDestination = m_exprRowPositionTransformFunction.GetTransformCached( fPos, i, min( (int)Rows.size(), (int)NUM_ROWS_SHOWN ) ); bool bHidden = i < first_start || diff --git a/stepmania/src/ScreenOptions.h b/stepmania/src/ScreenOptions.h index caf6e2bcd8..4ff3ddd1d6 100644 --- a/stepmania/src/ScreenOptions.h +++ b/stepmania/src/ScreenOptions.h @@ -133,7 +133,7 @@ protected: // derived classes need access to these ThemeMetric ROW_INIT_COMMAND; ThemeMetric ROW_ON_COMMAND; ThemeMetric ROW_OFF_COMMAND; - LuaExpressionTransform m_exprRowPositionTransformFunction; // params: self,positionIndex,itemIndex,numItems + LuaExpressionTransform m_exprRowPositionTransformFunction; // params: self,offsetFromCenter,itemIndex,numItems ThemeMetric SHOW_SCROLL_BAR; ThemeMetric SCROLL_BAR_HEIGHT; ThemeMetric SCROLL_BAR_TIME; diff --git a/stepmania/src/StreamDisplay.cpp b/stepmania/src/StreamDisplay.cpp index 3f4ab0b029..e13d4892e2 100644 --- a/stepmania/src/StreamDisplay.cpp +++ b/stepmania/src/StreamDisplay.cpp @@ -40,7 +40,8 @@ void StreamDisplay::Load( const RString &_sMetricsGroup ) Sprite *pSpr = new Sprite; pSpr->Load( THEME->GetPathG(sMetricsGroup,StreamTypeToString(st)) ); m_vpSprPill[st].push_back( pSpr ); - m_transformPill.TransformItem( pSpr, -1, i, iNumPills ); + + m_transformPill.TransformItemDirect( *pSpr, -1, i, iNumPills ); float f = 1 / fTextureCoordScaleX; pSpr->SetCustomTextureRect( RectF(f*i,0,f*(i+1),1) ); diff --git a/stepmania/src/StreamDisplay.h b/stepmania/src/StreamDisplay.h index c3b5205f26..591f31c64c 100644 --- a/stepmania/src/StreamDisplay.h +++ b/stepmania/src/StreamDisplay.h @@ -33,7 +33,7 @@ public: private: vector m_vpSprPill[NUM_StreamType]; - LuaExpressionTransform m_transformPill; // params: self,positionIndex,itemIndex,numItems + LuaExpressionTransform m_transformPill; // params: self,offsetFromCenter,itemIndex,numItems float m_fPercent; // percent filled float m_fTrailingPercent; // this approaches m_fPercent, use this value to draw diff --git a/stepmania/src/WheelBase.cpp b/stepmania/src/WheelBase.cpp index 47a1235f03..24d75208c2 100644 --- a/stepmania/src/WheelBase.cpp +++ b/stepmania/src/WheelBase.cpp @@ -93,7 +93,7 @@ void WheelBase::SetItemPosition( Actor &item, float fPosOffsetsFromMiddle ) int iItemIndex = 0; // dummy int iNumItems = 1; // dummy - Actor::TweenState ts = m_exprItemTransformFunction.GetPosition( fPosOffsetsFromMiddle, iItemIndex, iNumItems ); + Actor::TweenState ts = m_exprItemTransformFunction.GetTransformCached( fPosOffsetsFromMiddle, iItemIndex, iNumItems ); /* Round to achieve pixel alignment. Any benefit to moving this to Lua? -Chris */ ts.pos.x = roundf( ts.pos.x ); diff --git a/stepmania/src/WheelBase.h b/stepmania/src/WheelBase.h index 2a02514490..ceb0892de6 100644 --- a/stepmania/src/WheelBase.h +++ b/stepmania/src/WheelBase.h @@ -105,7 +105,7 @@ protected: ThemeMetric SWITCH_SECONDS; ThemeMetric LOCKED_INITIAL_VELOCITY; ThemeMetric SCROLL_BAR_HEIGHT; - LuaExpressionTransform m_exprItemTransformFunction; // params: self,positionIndex,itemIndex,numItems + LuaExpressionTransform m_exprItemTransformFunction; ThemeMetric NUM_WHEEL_ITEMS_TO_DRAW; ThemeMetric WHEEL_ITEM_LOCKED_COLOR; };