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 );
|
m_exprTransformFunction.SetFromReference( ref );
|
||||||
|
|
||||||
// Probe to find which of the parameters are used.
|
// 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_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_bFunctionDependsOnItemIndex = (GP(0,0) != GP(0,1)) && (GP(1,0) != GP(1,1));
|
||||||
m_exprTransformFunction.ClearCache();
|
m_exprTransformFunction.ClearCache();
|
||||||
@@ -234,10 +234,10 @@ void ActorScroller::PositionItemsAndDrawPrimitives( bool bDrawPrimitives )
|
|||||||
float fPositionFullyOffScreenTop = -(fNumItemsToDraw)/2.f;
|
float fPositionFullyOffScreenTop = -(fNumItemsToDraw)/2.f;
|
||||||
float fPositionFullyOffScreenBottom = (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();
|
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();
|
if( bDrawPrimitives ) m_quadMask.Draw();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -281,7 +281,7 @@ void ActorScroller::PositionItemsAndDrawPrimitives( bool bDrawPrimitives )
|
|||||||
if( !m_bFunctionDependsOnItemIndex )
|
if( !m_bFunctionDependsOnItemIndex )
|
||||||
iItem = 0;
|
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( bDrawPrimitives )
|
||||||
{
|
{
|
||||||
if( bDelayedDraw )
|
if( bDelayedDraw )
|
||||||
|
|||||||
@@ -17,16 +17,8 @@ void LuaExpressionTransform::SetFromReference( const LuaReference &ref )
|
|||||||
m_exprTransformFunction = 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();
|
Lua *L = LUA->Get();
|
||||||
m_exprTransformFunction.PushSelf( L );
|
m_exprTransformFunction.PushSelf( L );
|
||||||
ASSERT( !lua_isnil(L, -1) );
|
ASSERT( !lua_isnil(L, -1) );
|
||||||
@@ -36,11 +28,22 @@ const Actor::TweenState &LuaExpressionTransform::GetPosition( float fPositionOff
|
|||||||
LuaHelpers::Push( L, iNumItems );
|
LuaHelpers::Push( L, iNumItems );
|
||||||
lua_call( L, 4, 0 ); // 4 args, 0 results
|
lua_call( L, 4, 0 ); // 4 args, 0 results
|
||||||
LUA->Release(L);
|
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();
|
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 fInterval = 1.0f / m_iNumSubdivisions;
|
||||||
float fFloor = QuantizeDown( fPositionOffsetFromCenter, fInterval );
|
float fFloor = QuantizeDown( fPositionOffsetFromCenter, fInterval );
|
||||||
@@ -48,15 +51,15 @@ void LuaExpressionTransform::TransformItem( Actor *pActor, float fPositionOffset
|
|||||||
|
|
||||||
if( fFloor == fCeil )
|
if( fFloor == fCeil )
|
||||||
{
|
{
|
||||||
pActor->DestTweenState() = GetPosition( fCeil, iItemIndex, iNumItems );
|
a.DestTweenState() = GetTransformCached( fCeil, iItemIndex, iNumItems );
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
const Actor::TweenState &tsFloor = GetPosition( fFloor, iItemIndex, iNumItems );
|
const Actor::TweenState &tsFloor = GetTransformCached( fFloor, iItemIndex, iNumItems );
|
||||||
const Actor::TweenState &tsCeil = GetPosition( fCeil, iItemIndex, iNumItems );
|
const Actor::TweenState &tsCeil = GetTransformCached( fCeil, iItemIndex, iNumItems );
|
||||||
|
|
||||||
float fPercentTowardCeil = SCALE( fPositionOffsetFromCenter, fFloor, fCeil, 0.0f, 1.0f );
|
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
|
#ifndef LuaExpressionTransform_H
|
||||||
#define LuaExpressionTransform_H
|
#define LuaExpressionTransform_H
|
||||||
@@ -16,8 +16,9 @@ public:
|
|||||||
void SetFromReference( const LuaReference &ref );
|
void SetFromReference( const LuaReference &ref );
|
||||||
void SetNumSubdivisions( int iNumSubdivisions ) { ASSERT( iNumSubdivisions > 0 ); m_iNumSubdivisions = iNumSubdivisions; }
|
void SetNumSubdivisions( int iNumSubdivisions ) { ASSERT( iNumSubdivisions > 0 ); m_iNumSubdivisions = iNumSubdivisions; }
|
||||||
|
|
||||||
void TransformItem( Actor *pActor, float fPositionOffsetFromCenter, int iItemIndex, int iNumItems );
|
void TransformItemCached( Actor &a, float fPositionOffsetFromCenter, int iItemIndex, int iNumItems );
|
||||||
const Actor::TweenState &GetPosition( float fPositionOffsetFromCenter, int iItemIndex, int iNumItems ) const;
|
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(); }
|
void ClearCache() { m_mapPositionToTweenStateCache.clear(); }
|
||||||
|
|
||||||
protected:
|
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 >= 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;
|
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 =
|
bool bHidden =
|
||||||
i < first_start ||
|
i < first_start ||
|
||||||
|
|||||||
@@ -133,7 +133,7 @@ protected: // derived classes need access to these
|
|||||||
ThemeMetric<apActorCommands> ROW_INIT_COMMAND;
|
ThemeMetric<apActorCommands> ROW_INIT_COMMAND;
|
||||||
ThemeMetric<apActorCommands> ROW_ON_COMMAND;
|
ThemeMetric<apActorCommands> ROW_ON_COMMAND;
|
||||||
ThemeMetric<apActorCommands> ROW_OFF_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<bool> SHOW_SCROLL_BAR;
|
||||||
ThemeMetric<float> SCROLL_BAR_HEIGHT;
|
ThemeMetric<float> SCROLL_BAR_HEIGHT;
|
||||||
ThemeMetric<float> SCROLL_BAR_TIME;
|
ThemeMetric<float> SCROLL_BAR_TIME;
|
||||||
|
|||||||
@@ -40,7 +40,8 @@ void StreamDisplay::Load( const RString &_sMetricsGroup )
|
|||||||
Sprite *pSpr = new Sprite;
|
Sprite *pSpr = new Sprite;
|
||||||
pSpr->Load( THEME->GetPathG(sMetricsGroup,StreamTypeToString(st)) );
|
pSpr->Load( THEME->GetPathG(sMetricsGroup,StreamTypeToString(st)) );
|
||||||
m_vpSprPill[st].push_back( pSpr );
|
m_vpSprPill[st].push_back( pSpr );
|
||||||
m_transformPill.TransformItem( pSpr, -1, i, iNumPills );
|
|
||||||
|
m_transformPill.TransformItemDirect( *pSpr, -1, i, iNumPills );
|
||||||
|
|
||||||
float f = 1 / fTextureCoordScaleX;
|
float f = 1 / fTextureCoordScaleX;
|
||||||
pSpr->SetCustomTextureRect( RectF(f*i,0,f*(i+1),1) );
|
pSpr->SetCustomTextureRect( RectF(f*i,0,f*(i+1),1) );
|
||||||
|
|||||||
@@ -33,7 +33,7 @@ public:
|
|||||||
private:
|
private:
|
||||||
vector<Sprite*> m_vpSprPill[NUM_StreamType];
|
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_fPercent; // percent filled
|
||||||
float m_fTrailingPercent; // this approaches m_fPercent, use this value to draw
|
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 iItemIndex = 0; // dummy
|
||||||
int iNumItems = 1; // 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 */
|
/* Round to achieve pixel alignment. Any benefit to moving this to Lua? -Chris */
|
||||||
ts.pos.x = roundf( ts.pos.x );
|
ts.pos.x = roundf( ts.pos.x );
|
||||||
|
|||||||
@@ -105,7 +105,7 @@ protected:
|
|||||||
ThemeMetric<float> SWITCH_SECONDS;
|
ThemeMetric<float> SWITCH_SECONDS;
|
||||||
ThemeMetric<float> LOCKED_INITIAL_VELOCITY;
|
ThemeMetric<float> LOCKED_INITIAL_VELOCITY;
|
||||||
ThemeMetric<int> SCROLL_BAR_HEIGHT;
|
ThemeMetric<int> SCROLL_BAR_HEIGHT;
|
||||||
LuaExpressionTransform m_exprItemTransformFunction; // params: self,positionIndex,itemIndex,numItems
|
LuaExpressionTransform m_exprItemTransformFunction;
|
||||||
ThemeMetric<float> NUM_WHEEL_ITEMS_TO_DRAW;
|
ThemeMetric<float> NUM_WHEEL_ITEMS_TO_DRAW;
|
||||||
ThemeMetric<RageColor> WHEEL_ITEM_LOCKED_COLOR;
|
ThemeMetric<RageColor> WHEEL_ITEM_LOCKED_COLOR;
|
||||||
};
|
};
|
||||||
|
|||||||
Reference in New Issue
Block a user