diff options
Diffstat (limited to 'utils/scenemanager/vcdfile.cpp')
| -rw-r--r-- | utils/scenemanager/vcdfile.cpp | 284 |
1 files changed, 284 insertions, 0 deletions
diff --git a/utils/scenemanager/vcdfile.cpp b/utils/scenemanager/vcdfile.cpp new file mode 100644 index 0000000..4dccbe3 --- /dev/null +++ b/utils/scenemanager/vcdfile.cpp @@ -0,0 +1,284 @@ +//========= Copyright Valve Corporation, All rights reserved. ============// +// +// Purpose: +// +//=============================================================================// +#include "cbase.h" +#include "vcdfile.h" +#include "soundentry.h" +#include "choreoscene.h" +#include "scriplib.h" +#include "cmdlib.h" +#include "iscenetokenprocessor.h" +#include "choreoevent.h" +#include "scene.h" +#include "project.h" +#include "workspacemanager.h" +#include "workspacebrowser.h" + +//----------------------------------------------------------------------------- +// Purpose: Helper to scene module for parsing the .vcd file +//----------------------------------------------------------------------------- +class CSceneTokenProcessor : public ISceneTokenProcessor +{ +public: + const char *CurrentToken( void ); + bool GetToken( bool crossline ); + bool TokenAvailable( void ); + void Error( const char *fmt, ... ); +}; + +//----------------------------------------------------------------------------- +// Purpose: +// Output : const +//----------------------------------------------------------------------------- +const char *CSceneTokenProcessor::CurrentToken( void ) +{ + return token; +} + +//----------------------------------------------------------------------------- +// Purpose: +// Input : crossline - +// Output : Returns true on success, false on failure. +//----------------------------------------------------------------------------- +bool CSceneTokenProcessor::GetToken( bool crossline ) +{ + return ::GetToken( crossline ) ? true : false; +} + +//----------------------------------------------------------------------------- +// Purpose: +// Output : Returns true on success, false on failure. +//----------------------------------------------------------------------------- +bool CSceneTokenProcessor::TokenAvailable( void ) +{ + return ::TokenAvailable() ? true : false; +} + +//----------------------------------------------------------------------------- +// Purpose: +// Input : *fmt - +// ... - +//----------------------------------------------------------------------------- +void CSceneTokenProcessor::Error( const char *fmt, ... ) +{ + char string[ 2048 ]; + va_list argptr; + va_start( argptr, fmt ); + vsprintf( string, fmt, argptr ); + va_end( argptr ); + + Con_ColorPrintf( ERROR_R, ERROR_G, ERROR_B, string ); + ::Error( string ); +} + +static CSceneTokenProcessor g_TokenProcessor; +ISceneTokenProcessor *tokenprocessor = &g_TokenProcessor; + +CVCDFile::CVCDFile( CScene *scene, char const *filename ) : m_pOwner( scene ) +{ + Q_strncpy( m_szName, filename, sizeof( m_szName ) ); + + m_pScene = LoadScene( filename ); + LoadSoundsFromScene( m_pScene ); + + m_pszComments = NULL; +} + +CVCDFile::~CVCDFile() +{ + while ( m_Sounds.Count() > 0 ) + { + CSoundEntry *p = m_Sounds[ 0 ]; + m_Sounds.Remove( 0 ); + delete p; + } + delete[] m_pszComments; +} + +CScene *CVCDFile::GetOwnerScene() +{ + return m_pOwner; +} + +//----------------------------------------------------------------------------- +// Purpose: +// Input : *filename - +// Output : CChoreoScene +//----------------------------------------------------------------------------- +CChoreoScene *CVCDFile::LoadScene( char const *filename ) +{ + if ( filesystem->FileExists( filename ) ) + { + char fullpath[ 512 ]; + filesystem->RelativePathToFullPath( filename, "GAME", fullpath, sizeof( fullpath ) ); + LoadScriptFile( fullpath ); + CChoreoScene *scene = ChoreoLoadScene( filename, this, &g_TokenProcessor, Con_Printf ); + return scene; + } + + return NULL; +} + +void CVCDFile::LoadSoundsFromScene( CChoreoScene *scene ) +{ + if ( !scene ) + return; + + CChoreoEvent *e; + + int c = scene->GetNumEvents(); + for ( int i = 0; i < c; i++ ) + { + e = scene->GetEvent( i ); + if ( !e ) + continue; + + if ( e->GetType() != CChoreoEvent::SPEAK ) + continue; + + CSoundEntry *se = new CSoundEntry( this, e->GetParameters() ); + m_Sounds.AddToTail( se ); + } +} + +char const *CVCDFile::GetName() const +{ + return m_szName; +} + +char const *CVCDFile::GetComments() +{ + return m_pszComments ? m_pszComments : ""; +} + +void CVCDFile::SetComments( char const *comments ) +{ + delete[] m_pszComments; + m_pszComments = V_strdup( comments ); + + if ( GetOwnerScene() ) + { + if ( GetOwnerScene()->GetOwnerProject() ) + { + GetOwnerScene()->GetOwnerProject()->SetDirty( true ); + } + } +} + +int CVCDFile::GetSoundEntryCount() const +{ + return m_Sounds.Count(); +} + +CSoundEntry *CVCDFile::GetSoundEntry( int index ) +{ + if ( index < 0 || index >= m_Sounds.Count() ) + return NULL; + return m_Sounds[ index ]; +} + +void CVCDFile::ValidateTree( mxTreeView *tree, mxTreeViewItem* parent ) +{ + CUtlVector< mxTreeViewItem * > m_KnownItems; + + int c = GetSoundEntryCount(); + CSoundEntry *sound; + for ( int i = 0; i < c; i++ ) + { + sound = GetSoundEntry( i ); + if ( !sound ) + continue; + + char sz[ 256 ]; + Q_snprintf( sz, sizeof( sz ), "\"%s\" : script %s", sound->GetName(), sound->GetScriptFile() ); + + mxTreeViewItem *spot = sound->FindItem( tree, parent ); + if ( !spot ) + { + spot = tree->add( parent, sz ); + } + + m_KnownItems.AddToTail( spot ); + + sound->SetOrdinal( i ); + + tree->setLabel( spot, sz ); + + tree->setImages( spot, sound->GetIconIndex(), sound->GetIconIndex() ); + tree->setUserData( spot, sound ); + + sound->ValidateTree( tree, spot ); + } + + mxTreeViewItem *start = tree->getFirstChild( parent ); + while ( start ) + { + mxTreeViewItem *next = tree->getNextChild( start ); + + if ( m_KnownItems.Find( start ) == m_KnownItems.InvalidIndex() ) + { + tree->remove( start ); + } + + start = next; + } + + tree->sortTree( parent, true, CWorkspaceBrowser::CompareFunc, 0 ); +} + +void CVCDFile::Checkout(bool updatestateicons /*= true*/) +{ + VSS_Checkout( GetName(), updatestateicons ); +} + +void CVCDFile::Checkin(bool updatestateicons /*= true*/) +{ + VSS_Checkin( GetName(), updatestateicons ); +} + + +bool CVCDFile::IsCheckedOut() const +{ + return filesystem->IsFileWritable( GetName() ); +} + +int CVCDFile::GetIconIndex() const +{ + if ( IsCheckedOut() ) + { + return IMAGE_VCD_CHECKEDOUT; + } + else + { + return IMAGE_VCD; + } +} + +void CVCDFile::MoveChildUp( ITreeItem *child ) +{ +} + +void CVCDFile::MoveChildDown( ITreeItem *child ) +{ +} + +void CVCDFile::SetDirty( bool dirty ) +{ + if ( GetOwnerScene() ) + { + GetOwnerScene()->SetDirty( dirty ); + } +} + + +bool CVCDFile::IsChildFirst( ITreeItem *child ) +{ + return false; +} + +bool CVCDFile::IsChildLast( ITreeItem *child ) +{ + return false; +} |