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.
218 lines
5.8 KiB
218 lines
5.8 KiB
5 years ago
|
//========= Copyright Valve Corporation, All rights reserved. ============//
|
||
|
//
|
||
|
// Purpose:
|
||
|
//
|
||
|
// $NoKeywords: $
|
||
|
//=============================================================================//
|
||
|
|
||
|
#ifndef HUD_CLOSECAPTION_H
|
||
|
#define HUD_CLOSECAPTION_H
|
||
|
#ifdef _WIN32
|
||
|
#pragma once
|
||
|
#endif
|
||
|
|
||
|
#include "hudelement.h"
|
||
|
#include <vgui_controls/Panel.h>
|
||
|
#include "captioncompiler.h"
|
||
|
#include "tier1/UtlSortVector.h"
|
||
|
#include "tier1/utlsymbol.h"
|
||
|
|
||
|
class CSentence;
|
||
|
class C_BaseFlex;
|
||
|
class CCloseCaptionItem;
|
||
|
struct WorkUnitParams;
|
||
|
class CAsyncCaption;
|
||
|
|
||
|
typedef CUtlSortVector< CaptionLookup_t, CCaptionLookupLess > CaptionDictionary_t;
|
||
|
struct AsyncCaptionData_t;
|
||
|
struct AsyncCaption_t
|
||
|
{
|
||
|
AsyncCaption_t() :
|
||
|
m_DataBaseFile( UTL_INVAL_SYMBOL ),
|
||
|
m_RequestedBlocks( 0, 0, BlockInfo_t::Less )
|
||
|
{
|
||
|
Q_memset( &m_Header, 0, sizeof( m_Header ) );
|
||
|
}
|
||
|
|
||
|
struct BlockInfo_t
|
||
|
{
|
||
|
int fileindex;
|
||
|
int blocknum;
|
||
|
memhandle_t handle;
|
||
|
|
||
|
static bool Less( const BlockInfo_t& lhs, const BlockInfo_t& rhs )
|
||
|
{
|
||
|
if ( lhs.fileindex != rhs.fileindex )
|
||
|
return lhs.fileindex < rhs.fileindex;
|
||
|
|
||
|
return lhs.blocknum < rhs.blocknum;
|
||
|
}
|
||
|
};
|
||
|
|
||
|
AsyncCaption_t& operator =( const AsyncCaption_t& rhs )
|
||
|
{
|
||
|
if ( this == &rhs )
|
||
|
return *this;
|
||
|
|
||
|
m_CaptionDirectory = rhs.m_CaptionDirectory;
|
||
|
m_Header = rhs.m_Header;
|
||
|
m_DataBaseFile = rhs.m_DataBaseFile;
|
||
|
|
||
|
for ( int i = rhs.m_RequestedBlocks.FirstInorder(); i != rhs.m_RequestedBlocks.InvalidIndex(); i = rhs.m_RequestedBlocks.NextInorder( i ) )
|
||
|
{
|
||
|
m_RequestedBlocks.Insert( rhs.m_RequestedBlocks[ i ] );
|
||
|
}
|
||
|
|
||
|
return *this;
|
||
|
}
|
||
|
|
||
|
CUtlRBTree< BlockInfo_t, unsigned short > m_RequestedBlocks;
|
||
|
|
||
|
CaptionDictionary_t m_CaptionDirectory;
|
||
|
CompiledCaptionHeader_t m_Header;
|
||
|
CUtlSymbol m_DataBaseFile;
|
||
|
};
|
||
|
|
||
|
//-----------------------------------------------------------------------------
|
||
|
// Purpose:
|
||
|
//-----------------------------------------------------------------------------
|
||
|
class CHudCloseCaption : public CHudElement, public vgui::Panel
|
||
|
{
|
||
|
DECLARE_CLASS_SIMPLE( CHudCloseCaption, vgui::Panel );
|
||
|
public:
|
||
|
DECLARE_MULTIPLY_INHERITED();
|
||
|
|
||
|
CHudCloseCaption( const char *pElementName );
|
||
|
virtual ~CHudCloseCaption();
|
||
|
|
||
|
// Expire lingering items
|
||
|
virtual void OnTick( void );
|
||
|
|
||
|
virtual void LevelInit( void );
|
||
|
|
||
|
virtual void LevelShutdown( void )
|
||
|
{
|
||
|
Reset();
|
||
|
}
|
||
|
|
||
|
// Painting methods
|
||
|
virtual void Paint();
|
||
|
|
||
|
void MsgFunc_CloseCaption(bf_read &msg);
|
||
|
|
||
|
// Clear all CC data
|
||
|
void Reset( void );
|
||
|
void Process( const wchar_t *stream, float duration, char const *tokenstream, bool fromplayer, bool direct = false );
|
||
|
|
||
|
bool ProcessCaption( char const *tokenname, float duration, bool fromplayer = false, bool direct = false );
|
||
|
void ProcessCaptionDirect( char const *tokenname, float duration, bool fromplayer = false );
|
||
|
|
||
|
void ProcessSentenceCaptionStream( char const *tokenstream );
|
||
|
void PlayRandomCaption();
|
||
|
|
||
|
void InitCaptionDictionary( char const *dbfile );
|
||
|
void OnFinishAsyncLoad( int nFileIndex, int nBlockNum, AsyncCaptionData_t *pData );
|
||
|
|
||
|
void Flush();
|
||
|
void TogglePaintDebug();
|
||
|
|
||
|
enum
|
||
|
{
|
||
|
CCFONT_NORMAL = 0,
|
||
|
CCFONT_ITALIC,
|
||
|
CCFONT_BOLD,
|
||
|
CCFONT_ITALICBOLD,
|
||
|
CCFONT_SMALL,
|
||
|
CCFONT_MAX
|
||
|
};
|
||
|
|
||
|
static int GetFontNumber( bool bold, bool italic );
|
||
|
|
||
|
void Lock( void );
|
||
|
void Unlock( void );
|
||
|
|
||
|
void FindSound( char const *pchANSI );
|
||
|
|
||
|
public:
|
||
|
|
||
|
struct CaptionRepeat
|
||
|
{
|
||
|
CaptionRepeat() :
|
||
|
m_nTokenIndex( 0 ),
|
||
|
m_flLastEmitTime( 0 ),
|
||
|
m_flInterval( 0 ),
|
||
|
m_nLastEmitTick( 0 )
|
||
|
{
|
||
|
}
|
||
|
int m_nTokenIndex;
|
||
|
int m_nLastEmitTick;
|
||
|
float m_flLastEmitTime;
|
||
|
float m_flInterval;
|
||
|
};
|
||
|
|
||
|
private:
|
||
|
|
||
|
void ClearAsyncWork();
|
||
|
void ProcessAsyncWork();
|
||
|
bool AddAsyncWork( char const *tokenstream, bool bIsStream, float duration, bool fromplayer, bool direct = false );
|
||
|
|
||
|
void _ProcessSentenceCaptionStream( int wordCount, char const *tokenstream, const wchar_t *caption_full );
|
||
|
void _ProcessCaption( const wchar_t *caption, char const *tokenname, float duration, bool fromplayer, bool direct = false );
|
||
|
|
||
|
CUtlLinkedList< CAsyncCaption *, unsigned short > m_AsyncWork;
|
||
|
|
||
|
CUtlRBTree< CaptionRepeat, int > m_CloseCaptionRepeats;
|
||
|
|
||
|
private:
|
||
|
|
||
|
static bool CaptionTokenLessFunc( const CaptionRepeat &lhs, const CaptionRepeat &rhs );
|
||
|
|
||
|
void DrawStream( wrect_t& rect, wrect_t &rcWindow, CCloseCaptionItem *item, int iFadeLine, float flFadeLineAlpha );
|
||
|
void ComputeStreamWork( int available_width, CCloseCaptionItem *item );
|
||
|
bool SplitCommand( wchar_t const **ppIn, wchar_t *cmd, wchar_t *args ) const;
|
||
|
|
||
|
bool StreamHasCommand( const wchar_t *stream, const wchar_t *findcmd ) const;
|
||
|
bool GetFloatCommandValue( const wchar_t *stream, const wchar_t *findcmd, float& value ) const;
|
||
|
|
||
|
bool GetNoRepeatValue( const wchar_t *caption, float &retval );
|
||
|
|
||
|
void ParseCloseCaptionStream( const wchar_t *in, int available_width );
|
||
|
bool StreamHasCommand( const wchar_t *stream, const wchar_t *search );
|
||
|
|
||
|
void DumpWork( CCloseCaptionItem *item );
|
||
|
|
||
|
void AddWorkUnit(
|
||
|
CCloseCaptionItem *item,
|
||
|
WorkUnitParams& params );
|
||
|
|
||
|
CUtlVector< CCloseCaptionItem * > m_Items;
|
||
|
|
||
|
vgui::HFont m_hFonts[CCFONT_MAX];
|
||
|
|
||
|
void CreateFonts( void );
|
||
|
|
||
|
int m_nLineHeight;
|
||
|
|
||
|
int m_nGoalHeight;
|
||
|
int m_nCurrentHeight;
|
||
|
float m_flGoalAlpha;
|
||
|
float m_flCurrentAlpha;
|
||
|
float m_flGoalHeightStartTime;
|
||
|
float m_flGoalHeightFinishTime;
|
||
|
|
||
|
CPanelAnimationVar( float, m_flBackgroundAlpha, "BgAlpha", "192" );
|
||
|
CPanelAnimationVar( float, m_flGrowTime, "GrowTime", "0.25" );
|
||
|
CPanelAnimationVar( float, m_flItemHiddenTime, "ItemHiddenTime", "0.2" );
|
||
|
CPanelAnimationVar( float, m_flItemFadeInTime, "ItemFadeInTime", "0.15" );
|
||
|
CPanelAnimationVar( float, m_flItemFadeOutTime, "ItemFadeOutTime", "0.3" );
|
||
|
CPanelAnimationVar( int, m_nTopOffset, "topoffset", "40" );
|
||
|
|
||
|
CUtlVector< AsyncCaption_t > m_AsyncCaptions;
|
||
|
bool m_bLocked;
|
||
|
bool m_bVisibleDueToDirect;
|
||
|
bool m_bPaintDebugInfo;
|
||
|
CUtlSymbol m_CurrentLanguage;
|
||
|
};
|
||
|
|
||
|
#endif // HUD_CLOSECAPTION_H
|