From daf9d373a30c3e3bfba20815fcba5efa1e9a7b76 Mon Sep 17 00:00:00 2001 From: Glenn Maynard Date: Mon, 17 Mar 2003 01:15:42 +0000 Subject: [PATCH] Dynamically allocate Sprites in backgrounds, instead of always allocating and initializing hundreds of them per background. --- stepmania/src/BGAnimationLayer.cpp | 282 +++++++++++++++-------------- stepmania/src/BGAnimationLayer.h | 8 +- 2 files changed, 155 insertions(+), 135 deletions(-) diff --git a/stepmania/src/BGAnimationLayer.cpp b/stepmania/src/BGAnimationLayer.cpp index 14c83c5bec..fab9845feb 100644 --- a/stepmania/src/BGAnimationLayer.cpp +++ b/stepmania/src/BGAnimationLayer.cpp @@ -58,8 +58,21 @@ BGAnimationLayer::BGAnimationLayer() Init(); } +BGAnimationLayer::~BGAnimationLayer() +{ + Unload(); +} + +void BGAnimationLayer::Unload() +{ + for( unsigned i=0; iLoadBG( ID ); + m_Sprites.back()->StretchTo( RectI(SCREEN_LEFT,SCREEN_TOP,SCREEN_RIGHT,SCREEN_BOTTOM) ); } void BGAnimationLayer::LoadFromMovie( CString sMoviePath, bool bLoop, bool bRewind ) { Init(); - m_iNumSprites = 1; - m_Sprites[0].LoadBG( sMoviePath ); - m_Sprites[0].StretchTo( RectI(SCREEN_LEFT,SCREEN_TOP,SCREEN_RIGHT,SCREEN_BOTTOM) ); - m_Sprites[0].GetTexture()->Play(); + m_Sprites.push_back(new Sprite); + m_Sprites.back()->LoadBG( sMoviePath ); + m_Sprites.back()->StretchTo( RectI(SCREEN_LEFT,SCREEN_TOP,SCREEN_RIGHT,SCREEN_BOTTOM) ); + m_Sprites.back()->GetTexture()->Play(); 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; if( !bLoop ) - m_Sprites[0].GetTexture()->SetLooping(false); + m_Sprites.back()->GetTexture()->SetLooping(false); } void BGAnimationLayer::LoadFromVisualization( CString sMoviePath ) { Init(); - m_iNumSprites = 1; - m_Sprites[0].LoadBG( sMoviePath ); - m_Sprites[0].StretchTo( RectI(SCREEN_LEFT,SCREEN_TOP,SCREEN_RIGHT,SCREEN_BOTTOM) ); - m_Sprites[0].EnableAdditiveBlend( true ); + m_Sprites.push_back(new Sprite); + m_Sprites.back()->LoadBG( sMoviePath ); + m_Sprites.back()->StretchTo( RectI(SCREEN_LEFT,SCREEN_TOP,SCREEN_RIGHT,SCREEN_BOTTOM) ); + m_Sprites.back()->EnableAdditiveBlend( true ); } @@ -200,9 +213,9 @@ void BGAnimationLayer::LoadFromAniLayerFile( CString sPath ) { case EFFECT_CENTER: m_Type = TYPE_SPRITE; - m_iNumSprites = 1; - m_Sprites[0].Load( sPath ); - m_Sprites[0].SetXY( CENTER_X, CENTER_Y ); + m_Sprites.push_back(new Sprite); + m_Sprites.back()->Load( sPath ); + m_Sprites.back()->SetXY( CENTER_X, CENTER_Y ); break; case EFFECT_STRETCH_STILL: case EFFECT_STRETCH_SCROLL_LEFT: @@ -214,12 +227,12 @@ void BGAnimationLayer::LoadFromAniLayerFile( CString sPath ) case EFFECT_STRETCH_TWIST: { m_Type = TYPE_STRETCH; - m_iNumSprites = 1; + m_Sprites.push_back(new Sprite); RageTextureID ID(sPath); ID.bStretch = true; - m_Sprites[0].LoadBG( ID ); - m_Sprites[0].StretchTo( RectI(SCREEN_LEFT,SCREEN_TOP,SCREEN_RIGHT,SCREEN_BOTTOM) ); - m_Sprites[0].SetCustomTextureRect( RectF(0,0,1,1) ); + m_Sprites.back()->LoadBG( ID ); + m_Sprites.back()->StretchTo( RectI(SCREEN_LEFT,SCREEN_TOP,SCREEN_RIGHT,SCREEN_BOTTOM) ); + m_Sprites.back()->SetCustomTextureRect( RectF(0,0,1,1) ); switch( effect ) { @@ -234,18 +247,18 @@ void BGAnimationLayer::LoadFromAniLayerFile( CString sPath ) case EFFECT_STRETCH_SPIN: { m_Type = TYPE_STRETCH; - m_iNumSprites = 1; - m_Sprites[0].LoadBG( sPath ); - m_Sprites[0].ScaleToCover( RectI(SCREEN_LEFT-200,SCREEN_TOP-200,SCREEN_RIGHT+200,SCREEN_BOTTOM+200) ); - m_Sprites[0].SetEffectSpin( RageVector3(0,0,1) ); + m_Sprites.push_back(new Sprite); + m_Sprites.back()->LoadBG( sPath ); + m_Sprites.back()->ScaleToCover( RectI(SCREEN_LEFT-200,SCREEN_TOP-200,SCREEN_RIGHT+200,SCREEN_BOTTOM+200) ); + m_Sprites.back()->SetEffectSpin( RageVector3(0,0,1) ); } break; case EFFECT_PARTICLES_SPIRAL_OUT: case EFFECT_PARTICLES_SPIRAL_IN: /* { m_Type = TYPE_PARTICLES; - m_Sprites[0].Load( sPath ); - int iSpriteArea = int( m_Sprites[0].GetUnzoomedWidth()*m_Sprites[0].GetUnzoomedHeight() ); + m_Sprites.back()->Load( sPath ); + int iSpriteArea = int( m_Sprites.back()->GetUnzoomedWidth()*m_Sprites.back()->GetUnzoomedHeight() ); int iMaxArea = SCREEN_WIDTH*SCREEN_HEIGHT; m_iNumSprites = m_iNumParticles = iMaxArea / iSpriteArea; m_iNumSprites = m_iNumParticles = min( m_iNumSprites, MAX_SPRITES ); @@ -264,37 +277,40 @@ void BGAnimationLayer::LoadFromAniLayerFile( CString sPath ) case EFFECT_PARTICLES_BOUNCE: { m_Type = TYPE_PARTICLES; - m_Sprites[0].Load( sPath ); - int iSpriteArea = int( m_Sprites[0].GetUnzoomedWidth()*m_Sprites[0].GetUnzoomedHeight() ); - int iMaxArea = SCREEN_WIDTH*SCREEN_HEIGHT; - m_iNumSprites = m_iNumParticles = iMaxArea / iSpriteArea; - m_iNumSprites = m_iNumParticles = min( m_iNumSprites, unsigned(MAX_SPRITES) ); - for( unsigned i=0; iLoad( sPath ); + m_Sprites.back()->SetZoom( 0.7f + 0.6f*i/(float)m_iNumParticles ); + 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 ) { case EFFECT_PARTICLES_FLOAT_UP: 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; case EFFECT_PARTICLES_FLOAT_DOWN: 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; 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; 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; case EFFECT_PARTICLES_BOUNCE: m_bParticlesBounce = true; - m_Sprites[i].SetZoom( 1 ); + m_Sprites.back()->SetZoom( 1 ); m_vParticleVelocity[i] = RageVector3( randomf(), randomf(), 0 ); RageVec3Normalize( &m_vParticleVelocity[i], &m_vParticleVelocity[i] ); break; @@ -316,25 +332,25 @@ void BGAnimationLayer::LoadFromAniLayerFile( CString sPath ) m_Type = TYPE_TILES; RageTextureID ID(sPath); ID.bStretch = true; - m_Sprites[0].Load( ID ); - m_iNumTilesWide = 2+int(SCREEN_WIDTH /m_Sprites[0].GetUnzoomedWidth()); + Sprite s; + s.Load( ID ); + m_iNumTilesWide = 2+int(SCREEN_WIDTH /s.GetUnzoomedWidth()); 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_iNumSprites = m_iNumTilesWide * m_iNumTilesHigh; - m_fTilesStartX = m_Sprites[0].GetUnzoomedWidth() / 2; - m_fTilesStartY = m_Sprites[0].GetUnzoomedHeight() / 2; - m_fTilesSpacingX = m_Sprites[0].GetUnzoomedWidth(); - m_fTilesSpacingY = m_Sprites[0].GetUnzoomedHeight(); + m_fTilesStartX = s.GetUnzoomedWidth() / 2; + m_fTilesStartY = s.GetUnzoomedHeight() / 2; + m_fTilesSpacingX = s.GetUnzoomedWidth(); + m_fTilesSpacingY = s.GetUnzoomedHeight(); m_fTilesSpacingX -= 1; // HACK: Fix textures with transparence have gaps m_fTilesSpacingY -= 1; // HACK: Fix textures with transparence have gaps for( int x=0; xLoad( ID ); + m_Sprites.back()->EnableTextureWrapping( true ); // gets rid of some "cracks" switch( effect ) { @@ -353,13 +369,13 @@ void BGAnimationLayer::LoadFromAniLayerFile( CString sPath ) m_fTileVelocityY = +PARTICLE_SPEED; break; case EFFECT_TILE_FLIP_X: - m_Sprites[i].SetEffectSpin( RageVector3(2,0,0) ); + m_Sprites.back()->SetEffectSpin( RageVector3(2,0,0) ); break; case EFFECT_TILE_FLIP_Y: - m_Sprites[i].SetEffectSpin( RageVector3(0,2,0) ); + m_Sprites.back()->SetEffectSpin( RageVector3(0,2,0) ); break; case EFFECT_TILE_PULSE: - m_Sprites[i].SetEffectPulse( 1, 0.3f, 1.f ); + m_Sprites.back()->SetEffectPulse( 1, 0.3f, 1.f ); break; default: ASSERT(0); @@ -376,24 +392,24 @@ void BGAnimationLayer::LoadFromAniLayerFile( CString sPath ) sPath.MakeLower(); if( sPath.Find("cyclecolor") != -1 ) - for( unsigned i=0; iSetEffectRainbow( 5 ); if( sPath.Find("cyclealpha") != -1 ) - for( unsigned i=0; iSetEffectDiffuseShift( 2, RageColor(1,1,1,1), RageColor(1,1,1,0) ); if( sPath.Find("startonrandomframe") != -1 ) - for( unsigned i=0; iSetState( rand()%m_Sprites[i]->GetNumStates() ); if( sPath.Find("dontanimate") != -1 ) - for( unsigned i=0; iStopAnimating(); if( sPath.Find("add") != -1 ) - for( unsigned i=0; iEnableAdditiveBlend( true ); /* CString sDir, sFName, sExt; @@ -503,28 +519,28 @@ void BGAnimationLayer::LoadFromIni( CString sAniDir, CString sLayer ) switch( m_Type ) { case TYPE_SPRITE: - m_iNumSprites = 1; - m_Sprites[0].Load( sPath ); - m_Sprites[0].SetXY( CENTER_X, CENTER_Y ); + m_Sprites.push_back(new Sprite); + m_Sprites.back()->Load( sPath ); + m_Sprites.back()->SetXY( CENTER_X, CENTER_Y ); break; case TYPE_STRETCH: { - m_iNumSprites = 1; + m_Sprites.push_back(new Sprite); RageTextureID ID(sPath); ID.bStretch = true; - m_Sprites[0].LoadBG( ID ); - m_Sprites[0].StretchTo( RectI(SCREEN_LEFT,SCREEN_TOP,SCREEN_RIGHT,SCREEN_BOTTOM) ); - m_Sprites[0].SetCustomTextureRect( RectF(0,0,1,1) ); + m_Sprites.back()->LoadBG( ID ); + m_Sprites.back()->StretchTo( RectI(SCREEN_LEFT,SCREEN_TOP,SCREEN_RIGHT,SCREEN_BOTTOM) ); + m_Sprites.back()->SetCustomTextureRect( RectF(0,0,1,1) ); } break; case TYPE_PARTICLES: { - m_iNumSprites = m_iNumParticles; - for( unsigned i=0; iLoad( sPath ); + 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( randomf(m_fVelocityXMin,m_fVelocityXMax), randomf(m_fVelocityYMin,m_fVelocityYMax), @@ -539,27 +555,29 @@ void BGAnimationLayer::LoadFromIni( CString sAniDir, CString sLayer ) break; case TYPE_TILES: { + Sprite s; RageTextureID ID(sPath); ID.bStretch = true; - m_Sprites[0].Load( ID ); + s.Load( ID ); 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 } 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_iNumTilesWide = 2+(int)(SCREEN_WIDTH /m_fTilesSpacingX); m_iNumTilesHigh = 2+(int)(SCREEN_HEIGHT/m_fTilesSpacingY); - m_iNumSprites = m_iNumTilesWide * m_iNumTilesHigh; - for( unsigned i=0; iLoad( ID ); + m_Sprites.back()->EnableTextureWrapping( true ); // gets rid of some "cracks" + m_Sprites.back()->SetZoom( randomf(m_fZoomMin,m_fZoomMax) ); } } break; @@ -571,14 +589,14 @@ void BGAnimationLayer::LoadFromIni( CString sAniDir, CString sLayer ) ini.GetValueB( sLayer, "StartOnRandomFrame", bStartOnRandomFrame ); if( bStartOnRandomFrame ) { - for( unsigned i=0; iSetState( rand()%m_Sprites[i]->GetNumStates() ); } if( m_sCommand != "" ) { - for( unsigned i=0; iCommand( m_sCommand ); } } @@ -587,8 +605,8 @@ void BGAnimationLayer::Update( float fDeltaTime ) const float fSongBeat = GAMESTATE->m_fSongBeat; unsigned i; - for( i=0; iUpdate( fDeltaTime ); switch( m_Type ) @@ -596,17 +614,18 @@ void BGAnimationLayer::Update( float fDeltaTime ) case TYPE_SPRITE: break; case TYPE_STRETCH: + for( i=0; iGetCustomTextureCoords( fTexCoords ); - for( i=0; i<8; i+=2 ) + for( int j=0; j<8; j+=2 ) { - fTexCoords[i ] += fDeltaTime*m_fStretchTexCoordVelocityX; - fTexCoords[i+1] += fDeltaTime*m_fStretchTexCoordVelocityY; + fTexCoords[j ] += fDeltaTime*m_fStretchTexCoordVelocityX; + fTexCoords[j+1] += fDeltaTime*m_fStretchTexCoordVelocityY; } - m_Sprites[0].SetCustomTextureCoords( fTexCoords ); + m_Sprites[i]->SetCustomTextureCoords( fTexCoords ); } break; /* case EFFECT_PARTICLES_SPIRAL_OUT: @@ -643,44 +662,44 @@ void BGAnimationLayer::Update( float fDeltaTime ) break; */ case TYPE_PARTICLES: - for( i=0; iSetX( 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]->SetZ( m_Sprites[i]->GetZ() + fDeltaTime*m_vParticleVelocity[i].z ); if( m_bParticlesBounce ) { - if( HitGuardRailLeft(&m_Sprites[i]) ) + if( HitGuardRailLeft(m_Sprites[i]) ) { 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_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_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_Sprites[i].SetY( GetGuardRailBottom(&m_Sprites[i]) ); + m_Sprites[i]->SetY( GetGuardRailBottom(m_Sprites[i]) ); } } else // !m_bParticlesBounce { - if( m_vParticleVelocity[i].x<0 && IsOffScreenLeft(&m_Sprites[i]) ) - m_Sprites[i].SetX( GetOffScreenRight(&m_Sprites[i]) ); - if( m_vParticleVelocity[i].x>0 && IsOffScreenRight(&m_Sprites[i]) ) - m_Sprites[i].SetX( GetOffScreenLeft(&m_Sprites[i]) ); - if( m_vParticleVelocity[i].y<0 && IsOffScreenTop(&m_Sprites[i]) ) - m_Sprites[i].SetY( GetOffScreenBottom(&m_Sprites[i]) ); - if( m_vParticleVelocity[i].y>0 && IsOffScreenBottom(&m_Sprites[i]) ) - m_Sprites[i].SetY( GetOffScreenTop(&m_Sprites[i]) ); + if( m_vParticleVelocity[i].x<0 && IsOffScreenLeft(m_Sprites[i]) ) + m_Sprites[i]->SetX( GetOffScreenRight(m_Sprites[i]) ); + if( m_vParticleVelocity[i].x>0 && IsOffScreenRight(m_Sprites[i]) ) + m_Sprites[i]->SetX( GetOffScreenLeft(m_Sprites[i]) ); + if( m_vParticleVelocity[i].y<0 && IsOffScreenTop(m_Sprites[i]) ) + m_Sprites[i]->SetY( GetOffScreenBottom(m_Sprites[i]) ); + if( m_vParticleVelocity[i].y>0 && IsOffScreenBottom(m_Sprites[i]) ) + m_Sprites[i]->SetY( GetOffScreenTop(m_Sprites[i]) ); } } break; @@ -690,7 +709,7 @@ void BGAnimationLayer::Update( float fDeltaTime ) float fTotalWidth = m_iNumTilesWide * m_fTilesSpacingX; 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; xSetX( fX ); + m_Sprites[i]->SetY( fY ); } } /* @@ -735,10 +754,9 @@ void BGAnimationLayer::Update( float fDeltaTime ) } break; case EFFECT_TILE_PULSE: - for( i=0; iSetZoom( sinf( fSongBeat*PI/2 ) ); + break; default: ASSERT(0); @@ -848,28 +866,28 @@ void BGAnimationLayer::Update( float fDeltaTime ) void BGAnimationLayer::Draw() { - for( unsigned i=0; iDraw(); } void BGAnimationLayer::SetDiffuse( RageColor c ) { - for(unsigned i=0; iSetDiffuse(c); } void BGAnimationLayer::GainingFocus() { 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 - m_Sprites[0].GetTexture()->Play(); + m_Sprites[0]->GetTexture()->Play(); - for( unsigned i=0; iCommand( m_sCommand ); } void BGAnimationLayer::LosingFocus() { - m_Sprites[0].GetTexture()->Pause(); + m_Sprites[0]->GetTexture()->Pause(); } diff --git a/stepmania/src/BGAnimationLayer.h b/stepmania/src/BGAnimationLayer.h index 453a9691d8..9a52927e4e 100644 --- a/stepmania/src/BGAnimationLayer.h +++ b/stepmania/src/BGAnimationLayer.h @@ -18,13 +18,16 @@ #define MAX_TILES_WIDE (SCREEN_WIDTH/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 { public: BGAnimationLayer(); + ~BGAnimationLayer(); void Init(); + void Unload(); void LoadFromStaticGraphic( CString sPath ); void LoadFromAniLayerFile( CString sPath ); @@ -41,9 +44,8 @@ public: void LosingFocus(); protected: - Sprite m_Sprites[MAX_SPRITES]; + vector m_Sprites; RageVector3 m_vParticleVelocity[MAX_SPRITES]; - unsigned m_iNumSprites; enum Effect { EFFECT_CENTER,