diff options
| author | FluorescentCIAAfricanAmerican <[email protected]> | 2020-04-22 12:56:21 -0400 |
|---|---|---|
| committer | FluorescentCIAAfricanAmerican <[email protected]> | 2020-04-22 12:56:21 -0400 |
| commit | 3bf9df6b2785fa6d951086978a3e66f49427166a (patch) | |
| tree | 2c0f1f0c63c4832882bc93814ebd2c2b1c6224e5 /utils/hlfaceposer/eventproperties_speak.cpp | |
| download | archived-source-engine-2018-hl2-src-master.tar.xz archived-source-engine-2018-hl2-src-master.zip | |
Diffstat (limited to 'utils/hlfaceposer/eventproperties_speak.cpp')
| -rw-r--r-- | utils/hlfaceposer/eventproperties_speak.cpp | 673 |
1 files changed, 673 insertions, 0 deletions
diff --git a/utils/hlfaceposer/eventproperties_speak.cpp b/utils/hlfaceposer/eventproperties_speak.cpp new file mode 100644 index 0000000..363c77f --- /dev/null +++ b/utils/hlfaceposer/eventproperties_speak.cpp @@ -0,0 +1,673 @@ +//========= Copyright Valve Corporation, All rights reserved. ============// +// +// Purpose: +// +// $NoKeywords: $ +//=============================================================================// +#include "cbase.h" +#include <mxtk/mx.h> +#include <stdio.h> +#include "resource.h" +#include "EventProperties.h" +#include "mdlviewer.h" +#include "choreoevent.h" +#include "filesystem.h" +#include "SoundEmitterSystem/isoundemittersystembase.h" +#include "AddSoundEntry.h" +#include "SoundLookup.h" +#include "ifaceposersound.h" +#include "MatSysWin.h" + +static CEventParams g_Params; + +class CEventPropertiesSpeakDialog : public CBaseEventPropertiesDialog +{ + typedef CBaseEventPropertiesDialog BaseClass; + +public: + + CEventPropertiesSpeakDialog() + { + m_bShowAll = false; + m_szLastFilter[ 0 ] = 0; + m_Timer = 0; + m_flLastFilterUpdateTime; + } + + virtual void InitDialog( HWND hwndDlg ); + virtual BOOL HandleMessage( HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam ); + virtual void SetTitle(); + virtual void ShowControlsForEventType( CEventParams *params ); + virtual void InitControlData( CEventParams *params ); + +private: + + void PopulateFilterList( bool resetCurrent ); + void OnCheckFilterUpdate(); + + void AddFilterToHistory( char const *filter ); + + void OnSoundSelected( CEventParams *params ); + + void PopulateSoundList( char const *current, HWND wnd ); + void PopulateVolumeLevels( HWND control, CEventParams *params ); + + void FindWaveInSoundEntries( CUtlVector< int >& entryList, char const *search ); + void OnCheckChangedVolumeLevel( CEventParams *params ); + + bool m_bShowAll; + + CUtlVector< CUtlSymbol > m_FilterHistory; + CUtlSymbolTable m_Symbols; + + enum + { + TIMER_ID = 100, + }; + + UINT m_Timer; + char m_szLastFilter[ 256 ]; + float m_flLastFilterUpdateTime; +}; + +void CEventPropertiesSpeakDialog::AddFilterToHistory( char const *filter ) +{ + CUtlSymbol sym = m_Symbols.AddString( filter ); + // Move it to front of list... + m_FilterHistory.FindAndRemove( sym ); + m_FilterHistory.AddToHead( sym ); + + PopulateFilterList( false ); + + // Apply filter + + PopulateSoundList( g_Params.m_szParameters, GetControl( IDC_SOUNDLIST ) ); +} + +void CEventPropertiesSpeakDialog::PopulateFilterList( bool resetCurrent ) +{ + HWND control = GetControl( IDC_FILTER ); + + char oldf[ 256 ]; + SendMessage( control, WM_GETTEXT, (WPARAM)sizeof( oldf ), (LPARAM)oldf ); + + SendMessage( control, CB_RESETCONTENT, 0, 0 ); + + int c = m_FilterHistory.Count(); + if ( c == 0 ) + return; + + for ( int i = 0; i < c; ++i ) + { + char const *str = m_Symbols.String( m_FilterHistory[ i ] ); + SendMessage( control, CB_ADDSTRING, 0, (LPARAM)str ); + } + + char const *first = m_Symbols.String( m_FilterHistory[ 0 ] ); + if ( resetCurrent && first ) + { + SendMessage( control, WM_SETTEXT , 0, (LPARAM)first ); + SendMessage( control, CB_SETEDITSEL , 0, MAKELPARAM( Q_strlen(first), -1 ) ); + } + else + { + SendMessage( control, WM_SETTEXT , 0, (LPARAM)oldf ); + SendMessage( control, CB_SETEDITSEL , 0, MAKELPARAM( Q_strlen(oldf), -1 ) ); + } +} + +void CEventPropertiesSpeakDialog::OnCheckFilterUpdate() +{ + char curfilter[ 256 ]; + HWND control = GetControl( IDC_FILTER ); + SendMessage( control, WM_GETTEXT, (WPARAM)sizeof( curfilter), (LPARAM)curfilter ); + + if ( Q_stricmp( curfilter, m_szLastFilter ) ) + { + Q_strncpy( m_szLastFilter, curfilter, sizeof( m_szLastFilter ) ); + + AddFilterToHistory( m_szLastFilter ); + } +} + +void CEventPropertiesSpeakDialog::SetTitle() +{ + SetDialogTitle( &g_Params, "Speak", "Speak Sound" ); +} + +void CEventPropertiesSpeakDialog::InitControlData( CEventParams *params ) +{ + BaseClass::InitControlData( params ); + + m_flLastFilterUpdateTime = (float)mx::getTickCount() / 1000.0f; + + m_Timer = SetTimer( m_hDialog, TIMER_ID, 1, 0 ); + + HWND choices1 = GetControl( IDC_SOUNDLIST ); + SendMessage( choices1, LB_RESETCONTENT, 0, 0 ); + + HWND choices2 = GetControl( IDC_EVENTCHOICES2 ); + SendMessage( choices2, CB_RESETCONTENT, 0, 0 ); + SendMessage( choices2, WM_SETTEXT , 0, (LPARAM)params->m_szParameters2 ); + + HWND attenuate = GetControl( IDC_CAPTION_ATTENUATION ); + SendMessage( attenuate, BM_SETCHECK, (WPARAM) params->m_bCloseCaptionNoAttenuate ? BST_CHECKED : BST_UNCHECKED, 0 ); + + PopulateSoundList( params->m_szParameters, choices1 ); + + OnSoundSelected( params ); + + PopulateFilterList( true ); +} + +void CEventPropertiesSpeakDialog::InitDialog( HWND hwndDlg ) +{ + m_hDialog = hwndDlg; + + g_Params.PositionSelf( m_hDialog ); + + // Set working title for dialog, etc. + SetTitle(); + + // Show/Hide dialog controls + ShowControlsForEventType( &g_Params ); + InitControlData( &g_Params ); + + UpdateTagRadioButtons( &g_Params ); + + SetFocus( GetControl( IDC_EVENTNAME ) ); +} + +static CEventPropertiesSpeakDialog g_EventPropertiesSpeakDialog; + +void CEventPropertiesSpeakDialog::PopulateVolumeLevels( HWND control, CEventParams *params ) +{ + SendMessage( control, CB_RESETCONTENT, 0, 0 ); + + // Assume uneditable + SendMessage( control, CB_ADDSTRING, 0, (LPARAM)"VOL_NORM" ); + + SendMessage( control, WM_SETTEXT , 0, (LPARAM)"VOL_NORM" ); + + bool enabled = false; + + if ( !Q_stristr( params->m_szParameters, ".wav" ) ) + { + // Look up the sound level from the soundemitter system + int soundindex = soundemitter->GetSoundIndex( params->m_szParameters ); + if ( soundindex >= 0 ) + { + // Look up the sound level from the soundemitter system + CSoundParametersInternal *params = soundemitter->InternalGetParametersForSound( soundindex ); + if ( params ) + { + // Found it + SendMessage( control, WM_SETTEXT , 0, (LPARAM)params->VolumeToString() ); + + // + // See if the .txt file is writable + char const *scriptfile = soundemitter->GetSourceFileForSound( soundindex ); + if ( scriptfile ) + { + // See if it's writable + if ( filesystem->FileExists( scriptfile ) && + filesystem->IsFileWritable( scriptfile ) ) + { + enabled = true; + } + } + } + } + } + + EnableWindow( control, enabled ? TRUE : FALSE ); +} + +//----------------------------------------------------------------------------- +// Purpose: +// Input : wnd - +// Output : static void +//----------------------------------------------------------------------------- +void CEventPropertiesSpeakDialog::PopulateSoundList( char const *current, HWND wnd ) +{ + extern bool NameLessFunc( const char *const& name1, const char *const& name2 ); + + CUtlRBTree< char const *, int > m_SortedNames( 0, 0, NameLessFunc ); + + int c = soundemitter->GetSoundCount(); + for ( int i = 0; i < c; i++ ) + { + char const *name = soundemitter->GetSoundName( i ); + + if ( name && name[ 0 ] ) + { + bool add = true; + if ( !m_bShowAll ) + { + CSoundParameters params; + if ( soundemitter->GetParametersForSound( name, params, GENDER_NONE ) ) + { + if ( params.channel != CHAN_VOICE ) + { + add = false; + } + } + } + + // Apply filter + if ( m_szLastFilter[ 0 ] != 0 ) + { + if ( !Q_stristr( name, m_szLastFilter ) ) + { + add = false; + } + } + + if ( add ) + { + m_SortedNames.Insert( name ); + } + } + } + + SendMessage( wnd, WM_SETREDRAW , (WPARAM)FALSE, (LPARAM)0 ); + + // Remove all + SendMessage( wnd, LB_RESETCONTENT, 0, 0 ); + + int selectslot = 0; + + int j = m_SortedNames.FirstInorder(); + while ( j != m_SortedNames.InvalidIndex() ) + { + char const *name = m_SortedNames[ j ]; + if ( name && name[ 0 ] ) + { + int temp = SendMessage( wnd, LB_ADDSTRING, 0, (LPARAM)name ); + + if ( !Q_stricmp( name, current ) ) + { + selectslot = temp; + } + } + + j = m_SortedNames.NextInorder( j ); + } + + SendMessage( wnd, LB_SETCURSEL, (WPARAM)selectslot, 0 ); + + SendMessage( wnd, WM_SETREDRAW , (WPARAM)TRUE, (LPARAM)0 ); +} + + +//----------------------------------------------------------------------------- +// Purpose: +// Input : wnd - +// *params - +// Output : static +//----------------------------------------------------------------------------- + +void CEventPropertiesSpeakDialog::ShowControlsForEventType( CEventParams *params ) +{ + BaseClass::ShowControlsForEventType( params ); +} + +void CEventPropertiesSpeakDialog::FindWaveInSoundEntries( CUtlVector< int >& entryList, char const *search ) +{ + int c = soundemitter->GetSoundCount(); + for ( int i = 0; i < c; i++ ) + { + CSoundParametersInternal *params = soundemitter->InternalGetParametersForSound( i ); + if ( !params ) + continue; + + int waveCount = params->NumSoundNames(); + for ( int wave = 0; wave < waveCount; wave++ ) + { + char const *waveName = soundemitter->GetWaveName( params->GetSoundNames()[ wave ].symbol ); + + if ( !Q_stricmp( waveName, search ) ) + { + entryList.AddToTail( i ); + break; + } + } + } +} + +void CEventPropertiesSpeakDialog::OnCheckChangedVolumeLevel( CEventParams *params ) +{ + HWND control = GetControl( IDC_EVENTCHOICES2 ); + if ( !IsWindowEnabled( control ) ) + { + return; + } + + if ( Q_stristr( params->m_szParameters, ".wav" ) ) + { + return; + } + + int soundindex = soundemitter->GetSoundIndex( params->m_szParameters ); + if ( soundindex < 0 ) + return; + + // Look up the sound level from the soundemitter system + CSoundParametersInternal *soundparams = soundemitter->InternalGetParametersForSound( soundindex ); + if ( !params ) + { + return; + } + + // See if it's writable, if not then bail + char const *scriptfile = soundemitter->GetSourceFileForSound( soundindex ); + if ( !scriptfile || + !filesystem->FileExists( scriptfile ) || + !filesystem->IsFileWritable( scriptfile ) ) + { + return; + } + + // Copy the parameters + CSoundParametersInternal newparams; + newparams.CopyFrom( *soundparams ); + + // Get the value from the control + char newvolumelevel[ 256 ]; + SendMessage( control, WM_GETTEXT, (WPARAM)sizeof( newvolumelevel ), (LPARAM)newvolumelevel ); + + newparams.VolumeFromString( newvolumelevel ); + + // No change + if ( newparams == *soundparams ) + { + return; + } + + soundemitter->UpdateSoundParameters( params->m_szParameters , newparams ); +} + +//----------------------------------------------------------------------------- +// Purpose: +// Input : hwndDlg - +// uMsg - +// wParam - +// lParam - +// Output : static BOOL CALLBACK +//----------------------------------------------------------------------------- +static BOOL CALLBACK EventPropertiesSpeakDialog( HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam ) +{ + return g_EventPropertiesSpeakDialog.HandleMessage( hwndDlg, uMsg, wParam, lParam ); +}; + +void CEventPropertiesSpeakDialog::OnSoundSelected( CEventParams *params ) +{ + PopulateVolumeLevels( GetControl( IDC_EVENTCHOICES2 ), params ); + SendMessage( GetControl( IDC_SOUNDNAME ), WM_SETTEXT, 0, (LPARAM)params->m_szParameters ); + + // Update script name and wavename fields + HWND scriptname = GetControl( IDC_STATIC_SCRIPTFILE ); + HWND wavename = GetControl( IDC_STATIC_WAVEFILENAME ); + + SendMessage( scriptname, WM_SETTEXT, (WPARAM)1, (LPARAM)"" ); + SendMessage( wavename, WM_SETTEXT, (WPARAM)1, (LPARAM)"" ); + + int soundindex = soundemitter->GetSoundIndex( params->m_szParameters ); + if ( soundindex >= 0 ) + { + char const *script = soundemitter->GetSourceFileForSound( soundindex ); + if ( script && script [ 0 ] ) + { + SendMessage( scriptname, WM_SETTEXT, (WPARAM)Q_strlen( script ) + 1, (LPARAM)script ); + + // Look up the sound level from the soundemitter system + CSoundParametersInternal *params = soundemitter->InternalGetParametersForSound( soundindex ); + if ( params ) + { + // Get wave name + char const *w = soundemitter->GetWaveName( params->GetSoundNames()[ 0 ].symbol ); + if ( w && w[ 0 ] ) + { + SendMessage( wavename, WM_SETTEXT, (WPARAM)Q_strlen( w ) + 1, (LPARAM)w ); + } + } + } + } +} + +BOOL CEventPropertiesSpeakDialog::HandleMessage( HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam ) +{ + m_hDialog = hwndDlg; + + bool handled = false; + BOOL bret = InternalHandleMessage( &g_Params, hwndDlg, uMsg, wParam, lParam, handled ); + if ( handled ) + return bret; + + switch(uMsg) + { + case WM_PAINT: + { + PAINTSTRUCT ps; + HDC hdc; + + hdc = BeginPaint(hwndDlg, &ps); + DrawSpline( hdc, GetControl( IDC_STATIC_SPLINE ), g_Params.m_pEvent ); + EndPaint(hwndDlg, &ps); + + return FALSE; + } + break; + case WM_VSCROLL: + { + RECT rcOut; + GetSplineRect( GetControl( IDC_STATIC_SPLINE ), rcOut ); + + InvalidateRect( hwndDlg, &rcOut, TRUE ); + UpdateWindow( hwndDlg ); + return FALSE; + } + break; + case WM_INITDIALOG: + { + InitDialog( hwndDlg ); + } + return FALSE; + case WM_TIMER: + { + g_pMatSysWindow->Frame(); + + float curtime = (float)mx::getTickCount() / 1000.0f; + if ( curtime - m_flLastFilterUpdateTime > 0.5f ) + { + m_flLastFilterUpdateTime = curtime; + OnCheckFilterUpdate(); + } + } + return FALSE; + + case WM_COMMAND: + switch (LOWORD(wParam)) + { + case IDOK: + { + char sz[ 512 ]; + GetDlgItemText( m_hDialog, IDC_SOUNDNAME, sz, sizeof( sz ) ); + + Q_FixSlashes( sz ); + + // Strip off game directory stuff + Q_strncpy( g_Params.m_szParameters, sz, sizeof( g_Params.m_szParameters ) ); + char *p = Q_strstr( sz, "\\sound\\" ); + if ( p ) + { + Q_strncpy( g_Params.m_szParameters, p + strlen( "\\sound\\" ), sizeof( g_Params.m_szParameters ) ); + } + + OnCheckChangedVolumeLevel( &g_Params ); + + GetDlgItemText( m_hDialog, IDC_EVENTNAME, g_Params.m_szName, sizeof( g_Params.m_szName ) ); + + if ( !g_Params.m_szName[ 0 ] ) + { + Q_strncpy( g_Params.m_szName, sz, sizeof( g_Params.m_szName ) ); + } + + char szTime[ 32 ]; + GetDlgItemText( m_hDialog, IDC_STARTTIME, szTime, sizeof( szTime ) ); + g_Params.m_flStartTime = atof( szTime ); + GetDlgItemText( m_hDialog, IDC_ENDTIME, szTime, sizeof( szTime ) ); + g_Params.m_flEndTime = atof( szTime ); + + // Parse tokens from tags + ParseTags( &g_Params ); + + KillTimer( m_hDialog, m_Timer ); + + EndDialog( hwndDlg, 1 ); + } + break; + case IDCANCEL: + { + KillTimer( m_hDialog, m_Timer ); + EndDialog( hwndDlg, 0 ); + } + break; + case IDC_CAPTION_ATTENUATION: + { + HWND control = GetControl( IDC_CAPTION_ATTENUATION ); + g_Params.m_bCloseCaptionNoAttenuate = SendMessage( control, BM_GETCHECK, 0, 0 ) == BST_CHECKED ? true : false; + } + break; + case IDC_PLAY_SOUND: + { + // Get sound name from soundemitter + sound->PlaySound( + NULL, + 1.0f, + va( "sound/%s", FacePoser_TranslateSoundName( g_Params.m_szParameters ) ), + NULL ); + } + break; + case IDC_OPENSOURCE: + { + // Look up the sound level from the soundemitter system + int soundindex = soundemitter->GetSoundIndex( g_Params.m_szParameters ); + if ( soundindex >= 0 ) + { + // Look up the sound level from the soundemitter system + CSoundParametersInternal *params = soundemitter->InternalGetParametersForSound( soundindex ); + if ( params ) + { + // See if the .txt file is writable + char const *scriptfile = soundemitter->GetSourceFileForSound( soundindex ); + if ( scriptfile ) + { + char relative_path[MAX_PATH]; + Q_snprintf( relative_path, MAX_PATH, "%s", scriptfile ); + + char full_path[MAX_PATH]; + if ( filesystem->GetLocalPath( relative_path, full_path, MAX_PATH ) ) + { + ShellExecute( NULL, "open", full_path, NULL, NULL, SW_SHOWNORMAL ); + } + } + } + } + } + break; + case IDC_SHOW_ALL_SOUNDS: + { + m_bShowAll = SendMessage( GetControl( IDC_SHOW_ALL_SOUNDS ), BM_GETCHECK, 0, 0 ) == BST_CHECKED ? true : false; + + PopulateSoundList( g_Params.m_szParameters, GetControl( IDC_EVENTCHOICES ) ); + } + break; + case IDC_CHECK_ENDTIME: + { + g_Params.m_bHasEndTime = SendMessage( GetControl( IDC_CHECK_ENDTIME ), BM_GETCHECK, 0, 0 ) == BST_CHECKED ? true : false; + if ( !g_Params.m_bHasEndTime ) + { + ShowWindow( GetControl( IDC_ENDTIME ), SW_HIDE ); + } + else + { + ShowWindow( GetControl( IDC_ENDTIME ), SW_RESTORE ); + } + } + break; + case IDC_CHECK_RESUMECONDITION: + { + g_Params.m_bResumeCondition = SendMessage( GetControl( IDC_CHECK_RESUMECONDITION ), BM_GETCHECK, 0, 0 ) == BST_CHECKED ? true : false; + } + break; + case IDC_SOUNDLIST: + { + HWND control = (HWND)lParam; + if ( control ) + { + int cursel = SendMessage( control, LB_GETCURSEL, 0, 0 ); + if ( cursel != LB_ERR ) + { + SendMessage( control, LB_GETTEXT, cursel, (LPARAM)g_Params.m_szParameters ); + OnSoundSelected( &g_Params ); + + if ( HIWORD( wParam ) == LBN_DBLCLK ) + { + // Get sound name from soundemitter + sound->PlaySound( + NULL, + 1.0f, + va( "sound/%s", FacePoser_TranslateSoundName( g_Params.m_szParameters ) ), + NULL ); + } + } + } + } + break; + case IDC_EVENTCHOICES2: + { + HWND control = (HWND)lParam; + if ( control ) + { + SendMessage( control, WM_GETTEXT, (WPARAM)sizeof( g_Params.m_szParameters2 ), (LPARAM)g_Params.m_szParameters2 ); + } + } + break; + case IDC_ABSOLUTESTART: + { + g_Params.m_bUsesTag = false; + UpdateTagRadioButtons( &g_Params ); + } + break; + case IDC_RELATIVESTART: + { + g_Params.m_bUsesTag = true; + UpdateTagRadioButtons( &g_Params ); + } + break; + } + return TRUE; + } + return FALSE; +} + +//----------------------------------------------------------------------------- +// Purpose: +// Input : *view - +// *actor - +// Output : int +//----------------------------------------------------------------------------- +int EventProperties_Speak( CEventParams *params ) +{ + g_Params = *params; + + int retval = DialogBox( (HINSTANCE)GetModuleHandle( 0 ), + MAKEINTRESOURCE( IDD_EVENTPROPERTIES_SPEAK ), + (HWND)g_MDLViewer->getHandle(), + (DLGPROC)EventPropertiesSpeakDialog ); + + *params = g_Params; + + return retval; +}
\ No newline at end of file |