Files
itgmania212121/stepmania/src/ListDisplay.cpp
T
Chris Danford b07b681e99 fix VC7 warning
2005-03-01 15:54:13 +00:00

175 lines
5.3 KiB
C++

#include "global.h"
#include "ListDisplay.h"
#include "RageUtil.h"
#include "GameConstantsAndTypes.h"
#include "PrefsManager.h"
#include "RageLog.h"
#include "PrefsManager.h"
#include "Course.h"
#include "SongManager.h"
#include "ThemeManager.h"
#include "Steps.h"
#include "GameState.h"
#include "Style.h"
#include "RageTexture.h"
//
// TODO: Merge this with ActorScroller
//
ListDisplay::ListDisplay()
{
m_iNumItemsToShow = 0;
m_fItemWidth = 0;
m_fItemHeight = 0;
m_fCurrentItemAtTopOfList = 0;
m_fDestinationItemAtTopOfList = 0;
m_quadMask.SetBlendMode( BLEND_NO_EFFECT ); // don't change color values
m_quadMask.SetUseZBuffer( true ); // we want to write to the Zbuffer
}
void ListDisplay::Load(
const vector<Actor*> &m_vpItems,
int iNumItemsToShow,
float fItemWidth,
float fItemHeight,
bool bLoop,
float fSecondsPerItem,
float fSecondsPauseBetweenItems,
bool bSlide )
{
CLAMP( iNumItemsToShow, 1, 10000 );
CLAMP( fItemWidth, 1, 10000 );
CLAMP( fItemHeight, 1, 10000 );
CLAMP( fSecondsPerItem, 0.01f, 10000 );
CLAMP( fSecondsPauseBetweenItems, 0, 10000 );
m_SubActors = m_vpItems;
m_iNumItemsToShow = iNumItemsToShow;
m_fItemWidth = fItemWidth;
m_fItemHeight = fItemHeight;
m_bLoop = bLoop;
m_fSecondsPerItem = fSecondsPerItem;
m_fSecondsPauseBetweenItems = fSecondsPauseBetweenItems;
m_bSlide = bSlide;
m_fCurrentItemAtTopOfList = m_bLoop ? 0 : (float)-m_iNumItemsToShow;
m_fDestinationItemAtTopOfList = (float)(m_vpItems.size()+1);
m_fSecondsPauseCountdown = 0;
RectF rectBarSize(-m_fItemWidth/2, -m_fItemHeight/2,
m_fItemWidth/2, m_fItemHeight/2);
m_quadMask.StretchTo( rectBarSize );
m_quadMask.SetZ( 1 );
}
float ListDisplay::GetSecondsForCompleteScrollThrough()
{
int fTotalItems = m_iNumItemsToShow + m_SubActors.size();
return fTotalItems * (m_fSecondsPerItem + m_fSecondsPauseBetweenItems );
}
void ListDisplay::Update( float fDeltaTime )
{
ActorFrame::Update( fDeltaTime );
/* If we have no children, the code below will busy loop. */
if( !m_SubActors.size() )
return;
// handle pause
if( fDeltaTime > m_fSecondsPauseCountdown )
{
fDeltaTime -= m_fSecondsPauseCountdown;
m_fSecondsPauseCountdown = 0;
}
else
{
m_fSecondsPauseCountdown -= fDeltaTime;
fDeltaTime = 0;
return;
}
if( m_fCurrentItemAtTopOfList == m_fDestinationItemAtTopOfList )
return; // done scrolling
float fOldItemAtTop = m_fCurrentItemAtTopOfList;
fapproach( m_fCurrentItemAtTopOfList, m_fDestinationItemAtTopOfList, fDeltaTime/m_fSecondsPerItem );
// if items changed, then pause
if( (int)fOldItemAtTop != (int)m_fCurrentItemAtTopOfList )
m_fSecondsPauseCountdown = m_fSecondsPauseBetweenItems;
if( m_bLoop )
wrap( m_fCurrentItemAtTopOfList, (float) m_SubActors.size() );
}
void ListDisplay::DrawPrimitives()
{
if( m_SubActors.empty() )
return;
// write to z buffer so that top and bottom are clipped
float fIndexFullyOnScreenTop = -(m_iNumItemsToShow-1)/2.f;
float fIndexFullyOnScreenBottom = (m_iNumItemsToShow-1)/2.f;
float fIndexCompletelyOffScreenTop = fIndexFullyOnScreenTop - 1;
float fIndexCompletelyOffScreenBottom = fIndexFullyOnScreenBottom + 1;
m_quadMask.SetY( fIndexCompletelyOffScreenTop * m_fItemHeight );
m_quadMask.Draw();
m_quadMask.SetY( fIndexCompletelyOffScreenBottom * m_fItemHeight );
m_quadMask.Draw();
int iItemToDraw = (int)m_fCurrentItemAtTopOfList;
float fRemainder = m_fCurrentItemAtTopOfList - (int)m_fCurrentItemAtTopOfList;
float fIndex = fIndexFullyOnScreenTop - fRemainder;
float fY = (fIndex)*m_fItemHeight;
for( int i=0; i<m_iNumItemsToShow+1; i++ )
{
if( iItemToDraw >= 0 && iItemToDraw < (int) m_SubActors.size() )
{
float fX = 0;
if( m_bSlide && fIndex>fIndexFullyOnScreenBottom-1 )
fX = SCALE( fIndex, fIndexFullyOnScreenBottom, fIndexFullyOnScreenBottom-1.f, 640.f, 0.f );
m_SubActors[iItemToDraw]->SetXY( roundf(fX), roundf(fY) );
m_SubActors[iItemToDraw]->Draw();
}
iItemToDraw++;
if( m_bLoop )
wrap( iItemToDraw, m_SubActors.size() );
fY += m_fItemHeight;
fIndex += 1;
}
}
/*
* (c) 2003 Chris Danford
* All rights reserved.
*
* Permission is hereby granted, free of charge, to any person obtaining a
* copy of this software and associated documentation files (the
* "Software"), to deal in the Software without restriction, including
* without limitation the rights to use, copy, modify, merge, publish,
* distribute, and/or sell copies of the Software, and to permit persons to
* whom the Software is furnished to do so, provided that the above
* copyright notice(s) and this permission notice appear in all copies of
* the Software and that both the above copyright notice(s) and this
* permission notice appear in supporting documentation.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF
* THIRD PARTY RIGHTS. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR HOLDERS
* INCLUDED IN THIS NOTICE BE LIABLE FOR ANY CLAIM, OR ANY SPECIAL INDIRECT
* OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS
* OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
* OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
* PERFORMANCE OF THIS SOFTWARE.
*/