Add ActorFrame::DeleteChildrenWhenDone, to call DeleteAllChildren automatically.

Move movie GainFocus/LoseFocus handling to Sprite.
Visualizations are part of Background, not BGAnimation; move them there.  Remove BGAnimation::LoadFromVisualization and BGAnimationLayer::LoadFromVisualization.
This commit is contained in:
Glenn Maynard
2005-01-15 20:32:35 +00:00
parent f4a51bef4d
commit 66d39dd65c
10 changed files with 93 additions and 76 deletions
+7
View File
@@ -6,6 +6,13 @@
ActorFrame::ActorFrame() ActorFrame::ActorFrame()
{ {
m_bPropagateCommands = false; m_bPropagateCommands = false;
m_bDeleteChildren = false;
}
ActorFrame::~ActorFrame()
{
if( m_bDeleteChildren )
DeleteAllChildren();
} }
void ActorFrame::AddChild( Actor* pActor ) void ActorFrame::AddChild( Actor* pActor )
+3 -2
View File
@@ -9,14 +9,14 @@ class ActorFrame : public Actor
{ {
public: public:
ActorFrame(); ActorFrame();
virtual ~ActorFrame();
virtual void AddChild( Actor* pActor ); virtual void AddChild( Actor* pActor );
virtual void RemoveChild( Actor* pActor ); virtual void RemoveChild( Actor* pActor );
virtual void MoveToTail( Actor* pActor ); virtual void MoveToTail( Actor* pActor );
virtual void MoveToHead( Actor* pActor ); virtual void MoveToHead( Actor* pActor );
virtual void SortByDrawOrder(); virtual void SortByDrawOrder();
virtual ~ActorFrame() { } void DeleteChildrenWhenDone( bool bDelete=true ) { m_bDeleteChildren = bDelete; }
void DeleteAllChildren(); void DeleteAllChildren();
virtual void RunCommandOnChildren( const Commands &cmds ); /* but not on self */ virtual void RunCommandOnChildren( const Commands &cmds ); /* but not on self */
@@ -44,6 +44,7 @@ public:
protected: protected:
vector<Actor*> m_SubActors; vector<Actor*> m_SubActors;
bool m_bPropagateCommands; bool m_bPropagateCommands;
bool m_bDeleteChildren;
}; };
#endif #endif
-17
View File
@@ -187,23 +187,6 @@ void BGAnimation::LoadFromMovie( const CString &sMoviePath )
AddChild( pLayer ); AddChild( pLayer );
} }
void BGAnimation::LoadFromVisualization( const CString &sVisPath )
{
Unload();
BGAnimationLayer* pLayer;
const Song* pSong = GAMESTATE->m_pCurSong;
CString sSongBGPath = pSong && pSong->HasBackground() ? pSong->GetBackgroundPath() : THEME->GetPathToG("Common fallback background");
pLayer = new BGAnimationLayer( m_bGeneric );
pLayer->LoadFromStaticGraphic( sSongBGPath );
AddChild( pLayer );
pLayer = new BGAnimationLayer( m_bGeneric );
pLayer->LoadFromVisualization( sVisPath );
AddChild( pLayer );
}
void BGAnimation::LoadFromNode( const CString &sDir, const XNode& node ) void BGAnimation::LoadFromNode( const CString &sDir, const XNode& node )
{ {
DEBUG_ASSERT( node.m_sName == "BGAnimation" ); DEBUG_ASSERT( node.m_sName == "BGAnimation" );
-1
View File
@@ -20,7 +20,6 @@ public:
void LoadFromStaticGraphic( const CString &sPath ); void LoadFromStaticGraphic( const CString &sPath );
void LoadFromAniDir( const CString &sAniDir ); void LoadFromAniDir( const CString &sAniDir );
void LoadFromMovie( const CString &sMoviePath ); void LoadFromMovie( const CString &sMoviePath );
void LoadFromVisualization( const CString &sMoviePath );
void LoadFromNode( const CString &sDir, const XNode& node ); void LoadFromNode( const CString &sDir, const XNode& node );
protected: protected:
+1 -35
View File
@@ -108,16 +108,6 @@ void BGAnimationLayer::LoadFromMovie( const CString& sMoviePath )
this->AddChild( pSprite ); this->AddChild( pSprite );
} }
void BGAnimationLayer::LoadFromVisualization( const CString& sMoviePath )
{
Init();
Sprite* pSprite = new Sprite;
this->AddChild( pSprite );
pSprite->LoadBG( sMoviePath );
pSprite->StretchTo( FullScreenRectF );
pSprite->SetBlendMode( BLEND_ADD );
}
void BGAnimationLayer::LoadFromAniLayerFile( const CString& sPath ) void BGAnimationLayer::LoadFromAniLayerFile( const CString& sPath )
{ {
@@ -751,23 +741,6 @@ void BGAnimationLayer::GainFocus( float fRate, bool bRewindMovie, bool bLoop )
{ {
m_fUpdateRate = fRate; m_fUpdateRate = fRate;
if( !m_SubActors.size() )
return;
//
// The order of these actions is important.
// At this point, the movie is probably paused (by LoseFocus()).
// Play the movie, then set the playback rate (which can
// potentially pause the movie again).
//
// TODO: Don't special case subActor[0]. The movie layer should be set up with
// a LoseFocusCommand that pauses, and a GainFocusCommand that plays.
if( bRewindMovie )
RunCommandOnChildren( ParseCommands("position,0") );
RunCommandOnChildren( ParseCommands(ssprintf("loop,%i",bLoop)) );
RunCommandOnChildren( ParseCommands("play") );
RunCommandOnChildren( ParseCommands(ssprintf("rate,%f",fRate)) );
if( m_fRepeatCommandEverySeconds == -1 ) // if not repeating if( m_fRepeatCommandEverySeconds == -1 ) // if not repeating
{ {
/* Yuck. We send OnCommand on load, since that's what's wanted for /* Yuck. We send OnCommand on load, since that's what's wanted for
@@ -779,19 +752,12 @@ void BGAnimationLayer::GainFocus( float fRate, bool bRewindMovie, bool bLoop )
PlayCommand( "On" ); PlayCommand( "On" );
} }
PlayCommand( "GainFocus" );
ActorFrame::GainFocus( fRate, bRewindMovie, bLoop ); ActorFrame::GainFocus( fRate, bRewindMovie, bLoop );
} }
void BGAnimationLayer::LoseFocus() void BGAnimationLayer::LoseFocus()
{ {
if( !m_SubActors.size() ) ActorFrame::LoseFocus();
return;
RunCommandOnChildren( ParseCommands("pause") );
PlayCommand( "LoseFocus" );
} }
void BGAnimationLayer::PlayCommand( const CString &sCommandName ) void BGAnimationLayer::PlayCommand( const CString &sCommandName )
-1
View File
@@ -20,7 +20,6 @@ public:
void LoadFromStaticGraphic( const CString& sPath ); void LoadFromStaticGraphic( const CString& sPath );
void LoadFromAniLayerFile( const CString& sPath ); void LoadFromAniLayerFile( const CString& sPath );
void LoadFromMovie( const CString& sMoviePath ); void LoadFromMovie( const CString& sMoviePath );
void LoadFromVisualization( const CString& sMoviePath );
void LoadFromNode( const CString& sAniDir, const XNode& layer ); void LoadFromNode( const CString& sAniDir, const XNode& layer );
void Update( float fDeltaTime ); void Update( float fDeltaTime );
+47 -16
View File
@@ -98,7 +98,7 @@ Background::~Background()
void Background::Unload() void Background::Unload()
{ {
for( map<CString,BGAnimation*>::iterator iter = m_BGAnimations.begin(); for( map<CString,Actor*>::iterator iter = m_BGAnimations.begin();
iter != m_BGAnimations.end(); iter != m_BGAnimations.end();
iter++ ) iter++ )
delete iter->second; delete iter->second;
@@ -114,7 +114,29 @@ void Background::Unload()
m_fLastMusicSeconds = -9999; m_fLastMusicSeconds = -9999;
} }
BGAnimation *Background::CreateSongBGA( CString sBGName ) const Actor *MakeVisualization( const CString &sVisPath )
{
ActorFrame *pFrame = new ActorFrame;
pFrame->DeleteChildrenWhenDone();
const Song* pSong = GAMESTATE->m_pCurSong;
CString sSongBGPath = pSong && pSong->HasBackground() ? pSong->GetBackgroundPath() : THEME->GetPathToG("Common fallback background");
Sprite* pSprite = new Sprite;
pSprite->LoadBG( sSongBGPath );
pSprite->StretchTo( FullScreenRectF );
pFrame->AddChild( pSprite );
pSprite = new Sprite;
pSprite->LoadBG( sVisPath );
pSprite->StretchTo( FullScreenRectF );
pSprite->SetBlendMode( BLEND_ADD );
pFrame->AddChild( pSprite );
return pFrame;
}
Actor *Background::CreateSongBGA( CString sBGName ) const
{ {
BGAnimation *pTempBGA; BGAnimation *pTempBGA;
@@ -166,11 +188,7 @@ BGAnimation *Background::CreateSongBGA( CString sBGName ) const
// Look for BGAnims in the BGAnims dir // Look for BGAnims in the BGAnims dir
GetDirListing( VISUALIZATIONS_DIR+sBGName, asFiles, false, true ); GetDirListing( VISUALIZATIONS_DIR+sBGName, asFiles, false, true );
if( !asFiles.empty() ) if( !asFiles.empty() )
{ return MakeVisualization( asFiles[0] );
pTempBGA = new BGAnimation;
pTempBGA->LoadFromVisualization( asFiles[0] );
return pTempBGA;
}
// There is no background by this name. // There is no background by this name.
return NULL; return NULL;
@@ -243,12 +261,25 @@ CString Background::CreateRandomBGA()
file = arrayPaths[i]; file = arrayPaths[i];
} }
BGAnimation *ret = new BGAnimation; Actor *ret;
switch( PREFSMAN->m_iBackgroundMode ) switch( PREFSMAN->m_iBackgroundMode )
{ {
case PrefsManager::BGMODE_ANIMATIONS: ret->LoadFromAniDir( file ); break; case PrefsManager::BGMODE_ANIMATIONS:
case PrefsManager::BGMODE_MOVIEVIS: ret->LoadFromVisualization( file ); break; {
case PrefsManager::BGMODE_RANDOMMOVIES: ret->LoadFromMovie( file ); break; BGAnimation *p = new BGAnimation;
p->LoadFromAniDir( file );
ret = p;
break;
}
case PrefsManager::BGMODE_MOVIEVIS: ret = MakeVisualization( file ); break;
case PrefsManager::BGMODE_RANDOMMOVIES:
{
BGAnimation *p = new BGAnimation;
p->LoadFromMovie( file );
ret = p;
break;
}
default: FAIL_M( ssprintf("%i", PREFSMAN->m_iBackgroundMode) );
} }
ret->PlayCommand( "On" ); ret->PlayCommand( "On" );
@@ -325,7 +356,7 @@ void Background::LoadFromSong( const Song* pSong )
if( sBGName.CompareNoCase("-random-") && !bIsAlreadyLoaded ) if( sBGName.CompareNoCase("-random-") && !bIsAlreadyLoaded )
{ {
BGAnimation *pTempBGA = CreateSongBGA( sBGName ); Actor *pTempBGA = CreateSongBGA( sBGName );
if( pTempBGA ) if( pTempBGA )
{ {
pTempBGA->PlayCommand( "On" ); pTempBGA->PlayCommand( "On" );
@@ -398,7 +429,7 @@ void Background::LoadFromSong( const Song* pSong )
// Re-sort. // Re-sort.
SortBackgroundChangesArray( m_aBGChanges ); SortBackgroundChangesArray( m_aBGChanges );
for( map<CString,BGAnimation*>::iterator iter = m_BGAnimations.begin(); for( map<CString,Actor*>::iterator iter = m_BGAnimations.begin();
iter != m_BGAnimations.end(); iter != m_BGAnimations.end();
iter++ ) iter++ )
{ {
@@ -433,10 +464,10 @@ void Background::LoadFromSong( const Song* pSong )
* which sync from the regular clock by default. If you don't want this, set * which sync from the regular clock by default. If you don't want this, set
* the clock back with "effectclock,timer" in your OnCommand. Note that at this * the clock back with "effectclock,timer" in your OnCommand. Note that at this
* point, we havn't run the OnCommand yet, so it'll override correctly. */ * point, we havn't run the OnCommand yet, so it'll override correctly. */
map<CString,BGAnimation*>::iterator it; map<CString,Actor*>::iterator it;
for( it = m_BGAnimations.begin(); it != m_BGAnimations.end(); ++it ) for( it = m_BGAnimations.begin(); it != m_BGAnimations.end(); ++it )
{ {
BGAnimation *pBGA = it->second; Actor *pBGA = it->second;
/* Be sure that we run this command recursively on all children; the tree /* Be sure that we run this command recursively on all children; the tree
* may look something like "BGAnimation, BGAnimationLayer, Sprite" or it * may look something like "BGAnimation, BGAnimationLayer, Sprite" or it
@@ -492,7 +523,7 @@ void Background::UpdateCurBGChange( float fCurrentTime )
const BackgroundChange& change = m_aBGChanges[i]; const BackgroundChange& change = m_aBGChanges[i];
BGAnimation* pOld = m_pCurrentBGA; Actor *pOld = m_pCurrentBGA;
if( change.m_bFadeLast ) if( change.m_bFadeLast )
m_pFadingBGA = m_pCurrentBGA; m_pFadingBGA = m_pCurrentBGA;
+4 -4
View File
@@ -64,15 +64,15 @@ protected:
BGAnimation m_DeadPlayer[NUM_PLAYERS]; BGAnimation m_DeadPlayer[NUM_PLAYERS];
BGAnimation* CreateSongBGA( CString sBGName ) const; Actor *CreateSongBGA( CString sBGName ) const;
CString CreateRandomBGA(); CString CreateRandomBGA();
map<CString,BGAnimation*> m_BGAnimations; map<CString,Actor*> m_BGAnimations;
deque<CString> m_RandomBGAnimations; deque<CString> m_RandomBGAnimations;
vector<BackgroundChange> m_aBGChanges; vector<BackgroundChange> m_aBGChanges;
int m_iCurBGChangeIndex; int m_iCurBGChangeIndex;
BGAnimation* m_pCurrentBGA; Actor *m_pCurrentBGA;
BGAnimation* m_pFadingBGA; Actor *m_pFadingBGA;
float m_fSecsLeftInFade; float m_fSecsLeftInFade;
float m_fLastMusicSeconds; float m_fLastMusicSeconds;
Quad m_quadBorder[4]; // l, t, r, b - cover up the edge of animations that might hang outside of the background rectangle Quad m_quadBorder[4]; // l, t, r, b - cover up the edge of animations that might hang outside of the background rectangle
+28
View File
@@ -934,6 +934,34 @@ void Sprite::HandleCommand( const Command &command )
EndHandleArgs; EndHandleArgs;
} }
void Sprite::GainFocus( float fRate, bool bRewindMovie, bool bLoop )
{
//
// The order of these actions is important.
// At this point, the movie is probably paused (by LoseFocus()).
// Play the movie, then set the playback rate (which can
// potentially pause the movie again).
//
RageTexture *pTexture = GetTexture();
if( pTexture != NULL )
{
if( bRewindMovie )
pTexture->SetPosition( 0 );
pTexture->SetLooping( bLoop );
pTexture->SetPlaybackRate( fRate );
}
EnableAnimation( true );
Actor::GainFocus( fRate, bRewindMovie, bLoop );
}
void Sprite::LoseFocus()
{
EnableAnimation( false );
Actor::LoseFocus();
}
/* /*
* (c) 2001-2004 Chris Danford * (c) 2001-2004 Chris Danford
* All rights reserved. * All rights reserved.
+3
View File
@@ -18,6 +18,9 @@ public:
virtual void DrawPrimitives(); virtual void DrawPrimitives();
virtual void Update( float fDeltaTime ); virtual void Update( float fDeltaTime );
virtual void GainFocus( float fRate, bool bRewindMovie, bool bLoop );
virtual void LoseFocus();
void UpdateAnimationState(); // take m_fSecondsIntoState, and move to a new state void UpdateAnimationState(); // take m_fSecondsIntoState, and move to a new state
/* Adjust texture properties for song backgrounds. */ /* Adjust texture properties for song backgrounds. */