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)

This commit is contained in:
Chris Danford
2008-03-22 02:53:35 +00:00
parent c0cc1d4065
commit f04098518b
9 changed files with 32 additions and 27 deletions
+4 -4
View File
@@ -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 )
+17 -14
View File
@@ -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<PositionOffsetAndItemIndex,Actor::TweenState>::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<PositionOffsetAndItemIndex,Actor::TweenState>::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 );
}
}
+4 -3
View File
@@ -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:
+1 -1
View File
@@ -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 ||
+1 -1
View File
@@ -133,7 +133,7 @@ protected: // derived classes need access to these
ThemeMetric<apActorCommands> ROW_INIT_COMMAND;
ThemeMetric<apActorCommands> ROW_ON_COMMAND;
ThemeMetric<apActorCommands> ROW_OFF_COMMAND;
LuaExpressionTransform m_exprRowPositionTransformFunction; // params: self,positionIndex,itemIndex,numItems
LuaExpressionTransform m_exprRowPositionTransformFunction; // params: self,offsetFromCenter,itemIndex,numItems
ThemeMetric<bool> SHOW_SCROLL_BAR;
ThemeMetric<float> SCROLL_BAR_HEIGHT;
ThemeMetric<float> SCROLL_BAR_TIME;
+2 -1
View File
@@ -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) );
+1 -1
View File
@@ -33,7 +33,7 @@ public:
private:
vector<Sprite*> 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
+1 -1
View File
@@ -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 );
+1 -1
View File
@@ -105,7 +105,7 @@ protected:
ThemeMetric<float> SWITCH_SECONDS;
ThemeMetric<float> LOCKED_INITIAL_VELOCITY;
ThemeMetric<int> SCROLL_BAR_HEIGHT;
LuaExpressionTransform m_exprItemTransformFunction; // params: self,positionIndex,itemIndex,numItems
LuaExpressionTransform m_exprItemTransformFunction;
ThemeMetric<float> NUM_WHEEL_ITEMS_TO_DRAW;
ThemeMetric<RageColor> WHEEL_ITEM_LOCKED_COLOR;
};