Team Fortress 2 Source Code as on 22/4/2020
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.
|
|
//========= Copyright Valve Corporation, All rights reserved. ============//
//
// Purpose:
//
// $Workfile: $
// $Date: $
//
//-----------------------------------------------------------------------------
// $Log: $
//
// $NoKeywords: $
//=============================================================================//
#if !defined( MOUTHINFO_H )
#define MOUTHINFO_H
#ifdef _WIN32
#pragma once
#endif
class CAudioSource;
#pragma pack(push,4)
class CVoiceData { public: CVoiceData( void ) { m_flElapsed = 0.0f; m_pAudioSource = NULL; m_bIgnorePhonemes = false; }
void SetElapsedTime( float t ) { m_flElapsed = t; }
float GetElapsedTime() const { return m_flElapsed; }
void SetSource( CAudioSource *source, bool bIgnorePhonemes ) { m_pAudioSource = source; m_bIgnorePhonemes = bIgnorePhonemes; }
bool ShouldIgnorePhonemes() const { return m_bIgnorePhonemes; }
CAudioSource *GetSource() { return m_pAudioSource; }
private: float m_flElapsed; CAudioSource *m_pAudioSource; bool m_bIgnorePhonemes; };
#define UNKNOWN_VOICE_SOURCE -1
//-----------------------------------------------------------------------------
// Purpose: Describes position of mouth for lip syncing
//-----------------------------------------------------------------------------
class CMouthInfo { public: // 0 = mouth closed, 255 = mouth agape
byte mouthopen; // counter for running average
byte sndcount; // running average
int sndavg;
public: CMouthInfo( void ) { m_nVoiceSources = 0; m_needsEnvelope = false; } virtual ~CMouthInfo( void ) { ClearVoiceSources(); }
int GetNumVoiceSources( void ); CVoiceData *GetVoiceSource( int number );
void ClearVoiceSources( void ); int GetIndexForSource( CAudioSource *source ); bool IsSourceReferenced( CAudioSource *source );
CVoiceData *AddSource( CAudioSource *source, bool bIgnorePhonemes );
void RemoveSource( CAudioSource *source ); void RemoveSourceByIndex( int index );
bool IsActive( void ); bool NeedsEnvelope() { return m_needsEnvelope != 0; } void ActivateEnvelope() { m_needsEnvelope = true; }
private: enum { MAX_VOICE_DATA = 4 };
short m_nVoiceSources; short m_needsEnvelope; CVoiceData m_VoiceSources[ MAX_VOICE_DATA ]; }; #pragma pack(pop)
inline bool CMouthInfo::IsActive( void ) { return ( GetNumVoiceSources() > 0 ) ? true : false; }
inline int CMouthInfo::GetNumVoiceSources( void ) { return m_nVoiceSources; }
inline CVoiceData *CMouthInfo::GetVoiceSource( int number ) { if ( number < 0 || number >= m_nVoiceSources ) return NULL;
return &m_VoiceSources[ number ]; }
inline void CMouthInfo::ClearVoiceSources( void ) { m_nVoiceSources = 0; }
inline int CMouthInfo::GetIndexForSource( CAudioSource *source ) { for ( int i = 0; i < m_nVoiceSources; i++ ) { CVoiceData *v = &m_VoiceSources[ i ]; if ( !v ) continue;
if ( v->GetSource() == source ) return i; }
return UNKNOWN_VOICE_SOURCE; }
inline bool CMouthInfo::IsSourceReferenced( CAudioSource *source ) { if ( GetIndexForSource( source ) != UNKNOWN_VOICE_SOURCE ) return true;
return false; }
inline void CMouthInfo::RemoveSource( CAudioSource *source ) { int idx = GetIndexForSource( source ); if ( idx == UNKNOWN_VOICE_SOURCE ) return;
RemoveSourceByIndex( idx ); }
inline void CMouthInfo::RemoveSourceByIndex( int index ) { if ( index < 0 || index >= m_nVoiceSources ) return;
m_VoiceSources[ index ] = m_VoiceSources[ --m_nVoiceSources ]; }
inline CVoiceData *CMouthInfo::AddSource( CAudioSource *source, bool bIgnorePhonemes ) { int idx = GetIndexForSource( source ); if ( idx == UNKNOWN_VOICE_SOURCE ) { if ( m_nVoiceSources < MAX_VOICE_DATA ) { idx = m_nVoiceSources++; } else { // No room!
return NULL; } }
CVoiceData *data = &m_VoiceSources[ idx ]; data->SetSource( source, bIgnorePhonemes ); data->SetElapsedTime( 0.0f ); return data; }
#endif // MOUTHINFO_H
|