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:
@@ -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,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 );
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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:
|
||||
|
||||
@@ -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 ||
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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) );
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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 );
|
||||
|
||||
@@ -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;
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user