Dynamically allocate Sprites in backgrounds, instead of always

allocating and initializing hundreds of them per background.
This commit is contained in:
Glenn Maynard
2003-03-17 01:15:42 +00:00
parent 7d3ef82ff5
commit daf9d373a3
2 changed files with 155 additions and 135 deletions
+150 -132
View File
@@ -58,8 +58,21 @@ BGAnimationLayer::BGAnimationLayer()
Init(); Init();
} }
BGAnimationLayer::~BGAnimationLayer()
{
Unload();
}
void BGAnimationLayer::Unload()
{
for( unsigned i=0; i<m_Sprites.size(); i++ )
delete m_Sprites[i];
m_Sprites.clear();
}
void BGAnimationLayer::Init() void BGAnimationLayer::Init()
{ {
Unload();
// m_bCycleColor = false; // m_bCycleColor = false;
// m_bCycleAlpha = false; // m_bCycleAlpha = false;
// m_Effect = EFFECT_STRETCH_STILL; // m_Effect = EFFECT_STRETCH_STILL;
@@ -116,34 +129,34 @@ void BGAnimationLayer::Init()
void BGAnimationLayer::LoadFromStaticGraphic( CString sPath ) void BGAnimationLayer::LoadFromStaticGraphic( CString sPath )
{ {
Init(); Init();
m_iNumSprites = 1;
RageTextureID ID(sPath); RageTextureID ID(sPath);
ID.iAlphaBits = 0; ID.iAlphaBits = 0;
m_Sprites[0].LoadBG( ID ); m_Sprites.push_back(new Sprite);
m_Sprites[0].StretchTo( RectI(SCREEN_LEFT,SCREEN_TOP,SCREEN_RIGHT,SCREEN_BOTTOM) ); m_Sprites.back()->LoadBG( ID );
m_Sprites.back()->StretchTo( RectI(SCREEN_LEFT,SCREEN_TOP,SCREEN_RIGHT,SCREEN_BOTTOM) );
} }
void BGAnimationLayer::LoadFromMovie( CString sMoviePath, bool bLoop, bool bRewind ) void BGAnimationLayer::LoadFromMovie( CString sMoviePath, bool bLoop, bool bRewind )
{ {
Init(); Init();
m_iNumSprites = 1; m_Sprites.push_back(new Sprite);
m_Sprites[0].LoadBG( sMoviePath ); m_Sprites.back()->LoadBG( sMoviePath );
m_Sprites[0].StretchTo( RectI(SCREEN_LEFT,SCREEN_TOP,SCREEN_RIGHT,SCREEN_BOTTOM) ); m_Sprites.back()->StretchTo( RectI(SCREEN_LEFT,SCREEN_TOP,SCREEN_RIGHT,SCREEN_BOTTOM) );
m_Sprites[0].GetTexture()->Play(); m_Sprites.back()->GetTexture()->Play();
SDL_Delay( 50 ); // decode a frame so we don't see a black flash at the beginning SDL_Delay( 50 ); // decode a frame so we don't see a black flash at the beginning
m_Sprites[0].GetTexture()->Pause(); m_Sprites.back()->GetTexture()->Pause();
m_bRewindMovie = bRewind; m_bRewindMovie = bRewind;
if( !bLoop ) if( !bLoop )
m_Sprites[0].GetTexture()->SetLooping(false); m_Sprites.back()->GetTexture()->SetLooping(false);
} }
void BGAnimationLayer::LoadFromVisualization( CString sMoviePath ) void BGAnimationLayer::LoadFromVisualization( CString sMoviePath )
{ {
Init(); Init();
m_iNumSprites = 1; m_Sprites.push_back(new Sprite);
m_Sprites[0].LoadBG( sMoviePath ); m_Sprites.back()->LoadBG( sMoviePath );
m_Sprites[0].StretchTo( RectI(SCREEN_LEFT,SCREEN_TOP,SCREEN_RIGHT,SCREEN_BOTTOM) ); m_Sprites.back()->StretchTo( RectI(SCREEN_LEFT,SCREEN_TOP,SCREEN_RIGHT,SCREEN_BOTTOM) );
m_Sprites[0].EnableAdditiveBlend( true ); m_Sprites.back()->EnableAdditiveBlend( true );
} }
@@ -200,9 +213,9 @@ void BGAnimationLayer::LoadFromAniLayerFile( CString sPath )
{ {
case EFFECT_CENTER: case EFFECT_CENTER:
m_Type = TYPE_SPRITE; m_Type = TYPE_SPRITE;
m_iNumSprites = 1; m_Sprites.push_back(new Sprite);
m_Sprites[0].Load( sPath ); m_Sprites.back()->Load( sPath );
m_Sprites[0].SetXY( CENTER_X, CENTER_Y ); m_Sprites.back()->SetXY( CENTER_X, CENTER_Y );
break; break;
case EFFECT_STRETCH_STILL: case EFFECT_STRETCH_STILL:
case EFFECT_STRETCH_SCROLL_LEFT: case EFFECT_STRETCH_SCROLL_LEFT:
@@ -214,12 +227,12 @@ void BGAnimationLayer::LoadFromAniLayerFile( CString sPath )
case EFFECT_STRETCH_TWIST: case EFFECT_STRETCH_TWIST:
{ {
m_Type = TYPE_STRETCH; m_Type = TYPE_STRETCH;
m_iNumSprites = 1; m_Sprites.push_back(new Sprite);
RageTextureID ID(sPath); RageTextureID ID(sPath);
ID.bStretch = true; ID.bStretch = true;
m_Sprites[0].LoadBG( ID ); m_Sprites.back()->LoadBG( ID );
m_Sprites[0].StretchTo( RectI(SCREEN_LEFT,SCREEN_TOP,SCREEN_RIGHT,SCREEN_BOTTOM) ); m_Sprites.back()->StretchTo( RectI(SCREEN_LEFT,SCREEN_TOP,SCREEN_RIGHT,SCREEN_BOTTOM) );
m_Sprites[0].SetCustomTextureRect( RectF(0,0,1,1) ); m_Sprites.back()->SetCustomTextureRect( RectF(0,0,1,1) );
switch( effect ) switch( effect )
{ {
@@ -234,18 +247,18 @@ void BGAnimationLayer::LoadFromAniLayerFile( CString sPath )
case EFFECT_STRETCH_SPIN: case EFFECT_STRETCH_SPIN:
{ {
m_Type = TYPE_STRETCH; m_Type = TYPE_STRETCH;
m_iNumSprites = 1; m_Sprites.push_back(new Sprite);
m_Sprites[0].LoadBG( sPath ); m_Sprites.back()->LoadBG( sPath );
m_Sprites[0].ScaleToCover( RectI(SCREEN_LEFT-200,SCREEN_TOP-200,SCREEN_RIGHT+200,SCREEN_BOTTOM+200) ); m_Sprites.back()->ScaleToCover( RectI(SCREEN_LEFT-200,SCREEN_TOP-200,SCREEN_RIGHT+200,SCREEN_BOTTOM+200) );
m_Sprites[0].SetEffectSpin( RageVector3(0,0,1) ); m_Sprites.back()->SetEffectSpin( RageVector3(0,0,1) );
} }
break; break;
case EFFECT_PARTICLES_SPIRAL_OUT: case EFFECT_PARTICLES_SPIRAL_OUT:
case EFFECT_PARTICLES_SPIRAL_IN: case EFFECT_PARTICLES_SPIRAL_IN:
/* { /* {
m_Type = TYPE_PARTICLES; m_Type = TYPE_PARTICLES;
m_Sprites[0].Load( sPath ); m_Sprites.back()->Load( sPath );
int iSpriteArea = int( m_Sprites[0].GetUnzoomedWidth()*m_Sprites[0].GetUnzoomedHeight() ); int iSpriteArea = int( m_Sprites.back()->GetUnzoomedWidth()*m_Sprites.back()->GetUnzoomedHeight() );
int iMaxArea = SCREEN_WIDTH*SCREEN_HEIGHT; int iMaxArea = SCREEN_WIDTH*SCREEN_HEIGHT;
m_iNumSprites = m_iNumParticles = iMaxArea / iSpriteArea; m_iNumSprites = m_iNumParticles = iMaxArea / iSpriteArea;
m_iNumSprites = m_iNumParticles = min( m_iNumSprites, MAX_SPRITES ); m_iNumSprites = m_iNumParticles = min( m_iNumSprites, MAX_SPRITES );
@@ -264,37 +277,40 @@ void BGAnimationLayer::LoadFromAniLayerFile( CString sPath )
case EFFECT_PARTICLES_BOUNCE: case EFFECT_PARTICLES_BOUNCE:
{ {
m_Type = TYPE_PARTICLES; m_Type = TYPE_PARTICLES;
m_Sprites[0].Load( sPath ); Sprite s;
int iSpriteArea = int( m_Sprites[0].GetUnzoomedWidth()*m_Sprites[0].GetUnzoomedHeight() ); s.Load( sPath );
int iMaxArea = SCREEN_WIDTH*SCREEN_HEIGHT; int iSpriteArea = int( s.GetUnzoomedWidth()*s.GetUnzoomedHeight() );
m_iNumSprites = m_iNumParticles = iMaxArea / iSpriteArea; const int iMaxArea = SCREEN_WIDTH*SCREEN_HEIGHT;
m_iNumSprites = m_iNumParticles = min( m_iNumSprites, unsigned(MAX_SPRITES) ); m_iNumParticles = iMaxArea / iSpriteArea;
for( unsigned i=0; i<m_iNumSprites; i++ ) m_iNumParticles = min( m_iNumParticles, MAX_SPRITES );
for( int i=0; i<m_iNumParticles; i++ )
{ {
m_Sprites[i].Load( sPath ); m_Sprites.push_back(new Sprite);
m_Sprites[i].SetZoom( 0.7f + 0.6f*i/(float)m_iNumSprites ); m_Sprites.back()->Load( sPath );
m_Sprites[i].SetX( randomf( GetGuardRailLeft(&m_Sprites[i]), GetGuardRailRight(&m_Sprites[i]) ) ); m_Sprites.back()->SetZoom( 0.7f + 0.6f*i/(float)m_iNumParticles );
m_Sprites[i].SetY( randomf( GetGuardRailTop(&m_Sprites[i]), GetGuardRailBottom(&m_Sprites[i]) ) ); m_Sprites.back()->SetX( randomf( GetGuardRailLeft(m_Sprites.back()), GetGuardRailRight(m_Sprites.back()) ) );
m_Sprites.back()->SetY( randomf( GetGuardRailTop(m_Sprites.back()), GetGuardRailBottom(m_Sprites.back()) ) );
switch( effect ) switch( effect )
{ {
case EFFECT_PARTICLES_FLOAT_UP: case EFFECT_PARTICLES_FLOAT_UP:
case EFFECT_PARTICLES_SPIRAL_OUT: case EFFECT_PARTICLES_SPIRAL_OUT:
m_vParticleVelocity[i] = RageVector3( 0, -PARTICLE_SPEED*m_Sprites[i].GetZoom(), 0 ); m_vParticleVelocity[i] = RageVector3( 0, -PARTICLE_SPEED*m_Sprites.back()->GetZoom(), 0 );
break; break;
case EFFECT_PARTICLES_FLOAT_DOWN: case EFFECT_PARTICLES_FLOAT_DOWN:
case EFFECT_PARTICLES_SPIRAL_IN: case EFFECT_PARTICLES_SPIRAL_IN:
m_vParticleVelocity[i] = RageVector3( 0, PARTICLE_SPEED*m_Sprites[i].GetZoom(), 0 ); m_vParticleVelocity[i] = RageVector3( 0, PARTICLE_SPEED*m_Sprites.back()->GetZoom(), 0 );
break; break;
case EFFECT_PARTICLES_FLOAT_LEFT: case EFFECT_PARTICLES_FLOAT_LEFT:
m_vParticleVelocity[i] = RageVector3( -PARTICLE_SPEED*m_Sprites[i].GetZoom(), 0, 0 ); m_vParticleVelocity[i] = RageVector3( -PARTICLE_SPEED*m_Sprites.back()->GetZoom(), 0, 0 );
break; break;
case EFFECT_PARTICLES_FLOAT_RIGHT: case EFFECT_PARTICLES_FLOAT_RIGHT:
m_vParticleVelocity[i] = RageVector3( +PARTICLE_SPEED*m_Sprites[i].GetZoom(), 0, 0 ); m_vParticleVelocity[i] = RageVector3( +PARTICLE_SPEED*m_Sprites.back()->GetZoom(), 0, 0 );
break; break;
case EFFECT_PARTICLES_BOUNCE: case EFFECT_PARTICLES_BOUNCE:
m_bParticlesBounce = true; m_bParticlesBounce = true;
m_Sprites[i].SetZoom( 1 ); m_Sprites.back()->SetZoom( 1 );
m_vParticleVelocity[i] = RageVector3( randomf(), randomf(), 0 ); m_vParticleVelocity[i] = RageVector3( randomf(), randomf(), 0 );
RageVec3Normalize( &m_vParticleVelocity[i], &m_vParticleVelocity[i] ); RageVec3Normalize( &m_vParticleVelocity[i], &m_vParticleVelocity[i] );
break; break;
@@ -316,25 +332,25 @@ void BGAnimationLayer::LoadFromAniLayerFile( CString sPath )
m_Type = TYPE_TILES; m_Type = TYPE_TILES;
RageTextureID ID(sPath); RageTextureID ID(sPath);
ID.bStretch = true; ID.bStretch = true;
m_Sprites[0].Load( ID ); Sprite s;
m_iNumTilesWide = 2+int(SCREEN_WIDTH /m_Sprites[0].GetUnzoomedWidth()); s.Load( ID );
m_iNumTilesWide = 2+int(SCREEN_WIDTH /s.GetUnzoomedWidth());
m_iNumTilesWide = min( m_iNumTilesWide, MAX_TILES_WIDE ); m_iNumTilesWide = min( m_iNumTilesWide, MAX_TILES_WIDE );
m_iNumTilesHigh = 2+int(SCREEN_HEIGHT/m_Sprites[0].GetUnzoomedHeight()); m_iNumTilesHigh = 2+int(SCREEN_HEIGHT/s.GetUnzoomedHeight());
m_iNumTilesHigh = min( m_iNumTilesHigh, MAX_TILES_HIGH ); m_iNumTilesHigh = min( m_iNumTilesHigh, MAX_TILES_HIGH );
m_iNumSprites = m_iNumTilesWide * m_iNumTilesHigh; m_fTilesStartX = s.GetUnzoomedWidth() / 2;
m_fTilesStartX = m_Sprites[0].GetUnzoomedWidth() / 2; m_fTilesStartY = s.GetUnzoomedHeight() / 2;
m_fTilesStartY = m_Sprites[0].GetUnzoomedHeight() / 2; m_fTilesSpacingX = s.GetUnzoomedWidth();
m_fTilesSpacingX = m_Sprites[0].GetUnzoomedWidth(); m_fTilesSpacingY = s.GetUnzoomedHeight();
m_fTilesSpacingY = m_Sprites[0].GetUnzoomedHeight();
m_fTilesSpacingX -= 1; // HACK: Fix textures with transparence have gaps m_fTilesSpacingX -= 1; // HACK: Fix textures with transparence have gaps
m_fTilesSpacingY -= 1; // HACK: Fix textures with transparence have gaps m_fTilesSpacingY -= 1; // HACK: Fix textures with transparence have gaps
for( int x=0; x<m_iNumTilesWide; x++ ) for( int x=0; x<m_iNumTilesWide; x++ )
{ {
for( int y=0; y<m_iNumTilesHigh; y++ ) for( int y=0; y<m_iNumTilesHigh; y++ )
{ {
int i = y*m_iNumTilesWide + x; m_Sprites.push_back(new Sprite);
m_Sprites[i].Load( ID ); m_Sprites.back()->Load( ID );
m_Sprites[i].EnableTextureWrapping( true ); // gets rid of some "cracks" m_Sprites.back()->EnableTextureWrapping( true ); // gets rid of some "cracks"
switch( effect ) switch( effect )
{ {
@@ -353,13 +369,13 @@ void BGAnimationLayer::LoadFromAniLayerFile( CString sPath )
m_fTileVelocityY = +PARTICLE_SPEED; m_fTileVelocityY = +PARTICLE_SPEED;
break; break;
case EFFECT_TILE_FLIP_X: case EFFECT_TILE_FLIP_X:
m_Sprites[i].SetEffectSpin( RageVector3(2,0,0) ); m_Sprites.back()->SetEffectSpin( RageVector3(2,0,0) );
break; break;
case EFFECT_TILE_FLIP_Y: case EFFECT_TILE_FLIP_Y:
m_Sprites[i].SetEffectSpin( RageVector3(0,2,0) ); m_Sprites.back()->SetEffectSpin( RageVector3(0,2,0) );
break; break;
case EFFECT_TILE_PULSE: case EFFECT_TILE_PULSE:
m_Sprites[i].SetEffectPulse( 1, 0.3f, 1.f ); m_Sprites.back()->SetEffectPulse( 1, 0.3f, 1.f );
break; break;
default: default:
ASSERT(0); ASSERT(0);
@@ -376,24 +392,24 @@ void BGAnimationLayer::LoadFromAniLayerFile( CString sPath )
sPath.MakeLower(); sPath.MakeLower();
if( sPath.Find("cyclecolor") != -1 ) if( sPath.Find("cyclecolor") != -1 )
for( unsigned i=0; i<m_iNumSprites; i++ ) for( unsigned i=0; i<m_Sprites.size(); i++ )
m_Sprites[i].SetEffectRainbow( 5 ); m_Sprites[i]->SetEffectRainbow( 5 );
if( sPath.Find("cyclealpha") != -1 ) if( sPath.Find("cyclealpha") != -1 )
for( unsigned i=0; i<m_iNumSprites; i++ ) for( unsigned i=0; i<m_Sprites.size(); i++ )
m_Sprites[i].SetEffectDiffuseShift( 2, RageColor(1,1,1,1), RageColor(1,1,1,0) ); m_Sprites[i]->SetEffectDiffuseShift( 2, RageColor(1,1,1,1), RageColor(1,1,1,0) );
if( sPath.Find("startonrandomframe") != -1 ) if( sPath.Find("startonrandomframe") != -1 )
for( unsigned i=0; i<m_iNumSprites; i++ ) for( unsigned i=0; i<m_Sprites.size(); i++ )
m_Sprites[i].SetState( rand()%m_Sprites[i].GetNumStates() ); m_Sprites[i]->SetState( rand()%m_Sprites[i]->GetNumStates() );
if( sPath.Find("dontanimate") != -1 ) if( sPath.Find("dontanimate") != -1 )
for( unsigned i=0; i<m_iNumSprites; i++ ) for( unsigned i=0; i<m_Sprites.size(); i++ )
m_Sprites[i].StopAnimating(); m_Sprites[i]->StopAnimating();
if( sPath.Find("add") != -1 ) if( sPath.Find("add") != -1 )
for( unsigned i=0; i<m_iNumSprites; i++ ) for( unsigned i=0; i<m_Sprites.size(); i++ )
m_Sprites[i].EnableAdditiveBlend( true ); m_Sprites[i]->EnableAdditiveBlend( true );
/* /*
CString sDir, sFName, sExt; CString sDir, sFName, sExt;
@@ -503,28 +519,28 @@ void BGAnimationLayer::LoadFromIni( CString sAniDir, CString sLayer )
switch( m_Type ) switch( m_Type )
{ {
case TYPE_SPRITE: case TYPE_SPRITE:
m_iNumSprites = 1; m_Sprites.push_back(new Sprite);
m_Sprites[0].Load( sPath ); m_Sprites.back()->Load( sPath );
m_Sprites[0].SetXY( CENTER_X, CENTER_Y ); m_Sprites.back()->SetXY( CENTER_X, CENTER_Y );
break; break;
case TYPE_STRETCH: case TYPE_STRETCH:
{ {
m_iNumSprites = 1; m_Sprites.push_back(new Sprite);
RageTextureID ID(sPath); RageTextureID ID(sPath);
ID.bStretch = true; ID.bStretch = true;
m_Sprites[0].LoadBG( ID ); m_Sprites.back()->LoadBG( ID );
m_Sprites[0].StretchTo( RectI(SCREEN_LEFT,SCREEN_TOP,SCREEN_RIGHT,SCREEN_BOTTOM) ); m_Sprites.back()->StretchTo( RectI(SCREEN_LEFT,SCREEN_TOP,SCREEN_RIGHT,SCREEN_BOTTOM) );
m_Sprites[0].SetCustomTextureRect( RectF(0,0,1,1) ); m_Sprites.back()->SetCustomTextureRect( RectF(0,0,1,1) );
} }
break; break;
case TYPE_PARTICLES: case TYPE_PARTICLES:
{ {
m_iNumSprites = m_iNumParticles; for( int i=0; i<m_iNumParticles; i++ )
for( unsigned i=0; i<m_iNumSprites; i++ )
{ {
m_Sprites[i].Load( sPath ); m_Sprites.push_back(new Sprite);
m_Sprites[i].SetXY( randomf(SCREEN_LEFT,SCREEN_RIGHT), randomf(SCREEN_TOP,SCREEN_BOTTOM) ); m_Sprites.back()->Load( sPath );
m_Sprites[i].SetZoom( randomf(m_fZoomMin,m_fZoomMax) ); m_Sprites.back()->SetXY( randomf(SCREEN_LEFT,SCREEN_RIGHT), randomf(SCREEN_TOP,SCREEN_BOTTOM) );
m_Sprites.back()->SetZoom( randomf(m_fZoomMin,m_fZoomMax) );
m_vParticleVelocity[i] = RageVector3( m_vParticleVelocity[i] = RageVector3(
randomf(m_fVelocityXMin,m_fVelocityXMax), randomf(m_fVelocityXMin,m_fVelocityXMax),
randomf(m_fVelocityYMin,m_fVelocityYMax), randomf(m_fVelocityYMin,m_fVelocityYMax),
@@ -539,27 +555,29 @@ void BGAnimationLayer::LoadFromIni( CString sAniDir, CString sLayer )
break; break;
case TYPE_TILES: case TYPE_TILES:
{ {
Sprite s;
RageTextureID ID(sPath); RageTextureID ID(sPath);
ID.bStretch = true; ID.bStretch = true;
m_Sprites[0].Load( ID ); s.Load( ID );
if( m_fTilesSpacingX == -1 ) if( m_fTilesSpacingX == -1 )
{ {
m_fTilesSpacingX = m_Sprites[0].GetUnzoomedWidth(); m_fTilesSpacingX = m_Sprites.back()->GetUnzoomedWidth();
m_fTilesSpacingX -= 1; // HACK: Fix textures with transparence have gaps m_fTilesSpacingX -= 1; // HACK: Fix textures with transparence have gaps
} }
if( m_fTilesSpacingY == -1 ) if( m_fTilesSpacingY == -1 )
{ {
m_fTilesSpacingY = m_Sprites[0].GetUnzoomedHeight(); m_fTilesSpacingY = m_Sprites.back()->GetUnzoomedHeight();
m_fTilesSpacingY -= 1; // HACK: Fix textures with transparence have gaps m_fTilesSpacingY -= 1; // HACK: Fix textures with transparence have gaps
} }
m_iNumTilesWide = 2+(int)(SCREEN_WIDTH /m_fTilesSpacingX); m_iNumTilesWide = 2+(int)(SCREEN_WIDTH /m_fTilesSpacingX);
m_iNumTilesHigh = 2+(int)(SCREEN_HEIGHT/m_fTilesSpacingY); m_iNumTilesHigh = 2+(int)(SCREEN_HEIGHT/m_fTilesSpacingY);
m_iNumSprites = m_iNumTilesWide * m_iNumTilesHigh; unsigned NumSprites = m_iNumTilesWide * m_iNumTilesHigh;
for( unsigned i=0; i<m_iNumSprites; i++ ) for( unsigned i=0; i<NumSprites; i++ )
{ {
m_Sprites[i].Load( ID ); m_Sprites.push_back(new Sprite);
m_Sprites[i].EnableTextureWrapping( true ); // gets rid of some "cracks" m_Sprites.back()->Load( ID );
m_Sprites[i].SetZoom( randomf(m_fZoomMin,m_fZoomMax) ); m_Sprites.back()->EnableTextureWrapping( true ); // gets rid of some "cracks"
m_Sprites.back()->SetZoom( randomf(m_fZoomMin,m_fZoomMax) );
} }
} }
break; break;
@@ -571,14 +589,14 @@ void BGAnimationLayer::LoadFromIni( CString sAniDir, CString sLayer )
ini.GetValueB( sLayer, "StartOnRandomFrame", bStartOnRandomFrame ); ini.GetValueB( sLayer, "StartOnRandomFrame", bStartOnRandomFrame );
if( bStartOnRandomFrame ) if( bStartOnRandomFrame )
{ {
for( unsigned i=0; i<m_iNumSprites; i++ ) for( unsigned i=0; i<m_Sprites.size(); i++ )
m_Sprites[i].SetState( rand()%m_Sprites[i].GetNumStates() ); m_Sprites[i]->SetState( rand()%m_Sprites[i]->GetNumStates() );
} }
if( m_sCommand != "" ) if( m_sCommand != "" )
{ {
for( unsigned i=0; i<m_iNumSprites; i++ ) for( unsigned i=0; i<m_Sprites.size(); i++ )
m_Sprites[i].Command( m_sCommand ); m_Sprites[i]->Command( m_sCommand );
} }
} }
@@ -587,8 +605,8 @@ void BGAnimationLayer::Update( float fDeltaTime )
const float fSongBeat = GAMESTATE->m_fSongBeat; const float fSongBeat = GAMESTATE->m_fSongBeat;
unsigned i; unsigned i;
for( i=0; i<m_iNumSprites; i++ ) for( i=0; i<m_Sprites.size(); i++ )
m_Sprites[i].Update( fDeltaTime ); m_Sprites[i]->Update( fDeltaTime );
switch( m_Type ) switch( m_Type )
@@ -596,17 +614,18 @@ void BGAnimationLayer::Update( float fDeltaTime )
case TYPE_SPRITE: case TYPE_SPRITE:
break; break;
case TYPE_STRETCH: case TYPE_STRETCH:
for( i=0; i<m_Sprites.size(); i++ )
{ {
float fTexCoords[8]; float fTexCoords[8];
m_Sprites[0].GetCustomTextureCoords( fTexCoords ); m_Sprites[i]->GetCustomTextureCoords( fTexCoords );
for( i=0; i<8; i+=2 ) for( int j=0; j<8; j+=2 )
{ {
fTexCoords[i ] += fDeltaTime*m_fStretchTexCoordVelocityX; fTexCoords[j ] += fDeltaTime*m_fStretchTexCoordVelocityX;
fTexCoords[i+1] += fDeltaTime*m_fStretchTexCoordVelocityY; fTexCoords[j+1] += fDeltaTime*m_fStretchTexCoordVelocityY;
} }
m_Sprites[0].SetCustomTextureCoords( fTexCoords ); m_Sprites[i]->SetCustomTextureCoords( fTexCoords );
} }
break; break;
/* case EFFECT_PARTICLES_SPIRAL_OUT: /* case EFFECT_PARTICLES_SPIRAL_OUT:
@@ -643,44 +662,44 @@ void BGAnimationLayer::Update( float fDeltaTime )
break; break;
*/ */
case TYPE_PARTICLES: case TYPE_PARTICLES:
for( i=0; i<m_iNumSprites; i++ ) for( i=0; i<m_Sprites.size(); i++ )
{ {
m_Sprites[i].SetX( m_Sprites[i].GetX() + fDeltaTime*m_vParticleVelocity[i].x ); m_Sprites[i]->SetX( m_Sprites[i]->GetX() + fDeltaTime*m_vParticleVelocity[i].x );
m_Sprites[i].SetY( m_Sprites[i].GetY() + fDeltaTime*m_vParticleVelocity[i].y ); m_Sprites[i]->SetY( m_Sprites[i]->GetY() + fDeltaTime*m_vParticleVelocity[i].y );
m_Sprites[i].SetZ( m_Sprites[i].GetZ() + fDeltaTime*m_vParticleVelocity[i].z ); m_Sprites[i]->SetZ( m_Sprites[i]->GetZ() + fDeltaTime*m_vParticleVelocity[i].z );
if( m_bParticlesBounce ) if( m_bParticlesBounce )
{ {
if( HitGuardRailLeft(&m_Sprites[i]) ) if( HitGuardRailLeft(m_Sprites[i]) )
{ {
m_vParticleVelocity[i].x *= -1; m_vParticleVelocity[i].x *= -1;
m_Sprites[i].SetX( GetGuardRailLeft(&m_Sprites[i]) ); m_Sprites[i]->SetX( GetGuardRailLeft(m_Sprites[i]) );
} }
if( HitGuardRailRight(&m_Sprites[i]) ) if( HitGuardRailRight(m_Sprites[i]) )
{ {
m_vParticleVelocity[i].x *= -1; m_vParticleVelocity[i].x *= -1;
m_Sprites[i].SetX( GetGuardRailRight(&m_Sprites[i]) ); m_Sprites[i]->SetX( GetGuardRailRight(m_Sprites[i]) );
} }
if( HitGuardRailTop(&m_Sprites[i]) ) if( HitGuardRailTop(m_Sprites[i]) )
{ {
m_vParticleVelocity[i].y *= -1; m_vParticleVelocity[i].y *= -1;
m_Sprites[i].SetY( GetGuardRailTop(&m_Sprites[i]) ); m_Sprites[i]->SetY( GetGuardRailTop(m_Sprites[i]) );
} }
if( HitGuardRailBottom(&m_Sprites[i]) ) if( HitGuardRailBottom(m_Sprites[i]) )
{ {
m_vParticleVelocity[i].y *= -1; m_vParticleVelocity[i].y *= -1;
m_Sprites[i].SetY( GetGuardRailBottom(&m_Sprites[i]) ); m_Sprites[i]->SetY( GetGuardRailBottom(m_Sprites[i]) );
} }
} }
else // !m_bParticlesBounce else // !m_bParticlesBounce
{ {
if( m_vParticleVelocity[i].x<0 && IsOffScreenLeft(&m_Sprites[i]) ) if( m_vParticleVelocity[i].x<0 && IsOffScreenLeft(m_Sprites[i]) )
m_Sprites[i].SetX( GetOffScreenRight(&m_Sprites[i]) ); m_Sprites[i]->SetX( GetOffScreenRight(m_Sprites[i]) );
if( m_vParticleVelocity[i].x>0 && IsOffScreenRight(&m_Sprites[i]) ) if( m_vParticleVelocity[i].x>0 && IsOffScreenRight(m_Sprites[i]) )
m_Sprites[i].SetX( GetOffScreenLeft(&m_Sprites[i]) ); m_Sprites[i]->SetX( GetOffScreenLeft(m_Sprites[i]) );
if( m_vParticleVelocity[i].y<0 && IsOffScreenTop(&m_Sprites[i]) ) if( m_vParticleVelocity[i].y<0 && IsOffScreenTop(m_Sprites[i]) )
m_Sprites[i].SetY( GetOffScreenBottom(&m_Sprites[i]) ); m_Sprites[i]->SetY( GetOffScreenBottom(m_Sprites[i]) );
if( m_vParticleVelocity[i].y>0 && IsOffScreenBottom(&m_Sprites[i]) ) if( m_vParticleVelocity[i].y>0 && IsOffScreenBottom(m_Sprites[i]) )
m_Sprites[i].SetY( GetOffScreenTop(&m_Sprites[i]) ); m_Sprites[i]->SetY( GetOffScreenTop(m_Sprites[i]) );
} }
} }
break; break;
@@ -690,7 +709,7 @@ void BGAnimationLayer::Update( float fDeltaTime )
float fTotalWidth = m_iNumTilesWide * m_fTilesSpacingX; float fTotalWidth = m_iNumTilesWide * m_fTilesSpacingX;
float fTotalHeight = m_iNumTilesHigh * m_fTilesSpacingY; float fTotalHeight = m_iNumTilesHigh * m_fTilesSpacingY;
ASSERT( int(m_iNumSprites) == m_iNumTilesWide * m_iNumTilesHigh ); ASSERT( int(m_Sprites.size()) == m_iNumTilesWide * m_iNumTilesHigh );
for( int x=0; x<m_iNumTilesWide; x++ ) for( int x=0; x<m_iNumTilesWide; x++ )
{ {
@@ -713,8 +732,8 @@ void BGAnimationLayer::Update( float fDeltaTime )
fX -= m_fTilesSpacingX/2; fX -= m_fTilesSpacingX/2;
fY -= m_fTilesSpacingY/2; fY -= m_fTilesSpacingY/2;
m_Sprites[i].SetX( fX ); m_Sprites[i]->SetX( fX );
m_Sprites[i].SetY( fY ); m_Sprites[i]->SetY( fY );
} }
} }
/* /*
@@ -735,10 +754,9 @@ void BGAnimationLayer::Update( float fDeltaTime )
} }
break; break;
case EFFECT_TILE_PULSE: case EFFECT_TILE_PULSE:
for( i=0; i<m_iNumSprites; i++ ) for( i=0; i<m_Sprites.size(); i++ )
{ m_Sprites[i]->SetZoom( sinf( fSongBeat*PI/2 ) );
m_Sprites[i].SetZoom( sinf( fSongBeat*PI/2 ) );
}
break; break;
default: default:
ASSERT(0); ASSERT(0);
@@ -848,28 +866,28 @@ void BGAnimationLayer::Update( float fDeltaTime )
void BGAnimationLayer::Draw() void BGAnimationLayer::Draw()
{ {
for( unsigned i=0; i<m_iNumSprites; i++ ) for( unsigned i=0; i<m_Sprites.size(); i++ )
m_Sprites[i].Draw(); m_Sprites[i]->Draw();
} }
void BGAnimationLayer::SetDiffuse( RageColor c ) void BGAnimationLayer::SetDiffuse( RageColor c )
{ {
for(unsigned i=0; i<m_iNumSprites; i++) for(unsigned i=0; i<m_Sprites.size(); i++)
m_Sprites[i].SetDiffuse(c); m_Sprites[i]->SetDiffuse(c);
} }
void BGAnimationLayer::GainingFocus() void BGAnimationLayer::GainingFocus()
{ {
if( m_bRewindMovie ) if( m_bRewindMovie )
m_Sprites[0].GetTexture()->SetPosition( 0 ); m_Sprites[0]->GetTexture()->SetPosition( 0 );
// if movie texture, pause and play movie so we don't waste CPU cycles decoding frames that won't be shown // if movie texture, pause and play movie so we don't waste CPU cycles decoding frames that won't be shown
m_Sprites[0].GetTexture()->Play(); m_Sprites[0]->GetTexture()->Play();
for( unsigned i=0; i<m_iNumSprites; i++ ) for( unsigned i=0; i<m_Sprites.size(); i++ )
m_Sprites[i].Command( m_sCommand ); m_Sprites[i]->Command( m_sCommand );
} }
void BGAnimationLayer::LosingFocus() void BGAnimationLayer::LosingFocus()
{ {
m_Sprites[0].GetTexture()->Pause(); m_Sprites[0]->GetTexture()->Pause();
} }
+5 -3
View File
@@ -18,13 +18,16 @@
#define MAX_TILES_WIDE (SCREEN_WIDTH/32+2) #define MAX_TILES_WIDE (SCREEN_WIDTH/32+2)
#define MAX_TILES_HIGH (SCREEN_HEIGHT/32+2) #define MAX_TILES_HIGH (SCREEN_HEIGHT/32+2)
#define MAX_SPRITES (MAX_TILES_WIDE*MAX_TILES_HIGH) #define MAX_SPRITES 16
// (MAX_TILES_WIDE*MAX_TILES_HIGH)
class BGAnimationLayer class BGAnimationLayer
{ {
public: public:
BGAnimationLayer(); BGAnimationLayer();
~BGAnimationLayer();
void Init(); void Init();
void Unload();
void LoadFromStaticGraphic( CString sPath ); void LoadFromStaticGraphic( CString sPath );
void LoadFromAniLayerFile( CString sPath ); void LoadFromAniLayerFile( CString sPath );
@@ -41,9 +44,8 @@ public:
void LosingFocus(); void LosingFocus();
protected: protected:
Sprite m_Sprites[MAX_SPRITES]; vector<Sprite *> m_Sprites;
RageVector3 m_vParticleVelocity[MAX_SPRITES]; RageVector3 m_vParticleVelocity[MAX_SPRITES];
unsigned m_iNumSprites;
enum Effect { enum Effect {
EFFECT_CENTER, EFFECT_CENTER,