//========= Copyright Valve Corporation, All rights reserved. ============// // // Purpose: // // $NoKeywords: $ //=============================================================================// #include #include #include #include "choreoactor.h" #include "choreochannel.h" #include "choreoscene.h" #include "tier1/utlbuffer.h" // memdbgon must be the last include file in a .cpp file!!! #include "tier0/memdbgon.h" //----------------------------------------------------------------------------- // Purpose: //----------------------------------------------------------------------------- CChoreoActor::CChoreoActor( void ) { Init(); } //----------------------------------------------------------------------------- // Purpose: // Input : *name - //----------------------------------------------------------------------------- CChoreoActor::CChoreoActor( const char *name ) { Init(); SetName( name ); } //----------------------------------------------------------------------------- // Purpose: // Assignment // Input : src - // Output : CChoreoActor& //----------------------------------------------------------------------------- CChoreoActor& CChoreoActor::operator=( const CChoreoActor& src ) { m_bActive = src.m_bActive; Q_strncpy( m_szName, src.m_szName, sizeof( m_szName ) ); Q_strncpy( m_szFacePoserModelName, src.m_szFacePoserModelName, sizeof( m_szFacePoserModelName ) ); for ( int i = 0; i < src.m_Channels.Size(); i++ ) { CChoreoChannel *c = src.m_Channels[ i ]; CChoreoChannel *newChannel = new CChoreoChannel(); newChannel->SetActor( this ); *newChannel = *c; AddChannel( newChannel ); } return *this; } //----------------------------------------------------------------------------- // Purpose: //----------------------------------------------------------------------------- void CChoreoActor::Init( void ) { m_szName[ 0 ] = 0; m_szFacePoserModelName[ 0 ] = 0; m_bActive = true; } //----------------------------------------------------------------------------- // Purpose: // Input : *name - //----------------------------------------------------------------------------- void CChoreoActor::SetName( const char *name ) { assert( strlen( name ) < MAX_ACTOR_NAME ); Q_strncpy( m_szName, name, sizeof( m_szName ) ); } //----------------------------------------------------------------------------- // Purpose: // Output : const char //----------------------------------------------------------------------------- const char *CChoreoActor::GetName( void ) { return m_szName; } //----------------------------------------------------------------------------- // Purpose: // Output : int //----------------------------------------------------------------------------- int CChoreoActor::GetNumChannels( void ) { return m_Channels.Size(); } //----------------------------------------------------------------------------- // Purpose: // Input : channel - // Output : CChoreoChannel //----------------------------------------------------------------------------- CChoreoChannel *CChoreoActor::GetChannel( int channel ) { if ( channel < 0 || channel >= m_Channels.Size() ) { return NULL; } return m_Channels[ channel ]; } //----------------------------------------------------------------------------- // Purpose: // Input : *channel - //----------------------------------------------------------------------------- void CChoreoActor::AddChannel( CChoreoChannel *channel ) { m_Channels.AddToTail( channel ); } //----------------------------------------------------------------------------- // Purpose: // Input : *channel - //----------------------------------------------------------------------------- void CChoreoActor::RemoveChannel( CChoreoChannel *channel ) { int idx = FindChannelIndex( channel ); if ( idx == -1 ) return; m_Channels.Remove( idx ); } //----------------------------------------------------------------------------- // Purpose: //----------------------------------------------------------------------------- void CChoreoActor::RemoveAllChannels() { m_Channels.RemoveAll(); } //----------------------------------------------------------------------------- // Purpose: // Input : c1 - // c2 - //----------------------------------------------------------------------------- void CChoreoActor::SwapChannels( int c1, int c2 ) { CChoreoChannel *temp; temp = m_Channels[ c1 ]; m_Channels[ c1 ] = m_Channels[ c2 ]; m_Channels[ c2 ] = temp; } //----------------------------------------------------------------------------- // Purpose: // Input : *channel - // Output : int //----------------------------------------------------------------------------- int CChoreoActor::FindChannelIndex( CChoreoChannel *channel ) { for ( int i = 0; i < m_Channels.Size(); i++ ) { if ( channel == m_Channels[ i ] ) { return i; } } return -1; } //----------------------------------------------------------------------------- // Purpose: // Input : *name - //----------------------------------------------------------------------------- void CChoreoActor::SetFacePoserModelName( const char *name ) { Q_strncpy( m_szFacePoserModelName, name, sizeof( m_szFacePoserModelName ) ); } //----------------------------------------------------------------------------- // Purpose: // Output : char const //----------------------------------------------------------------------------- const char *CChoreoActor::GetFacePoserModelName( void ) const { return m_szFacePoserModelName; } //----------------------------------------------------------------------------- // Purpose: // Input : active - //----------------------------------------------------------------------------- void CChoreoActor::SetActive( bool active ) { m_bActive = active; } //----------------------------------------------------------------------------- // Purpose: // Output : Returns true on success, false on failure. //----------------------------------------------------------------------------- bool CChoreoActor::GetActive( void ) const { return m_bActive; } //----------------------------------------------------------------------------- // Purpose: //----------------------------------------------------------------------------- void CChoreoActor::MarkForSaveAll( bool mark ) { SetMarkedForSave( mark ); int c = GetNumChannels(); for ( int i = 0; i < c; i++ ) { CChoreoChannel *channel = GetChannel( i ); channel->MarkForSaveAll( mark ); } } //----------------------------------------------------------------------------- // Purpose: // Input : *name - // Output : CChoreoChannel //----------------------------------------------------------------------------- CChoreoChannel *CChoreoActor::FindChannel( const char *name ) { int c = GetNumChannels(); for ( int i = 0; i < c; i++ ) { CChoreoChannel *channel = GetChannel( i ); if ( !Q_stricmp( channel->GetName(), name ) ) return channel; } return NULL; } void CChoreoActor::SaveToBuffer( CUtlBuffer& buf, CChoreoScene *pScene, IChoreoStringPool *pStringPool ) { buf.PutShort( pStringPool->FindOrAddString( GetName() ) ); int c = GetNumChannels(); Assert( c <= 255 ); buf.PutUnsignedChar( c ); for ( int i = 0; i < c; i++ ) { CChoreoChannel *channel = GetChannel( i ); Assert( channel ); channel->SaveToBuffer( buf, pScene, pStringPool ); } /* if ( Q_strlen( a->GetFacePoserModelName() ) > 0 ) { FilePrintf( buf, level + 1, "faceposermodel \"%s\"\n", a->GetFacePoserModelName() ); } */ buf.PutChar( GetActive() ? 1 : 0 ); } bool CChoreoActor::RestoreFromBuffer( CUtlBuffer& buf, CChoreoScene *pScene, IChoreoStringPool *pStringPool ) { char sz[ 256 ]; pStringPool->GetString( buf.GetShort(), sz, sizeof( sz ) ); SetName( sz ); int i; int c = buf.GetUnsignedChar(); for ( i = 0; i < c; i++ ) { CChoreoChannel *channel = pScene->AllocChannel(); Assert( channel ); if ( channel->RestoreFromBuffer( buf, pScene, this, pStringPool ) ) { AddChannel( channel ); channel->SetActor( this ); continue; } return false; } SetActive( buf.GetChar() == 1 ? true : false ); return true; }