Seaside/SpyCustom/sdk/mouthinfo.h
2021-06-16 18:48:15 +03:00

178 lines
3.3 KiB
C++

#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
class CMouthInfo
{
public:
byte mouthopen;
byte sndcount;
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
{
return NULL;
}
}
CVoiceData* data = &m_VoiceSources[idx];
data->SetSource(source, bIgnorePhonemes);
data->SetElapsedTime(0.0f);
return data;
}
#endif