You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
132 lines
2.9 KiB
132 lines
2.9 KiB
//========= Copyright Valve Corporation, All rights reserved. ============// |
|
// |
|
// Purpose: |
|
// |
|
//============================================================================= |
|
|
|
#include "cbase.h" |
|
#include "SceneCache.h" |
|
#include "choreoscene.h" |
|
#include "choreoevent.h" |
|
|
|
extern ISoundEmitterSystemBase *soundemitterbase; |
|
CChoreoScene *BlockingLoadScene( const char *filename ); |
|
|
|
CSceneCache::CSceneCache() |
|
{ |
|
msecs = 0; |
|
} |
|
|
|
CSceneCache::CSceneCache( const CSceneCache& src ) |
|
{ |
|
msecs = src.msecs; |
|
sounds = src.sounds; |
|
} |
|
|
|
int CSceneCache::GetSoundCount() const |
|
{ |
|
return sounds.Count(); |
|
} |
|
|
|
char const *CSceneCache::GetSoundName( int index ) |
|
{ |
|
return soundemitterbase->GetSoundName( sounds[ index ] ); |
|
} |
|
|
|
void CSceneCache::Save( CUtlBuffer& buf ) |
|
{ |
|
buf.PutUnsignedInt( msecs ); |
|
|
|
unsigned short c = GetSoundCount(); |
|
buf.PutShort( c ); |
|
|
|
Assert( sounds.Count() <= 65536 ); |
|
|
|
for ( int i = 0; i < c; ++i ) |
|
{ |
|
buf.PutString( GetSoundName( i ) ); |
|
} |
|
} |
|
|
|
void CSceneCache::Restore( CUtlBuffer& buf ) |
|
{ |
|
MEM_ALLOC_CREDIT(); |
|
|
|
msecs = buf.GetUnsignedInt(); |
|
|
|
unsigned short c = (unsigned short)buf.GetShort(); |
|
|
|
for ( int i = 0; i < c; ++i ) |
|
{ |
|
char soundname[ 512 ]; |
|
buf.GetString( soundname, sizeof( soundname ) ); |
|
|
|
int idx = soundemitterbase->GetSoundIndex( soundname ); |
|
if ( idx != -1 ) |
|
{ |
|
Assert( idx <= 65535 ); |
|
if ( sounds.Find( idx ) == sounds.InvalidIndex() ) |
|
{ |
|
sounds.AddToTail( (unsigned short)idx ); |
|
} |
|
} |
|
} |
|
} |
|
|
|
//----------------------------------------------------------------------------- |
|
// Purpose: Static method |
|
// Input : *event - |
|
// soundlist - |
|
//----------------------------------------------------------------------------- |
|
void CSceneCache::PrecacheSceneEvent( CChoreoEvent *event, CUtlVector< unsigned short >& soundlist ) |
|
{ |
|
if ( !event || event->GetType() != CChoreoEvent::SPEAK ) |
|
return; |
|
|
|
int idx = soundemitterbase->GetSoundIndex( event->GetParameters() ); |
|
if ( idx != -1 ) |
|
{ |
|
MEM_ALLOC_CREDIT(); |
|
Assert( idx <= 65535 ); |
|
soundlist.AddToTail( (unsigned short)idx ); |
|
} |
|
|
|
if ( event->GetCloseCaptionType() == CChoreoEvent::CC_MASTER ) |
|
{ |
|
char tok[ CChoreoEvent::MAX_CCTOKEN_STRING ]; |
|
if ( event->GetPlaybackCloseCaptionToken( tok, sizeof( tok ) ) ) |
|
{ |
|
int idx = soundemitterbase->GetSoundIndex( tok ); |
|
if ( idx != -1 && soundlist.Find( idx ) == soundlist.InvalidIndex() ) |
|
{ |
|
MEM_ALLOC_CREDIT(); |
|
Assert( idx <= 65535 ); |
|
soundlist.AddToTail( (unsigned short)idx ); |
|
} |
|
} |
|
} |
|
} |
|
|
|
void CSceneCache::Rebuild( char const *filename ) |
|
{ |
|
msecs = 0; |
|
sounds.RemoveAll(); |
|
|
|
CChoreoScene *scene = BlockingLoadScene( filename ); |
|
if ( scene ) |
|
{ |
|
// Walk all events looking for SPEAK events |
|
CChoreoEvent *event; |
|
int c = scene->GetNumEvents(); |
|
for ( int i = 0; i < c; ++i ) |
|
{ |
|
event = scene->GetEvent( i ); |
|
PrecacheSceneEvent( event, sounds ); |
|
} |
|
|
|
// Update scene duration, too |
|
msecs = (int)( scene->FindStopTime() * 1000.0f + 0.5f ); |
|
|
|
delete scene; |
|
} |
|
}
|
|
|